{ lib, stdenv, fetchFromGitHub, fetchurl, fetchPnpmDeps, pnpmConfigHook, nodejs_22, nodejs-slim_22, pnpm_10, python3, makeWrapper, ripgrep, git, curl, procps, bashInteractive, coreutils, findutils, gnugrep, gnused, libx11, libxi, libxtst, libxext, libxkbcommon, wayland, at-spi2-core, }: let version = "2026.10.17"; # Keep the source, LFS asset, pnpm dependency, and Cua driver hashes in # sync with the upstream release when updating the version. pnpm = pnpm_10.override { nodejs-slim = nodejs-slim_22; }; # Git LFS objects used by the web UI and the memory-core package. The # upstream tarball contains pointer files, so fetch these paths through # git-lfs and overlay them on the source tree. lfsAssets = fetchFromGitHub { owner = "OpenBMB"; repo = "PilotDeck"; tag = "v${version}"; fetchLFS = true; sparseCheckout = [ "ui/public" "src/context/memory/edgeclaw-memory-core/ui-source/assets" ]; hash = "sha256-R0bMxC6B2XqJMzuBnHmlNPX65tIwxL5FUc6Vv5M3O7w="; }; cuaDriver = { x86_64-linux = fetchurl { url = "https://github.com/trycua/cua/releases/download/cua-driver-rs-v0.34.1/cua-driver-rs-0.34.1-linux-x86_64-binary.tar.gz"; hash = "sha256-pB/ivcvupFAdxZTAdPFrCXVyjgzHsIuQrOqFZNSPr+4="; }; aarch64-linux = fetchurl { url = "https://github.com/trycua/cua/releases/download/cua-driver-rs-v0.34.1/cua-driver-rs-0.34.1-linux-arm64-binary.tar.gz"; hash = "sha256-HIOdNUAbveog8+HPUKzpJu8Xvm8yzqfoIbArJjxJM9w="; }; } .${stdenv.hostPlatform.system} or (throw "pilotdeck: unsupported system ${stdenv.hostPlatform.system}"); in stdenv.mkDerivation (finalAttrs: { pname = "pilotdeck"; inherit version; src = fetchFromGitHub { owner = "OpenBMB"; repo = "PilotDeck"; tag = "v${version}"; hash = "sha256-VgsMoaaAtLIieBr4TchP61u5xV3PnVqjviak6DN7TPY="; }; pnpmDeps = fetchPnpmDeps { inherit (finalAttrs) pname version src ; inherit pnpm; pnpmWorkspaces = [ "pilotdeck" "pilotdeck-ui" ]; fetcherVersion = 4; hash = "sha256-yhLx1PGSGoyds8lUe3cKpqMWgITwic5YTxugATARV7Y="; }; pnpmWorkspaces = [ "pilotdeck" "pilotdeck-ui" ]; nativeBuildInputs = [ nodejs_22 pnpm pnpmConfigHook python3 makeWrapper ]; env = { # node-gyp must use the headers of the Node.js runtime that will execute # the native addons, rather than downloading headers from nodejs.org. npm_config_nodedir = nodejs_22; npm_config_offline = "true"; pnpm_config_offline = "true"; }; postUnpack = '' cp -r ${lfsAssets}/ui/public/. source/ui/public/ cp -r ${lfsAssets}/src/context/memory/edgeclaw-memory-core/ui-source/assets/. \ source/src/context/memory/edgeclaw-memory-core/ui-source/assets/ ''; preConfigure = '' export HOME=$TMPDIR ''; buildPhase = '' runHook preBuild # pnpmConfigHook installs dependencies with --ignore-scripts. Run the # allowed lifecycle scripts now. better-sqlite3 and node-pty fall back to # a source build when their prebuilt download is unavailable, while sharp # uses its prebuilt @img/sharp-* optional dependency. pnpm rebuild pnpm --filter pilotdeck-ui rebuild # The build script verifies and stages the pinned Cua computer-use driver. # Point it at the Nix store instead of letting it download the archive. export PILOTDECK_CUA_ARCHIVE=${cuaDriver} pnpm run build:web runHook postBuild ''; installPhase = '' runHook preInstall mkdir -p $out/lib/pilotdeck cp -r \ package.json \ tsconfig.json \ node_modules \ dist \ src \ scripts \ skills \ resources \ $out/lib/pilotdeck/ mkdir -p $out/lib/pilotdeck/ui cp -r \ ui/package.json \ ui/server \ ui/dist \ ui/public \ ui/scripts \ ui/shared \ ui/vite.config.js \ ui/node_modules \ $out/lib/pilotdeck/ui/ makeWrapper ${lib.getExe nodejs_22} $out/bin/pilotdeck \ --add-flags "$out/lib/pilotdeck/ui/server/webRuntimeSupervisor.js start-built" \ --prefix PATH : ${ lib.makeBinPath [ nodejs_22 ripgrep git curl procps bashInteractive coreutils findutils gnugrep gnused ] } \ --prefix LD_LIBRARY_PATH : ${ lib.makeLibraryPath [ libx11 libxi libxtst libxext libxkbcommon wayland at-spi2-core stdenv.cc.cc.lib ] } runHook postInstall ''; passthru.category = "AI Agents"; meta = { description = "Task-oriented AI Agent productivity platform (source-built web UI and gateway)"; homepage = "https://github.com/OpenBMB/PilotDeck"; license = lib.licenses.agpl3Only; mainProgram = "pilotdeck"; platforms = [ "x86_64-linux" "aarch64-linux" ]; }; })