Releases: 23blocks-OS/ai-maestro
v0.35.54
Reverted
- Terminal: revert headless xterm.js and parallel addon loading (v0.35.52–v0.35.53) — The headless xterm.js approach (server-side serialized terminal state) caused terminal initialization failures, broken scrolling, and multi-minute load times on agent switch. Reverted
server.mjs,useTerminal.ts, andTerminalView.tsxto the stable v0.35.50 behavior (tmux capture-pane for history, sequential addon loading, blocking WebGL init). Dependencies (node-pty 1.1.0, ws 8.21.0) remain updated.
Full Changelog: v0.35.50...v0.35.54
v0.35.31 — Agent Scheduling, Terminal Stability, Chat Path Fix
What's New
Agent Scheduling System
Cron-based task scheduling for agents. Create schedules with standard cron expressions, and AI Maestro will wake agents (spawn tmux session + launch Claude Code) and send them prompts on schedule. Schedules stored in ~/.aimaestro/schedules.json, checked every 60s.
API:
GET/POST /api/agents/{id}/schedules— List/create schedules for an agentGET/PATCH/DELETE /api/agents/{id}/schedules/{scheduleId}— Manage individual schedulesGET /api/schedules— Global schedule list with execution historyPOST /api/schedules/{id}/trigger— Manual or webhook trigger
Auto-Recovering Circuit Breaker
Remote hosts no longer get permanently disabled when temporarily unreachable. The circuit breaker now uses a half-open pattern with exponential backoff (30s → 5min cap). Hosts auto-recover on the next UI poll when cooldown expires. hosts.json is never modified by the circuit breaker.
Container Hardening
Agent Docker containers now launch with --cap-drop=ALL (selective --cap-add), --security-opt no-new-privileges, and --tmpfs /tmp:noexec,nosuid. New GET /api/docker/stats endpoint for real-time CPU/memory/network metrics per container.
Bug Fixes
- Terminal resize storm — Eliminated 4+ overlapping resize triggers (onOpen, history-complete, ResizeObserver, notes toggle) that caused terminal content to jump, rewrite, and leave users mid-page. PTY now spawns at correct dimensions; resize messages only sent on real user actions (browser window drag, notes panel toggle). WebSocket stays connected across Terminal ↔ Chat tab switches.
- Chat view empty for agents with underscores in path — Claude Code converts both
/and_to-in project directory names, but our JSONL path resolution only replaced/. Agents likerag_ingestioncouldn't find their conversation files. Fixed in all 3 locations. - Circuit breaker permanently disabling remote hosts — Replaced permanent
enabled: falsewith in-memory half-open state that auto-recovers. - Reactivate endpoint rejecting circuit-broken hosts — Now handles both
enabled: falseand in-memory circuit-broken hosts.
Stats
v0.35.14 - Call Session Fork, Trust Levels, Remote Terminal Fix
What's New
Call Mode Session Fork
When a companion voice call starts, the server auto-spawns a temporary YOLO tmux session ({agentName}__call) with --permission-mode bypassPermissions. Voice transcripts route to this autonomous fork instead of the primary supervised session, so tool-call permission prompts don't block conversational flow. The session is killed when the last companion client disconnects.
Trust Level / Permission Mode
- Each permission mode now shows clear descriptions explaining what it does and when to use it
- Permission mode selector only appears when waking Claude Code agents (hidden for Aider, Codex, Cursor, Terminal)
- Modes reordered from most restrictive to least: Supervised → Plan Only → Trust Edits → Smart Auto → Full Autonomy
Bug Fixes
- Remote terminal blank screen — Fixed WebSocket proxy not forwarding
cols,rows, andsocketquery parameters to remote hosts and cloud containers. Remote PTY was spawning at default 80x24 instead of the client's actual terminal dimensions. - Command injection risk — Replaced all
execSyncshell-string tmux commands withexecFileSync/execFile(array args, no shell) - Event loop blocking — Transcript routing now uses async
execFileinstead of blockingexecSync - Voice buffer timing race — Changed
getBuffer()togetOrCreateBuffer()for voice subsystem attachment __callsessions leaking into agent discovery — AddedisCallSession()filter to both session and agent discovery paths
Tests
- 12 new unit tests for call session helpers and filtering (792 total)
- New integration test script:
scripts/test-call-session.sh
v0.35.0 — WebSocket Chat, Cloud Deployment, Meeting Improvements
WebSocket-Driven Chat (Real-Time Signal Stream)
Replaced the 5-second file-polling chat system with a real-time WebSocket architecture. Chat now shows agent activity (tool use, permissions, thinking) instantly instead of lagging behind the terminal.
- New
chat:*protocol multiplexed on the existing/termWebSocket endpoint - Chat-only WebSocket connections via
/term?name=X&chatOnly=1(lightweight, no PTY) - Server-side JSONL file watcher with incremental reads (no more client polling)
- Permission prompts appear within 500ms (was 5s+ with polling)
- Desktop, mobile, and tablet views all use WebSocket chat
- Pending message bubbles with optimistic UI
- Visibility API reconnection on mobile tab switch
Cloud Deployment (AWS)
Full AWS cloud deployment support for running agents on EC2 and ECS.
- EC2 native install with automated user_data bootstrap
- ECS auto-build with Dockerfile and Terraform configs
- Agent Creation Wizard with cloud deployment options
- Container image with agent-server.js for remote agent management
- WebSocket routing through cloud infrastructure
Meeting Improvements
- Inject queue with hybrid dispatch and bracketed paste support
- Meeting stability fixes and discovery reorder
- Hook reliability improvements
- Meeting task CLI script
Cherry-Picked Fixes
- sendKeys split: literal + Enter as separate calls with 100ms delay
- Hostname resilience for cloud environments
- Hibernate heartbeat fix
- Avatar strip rendering fix
- AMP canonical JSON serialization
- Hosts logging improvements
Test Coverage
755 tests passing (up from 281). New test suites:
- container-utils (209 tests)
- agents-docker-service (1589 tests)
- meeting-inject-queue (179 tests)
- meeting-inject-utils (54 tests)
- amp-canonical-json (103 tests)
82 files changed, 10,883 insertions, 871 deletions
Full changelog: https://github.com/23blocks-OS/ai-maestro/blob/main/CHANGELOG.md
v0.29.15 — Fix hibernate/standalone conflict
Bug Fix
Hibernated agents incorrectly shown as standalone — Agents with tmux session history (like Raine) were being classified as "standalone" when they had a recent heartbeat but no active tmux session. This caused the UI to show "Standalone Agent — no terminal view" instead of the hibernation screen with the Wake button.
What changed
- Standalone classification now requires no session history in the agent registry
- Heartbeats only mark agents as "online" for truly standalone agents
- Legacy
/api/sessionsendpoint also fixed
Impact
All registered agents that were hibernated now correctly show the Wake button again.
v0.29.14 — Ecosystem Narrative
The Agent Ecosystem
Introduces the Agent Formula — a clear narrative explaining how the 6 components of the 23blocks agent ecosystem work together:
Complete Agent = Personality (WHO) + Capabilities (HOW) + Identity (TRUST) + Communication (TALK)
What's New
docs/ECOSYSTEM.md— Canonical reference for how AI Maestro, Agent Library (150+ personalities), Plugin Builder, AID, and AMP fit togetherdocs/ecosystem.html— New docs site page with visual dimension cards, assembly flow, and "Build Your First Agent Team" walkthrough- Ecosystem section in README — Four-dimension table after "Meet Lola"
- Plugin Builder — Added personality cross-references, "Combine Personalities + Skills" section, and example manifest with all 15 agency-agents divisions
- Navigation — ECOSYSTEM link added to all 17 docs site pages
- Companion components — Extracted CompanionInput, FloatingVoiceSettings, MobileCallOverlay into standalone components
- GitHub metadata — Updated repo descriptions and topics
The Formula
| Dimension | Component | |
|---|---|---|
| WHO | Personality | Agent Library (150+) |
| HOW | Capabilities | Plugin Builder |
| TRUST | Identity | AID |
| TALK | Communication | AMP |
AI Maestro is the stage. Pick personalities, give them skills, and run them from one dashboard.
v0.29.0 — Unified API Error Format
Highlights
Every API error response across the codebase now follows the AMP protocol format — one consistent, structured shape for all 106 route handlers.
Before: inconsistent error shapes across ~280 services ({ error: 'Human text' }) vs structured AMP routes ({ error: 'code', message: '...', field?, details? }).
After: one shape everywhere.
{ "error": "missing_field", "message": "name is required", "field": "name" }What changed
Added
services/service-errors.ts— single source of truth forServiceResult<T>,ServiceError, andServiceErrorCode(30 codes: AMP's 18 + 12 generic). Ships 20+ factory functions (missingField,notFound,operationFailed,alreadyExists,gone,invalidState, etc.) and validation helpers (requireString,requireArray,requireNameFormat).app/api/_helpers.ts—toResponse()turns anyServiceResultinto aNextResponsewith consistent error formatting.
Changed
- 25 service files migrated to shared
ServiceResultand factories (~305 error returns standardized). - 88 route files converted to thin wrappers:
return toResponse(result). - 25 component files updated to read
data.message || data.errorfor backward-compatible error display. - 5 test files updated (49 assertions now match structured
ServiceErrorshape). lib/types/amp.tsrefactored:AMPErrorCodeis nowExtract<ServiceErrorCode, ...>,AMPError extends ServiceError.AMPNameTakenErrorinterface corrected to match runtime shape (details.suggestions).services/headless-router.ts—sendServiceResult()mirrorstoResponse()for headless mode.
Fixed
preconditionFailed()factory now returns 412 (was 400).lookupAgentByNameandlookupAgentByDirectoryNamecatch blocks now propagate real errors viaoperationFailed()instead of silently returning{ exists: false }/{ found: false }with a 500 status.toResponse()defensive fallback preserves caller's 4xx status instead of always overriding to 500.
Stats
- 154 files changed (+1,365 / -1,977 = net −612 lines) despite adding the new foundation
- 545/545 tests passing
- Build + lint pass on Node 20 and 22
Credits
Huge thanks to @mvillmow for the original issue (#285) that identified the duplication across route handlers. The analysis revealed an even deeper opportunity — the underlying error contract itself was inconsistent — and this release addresses the root cause.
PR
- #327 — feat: unify API errors to AMP format
Closes #285
v0.26.5 — Auto-install Status Line
Added
- Auto-install Claude Code status line —
install-plugin.shnow configures the AMP status line automatically, showing agent identity and unread message count in Claude Code's footer. Idempotent and reversible viaamp-statusline.sh --uninstall.
v0.26.4 — AMP Mesh Routing Fix
Fixed
- AMP mesh routing restored —
amp-send.shwas incorrectly using filesystem delivery for remote agents after message migration created local directories. Now checks forconfig.jsonto distinguish real local agents from migration-created inbox directories. - AMP fetch URL fix —
amp-fetch.shwas missing/v1/prefix on fetch and acknowledge endpoints, causing 404s against external providers. - AMP message ID timestamps —
generate_message_id()now uses seconds-precision timestamps per AMP spec.
v0.26.3 — AID v0.2.0: Independent from AMP
Agent Identity v0.2.0 — Fully Independent
AID no longer requires AMP to be installed. Agents can now authenticate with OAuth 2.0 servers using just AID alone.
What's new
aid-init— Standalone identity initialization (noamp-initneeded)aid-helper— Self-contained helper with OpenSSL auto-detection, Ed25519 signing- All
aid-*scripts are now self-sufficient
Interoperability
If both AMP and AID are installed, they share ~/.agent-messaging/agents/ — one Ed25519 identity serves both protocols. Neither requires the other.
Numbers
- Plugin: 7 skills, 50 scripts (was 48)
Full Changelog: v0.26.2...v0.26.3