soothe-cli 0.7.8__tar.gz → 0.7.10__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/PKG-INFO +1 -1
  2. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/runtime/policy/display_policy.py +3 -3
  3. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/textual_adapter.py +65 -39
  4. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/.gitignore +0 -0
  5. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/README.md +0 -0
  6. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/pyproject.toml +0 -0
  7. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/__init__.py +0 -0
  8. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/cli/__init__.py +0 -0
  9. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/cli/commands/__init__.py +0 -0
  10. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/cli/commands/autopilot_cmd.py +0 -0
  11. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/cli/commands/config_cmd.py +0 -0
  12. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/cli/commands/cron_cmd.py +0 -0
  13. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/cli/commands/loop_cmd.py +0 -0
  14. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/cli/commands/run_cmd.py +0 -0
  15. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/cli/commands/status_cmd.py +0 -0
  16. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/cli/execution/__init__.py +0 -0
  17. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/cli/execution/daemon.py +0 -0
  18. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/cli/execution/daemon_errors.py +0 -0
  19. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/cli/execution/headless.py +0 -0
  20. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/cli/execution/headless_renderer.py +0 -0
  21. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/cli/execution/launcher.py +0 -0
  22. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/cli/main.py +0 -0
  23. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/config/__init__.py +0 -0
  24. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/config/cli_config.py +0 -0
  25. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/config/loader.py +0 -0
  26. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/config/logging_setup.py +0 -0
  27. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/runtime/__init__.py +0 -0
  28. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/runtime/headless/processor.py +0 -0
  29. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/runtime/headless/processor_state.py +0 -0
  30. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/runtime/parse/message_processing.py +0 -0
  31. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/runtime/parse/tool_call_resolution.py +0 -0
  32. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/runtime/parse/tool_result.py +0 -0
  33. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/runtime/policy/essential_events.py +0 -0
  34. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/runtime/policy/tui_trace_log.py +0 -0
  35. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/runtime/presentation/duration_format.py +0 -0
  36. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/runtime/presentation/engine.py +0 -0
  37. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/runtime/presentation/renderer_base.py +0 -0
  38. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/runtime/presentation/renderer_protocol.py +0 -0
  39. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/runtime/presentation/subagent_task_display.py +0 -0
  40. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/runtime/state/file_tracker.py +0 -0
  41. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/runtime/state/session_stats.py +0 -0
  42. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/runtime/state/step_router.py +0 -0
  43. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/runtime/state/stream_accumulator.py +0 -0
  44. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/runtime/state/transcript.py +0 -0
  45. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/runtime/transport/session.py +0 -0
  46. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/runtime/turn/pipeline.py +0 -0
  47. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/runtime/turn/prepare.py +0 -0
  48. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/runtime/wire/chunk_filter.py +0 -0
  49. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/runtime/wire/message_text.py +0 -0
  50. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/runtime/wire/messages.py +0 -0
  51. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/__init__.py +0 -0
  52. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/_cli_context.py +0 -0
  53. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/_env_vars.py +0 -0
  54. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/_version.py +0 -0
  55. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/app/__init__.py +0 -0
  56. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/app/_app.py +0 -0
  57. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/app/_execution.py +0 -0
  58. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/app/_history.py +0 -0
  59. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/app/_messages_mixin.py +0 -0
  60. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/app/_model.py +0 -0
  61. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/app/_module_init.py +0 -0
  62. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/app/_startup.py +0 -0
  63. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/app/_ui.py +0 -0
  64. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/app/app.tcss +0 -0
  65. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/binding.py +0 -0
  66. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/command_registry.py +0 -0
  67. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/commands/__init__.py +0 -0
  68. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/commands/command_router.py +0 -0
  69. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/commands/slash_commands.py +0 -0
  70. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/commands/subagent_routing.py +0 -0
  71. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/config.py +0 -0
  72. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/file_change_notify.py +0 -0
  73. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/file_change_renderers.py +0 -0
  74. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/hooks.py +0 -0
  75. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/input.py +0 -0
  76. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/markdown_theme.py +0 -0
  77. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/media_utils.py +0 -0
  78. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/model_config.py +0 -0
  79. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/path_utils.py +0 -0
  80. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/preview_limits.py +0 -0
  81. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/project_utils.py +0 -0
  82. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/sessions.py +0 -0
  83. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/shell_color.py +0 -0
  84. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/skills/__init__.py +0 -0
  85. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/skills/invocation.py +0 -0
  86. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/skills/load.py +0 -0
  87. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/spinner_labels.py +0 -0
  88. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/theme.py +0 -0
  89. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/tips.py +0 -0
  90. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/tool_display.py +0 -0
  91. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/unicode_security.py +0 -0
  92. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/update_check.py +0 -0
  93. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/__init__.py +0 -0
  94. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/_links.py +0 -0
  95. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/autocomplete.py +0 -0
  96. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/chat_input.py +0 -0
  97. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/clipboard.py +0 -0
  98. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/context_viewer.py +0 -0
  99. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/diff.py +0 -0
  100. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/editor.py +0 -0
  101. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/file_change_preview.py +0 -0
  102. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/help_screen.py +0 -0
  103. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/history.py +0 -0
  104. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/loading.py +0 -0
  105. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/loop_selector.py +0 -0
  106. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/mcp_viewer.py +0 -0
  107. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/message_store.py +0 -0
  108. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/messages/__init__.py +0 -0
  109. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/messages/_helpers.py +0 -0
  110. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/messages/app.py +0 -0
  111. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/messages/assistant.py +0 -0
  112. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/messages/clarification.py +0 -0
  113. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/messages/cognition_goal_tree.py +0 -0
  114. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/messages/cognition_reason.py +0 -0
  115. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/messages/cognition_step.py +0 -0
  116. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/messages/cognition_step_activity.py +0 -0
  117. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/messages/cognition_subagent.py +0 -0
  118. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/messages/diff_message.py +0 -0
  119. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/messages/error.py +0 -0
  120. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/messages/skill.py +0 -0
  121. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/messages/user.py +0 -0
  122. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/model_selector.py +0 -0
  123. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/notification_settings.py +0 -0
  124. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/plan_quick_view_overlay.py +0 -0
  125. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/status.py +0 -0
  126. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/theme_selector.py +0 -0
  127. {soothe_cli-0.7.8 → soothe_cli-0.7.10}/src/soothe_cli/tui/widgets/welcome.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: soothe-cli
3
- Version: 0.7.8
3
+ Version: 0.7.10
4
4
  Summary: Soothe CLI client - communicates with daemon via WebSocket
5
5
  Project-URL: Homepage, https://github.com/mirasoth/soothe
6
6
  Project-URL: Documentation, https://soothe.readthedocs.io
@@ -134,9 +134,9 @@ class DisplayPolicy:
134
134
  """Check if this is a plan-related event."""
135
135
  return event_type.startswith("soothe.cognition.plan.")
136
136
 
137
- def is_deep_research_event(self, event_type: str) -> bool:
138
- """Check if this is a Deep Research subagent event."""
139
- return event_type.startswith("soothe.subagent.deep_research.")
137
+ def is_subagent_wire_event(self, event_type: str) -> bool:
138
+ """Check if this is a curated subagent wire event."""
139
+ return event_type.startswith("soothe.subagent.")
140
140
 
141
141
  def is_internal_event(self, event_type: str) -> bool:
142
142
  """Check if this is an internal (never-shown) event."""
@@ -52,6 +52,11 @@ from soothe_sdk.ux.loop_stream import (
52
52
  is_stream_terminal,
53
53
  )
54
54
  from soothe_sdk.ux.stream_tool_wire import STREAM_TOOL_CALL_UPDATE, TOOL_CALL_UPDATES_BATCH
55
+ from soothe_sdk.ux.subagent_wire_display import (
56
+ SubagentWireRenderKind,
57
+ classify_subagent_wire_render,
58
+ subagent_wire_row_params,
59
+ )
55
60
  from soothe_sdk.ux.task_namespace import (
56
61
  TaskScope,
57
62
  is_inner_subgraph_task_tool_id,
@@ -951,34 +956,6 @@ def _ingest_wire_step_on_subagent_card(
951
956
  subagent_card.set_tool_success(row_id, "", duration_ms=duration_ms)
952
957
 
953
958
 
954
- def _subagent_wire_step_params(
955
- event_type: str,
956
- data: dict[str, Any],
957
- ) -> tuple[str, dict[str, Any], str, int] | None:
958
- """Map curated subagent wire events to SubAgent card row fields."""
959
- et = str(event_type or "").strip()
960
- if et.endswith(".gather.summary"):
961
- query = str(data.get("query_preview", "") or "").strip()
962
- rc = int(data.get("result_count", 0) or 0)
963
- st = int(data.get("sources_touched", 0) or 0)
964
- preview = query
965
- if rc or st:
966
- tail = f"{rc} hits, {st} sources"
967
- preview = f"{query} → {tail}" if query else tail
968
- return "WebSearch", {"query": preview or query}, "success", 0
969
- if et.endswith(".step.completed"):
970
- tool_name = str(data.get("tool_name", "") or "").strip() or "Step"
971
- args_preview = str(data.get("args_preview", "") or "").strip()
972
- status = str(data.get("status", "done") or "done").strip().lower()
973
- phase = "success" if status in ("done", "success", "complete") else "running"
974
- if status in ("error", "failed"):
975
- phase = "error"
976
- duration_ms = int(data.get("duration_ms", 0) or 0)
977
- args = {"preview": args_preview} if args_preview else {}
978
- return tool_name, args, phase, duration_ms
979
- return None
980
-
981
-
982
959
  def _apply_subagent_wire_step_event(
983
960
  adapter: TextualUIAdapter,
984
961
  *,
@@ -986,8 +963,8 @@ def _apply_subagent_wire_step_event(
986
963
  data: dict[str, Any],
987
964
  task_scope: TaskScope,
988
965
  ) -> bool:
989
- """Render ``*.step.completed`` / ``*.gather.summary`` on the SubAgent (TASK) card."""
990
- params = _subagent_wire_step_params(event_type, data)
966
+ """Render row-style subagent wire events on the SubAgent (TASK) card."""
967
+ params = subagent_wire_row_params(event_type, data)
991
968
  if params is None:
992
969
  return False
993
970
  tool_name, args, phase, duration_ms = params
@@ -1011,6 +988,29 @@ def _apply_subagent_wire_step_event(
1011
988
  return True
1012
989
 
1013
990
 
991
+ def _apply_subagent_wire_activity_event(
992
+ adapter: TextualUIAdapter,
993
+ *,
994
+ event_type: str,
995
+ data: dict[str, Any],
996
+ task_scope: TaskScope,
997
+ ) -> bool:
998
+ """Render note-style subagent wire events on the SubAgent card."""
999
+ from soothe_sdk.ux.subagent_progress import summarize_subagent_wire_activity
1000
+
1001
+ line = summarize_subagent_wire_activity(str(event_type or "").strip(), data).strip()
1002
+ if not line:
1003
+ return False
1004
+ step_id = task_scope_step_id(task_scope)
1005
+ if not step_id:
1006
+ return True
1007
+ subagent_card = _ensure_subagent_card_for_task_scope(adapter, task_scope)
1008
+ if subagent_card is None:
1009
+ return True
1010
+ subagent_card.append_subagent_activity(line)
1011
+ return True
1012
+
1013
+
1014
1014
  def _apply_subagent_wire_lifecycle_event(
1015
1015
  adapter: TextualUIAdapter,
1016
1016
  *,
@@ -1021,7 +1021,7 @@ def _apply_subagent_wire_lifecycle_event(
1021
1021
  """Handle subagent ``*.completed`` / ``*.failed`` wire events (RFC-628, IG-513)."""
1022
1022
  et = str(event_type or "").strip()
1023
1023
  if not (et.endswith(".completed") or et.endswith(".failed")):
1024
- return True
1024
+ return False
1025
1025
  step_id = task_scope_step_id(task_scope)
1026
1026
  task_idx = task_scope_task_idx(task_scope, step_id)
1027
1027
  card = adapter._subagent_cards_by_key.get(_subagent_registry_key(step_id, task_idx))
@@ -1048,6 +1048,39 @@ def _apply_subagent_wire_lifecycle_event(
1048
1048
  return True
1049
1049
 
1050
1050
 
1051
+ def _route_subagent_wire_event(
1052
+ adapter: TextualUIAdapter,
1053
+ *,
1054
+ event_type: str,
1055
+ data: dict[str, Any],
1056
+ task_scope: TaskScope,
1057
+ ) -> bool:
1058
+ """Route a curated subagent wire event to the unified display protocol handlers."""
1059
+ kind = classify_subagent_wire_render(event_type)
1060
+ if kind is SubagentWireRenderKind.ACTIVITY_ROW:
1061
+ return _apply_subagent_wire_step_event(
1062
+ adapter,
1063
+ event_type=event_type,
1064
+ data=data,
1065
+ task_scope=task_scope,
1066
+ )
1067
+ if kind is SubagentWireRenderKind.ACTIVITY_NOTE:
1068
+ return _apply_subagent_wire_activity_event(
1069
+ adapter,
1070
+ event_type=event_type,
1071
+ data=data,
1072
+ task_scope=task_scope,
1073
+ )
1074
+ if kind is SubagentWireRenderKind.LIFECYCLE_END:
1075
+ return _apply_subagent_wire_lifecycle_event(
1076
+ adapter,
1077
+ event_type=event_type,
1078
+ data=data,
1079
+ task_scope=task_scope,
1080
+ )
1081
+ return False
1082
+
1083
+
1051
1084
  def _route_subgraph_tool_call(
1052
1085
  adapter: TextualUIAdapter,
1053
1086
  router: StepTaskRouter,
@@ -4172,20 +4205,13 @@ async def execute_task_textual(
4172
4205
  and event_type.startswith("soothe.subagent.")
4173
4206
  and is_allowlisted_subagent_event_type(event_type)
4174
4207
  ):
4175
- if _apply_subagent_wire_step_event(
4208
+ if _route_subagent_wire_event(
4176
4209
  adapter,
4177
4210
  event_type=event_type,
4178
4211
  data=data,
4179
4212
  task_scope=task_scope,
4180
4213
  ):
4181
4214
  continue
4182
- _apply_subagent_wire_lifecycle_event(
4183
- adapter,
4184
- event_type=event_type,
4185
- data=data,
4186
- task_scope=task_scope,
4187
- )
4188
- continue
4189
4215
  finally:
4190
4216
  await ui_coalesce.after_chunk()
4191
4217
 
File without changes
File without changes
File without changes