Replace the prebuilt Debian package with the documented source build. Build the web UI and gateway with pnpm, stage the pinned Cua driver, and start the web UI from the wrapper.
This commit is contained in:
@@ -37,7 +37,7 @@ A custom Nix overlay and flake providing additional packages not found in upstre
|
|||||||
| `radar` | Modern Kubernetes visibility — topology, event timeline, service traffic, resource browsing, Helm management, and GitOps support | Kubernetes |
|
| `radar` | Modern Kubernetes visibility — topology, event timeline, service traffic, resource browsing, Helm management, and GitOps support | Kubernetes |
|
||||||
| `omniroute` | Unified AI router with 160+ providers, auto fallback, MCP/A2A, OpenAI-compatible APIs | AI LLM Gateway |
|
| `omniroute` | Unified AI router with 160+ providers, auto fallback, MCP/A2A, OpenAI-compatible APIs | AI LLM Gateway |
|
||||||
| `open-code-review` | AI-powered code review CLI combining deterministic pipelines with an LLM agent for line-level review comments | AI Coding Agents |
|
| `open-code-review` | AI-powered code review CLI combining deterministic pipelines with an LLM agent for line-level review comments | AI Coding Agents |
|
||||||
| `pilotdeck` | Task-oriented AI Agent productivity platform with WorkSpace isolation, white-box memory, and smart routing | AI Agents |
|
| `pilotdeck` | Task-oriented AI Agent productivity platform (source-built web UI and gateway) with WorkSpace isolation, white-box memory, and smart routing | AI Agents |
|
||||||
| `relay-free-llm` | RESTful API to route user prompts to various AI model providers with automatic failover and intent-based routing | AI LLM Gateway |
|
| `relay-free-llm` | RESTful API to route user prompts to various AI model providers with automatic failover and intent-based routing | AI LLM Gateway |
|
||||||
| `stakpak` | DevOps AI agent that generates infrastructure code, debugs Kubernetes, configures CI/CD, and automates deployments | AI Agents |
|
| `stakpak` | DevOps AI agent that generates infrastructure code, debugs Kubernetes, configures CI/CD, and automates deployments | AI Agents |
|
||||||
| `traycer` | Open-source AI orchestration app for agentic coding | AI Coding Agents |
|
| `traycer` | Open-source AI orchestration app for agentic coding | AI Coding Agents |
|
||||||
@@ -230,7 +230,7 @@ nix-overlay/
|
|||||||
│ ├── mcp-gateway/ # MCP protocol gateway
|
│ ├── mcp-gateway/ # MCP protocol gateway
|
||||||
│ ├── omniroute/ # Unified AI router with 160+ providers
|
│ ├── omniroute/ # Unified AI router with 160+ providers
|
||||||
│ ├── open-code-review/ # AI code review CLI (deterministic + LLM agent)
|
│ ├── open-code-review/ # AI code review CLI (deterministic + LLM agent)
|
||||||
│ ├── pilotdeck/ # Task-oriented AI Agent productivity platform
|
│ ├── pilotdeck/ # Task-oriented AI Agent platform (source-built web UI)
|
||||||
│ ├── radar/ # Kubernetes UI (topology, timeline, Helm, GitOps)
|
│ ├── radar/ # Kubernetes UI (topology, timeline, Helm, GitOps)
|
||||||
│ ├── relay-free-llm/ # AI model provider routing gateway
|
│ ├── relay-free-llm/ # AI model provider routing gateway
|
||||||
│ ├── skillsmcp/ # MCP server for Agent Skills
|
│ ├── skillsmcp/ # MCP server for Agent Skills
|
||||||
|
|||||||
+164
-133
@@ -1,182 +1,213 @@
|
|||||||
{
|
{
|
||||||
lib,
|
lib,
|
||||||
stdenv,
|
stdenv,
|
||||||
|
fetchFromGitHub,
|
||||||
fetchurl,
|
fetchurl,
|
||||||
dpkg,
|
fetchPnpmDeps,
|
||||||
autoPatchelfHook,
|
pnpmConfigHook,
|
||||||
|
nodejs_22,
|
||||||
|
nodejs-slim_22,
|
||||||
|
pnpm_10,
|
||||||
|
python3,
|
||||||
makeWrapper,
|
makeWrapper,
|
||||||
alsa-lib,
|
ripgrep,
|
||||||
at-spi2-atk,
|
git,
|
||||||
cairo,
|
curl,
|
||||||
cups,
|
procps,
|
||||||
dbus,
|
bashInteractive,
|
||||||
expat,
|
coreutils,
|
||||||
gdk-pixbuf,
|
findutils,
|
||||||
glib,
|
gnugrep,
|
||||||
gtk3,
|
gnused,
|
||||||
gtk4,
|
|
||||||
libdrm,
|
|
||||||
libgbm,
|
|
||||||
libGL,
|
|
||||||
libnotify,
|
|
||||||
libpulseaudio,
|
|
||||||
libsecret,
|
|
||||||
libx11,
|
libx11,
|
||||||
libxcb,
|
libxi,
|
||||||
libxcomposite,
|
libxtst,
|
||||||
libxdamage,
|
|
||||||
libxext,
|
libxext,
|
||||||
libxfixes,
|
|
||||||
libxkbcommon,
|
libxkbcommon,
|
||||||
libxrandr,
|
wayland,
|
||||||
libxshmfence,
|
at-spi2-core,
|
||||||
nspr,
|
|
||||||
nss,
|
|
||||||
pango,
|
|
||||||
pciutils,
|
|
||||||
pipewire,
|
|
||||||
speechd-minimal,
|
|
||||||
systemd,
|
|
||||||
vulkan-loader,
|
|
||||||
}:
|
}:
|
||||||
|
|
||||||
let
|
let
|
||||||
version = "2026.10.17";
|
version = "2026.10.17";
|
||||||
|
|
||||||
# Release tags use dotted dates (v2026.10.17), but the Debian artifacts use
|
# Keep the source, LFS asset, pnpm dependency, and Cua driver hashes in
|
||||||
# the release date with a build suffix (2026.1017.0).
|
# sync with the upstream release when updating the version.
|
||||||
versionParts = lib.splitString "." version;
|
pnpm = pnpm_10.override { nodejs-slim = nodejs-slim_22; };
|
||||||
debVersion = "${lib.elemAt versionParts 0}.${lib.elemAt versionParts 1}${lib.elemAt versionParts 2}.0";
|
|
||||||
|
|
||||||
arch =
|
# 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 = "x64";
|
x86_64-linux = fetchurl {
|
||||||
aarch64-linux = "arm64";
|
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}
|
.${stdenv.hostPlatform.system}
|
||||||
or (throw "pilotdeck: unsupported system ${stdenv.hostPlatform.system}");
|
or (throw "pilotdeck: unsupported system ${stdenv.hostPlatform.system}");
|
||||||
|
|
||||||
hashes = {
|
|
||||||
# The release publishes one Debian package per architecture. nix-update
|
|
||||||
# refreshes only the host architecture's hash; update the other one by hand
|
|
||||||
# from release.json in the GitHub release.
|
|
||||||
x86_64-linux = "sha256-vBqewHabntIz1hKbf10q9hkWX22m0U2mqJMXvX7cJOc=";
|
|
||||||
aarch64-linux = "sha256-paEEmWYkITfYTa3AsYD0WfVqtzzQ1GMlt5yjp7oXROY=";
|
|
||||||
};
|
|
||||||
|
|
||||||
runtimeLibs = [
|
|
||||||
alsa-lib
|
|
||||||
at-spi2-atk
|
|
||||||
cairo
|
|
||||||
cups
|
|
||||||
dbus
|
|
||||||
expat
|
|
||||||
gdk-pixbuf
|
|
||||||
glib
|
|
||||||
gtk3
|
|
||||||
gtk4
|
|
||||||
libdrm
|
|
||||||
libgbm
|
|
||||||
libGL
|
|
||||||
libnotify
|
|
||||||
libpulseaudio
|
|
||||||
libsecret
|
|
||||||
libx11
|
|
||||||
libxcb
|
|
||||||
libxcomposite
|
|
||||||
libxdamage
|
|
||||||
libxext
|
|
||||||
libxfixes
|
|
||||||
libxkbcommon
|
|
||||||
libxrandr
|
|
||||||
libxshmfence
|
|
||||||
nspr
|
|
||||||
nss
|
|
||||||
pango
|
|
||||||
pciutils
|
|
||||||
pipewire
|
|
||||||
speechd-minimal
|
|
||||||
stdenv.cc.cc.lib
|
|
||||||
systemd
|
|
||||||
vulkan-loader
|
|
||||||
];
|
|
||||||
in
|
in
|
||||||
stdenv.mkDerivation {
|
stdenv.mkDerivation (finalAttrs: {
|
||||||
pname = "pilotdeck";
|
pname = "pilotdeck";
|
||||||
inherit version;
|
inherit version;
|
||||||
|
|
||||||
src = fetchurl {
|
src = fetchFromGitHub {
|
||||||
url = "https://github.com/OpenBMB/PilotDeck/releases/download/v${version}/PilotDeck-${debVersion}-linux-${arch}.deb";
|
owner = "OpenBMB";
|
||||||
hash = hashes.${stdenv.hostPlatform.system};
|
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 = [
|
nativeBuildInputs = [
|
||||||
dpkg
|
nodejs_22
|
||||||
autoPatchelfHook
|
pnpm
|
||||||
|
pnpmConfigHook
|
||||||
|
python3
|
||||||
makeWrapper
|
makeWrapper
|
||||||
];
|
];
|
||||||
|
|
||||||
buildInputs = runtimeLibs;
|
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";
|
||||||
|
};
|
||||||
|
|
||||||
# The Debian package contains the complete Electron application, including
|
postUnpack = ''
|
||||||
# the bundled Node.js runtime and the built web UI.
|
cp -r ${lfsAssets}/ui/public/. source/ui/public/
|
||||||
unpackPhase = ''
|
cp -r ${lfsAssets}/src/context/memory/edgeclaw-memory-core/ui-source/assets/. \
|
||||||
runHook preUnpack
|
source/src/context/memory/edgeclaw-memory-core/ui-source/assets/
|
||||||
dpkg-deb --extract $src .
|
|
||||||
runHook postUnpack
|
|
||||||
'';
|
'';
|
||||||
|
|
||||||
dontBuild = true;
|
preConfigure = ''
|
||||||
dontStrip = true;
|
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 = ''
|
installPhase = ''
|
||||||
runHook preInstall
|
runHook preInstall
|
||||||
|
|
||||||
mkdir -p $out/opt
|
mkdir -p $out/lib/pilotdeck
|
||||||
cp -a opt/PilotDeck $out/opt/PilotDeck
|
cp -r \
|
||||||
|
package.json \
|
||||||
|
tsconfig.json \
|
||||||
|
node_modules \
|
||||||
|
dist \
|
||||||
|
src \
|
||||||
|
scripts \
|
||||||
|
skills \
|
||||||
|
resources \
|
||||||
|
$out/lib/pilotdeck/
|
||||||
|
|
||||||
mkdir -p $out/share/applications
|
mkdir -p $out/lib/pilotdeck/ui
|
||||||
substitute usr/share/applications/pilotdeck-desktop.desktop \
|
cp -r \
|
||||||
$out/share/applications/pilotdeck.desktop \
|
ui/package.json \
|
||||||
--replace-fail 'Exec=/opt/PilotDeck/pilotdeck-desktop %U' 'Exec=pilotdeck %U' \
|
ui/server \
|
||||||
--replace-fail 'Icon=pilotdeck-desktop' 'Icon=pilotdeck'
|
ui/dist \
|
||||||
|
ui/public \
|
||||||
|
ui/scripts \
|
||||||
|
ui/shared \
|
||||||
|
ui/vite.config.js \
|
||||||
|
ui/node_modules \
|
||||||
|
$out/lib/pilotdeck/ui/
|
||||||
|
|
||||||
mkdir -p $out/share/icons/hicolor/256x256/apps
|
makeWrapper ${lib.getExe nodejs_22} $out/bin/pilotdeck \
|
||||||
cp usr/share/icons/hicolor/256x256/apps/pilotdeck-desktop.png \
|
--add-flags "$out/lib/pilotdeck/ui/server/webRuntimeSupervisor.js start-built" \
|
||||||
$out/share/icons/hicolor/256x256/apps/pilotdeck.png
|
--prefix PATH : ${
|
||||||
|
lib.makeBinPath [
|
||||||
makeWrapper $out/opt/PilotDeck/pilotdeck-desktop $out/bin/pilotdeck \
|
nodejs_22
|
||||||
--prefix LD_LIBRARY_PATH : "${lib.makeLibraryPath runtimeLibs}"
|
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
|
runHook postInstall
|
||||||
'';
|
'';
|
||||||
|
|
||||||
# bcrypt ships glibc and musl prebuilds side by side; only the glibc one is
|
passthru.category = "AI Agents";
|
||||||
# used here, so the musl libc reference of the other prebuild stays unresolved.
|
|
||||||
autoPatchelfIgnoreMissingDeps = [
|
|
||||||
"libc.musl-x86_64.so.1"
|
|
||||||
"libc.musl-aarch64.so.1"
|
|
||||||
];
|
|
||||||
|
|
||||||
passthru = {
|
meta = {
|
||||||
category = "AI Agents";
|
description = "Task-oriented AI Agent productivity platform (source-built web UI and gateway)";
|
||||||
updateScript = [
|
|
||||||
"nix-update"
|
|
||||||
"--flake"
|
|
||||||
".#pilotdeck"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
meta = with lib; {
|
|
||||||
description = "Task-oriented AI Agent productivity platform";
|
|
||||||
homepage = "https://github.com/OpenBMB/PilotDeck";
|
homepage = "https://github.com/OpenBMB/PilotDeck";
|
||||||
changelog = "https://github.com/OpenBMB/PilotDeck/releases/tag/v${version}";
|
license = lib.licenses.agpl3Only;
|
||||||
license = licenses.agpl3Only;
|
|
||||||
sourceProvenance = with sourceTypes; [ binaryNativeCode ];
|
|
||||||
mainProgram = "pilotdeck";
|
mainProgram = "pilotdeck";
|
||||||
platforms = [
|
platforms = [
|
||||||
"x86_64-linux"
|
"x86_64-linux"
|
||||||
"aarch64-linux"
|
"aarch64-linux"
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
}
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user