diff --git a/.github/workflows/nix.yml b/.github/workflows/nix.yml new file mode 100644 index 000000000..445dd3f0d --- /dev/null +++ b/.github/workflows/nix.yml @@ -0,0 +1,59 @@ +name: OMP Nix + +on: + push: + branches: [main] + paths: + - ".github/workflows/nix.yml" + - ".cargo/**" + - "flake.nix" + - "flake.lock" + - "nix/**" + - "bun.lock" + - "package.json" + - "patches/**" + - "Cargo.toml" + - "Cargo.lock" + - "rust-toolchain.toml" + - "packages/**" + - "crates/**" + - "scripts/**" + - "docs/**" + pull_request: + branches: [main] + paths: + - ".github/workflows/nix.yml" + - ".cargo/**" + - "flake.nix" + - "flake.lock" + - "nix/**" + - "bun.lock" + - "package.json" + - "patches/**" + - "Cargo.toml" + - "Cargo.lock" + - "rust-toolchain.toml" + - "packages/**" + - "crates/**" + - "scripts/**" + - "docs/**" + +concurrency: + group: "${{ github.workflow }}-${{ github.ref }}" + cancel-in-progress: true + +permissions: + contents: read + +jobs: + evaluate: + name: Evaluate flake + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + - uses: cachix/install-nix-action@v31 + with: + extra_nix_config: | + accept-flake-config = true + - name: Evaluate every supported system + run: nix flake check --all-systems --no-build --show-trace diff --git a/.gitignore b/.gitignore index b351f508e..053d7e59c 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,8 @@ target/ *.tsbuildinfo *.node *.b64.js +/result +/result-* # Environment .env diff --git a/README.md b/README.md index 8b6d36a9b..cf2604ef7 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,31 @@ brew install can1357/tap/omp bun install -g @oh-my-pi/pi-coding-agent ``` +**Nix** + +```sh +# Run without installing +nix run github:can1357/oh-my-pi + +# Or install into the active profile +nix profile install github:can1357/oh-my-pi +``` + +Flake consumers can use `packages..omp`, `overlays.default`, `nixosModules.default`, or `homeManagerModules.default`. A Home Manager configuration can install OMP and own its settings declaratively: + +```nix +{ + inputs.omp.url = "github:can1357/oh-my-pi"; + + # In your Home Manager module: + imports = [ inputs.omp.homeManagerModules.default ]; + programs.omp = { + enable = true; + settings.startup.quiet = true; + }; +} +``` + **Windows (PowerShell)** ```powershell @@ -581,6 +606,22 @@ bun dev `bun setup` installs Bun workspaces and builds `@oh-my-pi/pi-natives`. Re-run `bun run build:native` after changing Rust crates or `packages/natives`. +Nix users get the pinned Bun and Rust toolchains plus all native build dependencies: + +```sh +nix develop +bun setup +bun dev +``` + +Build and smoke-test the distributable Nix package with `nix build .#omp`. `nix/bun.nix` is generated only when `bun.lock` changes; releases regenerate it automatically. For dependency changes, run: + +```sh +bun run gen:nix +``` + +The command uses `bun2nix` from `nix develop` when available, otherwise enters the development shell through Nix. Do not edit `nix/bun.nix` manually. + For a non-interactive smoke check: ```sh diff --git a/crates/pi-builtins/src/ifne.rs b/crates/pi-builtins/src/ifne.rs index c9bbc5d82..9b0709fc4 100644 --- a/crates/pi-builtins/src/ifne.rs +++ b/crates/pi-builtins/src/ifne.rs @@ -255,35 +255,35 @@ mod tests { #[cfg(unix)] #[test] fn nonempty_stdin_runs_command_with_stdin() { - let result = run_in("hello world\n", &["/bin/cat"]); + let result = run_in("hello world\n", &["cat"]); assert_eq!(result, (0, "hello world\n".to_string(), String::new())); } #[cfg(unix)] #[test] fn empty_stdin_skips_command() { - let result = run_in("", &["/bin/sh", "-c", "echo ran"]); + let result = run_in("", &["sh", "-c", "echo ran"]); assert_eq!(result, (0, String::new(), String::new())); } #[cfg(unix)] #[test] fn invert_runs_command_on_empty_stdin() { - let result = run_in("", &["-n", "/bin/sh", "-c", "echo ran"]); + let result = run_in("", &["-n", "sh", "-c", "echo ran"]); assert_eq!(result, (0, "ran\n".to_string(), String::new())); } #[cfg(unix)] #[test] fn invert_passes_nonempty_stdin_through() { - let result = run_in("data\n", &["-n", "/bin/sh", "-c", "echo ran"]); + let result = run_in("data\n", &["-n", "sh", "-c", "echo ran"]); assert_eq!(result, (0, "data\n".to_string(), String::new())); } #[cfg(unix)] #[test] fn child_exit_code_propagates() { - let result = run_in("x", &["/bin/sh", "-c", "exit 3"]); + let result = run_in("x", &["sh", "-c", "exit 3"]); assert_eq!(result, (3, String::new(), String::new())); } @@ -299,7 +299,7 @@ mod tests { #[test] fn early_exiting_child_is_not_an_error() { let big = "a".repeat(1 << 20); - let result = run_in(&big, &["/usr/bin/head", "-c", "1"]); + let result = run_in(&big, &["head", "-c", "1"]); assert_eq!(result, (0, "a".to_string(), String::new())); } diff --git a/crates/pi-builtins/src/pgrep.rs b/crates/pi-builtins/src/pgrep.rs index 1a25c3b9c..64ac25136 100644 --- a/crates/pi-builtins/src/pgrep.rs +++ b/crates/pi-builtins/src/pgrep.rs @@ -36,7 +36,7 @@ mod tests { #[cfg(unix)] fn matching_process() -> std::process::Child { - std::process::Command::new("/bin/sleep") + std::process::Command::new("sleep") .arg("30") .spawn() .expect("spawn matching process") diff --git a/crates/pi-builtins/src/sed.rs b/crates/pi-builtins/src/sed.rs index 6ce528579..eb4c08809 100644 --- a/crates/pi-builtins/src/sed.rs +++ b/crates/pi-builtins/src/sed.rs @@ -7930,7 +7930,7 @@ fn re_or_saved_re<'a>( #[cfg(unix)] fn shell_command(cmd: &str, host: &Host) -> std::process::Command { - let mut c = std::process::Command::new("/bin/sh"); + let mut c = std::process::Command::new("sh"); c.arg("-c").arg(cmd); // run relative to the shell's cwd, // not the host process cwd. `output()` already keeps the child's stdio diff --git a/crates/pi-natives/src/shell.rs b/crates/pi-natives/src/shell.rs index c2aea1d13..7b9dd4516 100644 --- a/crates/pi-natives/src/shell.rs +++ b/crates/pi-natives/src/shell.rs @@ -491,7 +491,7 @@ mod tests { shell .run( CoreShellRunOptions { - command: "/bin/sh -c 'printf \"%d\\n\" \"$$\"; sleep 0.5'".to_string(), + command: "sh -c 'printf \"%d\\n\" \"$$\"; sleep 0.5'".to_string(), cwd: None, env: None, timeout_ms: None, diff --git a/crates/pi-shell/src/shell.rs b/crates/pi-shell/src/shell.rs index 63631f9fe..624acf68a 100644 --- a/crates/pi-shell/src/shell.rs +++ b/crates/pi-shell/src/shell.rs @@ -1991,12 +1991,30 @@ mod tests { .expect("child did not enter expected executable"); } + #[cfg(unix)] + fn test_executable(name: &str) -> std::path::PathBuf { + use std::os::unix::fs::PermissionsExt as _; + + std::env::var_os("PATH") + .and_then(|path| { + std::env::split_paths(&path) + .map(|directory| directory.join(name)) + .find(|candidate| { + candidate.metadata().is_ok_and(|metadata| { + metadata.is_file() && metadata.permissions().mode() & 0o111 != 0 + }) + }) + }) + .unwrap_or_else(|| panic!("{name} executable on PATH")) + } + #[cfg(unix)] fn process_test_command(prefix: &str) -> (tempfile::TempDir, std::path::PathBuf, String) { let dir = tempfile::tempdir().expect("process test directory"); let name = format!("{prefix}{}", std::process::id()); let command = dir.path().join(&name); - std::os::unix::fs::symlink("/bin/sleep", &command).expect("sleep symlink"); + let sleep = test_executable("sleep"); + std::os::unix::fs::symlink(sleep, &command).expect("sleep symlink"); (dir, command, name) } @@ -2881,13 +2899,14 @@ mod tests { #[cfg(unix)] #[tokio::test(flavor = "multi_thread")] async fn kill_builtin_refuses_ancestors_but_not_unrelated_processes() { - let (result, output) = execute_captured( + let sleep = test_executable("sleep"); + let command = format!( "parent=$(ps -o ppid= -p $$ | tr -d ' ')\nkill -CONT \"$parent\"; printf \ - 'ancestor=%s\\n' \"$?\"\n/bin/sleep 30 &\nchild=$!\nkill -TERM \"$child\"; printf \ - 'child=%s\\n' \"$?\"\nprintf 'survived\\n'" - .to_string(), - ) - .await; + 'ancestor=%s\\n' \"$?\"\n{} 30 &\nchild=$!\nkill -TERM \"$child\"; printf 'child=%s\\n' \ + \"$?\"\nprintf 'survived\\n'", + quote_arg(sleep.to_str().expect("utf8 sleep path")) + ); + let (result, output) = execute_captured(command).await; assert_eq!(result.exit_code, Some(0), "the shell must survive: {output:?}"); assert!(output.contains("survived"), "{output:?}"); assert!( @@ -3024,11 +3043,14 @@ mod tests { // An identity "compressor" that also proves it was started with the // shell's working directory and reaches the command's stderr. let shim = bin.join("pi-test-compress"); - std::fs::write( - &shim, - "#!/bin/sh\nprintf 'compressor cwd=%s\\n' \"$PWD\" >&2\nexec /bin/cat\n", - ) - .expect("write shim"); + let shell = test_executable("sh"); + let cat = test_executable("cat"); + let shim_source = format!( + "#!{}\nprintf 'compressor cwd=%s\\n' \"$PWD\" >&2\nexec {}\n", + shell.display(), + quote_arg(cat.to_str().expect("utf8 cat path")) + ); + std::fs::write(&shim, shim_source).expect("write shim"); std::fs::set_permissions(&shim, std::fs::Permissions::from_mode(0o755)).expect("chmod shim"); // Enough distinct lines that the 1K buffer forces spilling through the @@ -4476,9 +4498,8 @@ replace = [{ pattern = "hello", replacement = "HI" }] /// external background jobs and 1 while one is running. The host relies on /// this to retain a per-call shell whose `&`/`nohup` child is still alive /// instead of dropping it (which would SIGKILL the child via kill-on-drop). - /// Path-qualified `/bin/sleep` is used so it spawns a real external process - /// (the bare `sleep` builtin runs in-process and is intentionally not - /// counted). + /// `sh -c` forces an external process because the bare `sleep` builtin runs + /// in-process and is intentionally not counted. #[cfg(unix)] #[tokio::test(flavor = "multi_thread")] async fn live_background_job_count_tracks_external_background_jobs() { @@ -4502,7 +4523,7 @@ replace = [{ pattern = "hello", replacement = "HI" }] // An external background process is tracked while it runs. shell .run( - ShellRunOptions { command: "/bin/sleep 30 &".into(), ..Default::default() }, + ShellRunOptions { command: "sh -c 'sleep 30' &".into(), ..Default::default() }, None, CancelToken::default(), ) @@ -4640,7 +4661,7 @@ replace = [{ pattern = "^.+$", replacement = "PWD" }] let root = unique_temp_dir("heredoc-chain"); let minimizer = printf_minimizer(&root.join("minimizer.toml"), None); let (result, output) = run_command_capture( - "/bin/cat <<'PY'\nhello $USER\nPY\nprintf 'after\\n'", + "cat <<'PY'\nhello $USER\nPY\nprintf 'after\\n'", None, Some(minimizer), CancelToken::default(), @@ -4845,7 +4866,7 @@ replace = [{ pattern = "^.+$", replacement = "PWD" }] // `printf '%d\n' "$$"` then `sleep 0.5`. Long enough for our `getsid`. let exec = session .shell - .run_string("/bin/sh -c 'printf \"%d\\n\" \"$$\"; sleep 0.5'", &source_info, ¶ms) + .run_string("sh -c 'printf \"%d\\n\" \"$$\"; sleep 0.5'", &source_info, ¶ms) .await .expect("run_string"); drop(params); @@ -4910,7 +4931,7 @@ replace = [{ pattern = "^.+$", replacement = "PWD" }] shell_b .run( ShellRunOptions { - command: "/bin/sh -c 'printf \"ready\\n\"; sleep 30'".into(), + command: "sh -c 'printf \"ready\\n\"; sleep 30'".into(), ..Default::default() }, Some(tx_b), @@ -4942,7 +4963,7 @@ replace = [{ pattern = "^.+$", replacement = "PWD" }] shell_a .run( ShellRunOptions { - command: "/bin/sh -c 'printf \"%d\\n\" \"$$\"; sleep 2'".into(), + command: "sh -c 'printf \"%d\\n\" \"$$\"; sleep 2'".into(), ..Default::default() }, Some(tx_a), @@ -5003,9 +5024,7 @@ replace = [{ pattern = "^.+$", replacement = "PWD" }] let escaped_pid_path = pid_path.to_string_lossy().replace('\'', "'\\''"); std::fs::write( &snapshot_path, - format!( - "/bin/sh -c 'printf \"%d\\n\" \"$$\" > \"$1\"; sleep 30' sh '{escaped_pid_path}'\n" - ), + format!("sh -c 'printf \"%d\\n\" \"$$\" > \"$1\"; sleep 30' sh '{escaped_pid_path}'\n"), ) .expect("write snapshot file"); @@ -5058,7 +5077,7 @@ replace = [{ pattern = "^.+$", replacement = "PWD" }] let child_dead = time::timeout(Duration::from_secs(5), async { loop { - // SAFETY: `child_pid` came from the foreground `/bin/sh` spawned by the + // SAFETY: `child_pid` came from the foreground `sh` spawned by the // snapshot; `kill(pid, 0)` only probes whether that process still exists. let kill_result = unsafe { libc::kill(child_pid, 0) }; if kill_result == -1 { @@ -5148,14 +5167,14 @@ replace = [{ pattern = "^.+$", replacement = "PWD" }] let shell_handle = tokio::spawn(async move { let source_info = SourceInfo::from("pi-natives:test"); - // First stage prints its own PID and sleeps; `cat` forwards the PID - // line to our reader and exits on EOF. The first stage leads the - // pipeline's process group, the second (`cat`) is the join-or-detach - // stage that would EPERM without the wiring fix. + // First stage prints its own PID and sleeps; `sh -c cat` forwards + // the PID line to our reader and exits on EOF. The first stage + // leads the pipeline's process group, while the second stage is the + // join-or-detach process that would EPERM without the wiring fix. let exec = session .shell .run_string( - "/bin/sh -c 'printf \"%d\\n\" \"$$\"; sleep 1' | /bin/cat", + "sh -c 'printf \"%d\\n\" \"$$\"; sleep 1' | sh -c cat", &source_info, ¶ms, ) @@ -5210,7 +5229,7 @@ replace = [{ pattern = "^.+$", replacement = "PWD" }] #[tokio::test(flavor = "multi_thread")] async fn wait_accepts_last_background_process_id() { let options = ShellExecuteOptions { - command: "/bin/sh -c 'exit 7' & mover=$!; wait \"$mover\"".to_string(), + command: "sh -c 'exit 7' & mover=$!; wait \"$mover\"".to_string(), ..Default::default() }; @@ -5227,9 +5246,9 @@ replace = [{ pattern = "^.+$", replacement = "PWD" }] #[tokio::test(flavor = "multi_thread")] async fn wait_n_p_records_completed_process_id() { let options = ShellExecuteOptions { - command: "/bin/sh -c 'sleep 0.2; exit 42' & slow=$!; /bin/sh -c 'exit 13' & fast=$!; \ - wait -n -p hit \"$slow\" \"$fast\"; status=$?; wait \"$slow\"; [ \"$status\" \ - -eq 13 ] && [ \"$hit\" = \"$fast\" ]" + command: "sh -c 'sleep 0.2; exit 42' & slow=$!; sh -c 'exit 13' & fast=$!; wait -n -p \ + hit \"$slow\" \"$fast\"; status=$?; wait \"$slow\"; [ \"$status\" -eq 13 ] && \ + [ \"$hit\" = \"$fast\" ]" .to_string(), ..Default::default() }; @@ -5247,7 +5266,7 @@ replace = [{ pattern = "^.+$", replacement = "PWD" }] #[tokio::test(flavor = "multi_thread")] async fn wait_f_accepts_process_id() { let options = ShellExecuteOptions { - command: "/bin/sh -c 'exit 5' & child=$!; wait -f \"$child\"".to_string(), + command: "sh -c 'exit 5' & child=$!; wait -f \"$child\"".to_string(), ..Default::default() }; @@ -5390,13 +5409,9 @@ replace = [{ pattern = "^.+$", replacement = "PWD" }] #[cfg(unix)] #[tokio::test(flavor = "multi_thread")] async fn quoted_heredoc_without_trailing_newline_runs() { - let (result, output) = run_command_capture( - "/bin/cat <<'PY'\nhello $USER\nPY", - None, - None, - CancelToken::default(), - ) - .await; + let (result, output) = + run_command_capture("cat <<'PY'\nhello $USER\nPY", None, None, CancelToken::default()) + .await; assert_eq!(result.exit_code, Some(0)); assert_eq!(output, "hello $USER\n"); @@ -5437,7 +5452,7 @@ replace = [{ pattern = "^.+$", replacement = "PWD" }] let command = if cfg!(windows) { "nohup cmd /C exit 7" } else { - "nohup /bin/sh -c 'exit 7'" + "nohup sh -c 'exit 7'" }; let options = ShellExecuteOptions { command: command.to_string(), ..Default::default() }; let result = execute_shell(options, None, CancelToken::default()) @@ -5455,8 +5470,8 @@ replace = [{ pattern = "^.+$", replacement = "PWD" }] async fn nohup_background_captures_operand_pid() { let (tx, rx) = flume::unbounded::(); let options = ShellExecuteOptions { - command: "nohup /bin/sh -c 'exit 0' >/dev/null 2>&1 & pid=$!; printf 'pid=%s\n' \ - \"$pid\"; test -n \"$pid\"" + command: "nohup sh -c 'exit 0' >/dev/null 2>&1 & pid=$!; printf 'pid=%s\n' \"$pid\"; \ + test -n \"$pid\"" .to_string(), ..Default::default() }; diff --git a/crates/vendor/brush-core/src/sys/unix/fs.rs b/crates/vendor/brush-core/src/sys/unix/fs.rs index ebd6cb9a0..1df9c0fa7 100644 --- a/crates/vendor/brush-core/src/sys/unix/fs.rs +++ b/crates/vendor/brush-core/src/sys/unix/fs.rs @@ -393,8 +393,7 @@ mod tests { #[test] fn resolve_executable_returns_input_unchanged() { - // /bin/sh exists and is executable on every supported Unix host. - let path = PathBuf::from("/bin/sh"); + let path = std::env::current_exe().expect("current test executable"); let resolved = resolve_executable(path.clone()); assert_eq!(resolved.as_deref(), Some(path.as_path())); } diff --git a/flake.lock b/flake.lock new file mode 100644 index 000000000..233c54403 --- /dev/null +++ b/flake.lock @@ -0,0 +1,248 @@ +{ + "nodes": { + "bun2nix": { + "inputs": { + "flake-parts": "flake-parts", + "nixpkgs": [ + "nixpkgs" + ], + "systems": "systems", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1784665499, + "narHash": "sha256-9BMxlTxCCDAeoNLtb1a/st7udtTIJep+wpUzquA29VU=", + "owner": "nix-community", + "repo": "bun2nix", + "rev": "0f2a1f0b6f42cebe3b149bf62d38754c5e0e9729", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "bun2nix", + "type": "github" + } + }, + "bun2nix-darwin-x64": { + "inputs": { + "flake-parts": "flake-parts_2", + "nixpkgs": [ + "nixpkgs-darwin-x64" + ], + "systems": "systems_2", + "treefmt-nix": "treefmt-nix_2" + }, + "locked": { + "lastModified": 1784665499, + "narHash": "sha256-9BMxlTxCCDAeoNLtb1a/st7udtTIJep+wpUzquA29VU=", + "owner": "nix-community", + "repo": "bun2nix", + "rev": "0f2a1f0b6f42cebe3b149bf62d38754c5e0e9729", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "bun2nix", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": [ + "bun2nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1782949081, + "narHash": "sha256-vp6Y/Grm98ESt6ceOkWiHWyZRDV3J1RID4w+6NWK9yA=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "17c9d6cdfc60c64f4ee8d306f9bc0b4ccb51481e", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": [ + "bun2nix-darwin-x64", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1782949081, + "narHash": "sha256-vp6Y/Grm98ESt6ceOkWiHWyZRDV3J1RID4w+6NWK9yA=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "17c9d6cdfc60c64f4ee8d306f9bc0b4ccb51481e", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "nix-bun": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1786530394, + "narHash": "sha256-Bxx47lHMVHFD7JCt0bQGwuYK71qKioYq2Y74CPg/KHs=", + "owner": "ryoppippi", + "repo": "nix-bun", + "rev": "3c2ccb115cc79d0556743743654475d4f6446f11", + "type": "github" + }, + "original": { + "owner": "ryoppippi", + "repo": "nix-bun", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1786384358, + "narHash": "sha256-RzPPiWeUtuvymnpuEWsdtzli5w4kjZs49FqEs3/1u+I=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "2fcb964de67fcf60b43471c55d5d99e61a9ccb5a", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-darwin-x64": { + "locked": { + "lastModified": 1786527240, + "narHash": "sha256-OLtJPnSXcRy79Rf7BhYaMeXAVF625FpLcd3+Svq641Y=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e0c84f9d0ad137f076dc957494f5b39885597d4f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-26.05-darwin", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "bun2nix": "bun2nix", + "bun2nix-darwin-x64": "bun2nix-darwin-x64", + "nix-bun": "nix-bun", + "nixpkgs": "nixpkgs", + "nixpkgs-darwin-x64": "nixpkgs-darwin-x64", + "rust-overlay": "rust-overlay" + } + }, + "rust-overlay": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1786507911, + "narHash": "sha256-w5aZRLbiu7H6TqsYXVMdRKg0S4DRaJpxyqxx86AwxVk=", + "owner": "oxalica", + "repo": "rust-overlay", + "rev": "39db48099ad16834af7e27485a4babf9c28b3897", + "type": "github" + }, + "original": { + "owner": "oxalica", + "repo": "rust-overlay", + "type": "github" + } + }, + "systems": { + "locked": { + "lastModified": 1776166891, + "narHash": "sha256-bI8yrEGjrohR5hkQox7UrxDH7XqrYMwI8SL/LrJ1+S8=", + "owner": "nix-systems", + "repo": "triplet", + "rev": "6de7bc09397911ce03636afbcf6118745ab2cda0", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "triplet", + "type": "github" + } + }, + "systems_2": { + "locked": { + "lastModified": 1680978224, + "narHash": "sha256-+xT9B1ZbhMg/zpJqd00S06UCZb/A2URW9bqqrZ/JTOg=", + "owner": "nix-systems", + "repo": "x86_64-darwin", + "rev": "db0463cce4cd60fb791f33a83d29a1ed53edab9b", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "x86_64-darwin", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "bun2nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1784369104, + "narHash": "sha256-47cxbcZODibHv3rELFQ9vZly0vUNkND/atn/U7HLeb0=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "df3c0640565d04a0261253cdd89fce78ec50168a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + }, + "treefmt-nix_2": { + "inputs": { + "nixpkgs": [ + "bun2nix-darwin-x64", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1784369104, + "narHash": "sha256-47cxbcZODibHv3rELFQ9vZly0vUNkND/atn/U7HLeb0=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "df3c0640565d04a0261253cdd89fce78ec50168a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 000000000..54fd0acef --- /dev/null +++ b/flake.nix @@ -0,0 +1,186 @@ +{ + description = "OMP coding agent and development environment"; + + nixConfig = { + extra-substituters = [ "https://nix-community.cachix.org" ]; + extra-trusted-public-keys = [ + "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" + ]; + }; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + + # nixpkgs unstable dropped Intel macOS in 26.11; keep that supported + # platform on the final stable branch that still receives security fixes. + nixpkgs-darwin-x64.url = "github:NixOS/nixpkgs/nixpkgs-26.05-darwin"; + + bun2nix = { + url = "github:nix-community/bun2nix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + # bun2nix's per-system helper packages must use the same Intel-compatible + # package set as the derivation consuming its overlay. + bun2nix-darwin-x64 = { + url = "github:nix-community/bun2nix"; + inputs.nixpkgs.follows = "nixpkgs-darwin-x64"; + inputs.systems.url = "github:nix-systems/x86_64-darwin"; + }; + + nix-bun = { + url = "github:ryoppippi/nix-bun"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + + rust-overlay = { + url = "github:oxalica/rust-overlay"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + }; + + outputs = + { + self, + bun2nix, + bun2nix-darwin-x64, + nix-bun, + nixpkgs, + nixpkgs-darwin-x64, + rust-overlay, + ... + }: + let + systems = [ + "aarch64-darwin" + "aarch64-linux" + "x86_64-darwin" + "x86_64-linux" + ]; + forAllSystems = nixpkgs.lib.genAttrs systems; + nixpkgsFor = system: if system == "x86_64-darwin" then nixpkgs-darwin-x64 else nixpkgs; + bun2nixFor = system: if system == "x86_64-darwin" then bun2nix-darwin-x64 else bun2nix; + pkgsFor = + system: + import (nixpkgsFor system) { + inherit system; + overlays = [ + rust-overlay.overlays.default + (bun2nixFor system).overlays.default + (final: _previous: { + # Instantiate the pinned upstream binary against this package + # set so Intel macOS does not re-enter nix-bun's unstable input. + bun = final.callPackage (nix-bun.outPath + "/package.nix") { + sourcesFile = nix-bun.outPath + "/versions/1.3.14.json"; + }; + }) + ]; + }; + packageFor = + system: + let + pkgs = pkgsFor system; + rustToolchain = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml; + in + pkgs.callPackage ./nix/package.nix { + inherit rustToolchain; + source = self.outPath; + }; + in + { + packages = forAllSystems (system: { + default = packageFor system; + omp = packageFor system; + }); + + apps = forAllSystems (system: { + default = { + type = "app"; + program = "${self.packages.${system}.default}/bin/omp"; + meta.description = "Run OMP"; + }; + omp = self.apps.${system}.default; + }); + + devShells = forAllSystems ( + system: + let + pkgs = pkgsFor system; + rustToolchain = pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml; + in + { + default = import ./nix/dev-shell.nix { inherit pkgs rustToolchain; }; + } + ); + + checks = forAllSystems ( + system: + let + pkgs = pkgsFor system; + homeManagerEvaluation = pkgs.lib.evalModules { + specialArgs = { inherit pkgs; }; + modules = [ + { + options.home.packages = pkgs.lib.mkOption { + type = pkgs.lib.types.listOf pkgs.lib.types.package; + default = [ ]; + }; + options.home.file = pkgs.lib.mkOption { + type = pkgs.lib.types.attrsOf pkgs.lib.types.anything; + default = { }; + }; + } + self.homeManagerModules.default + { + programs.omp.enable = true; + programs.omp.settings.startup.quiet = true; + } + ]; + }; + nixosEvaluation = pkgs.lib.evalModules { + specialArgs = { inherit pkgs; }; + modules = [ + { + options.environment.systemPackages = pkgs.lib.mkOption { + type = pkgs.lib.types.listOf pkgs.lib.types.package; + default = [ ]; + }; + } + self.nixosModules.default + { programs.omp.enable = true; } + ]; + }; + modulesEvaluate = + assert builtins.elem self.packages.${system}.default homeManagerEvaluation.config.home.packages; + assert homeManagerEvaluation.config.home.file ? ".omp/agent/config.yml"; + assert builtins.elem self.packages.${system}.default + nixosEvaluation.config.environment.systemPackages; + pkgs.runCommand "omp-module-evaluation" { } "touch $out"; + in + { + bun-lock = pkgs.runCommand "omp-bun-lock" { nativeBuildInputs = [ pkgs.bun2nix ]; } '' + cp -R ${self.outPath} source + chmod -R u+w source + cd source + mv nix/bun.nix nix/bun.expected.nix + bun2nix -l bun.lock -c ../ -o nix/bun.nix + diff -u nix/bun.expected.nix nix/bun.nix + touch "$out" + ''; + modules = modulesEvaluate; + omp = self.packages.${system}.default; + } + ); + + formatter = forAllSystems (system: (pkgsFor system).nixfmt); + + overlays.default = _final: previous: { + omp = self.packages.${previous.stdenv.hostPlatform.system}.default; + }; + + homeManagerModules.default = import ./nix/home-manager.nix { inherit self; }; + homeManagerModules.omp = self.homeManagerModules.default; + nixosModules.default = import ./nix/nixos-module.nix { inherit self; }; + nixosModules.omp = self.nixosModules.default; + }; +} diff --git a/nix/bun.nix b/nix/bun.nix new file mode 100644 index 000000000..dc81175ad --- /dev/null +++ b/nix/bun.nix @@ -0,0 +1,2170 @@ +# Autogenerated by `bun2nix`, editing manually is not recommended +# +# Set of Bun packages to install +# +# Consume this with `fetchBunDeps` (recommended) +# or `pkgs.callPackage` if you wish to handle +# it manually. +{ + copyPathToStore, + fetchFromGitHub, + fetchgit, + fetchurl, + ... +}: +{ + "@anush008/tokenizers-darwin-universal@0.0.0" = fetchurl { + url = "https://registry.npmjs.org/@anush008/tokenizers-darwin-universal/-/tokenizers-darwin-universal-0.0.0.tgz"; + hash = "sha512-SACpWEooTjFX89dFKRVUhivMxxcZRtA3nJGVepdLyrwTkQ1TZQ8581B5JoXp0TcTMHfgnDaagifvVoBiFEdNCQ=="; + }; + "@anush008/tokenizers-linux-x64-gnu@0.0.0" = fetchurl { + url = "https://registry.npmjs.org/@anush008/tokenizers-linux-x64-gnu/-/tokenizers-linux-x64-gnu-0.0.0.tgz"; + hash = "sha512-TLjByOPWUEq51L3EJkS+slyH57HKJ7lAz/aBtEt7TIPq4QsE2owOPGovByOLIq1x5Wgh9b+a4q2JasrEFSDDhg=="; + }; + "@anush008/tokenizers-win32-x64-msvc@0.0.0" = fetchurl { + url = "https://registry.npmjs.org/@anush008/tokenizers-win32-x64-msvc/-/tokenizers-win32-x64-msvc-0.0.0.tgz"; + hash = "sha512-/5kP0G96+Cr6947F0ZetXnmL31YCaN15dbNbh2NHg7TXXRwfqk95+JtPP5Q7v4jbR2xxAmuseBqB4H/V7zKWuw=="; + }; + "@anush008/tokenizers@0.0.0" = fetchurl { + url = "https://registry.npmjs.org/@anush008/tokenizers/-/tokenizers-0.0.0.tgz"; + hash = "sha512-IQD9wkVReKAhsEAbDjh/0KrBGTEXelqZLpOBRDaIRvlzZ9sjmUP+gKbpvzyJnei2JHQiE8JAgj7YcNloINbGBw=="; + }; + "@ark/attest@0.56.3" = fetchurl { + url = "https://registry.npmjs.org/@ark/attest/-/attest-0.56.3.tgz"; + hash = "sha512-34YxcziljIzh1mHGaUoBcAGxqEkvFWObai9BhzQF3zkedUUT1ERqOAiqgHf+2wG9D03f7ErHbb/HYKUjkiXxjg=="; + }; + "@ark/fs@0.56.2" = fetchurl { + url = "https://registry.npmjs.org/@ark/fs/-/fs-0.56.2.tgz"; + hash = "sha512-mnr9H4P5stD8AHacOUN5nyIiDe8wfCWJQ0l/JZtDGjrnbgIFb2NHRcKf2ym3ielRFgwsnTIZg4P1J6CqfbjM8g=="; + }; + "@ark/schema@0.56.2" = fetchurl { + url = "https://registry.npmjs.org/@ark/schema/-/schema-0.56.2.tgz"; + hash = "sha512-Qx4D2JFbBWpntiHZaTv7bGG4H/M2rigiknezKg/WVyDSaLdE4YCcWAOoFB7pjjDqHbbV2OqRfntm1nnXvwMexg=="; + }; + "@ark/util@0.56.2" = fetchurl { + url = "https://registry.npmjs.org/@ark/util/-/util-0.56.2.tgz"; + hash = "sha512-9kU2sUE38FZEGG7l3hamYMBieLYEJh2L1mrYD2eXpT+78EnQSV1bhjxJhnxGBMSTbtwpBSDNSK+K60WvaI/DTQ=="; + }; + "@babel/code-frame@7.29.7" = fetchurl { + url = "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz"; + hash = "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="; + }; + "@babel/compat-data@7.29.7" = fetchurl { + url = "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz"; + hash = "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg=="; + }; + "@babel/core@7.29.7" = fetchurl { + url = "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz"; + hash = "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA=="; + }; + "@babel/generator@7.29.8" = fetchurl { + url = "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz"; + hash = "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg=="; + }; + "@babel/helper-compilation-targets@7.29.7" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz"; + hash = "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g=="; + }; + "@babel/helper-globals@7.29.7" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz"; + hash = "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA=="; + }; + "@babel/helper-module-imports@7.18.6" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz"; + hash = "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA=="; + }; + "@babel/helper-module-imports@7.29.7" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz"; + hash = "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g=="; + }; + "@babel/helper-module-transforms@7.29.7" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz"; + hash = "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg=="; + }; + "@babel/helper-plugin-utils@7.29.7" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz"; + hash = "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw=="; + }; + "@babel/helper-string-parser@7.29.7" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz"; + hash = "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="; + }; + "@babel/helper-validator-identifier@7.29.7" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz"; + hash = "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="; + }; + "@babel/helper-validator-option@7.29.7" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz"; + hash = "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw=="; + }; + "@babel/helpers@7.29.7" = fetchurl { + url = "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz"; + hash = "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg=="; + }; + "@babel/parser@7.29.8" = fetchurl { + url = "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz"; + hash = "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA=="; + }; + "@babel/plugin-syntax-jsx@7.29.7" = fetchurl { + url = "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz"; + hash = "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A=="; + }; + "@babel/template@7.29.7" = fetchurl { + url = "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz"; + hash = "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg=="; + }; + "@babel/traverse@7.29.8" = fetchurl { + url = "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz"; + hash = "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg=="; + }; + "@babel/types@7.29.8" = fetchurl { + url = "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz"; + hash = "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg=="; + }; + "@biomejs/biome@2.5.7" = fetchurl { + url = "https://registry.npmjs.org/@biomejs/biome/-/biome-2.5.7.tgz"; + hash = "sha512-zr8K/DcY5tYsQOQwqMJ0AWElo6QgmgNI7idXgXLhevVszlt8RGVpesEJPqx3ThazLaOwjJ5Y8fz3BtH5fGZNsw=="; + }; + "@biomejs/cli-darwin-arm64@2.5.7" = fetchurl { + url = "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.5.7.tgz"; + hash = "sha512-vxo/Ls3/PYdQWyLhYYcgMOCzQypAjcY+iihS8M0wW03l16TCLW4zqZzGo75gm1VdCMj38hTVZ31KBWrZ4G9dJw=="; + }; + "@biomejs/cli-darwin-x64@2.5.7" = fetchurl { + url = "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.5.7.tgz"; + hash = "sha512-Cd3Ga61amT/Yl/0x8elP5hhGYaFy4bw6WuysTgf7oo8TA5tJ5A1k+DkVoJ2BHbTVil51gTX9VPzArnrlLJ3Kyg=="; + }; + "@biomejs/cli-linux-arm64-musl@2.5.7" = fetchurl { + url = "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.5.7.tgz"; + hash = "sha512-xPI5yB6XlpDbNkS+bm1t42olw5c4l3UrlOmLg7KtLJvjvkNF/1V4tnUgfkylGIeb3u/T+BzMGYqgQhzjAoJzuQ=="; + }; + "@biomejs/cli-linux-arm64@2.5.7" = fetchurl { + url = "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.5.7.tgz"; + hash = "sha512-rR2QE0yF2GYSuYuKIa7pKvODGJqnOH+2eDREAM8wV+mWKSkMQKdAp4zXEZfTaxY8PMoNONnpgSWcBCyLDPDOKg=="; + }; + "@biomejs/cli-linux-x64-musl@2.5.7" = fetchurl { + url = "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.5.7.tgz"; + hash = "sha512-rE5VZi+qtmPgQH+l7jVxYoZ18b/TiHEhulhMpjmCZH1PltSbjRcxNWywC3HZ9tYottG7ORkeTtoscBilKSBm0g=="; + }; + "@biomejs/cli-linux-x64@2.5.7" = fetchurl { + url = "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.5.7.tgz"; + hash = "sha512-FQgqJhscrqJUFptGaRSUJWlXAExwWcDwLuK49dvKfkQ1bB5SEEyFssnsxQY83Xm6jR0EbbX3+8+D5bfvYqUG2Q=="; + }; + "@biomejs/cli-win32-arm64@2.5.7" = fetchurl { + url = "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.5.7.tgz"; + hash = "sha512-Oq4x0CCwP4jirrcTywXs5kOGZ4v5vuEP+gWrbtjApOA2CL9F3F9GlIdQIci8AKSCa/zURanMRpX/4wQ7Am6hHg=="; + }; + "@biomejs/cli-win32-x64@2.5.7" = fetchurl { + url = "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.5.7.tgz"; + hash = "sha512-V+0wu/nrj2S+MhP4EQ0uHNolP0IALEsz45pg0WoKkHfDeh0+ItHwP/p7bX5RPoMOl9NkpHYWdYPhIcy2mACHvQ=="; + }; + "@bufbuild/protobuf@2.13.0" = fetchurl { + url = "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.13.0.tgz"; + hash = "sha512-acq7c49vxfm1ggJ95P70TX7ABDM0vxr1SYD3BB0o0jnBLB4OAqeHyKuN+cD3w80gXEDQ2zxHpR6CUeA+O/aU9g=="; + }; + "@bufbuild/protoc-gen-es@2.13.0" = fetchurl { + url = "https://registry.npmjs.org/@bufbuild/protoc-gen-es/-/protoc-gen-es-2.13.0.tgz"; + hash = "sha512-ylI1vrLksdnXrVZRs9xGxmrQxKGhUm6pPszv26kqBvNiO3qPTktk+hgfwbLISBY4M/reShkT2dFLGT9fbydBXg=="; + }; + "@bufbuild/protoplugin@2.13.0" = fetchurl { + url = "https://registry.npmjs.org/@bufbuild/protoplugin/-/protoplugin-2.13.0.tgz"; + hash = "sha512-32eMChKaL/A8Hh5AfMmXSdnuyznN85uoEjoyWiWeRrvtQOtpqX/v1R9PDe0g9vMIgzznK9inMT3CUaal0kjLUQ=="; + }; + "@emnapi/core@1.11.2" = fetchurl { + url = "https://registry.npmjs.org/@emnapi/core/-/core-1.11.2.tgz"; + hash = "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA=="; + }; + "@emnapi/core@1.11.3" = fetchurl { + url = "https://registry.npmjs.org/@emnapi/core/-/core-1.11.3.tgz"; + hash = "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg=="; + }; + "@emnapi/core@1.9.2" = fetchurl { + url = "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz"; + hash = "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA=="; + }; + "@emnapi/runtime@1.11.2" = fetchurl { + url = "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz"; + hash = "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA=="; + }; + "@emnapi/runtime@1.11.3" = fetchurl { + url = "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz"; + hash = "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA=="; + }; + "@emnapi/runtime@1.9.2" = fetchurl { + url = "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz"; + hash = "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw=="; + }; + "@emnapi/wasi-threads@1.2.1" = fetchurl { + url = "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz"; + hash = "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="; + }; + "@emnapi/wasi-threads@1.2.2" = fetchurl { + url = "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz"; + hash = "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA=="; + }; + "@emnapi/wasi-threads@1.2.3" = fetchurl { + url = "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz"; + hash = "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g=="; + }; + "@huggingface/blake3-jit@0.0.2" = fetchurl { + url = "https://registry.npmjs.org/@huggingface/blake3-jit/-/blake3-jit-0.0.2.tgz"; + hash = "sha512-Bq7B5qabyjrJfhBsl85Jd2QBtf+HzRD7h7A9GfN2lzrrsABhOa5evVPgzoCTxR7Ub0QFj7YDK1YkYRWBU25+2w=="; + }; + "@huggingface/hub@2.15.0" = fetchurl { + url = "https://registry.npmjs.org/@huggingface/hub/-/hub-2.15.0.tgz"; + hash = "sha512-+sHWNz0YpqTvwuIYDxpyrhyk1o2j9lIJuPzbhUT0kxU8IHP9ZOzeajk/O6RRbZyvAM9h6m219FghDLi0Ayblww=="; + }; + "@huggingface/jinja@0.5.9" = fetchurl { + url = "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.5.9.tgz"; + hash = "sha512-uWTG+l3VJRsl7EXxYizuL3P+cCPoc3cRqbWWRcQN0FhejRfbdq0RNhCmbY/YDtnTcz9icdLYuLDjsnz4d8JMuw=="; + }; + "@huggingface/tasks@0.21.33" = fetchurl { + url = "https://registry.npmjs.org/@huggingface/tasks/-/tasks-0.21.33.tgz"; + hash = "sha512-efQa8g+WjPwzlwk7Wl4eDgbM1Jq+WooUw/b1+eKl2LVUdPMhnbwsFNMJJxhEywaLJvJBy93+jjna6855U9GePw=="; + }; + "@huggingface/tokenizers@0.1.3" = fetchurl { + url = "https://registry.npmjs.org/@huggingface/tokenizers/-/tokenizers-0.1.3.tgz"; + hash = "sha512-8rF/RRT10u+kn7YuUbUg0OF30K8rjTc78aHpxT+qJ1uWSqxT1MHi8+9ltwYfkFYJzT/oS+qw3JVfHtNMGAdqyA=="; + }; + "@huggingface/transformers@4.2.0" = fetchurl { + url = "https://registry.npmjs.org/@huggingface/transformers/-/transformers-4.2.0.tgz"; + hash = "sha512-8BRCoBMH0XsWaEIamuR0LrJGAfftgHAfb2Vrffy0VKlSAE/MnUJ5/h/zTfEP3fDIft+nk7TqB8xXEyABGitBjQ=="; + }; + "@huggingface/xetchunk-wasm@0.1.0" = fetchurl { + url = "https://registry.npmjs.org/@huggingface/xetchunk-wasm/-/xetchunk-wasm-0.1.0.tgz"; + hash = "sha512-wWpp2qwPgf9kv1KLJjcDUk/OrpDOsFoQ3Qpz0U5LGn20csoymBf8eneOv6wm/GzPBzlWac1OYiR0aa1vT6aM2Q=="; + }; + "@img/colour@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz"; + hash = "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ=="; + }; + "@img/sharp-darwin-arm64@0.34.5" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz"; + hash = "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="; + }; + "@img/sharp-darwin-x64@0.34.5" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz"; + hash = "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="; + }; + "@img/sharp-libvips-darwin-arm64@1.2.4" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz"; + hash = "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="; + }; + "@img/sharp-libvips-darwin-x64@1.2.4" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz"; + hash = "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="; + }; + "@img/sharp-libvips-linux-arm64@1.2.4" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz"; + hash = "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="; + }; + "@img/sharp-libvips-linux-arm@1.2.4" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz"; + hash = "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="; + }; + "@img/sharp-libvips-linux-ppc64@1.2.4" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz"; + hash = "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA=="; + }; + "@img/sharp-libvips-linux-riscv64@1.2.4" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz"; + hash = "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA=="; + }; + "@img/sharp-libvips-linux-s390x@1.2.4" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz"; + hash = "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="; + }; + "@img/sharp-libvips-linux-x64@1.2.4" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz"; + hash = "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="; + }; + "@img/sharp-libvips-linuxmusl-arm64@1.2.4" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz"; + hash = "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="; + }; + "@img/sharp-libvips-linuxmusl-x64@1.2.4" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz"; + hash = "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="; + }; + "@img/sharp-linux-arm64@0.34.5" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz"; + hash = "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="; + }; + "@img/sharp-linux-arm@0.34.5" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz"; + hash = "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="; + }; + "@img/sharp-linux-ppc64@0.34.5" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz"; + hash = "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA=="; + }; + "@img/sharp-linux-riscv64@0.34.5" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz"; + hash = "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw=="; + }; + "@img/sharp-linux-s390x@0.34.5" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz"; + hash = "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="; + }; + "@img/sharp-linux-x64@0.34.5" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz"; + hash = "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="; + }; + "@img/sharp-linuxmusl-arm64@0.34.5" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz"; + hash = "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="; + }; + "@img/sharp-linuxmusl-x64@0.34.5" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz"; + hash = "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="; + }; + "@img/sharp-wasm32@0.34.5" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz"; + hash = "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="; + }; + "@img/sharp-win32-arm64@0.34.5" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz"; + hash = "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g=="; + }; + "@img/sharp-win32-ia32@0.34.5" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz"; + hash = "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="; + }; + "@img/sharp-win32-x64@0.34.5" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz"; + hash = "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="; + }; + "@inquirer/ansi@2.0.7" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/ansi/-/ansi-2.0.7.tgz"; + hash = "sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q=="; + }; + "@inquirer/checkbox@5.2.1" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-5.2.1.tgz"; + hash = "sha512-b6xmA/VlTe0ZgDQHDui+Nav470u7u49nRd8/iuhOcQPO9Ch7lGuogydhi2VOmNlZ+zXcM8IcPuNSwQcdJaF/kw=="; + }; + "@inquirer/confirm@6.1.1" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.1.1.tgz"; + hash = "sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ=="; + }; + "@inquirer/core@11.2.1" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/core/-/core-11.2.1.tgz"; + hash = "sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA=="; + }; + "@inquirer/editor@5.2.2" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/editor/-/editor-5.2.2.tgz"; + hash = "sha512-ZRVd/oD+sYsUd5zVm0NflqEzlqfYCyHNsqkHl2oWXEUHs12tCbcSFi+wVFEvD8+LGRaMUsVrE7qeo6lSG/S1Vg=="; + }; + "@inquirer/expand@5.1.1" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/expand/-/expand-5.1.1.tgz"; + hash = "sha512-YmQpenjbFSHAK3sOd44puHh3V1KXXr+JiNpUztoSQ4drLh2rTVzTap/YtlAVu/5xavifIlBfNEzJ/neZJ1a/1g=="; + }; + "@inquirer/external-editor@3.0.3" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-3.0.3.tgz"; + hash = "sha512-6thf5I8q7lZwzGLAxPaaGEREEkZ3nyePPDQ1oyobblxmEE8mqTLguScP7pDjUTAibiyb4hfXl+qjUEJ+di/aNA=="; + }; + "@inquirer/figures@2.0.7" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/figures/-/figures-2.0.7.tgz"; + hash = "sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw=="; + }; + "@inquirer/input@5.1.2" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/input/-/input-5.1.2.tgz"; + hash = "sha512-9K/DDBSQpOyZSkt6sOVP9Vo0TR7atX2kuILsUu0x3wVcVbe97lJwIJKMLdMw25tDYuXl/qp6erT0Xs1rfmcfZg=="; + }; + "@inquirer/number@4.1.1" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/number/-/number-4.1.1.tgz"; + hash = "sha512-XF4IXAbPnGPgw0wsbC/i2tPcyfdZgDpUlhsqU0SfT4IRIGWha6Xm9VRgN5yYxJq+jnyXlfXI/nQ3ulfk0iEICA=="; + }; + "@inquirer/password@5.1.1" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/password/-/password-5.1.1.tgz"; + hash = "sha512-3XBfF7DAsp5qeDsvN5Rd1HmbNokVvEQoUM0QLrRcybC9nX96w3Pbmu7qUsb3IT3J3jBvs2+mTXaKHOUsgHMLzg=="; + }; + "@inquirer/prompts@8.5.2" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/prompts/-/prompts-8.5.2.tgz"; + hash = "sha512-IYR/3C/paEVVQYQvdDlFZVjRCJVYHHON0XXMH91KO9GSxs0TdKYWlUdvfQl2EfAHDxUaN3IBffkE/BDTh5nJ6g=="; + }; + "@inquirer/rawlist@5.3.1" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-5.3.1.tgz"; + hash = "sha512-QqdTqQddL3qPX/PPrjobpsO25NZ4dWXgTLenrR445L2ptLEYE6Z+PD5c5CNDJNx4ugRgELAIpSIJxZaO2jJ2Og=="; + }; + "@inquirer/search@4.2.1" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/search/-/search-4.2.1.tgz"; + hash = "sha512-xJj8QWKRSrfKoBIITLZK61dD3zwo0Rz11fgDImku30/Oe81zMdIdGgrLY2h6RkJ+KZ/GhNYIRMKnH/62qBTA5g=="; + }; + "@inquirer/select@5.2.1" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/select/-/select-5.2.1.tgz"; + hash = "sha512-FlDndEUww8m7BfukO2nJa25vhD+H5jxxCv4oGioKqzyWz3nPHhhw4LKdYRSlXuAx7DsdWia7iyaBPKKS95Evfw=="; + }; + "@inquirer/type@4.0.7" = fetchurl { + url = "https://registry.npmjs.org/@inquirer/type/-/type-4.0.7.tgz"; + hash = "sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g=="; + }; + "@isaacs/fs-minipass@4.0.1" = fetchurl { + url = "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz"; + hash = "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="; + }; + "@jridgewell/gen-mapping@0.3.13" = fetchurl { + url = "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz"; + hash = "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="; + }; + "@jridgewell/remapping@2.3.5" = fetchurl { + url = "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz"; + hash = "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="; + }; + "@jridgewell/resolve-uri@3.1.2" = fetchurl { + url = "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz"; + hash = "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="; + }; + "@jridgewell/sourcemap-codec@1.5.5" = fetchurl { + url = "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz"; + hash = "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="; + }; + "@jridgewell/trace-mapping@0.3.31" = fetchurl { + url = "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz"; + hash = "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="; + }; + "@kurkle/color@0.3.4" = fetchurl { + url = "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz"; + hash = "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w=="; + }; + "@napi-rs/cli@3.7.2" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/cli/-/cli-3.7.2.tgz"; + hash = "sha512-shDW0Td/XZQpP04Yy+OsMt1ILMKGGkoLcy1zVAsSAK0fLfWm0Upgkmfs/NOV2ZhMQwkgpR3ZEdyHmTwgrUDQuA=="; + }; + "@napi-rs/cross-toolchain@1.0.3" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/cross-toolchain/-/cross-toolchain-1.0.3.tgz"; + hash = "sha512-ENPfLe4937bsKVTDA6zdABx4pq9w0tHqRrJHyaGxgaPq03a2Bd1unD5XSKjXJjebsABJ+MjAv1A2OvCgK9yehg=="; + }; + "@napi-rs/lzma-android-arm-eabi@1.5.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/lzma-android-arm-eabi/-/lzma-android-arm-eabi-1.5.1.tgz"; + hash = "sha512-sahBe4ko2Z69NPTddaX6ZgbQZu9SDoITxw1S3dWl1gAGynZG34qHHCT8UaUMFxf3h3zMhCJjEzz4basaBxiTuQ=="; + }; + "@napi-rs/lzma-android-arm64@1.5.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/lzma-android-arm64/-/lzma-android-arm64-1.5.1.tgz"; + hash = "sha512-7tkQAJJuBHxAxiEBNFgSTpvrtGpbwZYYJUSOmGEK3OfbdbNeoT2rdBxpM/gY1s+itEVbtOSlpaRPPG19MnwOzA=="; + }; + "@napi-rs/lzma-darwin-arm64@1.5.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/lzma-darwin-arm64/-/lzma-darwin-arm64-1.5.1.tgz"; + hash = "sha512-XWX8gtF+GHGk3nH3Wm3QUZNcxw9QHsFVZz3MzVLhWWHhceede1J4/vD+3dj3E1iKB9G6mualaZxOoD08R3E+7g=="; + }; + "@napi-rs/lzma-darwin-x64@1.5.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/lzma-darwin-x64/-/lzma-darwin-x64-1.5.1.tgz"; + hash = "sha512-CfsqUpMTI1z8enrA/b+GcHM6YDI8D0kqCiqPYEnst4rbOABQ9KZ92ybTTNnlnZ7A017WoMZKUEWc36KXDwi0xg=="; + }; + "@napi-rs/lzma-freebsd-x64@1.5.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/lzma-freebsd-x64/-/lzma-freebsd-x64-1.5.1.tgz"; + hash = "sha512-bTyNfg90FXIgE61U7l14aMmVOqRQ6AyP5JMT3jmCStaZI18apLNPdzZ8i7yqxZfKvRMVfPjE2brXIw27c+RRgA=="; + }; + "@napi-rs/lzma-linux-arm-gnueabihf@1.5.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/lzma-linux-arm-gnueabihf/-/lzma-linux-arm-gnueabihf-1.5.1.tgz"; + hash = "sha512-vNE+D8nrw+eOkBsdKCsmDhowDV3pIMKXEhedvXfbgrWbrO7GlZJH+RXL+X+RYLxGwi8Ym61ZMt15sIOnNmh9Sw=="; + }; + "@napi-rs/lzma-linux-arm64-gnu@1.5.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/lzma-linux-arm64-gnu/-/lzma-linux-arm64-gnu-1.5.1.tgz"; + hash = "sha512-csUem4WgoKGTprv/pOPm9UIWbb+hrfUwYXefpTHPAEGVFLl5behEFabisJ7FtihCa3yG2Efcl+yw25rlhhrIYw=="; + }; + "@napi-rs/lzma-linux-arm64-musl@1.5.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/lzma-linux-arm64-musl/-/lzma-linux-arm64-musl-1.5.1.tgz"; + hash = "sha512-kB/xhlVN1eLvVmDJSKZEjp5Gg2xDYexNrB5jwpSMbOkeGS6N9AasByPBg5VqCpMYC+zZi7DM458DRhtWYhqXTQ=="; + }; + "@napi-rs/lzma-linux-ppc64-gnu@1.5.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/lzma-linux-ppc64-gnu/-/lzma-linux-ppc64-gnu-1.5.1.tgz"; + hash = "sha512-s28RW0W1yBWQc1nbPdF7tp14koqslY3ZWLVI8uaanX292Dc6ezd4NPVwxEoCNBVON/oD7BmUbWGtyFvmm7dQ5A=="; + }; + "@napi-rs/lzma-linux-riscv64-gnu@1.5.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/lzma-linux-riscv64-gnu/-/lzma-linux-riscv64-gnu-1.5.1.tgz"; + hash = "sha512-+lGNwYlIN14YPMTNvYtIJJqHFevDTd6Juw/1NmXbWx/iRd/LLrjhlM/yluMX6pxs6NkOGsuuEXJJrbbEUS59OQ=="; + }; + "@napi-rs/lzma-linux-s390x-gnu@1.5.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/lzma-linux-s390x-gnu/-/lzma-linux-s390x-gnu-1.5.1.tgz"; + hash = "sha512-PB44FFWWFrLeQowhcep1hPD1YcLqKlnnY60RMU74qrxTlr4YGEyzeMItJqh2uivBfv9kQScOF/B0J9+Vab/oyw=="; + }; + "@napi-rs/lzma-linux-x64-gnu@1.5.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz"; + hash = "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ=="; + }; + "@napi-rs/lzma-linux-x64-musl@1.5.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-musl/-/lzma-linux-x64-musl-1.5.1.tgz"; + hash = "sha512-I3nsYrWtrW9JpeCr+mkJIVDt0HY3m6qVUBs5vTtoIvJQxwqf1PBXSy5IS7T53ksQFH2kd2UX8rLxJ7B4WISpZg=="; + }; + "@napi-rs/lzma-wasm32-wasi@1.5.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/lzma-wasm32-wasi/-/lzma-wasm32-wasi-1.5.1.tgz"; + hash = "sha512-gy3wwPBa6+XEyA4fUzq6CClrXA1ajXjuVf5zbnHytJRgoHznj+mvpU3+co2fxXwqTCmIpn6KrzqH5bRDztBPhA=="; + }; + "@napi-rs/lzma-win32-arm64-msvc@1.5.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/lzma-win32-arm64-msvc/-/lzma-win32-arm64-msvc-1.5.1.tgz"; + hash = "sha512-dK+huOsHiyH6oJjij+cnjqFCakk2HgWmpI12Xm4pLUyPphe4ebYoJBgehaNAxprmjFqBQ7nL95YPVz9BHyqmPg=="; + }; + "@napi-rs/lzma-win32-ia32-msvc@1.5.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/lzma-win32-ia32-msvc/-/lzma-win32-ia32-msvc-1.5.1.tgz"; + hash = "sha512-dGE8L+0EQ+GyU9ap9InqB/t/PmPG/bLj918q7OsJ29FuTdn8fK4OX3U4IQZhylHIA+/dQ/SXJk5n4yfah2XVvA=="; + }; + "@napi-rs/lzma-win32-x64-msvc@1.5.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/lzma-win32-x64-msvc/-/lzma-win32-x64-msvc-1.5.1.tgz"; + hash = "sha512-EKW4t/iqdCT/xnd5t9oXLvVER/PMNAWXKqUAl3fgvUcOILeZIIht77/dVnfFcc9htA/DCBXC/6YQWdW+LusjFA=="; + }; + "@napi-rs/lzma@1.5.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/lzma/-/lzma-1.5.1.tgz"; + hash = "sha512-sgOZ89+y8cDbY+3WbzR8CtIhCuFRWotZ9/2PjPVDJHz6np5KFTAev0DrwiyTJTgFsCRDhfGlbmhMgyhHbWdZ6g=="; + }; + "@napi-rs/tar-android-arm-eabi@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/tar-android-arm-eabi/-/tar-android-arm-eabi-1.1.1.tgz"; + hash = "sha512-cAhnA10cSusAUbcE9HtjQY/tZ9BH/0w2sKtRcQc94TzIlnm7QSr1htJSd/PPrbWNPtrv1orXb2CkrHlVlbnlHA=="; + }; + "@napi-rs/tar-android-arm64@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/tar-android-arm64/-/tar-android-arm64-1.1.1.tgz"; + hash = "sha512-EslUWHCDBY/g5abTPBiHLsMaML4GagV0TXLm5WL9hAjx/DDtlxz9fegMb77RJ+f7nFLOIsUxF/3QWFvgOT0sMQ=="; + }; + "@napi-rs/tar-darwin-arm64@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/tar-darwin-arm64/-/tar-darwin-arm64-1.1.1.tgz"; + hash = "sha512-+A42/6ES5G9CQ35BOwzwA+WBjLID28r2jNPgc0dteD2hhClIhng0mva7D2ujUlXBNmgNOsr1LHn3stA4uTf4NQ=="; + }; + "@napi-rs/tar-darwin-x64@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/tar-darwin-x64/-/tar-darwin-x64-1.1.1.tgz"; + hash = "sha512-RYtE8w1dkEvj8hSJCDV5Jw0Rz2i13fsM7u893zv5O9n/4Ad5GNsw/f4RQ7/0YGSFaenkVxqPFrjmEvUHlKzsrg=="; + }; + "@napi-rs/tar-freebsd-x64@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/tar-freebsd-x64/-/tar-freebsd-x64-1.1.1.tgz"; + hash = "sha512-rEepBvCJUwcuvUYkY83e8aot8RsR5Jcnal4PsG3tbWGKW1yAvcXhyMXf0fN6ZGpVRZFnB+FJqDyBxvsCPEXKhw=="; + }; + "@napi-rs/tar-linux-arm-gnueabihf@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/tar-linux-arm-gnueabihf/-/tar-linux-arm-gnueabihf-1.1.1.tgz"; + hash = "sha512-an1bJdfyhI5FpZYyTQ20mrqwR+a676i8GkaYc4Uy12dH/a7TJIfrK6Qa2Gm46arZvxUvx56qxoRKXbpOjUPvwA=="; + }; + "@napi-rs/tar-linux-arm64-gnu@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/tar-linux-arm64-gnu/-/tar-linux-arm64-gnu-1.1.1.tgz"; + hash = "sha512-w++Vtx36T2yHTKws7GVnmHHcUT1ybB59xLWSh9A8bwEpJVG4dG7Qub9mFe5cpcbfrJ+XP2mKKxC3oUJSunK3iQ=="; + }; + "@napi-rs/tar-linux-arm64-musl@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/tar-linux-arm64-musl/-/tar-linux-arm64-musl-1.1.1.tgz"; + hash = "sha512-Rh6UFhNtj3i4deJHOBINFIeRL0072mgbeyuK5rl1HokKnNoMKx8qKIZNEzBTTqpogMfDHWGvzyTQdnVxes5dpA=="; + }; + "@napi-rs/tar-linux-ppc64-gnu@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/tar-linux-ppc64-gnu/-/tar-linux-ppc64-gnu-1.1.1.tgz"; + hash = "sha512-Cp+AxFbv9zcyAXtnzQi0OzmgDnQgy2w9D4Ubr+iwzMtVgJcztzcEoCcCrN1k2ATdEB01LX2Vb49IaocGOZhC9Q=="; + }; + "@napi-rs/tar-linux-s390x-gnu@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/tar-linux-s390x-gnu/-/tar-linux-s390x-gnu-1.1.1.tgz"; + hash = "sha512-ZyscC3SYKTBWyDRYjLOKAd5TyJ7q0KACRdQ8bWrb3rgrra1CCIJD66CsGTH6Dh0AVSdfLwZ8MfIIXU6+14BMjQ=="; + }; + "@napi-rs/tar-linux-x64-gnu@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/tar-linux-x64-gnu/-/tar-linux-x64-gnu-1.1.1.tgz"; + hash = "sha512-LlIv+zg4fiOQge9LQX/ieBdRWE2fhVDjCTHxnunZkbugNmdhdelxWf1RpZb/6ZujWpNF4LPu4N/MW7ygg2oYAQ=="; + }; + "@napi-rs/tar-linux-x64-musl@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/tar-linux-x64-musl/-/tar-linux-x64-musl-1.1.1.tgz"; + hash = "sha512-gZBeoKLjanOVj55qk4EMu13P2i9M0SuINmlGQkOxm1niIJofexzddHUYtqO5o/5QqtyL8lADmAcZplLILMLhHA=="; + }; + "@napi-rs/tar-wasm32-wasi@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/tar-wasm32-wasi/-/tar-wasm32-wasi-1.1.1.tgz"; + hash = "sha512-rwtQ1Mdt/ft6g6I54fJzbUeLspl4yTwj6I3UJ6mitKnrN42soJkcDrdh3Y/FGvlpqZTad2YMQ96fGJl3EtAm2Q=="; + }; + "@napi-rs/tar-win32-arm64-msvc@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/tar-win32-arm64-msvc/-/tar-win32-arm64-msvc-1.1.1.tgz"; + hash = "sha512-30PVp1AehRpfwxmv5wI4cg0yj3WmWBsZ+1QnLGnvEELu7Eu/+dhNU0nrmhI7VfPgLwSRK2eg9DQTB3tP7Wv9bA=="; + }; + "@napi-rs/tar-win32-ia32-msvc@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/tar-win32-ia32-msvc/-/tar-win32-ia32-msvc-1.1.1.tgz"; + hash = "sha512-aI3/rmz+izUChiSeaPxcasAOxhf3FpJNuIHMXlxS/vpW+HIxUsSDR5+XV61PEG5DL4L/75iENVUxmSGM5l2yaw=="; + }; + "@napi-rs/tar-win32-x64-msvc@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/tar-win32-x64-msvc/-/tar-win32-x64-msvc-1.1.1.tgz"; + hash = "sha512-yJsB2IsrODQVLKbm2Fg1nHiVRbEj49mSPbj4x7JPZWJI0jGVPjohE2Sif0FBbx8OxsVoUODvS0BwksZZ8jl/OA=="; + }; + "@napi-rs/tar@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/tar/-/tar-1.1.1.tgz"; + hash = "sha512-p6q2HhUc5vwH1CNwfOcrhLoxfgn8ust8Sqlfx+sA4VzAcp1cMbvbkl99tZZlDqOjCHgQNSiTfk/yWPjl/D42qA=="; + }; + "@napi-rs/wasm-runtime@1.2.2" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.2.tgz"; + hash = "sha512-JfB4kuJQjaoHuCTseIINHtHWeJnvgEcxjwA5t/Y00ZgaOO1Crz3fjT/p8kT28zA/Caz7oiUMn3d6H2yOVCVwuw=="; + }; + "@napi-rs/wasm-tools-android-arm-eabi@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/wasm-tools-android-arm-eabi/-/wasm-tools-android-arm-eabi-1.1.0.tgz"; + hash = "sha512-p6J8PB59I8d/XItXB/go5JH6nKW+xIbpzaL43EBTV0hi7mrS/Z4gs+MsB04ZrlqZN29BdZV8fChRyasuXLhRaA=="; + }; + "@napi-rs/wasm-tools-android-arm64@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/wasm-tools-android-arm64/-/wasm-tools-android-arm64-1.1.0.tgz"; + hash = "sha512-lWoKN3suypeBSCIRPIw+++sH9V2K6nQkhtdt1opu7XY3v9JwLs6Gw063HWRqkNjphlYpkd/Qy8XcfSPGbJj7nQ=="; + }; + "@napi-rs/wasm-tools-darwin-arm64@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/wasm-tools-darwin-arm64/-/wasm-tools-darwin-arm64-1.1.0.tgz"; + hash = "sha512-jfw5vyNDUf6oe0kP8lMveFN9U7cLk1cUosS7uMIfw/xmqmopYfKQ198DAx2g/6aEF7Tm+CqER2gpMpYKui30LA=="; + }; + "@napi-rs/wasm-tools-darwin-x64@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/wasm-tools-darwin-x64/-/wasm-tools-darwin-x64-1.1.0.tgz"; + hash = "sha512-R+pjeudAB7BYdH1vKkOJM61Tfv5jB6uXkxmFscYd+KKpdUpWBlNG+s4hr0w4i1rMBM91VhIAETZn2pz+MDHK9A=="; + }; + "@napi-rs/wasm-tools-freebsd-x64@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/wasm-tools-freebsd-x64/-/wasm-tools-freebsd-x64-1.1.0.tgz"; + hash = "sha512-hQJTe+aazrT++Vgm6I4lUd9099ItUCFYdd+aKg6Ys6nax6d/cZ1barDLTwA2lwOoVDsXMekJI/FOL6ZvVlIYBg=="; + }; + "@napi-rs/wasm-tools-linux-arm64-gnu@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/wasm-tools-linux-arm64-gnu/-/wasm-tools-linux-arm64-gnu-1.1.0.tgz"; + hash = "sha512-1TAXJxUHsWGar90k3W/MknavvBMwOWzjh7Q6Spxo8twRcWJbBD5Kow/Q2KhhDq5hxh2sKGDXn3uLc1tdtz4WUg=="; + }; + "@napi-rs/wasm-tools-linux-arm64-musl@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/wasm-tools-linux-arm64-musl/-/wasm-tools-linux-arm64-musl-1.1.0.tgz"; + hash = "sha512-7rw3nlubTjNAVRH2LwphCxHy1b/N2/TerXocQ6XRn4Q+buaY1Z7P/hbdALy1i1ex2yfOU2Xcij7ib7ZLi/lKfw=="; + }; + "@napi-rs/wasm-tools-linux-x64-gnu@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/wasm-tools-linux-x64-gnu/-/wasm-tools-linux-x64-gnu-1.1.0.tgz"; + hash = "sha512-1sel0t9MRjI/tdT89M8Dd6gPfANeeFP24Xa46R11WeHNwhjsXXZh+xUk50uWCRTSGcaCy3ugm3AMK/lmHYQJkg=="; + }; + "@napi-rs/wasm-tools-linux-x64-musl@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/wasm-tools-linux-x64-musl/-/wasm-tools-linux-x64-musl-1.1.0.tgz"; + hash = "sha512-o2jH5AMfor4EKF2HII1LBnMQxoWu7+usPifTEY8Zk6e9OiSi4EJkAXf9v3ANlX7TI2V/cUEV34OEW7r10GiVIA=="; + }; + "@napi-rs/wasm-tools-wasm32-wasi@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/wasm-tools-wasm32-wasi/-/wasm-tools-wasm32-wasi-1.1.0.tgz"; + hash = "sha512-s6YDtDR1UWrsqJPtaxf+JLYLceWVyn3l8OpQYElHkDhf3Qfz9R6Ba3S0OgznTBv38L5/TIHysQ9Q4yO73Z0csg=="; + }; + "@napi-rs/wasm-tools-win32-arm64-msvc@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/wasm-tools-win32-arm64-msvc/-/wasm-tools-win32-arm64-msvc-1.1.0.tgz"; + hash = "sha512-x+NuxbG84VxU68tU8w7Rf5lSyq0l584M6dVlke5DTweHYFZoMyeqkpbwEq+qsyAX6ivfipK8xRsmFwamb5uDnA=="; + }; + "@napi-rs/wasm-tools-win32-ia32-msvc@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/wasm-tools-win32-ia32-msvc/-/wasm-tools-win32-ia32-msvc-1.1.0.tgz"; + hash = "sha512-mdD96QDEp70SX67rXFTY6c725nVYeqEEjyDqzzbNh6u1APj7CI7IMNpMmvE75XbCRl4C2MHZVU4U6AWdAzvyQQ=="; + }; + "@napi-rs/wasm-tools-win32-x64-msvc@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/wasm-tools-win32-x64-msvc/-/wasm-tools-win32-x64-msvc-1.1.0.tgz"; + hash = "sha512-bVVjuvhlyVX++3eJXfDR63cXdw1ay5QYac6iq0MKQw8wZARInTM+bXCtByDT4fzVFI3+7ZthYb/ERWRdBNIqgQ=="; + }; + "@napi-rs/wasm-tools@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/wasm-tools/-/wasm-tools-1.1.0.tgz"; + hash = "sha512-VjHyKEqXAwYZK+HY7iJctYvRm3TFEbaQxeZwvAG1QRkoo1a39phMY8J6x9tUEqJI03W6MysB8F2jacI6wvcx+w=="; + }; + "@octokit/auth-token@6.0.0" = fetchurl { + url = "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz"; + hash = "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w=="; + }; + "@octokit/core@7.0.7" = fetchurl { + url = "https://registry.npmjs.org/@octokit/core/-/core-7.0.7.tgz"; + hash = "sha512-DcB0M3KFgr9ECI328lhBMVsyFT2DnmNucSBTqEN3exyNKUzkkpUSCHmTRcunF41Eou2TIQKW4seewri8ON9bSA=="; + }; + "@octokit/endpoint@11.0.4" = fetchurl { + url = "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.4.tgz"; + hash = "sha512-f1cOWoHPmxryJFknxbtDdjODWfV8A9tc8Aae6ermXPNgHFZ/x91AtHIz4gicEjL8hkJiip+u21QHJORfBv/qiA=="; + }; + "@octokit/graphql@9.0.4" = fetchurl { + url = "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.4.tgz"; + hash = "sha512-5s15CCiY8XXQ+FG+b1YQcl6Z2FA++nwAz/tg2VUrTmnMncP+2nnGUEYANImdnxsA2Fnq+Mbl7hDjUTw7cFAwcg=="; + }; + "@octokit/openapi-types@27.0.0" = fetchurl { + url = "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz"; + hash = "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA=="; + }; + "@octokit/openapi-types@28.0.0" = fetchurl { + url = "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-28.0.0.tgz"; + hash = "sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ=="; + }; + "@octokit/plugin-paginate-rest@14.0.0" = fetchurl { + url = "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz"; + hash = "sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw=="; + }; + "@octokit/plugin-request-log@6.0.0" = fetchurl { + url = "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-6.0.0.tgz"; + hash = "sha512-UkOzeEN3W91/eBq9sPZNQ7sUBvYCqYbrrD8gTbBuGtHEuycE4/awMXcYvx6sVYo7LypPhmQwwpUe4Yyu4QZN5Q=="; + }; + "@octokit/plugin-rest-endpoint-methods@17.0.0" = fetchurl { + url = "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-17.0.0.tgz"; + hash = "sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw=="; + }; + "@octokit/request-error@7.1.1" = fetchurl { + url = "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.1.tgz"; + hash = "sha512-+eaY7G2VVpSf2pc5Gn1+mph837V/d/TYTJAgWL9Tb0ogGYcpN3IlAVFgjL+Vv93F/sevrxkvsYCedtpLdcFLzA=="; + }; + "@octokit/request@10.0.13" = fetchurl { + url = "https://registry.npmjs.org/@octokit/request/-/request-10.0.13.tgz"; + hash = "sha512-v2269YxL9Yf+x3d+gRI63FP0vFQEiWgLyBzxe/Y+0yFDg2B/Tzf5dhh9VNfccVAQnfcfwQWyk/y6Bn7rUXXs7A=="; + }; + "@octokit/rest@22.0.1" = fetchurl { + url = "https://registry.npmjs.org/@octokit/rest/-/rest-22.0.1.tgz"; + hash = "sha512-Jzbhzl3CEexhnivb1iQ0KJ7s5vvjMWcmRtq5aUsKmKDrRW6z3r84ngmiFKFvpZjpiU/9/S6ITPFRpn5s/3uQJw=="; + }; + "@octokit/types@16.0.0" = fetchurl { + url = "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz"; + hash = "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg=="; + }; + "@octokit/types@17.0.0" = fetchurl { + url = "https://registry.npmjs.org/@octokit/types/-/types-17.0.0.tgz"; + hash = "sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q=="; + }; + "@oh-my-pi/browser-relay" = copyPathToStore ../packages/browser-relay; + "@oh-my-pi/collab-web" = copyPathToStore ../packages/collab-web; + "@oh-my-pi/hashline" = copyPathToStore ../packages/hashline; + "@oh-my-pi/omp-stats" = copyPathToStore ../packages/stats; + "@oh-my-pi/omptype" = copyPathToStore ../packages/omptype; + "@oh-my-pi/pi-agent-core" = copyPathToStore ../packages/agent; + "@oh-my-pi/pi-ai" = copyPathToStore ../packages/ai; + "@oh-my-pi/pi-catalog" = copyPathToStore ../packages/catalog; + "@oh-my-pi/pi-coding-agent" = copyPathToStore ../packages/coding-agent; + "@oh-my-pi/pi-metaharness" = copyPathToStore ../packages/metaharness; + "@oh-my-pi/pi-mnemopi" = copyPathToStore ../packages/mnemopi; + "@oh-my-pi/pi-natives" = copyPathToStore ../packages/natives; + "@oh-my-pi/pi-tui" = copyPathToStore ../packages/tui; + "@oh-my-pi/pi-utils" = copyPathToStore ../packages/utils; + "@oh-my-pi/pi-wire" = copyPathToStore ../packages/wire; + "@oh-my-pi/snapcompact" = copyPathToStore ../packages/snapcompact; + "@oh-my-pi/typescript-edit-benchmark" = copyPathToStore ../packages/typescript-edit-benchmark; + "@opentelemetry/api-logs@0.220.0" = fetchurl { + url = "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.220.0.tgz"; + hash = "sha512-CmVa4ImJ+ynfrPMNaAXHET6Bhb44SwzmfyVJFq9ni2jgXJR/l7C6gfVFddNmHP+ZOkP9cf4f9DBe68qVLTHc9w=="; + }; + "@opentelemetry/api@1.9.1" = fetchurl { + url = "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz"; + hash = "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q=="; + }; + "@opentelemetry/context-async-hooks@2.10.0" = fetchurl { + url = "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.10.0.tgz"; + hash = "sha512-bvyMcgLEkozzSzpEEEo1OMoeQ97bxj6Qs2uN3mPrSdDvObMI1myffD/BPqcLlzZO9//d1SqQA/WPw7Cz2AiqhA=="; + }; + "@opentelemetry/core@2.10.0" = fetchurl { + url = "https://registry.npmjs.org/@opentelemetry/core/-/core-2.10.0.tgz"; + hash = "sha512-/wNZ8twnEQQA4HoHu22+vcsdru6pWPWxW+7w+FlxT6Id7PE/WIbZmVKkte+PF72e0F2dnImFeHD2syyE1Mw6MQ=="; + }; + "@opentelemetry/core@2.9.0" = fetchurl { + url = "https://registry.npmjs.org/@opentelemetry/core/-/core-2.9.0.tgz"; + hash = "sha512-m2nckMT80NnmjTYSPjJQObBJ+8dgkoajEOUbznL8AHZ3T3yHRk2P7gI1PhEBc1+lOnrYE9UWrWHqJDsmqjmNbw=="; + }; + "@opentelemetry/exporter-logs-otlp-proto@0.220.0" = fetchurl { + url = "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-proto/-/exporter-logs-otlp-proto-0.220.0.tgz"; + hash = "sha512-8LZAxdJ0ENDAFwr4j0oY35mHBltiSzvlhdQAPGiC7p9VnxtuSq4SW1gfBAdW6t6hiQG6OwUl8w7KHaOdJPKHWg=="; + }; + "@opentelemetry/exporter-metrics-otlp-http@0.220.0" = fetchurl { + url = "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.220.0.tgz"; + hash = "sha512-Yqt3RBw/bRVncaE9qIIhk4WfjbAQqXuP9FgAaU+IKPndnLEp/cUqZlSC324+bpmduRz7DoTjig8Ub0PeILWXUA=="; + }; + "@opentelemetry/exporter-metrics-otlp-proto@0.220.0" = fetchurl { + url = "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.220.0.tgz"; + hash = "sha512-lyO+IQBdSvqHN/ZOW/OzrSWemtfD+HgWngn+HBNLhjy0YrCQQTz0OE/kSekH2Pl340dn9DWzhqHdz5Eftr+HLA=="; + }; + "@opentelemetry/exporter-trace-otlp-proto@0.220.0" = fetchurl { + url = "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.220.0.tgz"; + hash = "sha512-voTAD8XgJxlK7zLkXh8EzMB09zrQr3tyY/BsnDTlDiQU/UdK58MZ63A3mUjdEDrxMjCVmBHU3WQJhRmQe+Dvzg=="; + }; + "@opentelemetry/otlp-exporter-base@0.220.0" = fetchurl { + url = "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.220.0.tgz"; + hash = "sha512-CXYo8UD5Mn9YbgebO2EL4wejtA+gxLmLiu6HCk2KH2BR7XhFN6/6p1UlCb23DYCjeYkndevLHuejCCN1yx4+OQ=="; + }; + "@opentelemetry/otlp-transformer@0.220.0" = fetchurl { + url = "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.220.0.tgz"; + hash = "sha512-lXGrv7KXZ0gNH9SVNUaa6vv6phVYGvJxfXAlMbzbakiXru75f5MZl8Z7oqiMMQD77riVHJCFlQvbZs/VVN2/4A=="; + }; + "@opentelemetry/resources@2.10.0" = fetchurl { + url = "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.10.0.tgz"; + hash = "sha512-q6MMm2zhggzsHVNbabYwut+a6nbuQQe3URUoxaojM/8K1IBfwwPzvxIjNi2/lI1TFe+fMHMW9MWhrtDLEXEnkA=="; + }; + "@opentelemetry/resources@2.9.0" = fetchurl { + url = "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.9.0.tgz"; + hash = "sha512-jyA5MBLQ+Dkl3+JsZkUoUvL7yHvU64kLsvpXKarWm6347Sl1t1bXFTFykUePNpT5WH5pm9a2Qtt03iIYQhZ1Fg=="; + }; + "@opentelemetry/sdk-logs@0.220.0" = fetchurl { + url = "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.220.0.tgz"; + hash = "sha512-WywcTkQtv2iNmt+6y5Kcd4rzvx9bLVsBa2Nwcmg01IUaBTkTow3W4d9KE5vNBpEDtb9tp21WcRBY/lANRrApYA=="; + }; + "@opentelemetry/sdk-metrics@2.10.0" = fetchurl { + url = "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.10.0.tgz"; + hash = "sha512-t6r1VSvXNtSDnPXU1FbZeetJb7yyovHmgu0wRSoftxtE0g2rSNhQZQUy69sRUCL+iioJpX8SN/S6wq6ZtvLySQ=="; + }; + "@opentelemetry/sdk-metrics@2.9.0" = fetchurl { + url = "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.9.0.tgz"; + hash = "sha512-Xx8RGS4H5XEBl01WuCreMIpiah9cCXMbSkeuIePPdD2cUpq/vUzYmj8E/MK1OsbOc93FuAD4jfn2WOacKwLn7Q=="; + }; + "@opentelemetry/sdk-trace-base@2.10.0" = fetchurl { + url = "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.10.0.tgz"; + hash = "sha512-GuYQQT7QD2EeO8lcZLRQzcbOyhqAzL+6WWTKTU9mSUBYBazkEDl+VrQcXQhbB08OWM9anD1aHleVadzulpOaUQ=="; + }; + "@opentelemetry/sdk-trace-node@2.10.0" = fetchurl { + url = "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-2.10.0.tgz"; + hash = "sha512-GZK/G6oZyBLGlH1pUgeDch7D91KoHd2uotUGIkWCPi9GI5T9X0p4L7nNAMDR1BQjkRYoDqo+ddfVx9t5Uhys+Q=="; + }; + "@opentelemetry/sdk-trace@2.10.0" = fetchurl { + url = "https://registry.npmjs.org/@opentelemetry/sdk-trace/-/sdk-trace-2.10.0.tgz"; + hash = "sha512-MfQGq3GRmTh5fM/y+OjaO0vj6+luCB1XO2gfXCalKCfgKw0eHL++sm75DNweC6ohlp+aFvACqeE0fYayqdRaoQ=="; + }; + "@opentelemetry/sdk-trace@2.9.0" = fetchurl { + url = "https://registry.npmjs.org/@opentelemetry/sdk-trace/-/sdk-trace-2.9.0.tgz"; + hash = "sha512-sGA19HvtrrSKYsseHphluH6j3p6Xa3fqc7c7y8f/7mYWejc1lyDFcpSdD1kYa50HCLUeEo4zA5bW0pniaPszuw=="; + }; + "@opentelemetry/semantic-conventions@1.43.0" = fetchurl { + url = "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.43.0.tgz"; + hash = "sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg=="; + }; + "@oxc-project/types@0.143.0" = fetchurl { + url = "https://registry.npmjs.org/@oxc-project/types/-/types-0.143.0.tgz"; + hash = "sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA=="; + }; + "@prettier/sync@0.6.1" = fetchurl { + url = "https://registry.npmjs.org/@prettier/sync/-/sync-0.6.1.tgz"; + hash = "sha512-yF9G8vK/LYUTF3Cijd7VC9La3b20F20/J/fgoR4H0B8JGOWnZVZX6+I6+vODPosjmMcpdlUV+gUqJQZp3kLOcw=="; + }; + "@protobufjs/aspromise@1.1.2" = fetchurl { + url = "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz"; + hash = "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="; + }; + "@protobufjs/base64@1.1.2" = fetchurl { + url = "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz"; + hash = "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="; + }; + "@protobufjs/codegen@2.0.5" = fetchurl { + url = "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz"; + hash = "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g=="; + }; + "@protobufjs/eventemitter@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz"; + hash = "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg=="; + }; + "@protobufjs/fetch@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz"; + hash = "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw=="; + }; + "@protobufjs/float@1.0.2" = fetchurl { + url = "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz"; + hash = "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="; + }; + "@protobufjs/path@1.1.2" = fetchurl { + url = "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz"; + hash = "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="; + }; + "@protobufjs/pool@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz"; + hash = "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="; + }; + "@protobufjs/utf8@1.1.2" = fetchurl { + url = "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.2.tgz"; + hash = "sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug=="; + }; + "@puppeteer/browsers@3.0.6" = fetchurl { + url = "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-3.0.6.tgz"; + hash = "sha512-B/gKoqlFkzhvzsI6jo9K1cZz9o5ypviVv/xu8CwA4grZzyVwN+XfkT+tu8T1zrauuEXv6VhS2oGX+6NL95WcKA=="; + }; + "@rolldown/binding-android-arm64@1.2.3" = fetchurl { + url = "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.3.tgz"; + hash = "sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw=="; + }; + "@rolldown/binding-darwin-arm64@1.2.3" = fetchurl { + url = "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.3.tgz"; + hash = "sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA=="; + }; + "@rolldown/binding-darwin-x64@1.2.3" = fetchurl { + url = "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.3.tgz"; + hash = "sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA=="; + }; + "@rolldown/binding-freebsd-x64@1.2.3" = fetchurl { + url = "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.3.tgz"; + hash = "sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg=="; + }; + "@rolldown/binding-linux-arm-gnueabihf@1.2.3" = fetchurl { + url = "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.3.tgz"; + hash = "sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw=="; + }; + "@rolldown/binding-linux-arm64-gnu@1.2.3" = fetchurl { + url = "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.3.tgz"; + hash = "sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw=="; + }; + "@rolldown/binding-linux-arm64-musl@1.2.3" = fetchurl { + url = "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.3.tgz"; + hash = "sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q=="; + }; + "@rolldown/binding-linux-ppc64-gnu@1.2.3" = fetchurl { + url = "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.3.tgz"; + hash = "sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w=="; + }; + "@rolldown/binding-linux-s390x-gnu@1.2.3" = fetchurl { + url = "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.3.tgz"; + hash = "sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg=="; + }; + "@rolldown/binding-linux-x64-gnu@1.2.3" = fetchurl { + url = "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.3.tgz"; + hash = "sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w=="; + }; + "@rolldown/binding-linux-x64-musl@1.2.3" = fetchurl { + url = "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.3.tgz"; + hash = "sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A=="; + }; + "@rolldown/binding-openharmony-arm64@1.2.3" = fetchurl { + url = "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.3.tgz"; + hash = "sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug=="; + }; + "@rolldown/binding-win32-arm64-msvc@1.2.3" = fetchurl { + url = "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.3.tgz"; + hash = "sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw=="; + }; + "@rolldown/binding-win32-x64-msvc@1.2.3" = fetchurl { + url = "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.3.tgz"; + hash = "sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg=="; + }; + "@rolldown/pluginutils@1.0.1" = fetchurl { + url = "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz"; + hash = "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="; + }; + "@sinclair/typebox@0.34.52" = fetchurl { + url = "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.52.tgz"; + hash = "sha512-XiMQh7qqVlxZzcVD+kkGMNGMzcTrDMLWI7S4x7z1MkCkbDPrekpZXEUK0eZqZFMuHQg2a2DZOcDIh9o5v3Gonw=="; + }; + "@tailwindcss/node@4.3.3" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz"; + hash = "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg=="; + }; + "@tailwindcss/oxide-android-arm64@4.3.3" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz"; + hash = "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw=="; + }; + "@tailwindcss/oxide-darwin-arm64@4.3.3" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz"; + hash = "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw=="; + }; + "@tailwindcss/oxide-darwin-x64@4.3.3" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz"; + hash = "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw=="; + }; + "@tailwindcss/oxide-freebsd-x64@4.3.3" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz"; + hash = "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw=="; + }; + "@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz"; + hash = "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ=="; + }; + "@tailwindcss/oxide-linux-arm64-gnu@4.3.3" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz"; + hash = "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w=="; + }; + "@tailwindcss/oxide-linux-arm64-musl@4.3.3" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz"; + hash = "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA=="; + }; + "@tailwindcss/oxide-linux-x64-gnu@4.3.3" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz"; + hash = "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w=="; + }; + "@tailwindcss/oxide-linux-x64-musl@4.3.3" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz"; + hash = "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img=="; + }; + "@tailwindcss/oxide-wasm32-wasi@4.3.3" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz"; + hash = "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ=="; + }; + "@tailwindcss/oxide-win32-arm64-msvc@4.3.3" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz"; + hash = "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ=="; + }; + "@tailwindcss/oxide-win32-x64-msvc@4.3.3" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz"; + hash = "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw=="; + }; + "@tailwindcss/oxide@4.3.3" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz"; + hash = "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA=="; + }; + "@tailwindcss/vite@4.3.3" = fetchurl { + url = "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz"; + hash = "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw=="; + }; + "@ts-morph/common@0.29.0" = fetchurl { + url = "https://registry.npmjs.org/@ts-morph/common/-/common-0.29.0.tgz"; + hash = "sha512-35oUmphHbJvQ/+UTwFNme/t2p3FoKiGJ5auTjjpNTop2dyREspirjMy82PLSC1pnDJ8ah1GU98hwpVt64YXQsg=="; + }; + "@tybys/wasm-util@0.10.3" = fetchurl { + url = "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz"; + hash = "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="; + }; + "@types/babel__core@7.20.5" = fetchurl { + url = "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz"; + hash = "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="; + }; + "@types/babel__generator@7.27.0" = fetchurl { + url = "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz"; + hash = "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="; + }; + "@types/babel__template@7.4.4" = fetchurl { + url = "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz"; + hash = "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="; + }; + "@types/babel__traverse@7.28.0" = fetchurl { + url = "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz"; + hash = "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="; + }; + "@types/bun@1.3.14" = fetchurl { + url = "https://registry.npmjs.org/@types/bun/-/bun-1.3.14.tgz"; + hash = "sha512-h1hFqFVcvAvD9j9K7ZW7vd82aSA+rTdznZa+5bwvCwqSB1jmmfLcbIWhOLx1/+boy/xmjgCs/OMUL8hRJSmnPw=="; + }; + "@types/d3-path@3.1.1" = fetchurl { + url = "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz"; + hash = "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg=="; + }; + "@types/d3-scale@4.0.9" = fetchurl { + url = "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz"; + hash = "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw=="; + }; + "@types/d3-shape@3.1.8" = fetchurl { + url = "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz"; + hash = "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w=="; + }; + "@types/d3-time@3.0.4" = fetchurl { + url = "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz"; + hash = "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="; + }; + "@types/node@26.2.0" = fetchurl { + url = "https://registry.npmjs.org/@types/node/-/node-26.2.0.tgz"; + hash = "sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg=="; + }; + "@types/react-dom@19.2.4" = fetchurl { + url = "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz"; + hash = "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw=="; + }; + "@types/react@19.2.18" = fetchurl { + url = "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz"; + hash = "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w=="; + }; + "@typescript/analyze-trace@0.10.1" = fetchurl { + url = "https://registry.npmjs.org/@typescript/analyze-trace/-/analyze-trace-0.10.1.tgz"; + hash = "sha512-RnlSOPh14QbopGCApgkSx5UBgGda5MX1cHqp2fsqfiDyCwGL/m1jaeB9fzu7didVS81LQqGZZuxFBcg8YU8EVw=="; + }; + "@typescript/native-preview-darwin-arm64@7.0.0-dev.20260707.2" = fetchurl { + url = "https://registry.npmjs.org/@typescript/native-preview-darwin-arm64/-/native-preview-darwin-arm64-7.0.0-dev.20260707.2.tgz"; + hash = "sha512-wny2pgKjGbiZtnOIHVa3tXC1UfDqxNEFzyPGmiqybedG8hipG2Nfp0l5UxbaKCjkLacUpH/W5bP2hBOMVhCOzg=="; + }; + "@typescript/native-preview-darwin-x64@7.0.0-dev.20260707.2" = fetchurl { + url = "https://registry.npmjs.org/@typescript/native-preview-darwin-x64/-/native-preview-darwin-x64-7.0.0-dev.20260707.2.tgz"; + hash = "sha512-Afc7M5zOwo+GpfcYwz5Z8HMB2tPVsui7nNIqEuuFB73MPdVqNn/Wmpe4tP4MRri0AtJnJknoHBaTJ/VDAp/Jhw=="; + }; + "@typescript/native-preview-linux-arm64@7.0.0-dev.20260707.2" = fetchurl { + url = "https://registry.npmjs.org/@typescript/native-preview-linux-arm64/-/native-preview-linux-arm64-7.0.0-dev.20260707.2.tgz"; + hash = "sha512-iITBa2WjjTI5N9t5l7Z4KoOSI+2zBlhbvFzsD/f8qX8QoKjz/Y4DPyBDgezYi8nkqjjksbgSOJ3/ykzhwrB9cg=="; + }; + "@typescript/native-preview-linux-arm@7.0.0-dev.20260707.2" = fetchurl { + url = "https://registry.npmjs.org/@typescript/native-preview-linux-arm/-/native-preview-linux-arm-7.0.0-dev.20260707.2.tgz"; + hash = "sha512-hJm/UOqZTr9FHmR7uNm8VGX4oKtfWk0Jem0zPeJFNC8ckGUfSBueyiEYMZB+XmRc1aG4x1E46y3CplP4CLHvGQ=="; + }; + "@typescript/native-preview-linux-x64@7.0.0-dev.20260707.2" = fetchurl { + url = "https://registry.npmjs.org/@typescript/native-preview-linux-x64/-/native-preview-linux-x64-7.0.0-dev.20260707.2.tgz"; + hash = "sha512-du0dzi6y97Po5vDNdPJTyyijHCpaS22JLRnKZEJXBDaO9gCIymOv/5QQokFRuOlQm0bWl3i9PF4OVdGP6uAOQA=="; + }; + "@typescript/native-preview-win32-arm64@7.0.0-dev.20260707.2" = fetchurl { + url = "https://registry.npmjs.org/@typescript/native-preview-win32-arm64/-/native-preview-win32-arm64-7.0.0-dev.20260707.2.tgz"; + hash = "sha512-SsAwfhyHJ1akgBc+99z4+hwdbHsdWaKB8EwCNIMA6JfSLMeUjffrYvxu+vfMyxVtOVOz7RrRXRoiDiu4a2sCtg=="; + }; + "@typescript/native-preview-win32-x64@7.0.0-dev.20260707.2" = fetchurl { + url = "https://registry.npmjs.org/@typescript/native-preview-win32-x64/-/native-preview-win32-x64-7.0.0-dev.20260707.2.tgz"; + hash = "sha512-DL4u27stv0fo71sVhOzHSwE+YMZsbBijVI+kg5dLDLilSH79WFTJ8RSQ46vJrCMt+Gjlv/JOZP1PuLJDfioYeQ=="; + }; + "@typescript/native-preview@7.0.0-dev.20260707.2" = fetchurl { + url = "https://registry.npmjs.org/@typescript/native-preview/-/native-preview-7.0.0-dev.20260707.2.tgz"; + hash = "sha512-oUGp+Rep/hqMhPunyinsALUwSlzHINSxitifPiSaeqoKOKD2OlR9NE3TaPqwsl4NlGslsOSUXI1JotWQzpYCPg=="; + }; + "@typescript/typescript-aix-ppc64@7.0.2" = fetchurl { + url = "https://registry.npmjs.org/@typescript/typescript-aix-ppc64/-/typescript-aix-ppc64-7.0.2.tgz"; + hash = "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ=="; + }; + "@typescript/typescript-darwin-arm64@7.0.2" = fetchurl { + url = "https://registry.npmjs.org/@typescript/typescript-darwin-arm64/-/typescript-darwin-arm64-7.0.2.tgz"; + hash = "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA=="; + }; + "@typescript/typescript-darwin-x64@7.0.2" = fetchurl { + url = "https://registry.npmjs.org/@typescript/typescript-darwin-x64/-/typescript-darwin-x64-7.0.2.tgz"; + hash = "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA=="; + }; + "@typescript/typescript-freebsd-arm64@7.0.2" = fetchurl { + url = "https://registry.npmjs.org/@typescript/typescript-freebsd-arm64/-/typescript-freebsd-arm64-7.0.2.tgz"; + hash = "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ=="; + }; + "@typescript/typescript-freebsd-x64@7.0.2" = fetchurl { + url = "https://registry.npmjs.org/@typescript/typescript-freebsd-x64/-/typescript-freebsd-x64-7.0.2.tgz"; + hash = "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw=="; + }; + "@typescript/typescript-linux-arm64@7.0.2" = fetchurl { + url = "https://registry.npmjs.org/@typescript/typescript-linux-arm64/-/typescript-linux-arm64-7.0.2.tgz"; + hash = "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ=="; + }; + "@typescript/typescript-linux-arm@7.0.2" = fetchurl { + url = "https://registry.npmjs.org/@typescript/typescript-linux-arm/-/typescript-linux-arm-7.0.2.tgz"; + hash = "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ=="; + }; + "@typescript/typescript-linux-loong64@7.0.2" = fetchurl { + url = "https://registry.npmjs.org/@typescript/typescript-linux-loong64/-/typescript-linux-loong64-7.0.2.tgz"; + hash = "sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ=="; + }; + "@typescript/typescript-linux-mips64el@7.0.2" = fetchurl { + url = "https://registry.npmjs.org/@typescript/typescript-linux-mips64el/-/typescript-linux-mips64el-7.0.2.tgz"; + hash = "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA=="; + }; + "@typescript/typescript-linux-ppc64@7.0.2" = fetchurl { + url = "https://registry.npmjs.org/@typescript/typescript-linux-ppc64/-/typescript-linux-ppc64-7.0.2.tgz"; + hash = "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA=="; + }; + "@typescript/typescript-linux-riscv64@7.0.2" = fetchurl { + url = "https://registry.npmjs.org/@typescript/typescript-linux-riscv64/-/typescript-linux-riscv64-7.0.2.tgz"; + hash = "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ=="; + }; + "@typescript/typescript-linux-s390x@7.0.2" = fetchurl { + url = "https://registry.npmjs.org/@typescript/typescript-linux-s390x/-/typescript-linux-s390x-7.0.2.tgz"; + hash = "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw=="; + }; + "@typescript/typescript-linux-x64@7.0.2" = fetchurl { + url = "https://registry.npmjs.org/@typescript/typescript-linux-x64/-/typescript-linux-x64-7.0.2.tgz"; + hash = "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A=="; + }; + "@typescript/typescript-netbsd-arm64@7.0.2" = fetchurl { + url = "https://registry.npmjs.org/@typescript/typescript-netbsd-arm64/-/typescript-netbsd-arm64-7.0.2.tgz"; + hash = "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA=="; + }; + "@typescript/typescript-netbsd-x64@7.0.2" = fetchurl { + url = "https://registry.npmjs.org/@typescript/typescript-netbsd-x64/-/typescript-netbsd-x64-7.0.2.tgz"; + hash = "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA=="; + }; + "@typescript/typescript-openbsd-arm64@7.0.2" = fetchurl { + url = "https://registry.npmjs.org/@typescript/typescript-openbsd-arm64/-/typescript-openbsd-arm64-7.0.2.tgz"; + hash = "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ=="; + }; + "@typescript/typescript-openbsd-x64@7.0.2" = fetchurl { + url = "https://registry.npmjs.org/@typescript/typescript-openbsd-x64/-/typescript-openbsd-x64-7.0.2.tgz"; + hash = "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg=="; + }; + "@typescript/typescript-sunos-x64@7.0.2" = fetchurl { + url = "https://registry.npmjs.org/@typescript/typescript-sunos-x64/-/typescript-sunos-x64-7.0.2.tgz"; + hash = "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g=="; + }; + "@typescript/typescript-win32-arm64@7.0.2" = fetchurl { + url = "https://registry.npmjs.org/@typescript/typescript-win32-arm64/-/typescript-win32-arm64-7.0.2.tgz"; + hash = "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ=="; + }; + "@typescript/typescript-win32-x64@7.0.2" = fetchurl { + url = "https://registry.npmjs.org/@typescript/typescript-win32-x64/-/typescript-win32-x64-7.0.2.tgz"; + hash = "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g=="; + }; + "@typescript/vfs@1.6.1" = fetchurl { + url = "https://registry.npmjs.org/@typescript/vfs/-/vfs-1.6.1.tgz"; + hash = "sha512-JwoxboBh7Oz1v38tPbkrZ62ZXNHAk9bJ7c9x0eI5zBfBnBYGhURdbnh7Z4smN/MV48Y5OCcZb58n972UtbazsA=="; + }; + "@typescript/vfs@1.6.4" = fetchurl { + url = "https://registry.npmjs.org/@typescript/vfs/-/vfs-1.6.4.tgz"; + hash = "sha512-PJFXFS4ZJKiJ9Qiuix6Dz/OwEIqHD7Dme1UwZhTK11vR+5dqW2ACbdndWQexBzCx+CPuMe5WBYQWCsFyGlQLlQ=="; + }; + "adm-zip@0.5.18" = fetchurl { + url = "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.18.tgz"; + hash = "sha512-ufJnssQGbxzLNS1Ho9bCtX4rQKCCvoVuDLHoJyc3F9dOGDB4BkWs2Ci0kv53lqocAEQ/Cbi+I2XCsNYGqVYqng=="; + }; + "ansi-regex@5.0.1" = fetchurl { + url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz"; + hash = "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="; + }; + "ansi-regex@6.2.2" = fetchurl { + url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz"; + hash = "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="; + }; + "ansi-styles@4.3.0" = fetchurl { + url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"; + hash = "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="; + }; + "ansi-styles@6.2.3" = fetchurl { + url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz"; + hash = "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="; + }; + "argparse@2.0.1" = fetchurl { + url = "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz"; + hash = "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="; + }; + "arkregex@0.0.8" = fetchurl { + url = "https://registry.npmjs.org/arkregex/-/arkregex-0.0.8.tgz"; + hash = "sha512-PJcx6G1kQTgLKPUbeYlYecDRaKq15AMSGVajlKFYWlPeJRQL+j3dKE6tyMs40HZ99djS1l9Vhl3ezAHy9JBIqQ=="; + }; + "arktype@2.2.3" = fetchurl { + url = "https://registry.npmjs.org/arktype/-/arktype-2.2.3.tgz"; + hash = "sha512-7W+0RLTUNJiBFIIZXwOQxSR8Z273IAd6IvqBeG9+gHnQKFsIx2C0iOtGTmMrPnlX4qLXyc5+ll7A0BIj9WrbTg=="; + }; + "babel-plugin-jsx-dom-expressions@0.40.7" = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.40.7.tgz"; + hash = "sha512-/O6JWUmjv03OI9lL2ry9bUjpD5S3PclM55RRJEyCdcFZ5W2SEA/59d+l2hNsk3gI6kiWRdRPdOtqZmsQzFN1pQ=="; + }; + "babel-preset-solid@1.9.12" = fetchurl { + url = "https://registry.npmjs.org/babel-preset-solid/-/babel-preset-solid-1.9.12.tgz"; + hash = "sha512-LLqnuKVDlKpyBlMPcH6qEvs/wmS9a+NczppxJ3ryS/c0O5IiSFOIBQi9GzyiGDSbcJpx4Gr87jyFTos1MyEuWg=="; + }; + "balanced-match@4.0.4" = fetchurl { + url = "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz"; + hash = "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="; + }; + "baseline-browser-mapping@2.11.13" = fetchurl { + url = "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.13.tgz"; + hash = "sha512-k9HNuUVMlqVjQ9UHzfPjIqiDbWw7WqT1AoT7GL8VwvF3r0ZfArtgiSPAlmupyNquNgOJHTuH4CKYf8ttMTWBTQ=="; + }; + "before-after-hook@4.0.0" = fetchurl { + url = "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz"; + hash = "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ=="; + }; + "boolean@3.2.0" = fetchurl { + url = "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz"; + hash = "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw=="; + }; + "brace-expansion@5.0.9" = fetchurl { + url = "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz"; + hash = "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg=="; + }; + "browserslist@4.28.8" = fetchurl { + url = "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz"; + hash = "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA=="; + }; + "bun-types@1.3.14" = fetchurl { + url = "https://registry.npmjs.org/bun-types/-/bun-types-1.3.14.tgz"; + hash = "sha512-4N0ig0fEomHt5R0KCFWjovxow98rIoRwKolrYdCcknNwMekCXRnWEUvgu5soYV8QXtVsrUD8B95MBOZGPvr6KQ=="; + }; + "caniuse-lite@1.0.30001809" = fetchurl { + url = "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz"; + hash = "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ=="; + }; + "chalk@4.1.2" = fetchurl { + url = "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz"; + hash = "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="; + }; + "chardet@2.2.0" = fetchurl { + url = "https://registry.npmjs.org/chardet/-/chardet-2.2.0.tgz"; + hash = "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA=="; + }; + "chart.js@4.5.1" = fetchurl { + url = "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz"; + hash = "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw=="; + }; + "chownr@2.0.0" = fetchurl { + url = "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz"; + hash = "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="; + }; + "chownr@3.0.0" = fetchurl { + url = "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz"; + hash = "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="; + }; + "chromium-bidi@16.0.1" = fetchurl { + url = "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-16.0.1.tgz"; + hash = "sha512-J63PGu/9PpeCwLIcKYyzWP6yaVL5pxuBc0shlYCYM8BaAkmlwiQboXO1iNbOgSDbVklEyYFfNEcHD8oOAWacUA=="; + }; + "cli-progress@3.12.0" = fetchurl { + url = "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz"; + hash = "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A=="; + }; + "cli-width@4.1.0" = fetchurl { + url = "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz"; + hash = "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ=="; + }; + "clipanion@4.0.0-rc.4" = fetchurl { + url = "https://registry.npmjs.org/clipanion/-/clipanion-4.0.0-rc.4.tgz"; + hash = "sha512-CXkMQxU6s9GklO/1f714dkKBMu1lopS1WFF0B8o4AxPykR1hpozxSiUZ5ZUeBjfPgCWqbcNOtZVFhB8Lkfp1+Q=="; + }; + "cliui@7.0.4" = fetchurl { + url = "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz"; + hash = "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ=="; + }; + "cliui@9.0.1" = fetchurl { + url = "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz"; + hash = "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w=="; + }; + "clsx@2.1.1" = fetchurl { + url = "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz"; + hash = "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="; + }; + "code-block-writer@13.0.3" = fetchurl { + url = "https://registry.npmjs.org/code-block-writer/-/code-block-writer-13.0.3.tgz"; + hash = "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg=="; + }; + "color-convert@2.0.1" = fetchurl { + url = "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"; + hash = "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="; + }; + "color-name@1.1.4" = fetchurl { + url = "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"; + hash = "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="; + }; + "colorette@2.0.20" = fetchurl { + url = "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz"; + hash = "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="; + }; + "content-type@2.0.0" = fetchurl { + url = "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz"; + hash = "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ=="; + }; + "convert-source-map@2.0.0" = fetchurl { + url = "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz"; + hash = "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="; + }; + "csstype@3.2.3" = fetchurl { + url = "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz"; + hash = "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="; + }; + "d3-array@3.2.4" = fetchurl { + url = "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz"; + hash = "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="; + }; + "d3-color@3.1.0" = fetchurl { + url = "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz"; + hash = "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="; + }; + "d3-format@3.1.2" = fetchurl { + url = "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz"; + hash = "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg=="; + }; + "d3-interpolate@3.0.1" = fetchurl { + url = "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz"; + hash = "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="; + }; + "d3-path@3.1.0" = fetchurl { + url = "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz"; + hash = "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="; + }; + "d3-scale@4.0.2" = fetchurl { + url = "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz"; + hash = "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ=="; + }; + "d3-shape@3.2.0" = fetchurl { + url = "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz"; + hash = "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA=="; + }; + "d3-time-format@4.1.0" = fetchurl { + url = "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz"; + hash = "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg=="; + }; + "d3-time@3.1.0" = fetchurl { + url = "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz"; + hash = "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q=="; + }; + "debug@4.4.3" = fetchurl { + url = "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz"; + hash = "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="; + }; + "define-data-property@1.1.4" = fetchurl { + url = "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz"; + hash = "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="; + }; + "define-properties@1.2.1" = fetchurl { + url = "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz"; + hash = "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="; + }; + "detect-libc@2.1.2" = fetchurl { + url = "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz"; + hash = "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="; + }; + "detect-node@2.1.0" = fetchurl { + url = "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz"; + hash = "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="; + }; + "devtools-protocol@0.0.1638949" = fetchurl { + url = "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1638949.tgz"; + hash = "sha512-mXwg4Fqnv0WR4iuAT/gYUmctNkjILwXFHyZ+m7Ty1dfr0ezZt2U3gnrrJTfRobJTHoXf+IbuFvFITzLrLFjwJA=="; + }; + "diff@9.0.0" = fetchurl { + url = "https://registry.npmjs.org/diff/-/diff-9.0.0.tgz"; + hash = "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="; + }; + "electron-to-chromium@1.5.402" = fetchurl { + url = "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.402.tgz"; + hash = "sha512-/oOpMaPT6Yg+6/1XQhyIPlzgj7Ye9zf+nNM2Uh6OcE2G2oNptWazFa+qB2Pdqqbsc9KnIDzgAntoYN0dbwOXwA=="; + }; + "emnapi@1.11.3" = fetchurl { + url = "https://registry.npmjs.org/emnapi/-/emnapi-1.11.3.tgz"; + hash = "sha512-+/ZS90YK/rYfVOHtGLHkGffVsnmD/MAKaBHio+Y4XAtg75RLr4cveV/w0jTkUdLM1CcAlaRgG76mpIemWAlk0A=="; + }; + "emoji-regex@10.6.0" = fetchurl { + url = "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz"; + hash = "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="; + }; + "emoji-regex@8.0.0" = fetchurl { + url = "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz"; + hash = "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="; + }; + "enhanced-resolve@5.24.5" = fetchurl { + url = "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz"; + hash = "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A=="; + }; + "entities@6.0.1" = fetchurl { + url = "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz"; + hash = "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="; + }; + "es-define-property@1.0.1" = fetchurl { + url = "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz"; + hash = "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="; + }; + "es-errors@1.3.0" = fetchurl { + url = "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz"; + hash = "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="; + }; + "es-toolkit@1.50.0" = fetchurl { + url = "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.50.0.tgz"; + hash = "sha512-OyZKhUVvEep9ITEiwHn8GKnMRQIVqoSIX7WnRbkWgJkllCujilqP2rD0u979tkl8wqyc8ICwlc1UBVv/Sl1G6w=="; + }; + "es6-error@4.1.1" = fetchurl { + url = "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz"; + hash = "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg=="; + }; + "escalade@3.2.0" = fetchurl { + url = "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz"; + hash = "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="; + }; + "escape-string-regexp@4.0.0" = fetchurl { + url = "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"; + hash = "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="; + }; + "exit@0.1.2" = fetchurl { + url = "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz"; + hash = "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ=="; + }; + "fast-string-truncated-width@3.0.3" = fetchurl { + url = "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz"; + hash = "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g=="; + }; + "fast-string-width@3.0.2" = fetchurl { + url = "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz"; + hash = "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg=="; + }; + "fast-wrap-ansi@0.2.2" = fetchurl { + url = "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz"; + hash = "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q=="; + }; + "fastembed@2.1.0" = fetchurl { + url = "https://registry.npmjs.org/fastembed/-/fastembed-2.1.0.tgz"; + hash = "sha512-oQkpcRHBppJ3+a3w9dU0uytSY0N1cnEa/iVMc8AXEd+tvT529GekOEFhNviJy89R3lvQXF6cdIMTXHj1Gi00xQ=="; + }; + "fdir@6.5.0" = fetchurl { + url = "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz"; + hash = "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="; + }; + "flatbuffers@25.9.23" = fetchurl { + url = "https://registry.npmjs.org/flatbuffers/-/flatbuffers-25.9.23.tgz"; + hash = "sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ=="; + }; + "framer-motion@12.43.0" = fetchurl { + url = "https://registry.npmjs.org/framer-motion/-/framer-motion-12.43.0.tgz"; + hash = "sha512-1eaL3RvR/kAlbG7UYcpMptEyzPoENO0c6w7ZnB3/hh2vSAz/6uGAFn6fdoqTBguNstf3MsFhJHsD/0DHiclG+g=="; + }; + "fs-minipass@2.1.0" = fetchurl { + url = "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz"; + hash = "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="; + }; + "fsevents@2.3.3" = fetchurl { + url = "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz"; + hash = "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="; + }; + "gearhash-jit@1.0.2" = fetchurl { + url = "https://registry.npmjs.org/gearhash-jit/-/gearhash-jit-1.0.2.tgz"; + hash = "sha512-UhzJL4KXSdqAKepy/tZwmi2Rcy0YMmtiC4DQS4SURCuIWdh8ECZtnXK2ePRMLigfB61hRKdLK/Vgg2bSw73izQ=="; + }; + "gensync@1.0.0-beta.2" = fetchurl { + url = "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz"; + hash = "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="; + }; + "get-caller-file@2.0.5" = fetchurl { + url = "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz"; + hash = "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="; + }; + "get-east-asian-width@1.6.0" = fetchurl { + url = "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz"; + hash = "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="; + }; + "ghostty-web@0.4.0" = fetchurl { + url = "https://registry.npmjs.org/ghostty-web/-/ghostty-web-0.4.0.tgz"; + hash = "sha512-0puDBik2qapbD/QQBW9o5ZHfXnZBqZWx/ctBiVtKZ6ZLds4NYb+wZuw1cRLXZk9zYovIQ908z3rvFhexAvc5Hg=="; + }; + "global-agent@3.0.0" = fetchurl { + url = "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz"; + hash = "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q=="; + }; + "global-agent@4.1.3" = fetchurl { + url = "https://registry.npmjs.org/global-agent/-/global-agent-4.1.3.tgz"; + hash = "sha512-KUJEViiuFT3I97t+GYMikLPJS2Lfo/S2F+DQuBWzuzaMPnvt5yyZePzArx36fBzpGTxZjIpDbXLeySLgh+k76g=="; + }; + "globalthis@1.0.4" = fetchurl { + url = "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz"; + hash = "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="; + }; + "gopd@1.2.0" = fetchurl { + url = "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz"; + hash = "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="; + }; + "graceful-fs@4.2.11" = fetchurl { + url = "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz"; + hash = "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="; + }; + "guid-typescript@1.0.9" = fetchurl { + url = "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz"; + hash = "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ=="; + }; + "has-flag@4.0.0" = fetchurl { + url = "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"; + hash = "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="; + }; + "has-property-descriptors@1.0.2" = fetchurl { + url = "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz"; + hash = "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="; + }; + "html-entities@2.3.3" = fetchurl { + url = "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz"; + hash = "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA=="; + }; + "iconv-lite@0.7.3" = fetchurl { + url = "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz"; + hash = "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ=="; + }; + "inherits@2.0.4" = fetchurl { + url = "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"; + hash = "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="; + }; + "internmap@2.0.3" = fetchurl { + url = "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz"; + hash = "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="; + }; + "is-fullwidth-code-point@3.0.0" = fetchurl { + url = "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz"; + hash = "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="; + }; + "is-what@4.1.16" = fetchurl { + url = "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz"; + hash = "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A=="; + }; + "jiti@2.7.0" = fetchurl { + url = "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz"; + hash = "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="; + }; + "js-tokens@4.0.0" = fetchurl { + url = "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"; + hash = "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="; + }; + "js-yaml@4.3.1" = fetchurl { + url = "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz"; + hash = "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ=="; + }; + "jsesc@3.1.0" = fetchurl { + url = "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz"; + hash = "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="; + }; + "json-stringify-safe@5.0.1" = fetchurl { + url = "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz"; + hash = "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="; + }; + "json-with-bigint@3.5.10" = fetchurl { + url = "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.10.tgz"; + hash = "sha512-Vcx+JVNEBts/xfcoCS69sKrOhOk/3TVlvlT+XzUOefVKnnrbYSCKpDCm10pohsJFtsJVYnwa/cXRZ4eElzaM6w=="; + }; + "json5@2.2.3" = fetchurl { + url = "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz"; + hash = "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="; + }; + "jsonparse@1.3.1" = fetchurl { + url = "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz"; + hash = "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg=="; + }; + "jsonstream-next@3.0.0" = fetchurl { + url = "https://registry.npmjs.org/jsonstream-next/-/jsonstream-next-3.0.0.tgz"; + hash = "sha512-aAi6oPhdt7BKyQn1SrIIGZBt0ukKuOUE1qV6kJ3GgioSOYzsRc8z9Hfr1BVmacA/jLe9nARfmgMGgn68BqIAgg=="; + }; + "lightningcss-android-arm64@1.32.0" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz"; + hash = "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="; + }; + "lightningcss-android-arm64@1.33.0" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz"; + hash = "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg=="; + }; + "lightningcss-darwin-arm64@1.32.0" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz"; + hash = "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="; + }; + "lightningcss-darwin-arm64@1.33.0" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz"; + hash = "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg=="; + }; + "lightningcss-darwin-x64@1.32.0" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz"; + hash = "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="; + }; + "lightningcss-darwin-x64@1.33.0" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz"; + hash = "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ=="; + }; + "lightningcss-freebsd-x64@1.32.0" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz"; + hash = "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="; + }; + "lightningcss-freebsd-x64@1.33.0" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz"; + hash = "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg=="; + }; + "lightningcss-linux-arm-gnueabihf@1.32.0" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz"; + hash = "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="; + }; + "lightningcss-linux-arm-gnueabihf@1.33.0" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz"; + hash = "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ=="; + }; + "lightningcss-linux-arm64-gnu@1.32.0" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz"; + hash = "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="; + }; + "lightningcss-linux-arm64-gnu@1.33.0" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz"; + hash = "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg=="; + }; + "lightningcss-linux-arm64-musl@1.32.0" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz"; + hash = "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="; + }; + "lightningcss-linux-arm64-musl@1.33.0" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz"; + hash = "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ=="; + }; + "lightningcss-linux-x64-gnu@1.32.0" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz"; + hash = "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="; + }; + "lightningcss-linux-x64-gnu@1.33.0" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz"; + hash = "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg=="; + }; + "lightningcss-linux-x64-musl@1.32.0" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz"; + hash = "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="; + }; + "lightningcss-linux-x64-musl@1.33.0" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz"; + hash = "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw=="; + }; + "lightningcss-win32-arm64-msvc@1.32.0" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz"; + hash = "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="; + }; + "lightningcss-win32-arm64-msvc@1.33.0" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz"; + hash = "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA=="; + }; + "lightningcss-win32-x64-msvc@1.32.0" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz"; + hash = "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="; + }; + "lightningcss-win32-x64-msvc@1.33.0" = fetchurl { + url = "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz"; + hash = "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA=="; + }; + "lightningcss@1.32.0" = fetchurl { + url = "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz"; + hash = "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="; + }; + "lightningcss@1.33.0" = fetchurl { + url = "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz"; + hash = "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA=="; + }; + "lint-staged@17.3.0" = fetchurl { + url = "https://registry.npmjs.org/lint-staged/-/lint-staged-17.3.0.tgz"; + hash = "sha512-woZS3vNe3UKqBaLPvbLOtKRY4tLANpWQhom12MGWqC8Mh1lCOO+WgSwmX2amjJAqTY9BkXYW87fCUH5H9Ph6xw=="; + }; + "long@5.3.2" = fetchurl { + url = "https://registry.npmjs.org/long/-/long-5.3.2.tgz"; + hash = "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="; + }; + "lru-cache@5.1.1" = fetchurl { + url = "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz"; + hash = "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="; + }; + "lucide-react@1.30.0" = fetchurl { + url = "https://registry.npmjs.org/lucide-react/-/lucide-react-1.30.0.tgz"; + hash = "sha512-tUIr2jXLbWpCkdtH8XP7P7YppM9ueWgTky99lpWDY6z5REs6B+O6ZQ3U5tHkUUY59ANyOv/PBcs8E4Fe3KO3eA=="; + }; + "magic-string@0.30.21" = fetchurl { + url = "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz"; + hash = "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="; + }; + "make-synchronized@0.8.0" = fetchurl { + url = "https://registry.npmjs.org/make-synchronized/-/make-synchronized-0.8.0.tgz"; + hash = "sha512-DZu4lwc0ffoFz581BSQa/BJl+1ZqIkoRQ+VejMlH0VrP4E86StAODnZujZ4sepumQj8rcP7wUnUBGM8Gu+zKUA=="; + }; + "matcher@3.0.0" = fetchurl { + url = "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz"; + hash = "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng=="; + }; + "matcher@4.0.0" = fetchurl { + url = "https://registry.npmjs.org/matcher/-/matcher-4.0.0.tgz"; + hash = "sha512-S6x5wmcDmsDRRU/c2dkccDwQPXoFczc5+HpQ2lON8pnvHlnvHAHj5WlLVvw6n6vNyHuVugYrFohYxbS+pvFpKQ=="; + }; + "merge-anything@5.1.7" = fetchurl { + url = "https://registry.npmjs.org/merge-anything/-/merge-anything-5.1.7.tgz"; + hash = "sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ=="; + }; + "minimatch@10.2.6" = fetchurl { + url = "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz"; + hash = "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A=="; + }; + "minipass@3.3.6" = fetchurl { + url = "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz"; + hash = "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="; + }; + "minipass@5.0.0" = fetchurl { + url = "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz"; + hash = "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="; + }; + "minipass@7.1.3" = fetchurl { + url = "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz"; + hash = "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="; + }; + "minizlib@2.1.2" = fetchurl { + url = "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz"; + hash = "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="; + }; + "minizlib@3.1.0" = fetchurl { + url = "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz"; + hash = "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="; + }; + "mitt@3.0.1" = fetchurl { + url = "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz"; + hash = "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="; + }; + "mkdirp@1.0.4" = fetchurl { + url = "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz"; + hash = "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="; + }; + "modern-tar@0.7.7" = fetchurl { + url = "https://registry.npmjs.org/modern-tar/-/modern-tar-0.7.7.tgz"; + hash = "sha512-t9VmxaqrmANnEOBhpSDI6HD192Ge48k8vmWqQQL7hSFEqHEYwZbbsu49+aKLWZeRvFs3j1pMhXOqqF4kPlvjkQ=="; + }; + "motion-dom@12.43.0" = fetchurl { + url = "https://registry.npmjs.org/motion-dom/-/motion-dom-12.43.0.tgz"; + hash = "sha512-azKON4d9S65PEoFUiQTMTgPheEmzf2QngdRc50AKfJp9Q9mmcBVw22c8eMq9k8kxOFHdL7+WZY7N/5F/lwiDag=="; + }; + "motion-utils@12.39.0" = fetchurl { + url = "https://registry.npmjs.org/motion-utils/-/motion-utils-12.39.0.tgz"; + hash = "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ=="; + }; + "motion@12.43.0" = fetchurl { + url = "https://registry.npmjs.org/motion/-/motion-12.43.0.tgz"; + hash = "sha512-BQgQbSa9Hn3/mtbib0MK53y6JSANa+YKUKlaYnWzAVDH424RYQ5LVpV3pNiWH00BA2z4ojsSdMzqT7g2FQwjuQ=="; + }; + "ms@2.1.3" = fetchurl { + url = "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"; + hash = "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="; + }; + "mupdf@1.28.0" = fetchurl { + url = "https://registry.npmjs.org/mupdf/-/mupdf-1.28.0.tgz"; + hash = "sha512-ACUnbpECaQ5JLq04pwd89lS+0IGMest5qL5tb08g9TAR7bDtfqflHEkb2Xm3o4rvC/szguLiV+WEbW9kstj8Sg=="; + }; + "mute-stream@3.0.0" = fetchurl { + url = "https://registry.npmjs.org/mute-stream/-/mute-stream-3.0.0.tgz"; + hash = "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw=="; + }; + "nanoid@3.3.18" = fetchurl { + url = "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz"; + hash = "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w=="; + }; + "node-releases@2.0.53" = fetchurl { + url = "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz"; + hash = "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ=="; + }; + "object-keys@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz"; + hash = "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="; + }; + "obug@2.1.4" = fetchurl { + url = "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz"; + hash = "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA=="; + }; + "onnxruntime-common@1.21.0" = fetchurl { + url = "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.21.0.tgz"; + hash = "sha512-Q632iLLrtCAVOTO65dh2+mNbQir/QNTVBG3h/QdZBpns7mZ0RYbLRBgGABPbpU9351AgYy7SJf1WaeVwMrBFPQ=="; + }; + "onnxruntime-common@1.24.0-dev.20251116-b39e144322" = fetchurl { + url = "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.24.0-dev.20251116-b39e144322.tgz"; + hash = "sha512-BOoomdHYmNRL5r4iQ4bMvsl2t0/hzVQ3OM3PHD0gxeXu1PmggqBv3puZicEUVOA3AtHHYmqZtjMj9FOfGrATTw=="; + }; + "onnxruntime-common@1.24.3" = fetchurl { + url = "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.24.3.tgz"; + hash = "sha512-GeuPZO6U/LBJXvwdaqHbuUmoXiEdeCjWi/EG7Y1HNnDwJYuk6WUbNXpF6luSUY8yASul3cmUlLGrCCL1ZgVXqA=="; + }; + "onnxruntime-common@1.26.0" = fetchurl { + url = "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.26.0.tgz"; + hash = "sha512-qVyMR4lcWgbkc4getFV+GQijsTnbg/siteoqcDwa3sI/LxbrMSNw4ePyvCq/ymdQaRomCA7YuWmhzsswxvymdw=="; + }; + "onnxruntime-node@1.21.0" = fetchurl { + url = "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.21.0.tgz"; + hash = "sha512-NeaCX6WW2L8cRCSqy3bInlo5ojjQqu2fD3D+9W5qb5irwxhEyWKXeH2vZ8W9r6VxaMPUan+4/7NDwZMtouZxEw=="; + }; + "onnxruntime-node@1.24.3" = fetchurl { + url = "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.24.3.tgz"; + hash = "sha512-JH7+czbc8ALA819vlTgcV+Q214/+VjGeBHDjX81+ZCD0PCVCIFGFNtT0V4sXG/1JXypKPgScQcB3ij/hk3YnTg=="; + }; + "onnxruntime-node@1.26.0" = fetchurl { + url = "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.26.0.tgz"; + hash = "sha512-OHl6PiOEOqxaLHL0N9eFrbzS7IGmu3BtJNH3RTEnRAheCIkfc3gjcjl4sGcjp9C22ZC9YTquDOxSdT/stBQ6BQ=="; + }; + "onnxruntime-web@1.26.0-dev.20260416-b7804b056c" = fetchurl { + url = "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.26.0-dev.20260416-b7804b056c.tgz"; + hash = "sha512-MD6Ss4GSpQBo6zqoJzyT9LRbKYs7x/JVN23FT24EcEvlqF4VuzPOeH6X38orZPKHQDbprn7K+SBpu0/mj2CQiw=="; + }; + "p-limit@3.1.0" = fetchurl { + url = "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz"; + hash = "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="; + }; + "parse5@7.3.0" = fetchurl { + url = "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz"; + hash = "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="; + }; + "path-browserify@1.0.1" = fetchurl { + url = "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz"; + hash = "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="; + }; + "picocolors@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz"; + hash = "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="; + }; + "picomatch@4.0.5" = fetchurl { + url = "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz"; + hash = "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A=="; + }; + "platform@1.3.6" = fetchurl { + url = "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz"; + hash = "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg=="; + }; + "postcss@8.5.26" = fetchurl { + url = "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz"; + hash = "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ=="; + }; + "prettier@3.6.2" = fetchurl { + url = "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz"; + hash = "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ=="; + }; + "prettier@3.9.6" = fetchurl { + url = "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz"; + hash = "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g=="; + }; + "progress@2.0.3" = fetchurl { + url = "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz"; + hash = "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="; + }; + "protobufjs@7.6.5" = fetchurl { + url = "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.5.tgz"; + hash = "sha512-/FPD0nUc9jH6rfFjji9IBqOz4pcSE3CsT1m7Ep6Mdb0LxSUMj8hgl6GomOvZzpNpAqqGaXA0P3VSrZLFzIhQrw=="; + }; + "puppeteer-core@25.3.0" = fetchurl { + url = "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-25.3.0.tgz"; + hash = "sha512-fm+wpUr2oigH1PXZvwgATrM2tYWHMDG8ASzTEe9uukCye4X5Ldx1K5BTHPFKITrIWvQQAQ256d1NpbEveBcKjA=="; + }; + "react-chartjs-2@5.3.1" = fetchurl { + url = "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.3.1.tgz"; + hash = "sha512-h5IPXKg9EXpjoBzUfyWJvllMjG2mQ4EiuHQFhms/AjUm0XSZHhyRy2xVmLXHKrtcdrPO4mnGqRtYoD0vp95A0A=="; + }; + "react-dom@19.2.7" = fetchurl { + url = "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz"; + hash = "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ=="; + }; + "react-refresh@0.18.0" = fetchurl { + url = "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz"; + hash = "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw=="; + }; + "react@19.2.7" = fetchurl { + url = "https://registry.npmjs.org/react/-/react-19.2.7.tgz"; + hash = "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ=="; + }; + "readable-stream@3.6.2" = fetchurl { + url = "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz"; + hash = "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="; + }; + "regexp-tree@0.1.27" = fetchurl { + url = "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz"; + hash = "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA=="; + }; + "require-directory@2.1.1" = fetchurl { + url = "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz"; + hash = "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="; + }; + "roarr@2.15.4" = fetchurl { + url = "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz"; + hash = "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A=="; + }; + "robomp-web" = copyPathToStore ../python/robomp/web; + "rolldown@1.2.3" = fetchurl { + url = "https://registry.npmjs.org/rolldown/-/rolldown-1.2.3.tgz"; + hash = "sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A=="; + }; + "safe-buffer@5.2.1" = fetchurl { + url = "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"; + hash = "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="; + }; + "safer-buffer@2.1.2" = fetchurl { + url = "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"; + hash = "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="; + }; + "scheduler@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz"; + hash = "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="; + }; + "semver-compare@1.0.0" = fetchurl { + url = "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz"; + hash = "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow=="; + }; + "semver@6.3.1" = fetchurl { + url = "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"; + hash = "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="; + }; + "semver@7.8.5" = fetchurl { + url = "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz"; + hash = "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="; + }; + "serialize-error@7.0.1" = fetchurl { + url = "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz"; + hash = "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw=="; + }; + "serialize-error@8.1.0" = fetchurl { + url = "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz"; + hash = "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ=="; + }; + "seroval-plugins@1.5.6" = fetchurl { + url = "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.5.6.tgz"; + hash = "sha512-HXuLAX2pu/UByPpaeo/TaMfvMIi+1QqIoPJYCcAtU8QkVNwgR6MPlGuCQTErV1JwraaMbYaWVIBX7mppzGLATQ=="; + }; + "seroval@1.5.6" = fetchurl { + url = "https://registry.npmjs.org/seroval/-/seroval-1.5.6.tgz"; + hash = "sha512-rVQVWjjSvlINzaQPZH5JFqsqEsIWdTxY3iJZCnTL/5gQbXIRooVZKI60tVCkOVfzcRPejboxO2t0P89dg5mQaA=="; + }; + "sharp@0.34.5" = fetchurl { + url = "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz"; + hash = "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="; + }; + "sherpa-onnx-darwin-arm64@1.13.3" = fetchurl { + url = "https://registry.npmjs.org/sherpa-onnx-darwin-arm64/-/sherpa-onnx-darwin-arm64-1.13.3.tgz"; + hash = "sha512-9x86Cbf+BDFONdtCPM3cnjvtAW0ER8tMaHK5pVfz+SHPt8GeuwRXaiR/BzcByFBUyxCgmceO09/WMZOCi44P/g=="; + }; + "sherpa-onnx-darwin-x64@1.13.4" = fetchurl { + url = "https://registry.npmjs.org/sherpa-onnx-darwin-x64/-/sherpa-onnx-darwin-x64-1.13.4.tgz"; + hash = "sha512-6RGeis9K9gV/UQWOgd6Rf3iqXr2/YsBQswxHaCR4hrYkHfEIpHMfFmRWLt6nJJCOWgYW2xFxEd9yzjrafAV/Pw=="; + }; + "sherpa-onnx-linux-arm64@1.13.4" = fetchurl { + url = "https://registry.npmjs.org/sherpa-onnx-linux-arm64/-/sherpa-onnx-linux-arm64-1.13.4.tgz"; + hash = "sha512-RMjMRqT82BgTXypNNGmLe6ZFYhc3WEvnAGl3DdkK7qB/kuXwkL3iHhV31wAecbnWPsnEpUoD+8cFovWSBzsCuw=="; + }; + "sherpa-onnx-linux-x64@1.13.4" = fetchurl { + url = "https://registry.npmjs.org/sherpa-onnx-linux-x64/-/sherpa-onnx-linux-x64-1.13.4.tgz"; + hash = "sha512-WZh5NCkGPFHHpYSd78iN4OnmxQeSTGyt9uZskH+im/NFHQ7elQ7B0sLzCMeRpvJxiIKvd9C6WxIJ4hYaxClfsQ=="; + }; + "sherpa-onnx-node@1.13.2" = fetchurl { + url = "https://registry.npmjs.org/sherpa-onnx-node/-/sherpa-onnx-node-1.13.2.tgz"; + hash = "sha512-uIH6SA5Or4pb8HlCYWB3K54XkMtzdef4/tkw1amtIf8GB1tt6hQLpur9p2jSFNfTYRyzZ8XrXofxefXQ0A7EUA=="; + }; + "sherpa-onnx-win-ia32@1.13.4" = fetchurl { + url = "https://registry.npmjs.org/sherpa-onnx-win-ia32/-/sherpa-onnx-win-ia32-1.13.4.tgz"; + hash = "sha512-/JbPjldrfNv+t+uIS3MlkuhfIf5l3FHUGkRC2oRXgjRqOaVmEyP3vLlQ7dTa4J7raG5oB8c3GoPjuSWSqT9GOQ=="; + }; + "sherpa-onnx-win-x64@1.13.4" = fetchurl { + url = "https://registry.npmjs.org/sherpa-onnx-win-x64/-/sherpa-onnx-win-x64-1.13.4.tgz"; + hash = "sha512-R0PWby1VxC14TDZPq7GcfSyXSY6SAFO8Y4JwdCdqouFmeXkZ1L7Is9m98C9KxQ0dN7ZtDzhAmE/43FUs/elXRQ=="; + }; + "sherpa-onnx@1.13.2" = fetchurl { + url = "https://registry.npmjs.org/sherpa-onnx/-/sherpa-onnx-1.13.2.tgz"; + hash = "sha512-hheOLl4JlOzERco73u+1Q/LaNDdFChDe4r3+IlMYIO3wggBZrReHDSxWwRUIW+YLw3eLslyiXw/hfb75aOylEA=="; + }; + "signal-exit@4.1.0" = fetchurl { + url = "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz"; + hash = "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="; + }; + "solid-js@1.9.14" = fetchurl { + url = "https://registry.npmjs.org/solid-js/-/solid-js-1.9.14.tgz"; + hash = "sha512-sAEXC0Kk0S1EDg+8ysEWJDbYhA3RRoEjwuySUGlKIemeo0I5YZfOyumNjNs9Sv3y2nmhD+0rW66ag2HsMuQiGQ=="; + }; + "solid-refresh@0.6.3" = fetchurl { + url = "https://registry.npmjs.org/solid-refresh/-/solid-refresh-0.6.3.tgz"; + hash = "sha512-F3aPsX6hVw9ttm5LYlth8Q15x6MlI/J3Dn+o3EQyRTtTxidepSTwAYdozt01/YA+7ObcciagGEyXIopGZzQtbA=="; + }; + "source-map-js@1.2.1" = fetchurl { + url = "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz"; + hash = "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="; + }; + "split2@3.2.2" = fetchurl { + url = "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz"; + hash = "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg=="; + }; + "sprintf-js@1.1.3" = fetchurl { + url = "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz"; + hash = "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="; + }; + "string-argv@0.3.2" = fetchurl { + url = "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz"; + hash = "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q=="; + }; + "string-width@4.2.3" = fetchurl { + url = "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz"; + hash = "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="; + }; + "string-width@7.2.0" = fetchurl { + url = "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz"; + hash = "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="; + }; + "string-width@8.2.2" = fetchurl { + url = "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz"; + hash = "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg=="; + }; + "string_decoder@1.3.0" = fetchurl { + url = "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"; + hash = "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="; + }; + "strip-ansi@6.0.1" = fetchurl { + url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz"; + hash = "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="; + }; + "strip-ansi@7.2.0" = fetchurl { + url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz"; + hash = "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="; + }; + "supports-color@7.2.0" = fetchurl { + url = "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"; + hash = "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="; + }; + "tailwind-merge@3.6.0" = fetchurl { + url = "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz"; + hash = "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w=="; + }; + "tailwindcss@4.3.3" = fetchurl { + url = "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz"; + hash = "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ=="; + }; + "tapable@2.3.3" = fetchurl { + url = "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz"; + hash = "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="; + }; + "tar@6.2.1" = fetchurl { + url = "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz"; + hash = "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="; + }; + "tar@7.5.22" = fetchurl { + url = "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz"; + hash = "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA=="; + }; + "through2@4.0.2" = fetchurl { + url = "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz"; + hash = "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw=="; + }; + "tinyexec@1.3.0" = fetchurl { + url = "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz"; + hash = "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ=="; + }; + "tinyglobby@0.2.17" = fetchurl { + url = "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz"; + hash = "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="; + }; + "treeify@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz"; + hash = "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A=="; + }; + "ts-morph@28.0.0" = fetchurl { + url = "https://registry.npmjs.org/ts-morph/-/ts-morph-28.0.0.tgz"; + hash = "sha512-Wp3tnZ2bzwxyTZMtgWVzXDfm7lB1Drz+y9DmmYH/L702PQhPyVrp3pkou3yIz4qjS14GY9kcpmLiOOMvl8oG1g=="; + }; + "tslib@2.8.1" = fetchurl { + url = "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz"; + hash = "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="; + }; + "typanion@3.14.0" = fetchurl { + url = "https://registry.npmjs.org/typanion/-/typanion-3.14.0.tgz"; + hash = "sha512-ZW/lVMRabETuYCd9O9ZvMhAh8GslSqaUjxmK/JLPCh6l73CvLBiuXswj/+7LdnWOgYsQ130FqLzFz5aGT4I3Ug=="; + }; + "type-fest@0.13.1" = fetchurl { + url = "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz"; + hash = "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg=="; + }; + "type-fest@0.20.2" = fetchurl { + url = "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz"; + hash = "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="; + }; + "typed-query-selector@2.12.2" = fetchurl { + url = "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.2.tgz"; + hash = "sha512-EOPFbyIub4ngnEdqi2yOcNeDLaX/0jcE1JoAXQDDMIthap7FoN795lc/SHfIq2d416VufXpM8z/lD+WRm2gfOQ=="; + }; + "typescript@5.4.5" = fetchurl { + url = "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz"; + hash = "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ=="; + }; + "typescript@7.0.2" = fetchurl { + url = "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz"; + hash = "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA=="; + }; + "undici-types@8.3.0" = fetchurl { + url = "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz"; + hash = "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="; + }; + "universal-user-agent@7.0.3" = fetchurl { + url = "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz"; + hash = "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A=="; + }; + "update-browserslist-db@1.3.0" = fetchurl { + url = "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.0.tgz"; + hash = "sha512-x/M6q3w4Ybp91CNaS4S69UnliqR3BzRpOT6LWbksjth0S/+jhfaPJsWjt/TewpT8j9eLIojUf5jr29WextHroA=="; + }; + "util-deprecate@1.0.2" = fetchurl { + url = "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"; + hash = "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="; + }; + "vite-plugin-solid@2.11.14" = fetchurl { + url = "https://registry.npmjs.org/vite-plugin-solid/-/vite-plugin-solid-2.11.14.tgz"; + hash = "sha512-7ZVBt8rpoyqmlwin2kRIUveaHoF6/kulY7gsnD+qFh4nS29V4OPAnw+ojoAspXIjObiL9o1xh9a/nTuYHm02Rw=="; + }; + "vite@8.2.1" = fetchurl { + url = "https://registry.npmjs.org/vite/-/vite-8.2.1.tgz"; + hash = "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw=="; + }; + "vitefu@1.1.3" = fetchurl { + url = "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz"; + hash = "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="; + }; + "webdriver-bidi-protocol@0.4.2" = fetchurl { + url = "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.4.2.tgz"; + hash = "sha512-VSV+fzfChirL3e7jay2yUC7B4HQCGtEWEg/MSSQbK+qWbqeGlRLlXTzPpYr3XGUvbpDHumWZBJxgesg4N7dbtA=="; + }; + "wrap-ansi@7.0.0" = fetchurl { + url = "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz"; + hash = "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="; + }; + "wrap-ansi@9.0.2" = fetchurl { + url = "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz"; + hash = "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="; + }; + "ws@8.21.3" = fetchurl { + url = "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz"; + hash = "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw=="; + }; + "y18n@5.0.8" = fetchurl { + url = "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz"; + hash = "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="; + }; + "yallist@3.1.1" = fetchurl { + url = "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz"; + hash = "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="; + }; + "yallist@4.0.0" = fetchurl { + url = "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz"; + hash = "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="; + }; + "yallist@5.0.0" = fetchurl { + url = "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz"; + hash = "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="; + }; + "yaml@2.9.0" = fetchurl { + url = "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz"; + hash = "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="; + }; + "yargs-parser@20.2.9" = fetchurl { + url = "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz"; + hash = "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="; + }; + "yargs-parser@22.0.0" = fetchurl { + url = "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz"; + hash = "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="; + }; + "yargs@16.2.2" = fetchurl { + url = "https://registry.npmjs.org/yargs/-/yargs-16.2.2.tgz"; + hash = "sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w=="; + }; + "yargs@18.1.0" = fetchurl { + url = "https://registry.npmjs.org/yargs/-/yargs-18.1.0.tgz"; + hash = "sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg=="; + }; + "yocto-queue@0.1.0" = fetchurl { + url = "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz"; + hash = "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="; + }; + "zod@3.25.76" = fetchurl { + url = "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz"; + hash = "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="; + }; +} \ No newline at end of file diff --git a/nix/dev-shell.nix b/nix/dev-shell.nix new file mode 100644 index 000000000..fec011f05 --- /dev/null +++ b/nix/dev-shell.nix @@ -0,0 +1,70 @@ +{ + pkgs, + rustToolchain, +}: +let + inherit (pkgs) lib; + linuxLibraries = with pkgs; [ + libpulseaudio + pipewire + stdenv.cc.cc.lib + zlib + ]; +in +pkgs.mkShell ( + { + name = "omp-dev"; + + packages = + (with pkgs; [ + bun + bun2nix + rustToolchain + bazelisk + cargo-nextest + rustPlatform.bindgenHook + nixfmt + typescript-language-server + + python312 + python312Packages.pip + uv + basedpyright + + bash + cacert + curl + fd + git + git-lfs + imagemagick + openssh + ripgrep + sqlite + unzip + + cmake + ninja + pkg-config + zig + + cairo + giflib + libjpeg + libopus + librsvg + openssl + pango + pcre2 + zlib + ]) + ++ lib.optionals pkgs.stdenv.hostPlatform.isLinux linuxLibraries; + + CMAKE_POLICY_VERSION_MINIMUM = "3.5"; + PCRE2_SYS_STATIC = "1"; + RUST_SRC_PATH = "${rustToolchain}/lib/rustlib/src/rust/library"; + } + // lib.optionalAttrs pkgs.stdenv.hostPlatform.isLinux { + LD_LIBRARY_PATH = lib.makeLibraryPath linuxLibraries; + } +) diff --git a/nix/home-manager.nix b/nix/home-manager.nix new file mode 100644 index 000000000..f449522c6 --- /dev/null +++ b/nix/home-manager.nix @@ -0,0 +1,40 @@ +{ self }: +{ + config, + lib, + pkgs, + ... +}: +let + cfg = config.programs.omp; + yaml = pkgs.formats.yaml { }; +in +{ + options.programs.omp = { + enable = lib.mkEnableOption "OMP coding agent"; + + package = lib.mkOption { + type = lib.types.package; + default = self.packages.${pkgs.stdenv.hostPlatform.system}.default; + defaultText = lib.literalExpression "inputs.omp.packages.${pkgs.stdenv.hostPlatform.system}.default"; + description = "OMP package to install."; + }; + + settings = lib.mkOption { + type = lib.types.nullOr yaml.type; + default = null; + description = "Settings written declaratively to ~/.omp/agent/config.yml."; + example = { + theme.dark = "titanium"; + startup.quiet = true; + }; + }; + }; + + config = lib.mkIf cfg.enable { + home.packages = [ cfg.package ]; + home.file.".omp/agent/config.yml" = lib.mkIf (cfg.settings != null) { + source = yaml.generate "omp-config.yml" cfg.settings; + }; + }; +} diff --git a/nix/nixos-module.nix b/nix/nixos-module.nix new file mode 100644 index 000000000..bd30f3e5a --- /dev/null +++ b/nix/nixos-module.nix @@ -0,0 +1,26 @@ +{ self }: +{ + config, + lib, + pkgs, + ... +}: +let + cfg = config.programs.omp; +in +{ + options.programs.omp = { + enable = lib.mkEnableOption "OMP coding agent"; + + package = lib.mkOption { + type = lib.types.package; + default = self.packages.${pkgs.stdenv.hostPlatform.system}.default; + defaultText = lib.literalExpression "inputs.omp.packages.${pkgs.stdenv.hostPlatform.system}.default"; + description = "OMP package to install system-wide."; + }; + }; + + config = lib.mkIf cfg.enable { + environment.systemPackages = [ cfg.package ]; + }; +} diff --git a/nix/package.nix b/nix/package.nix new file mode 100644 index 000000000..79c8dfd4e --- /dev/null +++ b/nix/package.nix @@ -0,0 +1,213 @@ +{ + autoPatchelfHook ? null, + autoSignDarwinBinariesHook ? null, + bun, + bun2nix, + cmake, + lib, + libopus, + libpulseaudio ? null, + makeWrapper, + ninja, + openssl, + pcre2, + pipewire ? null, + pkg-config, + rustPlatform, + rustToolchain, + source, + stdenv, + stdenvNoCC, + unzip, + zig, + zlib, +}: +let + packageJson = lib.importJSON ../packages/coding-agent/package.json; + rootPackageJson = lib.importJSON ../package.json; + platform = + { + aarch64-darwin = { + addon = "pi_natives.darwin-arm64.node"; + nativeLibrary = "libpi_natives.dylib"; + }; + aarch64-linux = { + addon = "pi_natives.linux-arm64.node"; + nativeLibrary = "libpi_natives.so"; + }; + x86_64-darwin = { + addon = "pi_natives.darwin-x64-baseline.node"; + nativeLibrary = "libpi_natives.dylib"; + rustFlags = "-C target-cpu=x86-64-v2"; + }; + x86_64-linux = { + addon = "pi_natives.linux-x64-baseline.node"; + nativeLibrary = "libpi_natives.so"; + rustFlags = "-C target-cpu=x86-64-v2"; + }; + } + .${stdenv.hostPlatform.system} or (throw "Unsupported OMP platform: ${stdenv.hostPlatform.system}"); + patchedDependencies = lib.mapAttrs ( + _: patch: source + "/${patch}" + ) rootPackageJson.patchedDependencies; + patchOverrides = bun2nix.patchedDependenciesToOverrides { inherit patchedDependencies; }; + bunRuntimeTemplate = stdenvNoCC.mkDerivation { + pname = "omp-bun-runtime-template"; + inherit (bun) version; + src = bun.src; + + nativeBuildInputs = [ unzip ]; + dontUnpack = true; + dontFixup = true; + + installPhase = '' + runHook preInstall + unzip -q "$src" + install -Dm755 bun-*/bun "$out/libexec/bun" + runHook postInstall + ''; + }; + runtimeLibraries = [ + libopus + openssl + pcre2 + ] + ++ lib.optionals stdenv.hostPlatform.isLinux [ + libpulseaudio + pipewire + stdenv.cc.cc.lib + zlib + ]; +in +stdenv.mkDerivation ( + { + pname = "omp"; + inherit (packageJson) version; + src = source; + + cargoDeps = rustPlatform.importCargoLock { lockFile = ../Cargo.lock; }; + bunDeps = bun2nix.fetchBunDeps { + bunNix = ./bun.nix; + overrides = patchOverrides; + }; + + nativeBuildInputs = [ + bun + bun2nix.hook + cmake + makeWrapper + ninja + pkg-config + rustPlatform.bindgenHook + rustPlatform.cargoSetupHook + rustToolchain + zig + ] + ++ lib.optionals stdenv.hostPlatform.isLinux [ autoPatchelfHook ] + ++ lib.optionals stdenv.hostPlatform.isDarwin [ autoSignDarwinBinariesHook ]; + + buildInputs = [ + libopus + openssl + pcre2 + ] + ++ lib.optionals stdenv.hostPlatform.isLinux [ + libpulseaudio + pipewire + stdenv.cc.cc.lib + zlib + ]; + + strictDeps = true; + # Nix builders cannot reliably hardlink cache files into node_modules + # (and Darwin's clonefile backend also rejects store permissions). + bunInstallFlags = [ + "--linker=isolated" + "--backend=copyfile" + ]; + dontConfigure = true; + dontRunLifecycleScripts = true; + dontUseBunBuild = true; + dontUseBunCheck = true; + dontUseBunInstall = true; + dontStrip = true; + + env = { + CMAKE_POLICY_VERSION_MINIMUM = "3.5"; + PCRE2_SYS_STATIC = "1"; + SOURCE_DATE_EPOCH = "1"; + } + // lib.optionalAttrs (platform ? rustFlags) { RUSTFLAGS = platform.rustFlags; } + // lib.optionalAttrs stdenv.hostPlatform.isDarwin { BUN_NO_CODESIGN_MACHO_BINARY = "1"; }; + + buildPhase = '' + runHook preBuild + + echo "Building pi-natives" + cargo build --release -p pi-natives ${lib.optionalString stdenv.hostPlatform.isLinux "--features wayland-pipewire"} + install -Dm755 "target/release/${platform.nativeLibrary}" \ + "packages/natives/native/${platform.addon}" + ${lib.optionalString stdenv.hostPlatform.isLinux '' + # The loader extracts this archived addon at runtime, so fix its + # interpreter-independent Nix RPATH before Bun embeds it. + autoPatchelf -- "packages/natives/native/${platform.addon}" + ''} + ${lib.optionalString stdenv.hostPlatform.isDarwin '' + # arm64 Darwin requires even locally-built Mach-O addons to carry an + # ad-hoc signature. Sign before Bun archives the file. + signIfRequired "packages/natives/native/${platform.addon}" + ''} + + echo "Compiling OMP" + BUN_COMPILE_EXECUTABLE_PATH="${bunRuntimeTemplate}/libexec/bun" \ + bun --cwd="$PWD/packages/coding-agent" run build + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + + install -Dm755 packages/coding-agent/dist/omp "$out/libexec/omp/omp" + + makeWrapper "$out/libexec/omp/omp" "$out/bin/omp" \ + --set PI_SKIP_VERSION_CHECK 1 \ + ${ + if stdenv.hostPlatform.isLinux then "--prefix LD_LIBRARY_PATH" else "--prefix DYLD_LIBRARY_PATH" + } : "${lib.makeLibraryPath runtimeLibraries}" + + runHook postInstall + ''; + + doInstallCheck = true; + installCheckPhase = '' + runHook preInstallCheck + HOME="$TMPDIR" "$out/bin/omp" --smoke-test | grep -q "smoke-test: ok" + BUN_BE_BUN=1 "$out/libexec/omp/omp" -e \ + 'if (Bun.version !== "${bun.version}" || typeof Bun.Image !== "function") process.exit(1)' + runHook postInstallCheck + ''; + + meta = { + description = "Terminal-based coding agent with multi-model support"; + homepage = "https://omp.sh"; + changelog = "https://github.com/can1357/oh-my-pi/releases/tag/v${packageJson.version}"; + license = lib.licenses.mit; + mainProgram = "omp"; + platforms = [ + "aarch64-darwin" + "aarch64-linux" + "x86_64-darwin" + "x86_64-linux" + ]; + sourceProvenance = with lib.sourceTypes; [ + binaryNativeCode + fromSource + ]; + }; + } + // lib.optionalAttrs stdenv.hostPlatform.isDarwin { + # The compile output is intentionally unsigned until all Darwin fixups are complete. + darwinDontCodeSign = false; + } +) diff --git a/package.json b/package.json index cc1123796..50e84e242 100644 --- a/package.json +++ b/package.json @@ -167,6 +167,7 @@ "gen:stats": "bun --cwd=packages/stats run gen:stats", "gen:stats:reset": "bun --cwd=packages/stats run gen:stats:reset", "gen:changelog": "bun scripts/rewrite-changelog.ts", + "gen:nix": "bun scripts/gen-nix-bun.ts", "gen:tool-views": "bun --cwd=packages/collab-web run gen:tool-views", "gen:bundle": "bun --cwd=packages/coding-agent run gen:bundle", "gen:mupdf": "bun --cwd=packages/coding-agent run gen:mupdf", diff --git a/packages/coding-agent/CHANGELOG.md b/packages/coding-agent/CHANGELOG.md index 613977ba3..74b13c390 100644 --- a/packages/coding-agent/CHANGELOG.md +++ b/packages/coding-agent/CHANGELOG.md @@ -5,6 +5,7 @@ ### Added - Added Astral `ty` as a built-in Python primary LSP server (`ty server`), ordered behind `pyright`/`basedpyright`/`pylsp` so it becomes the primary Python LSP only when the existing servers are unavailable. `ruff` remains the Python linter and coexists alongside `ty` ([#4617](https://github.com/can1357/oh-my-pi/issues/4617)). +- Added first-party Nix support with reproducible source builds for Linux and macOS on x86-64 and ARM64, a pinned development shell, an overlay, NixOS and Home Manager modules, offline Bun dependencies, and lightweight flake evaluation in CI. Nix-managed installs now direct updates back through Nix instead of replacing store-managed executables. ### Changed diff --git a/packages/coding-agent/scripts/build-binary.ts b/packages/coding-agent/scripts/build-binary.ts index 1fb51fcfa..fda6b8160 100644 --- a/packages/coding-agent/scripts/build-binary.ts +++ b/packages/coding-agent/scripts/build-binary.ts @@ -53,10 +53,6 @@ if ( } const transformersVersion = transformersManifest.version; -function shouldAdhocSignDarwinBinary(crossBuild: CrossBuild | null): boolean { - return process.platform === "darwin" && !crossBuild; -} - async function runCommand( command: string[], env: NodeJS.ProcessEnv = Bun.env, @@ -76,6 +72,7 @@ async function runCommand( async function main(): Promise { const crossBuild = resolveCrossBuild(Bun.env.CROSS_TARGET); + const shouldAdhocSign = process.platform === "darwin" && !crossBuild && Bun.env.BUN_NO_CODESIGN_MACHO_BINARY !== "1"; const outName = crossBuild ? `omp-${crossBuild.id}` : "omp"; const outputPath = path.join(packageDir, "dist", outName); // Generate inside the try so the finally always restores the empty checked-in @@ -99,10 +96,11 @@ async function main(): Promise { outfile: outputPath, transformersVersion, target: crossBuild?.target, - skipBuiltinCodesign: shouldAdhocSignDarwinBinary(crossBuild), + executablePath: Bun.env.BUN_COMPILE_EXECUTABLE_PATH || undefined, + skipBuiltinCodesign: shouldAdhocSign, }); - if (shouldAdhocSignDarwinBinary(crossBuild)) { + if (shouldAdhocSign) { await runCommand(["codesign", "--force", "--sign", "-", outputPath]); } } finally { diff --git a/packages/coding-agent/scripts/compile-binary.ts b/packages/coding-agent/scripts/compile-binary.ts index 495612041..1a4d13254 100644 --- a/packages/coding-agent/scripts/compile-binary.ts +++ b/packages/coding-agent/scripts/compile-binary.ts @@ -16,6 +16,8 @@ export interface CodingAgentCompileOptions { readonly transformersVersion: string; /** Optional cross-compilation runtime target. */ readonly target?: Bun.Build.CompileTarget; + /** Optional unmodified Bun executable used as the standalone runtime template. */ + readonly executablePath?: string; /** Match release builds that minify identifiers while retaining names. */ readonly minifyIdentifiers?: boolean; /** Disable Bun's built-in Darwin signing before the caller re-signs. */ @@ -47,7 +49,11 @@ export async function compileCodingAgent(options: CodingAgentCompileOptions): Pr }, plugins: [await createLegacyPiVirtualModulePlugin()], compile: { - ...(options.target ? { target: options.target } : {}), + ...(options.executablePath + ? { executablePath: options.executablePath } + : options.target + ? { target: options.target } + : {}), outfile: options.outfile, autoloadBunfig: false, autoloadDotenv: false, diff --git a/packages/coding-agent/src/cli/update-cli.ts b/packages/coding-agent/src/cli/update-cli.ts index 80107b418..ca56d17ce 100644 --- a/packages/coding-agent/src/cli/update-cli.ts +++ b/packages/coding-agent/src/cli/update-cli.ts @@ -20,6 +20,7 @@ const REPO = "can1357/oh-my-pi"; const PACKAGE = "@oh-my-pi/pi-coding-agent"; const HOMEBREW_FORMULA = "can1357/tap/omp"; const MISE_TOOL = "github:can1357/oh-my-pi"; +const NIX_STORE_DIR = "/nix/store"; /** * Official npm registry origin. * @@ -421,7 +422,7 @@ function isPathInDirectory(filePath: string, directoryPath: string): boolean { return isPathInDirectoryLexical(resolvedFile, dirReal); } -type UpdateMethod = "brew" | "mise" | "bun" | "npm" | "binary"; +type UpdateMethod = "brew" | "mise" | "nix" | "bun" | "npm" | "binary"; interface UpdateMethodResolutionOptions { homebrewPrefix?: string; @@ -440,6 +441,7 @@ interface UpdateMethodResolutionOptions { type UpdateTarget = | { method: "brew" } | { method: "mise" } + | { method: "nix" } | { method: "bun"; path?: string } | { method: "npm"; path?: string } | { method: "binary"; path: string; replacesSymlink: boolean }; @@ -453,6 +455,7 @@ function resolveUpdateMethod( const launcherExtension = path.extname(ompPath).toLowerCase(); const isWindowsScriptLauncher = launcherExtension === ".cmd" || launcherExtension === ".ps1" || launcherExtension === ".bat"; + if (isPathInDirectory(ompPath, NIX_STORE_DIR)) return "nix"; if (homebrewPrefix && isPathInDirectory(ompPath, path.join(homebrewPrefix, "bin"))) return "brew"; if (miseBinDirs.some(dir => isPathInDirectory(ompPath, dir))) return "mise"; if (miseDataDir && isPathInDirectory(ompPath, path.join(miseDataDir, "shims"))) return "mise"; @@ -1355,7 +1358,10 @@ export async function runUpdateCommand(opts: { force: boolean; check: boolean }) try { const forceBinary = shouldForceBinaryUpdate(release); const target = await resolveUpdateTarget({ allowPackageManagers: !forceBinary }); - if (target.method === "brew") { + if (target.method === "nix") { + console.log(chalk.yellow("This installation is managed by Nix and cannot update itself.")); + console.log(chalk.dim("Update the flake input or profile that provides omp, then rebuild.")); + } else if (target.method === "brew") { await updateViaHomebrew(release.version, opts.force); } else if (target.method === "mise") { await updateViaMise(release.version, opts.force); diff --git a/packages/coding-agent/src/exec/non-interactive-env.ts b/packages/coding-agent/src/exec/non-interactive-env.ts index 3b1846639..aa4394a0a 100644 --- a/packages/coding-agent/src/exec/non-interactive-env.ts +++ b/packages/coding-agent/src/exec/non-interactive-env.ts @@ -1,3 +1,8 @@ +import { $which } from "@oh-my-pi/pi-utils"; + +/** Portable command that rejects credential prompts without assuming an FHS layout. */ +export const REJECT_PROMPT_COMMAND = $which("false") ?? "false"; + export const NON_INTERACTIVE_ENV: Readonly> = { // Disable pagers so commands don't block on interactive views. PAGER: "cat", @@ -22,7 +27,7 @@ export const NON_INTERACTIVE_ENV: Readonly> = { VISUAL: "true", EDITOR: "true", GIT_TERMINAL_PROMPT: "0", - SSH_ASKPASS: "/usr/bin/false", + SSH_ASKPASS: REJECT_PROMPT_COMMAND, CI: "true", AGENT: "1", // Package manager defaults for unattended execution. diff --git a/packages/coding-agent/src/utils/external-editor.ts b/packages/coding-agent/src/utils/external-editor.ts index 287f10c8a..8185854f0 100644 --- a/packages/coding-agent/src/utils/external-editor.ts +++ b/packages/coding-agent/src/utils/external-editor.ts @@ -5,7 +5,7 @@ import { spawn } from "node:child_process"; import * as fs from "node:fs/promises"; import * as os from "node:os"; import * as path from "node:path"; -import { $env, Snowflake } from "@oh-my-pi/pi-utils"; +import { $env, $which, Snowflake } from "@oh-my-pi/pi-utils"; /** * Returns the user's preferred editor command, or a platform default. @@ -56,7 +56,7 @@ export async function openInEditor( const child = process.platform === "win32" ? spawn(editor, [...editorArgs, tmpFile], { stdio, shell: true }) - : spawn("/bin/sh", ["-c", `${editorCmd} "$1"`, "sh", tmpFile], { stdio }); + : spawn($which("sh") ?? "sh", ["-c", `${editorCmd} "$1"`, "sh", tmpFile], { stdio }); const { promise, reject, resolve } = Promise.withResolvers(); child.once("exit", (code, signal) => resolve(code ?? (signal ? -1 : 0))); child.once("error", error => reject(error)); diff --git a/packages/coding-agent/src/utils/git.ts b/packages/coding-agent/src/utils/git.ts index 35342a75e..f62cce0bf 100644 --- a/packages/coding-agent/src/utils/git.ts +++ b/packages/coding-agent/src/utils/git.ts @@ -10,6 +10,7 @@ import { parseNumstat, } from "../commit/git/diff"; import type { FileDiff, FileHunks, NumstatEntry } from "../commit/types"; +import { REJECT_PROMPT_COMMAND } from "../exec/non-interactive-env"; import { ToolAbortError, ToolError, throwIfAborted } from "../tools/tool-errors"; // ════════════════════════════════════════════════════════════════════════════ @@ -199,7 +200,7 @@ const GIT_NON_INTERACTIVE_ENV = { GIT_TERMINAL_PROMPT: "0", LC_ALL: undefined, LC_MESSAGES: "C", - SSH_ASKPASS: "/usr/bin/false", + SSH_ASKPASS: REJECT_PROMPT_COMMAND, } satisfies Record; const GH_NON_INTERACTIVE_ENV = { ...GIT_NON_INTERACTIVE_ENV, diff --git a/packages/coding-agent/test/cli/update-cli.test.ts b/packages/coding-agent/test/cli/update-cli.test.ts index f07d1786d..cb30d5213 100644 --- a/packages/coding-agent/test/cli/update-cli.test.ts +++ b/packages/coding-agent/test/cli/update-cli.test.ts @@ -1,5 +1,5 @@ import { afterEach, describe, expect, it, vi } from "bun:test"; -import { runUpdateCommand } from "../../src/cli/update-cli"; +import { getLatestRelease, runUpdateCommand } from "../../src/cli/update-cli"; type FetchInput = string | URL | Request; type FetchInit = RequestInit | BunFetchRequestInit; @@ -26,3 +26,66 @@ describe("runUpdateCommand fetch cancellation", () => { expect(requestSignal).toBeInstanceOf(AbortSignal); }); }); + +describe("getLatestRelease rename pointers", () => { + afterEach(() => { + vi.restoreAllMocks(); + }); + + function stubRegistry(manifests: Record): string[] { + const urls: string[] = []; + const fetchStub = Object.assign( + async (input: FetchInput) => { + const url = String(input); + urls.push(url); + let manifest: unknown; + for (const pkg in manifests) { + if (url.includes(pkg)) { + manifest = manifests[pkg]; + break; + } + } + if (!manifest) return new Response(null, { status: 404, statusText: "Not Found" }); + return Response.json(manifest); + }, + { preconnect: globalThis.fetch.preconnect }, + ); + vi.spyOn(globalThis, "fetch").mockImplementation(fetchStub); + return urls; + } + + it("follows omp.rename to the new package and resolves version, dist, and names from its manifest", async () => { + const urls = stubRegistry({ + "@new/omp": { version: "999.1.0", omp: { dist: "npm" } }, + "@oh-my-pi/pi-coding-agent": { + version: "999.0.0", + omp: { dist: "binary", rename: { package: "@new/omp", natives: "@new/natives" } }, + }, + }); + + const release = await getLatestRelease(); + + expect(release.version).toBe("999.1.0"); + expect(release.dist).toBe("npm"); + expect(release.packages).toEqual({ pkg: "@new/omp", natives: "@new/natives" }); + expect(urls).toEqual([ + "https://registry.npmjs.org/@oh-my-pi/pi-coding-agent/latest", + "https://registry.npmjs.org/@new/omp/latest", + ]); + }); + + it("ignores a rename pointer that cycles back to an already-visited package", async () => { + const urls = stubRegistry({ + "@oh-my-pi/pi-coding-agent": { + version: "999.0.0", + omp: { rename: { package: "@oh-my-pi/pi-coding-agent" } }, + }, + }); + + const release = await getLatestRelease(); + + expect(urls).toHaveLength(1); + expect(release.version).toBe("999.0.0"); + expect(release.packages).toEqual({ pkg: "@oh-my-pi/pi-coding-agent", natives: "@oh-my-pi/pi-natives" }); + }); +}); diff --git a/packages/coding-agent/test/internal-urls/vault-protocol.test.ts b/packages/coding-agent/test/internal-urls/vault-protocol.test.ts index fce0cbda0..b60dffecc 100644 --- a/packages/coding-agent/test/internal-urls/vault-protocol.test.ts +++ b/packages/coding-agent/test/internal-urls/vault-protocol.test.ts @@ -10,7 +10,7 @@ import { VaultProtocolHandler, } from "@oh-my-pi/pi-coding-agent/internal-urls"; import * as vaultProtocol from "@oh-my-pi/pi-coding-agent/internal-urls/vault-protocol"; -import { removeWithRetries } from "@oh-my-pi/pi-utils"; +import { $which, removeWithRetries } from "@oh-my-pi/pi-utils"; async function withTempDir(fn: (dir: string) => Promise): Promise { const dir = await fs.mkdtemp(path.join(os.tmpdir(), "vault-protocol-")); @@ -367,9 +367,10 @@ describe("VaultProtocolHandler", () => { }); it("aborts an in-flight spawn when the AbortSignal is cancelled", async () => { - if (!(await Bun.file("/bin/sleep").exists())) return; + const sleep = $which("sleep"); + if (!sleep) return; const controller = new AbortController(); - const promise = vaultProtocol.spawnObsidian("/bin/sleep", ["10"], controller.signal, 30_000); + const promise = vaultProtocol.spawnObsidian(sleep, ["10"], controller.signal, 30_000); await Bun.sleep(20); controller.abort(); diff --git a/packages/coding-agent/test/non-interactive-env.test.ts b/packages/coding-agent/test/non-interactive-env.test.ts index 8057475a7..2635d7880 100644 --- a/packages/coding-agent/test/non-interactive-env.test.ts +++ b/packages/coding-agent/test/non-interactive-env.test.ts @@ -2,7 +2,7 @@ import { describe, expect, it } from "bun:test"; import * as fs from "node:fs/promises"; import * as os from "node:os"; import * as path from "node:path"; -import { buildNonInteractiveEnv } from "@oh-my-pi/pi-coding-agent/exec/non-interactive-env"; +import { buildNonInteractiveEnv, NON_INTERACTIVE_ENV } from "@oh-my-pi/pi-coding-agent/exec/non-interactive-env"; describe("buildNonInteractiveEnv", () => { it("defaults Windows child-process encoding to UTF-8 when inherited env is unset", () => { @@ -60,6 +60,16 @@ describe("buildNonInteractiveEnv", () => { expect(env.GPG_TTY).toBe("/dev/pts/7"); }); + it("uses an executable SSH askpass rejector on POSIX", async () => { + if (process.platform === "win32") return; + const proc = Bun.spawn([NON_INTERACTIVE_ENV.SSH_ASKPASS], { + stdout: "ignore", + stderr: "ignore", + }); + + expect(await proc.exited).toBe(1); + }); + it("injects clap-compatible CI=true by default", () => { expect(buildNonInteractiveEnv(undefined, {}, "linux").CI).toBe("true"); expect(buildNonInteractiveEnv(undefined, {}, "win32").CI).toBe("true"); diff --git a/packages/coding-agent/test/update-cli.test.ts b/packages/coding-agent/test/update-cli.test.ts index 76484d380..dc414db8f 100644 --- a/packages/coding-agent/test/update-cli.test.ts +++ b/packages/coding-agent/test/update-cli.test.ts @@ -12,14 +12,19 @@ import { buildMiseForceInstallArgs, buildMiseUpgradeArgs, buildNpmInstallArgs, + buildRenameCleanupPackages, downloadVerifiedBinary, isMuslLinuxForTest, + migrateRenamedInstall, parseUpdateArgs, pruneBunInstallCache, + type ReleaseInfo, + type RenameMigrationSteps, replaceBinaryForUpdate, resolveBunGlobalNodeModulesDirFromLocations, resolveReleaseBinaryAsset, resolveReleaseDist, + resolveReleaseRename, resolveUpdateMethodForTest, shouldForceBinaryUpdate, sweepStaleBackups, @@ -102,6 +107,15 @@ describe("update-cli libc detection", () => { }); describe("update-cli install target detection", () => { + it("leaves Nix store installations under Nix management", () => { + const method = resolveUpdateMethodForTest( + "/nix/store/0123456789-omp-17.2.15/bin/omp", + "/nix/store/9876543210-bun-1.3.14/bin", + ); + + expect(method).toBe("nix"); + }); + it("uses bun update when prioritized omp is inside bun global bin", () => { const method = resolveUpdateMethodForTest("/Users/test/.bun/bin/omp", "/Users/test/.bun/bin"); @@ -243,6 +257,130 @@ describe("update-cli package manager commands", () => { }); }); +describe("update-cli npm rename contract", () => { + it("parses a well-formed omp.rename pointer and rejects malformed ones", () => { + expect(resolveReleaseRename({ omp: { rename: { package: "@new/omp", natives: "@new/natives" } } })).toEqual({ + pkg: "@new/omp", + natives: "@new/natives", + }); + expect(resolveReleaseRename({ omp: { rename: { package: "@new/omp" } } })).toEqual({ + pkg: "@new/omp", + natives: undefined, + }); + expect(resolveReleaseRename({ omp: { rename: { package: "" } } })).toBeUndefined(); + expect(resolveReleaseRename({ omp: { rename: "@new/omp" } })).toBeUndefined(); + expect(resolveReleaseRename({ omp: {} })).toBeUndefined(); + expect(resolveReleaseRename(undefined)).toBeUndefined(); + }); + + it("installs renamed package names in lock-step, with no old-name leftovers in the argv", () => { + const packages = { pkg: "@new/omp", natives: "@new/natives" }; + + const bunArgs = buildBunInstallArgs("17.0.0", "linux-x64", packages); + expect(bunArgs).toContain("@new/omp@17.0.0"); + expect(bunArgs).toContain("@new/natives@17.0.0"); + expect(bunArgs).toContain("@new/natives-linux-x64@17.0.0"); + expect(bunArgs.some(arg => arg.startsWith("@oh-my-pi/"))).toBe(false); + + expect(buildNpmInstallArgs("17.0.0", "linux-x64", packages)).toContain("@new/omp@17.0.0"); + }); + + it("adds --force to npm argv only for rename migrations so the old package's bin can be clobbered", () => { + const packages = { pkg: "@new/omp", natives: "@new/natives" }; + expect(buildNpmInstallArgs("17.0.0", "linux-x64", packages, { force: true })).toContain("--force"); + expect(buildNpmInstallArgs("16.3.15", "win32-x64")).not.toContain("--force"); + }); + + it("removes the old agent package and its natives companions, including the supported platform leaf", () => { + expect(buildRenameCleanupPackages("darwin-arm64")).toEqual([ + "@oh-my-pi/pi-coding-agent", + "@oh-my-pi/pi-natives", + "@oh-my-pi/pi-natives-darwin-arm64", + ]); + expect(buildRenameCleanupPackages("linux-arm")).toEqual(["@oh-my-pi/pi-coding-agent", "@oh-my-pi/pi-natives"]); + }); +}); + +describe("migrateRenamedInstall transaction", () => { + const release: ReleaseInfo = { + tag: "v999.1.0", + version: "999.1.0", + packages: { pkg: "@new/omp", natives: "@new/natives" }, + }; + + function scriptedSteps(script: { install: number[]; removeOld?: number; verify: boolean[] }): { + steps: RenameMigrationSteps; + calls: string[]; + } { + const calls: string[] = []; + let installs = 0; + let verifies = 0; + return { + calls, + steps: { + async install() { + calls.push("install"); + return script.install[installs++] ?? 0; + }, + async removeOld() { + calls.push("removeOld"); + return script.removeOld ?? 0; + }, + async verify() { + calls.push("verify"); + return script.verify[verifies++] + ? { ok: true, actual: "999.1.0", path: "/bin/omp" } + : { ok: false, path: "/bin/omp" }; + }, + }, + }; + } + + it("never touches the old install when the new install fails", async () => { + vi.spyOn(console, "log").mockImplementation(() => {}); + const { steps, calls } = scriptedSteps({ install: [1], verify: [] }); + + await expect(migrateRenamedInstall(release, steps)).rejects.toThrow("left untouched"); + expect(calls).toEqual(["install"]); + }); + + it("installs the new package before removing the old one and verifies the result", async () => { + vi.spyOn(console, "log").mockImplementation(() => {}); + const { steps, calls } = scriptedSteps({ install: [0], verify: [true] }); + + await migrateRenamedInstall(release, steps); + expect(calls).toEqual(["install", "removeOld", "verify"]); + }); + + it("restores the bin link by reinstalling when old-package removal breaks verification", async () => { + vi.spyOn(console, "log").mockImplementation(() => {}); + const { steps, calls } = scriptedSteps({ install: [0, 0], verify: [false, true] }); + + await migrateRenamedInstall(release, steps); + expect(calls).toEqual(["install", "removeOld", "verify", "install", "verify"]); + }); + + it("treats old-package removal failure as a warning when the new install verifies", async () => { + const logs: string[] = []; + vi.spyOn(console, "log").mockImplementation(message => { + logs.push(String(message)); + }); + const { steps, calls } = scriptedSteps({ install: [0], removeOld: 1, verify: [true] }); + + await migrateRenamedInstall(release, steps); + expect(calls).toEqual(["install", "removeOld", "verify"]); + expect(logs.some(line => line.includes("could not remove the old"))).toBe(true); + }); + + it("aborts with a recovery hint when verification still fails after the restore install", async () => { + vi.spyOn(console, "log").mockImplementation(() => {}); + const { steps, calls } = scriptedSteps({ install: [0, 0], verify: [false, false] }); + + await expect(migrateRenamedInstall(release, steps)).rejects.toThrow("curl -fsSL https://omp.sh/install"); + expect(calls).toEqual(["install", "removeOld", "verify", "install", "verify"]); + }); +}); + describe("update-cli bun install command", () => { it("pins the official npm registry and bypasses the manifest cache so a stale mirror or snapshot cannot mask a freshly published version", () => { // Regression: omp queries https://registry.npmjs.org//latest directly. diff --git a/packages/stats/CHANGELOG.md b/packages/stats/CHANGELOG.md index 208fb0e80..171945d60 100644 --- a/packages/stats/CHANGELOG.md +++ b/packages/stats/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Fixed + +- Made the embedded dashboard archive byte-reproducible by sorting entries and zeroing tar and gzip timestamps before it is compiled into OMP. + ## [17.2.10] - 2026-08-06 ### Changed diff --git a/packages/stats/scripts/generate-client-bundle.ts b/packages/stats/scripts/generate-client-bundle.ts index a5383a09f..b674a5e2b 100644 --- a/packages/stats/scripts/generate-client-bundle.ts +++ b/packages/stats/scripts/generate-client-bundle.ts @@ -1,7 +1,6 @@ #!/usr/bin/env bun import * as fs from "node:fs/promises"; -import * as os from "node:os"; import * as path from "node:path"; import { $ } from "bun"; @@ -11,6 +10,14 @@ const DIST_CLIENT_DIR = path.join("dist", "client"); const GENERATE_FLAG = "--generate"; const RESET_FLAG = "--reset"; +const TAR_BLOCK_SIZE = 512; +const TAR_SIZE_OFFSET = 124; +const TAR_SIZE_LENGTH = 12; +const TAR_MTIME_OFFSET = 136; +const TAR_MTIME_LENGTH = 12; +const TAR_CHECKSUM_OFFSET = 148; +const TAR_CHECKSUM_LENGTH = 8; + // `--reset` restores the checked-in state: an empty file. The runtime treats // blank (or any non-base64) content as "no archive embedded" and builds the // dashboard from source instead; see src/embedded-client.ts. @@ -26,29 +33,60 @@ async function collectFiles(dir: string): Promise { files.push(fullPath); } } - files.sort((a, b) => a.localeCompare(b)); + files.sort(); return files; } -async function buildArchiveBase64(dir: string): Promise { +function readTarOctal(bytes: Uint8Array, offset: number, length: number): number { + const value = Buffer.from(bytes.subarray(offset, offset + length)) + .toString("ascii") + .replace(/\0.*$/, "") + .trim(); + return value ? Number.parseInt(value, 8) : 0; +} + +function writeTarOctal(bytes: Uint8Array, offset: number, length: number, value: number): void { + const octal = value.toString(8); + if (octal.length >= length) throw new Error(`Tar value ${value} does not fit in ${length} bytes`); + bytes.fill(0x30, offset, offset + length - 1); + bytes.set(Buffer.from(octal), offset + length - 1 - octal.length); + bytes[offset + length - 1] = 0; +} + +function normalizeTarMetadata(bytes: Uint8Array): void { + for (let offset = 0; offset + TAR_BLOCK_SIZE <= bytes.length; ) { + const header = bytes.subarray(offset, offset + TAR_BLOCK_SIZE); + if (header.every(byte => byte === 0)) return; + + const size = readTarOctal(header, TAR_SIZE_OFFSET, TAR_SIZE_LENGTH); + writeTarOctal(header, TAR_MTIME_OFFSET, TAR_MTIME_LENGTH, 0); + header.fill(0x20, TAR_CHECKSUM_OFFSET, TAR_CHECKSUM_OFFSET + TAR_CHECKSUM_LENGTH); + + let checksum = 0; + for (const byte of header) checksum += byte; + const checksumOctal = checksum.toString(8).padStart(6, "0"); + if (checksumOctal.length > 6) throw new Error(`Tar checksum ${checksum} exceeds the header field`); + header.set(Buffer.from(checksumOctal), TAR_CHECKSUM_OFFSET); + header[TAR_CHECKSUM_OFFSET + 6] = 0; + header[TAR_CHECKSUM_OFFSET + 7] = 0x20; + + offset += TAR_BLOCK_SIZE * (1 + Math.ceil(size / TAR_BLOCK_SIZE)); + if (offset > bytes.length) throw new Error("Tar entry extends beyond the archive"); + } +} + +/** Build a byte-stable gzip archive of a directory for embedding in the OMP binary. */ +export async function buildArchiveBase64(dir: string): Promise { const files = await collectFiles(dir); const entries: Record = {}; for (const filePath of files) { const relativePath = path.relative(dir, filePath).split(path.sep).join("/"); - entries[relativePath] = await fs.readFile(filePath); + entries[relativePath] = await Bun.file(filePath).bytes(); } - const tempArchivePath = path.join( - os.tmpdir(), - `omp-stats-client-${Bun.hash(Date.now().toString() + Math.random().toString(16)).toString(16)}.tar.gz`, - ); - try { - await Bun.Archive.write(tempArchivePath, entries, { compress: "gzip" }); - const archiveBytes = await Bun.file(tempArchivePath).bytes(); - return Buffer.from(archiveBytes).toString("base64"); - } finally { - await fs.rm(tempArchivePath, { force: true }); - } + const archiveBytes = await new Bun.Archive(entries).bytes(); + normalizeTarMetadata(archiveBytes); + return Buffer.from(Bun.gzipSync(archiveBytes, { level: 9 })).toString("base64"); } async function main(): Promise { @@ -69,4 +107,4 @@ async function main(): Promise { console.log(`Generated ${GENERATED_FILE}`); } -await main(); +if (import.meta.main) await main(); diff --git a/packages/stats/test/embedded-client-archive.test.ts b/packages/stats/test/embedded-client-archive.test.ts new file mode 100644 index 000000000..97b87a091 --- /dev/null +++ b/packages/stats/test/embedded-client-archive.test.ts @@ -0,0 +1,56 @@ +import { afterEach, describe, expect, test } from "bun:test"; +import * as fs from "node:fs/promises"; +import * as os from "node:os"; +import * as path from "node:path"; +import { buildArchiveBase64 } from "../scripts/generate-client-bundle"; + +const tempDirs: string[] = []; + +async function createFixture(order: readonly string[]): Promise { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "omp-stats-archive-")); + tempDirs.push(root); + for (const relativePath of order) { + const filePath = path.join(root, relativePath); + await fs.mkdir(path.dirname(filePath), { recursive: true }); + await Bun.write(filePath, relativePath === "index.html" ? "
OMP
" : "body { color: blue; }"); + } + return root; +} + +function tarHeaderMtimes(bytes: Uint8Array): number[] { + const mtimes: number[] = []; + for (let offset = 0; offset + 512 <= bytes.length; ) { + const header = bytes.subarray(offset, offset + 512); + if (header.every(byte => byte === 0)) break; + const sizeField = Buffer.from(header.subarray(124, 136)).toString("ascii").replace(/\0.*$/, "").trim(); + const mtimeField = Buffer.from(header.subarray(136, 148)).toString("ascii").replace(/\0.*$/, "").trim(); + const size = sizeField ? Number.parseInt(sizeField, 8) : 0; + mtimes.push(mtimeField ? Number.parseInt(mtimeField, 8) : 0); + offset += 512 * (1 + Math.ceil(size / 512)); + } + return mtimes; +} + +afterEach(async () => { + await Promise.all(tempDirs.splice(0).map(dir => fs.rm(dir, { recursive: true, force: true }))); +}); + +describe("embedded stats client archive", () => { + test("is byte-stable across filesystem order and carries zero timestamps", async () => { + const firstDir = await createFixture(["index.html", "assets/app.css"]); + const secondDir = await createFixture(["assets/app.css", "index.html"]); + + const first = await buildArchiveBase64(firstDir); + const second = await buildArchiveBase64(secondDir); + expect(second).toBe(first); + + const gzipBytes = Buffer.from(first, "base64"); + expect(gzipBytes.readUInt32LE(4)).toBe(0); + const tarBytes = Bun.gunzipSync(gzipBytes); + expect(tarHeaderMtimes(tarBytes)).toEqual([0, 0]); + + const files = await new Bun.Archive(gzipBytes).files(); + expect(await files.get("index.html")?.text()).toBe("
OMP
"); + expect(await files.get("assets/app.css")?.text()).toBe("body { color: blue; }"); + }); +}); diff --git a/scripts/gen-nix-bun.ts b/scripts/gen-nix-bun.ts new file mode 100755 index 000000000..4ccdd5544 --- /dev/null +++ b/scripts/gen-nix-bun.ts @@ -0,0 +1,27 @@ +#!/usr/bin/env bun + +import * as path from "node:path"; +import { $ } from "bun"; +import { $which } from "../packages/utils/src/which"; + +const repoRoot = path.join(import.meta.dir, ".."); + +/** Regenerate the checked-in Bun dependency expression with the pinned bun2nix input. */ +export async function generateNixBunDeps(): Promise { + const bun2nix = $which("bun2nix"); + if (bun2nix) { + await $`${bun2nix} -l bun.lock -c ../ -o nix/bun.nix`.cwd(repoRoot); + return; + } + + const nix = $which("nix"); + if (!nix) { + throw new Error("Generating nix/bun.nix requires bun2nix from `nix develop`, or Nix to enter that shell."); + } + + await $`${nix} --extra-experimental-features ${"nix-command flakes"} --accept-flake-config develop --command bun2nix -l bun.lock -c ../ -o nix/bun.nix`.cwd( + repoRoot, + ); +} + +if (import.meta.main) await generateNixBunDeps(); diff --git a/scripts/release.ts b/scripts/release.ts index 00188044e..49abc9cf1 100755 --- a/scripts/release.ts +++ b/scripts/release.ts @@ -11,6 +11,7 @@ import { $, Glob } from "bun"; import { compareVersions } from "../packages/utils/src/version.ts"; import { runChangelogFixer } from "./fix-changelogs"; +import { generateNixBunDeps } from "./gen-nix-bun"; const changelogGlob = new Glob("packages/*/CHANGELOG.md"); const packageJsonGlob = new Glob("packages/*/package.json"); @@ -341,6 +342,7 @@ async function cmdRelease(versionOrBump: string): Promise { await $`rm -f bun.lock`; await $`bun install`; await $`cargo generate-lockfile`; + await generateNixBunDeps(); console.log(); // 5. Update changelogs