← Back to Blog
🤖 AI-written, human-guided

CrewHub v0.19.5: Making Claude Code Agents Feel Alive

CrewHub v0.19.5: Making Claude Code Agents Feel Alive

This release focuses on one question: does the 3D world actually tell you what your agents are doing? Three bigger features answer it, plus a wave of Claude Code fixes.


Subagent Responses Now Surface

When a Claude Code agent spawns a helper, the output was previously invisible. You saw the main agent thinking but never got the subagent’s answer back.

Claude Code emits type: "progress" events for subagent output. The transcript parser already captured these as typed SubAgentProgressEvent objects — two places just were not consuming them. We wired both up. Subagent responses now show up in chat, clearly labeled.

Human-Readable Tool Activity

The 3D avatars and chat headers used to show “Using tools…” with no further detail. Was the agent reading a file? Running tests? No way to tell.

A new _humanize_tool() function turns raw tool calls into short readable descriptions:

Tool CallDisplay
Read({file_path: "/src/config.py"})Reading config.py
Bash({command: "npm test"})Running: npm test
Grep({pattern: "TODO"})Searching: TODO
Agent({description: "research auth"})Subagent: research auth

This flows through the full stack: backend, SSE, 3D bubbles, chat headers, and zen mode. The frontend patches sessions in-place so there is no full re-render on every tool call.

Pathfinding: Agents That Move With Purpose

Agents used to cluster near furniture and wander randomly. This release rewrites the movement system. Bots now use A-star patrol waypoints for purposeful wandering, soft repulsion to avoid stacking, and grid-aware spawn positions. We went through several iterations to get the feel right: the first attempt with quadratic scoring caused all bots to converge on the same direction. Uniform random selection with a dead-end filter plus animation target clamping (for bots that got stuck at wall edges near props) got it where it needed to be.


Fixes

  • Activity status persists across reloads. The get_sessions() response now includes activityDetail and activityToolName, and a localStorage cache in useSessionsStream means sessions render instantly on reload.

  • CC agents can be assigned to any room. Previously hardcoded to Headquarters. The room dropdown in Settings was also hidden for CC agents; that guard is removed.

  • Offline CC agents now appear in their room. The room panel was filtering from visibleSessions (active only) instead of allSessions, which includes synthetic entries for offline bots.

  • Subagent room inheritance fixed. Two rounds: first, a fallback to read default_room_id directly when no session_room_assignments row exists. Second, sub-agents were being assigned agent ID “main” and lacked the parent= label, so the frontend could not detect them as children. Both fixed.

  • Pin multiple agents to the top bar. pinnedKey was a single string; changed to an array with backward-compatible migration.

  • Agent creation moved into the Room panel. The “Add Agent” flow is now a shared modal with a ”+” button in the Room panel, pre-filled with that room.


Tool Calls Interleaved With Text

Previously, CC agent chat showed all tool chips grouped above a single text blob. The order was lost.

Now __TOOL__ markers are emitted through the streaming pipeline and rendered as ordered contentSegments. Tool chips and text appear in the correct sequence, both during live streaming and after history loads. Backward-compatible fallback to grouped layout for older messages.


OpenClaw sessions are untouched. No new database tables or migrations. No new API endpoints.