@datalayer/agent-runtimes 1.0.9 → 1.0.17
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 +468 -40
- 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.d.ts +4 -4
- package/lib/client/AgentsMixin.js +35 -35
- 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/ToolApprovalCard.js +13 -3
- 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/config/AgentConfiguration.d.ts +2 -2
- package/lib/config/index.d.ts +1 -1
- 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 +21 -22
- package/lib/examples/AgentCodemodeExample.js +3 -3
- package/lib/examples/AgentEvalsExample.js +8 -8
- package/lib/examples/AgentGuardrailsExample.js +22 -17
- package/lib/examples/AgentHooksExample.js +16 -57
- package/lib/examples/AgentInferenceProviderExample.js +8 -8
- package/lib/examples/AgentLoopExample.d.ts +10 -0
- package/lib/examples/AgentLoopExample.js +304 -0
- package/lib/examples/AgentMCPExample.js +9 -9
- package/lib/examples/AgentMemoryExample.js +6 -6
- package/lib/examples/AgentMonitoringExample.js +116 -46
- package/lib/examples/AgentNotificationsExample.js +6 -6
- package/lib/examples/AgentOtelExample.d.ts +3 -3
- package/lib/examples/AgentOtelExample.js +20 -15
- package/lib/examples/AgentOutputsExample.js +8 -8
- package/lib/examples/AgentParametersExample.js +24 -36
- package/lib/examples/AgentSandboxExample.js +7 -7
- package/lib/examples/AgentSkillsExample.js +9 -9
- package/lib/examples/AgentSubagentsExample.js +6 -6
- package/lib/examples/AgentToolApprovalsExample.js +37 -11
- package/lib/examples/AgentTriggersExample.js +12 -12
- package/lib/examples/AgentspecsExample.js +63 -41
- package/lib/examples/ChatCustomExample.js +23 -77
- package/lib/examples/ChatExample.js +15 -46
- 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 +3 -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 +3 -1
- package/lib/examples/index.js +3 -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 +188 -29
- package/lib/hooks/useAgentsCatalog.d.ts +3 -3
- package/lib/hooks/useAgentsCatalog.js +4 -4
- 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 +38 -28
- 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 +14 -6
- package/lib/hooks/useToolApprovals.js +20 -1
- package/lib/index.d.ts +2 -1
- 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 +95 -50
- package/lib/specs/agents/agents.js +4037 -1669
- package/lib/specs/agents/index.d.ts +5 -5
- package/lib/specs/agents/index.js +9 -9
- 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 +6 -6
- package/lib/types/agentspecs.d.ts +8 -4
- 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/teams.d.ts +2 -2
- 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/generate_agents.py +96 -61
- package/scripts/codegen/generate_loops.py +443 -0
- package/scripts/codegen/generate_teams.py +4 -4
- package/lib/examples/A2UiComponentGalleryExample.d.ts +0 -3
- package/lib/examples/A2UiComponentGalleryExample.js +0 -361
- package/scripts/codegen/__pycache__/generate_agents.cpython-313.pyc +0 -0
- package/scripts/codegen/__pycache__/generate_benchmarks.cpython-313.pyc +0 -0
- package/scripts/codegen/__pycache__/generate_evals.cpython-313.pyc +0 -0
- package/scripts/codegen/__pycache__/generate_events.cpython-313.pyc +0 -0
- /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());
|
|
@@ -604,6 +861,42 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
|
|
|
604
861
|
requestAiAgentsApprovalHistory,
|
|
605
862
|
sendAiAgentsApprovalDecision,
|
|
606
863
|
]);
|
|
864
|
+
const reconcileResolvedApprovalInStore = useCallback((approval) => {
|
|
865
|
+
const state = agentRuntimeStore.getState();
|
|
866
|
+
const removalIds = new Set([approval.id]);
|
|
867
|
+
const hasResolvedToolName = Boolean(approval.tool_name);
|
|
868
|
+
const resolvedSignature = hasResolvedToolName
|
|
869
|
+
? approvalSignature(approval.tool_name, approval.tool_args ?? {})
|
|
870
|
+
: null;
|
|
871
|
+
for (const existing of state.approvals) {
|
|
872
|
+
if (existing.status !== 'pending') {
|
|
873
|
+
continue;
|
|
874
|
+
}
|
|
875
|
+
if (!isApprovalForAgent(existing, activeAgentId)) {
|
|
876
|
+
continue;
|
|
877
|
+
}
|
|
878
|
+
if (existing.id === approval.id) {
|
|
879
|
+
removalIds.add(existing.id);
|
|
880
|
+
continue;
|
|
881
|
+
}
|
|
882
|
+
if (approval.tool_call_id &&
|
|
883
|
+
existing.tool_call_id &&
|
|
884
|
+
existing.tool_call_id === approval.tool_call_id) {
|
|
885
|
+
removalIds.add(existing.id);
|
|
886
|
+
continue;
|
|
887
|
+
}
|
|
888
|
+
if (!resolvedSignature || !existing.tool_name) {
|
|
889
|
+
continue;
|
|
890
|
+
}
|
|
891
|
+
const existingSignature = approvalSignature(existing.tool_name, existing.tool_args ?? {});
|
|
892
|
+
if (existingSignature === resolvedSignature) {
|
|
893
|
+
removalIds.add(existing.id);
|
|
894
|
+
}
|
|
895
|
+
}
|
|
896
|
+
for (const id of removalIds) {
|
|
897
|
+
state.removeApproval(id);
|
|
898
|
+
}
|
|
899
|
+
}, [activeAgentId]);
|
|
607
900
|
// Optional ai-agents bridge for server-mode visibility.
|
|
608
901
|
// This keeps approval synchronization in ChatBase so examples do not need
|
|
609
902
|
// their own approval websocket plumbing.
|
|
@@ -702,7 +995,7 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
|
|
|
702
995
|
state.upsertApproval(scopedApproval);
|
|
703
996
|
}
|
|
704
997
|
else {
|
|
705
|
-
|
|
998
|
+
reconcileResolvedApprovalInStore(scopedApproval);
|
|
706
999
|
}
|
|
707
1000
|
}
|
|
708
1001
|
}
|
|
@@ -730,6 +1023,7 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
|
|
|
730
1023
|
aiAgentsAuthToken,
|
|
731
1024
|
activeAgentId,
|
|
732
1025
|
isSuppressedPending,
|
|
1026
|
+
reconcileResolvedApprovalInStore,
|
|
733
1027
|
]);
|
|
734
1028
|
// The outer ChatBase wrapper always resolves a string Protocol to a full
|
|
735
1029
|
// ProtocolConfig (or undefined). Narrow the type for internal use.
|
|
@@ -769,8 +1063,10 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
|
|
|
769
1063
|
const historyRetryAttemptsRef = useRef(new Map());
|
|
770
1064
|
// Adapter-ready flag — flipped to true once the protocol adapter is initialised
|
|
771
1065
|
const [adapterReady, setAdapterReady] = useState(false);
|
|
772
|
-
// Guard so
|
|
773
|
-
|
|
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);
|
|
774
1070
|
const pendingPromptKey = pendingPrompt &&
|
|
775
1071
|
[
|
|
776
1072
|
runtimeId || historyEndpoint || protocol?.endpoint || protocol?.agentId,
|
|
@@ -789,8 +1085,13 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
|
|
|
789
1085
|
const [_enabledTools, setEnabledTools] = useState([]);
|
|
790
1086
|
const wsState = useAgentRuntimeWsState();
|
|
791
1087
|
// ---- Data queries ----
|
|
792
|
-
|
|
793
|
-
|
|
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);
|
|
794
1095
|
const { enableSkill: wsEnableSkill, disableSkill: wsDisableSkill, approveSkill: wsApproveSkill, unapproveSkill: wsUnapproveSkill, } = useSkillActions(activeAgentId);
|
|
795
1096
|
// Optimistic skill-approval overrides so inline approval updates the
|
|
796
1097
|
// Skills selector immediately before the next WS snapshot lands.
|
|
@@ -858,9 +1159,9 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
|
|
|
858
1159
|
});
|
|
859
1160
|
return set;
|
|
860
1161
|
}, [localSkillApproval, skillsQuery.data]);
|
|
861
|
-
const contextSnapshotQuery = useContextSnapshot(
|
|
1162
|
+
const contextSnapshotQuery = useContextSnapshot(configQueriesEnabled && showTokenUsage, protocol?.configEndpoint, protocol?.agentId, protocol?.authToken);
|
|
862
1163
|
const agentUsage = externalContextSnapshot ?? contextSnapshotQuery.data;
|
|
863
|
-
const sandboxStatusQuery = useSandbox(
|
|
1164
|
+
const sandboxStatusQuery = useSandbox(configQueriesEnabled && showHeader, protocol?.configEndpoint, protocol?.authToken, protocol?.agentId);
|
|
864
1165
|
// ---- Refs ----
|
|
865
1166
|
const adapterRef = useRef(null);
|
|
866
1167
|
const unsubscribeRef = useRef(null);
|
|
@@ -964,6 +1265,7 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
|
|
|
964
1265
|
}
|
|
965
1266
|
return;
|
|
966
1267
|
}
|
|
1268
|
+
reconcileResolvedApprovalInStore(payload);
|
|
967
1269
|
applyServerApprovalDecision(payload, msg.type === 'tool_approval_approved', payload.note ?? undefined);
|
|
968
1270
|
},
|
|
969
1271
|
});
|
|
@@ -1530,6 +1832,11 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
|
|
|
1530
1832
|
useEffect(() => {
|
|
1531
1833
|
if (!protocol)
|
|
1532
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;
|
|
1533
1840
|
const adapter = createProtocolAdapter(protocol);
|
|
1534
1841
|
if (!adapter)
|
|
1535
1842
|
return;
|
|
@@ -1887,7 +2194,7 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
|
|
|
1887
2194
|
adapterRef.current?.disconnect();
|
|
1888
2195
|
};
|
|
1889
2196
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
1890
|
-
}, [protocolKey, onStateUpdate, useStoreMode]);
|
|
2197
|
+
}, [protocolKey, onStateUpdate, useStoreMode, autoConnect]);
|
|
1891
2198
|
// Helper to run a frontend tool and send result back via adapter
|
|
1892
2199
|
function executeFrontendTool(toolHandler, toolCallMsg, toolCallId) {
|
|
1893
2200
|
(async () => {
|
|
@@ -2101,17 +2408,21 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
|
|
|
2101
2408
|
]);
|
|
2102
2409
|
// Send pending prompt once history loaded and adapter/handler available
|
|
2103
2410
|
useEffect(() => {
|
|
2104
|
-
if (!pendingPrompt
|
|
2411
|
+
if (!pendingPrompt)
|
|
2105
2412
|
return;
|
|
2413
|
+
// Already handled this exact prompt in the current component instance.
|
|
2414
|
+
if (pendingPromptKey && pendingPromptSentRef.current === pendingPromptKey) {
|
|
2415
|
+
return;
|
|
2416
|
+
}
|
|
2106
2417
|
if (pendingPromptKey && sentPendingPromptKeys.has(pendingPromptKey)) {
|
|
2107
|
-
pendingPromptSentRef.current =
|
|
2418
|
+
pendingPromptSentRef.current = pendingPromptKey;
|
|
2108
2419
|
return;
|
|
2109
2420
|
}
|
|
2110
2421
|
if (!historyLoaded)
|
|
2111
2422
|
return;
|
|
2112
2423
|
if (!adapterReady && !onSendMessage)
|
|
2113
2424
|
return;
|
|
2114
|
-
pendingPromptSentRef.current =
|
|
2425
|
+
pendingPromptSentRef.current = pendingPromptKey ?? null;
|
|
2115
2426
|
if (pendingPromptKey) {
|
|
2116
2427
|
sentPendingPromptKeys.add(pendingPromptKey);
|
|
2117
2428
|
}
|
|
@@ -2495,10 +2806,33 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
|
|
|
2495
2806
|
protocol.enableConfigQuery === false ||
|
|
2496
2807
|
!!configQuery.data ||
|
|
2497
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;
|
|
2498
2831
|
// ========================================================================
|
|
2499
2832
|
// Render
|
|
2500
2833
|
// ========================================================================
|
|
2501
2834
|
return (_jsxs(Box, { className: className, sx: {
|
|
2835
|
+
position: 'relative',
|
|
2502
2836
|
display: 'flex',
|
|
2503
2837
|
flexDirection: 'column',
|
|
2504
2838
|
height: '100%',
|
|
@@ -2509,7 +2843,7 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
|
|
|
2509
2843
|
border,
|
|
2510
2844
|
boxShadow,
|
|
2511
2845
|
overflow: 'hidden',
|
|
2512
|
-
}, children: [
|
|
2846
|
+
}, children: [!surfaceVisible && chatHeaderElement, showToolApprovalBanner &&
|
|
2513
2847
|
pendingApprovals &&
|
|
2514
2848
|
pendingApprovals.length > 0 && (_jsx(ToolApprovalBannerSection, { pendingApprovals: pendingApprovals, onApprove: handleBannerApprove, onReject: handleBannerReject })), showErrors && error && (_jsxs(Box, { sx: {
|
|
2515
2849
|
display: 'flex',
|
|
@@ -2519,18 +2853,112 @@ showToolApprovalBanner = true, pendingApprovals: pendingApprovalsProp, onApprove
|
|
|
2519
2853
|
bg: 'danger.subtle',
|
|
2520
2854
|
borderBottom: '1px solid',
|
|
2521
2855
|
borderColor: 'danger.muted',
|
|
2522
|
-
}, 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: {
|
|
2523
2857
|
flex: 1,
|
|
2524
|
-
flexGrow: 1,
|
|
2525
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,
|
|
2526
2933
|
overflow: 'auto',
|
|
2527
|
-
|
|
2528
|
-
|
|
2529
|
-
|
|
2530
|
-
|
|
2531
|
-
|
|
2532
|
-
|
|
2533
|
-
|
|
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…' })] })] }))] }));
|
|
2534
2962
|
}
|
|
2535
2963
|
/**
|
|
2536
2964
|
* Internal component rendering the top-of-chat approval banner + review dialog.
|