{ appimageTools, fetchurl, lib, nodejs, uv, python3, nix-update-script, }: let pname = "eigent"; version = "0.0.89"; src = fetchurl { url = "https://github.com/eigent-ai/eigent/releases/download/v${version}/Eigent-${version}.AppImage"; hash = "sha256-9KuiFjegfXhCu1W/FCinWX4ae/DsNPudeBcXFfW18Hc="; }; appimageContents = appimageTools.extractType2 {inherit pname version src;}; in appimageTools.wrapType2 { inherit pname version src; extraPkgs = _: [ nodejs uv python3 ]; # Runs before bubblewrap launches — sets up writable state for the sandbox. extraPreBwrapCmds = '' # eigent writes to multiple dirs under resources/ at runtime: # prebuilt/ → pyvenv.cfg, .terminal_venv_fixed sentinel # backend/ → creates runtime/ dir for temporary state # Nix store is read-only → EROFS. Copy to writable location on first # launch (or when the package version changes). DATA_DIR="$HOME/.local/share/${pname}" mkdir -p "$DATA_DIR" for subdir in prebuilt backend; do SRC="${appimageContents}/resources/$subdir" DST="$DATA_DIR/$subdir" if [ ! -f "$DST/.nix-src" ] || [ "$(cat "$DST/.nix-src")" != "${appimageContents}" ]; then rm -rf "$DST" cp -r "$SRC" "$DST" chmod -R u+w "$DST" echo "${appimageContents}" > "$DST/.nix-src" fi done ''; # Bind-mount writable copies over the read-only store paths so the app # sees its files at the expected locations but can write to them. extraBwrapArgs = [ "--bind $HOME/.local/share/${pname}/prebuilt ${appimageContents}/resources/prebuilt" "--bind $HOME/.local/share/${pname}/backend ${appimageContents}/resources/backend" ]; extraInstallCommands = '' install -m 444 -D ${appimageContents}/eigent.desktop -t $out/share/applications substituteInPlace $out/share/applications/eigent.desktop \ --replace-fail 'Exec=AppRun --no-sandbox %U' 'Exec=${pname} %U' install -m 444 -D ${appimageContents}/eigent.png \ $out/share/icons/hicolor/256x256/apps/eigent.png ''; passthru = { updateScript = nix-update-script {}; }; meta = { description = "Open source AI cowork desktop app — local alternative to Claude Cowork"; homepage = "https://github.com/eigent-ai/eigent"; license = lib.licenses.asl20; platforms = lib.platforms.linux; mainProgram = "eigent"; }; }