@datalayer/agent-runtimes 1.0.10 → 1.0.18
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/README.md +82 -1
- package/lib/{AgentLexical.d.ts → AgentDocument.d.ts} +5 -5
- package/lib/{AgentLexical.js → AgentDocument.js} +156 -26
- package/lib/AgentNode.js +32 -31
- package/lib/AgentNotebook.js +172 -17
- package/lib/AppExamples2.css +47 -0
- package/lib/AppExamples2.d.ts +3 -0
- package/lib/AppExamples2.js +21 -0
- package/lib/{agent-lexical-main.js → agent-document-main.js} +2 -2
- package/lib/agents/AgentRuntimeChat.d.ts +73 -0
- package/lib/agents/AgentRuntimeChat.js +198 -0
- package/lib/api/index.d.ts +12 -0
- package/lib/api/index.js +46 -0
- package/lib/api/runtimes/checkpoints.d.ts +122 -0
- package/lib/api/runtimes/checkpoints.js +118 -0
- package/lib/api/runtimes/environments.d.ts +9 -0
- package/lib/api/runtimes/environments.js +29 -0
- package/lib/api/runtimes/healthz.d.ts +15 -0
- package/lib/api/runtimes/healthz.js +44 -0
- package/lib/api/runtimes/index.d.ts +12 -0
- package/lib/api/runtimes/index.js +16 -0
- package/lib/api/runtimes/runtimes.d.ts +138 -0
- package/lib/api/runtimes/runtimes.js +230 -0
- package/lib/api/runtimes/snapshots.d.ts +38 -0
- package/lib/api/runtimes/snapshots.js +82 -0
- package/lib/api/scheduler/index.d.ts +6 -0
- package/lib/api/scheduler/index.js +10 -0
- package/lib/api/scheduler/schedules.d.ts +85 -0
- package/lib/api/scheduler/schedules.js +78 -0
- package/lib/api/spacer/documents.d.ts +12 -0
- package/lib/api/spacer/documents.js +43 -0
- package/lib/api/spacer/healthz.d.ts +15 -0
- package/lib/api/spacer/healthz.js +44 -0
- package/lib/api/spacer/index.d.ts +15 -0
- package/lib/api/spacer/index.js +19 -0
- package/lib/api/spacer/items.d.ts +25 -0
- package/lib/api/spacer/items.js +55 -0
- package/lib/api/spacer/lexicals.d.ts +34 -0
- package/lib/api/spacer/lexicals.js +89 -0
- package/lib/api/spacer/notebooks.d.ts +34 -0
- package/lib/api/spacer/notebooks.js +89 -0
- package/lib/api/spacer/spaces.d.ts +84 -0
- package/lib/api/spacer/spaces.js +170 -0
- package/lib/api/spacer/users.d.ts +9 -0
- package/lib/api/spacer/users.js +29 -0
- package/lib/chat/Chat.d.ts +1 -1
- package/lib/chat/Chat.js +54 -54
- package/lib/chat/ChatFloating.d.ts +2 -2
- package/lib/chat/ChatFloating.js +136 -25
- package/lib/chat/ChatSidebar.js +20 -22
- package/lib/chat/base/ChatBase.js +429 -39
- package/lib/chat/display/EmptyState.js +21 -21
- package/lib/chat/document/EphemeralDocument.d.ts +23 -0
- package/lib/chat/document/EphemeralDocument.js +270 -0
- package/lib/chat/header/ChatHeaderBase.d.ts +12 -2
- package/lib/chat/header/ChatHeaderBase.js +78 -23
- package/lib/chat/index.d.ts +1 -0
- package/lib/chat/index.js +2 -0
- package/lib/chat/notebook/EphemeralNotebook.d.ts +24 -0
- package/lib/chat/notebook/EphemeralNotebook.js +252 -0
- package/lib/chat/prompt/InputFooter.js +4 -1
- package/lib/client/AgentRuntimesClient.d.ts +127 -0
- package/lib/client/AgentRuntimesClient.js +36 -0
- package/lib/client/AgentsMixin.js +28 -28
- package/lib/client/SdkAgentRuntimesClient.d.ts +1 -1
- package/lib/client/SdkAgentRuntimesClient.js +1 -1
- package/lib/client/mixins/RuntimesMixin.d.ts +93 -0
- package/lib/client/mixins/RuntimesMixin.js +229 -0
- package/lib/client/mixins/SpacerMixin.d.ts +210 -0
- package/lib/client/mixins/SpacerMixin.js +615 -0
- package/lib/client/utils/spacerUtils.d.ts +18 -0
- package/lib/client/utils/spacerUtils.js +32 -0
- package/lib/collaboration/DatalayerCollaboration.d.ts +13 -0
- package/lib/collaboration/DatalayerCollaboration.js +28 -0
- package/lib/collaboration/DatalayerCollaborationProvider.d.ts +58 -0
- package/lib/collaboration/DatalayerCollaborationProvider.js +148 -0
- package/lib/collaboration/index.d.ts +2 -0
- package/lib/collaboration/index.js +6 -0
- package/lib/components/AgentSummary.d.ts +19 -0
- package/lib/components/AgentSummary.js +89 -0
- package/lib/components/a2ui/A2uiSurfaceComposed.d.ts +13 -0
- package/lib/components/a2ui/A2uiSurfaceComposed.js +110 -0
- package/lib/components/a2ui/index.d.ts +2 -0
- package/lib/components/a2ui/index.js +6 -0
- package/lib/components/a2ui/styles.d.ts +14 -0
- package/lib/components/a2ui/styles.js +142 -0
- package/lib/components/context/SpaceSelect.d.ts +2 -0
- package/lib/components/context/SpaceSelect.js +42 -0
- package/lib/components/flashes/FlashDisclaimer.d.ts +2 -0
- package/lib/components/flashes/FlashDisclaimer.js +17 -0
- package/lib/components/icons/ArtifactIcon.d.ts +10 -0
- package/lib/components/icons/ArtifactIcon.js +58 -0
- package/lib/components/icons/index.d.ts +1 -0
- package/lib/components/icons/index.js +5 -0
- package/lib/components/index.d.ts +5 -0
- package/lib/components/index.js +5 -0
- package/lib/components/nbgrader/NbGradesDetails.d.ts +5 -0
- package/lib/components/nbgrader/NbGradesDetails.js +19 -0
- package/lib/components/nbgrader/index.d.ts +1 -0
- package/lib/components/nbgrader/index.js +5 -0
- package/lib/components/progress/CreditsIndicator.d.ts +33 -0
- package/lib/components/progress/CreditsIndicator.js +23 -0
- package/lib/components/progress/index.d.ts +2 -0
- package/lib/components/progress/index.js +6 -0
- package/lib/components/runtimes/RuntimeCellVariables.d.ts +39 -0
- package/lib/components/runtimes/RuntimeCellVariables.js +172 -0
- package/lib/components/runtimes/RuntimeCellVariablesDialog.d.ts +37 -0
- package/lib/components/runtimes/RuntimeCellVariablesDialog.js +101 -0
- package/lib/components/runtimes/RuntimeLauncherDialog.d.ts +57 -0
- package/lib/components/runtimes/RuntimeLauncherDialog.js +275 -0
- package/lib/components/runtimes/RuntimePickerBase.d.ts +69 -0
- package/lib/components/runtimes/RuntimePickerBase.js +122 -0
- package/lib/components/runtimes/RuntimePickerCell.d.ts +34 -0
- package/lib/components/runtimes/RuntimePickerCell.js +104 -0
- package/lib/components/runtimes/RuntimePickerNotebook.d.ts +42 -0
- package/lib/components/runtimes/RuntimePickerNotebook.js +232 -0
- package/lib/components/runtimes/RuntimeReservationControl.d.ts +47 -0
- package/lib/components/runtimes/RuntimeReservationControl.js +42 -0
- package/lib/components/runtimes/RuntimeSimplePicker.d.ts +38 -0
- package/lib/components/runtimes/RuntimeSimplePicker.js +155 -0
- package/lib/components/runtimes/RuntimeTransfer.d.ts +16 -0
- package/lib/components/runtimes/RuntimeTransfer.js +5 -0
- package/lib/components/runtimes/RuntimeUtils.d.ts +17 -0
- package/lib/components/runtimes/RuntimeUtils.js +178 -0
- package/lib/components/runtimes/RuntimeVariables.d.ts +38 -0
- package/lib/components/runtimes/RuntimeVariables.js +75 -0
- package/lib/components/runtimes/index.d.ts +11 -0
- package/lib/components/runtimes/index.js +15 -0
- package/lib/components/scheduler/ScheduleMenu.d.ts +54 -0
- package/lib/components/scheduler/ScheduleMenu.js +154 -0
- package/lib/components/scheduler/index.d.ts +1 -0
- package/lib/components/scheduler/index.js +5 -0
- package/lib/components/snapshots/SandboxSnapshotMenu.d.ts +33 -0
- package/lib/components/snapshots/SandboxSnapshotMenu.js +169 -0
- package/lib/components/snapshots/index.d.ts +1 -0
- package/lib/components/snapshots/index.js +5 -0
- package/lib/components/snippets/SnippetDialog.d.ts +42 -0
- package/lib/components/snippets/SnippetDialog.js +42 -0
- package/lib/components/students/StudentItemStatus.d.ts +7 -0
- package/lib/components/students/StudentItemStatus.js +68 -0
- package/lib/components/students/index.d.ts +1 -0
- package/lib/components/students/index.js +5 -0
- package/lib/components/tokens/SpaceVariantToken.d.ts +5 -0
- package/lib/components/tokens/SpaceVariantToken.js +23 -0
- package/lib/components/tokens/index.d.ts +1 -0
- package/lib/components/tokens/index.js +5 -0
- package/lib/components/toolbars/AssignmentEditorToolbar.d.ts +4 -0
- package/lib/components/toolbars/AssignmentEditorToolbar.js +18 -0
- package/lib/components/toolbars/DocumentEditorToolbar.d.ts +2 -0
- package/lib/components/toolbars/DocumentEditorToolbar.js +12 -0
- package/lib/components/toolbars/NotebookEditorToolbar.d.ts +29 -0
- package/lib/components/toolbars/NotebookEditorToolbar.js +30 -0
- package/lib/context/ContextInspector.d.ts +1 -14
- package/lib/context/ContextInspector.js +3 -73
- package/lib/context/CostUsageChart.d.ts +4 -3
- package/lib/context/CostUsageChart.js +236 -35
- package/lib/context/MessageHistory.d.ts +30 -0
- package/lib/context/MessageHistory.js +129 -0
- package/lib/context/TokenUsageChart.d.ts +4 -3
- package/lib/context/TokenUsageChart.js +180 -30
- package/lib/context/TurnGraphChart.d.ts +1 -1
- package/lib/context/TurnGraphChart.js +6 -6
- package/lib/examples/A2UiAgentExample.d.ts +22 -0
- package/lib/examples/A2UiAgentExample.js +442 -0
- package/lib/examples/A2UiComponentsGalleryExample.d.ts +3 -0
- package/lib/examples/A2UiComponentsGalleryExample.js +863 -0
- package/lib/examples/A2UiContactCardExample.js +9 -5
- package/lib/examples/A2UiRestaurantExample.js +23 -8
- package/lib/examples/A2UiViewerExample.js +75 -3
- package/lib/examples/AgUiAgenticExample.d.ts +1 -12
- package/lib/examples/AgUiAgenticExample.js +52 -8
- package/lib/examples/AgUiBackendToolRenderingExample.d.ts +1 -16
- package/lib/examples/AgUiBackendToolRenderingExample.js +32 -17
- package/lib/examples/AgUiHaikuGenUiExample.d.ts +1 -17
- package/lib/examples/AgUiHaikuGenUiExample.js +49 -33
- package/lib/examples/AgUiHumanInTheLoopExample.d.ts +1 -12
- package/lib/examples/AgUiHumanInTheLoopExample.js +21 -6
- package/lib/examples/AgUiSharedStateExample.d.ts +1 -14
- package/lib/examples/AgUiSharedStateExample.js +21 -6
- package/lib/examples/AgUiToolsBasedGenUiExample.d.ts +1 -14
- package/lib/examples/AgUiToolsBasedGenUiExample.js +21 -6
- package/lib/examples/AgentCheckpointsExample.d.ts +1 -1
- package/lib/examples/AgentCheckpointsExample.js +9 -10
- package/lib/examples/AgentCodeSandboxesExample.d.ts +3 -0
- package/lib/examples/AgentCodeSandboxesExample.js +192 -0
- package/lib/examples/AgentCodemodeExample.js +3 -3
- package/lib/examples/AgentEvalsExample.js +5 -5
- package/lib/examples/AgentGuardrailsExample.js +17 -12
- package/lib/examples/AgentHooksExample.js +14 -55
- package/lib/examples/AgentInferenceProviderExample.js +4 -4
- package/lib/examples/AgentLoopExample.d.ts +10 -0
- package/lib/examples/AgentLoopExample.js +304 -0
- package/lib/examples/AgentMCPExample.js +7 -7
- package/lib/examples/AgentMemoryExample.js +4 -4
- package/lib/examples/AgentMonitoringExample.js +114 -44
- package/lib/examples/AgentNotificationsExample.js +4 -4
- package/lib/examples/AgentOtelExample.d.ts +3 -3
- package/lib/examples/AgentOtelExample.js +15 -10
- package/lib/examples/AgentOutputsExample.js +6 -6
- package/lib/examples/AgentParametersExample.js +21 -33
- package/lib/examples/AgentSandboxExample.js +5 -5
- package/lib/examples/AgentSkillsExample.js +7 -7
- package/lib/examples/AgentSubagentsExample.js +4 -4
- package/lib/examples/AgentToolApprovalsExample.js +5 -5
- package/lib/examples/AgentTriggersExample.js +9 -9
- package/lib/examples/AgentspecsExample.js +63 -41
- package/lib/examples/ChatCustomExample.js +23 -77
- package/lib/examples/ChatExample.js +13 -44
- package/lib/examples/LexicalAgentExample.js +43 -91
- package/lib/examples/LexicalAgentSidebarExample.js +45 -73
- package/lib/examples/NotebookAgentExample.js +52 -81
- package/lib/examples/NotebookAgentSidebarExample.js +43 -71
- package/lib/examples/NotebookCollaborationExample.js +11 -9
- package/lib/examples/NotebookExample.js +5 -2
- package/lib/examples/components/AuthRequiredView.js +1 -1
- package/lib/examples/components/ExampleErrorBoundary.d.ts +46 -0
- package/lib/examples/components/ExampleErrorBoundary.js +67 -0
- package/lib/examples/components/haiku/haiku-card.css +11 -0
- package/lib/examples/components/weather/weather-card.css +11 -0
- package/lib/examples/example-selector.js +4 -1
- package/lib/examples/hooks/useExampleAgentRuntime.d.ts +35 -0
- package/lib/examples/hooks/useExampleAgentRuntime.js +82 -0
- package/lib/examples/hooks/useSpecRenderToolResult.d.ts +30 -0
- package/lib/examples/hooks/useSpecRenderToolResult.js +61 -0
- package/lib/examples/index.d.ts +4 -1
- package/lib/examples/index.js +4 -1
- package/lib/examples/main.js +340 -93
- package/lib/examples/utils/a2ui.d.ts +2 -0
- package/lib/examples/utils/a2ui.js +97 -2
- package/lib/examples/utils/agentSummaryStore.d.ts +21 -0
- package/lib/examples/utils/agentSummaryStore.js +23 -0
- package/lib/examples/utils/notebooks/Empty.ipynb.json +30 -30
- package/lib/examples/utils/runtimeTargetStore.d.ts +9 -0
- package/lib/examples/utils/runtimeTargetStore.js +27 -0
- package/lib/examples/utils/teardownAgents.d.ts +13 -0
- package/lib/examples/utils/teardownAgents.js +78 -0
- package/lib/examples/utils/useExampleAgentRuntimesUrl.d.ts +2 -0
- package/lib/examples/utils/useExampleAgentRuntimesUrl.js +26 -7
- package/lib/examples2/CellExample.d.ts +6 -0
- package/lib/examples2/CellExample.js +20 -0
- package/lib/examples2/DatalayerNotebookExample.d.ts +16 -0
- package/lib/examples2/DatalayerNotebookExample.js +109 -0
- package/lib/examples2/NativeNavigationExample.d.ts +8 -0
- package/lib/examples2/NativeNavigationExample.js +97 -0
- package/lib/examples2/NotebookExample.d.ts +6 -0
- package/lib/examples2/NotebookExample.js +19 -0
- package/lib/examples2/NotebookMutationsKernel.d.ts +2 -0
- package/lib/examples2/NotebookMutationsKernel.js +105 -0
- package/lib/examples2/NotebookMutationsServiceManager.d.ts +2 -0
- package/lib/examples2/NotebookMutationsServiceManager.js +109 -0
- package/lib/examples2/ReactRouterExample.d.ts +6 -0
- package/lib/examples2/ReactRouterExample.js +175 -0
- package/lib/examples2/example-selector.d.ts +22 -0
- package/lib/examples2/example-selector.js +45 -0
- package/lib/examples2/index.d.ts +2 -0
- package/lib/examples2/index.js +6 -0
- package/lib/examples2/lexical-theme.css +436 -0
- package/lib/examples2/main.d.ts +2 -0
- package/lib/examples2/main.js +330 -0
- package/lib/examples2/notebooks/IPyWidgetsExample.ipynb.json +101 -0
- package/lib/examples2/notebooks/IPyWidgetsExampleWithState.ipynb.json +112 -0
- package/lib/examples2/notebooks/Lite.ipynb.json +128 -0
- package/lib/examples2/notebooks/Matplotlib.ipynb.json +137 -0
- package/lib/examples2/notebooks/NotebookExample1.ipynb.json +126 -0
- package/lib/examples2/notebooks/NotebookExample2.ipynb.json +48 -0
- package/lib/examples2/notebooks/NotebookOutputs.ipynb.json +49 -0
- package/lib/examples2/notebooks/NotebookToCExample.ipynb.json +102 -0
- package/lib/examples2/notebooks/OutputIPyWidgetsExample.d.ts +145 -0
- package/lib/examples2/notebooks/OutputIPyWidgetsExample.js +153 -0
- package/lib/examples2/notebooks/PyGWalker.ipynb.json +55 -0
- package/lib/hooks/index.d.ts +9 -1
- package/lib/hooks/index.js +13 -1
- package/lib/hooks/useAIAgentsWebSocket.d.ts +1 -1
- package/lib/hooks/useAIAgentsWebSocket.js +39 -3
- package/lib/hooks/useAgentRuntimes.d.ts +15 -3
- package/lib/hooks/useAgentRuntimes.js +186 -27
- package/lib/hooks/useAgentsService.js +5 -5
- package/lib/hooks/useCellOutputshot.d.ts +4 -0
- package/lib/hooks/useCellOutputshot.js +25 -0
- package/lib/hooks/useCheckpoints.d.ts +8 -8
- package/lib/hooks/useCheckpoints.js +36 -26
- package/lib/hooks/useConfig.d.ts +1 -1
- package/lib/hooks/useMonitoring.d.ts +7 -5
- package/lib/hooks/useMonitoring.js +16 -10
- package/lib/hooks/useNotifications.d.ts +11 -11
- package/lib/hooks/useNotifications.js +1 -1
- package/lib/hooks/useProgressStore.d.ts +25 -0
- package/lib/hooks/useProgressStore.js +58 -0
- package/lib/hooks/useProgressTask.d.ts +9 -0
- package/lib/hooks/useProgressTask.js +41 -0
- package/lib/hooks/useProjects.d.ts +628 -0
- package/lib/hooks/useProjects.js +190 -0
- package/lib/hooks/useRuntimes.d.ts +5 -0
- package/lib/hooks/useRuntimes.js +34 -0
- package/lib/hooks/useToolApprovals.d.ts +6 -6
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/jupyter/exec/Python.d.ts +5 -0
- package/lib/jupyter/exec/Python.js +100 -0
- package/lib/jupyter/exec/Snippets.d.ts +105 -0
- package/lib/jupyter/exec/Snippets.js +101 -0
- package/lib/jupyter/exec/index.d.ts +2 -0
- package/lib/jupyter/exec/index.js +6 -0
- package/lib/jupyter/index.d.ts +2 -0
- package/lib/jupyter/index.js +6 -0
- package/lib/jupyter/kernelsHandler.d.ts +8 -0
- package/lib/jupyter/kernelsHandler.js +39 -0
- package/lib/mocks/models/CourseMock.d.ts +6 -0
- package/lib/mocks/models/CourseMock.js +29 -0
- package/lib/mocks/models/SpaceMock.d.ts +6 -0
- package/lib/mocks/models/SpaceMock.js +25 -0
- package/lib/models/Assignment.d.ts +7 -0
- package/lib/models/Assignment.js +5 -0
- package/lib/models/Cell.d.ts +8 -0
- package/lib/models/Cell.js +5 -0
- package/lib/models/CodeBlock.d.ts +10 -0
- package/lib/models/CodeBlock.js +5 -0
- package/lib/models/CodeSandboxSnapshot.d.ts +92 -0
- package/lib/models/CodeSandboxSnapshot.js +13 -0
- package/lib/models/CodeSandboxSnapshotDTO.d.ts +173 -0
- package/lib/models/CodeSandboxSnapshotDTO.js +139 -0
- package/lib/models/CodefeedBlocks.d.ts +7 -0
- package/lib/models/CodefeedBlocks.js +5 -0
- package/lib/models/Content.d.ts +5 -0
- package/lib/models/Content.js +5 -0
- package/lib/models/Course.d.ts +17 -0
- package/lib/models/Course.js +5 -0
- package/lib/models/Dataset.d.ts +16 -0
- package/lib/models/Dataset.js +5 -0
- package/lib/models/Document.d.ts +8 -0
- package/lib/models/Document.js +5 -0
- package/lib/models/Environment.d.ts +86 -0
- package/lib/models/Environment.js +5 -0
- package/lib/models/EnvironmentDTO.d.ts +125 -0
- package/lib/models/EnvironmentDTO.js +88 -0
- package/lib/models/Exercise.d.ts +16 -0
- package/lib/models/Exercise.js +5 -0
- package/lib/models/Item.d.ts +20 -0
- package/lib/models/Item.js +5 -0
- package/lib/models/ItemDTO.d.ts +74 -0
- package/lib/models/ItemDTO.js +186 -0
- package/lib/models/ItemType.d.ts +2 -0
- package/lib/models/ItemType.js +5 -0
- package/lib/models/Lesson.d.ts +5 -0
- package/lib/models/Lesson.js +5 -0
- package/lib/models/LexicalDTO.d.ts +155 -0
- package/lib/models/LexicalDTO.js +157 -0
- package/lib/models/Library.d.ts +10 -0
- package/lib/models/Library.js +5 -0
- package/lib/models/Notebook.d.ts +11 -0
- package/lib/models/Notebook.js +5 -0
- package/lib/models/NotebookDTO.d.ts +96 -0
- package/lib/models/NotebookDTO.js +153 -0
- package/lib/models/Page.d.ts +41 -0
- package/lib/models/Page.js +25 -0
- package/lib/models/PageTag.d.ts +19 -0
- package/lib/models/PageTag.js +94 -0
- package/lib/models/ProjectDTO.d.ts +89 -0
- package/lib/models/ProjectDTO.js +131 -0
- package/lib/models/Runtime.d.ts +160 -0
- package/lib/models/Runtime.js +18 -0
- package/lib/models/RuntimeDTO.d.ts +172 -0
- package/lib/models/RuntimeDTO.js +204 -0
- package/lib/models/Space.d.ts +35 -0
- package/lib/models/Space.js +66 -0
- package/lib/models/SpaceDTO.d.ts +334 -0
- package/lib/models/SpaceDTO.js +244 -0
- package/lib/models/SpaceItem.d.ts +10 -0
- package/lib/models/SpaceItem.js +5 -0
- package/lib/models/SpaceMember.d.ts +6 -0
- package/lib/models/SpaceMember.js +5 -0
- package/lib/models/StudentItem.d.ts +21 -0
- package/lib/models/StudentItem.js +5 -0
- package/lib/models/index.d.ts +32 -0
- package/lib/models/index.js +39 -0
- package/lib/protocols/AGUIAdapter.js +1 -1
- package/lib/runtimes/actions.d.ts +102 -0
- package/lib/runtimes/actions.js +249 -0
- package/lib/runtimes/apis.d.ts +273 -0
- package/lib/runtimes/apis.js +5 -0
- package/lib/runtimes/index.d.ts +5 -0
- package/lib/runtimes/index.js +9 -0
- package/lib/runtimes/settings.d.ts +15 -0
- package/lib/runtimes/settings.js +31 -0
- package/lib/runtimes/snapshots.d.ts +25 -0
- package/lib/runtimes/snapshots.js +150 -0
- package/lib/runtimes/utils.d.ts +7 -0
- package/lib/runtimes/utils.js +14 -0
- package/lib/services/DatalayerServiceManager.d.ts +23 -0
- package/lib/services/DatalayerServiceManager.js +90 -0
- package/lib/services/reconnectToRuntime.d.ts +32 -0
- package/lib/services/reconnectToRuntime.js +59 -0
- package/lib/services/sandboxServiceManagers.d.ts +31 -0
- package/lib/services/sandboxServiceManagers.js +57 -0
- package/lib/specs/agents/agents.d.ts +78 -26
- package/lib/specs/agents/agents.js +4434 -1639
- package/lib/specs/index.d.ts +1 -0
- package/lib/specs/index.js +1 -0
- package/lib/specs/loops.d.ts +34 -0
- package/lib/specs/loops.js +188 -0
- package/lib/specs/mcpServers.d.ts +1 -0
- package/lib/specs/mcpServers.js +17 -0
- package/lib/specs/models.d.ts +4 -0
- package/lib/specs/models.js +30 -0
- package/lib/specs/skills.d.ts +1 -0
- package/lib/specs/skills.js +18 -0
- package/lib/specs/tools.d.ts +15 -0
- package/lib/specs/tools.js +285 -0
- package/lib/state/index.d.ts +4 -0
- package/lib/state/index.js +10 -0
- package/lib/state/substates/CellState.d.ts +12 -0
- package/lib/state/substates/CellState.js +22 -0
- package/lib/state/substates/DocumentState.d.ts +10 -0
- package/lib/state/substates/DocumentState.js +14 -0
- package/lib/state/substates/GradeState.d.ts +10 -0
- package/lib/state/substates/GradeState.js +14 -0
- package/lib/state/substates/JupyterLabState.d.ts +16 -0
- package/lib/state/substates/JupyterLabState.js +17 -0
- package/lib/state/substates/NbformatState.d.ts +13 -0
- package/lib/state/substates/NbformatState.js +16 -0
- package/lib/state/substates/RuntimesState.d.ts +87 -0
- package/lib/state/substates/RuntimesState.js +192 -0
- package/lib/state/substates/SpaceState.d.ts +11 -0
- package/lib/state/substates/SpaceState.js +16 -0
- package/lib/state/substates/index.d.ts +8 -0
- package/lib/state/substates/index.js +14 -0
- package/lib/stores/agentRuntimeStore.d.ts +25 -2
- package/lib/stores/agentRuntimeStore.js +114 -19
- package/lib/stories/Button.stories.d.ts +1 -1
- package/lib/stories/Header.stories.d.ts +3 -3
- package/lib/test-setup.js +10 -0
- package/lib/types/agents-lifecycle.d.ts +5 -5
- package/lib/types/agents.d.ts +3 -3
- package/lib/types/agentspecs.d.ts +4 -2
- package/lib/types/chat.d.ts +135 -3
- package/lib/types/config.d.ts +19 -1
- package/lib/types/index.d.ts +1 -0
- package/lib/types/index.js +1 -0
- package/lib/types/loops.d.ts +64 -0
- package/lib/types/loops.js +5 -0
- package/lib/types/tools.d.ts +16 -0
- package/lib/utils/Cells.d.ts +2 -0
- package/lib/utils/Cells.js +28 -0
- package/package.json +24 -18
- package/scripts/codegen/__pycache__/generate_sandbox_agents.cpython-313.pyc +0 -0
- package/scripts/codegen/__pycache__/versioning.cpython-313.pyc +0 -0
- package/scripts/codegen/generate_agents.py +21 -4
- package/scripts/codegen/generate_loops.py +443 -0
- package/scripts/codegen/generate_sandbox_agents.py +145 -0
- package/lib/examples/A2UiComponentGalleryExample.d.ts +0 -3
- package/lib/examples/A2UiComponentGalleryExample.js +0 -361
- /package/lib/{agent-lexical-main.d.ts → agent-document-main.d.ts} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx as _jsx,
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
/*
|
|
3
3
|
* Copyright (c) 2025-2026 Datalayer, Inc.
|
|
4
4
|
* Distributed under the terms of the Modified BSD License.
|
|
@@ -16,9 +16,12 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
|
|
|
16
16
|
* @module chat/base/ChatBase
|
|
17
17
|
*/
|
|
18
18
|
import { useContext } from 'react';
|
|
19
|
-
import { useCallback, useEffect, useMemo, useRef, useState, } from 'react';
|
|
20
|
-
import { Text, Spinner } from '@primer/react';
|
|
21
|
-
import {
|
|
19
|
+
import React, { useCallback, useEffect, useMemo, useRef, useState, } from 'react';
|
|
20
|
+
import { Text, Spinner, IconButton } from '@primer/react';
|
|
21
|
+
import { SkeletonText } from '@primer/react/experimental';
|
|
22
|
+
import { SidebarExpandIcon } from '@primer/octicons-react';
|
|
23
|
+
import { notebookStore, JupyterReactTheme } from '@datalayer/jupyter-react';
|
|
24
|
+
import { Box, setupPrimerPortals, useThemeStore, getColorPalette, getThemeConfig, useSystemColorMode, } from '@datalayer/primer-addons';
|
|
22
25
|
import { AlertIcon, PersonIcon } from '@primer/octicons-react';
|
|
23
26
|
import { AiAgentIcon } from '@datalayer/icons-react';
|
|
24
27
|
import { QueryClientProvider, QueryClientContext } from '@tanstack/react-query';
|
|
@@ -33,13 +36,99 @@ import { useAgentRuntimeWebSocket } from '../../hooks/useAgentRuntimes';
|
|
|
33
36
|
import { agentRuntimeStore, useAgentRuntimeStore, useAgentRuntimeWsState, } from '../../stores/agentRuntimeStore';
|
|
34
37
|
import { ChatBaseHeader } from '../header/ChatHeaderBase';
|
|
35
38
|
import { ChatEmptyState } from '../display/EmptyState';
|
|
39
|
+
import { FloatingBrandButton } from '../display/FloatingBrandButton';
|
|
36
40
|
import { PoweredByTag } from '../display/PoweredByTag';
|
|
37
41
|
import { ChatMessageList, } from '../messages/ChatMessageList';
|
|
38
42
|
import { InputToolbar } from '../prompt/InputFooter';
|
|
39
43
|
import { ToolApprovalBanner, ToolApprovalDialog, } from '../tools';
|
|
44
|
+
import { EphemeralNotebook } from '../notebook/EphemeralNotebook';
|
|
45
|
+
// EphemeralDocument statically imports `@datalayer/jupyter-lexical` (which
|
|
46
|
+
// initialises Lumino-backed nodes on load). Lazy-load it so notebook-only chats
|
|
47
|
+
// never pull lexical into the bundle or trigger its module side effects.
|
|
48
|
+
const EphemeralDocument = React.lazy(() => import('../document/EphemeralDocument').then(m => ({
|
|
49
|
+
default: m.EphemeralDocument,
|
|
50
|
+
})));
|
|
51
|
+
import { useNotebookTools } from '../../tools/adapters/agent-runtimes/notebookHooks';
|
|
40
52
|
// Tracks pending prompts already auto-sent for a given conversation scope.
|
|
41
53
|
// This prevents layout-driven unmount/remount cycles from re-sending prompts.
|
|
42
54
|
const sentPendingPromptKeys = new Set();
|
|
55
|
+
/**
|
|
56
|
+
* Inline skeleton placeholder rendered inside the companion surface (notebook
|
|
57
|
+
* or document) while the agent runtime is still launching and the real
|
|
58
|
+
* ephemeral notebook/document is not yet ready. Shown in place of the surface
|
|
59
|
+
* content (never as an overlay) so structure appears as early as possible.
|
|
60
|
+
*/
|
|
61
|
+
function CompanionSurfaceSkeleton({ mode }) {
|
|
62
|
+
return (_jsx(Box, { "aria-label": mode === 'notebook' ? 'Preparing notebook…' : 'Preparing document…', sx: {
|
|
63
|
+
flex: 1,
|
|
64
|
+
minHeight: 0,
|
|
65
|
+
overflow: 'hidden',
|
|
66
|
+
display: 'flex',
|
|
67
|
+
flexDirection: 'column',
|
|
68
|
+
gap: 3,
|
|
69
|
+
p: 4,
|
|
70
|
+
}, children: mode === 'notebook' ? (_jsx(_Fragment, { children: [0, 1, 2].map(i => (_jsxs(Box, { sx: {
|
|
71
|
+
p: 3,
|
|
72
|
+
border: '1px solid',
|
|
73
|
+
borderColor: 'border.muted',
|
|
74
|
+
borderRadius: 2,
|
|
75
|
+
bg: 'canvas.subtle',
|
|
76
|
+
display: 'flex',
|
|
77
|
+
flexDirection: 'column',
|
|
78
|
+
gap: 2,
|
|
79
|
+
}, children: [_jsx(SkeletonText, { lines: 1 }), _jsx(SkeletonText, { lines: i === 0 ? 2 : 3 })] }, i))) })) : (_jsxs(Box, { sx: {
|
|
80
|
+
maxWidth: 860,
|
|
81
|
+
width: '100%',
|
|
82
|
+
mx: 'auto',
|
|
83
|
+
display: 'flex',
|
|
84
|
+
flexDirection: 'column',
|
|
85
|
+
gap: 3,
|
|
86
|
+
}, children: [_jsx(SkeletonText, { lines: 1 }), _jsx(SkeletonText, { lines: 4 }), _jsx(SkeletonText, { lines: 3 }), _jsx(SkeletonText, { lines: 5 })] })) }));
|
|
87
|
+
}
|
|
88
|
+
// JupyterReactTheme forwards unknown props (e.g. `style`) to its inner Primer
|
|
89
|
+
// `BaseStyles`. `style` is not part of its typings, so we widen the type here.
|
|
90
|
+
const ThemedJupyterReactTheme = JupyterReactTheme;
|
|
91
|
+
/**
|
|
92
|
+
* Theme boundary shared by every chat variant.
|
|
93
|
+
*
|
|
94
|
+
* Makes the chat follow the active Datalayer theme *variant* (matrix, earth,
|
|
95
|
+
* …) — its colours AND fonts — not merely the color mode, while keeping the
|
|
96
|
+
* jupyter-react Primer context required by `KernelIndicator`.
|
|
97
|
+
*
|
|
98
|
+
* Implementation notes:
|
|
99
|
+
* - We deliberately DON'T nest a `DatalayerThemeProvider` here. The host layout
|
|
100
|
+
* already provides one, and it themes Primer portals by writing styles onto
|
|
101
|
+
* `document.body`. Nesting another (especially one carrying layout styles
|
|
102
|
+
* like `display: contents`) clobbers those body/portal styles and breaks
|
|
103
|
+
* every overlay menu globally.
|
|
104
|
+
* - Instead we re-assert the variant's CSS custom properties (`--bgColor-*`,
|
|
105
|
+
* `--fgColor-*`, `--fontStack-*`, …) INLINE on `JupyterReactTheme`'s
|
|
106
|
+
* `BaseStyles`. Inline styles win over the `@primer/primitives`
|
|
107
|
+
* `[data-color-mode]` rules that `JupyterReactTheme` re-scopes, so the chat
|
|
108
|
+
* subtree renders in the selected theme (colours + fonts). `JupyterReactTheme`
|
|
109
|
+
* also supplies the matching Primer theme object + resolved color mode for
|
|
110
|
+
* jupyter-react components.
|
|
111
|
+
* - `display: contents` keeps the boundary from emitting a layout box (so the
|
|
112
|
+
* chat height/flex chain is preserved); CSS custom properties and inherited
|
|
113
|
+
* properties (color, font) still cascade through it.
|
|
114
|
+
*/
|
|
115
|
+
function ThemedChatBoundary({ children }) {
|
|
116
|
+
const colorMode = useThemeStore(s => s.colorMode);
|
|
117
|
+
const themeVariant = useThemeStore(s => s.theme);
|
|
118
|
+
const systemMode = useSystemColorMode();
|
|
119
|
+
const themeConfig = getThemeConfig(themeVariant);
|
|
120
|
+
const resolvedMode = colorMode === 'auto' ? systemMode : colorMode;
|
|
121
|
+
const modeStyles = resolvedMode === 'dark'
|
|
122
|
+
? themeConfig.themeStyles.dark
|
|
123
|
+
: themeConfig.themeStyles.light;
|
|
124
|
+
const themeBackground = modeStyles.backgroundColor ?? '';
|
|
125
|
+
return (_jsx(ThemedJupyterReactTheme, { colormode: resolvedMode, theme: themeConfig.primerTheme, backgroundColor: themeBackground, loadJupyterLabCss: false, style: {
|
|
126
|
+
...modeStyles,
|
|
127
|
+
color: 'var(--fgColor-default)',
|
|
128
|
+
fontSize: 'var(--text-body-size-medium)',
|
|
129
|
+
display: 'contents',
|
|
130
|
+
}, children: children }));
|
|
131
|
+
}
|
|
43
132
|
const AI_AGENTS_API_PREFIX = '/api/ai-agents/v1';
|
|
44
133
|
const isDevTraceEnabled = () => {
|
|
45
134
|
try {
|
|
@@ -203,23 +292,85 @@ function extractChatMessagesFromFullContext(fullContext) {
|
|
|
203
292
|
return rawMessages
|
|
204
293
|
.map((msg, index) => {
|
|
205
294
|
const role = String(msg.role || '').toLowerCase();
|
|
206
|
-
// Only hydrate conversational turns in the visible history.
|
|
207
|
-
// System/tool messages may contain internal prompts and metadata.
|
|
208
|
-
if (role !== 'user' && role !== 'assistant') {
|
|
209
|
-
return null;
|
|
210
|
-
}
|
|
211
295
|
const timestampValue = typeof msg.timestamp === 'string' && msg.timestamp.length > 0
|
|
212
296
|
? msg.timestamp
|
|
213
297
|
: new Date().toISOString();
|
|
214
|
-
const
|
|
215
|
-
const
|
|
298
|
+
const createdAtRaw = new Date(timestampValue);
|
|
299
|
+
const createdAt = Number.isNaN(createdAtRaw.getTime())
|
|
300
|
+
? new Date()
|
|
301
|
+
: createdAtRaw;
|
|
302
|
+
const rawContent = typeof msg.content === 'string'
|
|
216
303
|
? msg.content
|
|
217
304
|
: JSON.stringify(msg.content ?? '');
|
|
305
|
+
const isToolCall = Boolean(msg.isToolCall);
|
|
306
|
+
const isToolResult = Boolean(msg.isToolResult);
|
|
307
|
+
const toolCallId = typeof msg.toolCallId === 'string' && msg.toolCallId.length > 0
|
|
308
|
+
? msg.toolCallId
|
|
309
|
+
: undefined;
|
|
310
|
+
const toolName = typeof msg.toolName === 'string' && msg.toolName.length > 0
|
|
311
|
+
? msg.toolName
|
|
312
|
+
: undefined;
|
|
313
|
+
// Tool-call turns arrive as assistant messages whose `content` is the
|
|
314
|
+
// JSON-encoded tool arguments. Reconstruct a structured `toolCalls`
|
|
315
|
+
// entry so it renders as a tool card (matching the live stream) instead
|
|
316
|
+
// of leaking raw JSON into the transcript.
|
|
317
|
+
if (isToolCall) {
|
|
318
|
+
let args = {};
|
|
319
|
+
if (rawContent) {
|
|
320
|
+
try {
|
|
321
|
+
const parsed = JSON.parse(rawContent);
|
|
322
|
+
if (parsed &&
|
|
323
|
+
typeof parsed === 'object' &&
|
|
324
|
+
!Array.isArray(parsed)) {
|
|
325
|
+
args = parsed;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
catch {
|
|
329
|
+
args = {};
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
const resolvedToolCallId = toolCallId || `history-tc-${index}`;
|
|
333
|
+
return {
|
|
334
|
+
id: `history-toolcall-${index}-${timestampValue}`,
|
|
335
|
+
role: 'assistant',
|
|
336
|
+
content: '',
|
|
337
|
+
createdAt,
|
|
338
|
+
toolCalls: [
|
|
339
|
+
{
|
|
340
|
+
type: 'tool-call',
|
|
341
|
+
toolCallId: resolvedToolCallId,
|
|
342
|
+
toolName: toolName || 'tool',
|
|
343
|
+
args,
|
|
344
|
+
status: 'completed',
|
|
345
|
+
},
|
|
346
|
+
],
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
// Tool results arrive as `role: 'tool'` messages; keep them (with the
|
|
350
|
+
// matching toolCallId) so `convertHistoryToDisplayItems` can merge the
|
|
351
|
+
// result into its tool card.
|
|
352
|
+
if (isToolResult || role === 'tool') {
|
|
353
|
+
return {
|
|
354
|
+
id: `history-toolresult-${index}-${timestampValue}`,
|
|
355
|
+
role: 'tool',
|
|
356
|
+
content: rawContent,
|
|
357
|
+
createdAt,
|
|
358
|
+
metadata: {
|
|
359
|
+
toolCallId,
|
|
360
|
+
toolName,
|
|
361
|
+
},
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
// Only hydrate conversational turns in the visible history.
|
|
365
|
+
// System messages may contain internal prompts and metadata.
|
|
366
|
+
if (role !== 'user' && role !== 'assistant') {
|
|
367
|
+
return null;
|
|
368
|
+
}
|
|
218
369
|
return {
|
|
219
370
|
id: `history-${role}-${index}-${timestampValue}`,
|
|
220
371
|
role,
|
|
221
|
-
content,
|
|
222
|
-
createdAt
|
|
372
|
+
content: rawContent,
|
|
373
|
+
createdAt,
|
|
223
374
|
};
|
|
224
375
|
})
|
|
225
376
|
.filter((m) => m !== null);
|
|
@@ -281,7 +432,7 @@ function parseApprovedMcpToolsByServer(mcpStatusData) {
|
|
|
281
432
|
* ChatBase component — Universal chat panel supporting store, protocol, and custom modes.
|
|
282
433
|
*/
|
|
283
434
|
export function ChatBase(props) {
|
|
284
|
-
const { agentRuntimeConfig, protocol: protocolProp, useStore: useStoreMode = true, } = props;
|
|
435
|
+
const { agentRuntimeConfig, protocol: protocolProp, useStore: useStoreMode = true, disableInternalJupyterTheme = false, } = props;
|
|
285
436
|
// Resolve protocol: string Protocol overrides type in agentRuntimeConfig or
|
|
286
437
|
// is combined with a full ProtocolConfig object.
|
|
287
438
|
const protocolType = typeof protocolProp === 'string' ? protocolProp : undefined;
|
|
@@ -307,19 +458,21 @@ export function ChatBase(props) {
|
|
|
307
458
|
protocol: protocol,
|
|
308
459
|
useStore: effectiveUseStoreMode,
|
|
309
460
|
};
|
|
461
|
+
const content = _jsx(ChatBaseInner, { ...innerProps });
|
|
462
|
+
const wrappedContent = disableInternalJupyterTheme ? (content) : (_jsx(ThemedChatBoundary, { children: content }));
|
|
310
463
|
if (!existingQueryClient) {
|
|
311
|
-
return (_jsx(QueryClientProvider, { client: internalQueryClient, children:
|
|
464
|
+
return (_jsx(QueryClientProvider, { client: internalQueryClient, children: wrappedContent }));
|
|
312
465
|
}
|
|
313
|
-
return
|
|
466
|
+
return wrappedContent;
|
|
314
467
|
}
|
|
315
468
|
// ---------------------------------------------------------------------------
|
|
316
469
|
// ChatBaseInner — contains all actual logic
|
|
317
470
|
// ---------------------------------------------------------------------------
|
|
318
|
-
function ChatBaseInner({ title, subtitle, showHeader = false, showTokenUsage = true, showLoadingIndicator = true, showErrors = true, showInput = true, showModelSelector = true, showToolsMenu = true, showSkillsMenu = true, disableInputPrompt = false, codemodeEnabled = false, onToggleCodemode, initialModel, availableModels, mcpServers, initialSkills: _initialSkills, className, loadingState, headerActions, kernelIndicatorState, kernel, kernelEnvironmentName, kernelCpu, kernelMemory, kernelGpu, chatViewMode, onChatViewModeChange,
|
|
471
|
+
function ChatBaseInner({ title, subtitle, showHeader = false, showTokenUsage = true, showLoadingIndicator = true, showErrors = true, showInput = true, showModelSelector = true, showToolsMenu = true, showSkillsMenu = true, disableInputPrompt = false, overlay, launching = false, launchingMessage, autoConnect = true, codemodeEnabled = false, onToggleCodemode, initialModel, availableModels, mcpServers, initialSkills: _initialSkills, className, loadingState, headerActions, kernelIndicatorState, kernel, kernelEnvironmentName, kernelCpu, kernelMemory, kernelGpu, chatViewMode, onChatViewModeChange,
|
|
319
472
|
// Mode selection
|
|
320
473
|
useStore: useStoreMode = true, protocol: protocolRaw, onSendMessage, enableStreaming = false,
|
|
321
474
|
// Extended props
|
|
322
|
-
brandIcon, avatarConfig, headerButtons, showPoweredBy = false, poweredByProps, emptyState, renderToolResult, footerContent, showInformation = false, onInformationClick, headerContent, children, borderRadius, backgroundColor, border, boxShadow, compact = false, placeholder, description = 'Start a conversation with the AI agent.', onStateUpdate, onNewChat, onClear, onMessagesChange, autoFocus = false, suggestions, submitOnSuggestionClick = true, hideMessagesAfterToolUI = false, focusTrigger, frontendTools,
|
|
475
|
+
brandIcon, avatarConfig, headerButtons, showPoweredBy = false, poweredByProps, emptyState, renderToolResult, footerContent, showInformation = false, onInformationClick, headerContent, children, borderRadius, backgroundColor, border, boxShadow, compact = false, placeholder, description = 'Start a conversation with the AI agent.', onStateUpdate, onNewChat, onClear, onMessagesChange, autoFocus = false, suggestions, submitOnSuggestionClick = true, hideMessagesAfterToolUI = false, focusTrigger, frontendTools: frontendToolsProp, enableEphemeralNotebook = false, initialEphemeralNotebookOpen = true, onEphemeralNotebookOpenChange, enableEphemeralDocument = false, initialEphemeralSurfaceMode, onEphemeralSurfaceModeChange, collapsed = false, onExpandFromCollapsed, ephemeralNotebookToolbar,
|
|
323
476
|
// Tool invocation hooks
|
|
324
477
|
onToolCallStart, onToolCallComplete,
|
|
325
478
|
// Identity/Authorization props
|
|
@@ -344,10 +497,114 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
|
|
|
344
497
|
const protocolConfig = typeof protocolRaw === 'object'
|
|
345
498
|
? protocolRaw
|
|
346
499
|
: undefined;
|
|
347
|
-
const configuredAiAgentsBaseUrl = useCoreStore((s) => s.configuration?.
|
|
500
|
+
const configuredAiAgentsBaseUrl = useCoreStore((s) => s.configuration?.aiAgentsUrl);
|
|
348
501
|
const activeAgentId = protocolConfig?.agentId || runtimeId;
|
|
349
502
|
const historyScopeId = runtimeId || activeAgentId;
|
|
350
503
|
const aiAgentsAuthToken = protocolConfig?.authToken;
|
|
504
|
+
// ── Ephemeral notebook (in-memory) ──────────────────────────────────────
|
|
505
|
+
// A stable notebook id scoped to this chat instance. Must match the id used
|
|
506
|
+
// by `useNotebookTools` so the agent's notebook tools drive this notebook.
|
|
507
|
+
const generatedNotebookIdRef = useRef(`ephemeral-notebook-${Math.random().toString(36).slice(2, 10)}`);
|
|
508
|
+
// Scope the ephemeral notebook to the STABLE runtime identity first (the pod
|
|
509
|
+
// name / route id that stays constant across navigation), falling back to the
|
|
510
|
+
// agent id. This keeps the persisted notebook model addressable by the same
|
|
511
|
+
// key when navigating away from and back to the same runtime page.
|
|
512
|
+
const notebookScopeId = runtimeId || protocolConfig?.agentId || activeAgentId;
|
|
513
|
+
const ephemeralNotebookId = notebookScopeId
|
|
514
|
+
? `ephemeral-notebook-${notebookScopeId}`
|
|
515
|
+
: generatedNotebookIdRef.current;
|
|
516
|
+
const persistedEphemeralNbformat = useAgentRuntimeStore(s => s.getEphemeralNotebookModel(ephemeralNotebookId));
|
|
517
|
+
const setEphemeralNotebookModel = useAgentRuntimeStore(s => s.setEphemeralNotebookModel);
|
|
518
|
+
const handleEphemeralNotebookChange = useCallback((model) => {
|
|
519
|
+
setEphemeralNotebookModel(ephemeralNotebookId, model);
|
|
520
|
+
}, [ephemeralNotebookId, setEphemeralNotebookModel]);
|
|
521
|
+
// ── Ephemeral document (in-memory Lexical) ──────────────────────────────
|
|
522
|
+
// Scoped to the same stable runtime identity as the notebook so the persisted
|
|
523
|
+
// document survives navigation away from and back to the runtime page.
|
|
524
|
+
const ephemeralDocumentId = notebookScopeId
|
|
525
|
+
? `ephemeral-document-${notebookScopeId}`
|
|
526
|
+
: `ephemeral-document-${generatedNotebookIdRef.current}`;
|
|
527
|
+
const persistedEphemeralDocument = useAgentRuntimeStore(s => s.getEphemeralDocumentModel(ephemeralDocumentId));
|
|
528
|
+
const setEphemeralDocumentModel = useAgentRuntimeStore(s => s.setEphemeralDocumentModel);
|
|
529
|
+
const handleEphemeralDocumentChange = useCallback((model) => {
|
|
530
|
+
setEphemeralDocumentModel(ephemeralDocumentId, model);
|
|
531
|
+
}, [ephemeralDocumentId, setEphemeralDocumentModel]);
|
|
532
|
+
// ── Companion surface mode (none / notebook / document) ─────────────────
|
|
533
|
+
const defaultSurfaceMode = initialEphemeralSurfaceMode ??
|
|
534
|
+
(enableEphemeralNotebook && initialEphemeralNotebookOpen
|
|
535
|
+
? 'notebook'
|
|
536
|
+
: 'none');
|
|
537
|
+
const [ephemeralSurfaceMode, setEphemeralSurfaceMode] = useState(defaultSurfaceMode);
|
|
538
|
+
const handleEphemeralSurfaceModeChange = useCallback((mode) => {
|
|
539
|
+
setEphemeralSurfaceMode(mode);
|
|
540
|
+
onEphemeralSurfaceModeChange?.(mode);
|
|
541
|
+
// Back-compat: keep the legacy notebook open-state callback in sync.
|
|
542
|
+
onEphemeralNotebookOpenChange?.(mode === 'notebook');
|
|
543
|
+
}, [onEphemeralSurfaceModeChange, onEphemeralNotebookOpenChange]);
|
|
544
|
+
const notebookVisible = enableEphemeralNotebook && ephemeralSurfaceMode === 'notebook';
|
|
545
|
+
const documentVisible = enableEphemeralDocument && ephemeralSurfaceMode === 'document';
|
|
546
|
+
const surfaceVisible = notebookVisible || documentVisible;
|
|
547
|
+
const surfaceCollapsed = surfaceVisible && collapsed && Boolean(onExpandFromCollapsed);
|
|
548
|
+
// Track the ephemeral notebook's live kernel connection so the chat header
|
|
549
|
+
// renders the same rich `KernelIndicator` details (kernel id, client id,
|
|
550
|
+
// server/ws url, status) as the notebook editor. Without this the header
|
|
551
|
+
// falls back to the sandbox-status placeholder ("disconnected", "no-kernel").
|
|
552
|
+
const [notebookKernel, setNotebookKernel] = useState(null);
|
|
553
|
+
useEffect(() => {
|
|
554
|
+
if (!notebookVisible) {
|
|
555
|
+
setNotebookKernel(null);
|
|
556
|
+
return;
|
|
557
|
+
}
|
|
558
|
+
const readKernel = () => {
|
|
559
|
+
const notebook = notebookStore
|
|
560
|
+
.getState()
|
|
561
|
+
.selectNotebook(ephemeralNotebookId);
|
|
562
|
+
const adapter = notebook?.adapter;
|
|
563
|
+
return adapter?.kernel ?? null;
|
|
564
|
+
};
|
|
565
|
+
const sync = () => {
|
|
566
|
+
const next = readKernel();
|
|
567
|
+
setNotebookKernel(prev => (prev?.id === next?.id ? prev : next));
|
|
568
|
+
};
|
|
569
|
+
sync();
|
|
570
|
+
// Poll: the kernel connection appears asynchronously after the notebook
|
|
571
|
+
// mounts and can change on restart. Also react to store mutations.
|
|
572
|
+
const intervalId = window.setInterval(sync, 750);
|
|
573
|
+
const unsubscribe = notebookStore.subscribe(sync);
|
|
574
|
+
return () => {
|
|
575
|
+
window.clearInterval(intervalId);
|
|
576
|
+
unsubscribe();
|
|
577
|
+
};
|
|
578
|
+
}, [notebookVisible, ephemeralNotebookId]);
|
|
579
|
+
// When a companion surface is shown, the chat can be docked as a sidebar
|
|
580
|
+
// (default) or floated over it, driven by the header view-mode toggle.
|
|
581
|
+
const surfaceChatFloating = surfaceVisible &&
|
|
582
|
+
(chatViewMode === 'floating' || chatViewMode === 'floating-small');
|
|
583
|
+
// Notebook frontend tools are always created (hooks must be unconditional)
|
|
584
|
+
// but only merged into the tools sent to the agent while the notebook is
|
|
585
|
+
// visible, so the agent can manipulate the live notebook cells. Document
|
|
586
|
+
// (lexical) tools are reported upward by the lazily-loaded EphemeralDocument
|
|
587
|
+
// and merged in while the document is visible.
|
|
588
|
+
const notebookTools = useNotebookTools(ephemeralNotebookId);
|
|
589
|
+
const [documentTools, setDocumentTools] = useState([]);
|
|
590
|
+
const handleDocumentToolsReady = useCallback((tools) => {
|
|
591
|
+
setDocumentTools(tools);
|
|
592
|
+
}, []);
|
|
593
|
+
const frontendTools = useMemo(() => {
|
|
594
|
+
if (notebookVisible) {
|
|
595
|
+
return [...(frontendToolsProp || []), ...notebookTools];
|
|
596
|
+
}
|
|
597
|
+
if (documentVisible) {
|
|
598
|
+
return [...(frontendToolsProp || []), ...documentTools];
|
|
599
|
+
}
|
|
600
|
+
return frontendToolsProp;
|
|
601
|
+
}, [
|
|
602
|
+
notebookVisible,
|
|
603
|
+
documentVisible,
|
|
604
|
+
frontendToolsProp,
|
|
605
|
+
notebookTools,
|
|
606
|
+
documentTools,
|
|
607
|
+
]);
|
|
351
608
|
const aiAgentsBaseUrl = useMemo(() => normalizeAiAgentsBaseUrl(configuredAiAgentsBaseUrl || DEFAULT_SERVICE_URLS.AI_AGENTS), [configuredAiAgentsBaseUrl]);
|
|
352
609
|
const aiAgentsApprovalWsRef = useRef(null);
|
|
353
610
|
const resolvedToolCallSuppressionsRef = useRef(new Map());
|
|
@@ -806,8 +1063,10 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
|
|
|
806
1063
|
const historyRetryAttemptsRef = useRef(new Map());
|
|
807
1064
|
// Adapter-ready flag — flipped to true once the protocol adapter is initialised
|
|
808
1065
|
const [adapterReady, setAdapterReady] = useState(false);
|
|
809
|
-
// Guard so
|
|
810
|
-
|
|
1066
|
+
// Guard so each distinct pending prompt is sent at most once. Stores the
|
|
1067
|
+
// last-sent key (not a boolean) so that changing `pendingPrompt` to a new
|
|
1068
|
+
// value — e.g. re-submitting an interactive surface — triggers a fresh send.
|
|
1069
|
+
const pendingPromptSentRef = useRef(null);
|
|
811
1070
|
const pendingPromptKey = pendingPrompt &&
|
|
812
1071
|
[
|
|
813
1072
|
runtimeId || historyEndpoint || protocol?.endpoint || protocol?.agentId,
|
|
@@ -826,8 +1085,13 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
|
|
|
826
1085
|
const [_enabledTools, setEnabledTools] = useState([]);
|
|
827
1086
|
const wsState = useAgentRuntimeWsState();
|
|
828
1087
|
// ---- Data queries ----
|
|
829
|
-
|
|
830
|
-
|
|
1088
|
+
// Config-derived queries (models, skills, context, sandbox) must only run
|
|
1089
|
+
// once the runtime endpoint exists. `autoConnect` is our single signal for
|
|
1090
|
+
// "endpoint ready", so we gate every config query on it to avoid firing
|
|
1091
|
+
// requests at a not-yet-created runtime during the launch overlay.
|
|
1092
|
+
const configQueriesEnabled = Boolean(protocol?.enableConfigQuery) && autoConnect;
|
|
1093
|
+
const configQuery = useConfig(configQueriesEnabled, protocol?.configEndpoint, protocol?.authToken, protocol?.agentId);
|
|
1094
|
+
const skillsQuery = useSkills(configQueriesEnabled && showSkillsMenu, protocol?.configEndpoint, protocol?.authToken);
|
|
831
1095
|
const { enableSkill: wsEnableSkill, disableSkill: wsDisableSkill, approveSkill: wsApproveSkill, unapproveSkill: wsUnapproveSkill, } = useSkillActions(activeAgentId);
|
|
832
1096
|
// Optimistic skill-approval overrides so inline approval updates the
|
|
833
1097
|
// Skills selector immediately before the next WS snapshot lands.
|
|
@@ -895,9 +1159,9 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
|
|
|
895
1159
|
});
|
|
896
1160
|
return set;
|
|
897
1161
|
}, [localSkillApproval, skillsQuery.data]);
|
|
898
|
-
const contextSnapshotQuery = useContextSnapshot(
|
|
1162
|
+
const contextSnapshotQuery = useContextSnapshot(configQueriesEnabled && showTokenUsage, protocol?.configEndpoint, protocol?.agentId, protocol?.authToken);
|
|
899
1163
|
const agentUsage = externalContextSnapshot ?? contextSnapshotQuery.data;
|
|
900
|
-
const sandboxStatusQuery = useSandbox(
|
|
1164
|
+
const sandboxStatusQuery = useSandbox(configQueriesEnabled && showHeader, protocol?.configEndpoint, protocol?.authToken, protocol?.agentId);
|
|
901
1165
|
// ---- Refs ----
|
|
902
1166
|
const adapterRef = useRef(null);
|
|
903
1167
|
const unsubscribeRef = useRef(null);
|
|
@@ -1568,6 +1832,11 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
|
|
|
1568
1832
|
useEffect(() => {
|
|
1569
1833
|
if (!protocol)
|
|
1570
1834
|
return;
|
|
1835
|
+
// Skip opening a protocol connection when auto-connect is disabled (e.g.
|
|
1836
|
+
// the runtime endpoint is still being created). The chat shell, companion
|
|
1837
|
+
// surface and launching overlay still render; we simply do not connect.
|
|
1838
|
+
if (!autoConnect)
|
|
1839
|
+
return;
|
|
1571
1840
|
const adapter = createProtocolAdapter(protocol);
|
|
1572
1841
|
if (!adapter)
|
|
1573
1842
|
return;
|
|
@@ -1925,7 +2194,7 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
|
|
|
1925
2194
|
adapterRef.current?.disconnect();
|
|
1926
2195
|
};
|
|
1927
2196
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
1928
|
-
}, [protocolKey, onStateUpdate, useStoreMode]);
|
|
2197
|
+
}, [protocolKey, onStateUpdate, useStoreMode, autoConnect]);
|
|
1929
2198
|
// Helper to run a frontend tool and send result back via adapter
|
|
1930
2199
|
function executeFrontendTool(toolHandler, toolCallMsg, toolCallId) {
|
|
1931
2200
|
(async () => {
|
|
@@ -2139,17 +2408,21 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
|
|
|
2139
2408
|
]);
|
|
2140
2409
|
// Send pending prompt once history loaded and adapter/handler available
|
|
2141
2410
|
useEffect(() => {
|
|
2142
|
-
if (!pendingPrompt
|
|
2411
|
+
if (!pendingPrompt)
|
|
2143
2412
|
return;
|
|
2413
|
+
// Already handled this exact prompt in the current component instance.
|
|
2414
|
+
if (pendingPromptKey && pendingPromptSentRef.current === pendingPromptKey) {
|
|
2415
|
+
return;
|
|
2416
|
+
}
|
|
2144
2417
|
if (pendingPromptKey && sentPendingPromptKeys.has(pendingPromptKey)) {
|
|
2145
|
-
pendingPromptSentRef.current =
|
|
2418
|
+
pendingPromptSentRef.current = pendingPromptKey;
|
|
2146
2419
|
return;
|
|
2147
2420
|
}
|
|
2148
2421
|
if (!historyLoaded)
|
|
2149
2422
|
return;
|
|
2150
2423
|
if (!adapterReady && !onSendMessage)
|
|
2151
2424
|
return;
|
|
2152
|
-
pendingPromptSentRef.current =
|
|
2425
|
+
pendingPromptSentRef.current = pendingPromptKey ?? null;
|
|
2153
2426
|
if (pendingPromptKey) {
|
|
2154
2427
|
sentPendingPromptKeys.add(pendingPromptKey);
|
|
2155
2428
|
}
|
|
@@ -2533,10 +2806,33 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
|
|
|
2533
2806
|
protocol.enableConfigQuery === false ||
|
|
2534
2807
|
!!configQuery.data ||
|
|
2535
2808
|
!!skillsQuery.data;
|
|
2809
|
+
const resolvedDescription = description || configQuery.data?.welcomeMessage || '';
|
|
2810
|
+
const serverSuggestions = configQuery.data?.suggestions;
|
|
2811
|
+
const resolvedSuggestions = suggestions && suggestions.length > 0
|
|
2812
|
+
? suggestions
|
|
2813
|
+
: Array.isArray(serverSuggestions) && serverSuggestions.length > 0
|
|
2814
|
+
? serverSuggestions
|
|
2815
|
+
.map(item => String(item || '').trim())
|
|
2816
|
+
.filter(Boolean)
|
|
2817
|
+
.map(item => ({ title: item, message: item }))
|
|
2818
|
+
: undefined;
|
|
2819
|
+
const messagesContent = children ? (children) : (_jsx(Box, { sx: {
|
|
2820
|
+
display: 'flex',
|
|
2821
|
+
flexDirection: 'column',
|
|
2822
|
+
minHeight: 0,
|
|
2823
|
+
bg: 'canvas.default',
|
|
2824
|
+
}, children: _jsx(ChatMessageList, { displayItems: displayItems, isLoading: isLoading, isStreaming: isStreaming, showLoadingIndicator: showLoadingIndicator, hideMessagesAfterToolUI: hideMessagesAfterToolUI, avatarConfig: defaultAvatarConfig, padding: padding, renderToolResult: renderToolResult, approvalConfig: approvalConfig, messagesEndRef: messagesEndRef, onRespond: handleRespond, emptyContent: launching ? null : (_jsx(ChatEmptyState, { emptyState: emptyState, brandIcon: brandIcon, description: resolvedDescription, suggestions: resolvedSuggestions, submitOnSuggestionClick: submitOnSuggestionClick, onSuggestionSubmit: handleSuggestionSubmit, onSuggestionFill: handleSuggestionFill })) }) }));
|
|
2825
|
+
const inputToolbar = showInput ? (_jsx(InputToolbar, { input: input, setInput: setInput, isLoading: isLoading, kernelStatus: liveKernelStatus, connectionConfirmed: connectionConfirmed, placeholder: placeholder, autoFocus: autoFocus, focusTrigger: focusTrigger, padding: padding, onSend: () => handleSend(), onStop: handleStop, disableInputPrompt: disableInputPrompt || !!overlay || launching, showTokenUsage: showTokenUsage, agentUsage: agentUsage, showModelSelector: showModelSelector, showToolsMenu: showToolsMenu, showSkillsMenu: showSkillsMenu, codemodeEnabled: codemodeEnabled, onToggleCodemode: onToggleCodemode, isA2AProtocol: isA2AProtocol, hasConfigData: !!configQuery.data, hasSkillsData: !!skillsQuery.data, models: availableModels || configQuery.data?.models || [], selectedModel: selectedModel, onModelSelect: setSelectedModel, availableTools: configQuery.data?.builtinTools || [], mcpServers: filteredMcpServers, enabledMcpTools: enabledMcpTools, enabledMcpToolCount: getEnabledMcpToolNames().length, onToggleMcpTool: toggleMcpTool, onToggleAllMcpServerTools: toggleAllMcpServerTools, approvedMcpTools: approvedMcpTools, onToggleMcpToolApproval: toggleMcpToolApproval, skills: skillsQuery.data?.skills || [], skillsLoading: !!skillsQuery.isLoading, enabledSkills: enabledSkills, onToggleSkill: toggleSkill, onToggleAllSkills: toggleAllSkills, approvedSkills: approvedSkills, onToggleSkillApproval: toggleSkillApproval, apiBase: indicatorApiBase, authToken: protocol?.authToken, mcpStatusData: effectiveMcpStatusData })) : null;
|
|
2826
|
+
// Shared header element. It is rendered either at the top of the chat (when
|
|
2827
|
+
// no ephemeral notebook is shown) or INSIDE the chat body column (when the
|
|
2828
|
+
// notebook is visible) so the header always follows the chat body across all
|
|
2829
|
+
// view modes (docked sidebar, floating popup, floating-small).
|
|
2830
|
+
const chatHeaderElement = showHeader ? (_jsx(ChatBaseHeader, { title: title, subtitle: subtitle, brandIcon: brandIcon, headerContent: headerContent, headerActions: headerActions, showInformation: showInformation, onInformationClick: onInformationClick, padding: padding, kernelIndicatorState: kernelIndicatorState, runtimeStatus: sandboxStatusData ?? sandboxStatusQuery.data, kernel: notebookVisible ? (notebookKernel ?? kernel) : kernel, kernelEnvironmentName: kernelEnvironmentName, kernelCpu: kernelCpu, kernelMemory: kernelMemory, kernelGpu: kernelGpu, headerButtons: headerButtons, messageCount: messages.length, onNewChat: handleNewChat, onClear: handleClear, chatViewMode: chatViewMode, onChatViewModeChange: onChatViewModeChange, showEphemeralSurfaceControl: enableEphemeralNotebook || enableEphemeralDocument, enableEphemeralNotebookOption: enableEphemeralNotebook, enableEphemeralDocumentOption: enableEphemeralDocument, ephemeralSurfaceMode: ephemeralSurfaceMode, onEphemeralSurfaceModeChange: handleEphemeralSurfaceModeChange })) : null;
|
|
2536
2831
|
// ========================================================================
|
|
2537
2832
|
// Render
|
|
2538
2833
|
// ========================================================================
|
|
2539
2834
|
return (_jsxs(Box, { className: className, sx: {
|
|
2835
|
+
position: 'relative',
|
|
2540
2836
|
display: 'flex',
|
|
2541
2837
|
flexDirection: 'column',
|
|
2542
2838
|
height: '100%',
|
|
@@ -2547,7 +2843,7 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
|
|
|
2547
2843
|
border,
|
|
2548
2844
|
boxShadow,
|
|
2549
2845
|
overflow: 'hidden',
|
|
2550
|
-
}, children: [
|
|
2846
|
+
}, children: [!surfaceVisible && chatHeaderElement, showToolApprovalBanner &&
|
|
2551
2847
|
pendingApprovals &&
|
|
2552
2848
|
pendingApprovals.length > 0 && (_jsx(ToolApprovalBannerSection, { pendingApprovals: pendingApprovals, onApprove: handleBannerApprove, onReject: handleBannerReject })), showErrors && error && (_jsxs(Box, { sx: {
|
|
2553
2849
|
display: 'flex',
|
|
@@ -2557,18 +2853,112 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
|
|
|
2557
2853
|
bg: 'danger.subtle',
|
|
2558
2854
|
borderBottom: '1px solid',
|
|
2559
2855
|
borderColor: 'danger.muted',
|
|
2560
|
-
}, children: [_jsx(AlertIcon, { size: 16 }), _jsx(Text, { sx: { color: 'danger.fg', fontSize: 1 }, children: error.message })] })),
|
|
2856
|
+
}, children: [_jsx(AlertIcon, { size: 16 }), _jsx(Text, { sx: { color: 'danger.fg', fontSize: 1 }, children: error.message })] })), surfaceVisible ? (_jsxs(Box, { sx: {
|
|
2561
2857
|
flex: 1,
|
|
2562
|
-
flexGrow: 1,
|
|
2563
2858
|
minHeight: 0,
|
|
2859
|
+
display: 'flex',
|
|
2860
|
+
overflow: 'hidden',
|
|
2861
|
+
position: 'relative',
|
|
2862
|
+
}, children: [_jsx(Box, { sx: {
|
|
2863
|
+
flex: 1,
|
|
2864
|
+
minWidth: 0,
|
|
2865
|
+
minHeight: 0,
|
|
2866
|
+
display: 'flex',
|
|
2867
|
+
flexDirection: 'column',
|
|
2868
|
+
overflow: 'hidden',
|
|
2869
|
+
...(surfaceChatFloating
|
|
2870
|
+
? null
|
|
2871
|
+
: surfaceCollapsed
|
|
2872
|
+
? null
|
|
2873
|
+
: {
|
|
2874
|
+
borderRight: '1px solid',
|
|
2875
|
+
borderColor: 'border.default',
|
|
2876
|
+
}),
|
|
2877
|
+
}, children: launching || overlay ? (_jsx(CompanionSurfaceSkeleton, { mode: notebookVisible ? 'notebook' : 'document' })) : notebookVisible ? (_jsx(EphemeralNotebook, { notebookId: ephemeralNotebookId, runtimePodName: runtimeId || activeAgentId, nbformat: persistedEphemeralNbformat ?? undefined, onNbformatChange: handleEphemeralNotebookChange, toolbarComponent: ephemeralNotebookToolbar })) : (_jsx(React.Suspense, { fallback: null, children: _jsx(EphemeralDocument, { documentId: ephemeralDocumentId, runtimePodName: runtimeId || activeAgentId, content: persistedEphemeralDocument ?? undefined, onContentChange: handleEphemeralDocumentChange, onToolsReady: handleDocumentToolsReady }) })) }), !surfaceCollapsed && (_jsxs(Box, { sx: surfaceChatFloating
|
|
2878
|
+
? {
|
|
2879
|
+
position: 'absolute',
|
|
2880
|
+
right: 16,
|
|
2881
|
+
width: chatViewMode === 'floating-small' ? 360 : 440,
|
|
2882
|
+
maxWidth: 'calc(100% - 32px)',
|
|
2883
|
+
...(chatViewMode === 'floating-small'
|
|
2884
|
+
? { bottom: 16, height: '62%' }
|
|
2885
|
+
: { top: 16, bottom: 16 }),
|
|
2886
|
+
display: 'flex',
|
|
2887
|
+
flexDirection: 'column',
|
|
2888
|
+
minHeight: 0,
|
|
2889
|
+
overflow: 'hidden',
|
|
2890
|
+
bg: 'canvas.default',
|
|
2891
|
+
border: '1px solid',
|
|
2892
|
+
borderColor: 'border.default',
|
|
2893
|
+
borderRadius: 2,
|
|
2894
|
+
boxShadow: 'shadow.large',
|
|
2895
|
+
zIndex: 5,
|
|
2896
|
+
}
|
|
2897
|
+
: {
|
|
2898
|
+
flexShrink: 0,
|
|
2899
|
+
width: 440,
|
|
2900
|
+
minWidth: 320,
|
|
2901
|
+
maxWidth: '48%',
|
|
2902
|
+
minHeight: 0,
|
|
2903
|
+
display: 'flex',
|
|
2904
|
+
flexDirection: 'column',
|
|
2905
|
+
overflow: 'hidden',
|
|
2906
|
+
bg: 'canvas.default',
|
|
2907
|
+
}, children: [chatHeaderElement, _jsx(Box, { ref: messagesContainerRef, sx: {
|
|
2908
|
+
flex: 1,
|
|
2909
|
+
minHeight: 0,
|
|
2910
|
+
overflow: 'auto',
|
|
2911
|
+
bg: 'canvas.default',
|
|
2912
|
+
}, children: messagesContent }), footerContent, inputToolbar] })), surfaceCollapsed &&
|
|
2913
|
+
onExpandFromCollapsed &&
|
|
2914
|
+
(chatViewMode === 'sidebar' ? (_jsx(Box, { sx: {
|
|
2915
|
+
position: 'absolute',
|
|
2916
|
+
top: 8,
|
|
2917
|
+
right: 8,
|
|
2918
|
+
zIndex: 6,
|
|
2919
|
+
}, children: _jsx(IconButton, { icon: SidebarExpandIcon, "aria-label": "Open chat", onClick: onExpandFromCollapsed, variant: "default", size: "small" }) })) : (_jsx(FloatingBrandButton, { isOpen: false, onToggle: onExpandFromCollapsed, position: "bottom-right", tooltip: "Open chat" })))] })) : (_jsxs(_Fragment, { children: [_jsx(Box, { ref: messagesContainerRef, sx: {
|
|
2920
|
+
flex: 1,
|
|
2921
|
+
flexGrow: 1,
|
|
2922
|
+
minHeight: 0,
|
|
2923
|
+
overflow: 'auto',
|
|
2924
|
+
bg: 'canvas.default',
|
|
2925
|
+
}, children: messagesContent }), footerContent, inputToolbar] })), showPoweredBy && _jsx(PoweredByTag, { ...poweredByProps }), overlay && (_jsxs(Box, { sx: {
|
|
2926
|
+
position: 'absolute',
|
|
2927
|
+
inset: 0,
|
|
2928
|
+
zIndex: 20,
|
|
2929
|
+
display: 'flex',
|
|
2930
|
+
alignItems: 'center',
|
|
2931
|
+
justifyContent: 'center',
|
|
2932
|
+
p: 3,
|
|
2564
2933
|
overflow: 'auto',
|
|
2565
|
-
|
|
2566
|
-
|
|
2567
|
-
|
|
2568
|
-
|
|
2569
|
-
|
|
2570
|
-
|
|
2571
|
-
|
|
2934
|
+
}, children: [_jsx(Box, { "aria-hidden": true, sx: {
|
|
2935
|
+
position: 'absolute',
|
|
2936
|
+
inset: 0,
|
|
2937
|
+
bg: 'canvas.default',
|
|
2938
|
+
opacity: 0.4,
|
|
2939
|
+
backdropFilter: 'blur(1px)',
|
|
2940
|
+
} }), _jsx(Box, { sx: { position: 'relative', zIndex: 1, maxWidth: '100%' }, children: overlay })] })), launching && !overlay && (_jsxs(Box, { sx: {
|
|
2941
|
+
position: 'absolute',
|
|
2942
|
+
inset: 0,
|
|
2943
|
+
zIndex: 15,
|
|
2944
|
+
display: 'flex',
|
|
2945
|
+
alignItems: 'center',
|
|
2946
|
+
justifyContent: 'center',
|
|
2947
|
+
p: 3,
|
|
2948
|
+
}, children: [_jsx(Box, { "aria-hidden": true, sx: {
|
|
2949
|
+
position: 'absolute',
|
|
2950
|
+
inset: 0,
|
|
2951
|
+
bg: 'canvas.default',
|
|
2952
|
+
opacity: 0.35,
|
|
2953
|
+
backdropFilter: 'blur(1px)',
|
|
2954
|
+
} }), _jsxs(Box, { sx: {
|
|
2955
|
+
position: 'relative',
|
|
2956
|
+
zIndex: 1,
|
|
2957
|
+
display: 'flex',
|
|
2958
|
+
flexDirection: 'column',
|
|
2959
|
+
alignItems: 'center',
|
|
2960
|
+
gap: 3,
|
|
2961
|
+
}, children: [_jsx(Spinner, { size: "large" }), _jsx(Text, { sx: { color: 'fg.muted' }, children: launchingMessage || 'Launching your agent…' })] })] }))] }));
|
|
2572
2962
|
}
|
|
2573
2963
|
/**
|
|
2574
2964
|
* Internal component rendering the top-of-chat approval banner + review dialog.
|