@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
package/lib/AgentNotebook.js
CHANGED
|
@@ -21,23 +21,57 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
21
21
|
import { useEffect, useState } from 'react';
|
|
22
22
|
import { Text, Spinner } from '@primer/react';
|
|
23
23
|
import { AlertIcon } from '@primer/octicons-react';
|
|
24
|
-
import { Box, DatalayerThemeProvider, setupPrimerPortals, } from '@datalayer/primer-addons';
|
|
25
|
-
import { Notebook, JupyterReactTheme,
|
|
26
|
-
import { ServiceManager } from '@jupyterlab/services';
|
|
24
|
+
import { AppearanceControlsWithStore, Box, createThemeStore, DatalayerThemeProvider, setupPrimerPortals, themeConfigs, useSystemColorMode, } from '@datalayer/primer-addons';
|
|
25
|
+
import { Notebook, JupyterReactTheme, notebookStore, disposeServiceManager, loadJupyterConfig, getJupyterServerUrl, getJupyterServerToken, setJupyterServerUrl, setJupyterServerToken, } from '@datalayer/jupyter-react';
|
|
26
|
+
import { ServiceManager, ServerConnection } from '@jupyterlab/services';
|
|
27
27
|
import { Chat } from './chat';
|
|
28
28
|
import { useNotebookTools } from './tools/adapters/agent-runtimes/notebookHooks';
|
|
29
29
|
import { DEFAULT_MODEL } from './specs';
|
|
30
|
-
import
|
|
30
|
+
import EmptyNotebook from './examples/utils/notebooks/Empty.ipynb.json';
|
|
31
31
|
import '../style/primer-primitives.css';
|
|
32
32
|
setupPrimerPortals();
|
|
33
33
|
const BASE_URL = window.location.origin;
|
|
34
34
|
const NOTEBOOK_ID = 'agent-notebook';
|
|
35
|
+
const NOTEBOOK_THEME_STORAGE_KEY = 'agent-runtimes-agent-notebook-theme';
|
|
36
|
+
// Fixed height (px) of the top appearance bar. The notebook fills the
|
|
37
|
+
// remaining viewport height via calc(100vh - TOP_BAR_HEIGHT) so it does not
|
|
38
|
+
// depend on a `height: 100%` chain (JupyterReactTheme renders an intermediate
|
|
39
|
+
// auto-height div that would collapse the notebook to 0).
|
|
40
|
+
const TOP_BAR_HEIGHT = 49;
|
|
41
|
+
const useAgentNotebookThemeStore = createThemeStore(NOTEBOOK_THEME_STORAGE_KEY, {
|
|
42
|
+
colorMode: 'auto',
|
|
43
|
+
theme: 'earth',
|
|
44
|
+
});
|
|
35
45
|
function getQueryParam(name) {
|
|
36
46
|
return new URLSearchParams(window.location.search).get(name);
|
|
37
47
|
}
|
|
38
48
|
function getAgentId() {
|
|
39
49
|
return getQueryParam('agentId') || 'default';
|
|
40
50
|
}
|
|
51
|
+
function getKernelId() {
|
|
52
|
+
const kernelId = getQueryParam('kernelId') || getQueryParam('kernel_id');
|
|
53
|
+
return kernelId || undefined;
|
|
54
|
+
}
|
|
55
|
+
async function fetchStartupKernelId() {
|
|
56
|
+
try {
|
|
57
|
+
const resp = await fetch(`${BASE_URL}/health/startup`);
|
|
58
|
+
if (!resp.ok) {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
const payload = await resp.json();
|
|
62
|
+
const sandbox = payload?.sandbox;
|
|
63
|
+
if (sandbox?.variant !== 'jupyter') {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
const kernelId = sandbox?.kernel_id;
|
|
67
|
+
return typeof kernelId === 'string' && kernelId.length > 0
|
|
68
|
+
? kernelId
|
|
69
|
+
: undefined;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
41
75
|
/**
|
|
42
76
|
* Initialise Jupyter configuration.
|
|
43
77
|
*
|
|
@@ -50,45 +84,111 @@ function initJupyterConfig() {
|
|
|
50
84
|
loadJupyterConfig();
|
|
51
85
|
// Override with query parameters when supplied by codeai
|
|
52
86
|
const qBaseUrl = getQueryParam('jupyterBaseUrl');
|
|
53
|
-
const qToken = getQueryParam('jupyterToken');
|
|
87
|
+
const qToken = getQueryParam('jupyterToken') || getQueryParam('token');
|
|
54
88
|
if (qBaseUrl)
|
|
55
89
|
setJupyterServerUrl(qBaseUrl);
|
|
56
90
|
if (qToken)
|
|
57
91
|
setJupyterServerToken(qToken);
|
|
92
|
+
let resolvedBaseUrl = qBaseUrl || getJupyterServerUrl();
|
|
93
|
+
let resolvedToken = qToken || getJupyterServerToken();
|
|
58
94
|
// Also check for jupyter-config-data embedded in the page (may contain
|
|
59
95
|
// values injected at build/serve time)
|
|
60
96
|
const el = document.getElementById('jupyter-config-data');
|
|
61
97
|
if (el?.textContent) {
|
|
62
98
|
try {
|
|
63
99
|
const cfg = JSON.parse(el.textContent);
|
|
64
|
-
if (!qBaseUrl && cfg.baseUrl)
|
|
100
|
+
if (!qBaseUrl && cfg.baseUrl) {
|
|
65
101
|
setJupyterServerUrl(cfg.baseUrl);
|
|
66
|
-
|
|
102
|
+
resolvedBaseUrl = cfg.baseUrl;
|
|
103
|
+
}
|
|
104
|
+
if (!qToken && cfg.token) {
|
|
67
105
|
setJupyterServerToken(cfg.token);
|
|
106
|
+
resolvedToken = cfg.token;
|
|
107
|
+
}
|
|
68
108
|
}
|
|
69
109
|
catch {
|
|
70
110
|
// ignore
|
|
71
111
|
}
|
|
72
112
|
}
|
|
113
|
+
return {
|
|
114
|
+
baseUrl: resolvedBaseUrl,
|
|
115
|
+
token: resolvedToken,
|
|
116
|
+
};
|
|
73
117
|
}
|
|
74
|
-
|
|
118
|
+
function buildServerSettings(baseUrl, token) {
|
|
119
|
+
const wsUrl = baseUrl.replace(/^http/, 'ws');
|
|
120
|
+
const authenticatedFetch = (input, init) => {
|
|
121
|
+
if (!token) {
|
|
122
|
+
return fetch(input, init);
|
|
123
|
+
}
|
|
124
|
+
const headers = new Headers(init?.headers || undefined);
|
|
125
|
+
headers.set('Authorization', `token ${token}`);
|
|
126
|
+
return fetch(input, { ...init, headers });
|
|
127
|
+
};
|
|
128
|
+
return ServerConnection.makeSettings({
|
|
129
|
+
baseUrl,
|
|
130
|
+
wsUrl,
|
|
131
|
+
token,
|
|
132
|
+
appendToken: !!token,
|
|
133
|
+
fetch: authenticatedFetch,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
// ─── Notebook kernel tracking ───────────────────────────────────────────────
|
|
137
|
+
/**
|
|
138
|
+
* Track the live kernel connection of the notebook running on the sandbox.
|
|
139
|
+
*
|
|
140
|
+
* The kernel connection is created asynchronously by the `<Notebook>` adapter
|
|
141
|
+
* after it mounts (and can change on restart), so we read it from the notebook
|
|
142
|
+
* store, polling and subscribing to store mutations. The resolved connection is
|
|
143
|
+
* fed to the chat header's `<KernelIndicator>` so it reflects the sandbox.
|
|
144
|
+
*/
|
|
145
|
+
function useNotebookKernel(notebookId, active) {
|
|
146
|
+
const [kernel, setKernel] = useState(null);
|
|
147
|
+
useEffect(() => {
|
|
148
|
+
if (!active) {
|
|
149
|
+
setKernel(null);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const readKernel = () => {
|
|
153
|
+
const notebook = notebookStore.getState().selectNotebook(notebookId);
|
|
154
|
+
const adapter = notebook?.adapter;
|
|
155
|
+
return adapter?.kernel ?? null;
|
|
156
|
+
};
|
|
157
|
+
const sync = () => {
|
|
158
|
+
const next = readKernel();
|
|
159
|
+
setKernel(prev => (prev?.id === next?.id ? prev : next));
|
|
160
|
+
};
|
|
161
|
+
sync();
|
|
162
|
+
const intervalId = window.setInterval(sync, 750);
|
|
163
|
+
const unsubscribe = notebookStore.subscribe(sync);
|
|
164
|
+
return () => {
|
|
165
|
+
window.clearInterval(intervalId);
|
|
166
|
+
unsubscribe();
|
|
167
|
+
};
|
|
168
|
+
}, [notebookId, active]);
|
|
169
|
+
return kernel;
|
|
170
|
+
}
|
|
171
|
+
const NotebookPanel = ({ serviceManager, kernelId, colormode, backgroundColor, }) => (_jsx(Box, { sx: {
|
|
75
172
|
flex: 1,
|
|
173
|
+
minWidth: '360px',
|
|
174
|
+
minHeight: 0,
|
|
76
175
|
display: 'flex',
|
|
77
176
|
flexDirection: 'column',
|
|
78
177
|
overflow: 'hidden',
|
|
79
178
|
borderRight: '1px solid',
|
|
80
179
|
borderColor: 'border.default',
|
|
81
|
-
}, children: _jsx(JupyterReactTheme, {
|
|
82
|
-
const ChatPanel = ({ agentId }) => {
|
|
180
|
+
}, children: _jsx(JupyterReactTheme, { colormode: colormode, backgroundColor: backgroundColor, children: _jsx(Notebook, { nbformat: EmptyNotebook, id: NOTEBOOK_ID, serviceManager: serviceManager, kernelId: kernelId, height: `calc(100vh - ${TOP_BAR_HEIGHT}px)`, cellSidebarMargin: 120, startDefaultKernel: !kernelId }) }) }));
|
|
181
|
+
const ChatPanel = ({ agentId, kernel }) => {
|
|
83
182
|
// Register notebook tools so the agent can manipulate cells
|
|
84
183
|
const notebookTools = useNotebookTools(NOTEBOOK_ID);
|
|
85
184
|
return (_jsx(Box, { sx: {
|
|
86
185
|
width: '420px',
|
|
87
186
|
minWidth: '320px',
|
|
187
|
+
flexShrink: 0,
|
|
88
188
|
display: 'flex',
|
|
89
189
|
flexDirection: 'column',
|
|
90
190
|
overflow: 'hidden',
|
|
91
|
-
}, children: _jsx(Chat, { protocol: "ag-ui", baseUrl: BASE_URL, agentId: agentId, title: "Agent Notebook", placeholder: "Ask about the notebook...", description: "Chat with the agent to manipulate the notebook", showHeader: true, height: "
|
|
191
|
+
}, children: _jsx(Chat, { protocol: "ag-ui", baseUrl: BASE_URL, agentId: agentId, title: "Agent Notebook", placeholder: "Ask about the notebook...", description: "Chat with the agent to manipulate the notebook", showHeader: true, height: "100%", showModelSelector: true, showToolsMenu: true, showSkillsMenu: true, showTokenUsage: true, showInformation: true, disableInternalJupyterTheme: true, frontendTools: notebookTools, autoFocus: true, runtimeId: agentId, kernel: kernel, historyEndpoint: `${BASE_URL}/api/v1/history`, suggestions: [
|
|
92
192
|
{
|
|
93
193
|
title: 'Add a cell',
|
|
94
194
|
message: 'Insert a new code cell into the notebook',
|
|
@@ -106,12 +206,25 @@ const ChatPanel = ({ agentId }) => {
|
|
|
106
206
|
// ─── Main component ─────────────────────────────────────────────────────────
|
|
107
207
|
export const AgentNotebook = () => {
|
|
108
208
|
const [agentId] = useState(getAgentId);
|
|
209
|
+
const [kernelId, setKernelId] = useState(getKernelId);
|
|
109
210
|
const [isReady, setIsReady] = useState(false);
|
|
110
211
|
const [error, setError] = useState(null);
|
|
111
212
|
const [serviceManager, setServiceManager] = useState(null);
|
|
213
|
+
const { colorMode, theme } = useAgentNotebookThemeStore();
|
|
214
|
+
const themeConfig = themeConfigs[theme];
|
|
215
|
+
const systemMode = useSystemColorMode();
|
|
216
|
+
const resolvedMode = colorMode === 'auto' ? systemMode : colorMode;
|
|
217
|
+
const modeStyles = resolvedMode === 'dark'
|
|
218
|
+
? themeConfig.themeStyles.dark
|
|
219
|
+
: themeConfig.themeStyles.light;
|
|
220
|
+
const themeBackground = modeStyles.backgroundColor ?? '';
|
|
221
|
+
// Live kernel connection from the notebook running on the sandbox, wired to
|
|
222
|
+
// the chat header's kernel indicator.
|
|
223
|
+
const notebookKernel = useNotebookKernel(NOTEBOOK_ID, Boolean(serviceManager));
|
|
112
224
|
// Verify the agent exists AND initialise the Jupyter service manager
|
|
113
225
|
useEffect(() => {
|
|
114
226
|
let cancelled = false;
|
|
227
|
+
let managerForCleanup = null;
|
|
115
228
|
const init = async () => {
|
|
116
229
|
try {
|
|
117
230
|
// 1. Ensure agent exists — create if missing
|
|
@@ -135,14 +248,19 @@ export const AgentNotebook = () => {
|
|
|
135
248
|
}
|
|
136
249
|
}
|
|
137
250
|
// 2. Initialise Jupyter
|
|
138
|
-
initJupyterConfig();
|
|
139
|
-
const serverSettings =
|
|
251
|
+
const jupyterConfig = initJupyterConfig();
|
|
252
|
+
const serverSettings = buildServerSettings(jupyterConfig.baseUrl, jupyterConfig.token);
|
|
140
253
|
const manager = new ServiceManager({ serverSettings });
|
|
254
|
+
managerForCleanup = manager;
|
|
141
255
|
await manager.ready;
|
|
142
256
|
if (!cancelled) {
|
|
143
257
|
setServiceManager(manager);
|
|
144
258
|
setIsReady(true);
|
|
145
259
|
}
|
|
260
|
+
else {
|
|
261
|
+
disposeServiceManager(manager);
|
|
262
|
+
managerForCleanup = null;
|
|
263
|
+
}
|
|
146
264
|
}
|
|
147
265
|
catch (err) {
|
|
148
266
|
if (!cancelled) {
|
|
@@ -153,11 +271,32 @@ export const AgentNotebook = () => {
|
|
|
153
271
|
init();
|
|
154
272
|
return () => {
|
|
155
273
|
cancelled = true;
|
|
274
|
+
if (managerForCleanup) {
|
|
275
|
+
disposeServiceManager(managerForCleanup);
|
|
276
|
+
managerForCleanup = null;
|
|
277
|
+
}
|
|
156
278
|
};
|
|
157
279
|
}, [agentId]);
|
|
280
|
+
// If kernelId is not provided via URL, reuse the startup sandbox kernel when
|
|
281
|
+
// available so notebook/editor and agent runtime share the same execution context.
|
|
282
|
+
useEffect(() => {
|
|
283
|
+
if (kernelId) {
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
let cancelled = false;
|
|
287
|
+
void (async () => {
|
|
288
|
+
const startupKernelId = await fetchStartupKernelId();
|
|
289
|
+
if (!cancelled && startupKernelId) {
|
|
290
|
+
setKernelId(startupKernelId);
|
|
291
|
+
}
|
|
292
|
+
})();
|
|
293
|
+
return () => {
|
|
294
|
+
cancelled = true;
|
|
295
|
+
};
|
|
296
|
+
}, [kernelId]);
|
|
158
297
|
// Loading
|
|
159
298
|
if (!isReady && !error) {
|
|
160
|
-
return (_jsx(DatalayerThemeProvider, { children: _jsxs(Box, { sx: {
|
|
299
|
+
return (_jsx(DatalayerThemeProvider, { colorMode: colorMode, theme: themeConfig.primerTheme, themeStyles: themeConfig.themeStyles, children: _jsxs(Box, { sx: {
|
|
161
300
|
display: 'flex',
|
|
162
301
|
flexDirection: 'column',
|
|
163
302
|
alignItems: 'center',
|
|
@@ -169,7 +308,7 @@ export const AgentNotebook = () => {
|
|
|
169
308
|
}
|
|
170
309
|
// Error
|
|
171
310
|
if (error) {
|
|
172
|
-
return (_jsx(DatalayerThemeProvider, { children: _jsxs(Box, { sx: {
|
|
311
|
+
return (_jsx(DatalayerThemeProvider, { colorMode: colorMode, theme: themeConfig.primerTheme, themeStyles: themeConfig.themeStyles, children: _jsxs(Box, { sx: {
|
|
173
312
|
display: 'flex',
|
|
174
313
|
flexDirection: 'column',
|
|
175
314
|
alignItems: 'center',
|
|
@@ -180,12 +319,28 @@ export const AgentNotebook = () => {
|
|
|
180
319
|
}, children: [_jsx(AlertIcon, { size: 48 }), _jsx(Text, { sx: { color: 'danger.fg', fontSize: 2 }, children: "Failed to connect" }), _jsx(Text, { sx: { color: 'fg.muted', fontSize: 1 }, children: error })] }) }));
|
|
181
320
|
}
|
|
182
321
|
// Ready — notebook + chat side-by-side
|
|
183
|
-
return (_jsx(DatalayerThemeProvider, { children: _jsxs(Box, { sx: {
|
|
322
|
+
return (_jsx(DatalayerThemeProvider, { colorMode: colorMode, theme: themeConfig.primerTheme, themeStyles: themeConfig.themeStyles, children: _jsxs(Box, { sx: {
|
|
184
323
|
display: 'flex',
|
|
324
|
+
flexDirection: 'column',
|
|
185
325
|
height: '100vh',
|
|
186
326
|
width: '100vw',
|
|
187
327
|
overflow: 'hidden',
|
|
188
328
|
bg: 'canvas.default',
|
|
189
|
-
}, children: [
|
|
329
|
+
}, children: [_jsx(Box, { sx: {
|
|
330
|
+
display: 'flex',
|
|
331
|
+
justifyContent: 'flex-end',
|
|
332
|
+
alignItems: 'center',
|
|
333
|
+
px: 3,
|
|
334
|
+
height: `${TOP_BAR_HEIGHT}px`,
|
|
335
|
+
boxSizing: 'border-box',
|
|
336
|
+
borderBottom: '1px solid',
|
|
337
|
+
borderColor: 'border.default',
|
|
338
|
+
flexShrink: 0,
|
|
339
|
+
}, children: _jsx(AppearanceControlsWithStore, { useStore: useAgentNotebookThemeStore }) }), _jsxs(Box, { sx: {
|
|
340
|
+
display: 'flex',
|
|
341
|
+
flex: 1,
|
|
342
|
+
minHeight: 0,
|
|
343
|
+
overflow: 'hidden',
|
|
344
|
+
}, children: [serviceManager && (_jsx(NotebookPanel, { serviceManager: serviceManager, kernelId: kernelId, colormode: resolvedMode, backgroundColor: themeBackground })), _jsx(ChatPanel, { agentId: agentId, kernel: notebookKernel })] })] }) }));
|
|
190
345
|
};
|
|
191
346
|
export default AgentNotebook;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2025-2026 Datalayer, Inc.
|
|
3
|
+
* Distributed under the terms of the Modified BSD License.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
#root {
|
|
7
|
+
max-width: 1280px;
|
|
8
|
+
margin: 0 auto;
|
|
9
|
+
padding: 2rem;
|
|
10
|
+
/* text-align: center; */
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.logo {
|
|
14
|
+
height: 6em;
|
|
15
|
+
padding: 1.5em;
|
|
16
|
+
will-change: filter;
|
|
17
|
+
transition: filter 300ms;
|
|
18
|
+
}
|
|
19
|
+
.logo:hover {
|
|
20
|
+
filter: drop-shadow(0 0 2em #646cffaa);
|
|
21
|
+
}
|
|
22
|
+
.logo.react:hover {
|
|
23
|
+
filter: drop-shadow(0 0 2em #61dafbaa);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
@keyframes logo-spin {
|
|
27
|
+
from {
|
|
28
|
+
transform: rotate(0deg);
|
|
29
|
+
}
|
|
30
|
+
to {
|
|
31
|
+
transform: rotate(360deg);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
36
|
+
a:nth-of-type(2) .logo {
|
|
37
|
+
animation: logo-spin infinite 20s linear;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.card {
|
|
42
|
+
padding: 2em;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.read-the-docs {
|
|
46
|
+
color: #888;
|
|
47
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright (c) 2025-2026 Datalayer, Inc.
|
|
4
|
+
* Distributed under the terms of the Modified BSD License.
|
|
5
|
+
*/
|
|
6
|
+
import { useState } from 'react';
|
|
7
|
+
import reactLogo from './assets/react.svg';
|
|
8
|
+
import { useJupyter, JupyterReactTheme } from '@datalayer/jupyter-react';
|
|
9
|
+
import { CellExample } from './examples2/CellExample';
|
|
10
|
+
import { NotebookExample } from './examples2/NotebookExample';
|
|
11
|
+
import './AppExamples2.css';
|
|
12
|
+
export function App() {
|
|
13
|
+
const { serviceManager } = useJupyter({
|
|
14
|
+
jupyterServerUrl: 'https://oss.datalayer.run/api/jupyter-server',
|
|
15
|
+
jupyterServerToken: '60c1661cc408f978c309d04157af55c9588ff9557c9380e4fb50785750703da6',
|
|
16
|
+
startDefaultKernel: true,
|
|
17
|
+
});
|
|
18
|
+
const [count, setCount] = useState(0);
|
|
19
|
+
return (_jsxs("div", { className: "App", children: [_jsx(_Fragment, { children: _jsxs(JupyterReactTheme, { children: [serviceManager && _jsx(CellExample, { serviceManager: serviceManager }), serviceManager && (_jsx(NotebookExample, { serviceManager: serviceManager }))] }) }), _jsxs("div", { children: [_jsx("a", { href: "https://reactjs.org", target: "_blank", rel: "noreferrer", children: _jsx("img", { src: reactLogo, className: "logo react", alt: "React logo" }) }), _jsx("a", { href: "https://vitejs.dev", target: "_blank", rel: "noreferrer", children: _jsx("img", { src: "/vite.svg", className: "logo", alt: "Vite logo" }) })] }), _jsx("h1", { children: "React + Vite" }), _jsx("h2", { children: "On CodeSandbox!" }), _jsxs("div", { className: "card", children: [_jsxs("button", { onClick: () => setCount(count => count + 1), children: ["count is ", count] }), _jsxs("p", { children: ["Edit ", _jsx("code", { children: "src/App.tsx" }), " and save to test HMR."] }), _jsx("p", { children: "Tip: you can use the inspector button next to address bar to click on components in the preview and open the code in the editor!" })] }), _jsx("p", { className: "read-the-docs", children: "Click on the Vite and React logos to learn more" })] }));
|
|
20
|
+
}
|
|
21
|
+
export default App;
|
|
@@ -4,8 +4,8 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
4
4
|
* Distributed under the terms of the Modified BSD License.
|
|
5
5
|
*/
|
|
6
6
|
import { createRoot } from 'react-dom/client';
|
|
7
|
-
import {
|
|
7
|
+
import { AgentDocument } from './AgentDocument';
|
|
8
8
|
const rootElement = document.getElementById('root');
|
|
9
9
|
if (rootElement) {
|
|
10
|
-
createRoot(rootElement).render(_jsx(
|
|
10
|
+
createRoot(rootElement).render(_jsx(AgentDocument, {}));
|
|
11
11
|
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AgentRuntimeChat - Generic, full-page chat surface for a live agent runtime.
|
|
3
|
+
*
|
|
4
|
+
* This is the shared component used to render the plain (non-floating) chat
|
|
5
|
+
* view for an agent runtime. It is designed to be reused across the app:
|
|
6
|
+
* - The agent runtime detail page (e.g. `/agents/runtime-...`).
|
|
7
|
+
* - Gallery example pages (e.g. `/gallery/agents/analyze-excel-spreadsheet`).
|
|
8
|
+
*
|
|
9
|
+
* Behaviour:
|
|
10
|
+
* - It launches (or connects to) a runtime from the given `agentSpecId` using
|
|
11
|
+
* {@link useAgentRuntimes}.
|
|
12
|
+
* - The plain chat shell is shown as soon as possible. While the runtime is
|
|
13
|
+
* still being created/launched, the input and controls are disabled and a
|
|
14
|
+
* spinner overlay is shown (via the `launching` prop of {@link Chat}).
|
|
15
|
+
* - When ready, the same shell becomes interactive with the live endpoint.
|
|
16
|
+
* - An optional `overlay` (e.g. a sign-in gate) can be shown on top of the
|
|
17
|
+
* disabled chat for anonymous users.
|
|
18
|
+
*
|
|
19
|
+
* @module agents/AgentRuntimeChat
|
|
20
|
+
*/
|
|
21
|
+
import { type ReactNode } from 'react';
|
|
22
|
+
import type { AgentConfig } from '../types/config';
|
|
23
|
+
import type { AgentConnection } from '../types/connection';
|
|
24
|
+
import type { Protocol, Suggestion } from '../types';
|
|
25
|
+
/**
|
|
26
|
+
* Props for {@link AgentRuntimeChat}.
|
|
27
|
+
*/
|
|
28
|
+
export interface AgentRuntimeChatProps {
|
|
29
|
+
/** Agentspec id to launch, e.g. `gallery-analyze-excel-spreadsheet`. */
|
|
30
|
+
agentSpecId: string;
|
|
31
|
+
/** Human-friendly title shown in the chat header. */
|
|
32
|
+
title?: string;
|
|
33
|
+
/** Custom brand icon rendered in the header / empty state. */
|
|
34
|
+
brandIcon?: ReactNode;
|
|
35
|
+
/** Description shown in the empty state. */
|
|
36
|
+
description?: string;
|
|
37
|
+
/** Transport protocol (default: `vercel-ai`). */
|
|
38
|
+
protocol?: Protocol;
|
|
39
|
+
/** Chat height (default: `100%` so it fills the enclosing box). */
|
|
40
|
+
height?: string | number;
|
|
41
|
+
/** Suggestion chips shown in the empty state. */
|
|
42
|
+
suggestions?: Suggestion[];
|
|
43
|
+
/** Optional overlay rendered above the (disabled) chat, e.g. a sign-in gate. */
|
|
44
|
+
overlay?: ReactNode;
|
|
45
|
+
/**
|
|
46
|
+
* When false, the runtime is not launched and the chat renders in a disabled
|
|
47
|
+
* launching state. Useful for anonymous users who must sign in first.
|
|
48
|
+
* @default true
|
|
49
|
+
*/
|
|
50
|
+
launch?: boolean;
|
|
51
|
+
/** Show the model selector control (default: true). */
|
|
52
|
+
showModelSelector?: boolean;
|
|
53
|
+
/** Show the tools menu control (default: true). */
|
|
54
|
+
showToolsMenu?: boolean;
|
|
55
|
+
/** Show the skills menu control (default: true). */
|
|
56
|
+
showSkillsMenu?: boolean;
|
|
57
|
+
/** Show the chat header (default: true). */
|
|
58
|
+
showHeader?: boolean;
|
|
59
|
+
/** Show the "powered by" tag (default: false). */
|
|
60
|
+
showPoweredBy?: boolean;
|
|
61
|
+
/** Override the agent config used when creating the agent. */
|
|
62
|
+
agentConfig?: Partial<AgentConfig>;
|
|
63
|
+
/** Optional callback invoked when runtime connection state changes. */
|
|
64
|
+
onRuntimeChange?: (runtime: AgentConnection | null) => void;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Full-page chat surface for a live agent runtime, with a launching state.
|
|
68
|
+
*
|
|
69
|
+
* @param props - Component props.
|
|
70
|
+
* @returns The rendered chat surface.
|
|
71
|
+
*/
|
|
72
|
+
export declare function AgentRuntimeChat({ agentSpecId, title, brandIcon, description, protocol, height, suggestions, overlay, launch, showModelSelector, showToolsMenu, showSkillsMenu, showHeader, showPoweredBy, agentConfig, onRuntimeChange, }: AgentRuntimeChatProps): import("react/jsx-runtime").JSX.Element | null;
|
|
73
|
+
export default AgentRuntimeChat;
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// Copyright (c) 2025-2026 Datalayer, Inc.
|
|
3
|
+
// Distributed under the terms of the Modified BSD License.
|
|
4
|
+
/**
|
|
5
|
+
* AgentRuntimeChat - Generic, full-page chat surface for a live agent runtime.
|
|
6
|
+
*
|
|
7
|
+
* This is the shared component used to render the plain (non-floating) chat
|
|
8
|
+
* view for an agent runtime. It is designed to be reused across the app:
|
|
9
|
+
* - The agent runtime detail page (e.g. `/agents/runtime-...`).
|
|
10
|
+
* - Gallery example pages (e.g. `/gallery/agents/analyze-excel-spreadsheet`).
|
|
11
|
+
*
|
|
12
|
+
* Behaviour:
|
|
13
|
+
* - It launches (or connects to) a runtime from the given `agentSpecId` using
|
|
14
|
+
* {@link useAgentRuntimes}.
|
|
15
|
+
* - The plain chat shell is shown as soon as possible. While the runtime is
|
|
16
|
+
* still being created/launched, the input and controls are disabled and a
|
|
17
|
+
* spinner overlay is shown (via the `launching` prop of {@link Chat}).
|
|
18
|
+
* - When ready, the same shell becomes interactive with the live endpoint.
|
|
19
|
+
* - An optional `overlay` (e.g. a sign-in gate) can be shown on top of the
|
|
20
|
+
* disabled chat for anonymous users.
|
|
21
|
+
*
|
|
22
|
+
* @module agents/AgentRuntimeChat
|
|
23
|
+
*/
|
|
24
|
+
import { useEffect, useMemo, useRef } from 'react';
|
|
25
|
+
import { Text } from '@primer/react';
|
|
26
|
+
import { Box } from '@datalayer/primer-addons';
|
|
27
|
+
import { useIAMStore } from '@datalayer/core/lib/state';
|
|
28
|
+
import { Chat } from '../chat';
|
|
29
|
+
import { useAgentRuntimes } from '../hooks/useAgentRuntimes';
|
|
30
|
+
import { getAgentspecs } from '../specs';
|
|
31
|
+
/**
|
|
32
|
+
* Full-page chat surface for a live agent runtime, with a launching state.
|
|
33
|
+
*
|
|
34
|
+
* @param props - Component props.
|
|
35
|
+
* @returns The rendered chat surface.
|
|
36
|
+
*/
|
|
37
|
+
export function AgentRuntimeChat({ agentSpecId, title, brandIcon, description, protocol = 'vercel-ai', height = '100%', suggestions, overlay, launch = true, showModelSelector = true, showToolsMenu = true, showSkillsMenu = true, showHeader = true, showPoweredBy = false, agentConfig, onRuntimeChange, }) {
|
|
38
|
+
const { token } = useIAMStore();
|
|
39
|
+
const spec = useMemo(() => getAgentspecs(agentSpecId), [agentSpecId]);
|
|
40
|
+
const { runtime, isReady, endpoint, error, createAgent, isCreating } = useAgentRuntimes({
|
|
41
|
+
agentSpecId,
|
|
42
|
+
autoStart: launch,
|
|
43
|
+
autoCreateAgent: launch,
|
|
44
|
+
agentConfig: {
|
|
45
|
+
name: agentSpecId,
|
|
46
|
+
agentSpecId,
|
|
47
|
+
model: spec?.model,
|
|
48
|
+
systemPrompt: spec?.systemPrompt,
|
|
49
|
+
...agentConfig,
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
const resolvedTitle = title || spec?.name || 'Agent';
|
|
53
|
+
const authToken = token ?? undefined;
|
|
54
|
+
useEffect(() => {
|
|
55
|
+
onRuntimeChange?.(runtime ?? null);
|
|
56
|
+
}, [onRuntimeChange, runtime]);
|
|
57
|
+
const launchingError = launch ? error : null;
|
|
58
|
+
const runtimeAgentId = runtime?.agentId || '';
|
|
59
|
+
const hasAssignedAgent = runtimeAgentId.trim().length > 0;
|
|
60
|
+
const assignmentAttemptedForPodRef = useRef(null);
|
|
61
|
+
const launchStateLogRef = useRef('');
|
|
62
|
+
const isInteractiveReady = launch && isReady && !!endpoint && hasAssignedAgent;
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
const podName = String(runtime?.podName || '').trim();
|
|
65
|
+
if (!podName) {
|
|
66
|
+
assignmentAttemptedForPodRef.current = null;
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (hasAssignedAgent) {
|
|
70
|
+
assignmentAttemptedForPodRef.current = podName;
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (!launch || !isReady || !endpoint || !!error || isCreating) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (assignmentAttemptedForPodRef.current === podName) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
assignmentAttemptedForPodRef.current = podName;
|
|
80
|
+
void createAgent();
|
|
81
|
+
}, [
|
|
82
|
+
runtime?.podName,
|
|
83
|
+
hasAssignedAgent,
|
|
84
|
+
launch,
|
|
85
|
+
isReady,
|
|
86
|
+
endpoint,
|
|
87
|
+
error,
|
|
88
|
+
isCreating,
|
|
89
|
+
createAgent,
|
|
90
|
+
]);
|
|
91
|
+
useEffect(() => {
|
|
92
|
+
if (!launch) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const state = launchingError
|
|
96
|
+
? 'error'
|
|
97
|
+
: !isReady || !endpoint
|
|
98
|
+
? 'waiting-endpoint'
|
|
99
|
+
: !hasAssignedAgent
|
|
100
|
+
? 'waiting-assignment'
|
|
101
|
+
: 'ready';
|
|
102
|
+
const signature = [
|
|
103
|
+
state,
|
|
104
|
+
String(runtime?.podName || ''),
|
|
105
|
+
String(endpoint || ''),
|
|
106
|
+
].join('|');
|
|
107
|
+
if (launchStateLogRef.current === signature) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
launchStateLogRef.current = signature;
|
|
111
|
+
if (state === 'error') {
|
|
112
|
+
console.error('[AgentRuntimeChat] launch failed', {
|
|
113
|
+
agentSpecId,
|
|
114
|
+
podName: runtime?.podName,
|
|
115
|
+
endpoint,
|
|
116
|
+
error: launchingError,
|
|
117
|
+
});
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
if (state === 'waiting-endpoint') {
|
|
121
|
+
console.info('[AgentRuntimeChat] waiting for runtime endpoint', {
|
|
122
|
+
agentSpecId,
|
|
123
|
+
podName: runtime?.podName,
|
|
124
|
+
isReady,
|
|
125
|
+
endpoint,
|
|
126
|
+
});
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (state === 'waiting-assignment') {
|
|
130
|
+
console.info('[AgentRuntimeChat] waiting for agent assignment', {
|
|
131
|
+
agentSpecId,
|
|
132
|
+
podName: runtime?.podName,
|
|
133
|
+
endpoint,
|
|
134
|
+
});
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
console.info('[AgentRuntimeChat] runtime ready', {
|
|
138
|
+
agentSpecId,
|
|
139
|
+
podName: runtime?.podName,
|
|
140
|
+
endpoint,
|
|
141
|
+
agentId: runtimeAgentId,
|
|
142
|
+
});
|
|
143
|
+
}, [
|
|
144
|
+
launch,
|
|
145
|
+
launchStateLogRef,
|
|
146
|
+
launchingError,
|
|
147
|
+
isReady,
|
|
148
|
+
endpoint,
|
|
149
|
+
hasAssignedAgent,
|
|
150
|
+
runtime?.podName,
|
|
151
|
+
runtimeAgentId,
|
|
152
|
+
agentSpecId,
|
|
153
|
+
]);
|
|
154
|
+
const commonChatProps = {
|
|
155
|
+
protocol,
|
|
156
|
+
useStore: false,
|
|
157
|
+
title: resolvedTitle,
|
|
158
|
+
brandIcon,
|
|
159
|
+
description: description || spec?.welcomeMessage || 'Ask me to analyse your data.',
|
|
160
|
+
height,
|
|
161
|
+
showHeader,
|
|
162
|
+
showInput: true,
|
|
163
|
+
showModelSelector,
|
|
164
|
+
showToolsMenu,
|
|
165
|
+
showSkillsMenu,
|
|
166
|
+
showPoweredBy,
|
|
167
|
+
suggestions,
|
|
168
|
+
// Show the in-memory ephemeral notebook next to the chat (with a footer
|
|
169
|
+
// toggle to hide it) for agent runtime + gallery surfaces.
|
|
170
|
+
enableEphemeralNotebook: true,
|
|
171
|
+
};
|
|
172
|
+
if (launchingError) {
|
|
173
|
+
return (_jsxs(Box, { sx: {
|
|
174
|
+
p: 3,
|
|
175
|
+
borderRadius: 2,
|
|
176
|
+
border: '1px solid',
|
|
177
|
+
borderColor: 'danger.emphasis',
|
|
178
|
+
bg: 'danger.subtle',
|
|
179
|
+
color: 'danger.fg',
|
|
180
|
+
}, children: [_jsx(Text, { sx: { fontWeight: 600 }, children: "Failed to launch the agent" }), _jsx(Text, { sx: { display: 'block', mt: 1, fontSize: 1 }, children: launchingError })] }));
|
|
181
|
+
}
|
|
182
|
+
// Live and ready: interactive chat wired to the runtime endpoint.
|
|
183
|
+
if (isInteractiveReady) {
|
|
184
|
+
return (_jsx(Chat, { ...commonChatProps, baseUrl: endpoint, agentId: runtimeAgentId, runtimeId: "default", authToken: authToken, historyEndpoint: `${endpoint}/api/v1/history`, showTokenUsage: true, autoFocus: true }));
|
|
185
|
+
}
|
|
186
|
+
// Strict path: do not mount a live Chat until endpoint + assignment are
|
|
187
|
+
// ready. This avoids default localhost fallback connections in launch states.
|
|
188
|
+
//
|
|
189
|
+
// Anonymous visitors (overlay set) still get the full chat shell — including
|
|
190
|
+
// the ephemeral gallery notebook — rendered disabled underneath, with the
|
|
191
|
+
// centered sign-in gate on top. `autoConnect={false}` keeps it from opening
|
|
192
|
+
// any protocol connection while unauthenticated.
|
|
193
|
+
if (overlay) {
|
|
194
|
+
return _jsx(Chat, { ...commonChatProps, autoConnect: false, overlay: overlay });
|
|
195
|
+
}
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
export default AgentRuntimeChat;
|