@dxos/plugin-assistant 0.8.4-staging.60fe92afc8 → 0.9.1-main.c7dcc2e112

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 (254) hide show
  1. package/dist/lib/neutral/{AgentArticle-K7XM46OQ.mjs → AgentArticle-2BEPWUMN.mjs} +9 -7
  2. package/dist/lib/neutral/AgentArticle-2BEPWUMN.mjs.map +7 -0
  3. package/dist/lib/neutral/AssistantPlugin.mjs +1 -1
  4. package/dist/lib/neutral/{AssistantSettings-GG52BLKS.mjs → AssistantSettings-7ALY4BMS.mjs} +3 -3
  5. package/dist/lib/neutral/AssistantSettings-7ALY4BMS.mjs.map +7 -0
  6. package/dist/lib/neutral/{ChatArticle-VNVZCDUR.mjs → ChatArticle-KT46SUFU.mjs} +2 -2
  7. package/dist/lib/neutral/{ChatCompanion-LBUHYWQG.mjs → ChatCompanion-YHC43RYQ.mjs} +4 -4
  8. package/dist/lib/neutral/ChatCompanion-YHC43RYQ.mjs.map +7 -0
  9. package/dist/lib/neutral/{ChatDialog-DCA6FLOV.mjs → ChatDialog-YZDZLIQA.mjs} +5 -4
  10. package/dist/lib/neutral/ChatDialog-YZDZLIQA.mjs.map +7 -0
  11. package/dist/lib/neutral/{PlanArticle-TS5ULWYS.mjs → PlanArticle-VPK2IYWU.mjs} +8 -2
  12. package/dist/lib/neutral/PlanArticle-VPK2IYWU.mjs.map +7 -0
  13. package/dist/lib/neutral/{RoutineArticle-5NYXHRG6.mjs → RoutineArticle-FK5BXQN5.mjs} +3 -3
  14. package/dist/lib/neutral/RoutineArticle-FK5BXQN5.mjs.map +7 -0
  15. package/dist/lib/neutral/SpaceHomePrompt-HTWQKLGI.mjs +113 -0
  16. package/dist/lib/neutral/SpaceHomePrompt-HTWQKLGI.mjs.map +7 -0
  17. package/dist/lib/neutral/SpaceHomeSuggestions-6G4E7GNJ.mjs +50 -0
  18. package/dist/lib/neutral/SpaceHomeSuggestions-6G4E7GNJ.mjs.map +7 -0
  19. package/dist/lib/neutral/TracePanel-T552TAOH.mjs +12 -0
  20. package/dist/lib/neutral/TracePanel-T552TAOH.mjs.map +7 -0
  21. package/dist/lib/neutral/{TriggerStatus-X7Y5JFZJ.mjs → TriggerStatus-RBOHHDOK.mjs} +3 -3
  22. package/dist/lib/neutral/TriggerStatus-RBOHHDOK.mjs.map +7 -0
  23. package/dist/lib/neutral/{agent-service-WCAP5MLI.mjs → agent-service-WV5CSHAG.mjs} +4 -2
  24. package/dist/lib/neutral/{agent-service-WCAP5MLI.mjs.map → agent-service-WV5CSHAG.mjs.map} +3 -3
  25. package/dist/lib/neutral/{app-graph-builder-WUFHQH3Y.mjs → app-graph-builder-PTSRZXRN.mjs} +13 -13
  26. package/dist/lib/neutral/app-graph-builder-PTSRZXRN.mjs.map +7 -0
  27. package/dist/lib/neutral/{blueprint-definition-MH2QLYQH.mjs → blueprint-definition-2XPYI35X.mjs} +4 -3
  28. package/dist/lib/neutral/blueprint-definition-2XPYI35X.mjs.map +7 -0
  29. package/dist/lib/neutral/capabilities/index.mjs +8 -8
  30. package/dist/lib/neutral/capabilities/index.mjs.map +2 -2
  31. package/dist/lib/neutral/{chunk-HLANPOBA.mjs → chunk-35EL65O4.mjs} +3 -3
  32. package/dist/lib/neutral/chunk-35EL65O4.mjs.map +7 -0
  33. package/dist/lib/neutral/chunk-54W7N6M6.mjs +445 -0
  34. package/dist/lib/neutral/chunk-54W7N6M6.mjs.map +7 -0
  35. package/dist/lib/neutral/{chunk-YXRGZYYH.mjs → chunk-5KB2WRI2.mjs} +6 -6
  36. package/dist/lib/neutral/chunk-5KB2WRI2.mjs.map +7 -0
  37. package/dist/lib/neutral/{TracePanel-KTZJ6JNR.mjs → chunk-5LKNH7FD.mjs} +5 -20
  38. package/dist/lib/neutral/chunk-5LKNH7FD.mjs.map +7 -0
  39. package/dist/lib/neutral/{chunk-SMFJD7BP.mjs → chunk-7FQT4XMI.mjs} +2 -2
  40. package/dist/lib/neutral/{chunk-RKVVK3R3.mjs → chunk-H77JTXAN.mjs} +17 -9
  41. package/dist/lib/neutral/chunk-H77JTXAN.mjs.map +7 -0
  42. package/dist/lib/neutral/{chunk-QAZMOFPI.mjs → chunk-IQZJ5TTM.mjs} +4 -4
  43. package/dist/lib/neutral/chunk-IQZJ5TTM.mjs.map +7 -0
  44. package/dist/lib/neutral/chunk-ZNDQVYUN.mjs +53 -0
  45. package/dist/lib/neutral/chunk-ZNDQVYUN.mjs.map +7 -0
  46. package/dist/lib/neutral/components/index.mjs +296 -109
  47. package/dist/lib/neutral/components/index.mjs.map +3 -3
  48. package/dist/lib/neutral/containers/index.mjs +12 -8
  49. package/dist/lib/neutral/containers/index.mjs.map +3 -3
  50. package/dist/lib/neutral/{create-chat-SGGQ6HVN.mjs → create-chat-Z3FNA6OJ.mjs} +2 -2
  51. package/dist/lib/neutral/{create-chat-SGGQ6HVN.mjs.map → create-chat-Z3FNA6OJ.mjs.map} +2 -2
  52. package/dist/lib/neutral/{create-object-U2SOFZLR.mjs → create-object-BJUDDKQQ.mjs} +2 -2
  53. package/dist/lib/neutral/execution-graph/index.mjs +156 -0
  54. package/dist/lib/neutral/execution-graph/index.mjs.map +4 -4
  55. package/dist/lib/neutral/{fork-chat-34KEF4ZJ.mjs → fork-chat-UYXYT6BT.mjs} +4 -4
  56. package/dist/lib/neutral/fork-chat-UYXYT6BT.mjs.map +7 -0
  57. package/dist/lib/neutral/hooks/index.mjs +233 -438
  58. package/dist/lib/neutral/hooks/index.mjs.map +4 -4
  59. package/dist/lib/neutral/index.mjs +3 -3
  60. package/dist/lib/neutral/markdown-extension-IJ5RQMQ4.mjs +126 -0
  61. package/dist/lib/neutral/markdown-extension-IJ5RQMQ4.mjs.map +7 -0
  62. package/dist/lib/neutral/meta.json +1 -1
  63. package/dist/lib/neutral/meta.mjs +1 -1
  64. package/dist/lib/neutral/operations/index.mjs +1 -1
  65. package/dist/lib/neutral/plugin.mjs +2 -2
  66. package/dist/lib/neutral/{react-surface-XRTBW5OJ.mjs → react-surface-ES7UHZ65.mjs} +29 -17
  67. package/dist/lib/neutral/react-surface-ES7UHZ65.mjs.map +7 -0
  68. package/dist/lib/neutral/{run-prompt-in-new-chat-D5IIE2C7.mjs → run-prompt-in-new-chat-NIAGCKQV.mjs} +11 -8
  69. package/dist/lib/neutral/run-prompt-in-new-chat-NIAGCKQV.mjs.map +7 -0
  70. package/dist/lib/neutral/{settings-W4BLWQ53.mjs → settings-7Q3RITIT.mjs} +3 -3
  71. package/dist/lib/neutral/{settings-W4BLWQ53.mjs.map → settings-7Q3RITIT.mjs.map} +3 -3
  72. package/dist/lib/neutral/{state-H3G7QCU6.mjs → state-XO2UYSSG.mjs} +2 -2
  73. package/dist/lib/neutral/{state-H3G7QCU6.mjs.map → state-XO2UYSSG.mjs.map} +3 -3
  74. package/dist/lib/neutral/testing.mjs +1 -1
  75. package/dist/lib/neutral/translations.mjs +18 -11
  76. package/dist/lib/neutral/translations.mjs.map +3 -3
  77. package/dist/lib/neutral/types/index.mjs +1 -1
  78. package/dist/types/dx.config.d.ts +28 -0
  79. package/dist/types/dx.config.d.ts.map +1 -0
  80. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  81. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -1
  82. package/dist/types/src/capabilities/index.d.ts +17 -57
  83. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  84. package/dist/types/src/capabilities/react-surface.d.ts +2 -2
  85. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  86. package/dist/types/src/components/Chat/Chat.d.ts +6 -3
  87. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -1
  88. package/dist/types/src/components/Chat/Chat.stories.d.ts +32 -0
  89. package/dist/types/src/components/Chat/Chat.stories.d.ts.map +1 -0
  90. package/dist/types/src/components/ChatPrompt/ChatActions.d.ts.map +1 -1
  91. package/dist/types/src/components/ChatPrompt/ChatOptions.d.ts.map +1 -1
  92. package/dist/types/src/components/ProcessTree/ProcessTree.d.ts +6 -0
  93. package/dist/types/src/components/ProcessTree/ProcessTree.d.ts.map +1 -1
  94. package/dist/types/src/components/ProcessTree/ProcessTree.stories.d.ts +1 -0
  95. package/dist/types/src/components/ProcessTree/ProcessTree.stories.d.ts.map +1 -1
  96. package/dist/types/src/components/TaskList/TaskList.d.ts +8 -0
  97. package/dist/types/src/components/TaskList/TaskList.d.ts.map +1 -1
  98. package/dist/types/src/components/TaskList/TaskList.stories.d.ts +3 -0
  99. package/dist/types/src/components/TaskList/TaskList.stories.d.ts.map +1 -1
  100. package/dist/types/src/components/index.d.ts +1 -0
  101. package/dist/types/src/components/index.d.ts.map +1 -1
  102. package/dist/types/src/containers/ChatArticle/ChatArticle.d.ts +2 -2
  103. package/dist/types/src/containers/ChatArticle/ChatArticle.d.ts.map +1 -1
  104. package/dist/types/src/containers/ChatCompanion/ChatCompanion.d.ts +2 -2
  105. package/dist/types/src/containers/ChatDialog/ChatDialog.d.ts.map +1 -1
  106. package/dist/types/src/containers/PlanArticle/PlanArticle.d.ts.map +1 -1
  107. package/dist/types/src/containers/SpaceHomePrompt/SpaceHomePrompt.d.ts +15 -0
  108. package/dist/types/src/containers/SpaceHomePrompt/SpaceHomePrompt.d.ts.map +1 -0
  109. package/dist/types/src/containers/SpaceHomePrompt/index.d.ts +2 -0
  110. package/dist/types/src/containers/SpaceHomePrompt/index.d.ts.map +1 -0
  111. package/dist/types/src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.d.ts +13 -0
  112. package/dist/types/src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.d.ts.map +1 -0
  113. package/dist/types/src/containers/SpaceHomeSuggestions/index.d.ts +2 -0
  114. package/dist/types/src/containers/SpaceHomeSuggestions/index.d.ts.map +1 -0
  115. package/dist/types/src/containers/TracePanel/TracePanel.d.ts.map +1 -1
  116. package/dist/types/src/containers/index.d.ts +2 -0
  117. package/dist/types/src/containers/index.d.ts.map +1 -1
  118. package/dist/types/src/execution-graph/execution-graph.d.ts +18 -0
  119. package/dist/types/src/execution-graph/execution-graph.d.ts.map +1 -1
  120. package/dist/types/src/execution-graph/index.d.ts +2 -1
  121. package/dist/types/src/execution-graph/index.d.ts.map +1 -1
  122. package/dist/types/src/execution-graph/pending-block-status.d.ts +26 -0
  123. package/dist/types/src/execution-graph/pending-block-status.d.ts.map +1 -0
  124. package/dist/types/src/execution-graph/pending-block-status.test.d.ts +2 -0
  125. package/dist/types/src/execution-graph/pending-block-status.test.d.ts.map +1 -0
  126. package/dist/types/src/extensions/prompt-extension.d.ts +1 -1
  127. package/dist/types/src/extensions/prompt-extension.d.ts.map +1 -1
  128. package/dist/types/src/feed-logger.d.ts +3 -2
  129. package/dist/types/src/feed-logger.d.ts.map +1 -1
  130. package/dist/types/src/hooks/index.d.ts +2 -0
  131. package/dist/types/src/hooks/index.d.ts.map +1 -1
  132. package/dist/types/src/hooks/useProcessEphemeralStatus.d.ts +10 -0
  133. package/dist/types/src/hooks/useProcessEphemeralStatus.d.ts.map +1 -0
  134. package/dist/types/src/hooks/useTraceMessages.d.ts +12 -0
  135. package/dist/types/src/hooks/useTraceMessages.d.ts.map +1 -0
  136. package/dist/types/src/meta.d.ts +28 -2
  137. package/dist/types/src/meta.d.ts.map +1 -1
  138. package/dist/types/src/operations/run-prompt-in-new-chat.d.ts.map +1 -1
  139. package/dist/types/src/paths.d.ts.map +1 -1
  140. package/dist/types/src/processor/processor.d.ts +23 -0
  141. package/dist/types/src/processor/processor.d.ts.map +1 -1
  142. package/dist/types/src/translations.d.ts.map +1 -1
  143. package/dist/types/src/types/Assistant.d.ts +1 -1
  144. package/dist/types/src/types/AssistantCapabilities.d.ts.map +1 -1
  145. package/dist/types/src/types/AssistantEvents.d.ts.map +1 -1
  146. package/dist/types/src/types/AssistantOperation.d.ts +7 -7
  147. package/dist/types/src/util/error-cause.d.ts +3 -0
  148. package/dist/types/src/util/error-cause.d.ts.map +1 -0
  149. package/dist/types/tsconfig.tsbuildinfo +1 -1
  150. package/dx.config.ts +38 -0
  151. package/package.json +71 -70
  152. package/src/AssistantPlugin.conversations.json +1 -1
  153. package/src/AssistantPlugin.test.ts +1 -1
  154. package/src/AssistantPlugin.ts +2 -2
  155. package/src/capabilities/agent-service.ts +5 -1
  156. package/src/capabilities/app-graph-builder.ts +15 -20
  157. package/src/capabilities/blueprint-definition.ts +2 -0
  158. package/src/capabilities/index.ts +1 -7
  159. package/src/capabilities/markdown-extension.ts +5 -1
  160. package/src/capabilities/react-surface.tsx +38 -23
  161. package/src/capabilities/settings.ts +2 -2
  162. package/src/capabilities/state.ts +1 -1
  163. package/src/components/AgentProperties/AgentProperties.tsx +1 -1
  164. package/src/components/AssistantSettings/AssistantSettings.tsx +2 -2
  165. package/src/components/Chat/Chat.stories.tsx +94 -0
  166. package/src/components/Chat/Chat.tsx +39 -6
  167. package/src/components/ChatPrompt/ChatActions.tsx +4 -2
  168. package/src/components/ChatPrompt/ChatMcpErrors.tsx +1 -1
  169. package/src/components/ChatPrompt/ChatOptions.tsx +26 -29
  170. package/src/components/ChatPrompt/ChatPrompt.tsx +1 -1
  171. package/src/components/ChatPrompt/ChatReferences.tsx +1 -1
  172. package/src/components/ChatThread/Anchor.stories.tsx +1 -1
  173. package/src/components/ChatThread/ChatThread.stories.tsx +1 -1
  174. package/src/components/ChatThread/DEBUG.md +23 -0
  175. package/src/components/ChatThread/widgets/SummaryWidget.tsx +1 -1
  176. package/src/components/ChatThread/widgets/ToolWidget.tsx +1 -1
  177. package/src/components/ProcessTree/ProcessTree.stories.tsx +7 -0
  178. package/src/components/ProcessTree/ProcessTree.tsx +191 -88
  179. package/src/components/TaskList/TaskList.stories.tsx +23 -2
  180. package/src/components/TaskList/TaskList.tsx +122 -28
  181. package/src/components/TemplateEditor/TemplateEditor.tsx +1 -1
  182. package/src/components/TemplateEditor/TemplateForm.tsx +1 -1
  183. package/src/components/ToolBlock/ToolBlock.tsx +1 -1
  184. package/src/components/index.ts +1 -0
  185. package/src/containers/AgentArticle/AgentArticle.stories.tsx +4 -4
  186. package/src/containers/AgentArticle/AgentArticle.tsx +9 -9
  187. package/src/containers/ChatArticle/ChatArticle.tsx +18 -10
  188. package/src/containers/ChatCompanion/ChatCompanion.tsx +2 -2
  189. package/src/containers/ChatDialog/ChatDialog.tsx +5 -3
  190. package/src/containers/PlanArticle/PlanArticle.tsx +5 -1
  191. package/src/containers/RoutineArticle/RoutineArticle.tsx +2 -2
  192. package/src/containers/SpaceHomePrompt/SpaceHomePrompt.tsx +105 -0
  193. package/src/containers/SpaceHomePrompt/index.ts +5 -0
  194. package/src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.tsx +69 -0
  195. package/src/containers/SpaceHomeSuggestions/index.ts +5 -0
  196. package/src/containers/TracePanel/TracePanel.tsx +3 -30
  197. package/src/containers/TriggerStatus/TriggerStatus.tsx +2 -2
  198. package/src/containers/index.ts +2 -0
  199. package/src/execution-graph/execution-graph.ts +130 -0
  200. package/src/execution-graph/index.ts +10 -0
  201. package/src/execution-graph/pending-block-status.test.ts +114 -0
  202. package/src/execution-graph/pending-block-status.ts +88 -0
  203. package/src/execution-graph/sub-agent-delegation.test.ts +16 -1
  204. package/src/extensions/prompt-extension.ts +102 -73
  205. package/src/feed-logger.ts +21 -19
  206. package/src/hooks/index.ts +2 -0
  207. package/src/hooks/useChatProcessor.ts +1 -1
  208. package/src/hooks/useChatServices.ts +2 -2
  209. package/src/hooks/useChatToolbarActions.ts +5 -5
  210. package/src/hooks/useContextBinder.ts +1 -1
  211. package/src/hooks/useProcessEphemeralStatus.ts +192 -0
  212. package/src/hooks/useTraceMessages.ts +41 -0
  213. package/src/meta.ts +3 -31
  214. package/src/operations/create-chat.ts +1 -1
  215. package/src/operations/fork-chat.ts +3 -3
  216. package/src/operations/run-prompt-in-new-chat.ts +5 -3
  217. package/src/paths.ts +2 -2
  218. package/src/processor/processor.node.test.ts +71 -1
  219. package/src/processor/processor.ts +58 -2
  220. package/src/testing/data/trace-timeline-multiple.dx.json +1 -1
  221. package/src/testing/data/trace-timeline-remote.dx.json +1 -1
  222. package/src/testing/data/trace-timeline.dx.json +0 -1
  223. package/src/translations.ts +18 -10
  224. package/src/types/AssistantCapabilities.ts +3 -3
  225. package/src/types/AssistantEvents.ts +1 -1
  226. package/src/types/AssistantOperation.ts +1 -1
  227. package/src/util/error-cause.ts +21 -0
  228. package/dist/lib/neutral/AgentArticle-K7XM46OQ.mjs.map +0 -7
  229. package/dist/lib/neutral/AssistantSettings-GG52BLKS.mjs.map +0 -7
  230. package/dist/lib/neutral/ChatCompanion-LBUHYWQG.mjs.map +0 -7
  231. package/dist/lib/neutral/ChatDialog-DCA6FLOV.mjs.map +0 -7
  232. package/dist/lib/neutral/PlanArticle-TS5ULWYS.mjs.map +0 -7
  233. package/dist/lib/neutral/RoutineArticle-5NYXHRG6.mjs.map +0 -7
  234. package/dist/lib/neutral/TracePanel-KTZJ6JNR.mjs.map +0 -7
  235. package/dist/lib/neutral/TriggerStatus-X7Y5JFZJ.mjs.map +0 -7
  236. package/dist/lib/neutral/app-graph-builder-WUFHQH3Y.mjs.map +0 -7
  237. package/dist/lib/neutral/blueprint-definition-MH2QLYQH.mjs.map +0 -7
  238. package/dist/lib/neutral/chunk-HLANPOBA.mjs.map +0 -7
  239. package/dist/lib/neutral/chunk-QAZMOFPI.mjs.map +0 -7
  240. package/dist/lib/neutral/chunk-RKVVK3R3.mjs.map +0 -7
  241. package/dist/lib/neutral/chunk-VTK5R4H3.mjs +0 -9
  242. package/dist/lib/neutral/chunk-VTK5R4H3.mjs.map +0 -7
  243. package/dist/lib/neutral/chunk-XYHPOGTK.mjs +0 -43
  244. package/dist/lib/neutral/chunk-XYHPOGTK.mjs.map +0 -7
  245. package/dist/lib/neutral/chunk-YXRGZYYH.mjs.map +0 -7
  246. package/dist/lib/neutral/fork-chat-34KEF4ZJ.mjs.map +0 -7
  247. package/dist/lib/neutral/markdown-extension-YMIFDMYF.mjs +0 -110
  248. package/dist/lib/neutral/markdown-extension-YMIFDMYF.mjs.map +0 -7
  249. package/dist/lib/neutral/react-surface-XRTBW5OJ.mjs.map +0 -7
  250. package/dist/lib/neutral/run-prompt-in-new-chat-D5IIE2C7.mjs.map +0 -7
  251. package/src/testing/trace-timeline.node.conversations.json +0 -1
  252. /package/dist/lib/neutral/{ChatArticle-VNVZCDUR.mjs.map → ChatArticle-KT46SUFU.mjs.map} +0 -0
  253. /package/dist/lib/neutral/{chunk-SMFJD7BP.mjs.map → chunk-7FQT4XMI.mjs.map} +0 -0
  254. /package/dist/lib/neutral/{create-object-U2SOFZLR.mjs.map → create-object-BJUDDKQQ.mjs.map} +0 -0
@@ -34,7 +34,7 @@ export type ChatOptionsProps = ChatPresetProps & {
34
34
  * Manages the runtime context for the chat.
35
35
  */
36
36
  export const ChatOptions = ({ chat, db, context, registry, presets, preset, onPresetChange }: ChatOptionsProps) => {
37
- const { t } = useTranslation(meta.id);
37
+ const { t } = useTranslation(meta.profile.key);
38
38
 
39
39
  return (
40
40
  <div className='flex'>
@@ -64,13 +64,7 @@ export const ChatOptions = ({ chat, db, context, registry, presets, preset, onPr
64
64
  <Popover.Portal>
65
65
  <Popover.Content side='top' classNames={styles.panel}>
66
66
  <Popover.Viewport>
67
- <Tabs.Root
68
- classNames='flex'
69
- orientation='horizontal'
70
- defaultValue='view'
71
- defaultActivePart='list'
72
- tabIndex={-1}
73
- >
67
+ <Tabs.Root asChild orientation='horizontal' defaultValue='view' defaultActivePart='list' tabIndex={-1}>
74
68
  <Tabs.Viewport classNames={mx('grid grid-rows-[1fr_40px] w-full')}>
75
69
  <Tabs.Panel tabIndex={-1} classNames='dx-focus-ring-inset overflow-hidden' value='view'>
76
70
  <ViewPanel chat={chat} />
@@ -110,7 +104,7 @@ export const ChatOptions = ({ chat, db, context, registry, presets, preset, onPr
110
104
  };
111
105
 
112
106
  const BlueprintsPanel = ({ registry, db, context }: Pick<ChatOptionsProps, 'registry' | 'db' | 'context'>) => {
113
- const { t } = useTranslation(meta.id);
107
+ const { t } = useTranslation(meta.profile.key);
114
108
 
115
109
  const blueprints = useBlueprints({ registry, db });
116
110
  const activeBlueprints = useActiveBlueprints({ context });
@@ -146,18 +140,20 @@ const BlueprintsPanel = ({ registry, db, context }: Pick<ChatOptionsProps, 'regi
146
140
  };
147
141
 
148
142
  const ViewPanel = ({ chat }: Pick<ChatOptionsProps, 'chat'>) => {
149
- const { t } = useTranslation(meta.id);
150
- const [view, setView] = useObject(chat, 'view');
143
+ const { t } = useTranslation(meta.profile.key);
144
+ const [view, setView] = useObject(chat, 'viewType');
151
145
  const value = (view as Assistant.ChatView | undefined) ?? 'normal';
152
146
 
153
147
  return (
154
148
  <Listbox.Root value={value} onValueChange={setView} autoFocus>
155
- {Assistant.ChatViews.map((view) => (
156
- <Listbox.Option key={view} value={view}>
157
- <Listbox.OptionLabel>{t(`chat-view.${view}.label`, { defaultValue: view })}</Listbox.OptionLabel>
158
- <Listbox.OptionIndicator />
159
- </Listbox.Option>
160
- ))}
149
+ <Listbox.Content aria-label={t('chat-view.title')}>
150
+ {Assistant.ChatViews.map((view) => (
151
+ <Listbox.Item key={view} id={view} classNames='px-2 py-1 dx-focus-ring rounded-xs'>
152
+ <Listbox.ItemLabel>{t(`chat-view.${view}.label`, { defaultValue: view })}</Listbox.ItemLabel>
153
+ <Listbox.Indicator />
154
+ </Listbox.Item>
155
+ ))}
156
+ </Listbox.Content>
161
157
  </Listbox.Root>
162
158
  );
163
159
  };
@@ -167,16 +163,17 @@ const ModelsPanel = ({
167
163
  preset,
168
164
  onPresetChange,
169
165
  }: Pick<ChatOptionsProps, 'presets' | 'preset' | 'onPresetChange'>) => {
166
+ const { t } = useTranslation(meta.profile.key);
170
167
  return (
171
168
  <Listbox.Root value={preset} onValueChange={onPresetChange} autoFocus>
172
- {presets?.map(({ id, label }) => {
173
- return (
174
- <Listbox.Option key={id} value={id}>
175
- <Listbox.OptionLabel>{label}</Listbox.OptionLabel>
176
- <Listbox.OptionIndicator />
177
- </Listbox.Option>
178
- );
179
- })}
169
+ <Listbox.Content aria-label={t('options.chat-model.title')}>
170
+ {presets?.map(({ id, label }) => (
171
+ <Listbox.Item key={id} id={id} classNames='px-2 py-1 dx-focus-ring rounded-xs'>
172
+ <Listbox.ItemLabel>{label}</Listbox.ItemLabel>
173
+ <Listbox.Indicator />
174
+ </Listbox.Item>
175
+ ))}
176
+ </Listbox.Content>
180
177
  </Listbox.Root>
181
178
  );
182
179
  };
@@ -186,7 +183,7 @@ type McpServersPanelProps = {
186
183
  };
187
184
 
188
185
  const McpServersPanel = ({ db }: McpServersPanelProps) => {
189
- const { t } = useTranslation(meta.id);
186
+ const { t } = useTranslation(meta.profile.key);
190
187
  const servers = useQuery(db, Filter.type(McpServer.McpServer));
191
188
  const [adding, setAdding] = useState(false);
192
189
 
@@ -237,7 +234,7 @@ type McpServerRowProps = {
237
234
  * switch in sync with mutations made through the returned setter.
238
235
  */
239
236
  const McpServerRow = ({ server, onRemove }: McpServerRowProps) => {
240
- const { t } = useTranslation(meta.id);
237
+ const { t } = useTranslation(meta.profile.key);
241
238
  const [enabled, setEnabled] = useObject(server, 'enabled');
242
239
 
243
240
  return (
@@ -265,7 +262,7 @@ type McpServerFormProps = {
265
262
  };
266
263
 
267
264
  const McpServerForm = ({ onSubmit, onCancel }: McpServerFormProps) => {
268
- const { t } = useTranslation(meta.id);
265
+ const { t } = useTranslation(meta.profile.key);
269
266
  const [name, setName] = useState('');
270
267
  const [url, setUrl] = useState('');
271
268
  const [protocol, setProtocol] = useState<'sse' | 'http'>('sse');
@@ -336,7 +333,7 @@ const ANY = '__any__' as const;
336
333
 
337
334
  /** @private */
338
335
  export const ObjectsPanel = ({ db, context }: Pick<ChatOptionsProps, 'db' | 'context'>): JSX.Element => {
339
- const { t } = useTranslation(meta.id);
336
+ const { t } = useTranslation(meta.profile.key);
340
337
 
341
338
  // Item types sorted by label.
342
339
  const types = useFilteredTypes(db);
@@ -60,7 +60,7 @@ export const ChatPrompt = ({
60
60
  presets,
61
61
  preset,
62
62
  }: ChatPromptProps) => {
63
- const { t } = useTranslation(meta.id);
63
+ const { t } = useTranslation(meta.profile.key);
64
64
 
65
65
  const error = useAtomValue(processor.error).pipe(Option.getOrUndefined);
66
66
  const streaming = useAtomValue(processor.streaming);
@@ -18,7 +18,7 @@ export type ChatReferencesProps = ThemedClassName<{
18
18
  }>;
19
19
 
20
20
  export const ChatReferences = ({ classNames, context, db }: ChatReferencesProps) => {
21
- const { t } = useTranslation(meta.id);
21
+ const { t } = useTranslation(meta.profile.key);
22
22
  const { objects, onUpdateObject } = useContextObjects({ db, context });
23
23
 
24
24
  return (
@@ -27,7 +27,7 @@ import { Organization } from '@dxos/types';
27
27
  * `LayoutOperation.UpdatePopover`.
28
28
  * - `StorybookPlugin` provides both the `LayoutOperation.UpdatePopover` handler (mutating
29
29
  * the layout-state atom) and the `<Layout>` shell that renders the popover via
30
- * `<Surface.Surface type={AppSurface.Card} data={popoverContent}>`.
30
+ * `<Surface.Surface type={AppSurface.CardContent} data={popoverContent}>`.
31
31
  * - `PreviewPlugin` also registers Card-role surfaces (Organization, Person, Task, …); the
32
32
  * Surface system picks the matching one based on the resolved object's type.
33
33
  *
@@ -65,7 +65,7 @@ const DefaultStory = ({ generator = [], delay = 0, wait, ...props }: DefaultStor
65
65
  Layer.mergeAll(
66
66
  Database.layer(space.db),
67
67
  Feed.ContextFeedService.layer(feed),
68
- createFeedServiceLayer(space.queues),
68
+ createFeedServiceLayer(space.db),
69
69
  ),
70
70
  ),
71
71
  ),
@@ -39,3 +39,26 @@ MarkdownStream (packages/ui/react-ui-markdown/src/MarkdownStream/MarkdownStream.
39
39
  │ treats XML atomic ranges as indivisible units)
40
40
 
41
41
  Rendered DOM (markdown + portaled widgets for tool calls / reasoning / etc.)
42
+
43
+ ---
44
+
45
+ # Ephemeral status subscriptions (TaskList / debug panel)
46
+
47
+ ProcessHandle.pushEphemeral → subscribeEphemeral(): Stream<Trace.Message>
48
+
49
+ │ UI hooks fork a collector fiber from the stream inside useEffect
50
+
51
+ useProcessEphemeralStatus (TaskList delegated rows)
52
+ EphemeralDebugModule (storybook debug panel)
53
+
54
+ │ **Must use Effect.forkDaemon**, not Effect.fork, when the parent is
55
+ │ `runtime.runPromise(Effect.forEach(subscribe))` — forEach returns as soon as
56
+ │ each subscribe forks, closing the scope and interrupting scoped forks before
57
+ │ live events arrive. forkDaemon survives until explicit Fiber.interrupt on dispose.
58
+
59
+ │ Same pattern as ProcessOperationInvoker.fiberFromProcess (output collector).
60
+
61
+ resolveEphemeralStatusUpdate → TaskList activity line
62
+
63
+ **Contrast:** processor.ts uses Effect.fork because its parent Effect.gen continues
64
+ through submitPrompt + waitForCompletion, keeping the scope open for the whole turn.
@@ -14,7 +14,7 @@ import { MessageThreadContext } from '../sync';
14
14
  import { styles } from './defaults';
15
15
 
16
16
  export const SummaryWidget = ({ children }: XmlWidgetProps<MessageThreadContext>) => {
17
- const { t } = useTranslation(meta.id);
17
+ const { t } = useTranslation(meta.profile.key);
18
18
 
19
19
  return (
20
20
  <TogglePanel.Root>
@@ -23,7 +23,7 @@ export type ToolWidgetProps = XmlWidgetProps<{
23
23
  }>;
24
24
 
25
25
  export const ToolWidget = ({ view, blocks = [] }: ToolWidgetProps) => {
26
- const { t } = useTranslation(meta.id);
26
+ const { t } = useTranslation(meta.profile.key);
27
27
 
28
28
  const items = useMemo<ToolPanelProps['items']>(() => {
29
29
  let lastToolCall: { tool: Tool.Any | undefined; block: ContentBlock.ToolCall } | undefined;
@@ -81,3 +81,10 @@ export const Default: Story = {
81
81
  },
82
82
  },
83
83
  };
84
+
85
+ export const WithNestedChildren: Story = {
86
+ args: {
87
+ ...Default.args,
88
+ depth: 2,
89
+ },
90
+ };
@@ -4,113 +4,69 @@
4
4
 
5
5
  import * as Match from 'effect/Match';
6
6
  import * as Option from 'effect/Option';
7
- import React from 'react';
7
+ import React, { useMemo } from 'react';
8
8
 
9
9
  import { Process } from '@dxos/compute';
10
- import { Icon, IconButton, ScrollArea, Tooltip, Treegrid } from '@dxos/react-ui';
11
- import { composable, composableProps } from '@dxos/react-ui';
10
+ import {
11
+ Icon,
12
+ IconButton,
13
+ ScrollArea,
14
+ Tooltip,
15
+ Treegrid,
16
+ TREEGRID_PATH_SEPARATOR,
17
+ composable,
18
+ composableProps,
19
+ } from '@dxos/react-ui';
12
20
  import { mx } from '@dxos/ui-theme';
13
21
  import { Unit } from '@dxos/util';
14
22
 
23
+ const DEFAULT_DEPTH = 1;
24
+ /** Extra label inset per nesting level (status icons stay aligned). */
25
+ const LABEL_INDENT_REM = 0.5;
26
+
27
+ /** Nested subprocess rows (level > 1) only surface still-active processes. */
28
+ const NESTED_ACTIVE_STATES = new Set<Process.State>([
29
+ Process.State.RUNNING,
30
+ Process.State.HYBERNATING,
31
+ Process.State.TERMINATING,
32
+ ]);
33
+
15
34
  export type ProcessTreeProps = {
16
35
  // TODO(burdon): Atom.
17
36
  processes: readonly Process.Info[];
37
+ /**
38
+ * Maximum nesting depth from the root (1 = top-level processes only).
39
+ *
40
+ * @default 1
41
+ */
42
+ depth?: number;
18
43
  onProcessSelect?: (process: Process.Info) => void;
19
44
  onProcessTerminate?: (process: Process.Info) => void;
20
45
  };
21
46
 
47
+ type ProcessTreeRow = {
48
+ process: Process.Info;
49
+ path: string[];
50
+ };
51
+
22
52
  export const ProcessTree = React.memo(
23
53
  composable<HTMLDivElement, ProcessTreeProps>(
24
- ({ processes, onProcessSelect, onProcessTerminate, ...props }, forwardedRef) => {
25
- const sortedProcesses = [
26
- ...processes.filter((process) => [Process.State.RUNNING, Process.State.HYBERNATING].includes(process.state)),
27
- ...processes.filter((process) => [Process.State.IDLE].includes(process.state)).slice(0, 3),
28
- ...processes.filter((process) =>
29
- [Process.State.SUCCEEDED, Process.State.FAILED, Process.State.TERMINATED].includes(process.state),
30
- ),
31
- ].sort((a, b) => {
32
- const aCompletedAt = Option.getOrElse(a.completedAt, () => Infinity);
33
- const bCompletedAt = Option.getOrElse(b.completedAt, () => Infinity);
34
- return bCompletedAt - aCompletedAt;
35
- });
54
+ ({ processes, depth = DEFAULT_DEPTH, onProcessSelect, onProcessTerminate, ...props }, forwardedRef) => {
55
+ const rows = useMemo(() => buildProcessTreeRows(processes, depth), [processes, depth]);
36
56
 
37
57
  return (
38
58
  <ScrollArea.Root {...composableProps(props, { classNames: 'dx-expander' })} thin ref={forwardedRef}>
39
59
  <ScrollArea.Viewport>
40
60
  <Treegrid.Root classNames='grid grid-cols-[min-content_1fr_min-content_min-content]'>
41
- {sortedProcesses
42
- .filter((process) => process.parentPid === null)
43
- .map((process) => {
44
- // const activeChildren = filteredProcesses.filter(
45
- // (candidate) =>
46
- // candidate.parentPid?.toString() === process.pid.toString() &&
47
- // candidate.state === Process.State.RUNNING,
48
- // );
49
- const t = Unit.Duration(process.metrics.wallTime);
50
- return (
51
- <Treegrid.Row
52
- key={process.pid.toString()}
53
- id={process.pid.toString()}
54
- parentOf={process.parentPid?.toString()}
55
- classNames={mx('col-span-full grid grid-cols-subgrid gap-2 ps-1', onProcessSelect && 'dx-hover')}
56
- >
57
- <Treegrid.Cell classNames='grid place-items-center'>
58
- <Tooltip.Trigger content={process.state.toString()}>
59
- <Icon
60
- size={4}
61
- synchronized
62
- classNames={mx(
63
- process.state === Process.State.RUNNING && 'animate-spin',
64
- process.state === Process.State.FAILED && 'text-error-text',
65
- process.state === Process.State.SUCCEEDED && 'text-success-text',
66
- )}
67
- icon={Match.value(process.state).pipe(
68
- Match.when(Process.State.RUNNING, () => 'ph--spinner-gap--regular'),
69
- Match.when(Process.State.SUCCEEDED, () => 'ph--check-circle--regular'),
70
- Match.when(Process.State.FAILED, () => 'ph--warning--regular'),
71
- Match.when(Process.State.HYBERNATING, () => 'ph--spinner--regular'),
72
- Match.when(Process.State.IDLE, () => 'ph--moon-stars--regular'),
73
- Match.when(Process.State.TERMINATING, () => 'ph--x-circle--regular'),
74
- Match.when(Process.State.TERMINATED, () => 'ph--x-circle--regular'),
75
- Match.orElse(() => 'ph--spinner-gap--regular'),
76
- )}
77
- />
78
- </Tooltip.Trigger>
79
- </Treegrid.Cell>
80
- <Treegrid.Cell classNames='flex items-center truncate' onClick={() => onProcessSelect?.(process)}>
81
- <span
82
- className={mx(
83
- 'truncate text-sm',
84
- process.state !== Process.State.RUNNING && 'text-description',
85
- )}
86
- >
87
- {process.params.name ?? process.pid.toString()}
88
- </span>
89
- </Treegrid.Cell>
90
- <Treegrid.Cell classNames='flex items-center justify-end text-xs text-description tabular-nums'>
91
- {[Process.State.FAILED, Process.State.SUCCEEDED].includes(process.state) && (
92
- <span className='whitespace-nowrap'>{t.toString()}</span>
93
- )}
94
- </Treegrid.Cell>
95
- <Treegrid.Cell>
96
- {onProcessTerminate && (
97
- <IconButton
98
- classNames='min-h-0 p-1'
99
- icon='ph--x--regular'
100
- iconOnly
101
- variant='ghost'
102
- size={4}
103
- label='Actions'
104
- onClick={(event) => {
105
- event.stopPropagation();
106
- onProcessTerminate?.(process);
107
- }}
108
- />
109
- )}
110
- </Treegrid.Cell>
111
- </Treegrid.Row>
112
- );
113
- })}
61
+ {rows.map(({ process, path }) => (
62
+ <ProcessTreeRowView
63
+ key={path.join(TREEGRID_PATH_SEPARATOR)}
64
+ process={process}
65
+ path={path}
66
+ onProcessSelect={onProcessSelect}
67
+ onProcessTerminate={onProcessTerminate}
68
+ />
69
+ ))}
114
70
  </Treegrid.Root>
115
71
  </ScrollArea.Viewport>
116
72
  </ScrollArea.Root>
@@ -118,3 +74,150 @@ export const ProcessTree = React.memo(
118
74
  },
119
75
  ),
120
76
  );
77
+
78
+ type ProcessTreeRowViewProps = {
79
+ process: Process.Info;
80
+ path: string[];
81
+ onProcessSelect?: (process: Process.Info) => void;
82
+ onProcessTerminate?: (process: Process.Info) => void;
83
+ };
84
+
85
+ const ProcessTreeRowView = ({ process, path, onProcessSelect, onProcessTerminate }: ProcessTreeRowViewProps) => {
86
+ const duration = Unit.Duration(process.metrics.wallTime);
87
+ const level = path.length;
88
+ const nested = level > 1;
89
+
90
+ return (
91
+ <Treegrid.Row
92
+ id={path.join(TREEGRID_PATH_SEPARATOR)}
93
+ classNames={mx('col-span-full grid grid-cols-subgrid gap-2 ps-1', onProcessSelect && 'dx-hover')}
94
+ >
95
+ <Treegrid.Cell classNames='flex items-center gap-0.5'>
96
+ {nested && <Icon icon='ph--arrow-elbow-down-right--regular' size={3} classNames='shrink-0 text-subdued' />}
97
+ <Tooltip.Trigger content={process.state.toString()}>
98
+ <Icon
99
+ size={4}
100
+ synchronized
101
+ classNames={mx(
102
+ process.state === Process.State.RUNNING && 'animate-spin',
103
+ process.state === Process.State.FAILED && 'text-error-text',
104
+ process.state === Process.State.SUCCEEDED && 'text-success-text',
105
+ )}
106
+ icon={Match.value(process.state).pipe(
107
+ Match.when(Process.State.RUNNING, () => 'ph--spinner-gap--regular'),
108
+ Match.when(Process.State.SUCCEEDED, () => 'ph--check-circle--regular'),
109
+ Match.when(Process.State.FAILED, () => 'ph--warning--regular'),
110
+ Match.when(Process.State.HYBERNATING, () => 'ph--spinner--regular'),
111
+ Match.when(Process.State.IDLE, () => 'ph--moon-stars--regular'),
112
+ Match.when(Process.State.TERMINATING, () => 'ph--x-circle--regular'),
113
+ Match.when(Process.State.TERMINATED, () => 'ph--x-circle--regular'),
114
+ Match.orElse(() => 'ph--spinner-gap--regular'),
115
+ )}
116
+ />
117
+ </Tooltip.Trigger>
118
+ </Treegrid.Cell>
119
+ <Treegrid.Cell
120
+ classNames='flex items-center truncate'
121
+ style={nested ? { paddingInlineStart: `${(level - 1) * LABEL_INDENT_REM}rem` } : undefined}
122
+ onClick={() => onProcessSelect?.(process)}
123
+ >
124
+ <span
125
+ className={mx(
126
+ 'truncate text-sm',
127
+ level === 1 && 'font-medium',
128
+ process.state !== Process.State.RUNNING && 'text-description',
129
+ )}
130
+ >
131
+ {process.params.name ?? process.pid.toString()}
132
+ </span>
133
+ </Treegrid.Cell>
134
+ <Treegrid.Cell classNames='flex items-center justify-end text-xs text-description tabular-nums'>
135
+ {[Process.State.FAILED, Process.State.SUCCEEDED].includes(process.state) && (
136
+ <span className='whitespace-nowrap'>{duration.toString()}</span>
137
+ )}
138
+ </Treegrid.Cell>
139
+ <Treegrid.Cell>
140
+ {onProcessTerminate && (
141
+ <IconButton
142
+ classNames='min-h-0 p-1'
143
+ icon='ph--x--regular'
144
+ iconOnly
145
+ variant='ghost'
146
+ size={4}
147
+ label='Actions'
148
+ onClick={(event) => {
149
+ event.stopPropagation();
150
+ onProcessTerminate?.(process);
151
+ }}
152
+ />
153
+ )}
154
+ </Treegrid.Cell>
155
+ </Treegrid.Row>
156
+ );
157
+ };
158
+
159
+ const sortProcesses = (processes: readonly Process.Info[]): Process.Info[] => {
160
+ return [
161
+ ...processes.filter((process) => [Process.State.RUNNING, Process.State.HYBERNATING].includes(process.state)),
162
+ ...processes.filter((process) => [Process.State.IDLE].includes(process.state)).slice(0, 3),
163
+ ...processes.filter((process) =>
164
+ [Process.State.SUCCEEDED, Process.State.FAILED, Process.State.TERMINATED].includes(process.state),
165
+ ),
166
+ ].sort((left, right) => {
167
+ const leftCompletedAt = Option.getOrElse(left.completedAt, () => Infinity);
168
+ const rightCompletedAt = Option.getOrElse(right.completedAt, () => Infinity);
169
+ return rightCompletedAt - leftCompletedAt;
170
+ });
171
+ };
172
+
173
+ const sortNestedActive = (processes: readonly Process.Info[]): Process.Info[] =>
174
+ processes
175
+ .filter((process) => NESTED_ACTIVE_STATES.has(process.state))
176
+ .sort((left, right) => {
177
+ const priority = (state: Process.State) =>
178
+ state === Process.State.RUNNING ? 0 : state === Process.State.HYBERNATING ? 1 : 2;
179
+ return priority(left.state) - priority(right.state);
180
+ });
181
+
182
+ /**
183
+ * Flattens the process forest to a fixed depth. Rows are always shown expanded (no collapse).
184
+ */
185
+ const buildProcessTreeRows = (processes: readonly Process.Info[], maxDepth: number): ProcessTreeRow[] => {
186
+ const pidSet = new Set(processes.map((process) => String(process.pid)));
187
+ const childrenByParent = new Map<string, Process.Info[]>();
188
+ const roots: Process.Info[] = [];
189
+
190
+ for (const process of processes) {
191
+ const parent = process.parentPid;
192
+ if (parent === null || !pidSet.has(String(parent))) {
193
+ roots.push(process);
194
+ continue;
195
+ }
196
+ const key = String(parent);
197
+ const siblings = childrenByParent.get(key) ?? [];
198
+ siblings.push(process);
199
+ childrenByParent.set(key, siblings);
200
+ }
201
+
202
+ const sortedRoots = sortProcesses(roots);
203
+
204
+ const rows: ProcessTreeRow[] = [];
205
+ const visit = (process: Process.Info, path: string[], level: number) => {
206
+ if (level > maxDepth) {
207
+ return;
208
+ }
209
+ rows.push({ process, path });
210
+ if (level >= maxDepth) {
211
+ return;
212
+ }
213
+ const children = sortNestedActive(childrenByParent.get(String(process.pid)) ?? []);
214
+ for (const child of children) {
215
+ visit(child, [...path, String(child.pid)], level + 1);
216
+ }
217
+ };
218
+
219
+ for (const root of sortedRoots) {
220
+ visit(root, [String(root.pid)], 1);
221
+ }
222
+ return rows;
223
+ };
@@ -6,17 +6,23 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React from 'react';
7
7
 
8
8
  import { Plan } from '@dxos/assistant-toolkit';
9
+ import { Process, type Trace } from '@dxos/compute';
9
10
  import { withLayout, withTheme } from '@dxos/react-ui/testing';
10
11
 
12
+ import subAgentFixture from '../../execution-graph/testing/sub-agent-delegation.json';
11
13
  import { TaskList } from './TaskList';
12
14
 
15
+ const SUB_AGENT_PID = Process.ID.make('cf8f7243-5b1d-4902-b158-70d9107d5f43');
16
+ const traceMessages = (subAgentFixture as unknown as Trace.Message[]).slice();
17
+
13
18
  type DefaultStoryProps = {
14
19
  tasks?: Omit<Plan.Task, 'id'>[];
20
+ traceMessages?: readonly Trace.Message[];
15
21
  };
16
22
 
17
- const DefaultStory = ({ tasks = [] }: DefaultStoryProps) => {
23
+ const DefaultStory = ({ tasks = [], traceMessages: traceMessagesProp }: DefaultStoryProps) => {
18
24
  const plan = React.useMemo(() => Plan.makePlan({ tasks }), [tasks]);
19
- return <TaskList plan={plan} />;
25
+ return <TaskList plan={plan} traceMessages={traceMessagesProp} />;
20
26
  };
21
27
 
22
28
  const meta = {
@@ -41,4 +47,19 @@ export const Default: Story = {
41
47
  },
42
48
  };
43
49
 
50
+ export const WithDelegatedAgent: Story = {
51
+ args: {
52
+ tasks: [
53
+ {
54
+ title: 'Research widgets',
55
+ status: 'in-progress',
56
+ delegated: true,
57
+ agentPid: SUB_AGENT_PID,
58
+ },
59
+ { title: 'Summarize findings', status: 'in-progress' },
60
+ ],
61
+ traceMessages,
62
+ },
63
+ };
64
+
44
65
  export const Empty: Story = {};