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 Call | Display |
|---|---|
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 includesactivityDetailandactivityToolName, and a localStorage cache inuseSessionsStreammeans 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 ofallSessions, which includes synthetic entries for offline bots. -
Subagent room inheritance fixed. Two rounds: first, a fallback to read
default_room_iddirectly when nosession_room_assignmentsrow exists. Second, sub-agents were being assigned agent ID “main” and lacked theparent=label, so the frontend could not detect them as children. Both fixed. -
Pin multiple agents to the top bar.
pinnedKeywas 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.