@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.
- package/dist/lib/neutral/{AgentArticle-K7XM46OQ.mjs → AgentArticle-2BEPWUMN.mjs} +9 -7
- package/dist/lib/neutral/AgentArticle-2BEPWUMN.mjs.map +7 -0
- package/dist/lib/neutral/AssistantPlugin.mjs +1 -1
- package/dist/lib/neutral/{AssistantSettings-GG52BLKS.mjs → AssistantSettings-7ALY4BMS.mjs} +3 -3
- package/dist/lib/neutral/AssistantSettings-7ALY4BMS.mjs.map +7 -0
- package/dist/lib/neutral/{ChatArticle-VNVZCDUR.mjs → ChatArticle-KT46SUFU.mjs} +2 -2
- package/dist/lib/neutral/{ChatCompanion-LBUHYWQG.mjs → ChatCompanion-YHC43RYQ.mjs} +4 -4
- package/dist/lib/neutral/ChatCompanion-YHC43RYQ.mjs.map +7 -0
- package/dist/lib/neutral/{ChatDialog-DCA6FLOV.mjs → ChatDialog-YZDZLIQA.mjs} +5 -4
- package/dist/lib/neutral/ChatDialog-YZDZLIQA.mjs.map +7 -0
- package/dist/lib/neutral/{PlanArticle-TS5ULWYS.mjs → PlanArticle-VPK2IYWU.mjs} +8 -2
- package/dist/lib/neutral/PlanArticle-VPK2IYWU.mjs.map +7 -0
- package/dist/lib/neutral/{RoutineArticle-5NYXHRG6.mjs → RoutineArticle-FK5BXQN5.mjs} +3 -3
- package/dist/lib/neutral/RoutineArticle-FK5BXQN5.mjs.map +7 -0
- package/dist/lib/neutral/SpaceHomePrompt-HTWQKLGI.mjs +113 -0
- package/dist/lib/neutral/SpaceHomePrompt-HTWQKLGI.mjs.map +7 -0
- package/dist/lib/neutral/SpaceHomeSuggestions-6G4E7GNJ.mjs +50 -0
- package/dist/lib/neutral/SpaceHomeSuggestions-6G4E7GNJ.mjs.map +7 -0
- package/dist/lib/neutral/TracePanel-T552TAOH.mjs +12 -0
- package/dist/lib/neutral/TracePanel-T552TAOH.mjs.map +7 -0
- package/dist/lib/neutral/{TriggerStatus-X7Y5JFZJ.mjs → TriggerStatus-RBOHHDOK.mjs} +3 -3
- package/dist/lib/neutral/TriggerStatus-RBOHHDOK.mjs.map +7 -0
- package/dist/lib/neutral/{agent-service-WCAP5MLI.mjs → agent-service-WV5CSHAG.mjs} +4 -2
- package/dist/lib/neutral/{agent-service-WCAP5MLI.mjs.map → agent-service-WV5CSHAG.mjs.map} +3 -3
- package/dist/lib/neutral/{app-graph-builder-WUFHQH3Y.mjs → app-graph-builder-PTSRZXRN.mjs} +13 -13
- package/dist/lib/neutral/app-graph-builder-PTSRZXRN.mjs.map +7 -0
- package/dist/lib/neutral/{blueprint-definition-MH2QLYQH.mjs → blueprint-definition-2XPYI35X.mjs} +4 -3
- package/dist/lib/neutral/blueprint-definition-2XPYI35X.mjs.map +7 -0
- package/dist/lib/neutral/capabilities/index.mjs +8 -8
- package/dist/lib/neutral/capabilities/index.mjs.map +2 -2
- package/dist/lib/neutral/{chunk-HLANPOBA.mjs → chunk-35EL65O4.mjs} +3 -3
- package/dist/lib/neutral/chunk-35EL65O4.mjs.map +7 -0
- package/dist/lib/neutral/chunk-54W7N6M6.mjs +445 -0
- package/dist/lib/neutral/chunk-54W7N6M6.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-YXRGZYYH.mjs → chunk-5KB2WRI2.mjs} +6 -6
- package/dist/lib/neutral/chunk-5KB2WRI2.mjs.map +7 -0
- package/dist/lib/neutral/{TracePanel-KTZJ6JNR.mjs → chunk-5LKNH7FD.mjs} +5 -20
- package/dist/lib/neutral/chunk-5LKNH7FD.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-SMFJD7BP.mjs → chunk-7FQT4XMI.mjs} +2 -2
- package/dist/lib/neutral/{chunk-RKVVK3R3.mjs → chunk-H77JTXAN.mjs} +17 -9
- package/dist/lib/neutral/chunk-H77JTXAN.mjs.map +7 -0
- package/dist/lib/neutral/{chunk-QAZMOFPI.mjs → chunk-IQZJ5TTM.mjs} +4 -4
- package/dist/lib/neutral/chunk-IQZJ5TTM.mjs.map +7 -0
- package/dist/lib/neutral/chunk-ZNDQVYUN.mjs +53 -0
- package/dist/lib/neutral/chunk-ZNDQVYUN.mjs.map +7 -0
- package/dist/lib/neutral/components/index.mjs +296 -109
- package/dist/lib/neutral/components/index.mjs.map +3 -3
- package/dist/lib/neutral/containers/index.mjs +12 -8
- package/dist/lib/neutral/containers/index.mjs.map +3 -3
- package/dist/lib/neutral/{create-chat-SGGQ6HVN.mjs → create-chat-Z3FNA6OJ.mjs} +2 -2
- package/dist/lib/neutral/{create-chat-SGGQ6HVN.mjs.map → create-chat-Z3FNA6OJ.mjs.map} +2 -2
- package/dist/lib/neutral/{create-object-U2SOFZLR.mjs → create-object-BJUDDKQQ.mjs} +2 -2
- package/dist/lib/neutral/execution-graph/index.mjs +156 -0
- package/dist/lib/neutral/execution-graph/index.mjs.map +4 -4
- package/dist/lib/neutral/{fork-chat-34KEF4ZJ.mjs → fork-chat-UYXYT6BT.mjs} +4 -4
- package/dist/lib/neutral/fork-chat-UYXYT6BT.mjs.map +7 -0
- package/dist/lib/neutral/hooks/index.mjs +233 -438
- package/dist/lib/neutral/hooks/index.mjs.map +4 -4
- package/dist/lib/neutral/index.mjs +3 -3
- package/dist/lib/neutral/markdown-extension-IJ5RQMQ4.mjs +126 -0
- package/dist/lib/neutral/markdown-extension-IJ5RQMQ4.mjs.map +7 -0
- package/dist/lib/neutral/meta.json +1 -1
- package/dist/lib/neutral/meta.mjs +1 -1
- package/dist/lib/neutral/operations/index.mjs +1 -1
- package/dist/lib/neutral/plugin.mjs +2 -2
- package/dist/lib/neutral/{react-surface-XRTBW5OJ.mjs → react-surface-ES7UHZ65.mjs} +29 -17
- package/dist/lib/neutral/react-surface-ES7UHZ65.mjs.map +7 -0
- package/dist/lib/neutral/{run-prompt-in-new-chat-D5IIE2C7.mjs → run-prompt-in-new-chat-NIAGCKQV.mjs} +11 -8
- package/dist/lib/neutral/run-prompt-in-new-chat-NIAGCKQV.mjs.map +7 -0
- package/dist/lib/neutral/{settings-W4BLWQ53.mjs → settings-7Q3RITIT.mjs} +3 -3
- package/dist/lib/neutral/{settings-W4BLWQ53.mjs.map → settings-7Q3RITIT.mjs.map} +3 -3
- package/dist/lib/neutral/{state-H3G7QCU6.mjs → state-XO2UYSSG.mjs} +2 -2
- package/dist/lib/neutral/{state-H3G7QCU6.mjs.map → state-XO2UYSSG.mjs.map} +3 -3
- package/dist/lib/neutral/testing.mjs +1 -1
- package/dist/lib/neutral/translations.mjs +18 -11
- package/dist/lib/neutral/translations.mjs.map +3 -3
- package/dist/lib/neutral/types/index.mjs +1 -1
- package/dist/types/dx.config.d.ts +28 -0
- package/dist/types/dx.config.d.ts.map +1 -0
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +17 -57
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +2 -2
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/components/Chat/Chat.d.ts +6 -3
- package/dist/types/src/components/Chat/Chat.d.ts.map +1 -1
- package/dist/types/src/components/Chat/Chat.stories.d.ts +32 -0
- package/dist/types/src/components/Chat/Chat.stories.d.ts.map +1 -0
- package/dist/types/src/components/ChatPrompt/ChatActions.d.ts.map +1 -1
- package/dist/types/src/components/ChatPrompt/ChatOptions.d.ts.map +1 -1
- package/dist/types/src/components/ProcessTree/ProcessTree.d.ts +6 -0
- package/dist/types/src/components/ProcessTree/ProcessTree.d.ts.map +1 -1
- package/dist/types/src/components/ProcessTree/ProcessTree.stories.d.ts +1 -0
- package/dist/types/src/components/ProcessTree/ProcessTree.stories.d.ts.map +1 -1
- package/dist/types/src/components/TaskList/TaskList.d.ts +8 -0
- package/dist/types/src/components/TaskList/TaskList.d.ts.map +1 -1
- package/dist/types/src/components/TaskList/TaskList.stories.d.ts +3 -0
- package/dist/types/src/components/TaskList/TaskList.stories.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +1 -0
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/containers/ChatArticle/ChatArticle.d.ts +2 -2
- package/dist/types/src/containers/ChatArticle/ChatArticle.d.ts.map +1 -1
- package/dist/types/src/containers/ChatCompanion/ChatCompanion.d.ts +2 -2
- package/dist/types/src/containers/ChatDialog/ChatDialog.d.ts.map +1 -1
- package/dist/types/src/containers/PlanArticle/PlanArticle.d.ts.map +1 -1
- package/dist/types/src/containers/SpaceHomePrompt/SpaceHomePrompt.d.ts +15 -0
- package/dist/types/src/containers/SpaceHomePrompt/SpaceHomePrompt.d.ts.map +1 -0
- package/dist/types/src/containers/SpaceHomePrompt/index.d.ts +2 -0
- package/dist/types/src/containers/SpaceHomePrompt/index.d.ts.map +1 -0
- package/dist/types/src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.d.ts +13 -0
- package/dist/types/src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.d.ts.map +1 -0
- package/dist/types/src/containers/SpaceHomeSuggestions/index.d.ts +2 -0
- package/dist/types/src/containers/SpaceHomeSuggestions/index.d.ts.map +1 -0
- package/dist/types/src/containers/TracePanel/TracePanel.d.ts.map +1 -1
- package/dist/types/src/containers/index.d.ts +2 -0
- package/dist/types/src/containers/index.d.ts.map +1 -1
- package/dist/types/src/execution-graph/execution-graph.d.ts +18 -0
- package/dist/types/src/execution-graph/execution-graph.d.ts.map +1 -1
- package/dist/types/src/execution-graph/index.d.ts +2 -1
- package/dist/types/src/execution-graph/index.d.ts.map +1 -1
- package/dist/types/src/execution-graph/pending-block-status.d.ts +26 -0
- package/dist/types/src/execution-graph/pending-block-status.d.ts.map +1 -0
- package/dist/types/src/execution-graph/pending-block-status.test.d.ts +2 -0
- package/dist/types/src/execution-graph/pending-block-status.test.d.ts.map +1 -0
- package/dist/types/src/extensions/prompt-extension.d.ts +1 -1
- package/dist/types/src/extensions/prompt-extension.d.ts.map +1 -1
- package/dist/types/src/feed-logger.d.ts +3 -2
- package/dist/types/src/feed-logger.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +2 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useProcessEphemeralStatus.d.ts +10 -0
- package/dist/types/src/hooks/useProcessEphemeralStatus.d.ts.map +1 -0
- package/dist/types/src/hooks/useTraceMessages.d.ts +12 -0
- package/dist/types/src/hooks/useTraceMessages.d.ts.map +1 -0
- package/dist/types/src/meta.d.ts +28 -2
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/operations/run-prompt-in-new-chat.d.ts.map +1 -1
- package/dist/types/src/paths.d.ts.map +1 -1
- package/dist/types/src/processor/processor.d.ts +23 -0
- package/dist/types/src/processor/processor.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/Assistant.d.ts +1 -1
- package/dist/types/src/types/AssistantCapabilities.d.ts.map +1 -1
- package/dist/types/src/types/AssistantEvents.d.ts.map +1 -1
- package/dist/types/src/types/AssistantOperation.d.ts +7 -7
- package/dist/types/src/util/error-cause.d.ts +3 -0
- package/dist/types/src/util/error-cause.d.ts.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dx.config.ts +38 -0
- package/package.json +71 -70
- package/src/AssistantPlugin.conversations.json +1 -1
- package/src/AssistantPlugin.test.ts +1 -1
- package/src/AssistantPlugin.ts +2 -2
- package/src/capabilities/agent-service.ts +5 -1
- package/src/capabilities/app-graph-builder.ts +15 -20
- package/src/capabilities/blueprint-definition.ts +2 -0
- package/src/capabilities/index.ts +1 -7
- package/src/capabilities/markdown-extension.ts +5 -1
- package/src/capabilities/react-surface.tsx +38 -23
- package/src/capabilities/settings.ts +2 -2
- package/src/capabilities/state.ts +1 -1
- package/src/components/AgentProperties/AgentProperties.tsx +1 -1
- package/src/components/AssistantSettings/AssistantSettings.tsx +2 -2
- package/src/components/Chat/Chat.stories.tsx +94 -0
- package/src/components/Chat/Chat.tsx +39 -6
- package/src/components/ChatPrompt/ChatActions.tsx +4 -2
- package/src/components/ChatPrompt/ChatMcpErrors.tsx +1 -1
- package/src/components/ChatPrompt/ChatOptions.tsx +26 -29
- package/src/components/ChatPrompt/ChatPrompt.tsx +1 -1
- package/src/components/ChatPrompt/ChatReferences.tsx +1 -1
- package/src/components/ChatThread/Anchor.stories.tsx +1 -1
- package/src/components/ChatThread/ChatThread.stories.tsx +1 -1
- package/src/components/ChatThread/DEBUG.md +23 -0
- package/src/components/ChatThread/widgets/SummaryWidget.tsx +1 -1
- package/src/components/ChatThread/widgets/ToolWidget.tsx +1 -1
- package/src/components/ProcessTree/ProcessTree.stories.tsx +7 -0
- package/src/components/ProcessTree/ProcessTree.tsx +191 -88
- package/src/components/TaskList/TaskList.stories.tsx +23 -2
- package/src/components/TaskList/TaskList.tsx +122 -28
- package/src/components/TemplateEditor/TemplateEditor.tsx +1 -1
- package/src/components/TemplateEditor/TemplateForm.tsx +1 -1
- package/src/components/ToolBlock/ToolBlock.tsx +1 -1
- package/src/components/index.ts +1 -0
- package/src/containers/AgentArticle/AgentArticle.stories.tsx +4 -4
- package/src/containers/AgentArticle/AgentArticle.tsx +9 -9
- package/src/containers/ChatArticle/ChatArticle.tsx +18 -10
- package/src/containers/ChatCompanion/ChatCompanion.tsx +2 -2
- package/src/containers/ChatDialog/ChatDialog.tsx +5 -3
- package/src/containers/PlanArticle/PlanArticle.tsx +5 -1
- package/src/containers/RoutineArticle/RoutineArticle.tsx +2 -2
- package/src/containers/SpaceHomePrompt/SpaceHomePrompt.tsx +105 -0
- package/src/containers/SpaceHomePrompt/index.ts +5 -0
- package/src/containers/SpaceHomeSuggestions/SpaceHomeSuggestions.tsx +69 -0
- package/src/containers/SpaceHomeSuggestions/index.ts +5 -0
- package/src/containers/TracePanel/TracePanel.tsx +3 -30
- package/src/containers/TriggerStatus/TriggerStatus.tsx +2 -2
- package/src/containers/index.ts +2 -0
- package/src/execution-graph/execution-graph.ts +130 -0
- package/src/execution-graph/index.ts +10 -0
- package/src/execution-graph/pending-block-status.test.ts +114 -0
- package/src/execution-graph/pending-block-status.ts +88 -0
- package/src/execution-graph/sub-agent-delegation.test.ts +16 -1
- package/src/extensions/prompt-extension.ts +102 -73
- package/src/feed-logger.ts +21 -19
- package/src/hooks/index.ts +2 -0
- package/src/hooks/useChatProcessor.ts +1 -1
- package/src/hooks/useChatServices.ts +2 -2
- package/src/hooks/useChatToolbarActions.ts +5 -5
- package/src/hooks/useContextBinder.ts +1 -1
- package/src/hooks/useProcessEphemeralStatus.ts +192 -0
- package/src/hooks/useTraceMessages.ts +41 -0
- package/src/meta.ts +3 -31
- package/src/operations/create-chat.ts +1 -1
- package/src/operations/fork-chat.ts +3 -3
- package/src/operations/run-prompt-in-new-chat.ts +5 -3
- package/src/paths.ts +2 -2
- package/src/processor/processor.node.test.ts +71 -1
- package/src/processor/processor.ts +58 -2
- package/src/testing/data/trace-timeline-multiple.dx.json +1 -1
- package/src/testing/data/trace-timeline-remote.dx.json +1 -1
- package/src/testing/data/trace-timeline.dx.json +0 -1
- package/src/translations.ts +18 -10
- package/src/types/AssistantCapabilities.ts +3 -3
- package/src/types/AssistantEvents.ts +1 -1
- package/src/types/AssistantOperation.ts +1 -1
- package/src/util/error-cause.ts +21 -0
- package/dist/lib/neutral/AgentArticle-K7XM46OQ.mjs.map +0 -7
- package/dist/lib/neutral/AssistantSettings-GG52BLKS.mjs.map +0 -7
- package/dist/lib/neutral/ChatCompanion-LBUHYWQG.mjs.map +0 -7
- package/dist/lib/neutral/ChatDialog-DCA6FLOV.mjs.map +0 -7
- package/dist/lib/neutral/PlanArticle-TS5ULWYS.mjs.map +0 -7
- package/dist/lib/neutral/RoutineArticle-5NYXHRG6.mjs.map +0 -7
- package/dist/lib/neutral/TracePanel-KTZJ6JNR.mjs.map +0 -7
- package/dist/lib/neutral/TriggerStatus-X7Y5JFZJ.mjs.map +0 -7
- package/dist/lib/neutral/app-graph-builder-WUFHQH3Y.mjs.map +0 -7
- package/dist/lib/neutral/blueprint-definition-MH2QLYQH.mjs.map +0 -7
- package/dist/lib/neutral/chunk-HLANPOBA.mjs.map +0 -7
- package/dist/lib/neutral/chunk-QAZMOFPI.mjs.map +0 -7
- package/dist/lib/neutral/chunk-RKVVK3R3.mjs.map +0 -7
- package/dist/lib/neutral/chunk-VTK5R4H3.mjs +0 -9
- package/dist/lib/neutral/chunk-VTK5R4H3.mjs.map +0 -7
- package/dist/lib/neutral/chunk-XYHPOGTK.mjs +0 -43
- package/dist/lib/neutral/chunk-XYHPOGTK.mjs.map +0 -7
- package/dist/lib/neutral/chunk-YXRGZYYH.mjs.map +0 -7
- package/dist/lib/neutral/fork-chat-34KEF4ZJ.mjs.map +0 -7
- package/dist/lib/neutral/markdown-extension-YMIFDMYF.mjs +0 -110
- package/dist/lib/neutral/markdown-extension-YMIFDMYF.mjs.map +0 -7
- package/dist/lib/neutral/react-surface-XRTBW5OJ.mjs.map +0 -7
- package/dist/lib/neutral/run-prompt-in-new-chat-D5IIE2C7.mjs.map +0 -7
- package/src/testing/trace-timeline.node.conversations.json +0 -1
- /package/dist/lib/neutral/{ChatArticle-VNVZCDUR.mjs.map → ChatArticle-KT46SUFU.mjs.map} +0 -0
- /package/dist/lib/neutral/{chunk-SMFJD7BP.mjs.map → chunk-7FQT4XMI.mjs.map} +0 -0
- /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.
|
|
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.
|
|
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.
|
|
150
|
-
const [view, setView] = useObject(chat, '
|
|
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
|
-
{
|
|
156
|
-
|
|
157
|
-
<Listbox.
|
|
158
|
-
|
|
159
|
-
|
|
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
|
-
{
|
|
173
|
-
|
|
174
|
-
<Listbox.
|
|
175
|
-
<Listbox.
|
|
176
|
-
<Listbox.
|
|
177
|
-
</Listbox.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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;
|
|
@@ -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 {
|
|
11
|
-
|
|
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
|
|
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
|
-
{
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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 = {};
|