From 60f56367dfc1e3c5095d034bed4fb4f572e32b55 Mon Sep 17 00:00:00 2001 From: Adam Malczewski Date: Wed, 27 May 2026 23:17:18 +0900 Subject: refactor(packaging): split into dispatch/dispatch-systemd/dispatch-s6, separate dispatch-electron, add bun-based frontend serve PKGBUILD is now a split package producing three .pkg.tar.zst files in one makepkg run: - dispatch base application files (/opt/dispatch), CLI wrappers (dispatch-api, dispatch-frontend), env configs (/etc/dispatch/dispatch-api.conf, /etc/dispatch/dispatch-frontend.conf) - dispatch-systemd systemd user units for dispatch-api + dispatch-frontend (conflicts with dispatch-s6) - dispatch-s6 s6-rc service pipelines (-srv + -log) for both services (conflicts with dispatch-systemd) The Electron desktop wrapper moved to its own self-contained PKGBUILD at packaging/electron/, producing dispatch-electron. It bundles its own copy of the frontend dist + electron entry points under /opt/dispatch-electron and does not depend on the base dispatch package, so users can install it standalone and point VITE_API_URL at any backend at build time. Files under packaging/ are now read directly from ${_projectdir}/packaging/ rather than via source=(); the two s6 service dirs share basenames (run, type) which would collide inside ${srcdir}. New frontend static server: packages/frontend/serve.ts uses Bun's built-in HTTP server (no extra runtime deps) with SPA fallback to index.html and path-traversal protection. PORT/HOST/DIST_DIR overridable via env. Exposed as 'bun run --cwd packages/frontend serve' and via /usr/bin/dispatch-frontend. Build scripts: - bin/build-pkg now prints the freshest built packages - bin/install-pkg installs dispatch + dispatch-systemd by default; accepts package names or --all; searches both packaging/ and packaging/electron/ - bin/build-pkg-electron new, builds the electron split - bin/build-pkg-windows replaces bin/windows-pkg; drops the hard-coded WSL copy step, just prints the win-unpacked path .gitignore extended to cover packaging/*.tar.zst and packaging/electron/{src,pkg,*.pkg.tar.zst,*.tar.zst}. --- packaging/electron/PKGBUILD | 100 ++++++++++++++++++++++++ packaging/electron/dispatch-electron-wrapper.sh | 2 + packaging/electron/dispatch-electron.install | 32 ++++++++ packaging/electron/dispatch.desktop | 9 +++ packaging/electron/dispatch.png | Bin 0 -> 10192 bytes packaging/electron/dispatch.svg | 24 ++++++ 6 files changed, 167 insertions(+) create mode 100644 packaging/electron/PKGBUILD create mode 100755 packaging/electron/dispatch-electron-wrapper.sh create mode 100644 packaging/electron/dispatch-electron.install create mode 100644 packaging/electron/dispatch.desktop create mode 100644 packaging/electron/dispatch.png create mode 100644 packaging/electron/dispatch.svg (limited to 'packaging/electron') diff --git a/packaging/electron/PKGBUILD b/packaging/electron/PKGBUILD new file mode 100644 index 0000000..a259418 --- /dev/null +++ b/packaging/electron/PKGBUILD @@ -0,0 +1,100 @@ +# Maintainer: dispatch +# +# Electron desktop wrapper for Dispatch on Linux. +# +# Self-contained: bundles its own copy of the built frontend dist + electron +# entry points under /opt/dispatch-electron/. Does NOT depend on the `dispatch` +# package — install that separately (with dispatch-systemd or dispatch-s6) if +# you want to run the backend locally, or point VITE_API_URL at a remote +# instance at build time. +# +# Build with: +# bin/build-pkg-electron # makepkg -fd in packaging/electron/ +# +# Override the backend URL the bundled frontend talks to: +# VITE_API_URL="http://your-host:18390" bin/build-pkg-electron + +pkgname=dispatch-electron +pkgver=0.0.1 +pkgrel=1 +pkgdesc='Electron desktop wrapper for Dispatch (self-contained)' +arch=('x86_64') +url='https://github.com/anomalyco/dispatch' +license=('MIT') +depends=('electron') +makedepends=('bun') +install=dispatch-electron.install +source=() +sha256sums=() + +_projectdir="${startdir}/../.." +_packagingdir="${_projectdir}/packaging" +_electrondir="${_packagingdir}/electron" + +prepare() { + mkdir -p "${srcdir}/dispatch-electron-${pkgver}" + + # Copy project files into the src build directory (preserve symlinks) + cp -a \ + "${_projectdir}/packages" \ + "${_projectdir}/package.json" \ + "${_projectdir}/bun.lock" \ + "${_projectdir}/tsconfig.base.json" \ + "${srcdir}/dispatch-electron-${pkgver}/" +} + +build() { + cd "${srcdir}/dispatch-electron-${pkgver}" + + # Install all deps (including devDependencies for vite build) + bun install --frozen-lockfile + + # Build the SPA. VITE_API_URL is baked in at build time. + VITE_API_URL="${VITE_API_URL:-http://localhost:18390}" \ + bun run --cwd packages/frontend build +} + +package() { + cd "${srcdir}/dispatch-electron-${pkgver}" + + local optdir="${pkgdir}/opt/dispatch-electron" + + # --- Bundled SPA dist --- + install -dm755 "${optdir}/dist" + cp -a packages/frontend/dist/. "${optdir}/dist/" + + # --- Electron entry points --- + # main.cjs loads ../dist/index.html — so the dist must sit alongside electron/. + install -Dm644 \ + packages/frontend/electron/main.cjs \ + "${optdir}/electron/main.cjs" + install -Dm644 \ + packages/frontend/electron/preload.cjs \ + "${optdir}/electron/preload.cjs" + + # --- /usr/bin/dispatch (electron wrapper) --- + install -Dm755 \ + "${_electrondir}/dispatch-electron-wrapper.sh" \ + "${pkgdir}/usr/bin/dispatch" + + # --- Desktop integration --- + install -Dm644 \ + "${_electrondir}/dispatch.desktop" \ + "${pkgdir}/usr/share/applications/dispatch.desktop" + + install -Dm644 \ + "${_electrondir}/dispatch.svg" \ + "${pkgdir}/usr/share/icons/hicolor/scalable/apps/dispatch.svg" + + if [ -f "${_electrondir}/dispatch.png" ]; then + install -Dm644 \ + "${_electrondir}/dispatch.png" \ + "${pkgdir}/usr/share/icons/hicolor/512x512/apps/dispatch.png" + fi + + # --- License --- + if [ -f "${_projectdir}/LICENSE" ]; then + install -Dm644 "${_projectdir}/LICENSE" \ + "${pkgdir}/usr/share/licenses/${pkgname}/LICENSE" + fi +} diff --git a/packaging/electron/dispatch-electron-wrapper.sh b/packaging/electron/dispatch-electron-wrapper.sh new file mode 100755 index 0000000..948db3b --- /dev/null +++ b/packaging/electron/dispatch-electron-wrapper.sh @@ -0,0 +1,2 @@ +#!/bin/bash +exec /usr/bin/electron --name="Dispatch" /opt/dispatch-electron/electron/main.cjs "$@" diff --git a/packaging/electron/dispatch-electron.install b/packaging/electron/dispatch-electron.install new file mode 100644 index 0000000..9eea6b1 --- /dev/null +++ b/packaging/electron/dispatch-electron.install @@ -0,0 +1,32 @@ +post_install() { + echo "" + echo "==> Dispatch Electron desktop wrapper installed (self-contained)." + echo " Launch from your menu (Dispatch) or run:" + echo " dispatch" + echo "" + echo " The bundled frontend talks to the API URL baked in at build" + echo " time (default: http://localhost:18390). To run a local backend:" + echo " pacman -S dispatch dispatch-systemd # systemd" + echo " pacman -S dispatch dispatch-s6 # s6 / Artix" + echo "" + echo " To point the wrapper at a different backend, rebuild with:" + echo " VITE_API_URL=\"http://your-host:18390\" bin/build-pkg-electron" + echo "" + + if command -v update-desktop-database >/dev/null 2>&1; then + update-desktop-database -q /usr/share/applications 2>/dev/null || true + fi + if command -v gtk-update-icon-cache >/dev/null 2>&1; then + gtk-update-icon-cache -q /usr/share/icons/hicolor 2>/dev/null || true + fi +} + +post_upgrade() { + post_install +} + +post_remove() { + if command -v update-desktop-database >/dev/null 2>&1; then + update-desktop-database -q /usr/share/applications 2>/dev/null || true + fi +} diff --git a/packaging/electron/dispatch.desktop b/packaging/electron/dispatch.desktop new file mode 100644 index 0000000..0ed44af --- /dev/null +++ b/packaging/electron/dispatch.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Name=Dispatch +Comment=AI Agent Dispatch Interface +Exec=/usr/bin/dispatch %U +Icon=dispatch +Terminal=false +Type=Application +Categories=Development;Utility; +StartupWMClass=Dispatch diff --git a/packaging/electron/dispatch.png b/packaging/electron/dispatch.png new file mode 100644 index 0000000..84d743a Binary files /dev/null and b/packaging/electron/dispatch.png differ diff --git a/packaging/electron/dispatch.svg b/packaging/electron/dispatch.svg new file mode 100644 index 0000000..2aae97f --- /dev/null +++ b/packaging/electron/dispatch.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + -- cgit v1.2.3