Skip to content

v0.5.4

Latest

Choose a tag to compare

@github-actions github-actions released this 26 May 08:59
· 308 commits to develop since this release

Added

  • Dynamic PWA manifest naming. /manifest.json now varies by origin. Default label derives from Host header → os.hostname()"Pi-Dash" fallback, formatted as Pi-Dash · <source>. Optional dashboardName config field + Settings → General → "PWA Display Name" input for user override. Distinguishes home-screen icons across multi-machine / tunnel installs. iOS Safari requires uninstall + re-add to pick up new name; Chrome/Edge/Android refresh within ~24h. (change: add-dynamic-pwa-manifest-naming)
  • Runtime bootstrap-install eliminated in all arms (Electron, standalone, bridge). pi/openspec/tsx are now regular dependencies of @blackbelt-technology/pi-dashboard-server. Standalone npm install -g @blackbelt-technology/pi-agent-dashboard brings them in via npm itself — no first-run install delay, no ~/.pi-dashboard/ writes, no installable.json, no bootstrap_status_update WS events. Electron ships them inside the immutable app bundle at <resourcesPath>/server/node_modules/; updates land via electron-updater whole-app replacement. jiti remains a direct dep of pi-dashboard-server; the bin wrapper resolves it from own node_modules. Server cli.ts logs [bootstrap] ready (pi resolved via <source>) on success and throws hard on failure. Pre-R3 modules removed: bootstrap-state, bootstrap-queue, bootstrap-install, bootstrap-install-from-list, installable-list, managed-workspace-materialize, managed-package-whitelist, BootstrapBanner, useBootstrapStatus, /api/bootstrap/*. Legacy ~/.pi-dashboard/ left untouched; detectLegacyManagedDir() surfaces a Doctor advisory only. The /api/pi-core/update path is retained for the standalone + bridge arms (where it has a writable target) and hidden under Electron via /api/health.launchSource === "electron". (change: eliminate-electron-runtime-install)
  • Mid-turn prompt queue. Typed-during-streaming messages now visibly queue above the input as chips (one per send), with a single "Clear all" affordance and a count badge on each session card. The bridge owns the queue per-session and drains it via pi.sendUserMessage on agent_end. The 30-second pendingPrompt safety timer is now queue-aware: it pauses while the prompt is observed in the queue, eliminating the false-positive "the prompt may not have been received" error that fired during long streaming turns. The input stays enabled while the agent is streaming so further sends accumulate naturally. Cancel actually cancels: clicking "Clear all" drops the bridge queue before pi ever sees the messages. (change: surface-mid-turn-prompt-queue)
  • Roles UI in Settings. Built-in plugin @blackbelt-technology/pi-dashboard-builtins-plugin contributes a settings-section claim under Settings → General → Roles. Edit per-session role-to-model maps, save/load/delete presets. Replaces the inline roles dropdown inside ModelSelector. Existing protocol untouched (role_set / role_preset_*). Third-party plugins can contribute additional roles UI via the same slot. (change: fix-pi-flows-end-to-end)
  • Plugin staleness banner. /api/health now returns bundleHash (sha256 of discovered plugin set). Client compares to embedded PLUGIN_REGISTRY_HASH. Amber banner with Refresh button surfaces when hashes differ — remote browsers / zrok clients learn when their cached bundle is out of sync. Dismiss persists in sessionStorage. No new REST route or WS message. (change: fix-pi-flows-end-to-end)
  • /api/health.plugins[] diagnostic fields. Each plugin entry gains bridgeLoadedFrom: "packages[]" | "dashboardPluginBridges" | "none" (computed by re-reading ~/.pi/agent/settings.json) and optional lastProbe: { status, peers, at } (from forwarded flows-anthropic-bridge:status events). One curl /api/health now diagnoses bridge load failures end-to-end. (change: fix-pi-flows-end-to-end)

Changed

  • Subagent inspector now ships with pi-dashboard-subagents as the recommended producer. The dashboard drops specialized support for @tintinweb/pi-subagents — its Agent tool calls now render via the generic tool renderer, and the get_subagent_result / steer_subagent specialized renderers have been removed. pi-dashboard-subagents is foreground-only, streams a full per-step timeline (tool calls, reasoning, assistant text), and is now bundled in the Electron installer for first-run availability. The companion subagents-plugin provides inline-expand and popout views for inspecting subagent runs. (change: add-subagent-inspector)
  • Plugin bridge registration dual-writes packages[]. registerPluginBridge / deregisterPluginBridge now manage both dashboardPluginBridges[dashboard-<id>] (forward-compat) AND packages[] + a _dashboardManagedPackages ownership map. pi-coding-agent 0.74 ignores dashboardPluginBridges and only loads extensions from packages[]; previously this meant every bundled bridge plugin (notably flows-anthropic-bridge) was effectively dead. One-shot reconciliation at server start heals pre-existing installs. Env escape hatch: PI_DASHBOARD_DISABLE_PLUGIN_BRIDGE_PACKAGES_WRITE=1. BREAKING for plugin authors who relied on the old write being a no-op. (change: fix-pi-flows-end-to-end)
  • Dashboard no longer claims /flows* slash commands. Flow operations surface through buttons only (SessionFlowActions Run/New/Edit/Delete, FlowDashboard Abort). pi-flows continues to register the slash commands for TUI users — no behavioral change for TUI hosts. (change: fix-pi-flows-end-to-end)
  • useSelectedSessionId plugin context hook. Plugins rendering in global surfaces (e.g. settings-section) can now reactively scope to the currently viewed session. (change: fix-pi-flows-end-to-end)

Fixed

  • Electron cold-launch probe cascade. Four bugs broke packaged-Electron first-launch on machines without a system pi install, producing a silent splash-hang with no on-disk trace. (change: fix-electron-cold-launch-probe-cascade)
    • piExtension probe always returned null. probePiExtension in packages/electron/src/lib/launch-source.ts read settings.extensions — a non-existent field in pi's settings schema. Fixed: probe now walks settings.packages[] via new listPiPackages(opts) export in @blackbelt-technology/pi-dashboard-shared/pi-package-resolver.js, returning ResolvedPiPackage[] deduped by packageDir across user + project scopes.
    • pi-dashboard --version required jiti. packages/server/bin/pi-dashboard.mjs previously resolved jiti even for --version, breaking version probes when managed dir was empty. Fixed: --version / -v / version short-circuit reads sibling package.json and exits 0 without resolving jiti.
    • Launch-source diagnostics lost on .desktop launch. console.warn / console.error from probes went to stderr, which packaged-Electron .desktop launches discard, leaving no post-mortem trail. Fixed: new logLaunchSource() + appendDashboardLog() helpers dual-write to ~/.pi/dashboard/server.log with [<ts>] [launch-source] ... prefix; all 8 console-write sites routed through the helper.
    • extractBundle selective-wipe silently disabled. buildExtractedSource passed an extractFs with no-op overrides for mkdirSync / readdirSync / rmSync / statSync, so the selective-wipe step inside extractBundle never ran. Stale absolute symlinks under ~/.pi-dashboard/node_modules/.../node_modules/.bin/X pointing back at a vanished <resourcesPath>/server/ produced ERR_FS_CP_EINVAL on every cold launch. Fixed: extractFs shape narrowed to Partial<ExtractFs>, no-op overrides dropped; buildFs now fills real-fs defaults for destructive operations. Self-healing for any user's corrupt managed dir.
  • @pi/anthropic-messages 0.3.0 widens the gate. Activation no longer requires the model id to match /claude/i. Any model.api === "anthropic-messages" session opens the gate — covers OAuth + API-key + proxy providers (9Router, custom OpenAI-compatible bases) that route to Anthropic but report non-Claude model ids. PI_ANTHROPIC_MESSAGES_FORCE_CANONICAL now overrides model.api too. isClaudeAnthropicMessages kept as deprecated alias for one minor. (change: fix-pi-flows-end-to-end Group 4)
  • pi-flows 0.2.0 abort race. flow-execution.ts parallel agent batch now wraps Promise.all with raceWithAbort. Parent flow unwinds within ~10 ms of AbortSignal firing instead of waiting for every in-flight child to observe the signal at its own iteration boundary. Pending children still call session.abort() on themselves; cancelled results synthesized so observers (TUI, dashboard) render accurate per-agent state. Repo-lint forbids new spawnAgent calls without explicit signal:. (change: fix-pi-flows-end-to-end Group 3)
  • Linux x64 AppImage maker fixed. Three bugs blocked every linux-x64 Electron release. @pengx17/electron-forge-maker-appimage@1.2.1 called execSync without stdio: 'inherit'patch-apprun.sh's stdout (every file from --appimage-extract plus wget + appimagetool) overflowed Node's 1 MB default stdio buffer, throwing spawnSync /bin/sh ENOBUFS. Patched via patch-package to stream child output instead of buffering. Newer appimagetool builds also require ARCH=<uname-m> explicitly; packages/electron/scripts/patch-appimage-fix.sh now passes ARCH="$SYSTEM_ARCH" alongside APPIMAGE_EXTRACT_AND_RUN=1. Linux-x64 AppImage and DEB artifacts now publish reliably from the Release workflow.
  • Standalone npm install postinstall guard. patch-package is wired into the root postinstall but it's a devDep — end-users running npm install --omit=dev against the published tarball had neither patch-package nor a patches/ directory, producing sh: 1: patch-package: not found (exit 127). Fix: tiny CJS wrapper scripts/maybe-patch-package.cjs no-ops unless both patches/ and a resolvable patch-package package.json exist; included in the published root tarball via files[]. Cross-platform (Linux / Windows / macOS) via require.resolve + spawnSync, no shell tooling.
  • Windows standalone-install spawn bugs (3). jiti URL handling, .cmd EFTYPE on shell-less spawn, and missing node prefix in spawn argv all broke npm install -g @blackbelt-technology/pi-agent-dashboard on Windows. CI gained a standalone-install-smoke-windows matrix leg covering Node 22/24/25 to keep regressions from hiding again. (change: fix-windows-standalone-install-spawn-bugs)
  • Windows System32 PATH ensurance + bundled-Node dir resolution. Electron child-process spawns on Windows sometimes saw a PATH missing System32 / Wbem / WindowsApps when launched from File Explorer (launchctl-equivalent context), breaking where, cmd /c, and bundled-Node resolution. New shared helper ensureWindowsSystemPath prepends the canonical Windows system dirs when missing; resolved bundled-Node directory is now stable across launch contexts. POSIX is a no-op. (change: fix-windows-path-system32-missing)
  • Wizard occluded by splash on Windows first-run. On Windows, the Electron splash window covered the welcome wizard on first launch, freezing the user behind an undismissible splash. Splash now closes before the wizard is shown; wizard receives focus and is brought to front. (change: fix-wizard-occluded-by-splash)
  • node-pty bumped to 1.2.0-beta.13. Adds Linux prebuilds (x64 + arm64) so @blackbelt-technology/pi-dashboard-server no longer falls back to source-compile on Linux installs that lack a C++ toolchain. Companion jiti hygiene fixes for the bin wrapper.
  • Recovery HTTP server on missing top-level deps. When the bundled server can't resolve a critical top-level dependency at startup, the launcher now degrades to a minimal HTTP server that serves a diagnostic page + /api/doctor instead of silently failing. Pi sessions are unavailable but the user can see what's wrong and reinstall. (change: add-startup-recovery-server)
  • CI Electron on-demand build workflow. New CI Electron (on-demand) workflow (.github/workflows/ci-electron.yml) builds the full 6-leg Electron installer matrix (darwin arm64/x64, linux arm64/x64, win32 arm64/x64) without publishing to npm or creating a GitHub Release. Use to smoke-test packaging changes on feature branches without burning a SemVer slot. Version slug shape: <base>-ci.<UTC-stamp>.<branch-slug>.<sha7>, ranked below the base stable so accidental releases don't reach electron-updater clients with default allowPrerelease: false. (change: add-ci-electron-on-demand-build)

First-launch unblocking (unsigned binaries)

The Windows installers and macOS DMGs are not yet code-signed / notarized.
Both OSes will block first-launch with a security warning. These are not
malware — the artifacts are the exact ones produced by
.github/workflows/publish.yml
against this tag. Pick whichever workaround fits your workflow.

Tracking: Authenticode signing → change windows-authenticode-signing;
macOS notarization → change macos-notarization (planned). This section
will shrink and eventually disappear as each lands.

Windows — SmartScreen warning

SmartScreen will show "Windows protected your PC" the first time you
run any .exe artifact (Setup, portable, or any .exe extracted from a
ZIP).

Option A — at the SmartScreen dialog:

  1. Click More info.
  2. Click Run anyway.

Option B — pre-clear the Mark-of-the-Web:

  1. Right-click the downloaded .exe (or the .zip) → Properties.
  2. At the bottom of the General tab, tick Unblock next to
    "This file came from another computer...".
  3. Click OK and run as normal.

For ZIP archives, unblock the archive itself before extracting so
the contained .exes inherit the cleared zone.

macOS — Gatekeeper / quarantine

macOS will refuse to launch the app on first run with "PI Dashboard
cannot be opened because the developer cannot be verified"
or silently
quarantine it.

Option A — control-click the app:

  1. Open the DMG and drag PI Dashboard to Applications.
  2. In Applications, right-click (or Control-click) PI Dashboard →
    Open
    .
  3. Click Open in the confirmation dialog. Subsequent launches are
    unrestricted.

Option B — clear the quarantine attribute from the terminal:

xattr -d com.apple.quarantine "/Applications/PI Dashboard.app"

If the DMG itself is being blocked, clear it on the mounted volume
before copying:

xattr -d com.apple.quarantine "/Volumes/PI Dashboard/PI Dashboard.app"