v1.16.22

stackblitz-labs/bolt.diyv1.16.22Sep 28, 2026by github-actions[bot]

Upgrading?

AI Summary

This release introduces stricter web server security regarding host binding and a new approval workflow for repository worktree hooks to ensure script integrity. It also includes security hardening and improvements to the test suite.

Key Highlights

  • Web server security tightened: Only specific hostnames are allowed by default; reverse proxy/Tailscale users must configure `allowed_hosts` to prevent 421 errors.
  • New worktree hook approval system: Hooks are now verified by SHA256, resolved path, and execution mode, requiring user confirmation via a new TUI dialog or CLI command.
  • Security hardening: Input validation improved for CLI JSON, tmux arguments, and conductor names to prevent potential exploits.
  • Cookie security: The `?token=` URL parameter now sets HttpOnly, SameSite=Strict cookies for better session management.

Breaking Changes

  • Web Server Host Access: The web server now strictly binds to localhost and specific interface addresses. Accessing via reverse proxy or Tailscale Serve without configuring `[web] allowed_hosts` will result in a 421 error.
  • Hook Approval Data Loss: Approvals recorded in versions prior to 1.16.21 did not include the interpreter or resolved path. Consequently, hooks approved before this version will be re-queried for approval on their next execution.
  • Default Hook Behavior: The default behavior for repository worktree hooks has changed from 'run without asking' to 'skip and require approval'. Users must explicitly approve hooks using the new `trust-hooks` command or configuration options to restore the previous behavior.

New Features

  • New `trust-hooks` command (formerly `trust-scripts`) to approve worktree hooks via CLI.
  • TUI dialog for approving worktree hooks, displaying repository, hook details, SHA256, and execution context.
  • Per-server idle timeout option for the daemon.

Full Release Notes


- **Upgrading:** if you reach `agent-deck web` through a reverse proxy or Tailscale Serve, add its host name to `[web] allowed_hosts` before upgrading (or pass `--allowed-host`); otherwise the web UI answers it with 421.
- **Upgrading:** approvals recorded by 1.16.21 and earlier did not include the interpreter or resolved path, so each hook you approved before is asked about once more on its next run. Hooks that ran under `"always"` are unaffected.

### Changed

- The web server now only answers requests addressed to its own host names: localhost, loopback addresses, its listen address, its machine name when bound to a network interface, and on a wildcard bind the machine's current interface addresses. Add other names with `[web] allowed_hosts` or `--allowed-host` (repeatable; an entry with a port permits only that port). Any other host gets 421 with a hint naming both settings. A visit with `?token=` now stores an HttpOnly, SameSite=Strict cookie, so reloads keep working with `--token-file`. Thanks to @bautrey for the report.
- Repository worktree hooks (`.agent-deck/worktree-setup.sh`, `.agent-deck/worktree-destruction.sh`) now need an approval that is bound to the whole script identity: its sha256, its resolved path (symlinks followed) and how it runs (directly via its `#!` line, or `sh -e`). The first run and every change now ask: the TUI shows a dialog with the repository, the hook, the command, the sha256 and the first 20 lines (Run once / Always trust this version / Skip); a terminal CLI shows the same and asks `[o]nce / [a]lways / [N]o`; with no terminal (scripts, CI, remote, web UI requests) the hook is skipped with a one-line notice naming `agent-deck worktree trust-hooks <repo> --hook setup|destruction`. `trust-hooks` (formerly `trust-scripts`, which still works) prints each hook before approving it, asks y/N on a terminal and needs `--yes` otherwise. `--run-hooks` (formerly `--allow-repo-scripts`, which still works) runs unapproved hooks once after printing their sha256; add `--trust` to record that version. `[worktree] run_repo_scripts = "always"` keeps the old run-without-asking behavior and is only safe if you own every repository you open. The README now says plainly that creating or removing a worktree does not approve its hooks. Thanks to @glmgbj233 for the report.
- Web test tooling: vitest bumped to 4.1.11.

### Fixed

- Hardened a few input edges: CLI JSON errors no longer preallocate from caller-supplied field counts, the tmux argument builder checks its size limit before copying either argument form, OpenClaw gateway details are printed without control characters, and conductor names are checked to be a single directory name before they are used as paths.

### Internal

- Two CI test flakes are gone. The daemon now waits for a subscription's stream goroutine before `Serve` returns, and its idle timeout is a per-server option instead of a package variable, so a test's cleanup no longer races a stream still running. `TestSessionStartQueuesWhenGroupAtCap` no longer depends on a tmux probe finishing within 2s on a loaded runner, and it uses a fresh profile per run.

Related Repositories