75 lines
2.5 KiB
Nix
75 lines
2.5 KiB
Nix
{
|
|
appimageTools,
|
|
fetchurl,
|
|
lib,
|
|
nodejs,
|
|
uv,
|
|
python3,
|
|
nix-update-script,
|
|
}: let
|
|
pname = "eigent";
|
|
version = "0.0.90";
|
|
src = fetchurl {
|
|
url = "https://github.com/eigent-ai/eigent/releases/download/v${version}/Eigent-${version}.AppImage";
|
|
hash = "sha256-mwCBx+D6mgGqQa8bDuUpo3h49EwFVkwasJwaYc6aXFE=";
|
|
};
|
|
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";
|
|
};
|
|
}
|