feat(core): publish tool.result on the bus for the activity panel

This commit is contained in:
hh
2026-08-28 17:01:00 +02:00
parent 70349e5ff4
commit 5d2ce68f6b
2 changed files with 74 additions and 0 deletions
+34
View File
@@ -29,7 +29,9 @@ from claude_agent_sdk import (
AssistantMessage,
ResultMessage,
StreamEvent,
ToolResultBlock,
ToolUseBlock,
UserMessage,
fork_session_via_store,
project_key_for_directory,
)
@@ -963,6 +965,20 @@ class Conversations:
name=block.name,
input=block.input,
)
elif isinstance(message, UserMessage):
blocks = message.content if isinstance(message.content, list) else ()
for block in blocks:
if isinstance(block, ToolResultBlock):
self._bus.publish(
"tool.result",
conversation_id=conversation_id,
turn_id=turn_id,
origin=origin,
parent_tool_use_id=parent,
tool_use_id=block.tool_use_id,
is_error=bool(block.is_error),
content=_result_preview(block.content),
)
elif isinstance(message, ResultMessage) and parent is None:
self._bus.publish(
"result",
@@ -1055,6 +1071,24 @@ def _iso(value: datetime | None) -> str | None:
return _aware(value).isoformat(timespec="seconds") if value is not None else None
def _result_preview(
content: str | list[dict[str, Any]] | None, limit: int = 400
) -> str:
"""Short text of a tool result for the panel: the transcript keeps the whole."""
if content is None:
return ""
text = (
content
if isinstance(content, str)
else "\n".join(
str(part.get("text", ""))
for part in content
if isinstance(part, dict) and part.get("type") == "text"
)
)
return text if len(text) <= limit else text[:limit] + ""
def _usage_dict(capture: TurnCapture) -> dict[str, Any] | None:
usage = capture.usage
if usage is None: