This release introduces significant security hardening, attachment system foundations, and enhanced configuration capabilities.
What's New
- Adds HCL configuration format support as an alternative to YAML for agent configurations
- Adds
/pausecommand to toggle the runtime loop at iteration boundaries - Adds
turn_endhook that fires once per turn regardless of how the turn ended - Adds shadow snapshots and
/undocommand for restoring file changes without modifying session transcript - Adds Anthropic Workload Identity Federation support for OIDC-derived authentication
- Adds attachment system foundations with
chat.Documentand per-provider document conversion - Adds JavaScript/WebAssembly browser build with OpenRouter PKCE support
- Adds custom request headers support for the fetch toolset with environment variable expansion
- Adds allow/deny lists for filesystem toolset to sandbox file access
- Adds wildcard and CIDR pattern support in fetch toolset domain filtering
- Adds input-shape repair layer for tool calls to handle common model mistakes
- Adds MCP embedded resource content type support
- Adds
--hook-stopCLI flag for the existing stop event - Adds
--tool-nameflag to override MCP tool identifier - Adds
--mcp-keepaliveflag for MCP server connections
Improvements
- Expands secret detection with additional patterns for OpenAI, Anthropic, Google, Stripe, Notion, GitLab, Vault, and Slack tokens
- Speeds up secret redaction with aho-corasick keyword pre-filter
- Improves markdown rendering performance with single-pass URL scanner optimizations
- Enhances session ID and install UUID forwarding on gateway-bound requests for better tracing
- Pauses animation ticks while terminal is blurred to reduce CPU usage
- Propagates non-interactive mode to child sessions and declines elicitation automatically
Bug Fixes
- Fixes crash on startup when configuration file is empty
- Fixes environment variable race in script shell tool execution
- Fixes data races on session token and message writes
- Fixes lifecycle supervisor state race condition
- Fixes infinite loop on hash-prefixed paragraphs in markdown renderer
- Fixes tab switching and chat scroll functionality while prompts are open
- Fixes compaction kept-tail mapping after prior summaries
- Fixes IPv4-mapped IPv6 SSRF bypass in fetch domain matcher
- Fixes finish_reason stop when tracking usage in OpenAI streams
- Fixes comment-only SSE events that crash openai-go client
Technical Changes
- Replaces mise with go-task as the project task runner
- Splits builtin tools into individual sub-packages for better organization
- Centralizes model-specific behavior in pkg/modelinfo package
- Tightens file and directory permissions for per-user data to 0o700/0o600
- Adds contextual logging throughout codebase for better trace correlation
- Adds 7 new architectural-sync linting cops that caught 10 real bugs
- Hardens OAuth with constant-time state comparison and SSRF protection
- Blocks non-public IPs in API and OpenAPI tools by default
- Updates jose2go to v1.7.0 to address security vulnerabilities
- Bumps various Go dependencies including Anthropic SDK, Docker CLI, and OpenTelemetry packages
What's Changed
- docs: document toon and per-toolset model routing by @dgageot in #2587
- Bump direct Go dependencies by @dgageot in #2586
- docs: update CHANGELOG.md for v1.54.0 by @docker-read-write[bot] in #2588
- Finish secret redaction by @dgageot in #2589
- simplify pkg/hooks: drop unused EventSpec abstraction by @dgageot in #2591
- lint: add 7 architectural-sync cops (catches 10 real bugs) by @dgageot in #2593
- Add turn_end hook by @rumpl in #2592
- Bump direct Go dependencies by @dgageot in #2597
- update PR review workflow with fork-supporting trigger by @derekmisler in #2596
- Use the latest rubocop-go by @dgageot in #2594
- Bump direct Go dependencies by @dgageot in #2599
- docs: fix outdated content and document missing commands by @dgageot in #2600
- Handle case when session started with Docker Desktop proxy available, and the Desktop is stopped by @gtardif in #2606
- Add /pause command to toggle the runtime loop by @dgageot in #2605
- harden docker agent serve api: warn on non-loopback, fix runtime race, block SSRF by @dgageot in #2604
- Support HCL as an alternative agent config format by @dgageot in #2598
- fetch: support wildcard and CIDR patterns in domain allow/deny lists by @dgageot in #2602
- Add detection rules for more secret formats by @dgageot in #2603
- docs: refresh outdated examples, missing env vars, and CLI options by @dgageot in #2610
- feat(hooks): expose
stophook via CLI by @tdabasinskas in #2627 - fix(session): close data races on session token and message writes by @tdabasinskas in #2622
- fix(lifecycle): order state transition before waking restart waiters by @tdabasinskas in #2621
- fix(security): bump jose2go to v1.7.0 (GO-2025-4123, GO-2023-2409) by @tdabasinskas in #2619
- fix(runtime): add OpenTelemetry tracer to runtime initialization by @tdabasinskas in #2505
- fix(tools): prevent environment variable race in script shell tool by @tdabasinskas in #2616
- feat(mcp): add support for embedded resource content type by @tdabasinskas in #2612
- docs: fix outdated and incorrect references by @dgageot in #2618
- deps: bump direct Go dependencies by @dgageot in #2609
- feat(filesystem): add allow_list / deny_list to sandbox the toolset by @dgageot in #2601
- feat(gateway): add
X-Cagent-Session-Idheader to models gateway requests by @tdabasinskas in #2631 - feat(mcp-server): add
--tool-nameflag to override the MCP tool identifier by @tdabasinskas in #2625 - feat(runtime): propagate non-interactive mode to child sessions and decline elicitation by @tdabasinskas in #2623
- feat(otel): configure W3C trace propagation for distributed tracing by @tdabasinskas in #2506
- docs: fill in missing CLI flags and fix outdated content by @dgageot in #2633
- bump direct Go dependencies by @dgageot in #2637
- feat(mcp-server): add keep-alive support by @tdabasinskas in #2624
- Fix perf regression urls by @dgageot in #2638
- docs: add HCL configuration documentation by @rumpl in #2643
- docs: fix broken links and outdated/incorrect snippets by @dgageot in #2650
- Update pr-review.yml by @derekmisler in #2648
- avoid duplicate compaction system prompt by @rumpl in #2647
- HCL: add a file() function by @rumpl in #2642
- docs(agents): expand AGENTS.md with guidelines and standards by @aheritier in #2644
- docs(github): update issue templates and triage workflow by @aheritier in #2645
- Fix finish_reason stop when tracking usage by @rumpl in #2641
- feat(tools): generic input-shape repair for tool calls (validate-then-repair) by @trungutt in #2635
- bump direct go dependencies by @dgageot in #2655
- fix: keep tab switching and chat scroll working while a prompt is open by @dgageot in #2654
- Add JS placeholders support in instructions by @dgageot in #2652
- fetch: support custom request headers by @dgageot in #2651
- feat(httpclient): forward cagent install UUID on gateway-bound requests by @dgageot in #2653
- split builtin tools into individual sub-packages by @dgageot in #2661
- chore: replace mise with go-task by @dgageot in #2659
- docs: refresh examples README by @dgageot in #2665
- tui: pause animation ticks while the terminal is blurred by @dgageot in #2668
- refactor(logging): pass context to all slog calls for correlation by @tdabasinskas in #2669
- redact_secrets: catch more token shapes and bare unquoted values by @dgageot in #2664
- fix(httpclient): drop comment-only SSE events that crash openai-go by @dgageot in #2662
- docs: refresh outdated model examples and add Chat Server page by @dgageot in #2656
- perf(secretsscan): speed up secret redaction with an aho-corasick pre-filter by @dgageot in #2667
- fix(shell): do not enforce "assisted-by" by default. by @maxcleme in #2671
- fix: stop matching category in command palette filter by @dgageot in #2673
- add js/wasm browser build with OpenRouter PKCE, agentic loop, and demo page by @dgageot in #2672
- lint: add SlogContextual cop and fix remaining bare slog calls by @dgageot in #2674
- fix(markdown): avoid infinite loop on hash-prefixed paragraphs; simplify renderer by @dgageot in #2675
- chore(deps): bump github.com/anthropics/anthropic-sdk-go from v1.40.0 to v1.41.0 by @dgageot in #2676
- Lint by @rumpl in #2678
- update PR reviewer by @derekmisler in #2680
- chore(deps): bump python-multipart from 0.0.22 to 0.0.27 in /examples/dhi/dhi_mcp_server in the pip group across 1 directory by @dependabot[bot] in #2679
- fix compaction kept-tail mapping after prior summaries by @rumpl in #2646
- use slices.Backward in CompactionInput by @dgageot in #2682
- refactor: centralize model-specific behavior in pkg/modelinfo by @dgageot in #2666
- bump github.com/docker/cli from v29.4.2 to v29.4.3 by @dgageot in #2681
- chore: tighten file/directory permissions for per-user data by @dgageot in #2663
- feat: Anthropic Workload Identity Federation by @dgageot in #2658
- security: SSRF / TOCTOU / OAuth state hardening by @dgageot in #2670
- feat: add shadow snapshots and undo by @rumpl in #2677
- feat: Phase 1 attachment system – chat.Document, pkg/attachment, per-provider convertDocument by @simonferquel-clanker in #2639
- feat: attach-time processing – transcode/resize images and resolve URLs at message add time by @simonferquel-clanker in #2685
Full Changelog: v1.54.0...v1.55.0