Skip to content

PiChamber v0.7.2

Choose a tag to compare

@github-actions github-actions released this 01 Sep 12:57
· 182 commits to main since this release

[0.7.2] - 2026-09-01

Attachments, worktree, extension, and startup reliability release.

  • Attachments upload before the prompt leaves. Composer picker, drop, and paste now create card previews immediately and stream each file to POST /api/pi/attachments as application/octet-stream with x-pichamber-filename/x-pichamber-mime before prompt dispatch. The composer shows one strip inside the card that wraps on wide layouts and scrolls on narrow layouts; each card reads its own preparing / uploading (determinate progress when the runtime reports bytes) / ready / failed / expired state from input-store.ts with Retry and Remove actions. Send and Queue are gated until every draft attachment is ready (Uploading attachments… / Retry or remove failed attachments on the send/queue buttons and as toasts), keyboard submission repeats the gate, and queueing detaches cards without deleting server uploads. Prompt dispatch keeps cards visible until Pi accepts the prompt; payload-too-large, network, and runtime-changed failures leave attachments available for another attempt instead of clearing them. Server validates filenames, enforces expiry/TTL and per-file limits in attachment-store.js, supports DELETE /api/pi/attachments/:id, and the web client exposes uploadAttachment/deleteAttachment plus runtime-upload.ts progress reporting. Queued messages serialize ready attachments for persistence and restore (#70, runtime-upload, attachment-store, ChatInput, FileAttachment, input-store, session-ui-store).
  • Background worktree creation no longer steals focus. The submit that starts a draft worktree captures its draft snapshot, prompt, and model config and keeps the returned receipt through completion. Selecting another session while the worktree builds no longer redirects the prompt or steals session focus; materialization creates the worktree session with select: false and prompts its new directory in the background, leaving the current session and active directory untouched. Failure preserves the draft and never falls back to the source checkout (#71, useDraftWorktreeCreation, pi-session-store, session-ui-store, session-actions).
  • Extension state hydrates on open and reconnect. sessions.open and session.snapshot now include live extension state (extensionStatuses, extensionWidgets, extensionDialogs, extensionPanels, extensionApps, extensionTitle) built by projectExtensionSnapshotState and seeded from the daemon's per-session maps. First attach after a cold start no longer misses one-time startup statuses before the browser stream connects, and a second tab reopens with the same live panels (#75, session-daemon, routes, event-reducer, bootstrap, reconnect).
  • Large settled history no longer rebuilds on every token. Settled assistant turns with long histories defer older blocks behind Load older history / Load all history (deterministic TurnAssistantBlock + turnAssistantReveal), so live replies avoid rebuilding the whole transcript and MessageList virtualization stays cheap (#73, MessageList, TurnItem, TurnAssistantBlock).
  • Interactive startup enable and pichamber version. In an interactive terminal with no setup flags, pichamber startup enable now walks through access (This machine only / Local network / Custom bind address), port (1–65535 validated), authentication (Use configured password / Enter a password with confirmation / Generate a secure password / No password when local), and a final confirmation before installing the native service. Flag-driven, non-TTY, --quiet, and --json runs stay non-interactive. Re-running enable rewrites and restarts the systemd unit (daemon-reload + enable + restart) so new settings take effect instead of requiring a manual restart. Adds pichamber version (and --version) that prints the installed package version and supports --json (bin/cli, cli-args, commands-startup, cli-startup, DOCUMENTATION.md).
  • Web updates use the correct Pi endpoint and a detached launcher. The client now posts to POST /api/pi/update-install (was /api/pichamber/update-install) and the server validates the install is a trusted global package-manager copy before spawning a detached updater (pichamber update --quiet, detached + stdio: ignore). Container and systemd-hosted servers are refused with an actionable message instead of attempting an in-place replace (#74, UpdateDialog, routes, package-manager, launchUpdateCommand).
  • Directory focus no longer loops on Windows spellings. The chrome bridge compares normalized path identities (slash style, drive-letter case, trailing separator) before writing the daemon focus back into useDirectoryStore, preventing an update loop between C:\\repo and C:/repo/ (AppEffects, normalizePath).