@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
|
@@ -17,9 +17,11 @@ import { create } from 'zustand';
|
|
|
17
17
|
import { persist, createJSONStorage } from 'zustand/middleware';
|
|
18
18
|
import { useCoreStore, useDatalayer } from '@datalayer/core';
|
|
19
19
|
import { useIAMStore } from '@datalayer/core/lib/state';
|
|
20
|
+
import { runtimesStore } from '../state';
|
|
20
21
|
import { agentRuntimeStore, useAgentRuntimeStore, useAgentRuntimeConnection, useAgentRuntimeStatus, useAgentRuntimeError, useAgentRuntimeIsLaunching, } from '../stores/agentRuntimeStore';
|
|
21
22
|
import { parseAgentStreamMessage, } from '../types/stream';
|
|
22
23
|
import { DEFAULT_AGENT_CONFIG } from '../types/config';
|
|
24
|
+
import { disposeSandboxServiceManagers } from '../services/sandboxServiceManagers';
|
|
23
25
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
24
26
|
// Constants
|
|
25
27
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
@@ -46,6 +48,60 @@ export const agentQueryKeys = {
|
|
|
46
48
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
47
49
|
// Helpers
|
|
48
50
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
51
|
+
/**
|
|
52
|
+
* Session tombstones for runtime pods deleted from this client.
|
|
53
|
+
*
|
|
54
|
+
* After a DELETE succeeds, the control plane can keep returning the pod
|
|
55
|
+
* (status \"running\") for a few seconds. Without a tombstone, the immediate
|
|
56
|
+
* list refetch re-adds the dead pod to the query cache (and re-seeds the
|
|
57
|
+
* per-pod detail cache), so consumers rebuild Jupyter `ServiceManager`s
|
|
58
|
+
* against the dead ingress — producing endless CORS `/api/kernels` errors.
|
|
59
|
+
*
|
|
60
|
+
* Entries expire after a TTL so a pod that legitimately reappears later
|
|
61
|
+
* (e.g. resumed from a checkpoint under the same pod name) is not hidden
|
|
62
|
+
* forever; resume/create mutations also clear the tombstone eagerly.
|
|
63
|
+
*/
|
|
64
|
+
const DELETED_POD_TOMBSTONE_TTL_MS = 5 * 60 * 1000;
|
|
65
|
+
const deletedRuntimePodTombstones = new Map();
|
|
66
|
+
/** Mark a runtime pod as deleted by this client (tombstone). */
|
|
67
|
+
export function markRuntimePodDeleted(podName) {
|
|
68
|
+
const normalized = String(podName || '').trim();
|
|
69
|
+
if (normalized) {
|
|
70
|
+
deletedRuntimePodTombstones.set(normalized, Date.now());
|
|
71
|
+
// Centralized teardown: dispose every ServiceManager any surface opened
|
|
72
|
+
// against this pod's sandbox so their kernelspecs/sessions/users pollers
|
|
73
|
+
// stop immediately instead of waiting for query-cache propagation.
|
|
74
|
+
disposeSandboxServiceManagers(normalized);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/** Clear a deleted-pod tombstone (pod legitimately exists again). */
|
|
78
|
+
export function clearRuntimePodDeleted(podName) {
|
|
79
|
+
deletedRuntimePodTombstones.delete(String(podName || '').trim());
|
|
80
|
+
}
|
|
81
|
+
/** Statuses that imply a live pod the client would connect to. */
|
|
82
|
+
const LIVE_RUNTIME_STATUSES = new Set([
|
|
83
|
+
'running',
|
|
84
|
+
'resumed',
|
|
85
|
+
'starting',
|
|
86
|
+
'resuming',
|
|
87
|
+
]);
|
|
88
|
+
/**
|
|
89
|
+
* True when a runtime record is a stale control-plane echo of a pod this
|
|
90
|
+
* client already deleted: tombstoned, within TTL, and claiming a live status.
|
|
91
|
+
* Checkpoint-synthesised `paused` records pass through (no live pod to poll).
|
|
92
|
+
*/
|
|
93
|
+
function isStaleDeletedRuntime(runtime) {
|
|
94
|
+
const podName = String(runtime?.pod_name || '').trim();
|
|
95
|
+
const deletedAt = deletedRuntimePodTombstones.get(podName);
|
|
96
|
+
if (deletedAt === undefined) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
if (Date.now() - deletedAt > DELETED_POD_TOMBSTONE_TTL_MS) {
|
|
100
|
+
deletedRuntimePodTombstones.delete(podName);
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
return LIVE_RUNTIME_STATUSES.has(runtime.status);
|
|
104
|
+
}
|
|
49
105
|
const RUNTIME_STATUS_MAP = {
|
|
50
106
|
resume: 'resumed',
|
|
51
107
|
resumed: 'resumed',
|
|
@@ -148,11 +204,11 @@ export function useAgentRuntimes(options = {}) {
|
|
|
148
204
|
import.meta.env.VITE_BASE_URL ||
|
|
149
205
|
'http://localhost:8765');
|
|
150
206
|
}
|
|
151
|
-
return (configuration?.
|
|
207
|
+
return (configuration?.runtimesUrl ||
|
|
152
208
|
import.meta.env.VITE_DATALAYER_AGENT_RUNTIMES_URL ||
|
|
153
209
|
'https://r1.datalayer.run');
|
|
154
210
|
}, [
|
|
155
|
-
configuration?.
|
|
211
|
+
configuration?.runtimesUrl,
|
|
156
212
|
runtimeCreationBaseUrl,
|
|
157
213
|
runtimeCreationTarget,
|
|
158
214
|
]);
|
|
@@ -162,12 +218,12 @@ export function useAgentRuntimes(options = {}) {
|
|
|
162
218
|
const { iamStore, coreStore } = await import('@datalayer/core/lib/state');
|
|
163
219
|
const token = iamStore.getState().token || '';
|
|
164
220
|
const config = coreStore.getState().configuration;
|
|
165
|
-
const
|
|
166
|
-
const
|
|
167
|
-
return { token,
|
|
221
|
+
const datalayerUrl = config?.aiAgentsUrl || '';
|
|
222
|
+
const runtimesUrl = resolvedRuntimeCreationBaseUrl;
|
|
223
|
+
return { token, datalayerUrl, runtimesUrl };
|
|
168
224
|
}
|
|
169
225
|
catch {
|
|
170
|
-
return { token: '',
|
|
226
|
+
return { token: '', datalayerUrl: '', runtimesUrl: '' };
|
|
171
227
|
}
|
|
172
228
|
}, [resolvedRuntimeCreationBaseUrl]);
|
|
173
229
|
// ─── Launch Runtime ─────────────────────────────────────────────────
|
|
@@ -188,13 +244,13 @@ export function useAgentRuntimes(options = {}) {
|
|
|
188
244
|
const conn = await storeLaunchAgent(runtimeOptions
|
|
189
245
|
? {
|
|
190
246
|
...runtimeOptions,
|
|
191
|
-
|
|
247
|
+
runtimesUrl: resolvedRuntimeCreationBaseUrl,
|
|
192
248
|
}
|
|
193
249
|
: {
|
|
194
250
|
environmentName: 'ai-agents-env',
|
|
195
251
|
creditsLimit: 10,
|
|
196
252
|
givenName: safeName,
|
|
197
|
-
|
|
253
|
+
runtimesUrl: resolvedRuntimeCreationBaseUrl,
|
|
198
254
|
});
|
|
199
255
|
setLifecycleStatus('ready');
|
|
200
256
|
return conn;
|
|
@@ -212,7 +268,7 @@ export function useAgentRuntimes(options = {}) {
|
|
|
212
268
|
}
|
|
213
269
|
return storeLaunchAgent({
|
|
214
270
|
...runtimeOptions,
|
|
215
|
-
|
|
271
|
+
runtimesUrl: resolvedRuntimeCreationBaseUrl,
|
|
216
272
|
});
|
|
217
273
|
}
|
|
218
274
|
}, [
|
|
@@ -271,6 +327,29 @@ export function useAgentRuntimes(options = {}) {
|
|
|
271
327
|
setIsCreating(false);
|
|
272
328
|
}
|
|
273
329
|
}, [agentSpecId, agentConfig, agentSpec, hasSpec, runtime, storeCreateAgent]);
|
|
330
|
+
// ─── Teardown ───────────────────────────────────────────────────────
|
|
331
|
+
const teardown = useCallback(async () => {
|
|
332
|
+
const agentId = runtime?.agentId;
|
|
333
|
+
const agentBaseUrl = runtime?.agentBaseUrl;
|
|
334
|
+
if (agentId && agentBaseUrl) {
|
|
335
|
+
try {
|
|
336
|
+
const { token } = await getAuthHeaders();
|
|
337
|
+
await fetch(`${agentBaseUrl}/api/v1/agents/${encodeURIComponent(agentId)}`, {
|
|
338
|
+
method: 'DELETE',
|
|
339
|
+
headers: token ? { Authorization: `Bearer ${token}` } : {},
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
catch {
|
|
343
|
+
// Best-effort teardown: ignore network / 404 errors.
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// Reset in-process runtime state so a fresh agent can be launched.
|
|
347
|
+
hasCreatedAgentRef.current = false;
|
|
348
|
+
hasAutoStarted.current = false;
|
|
349
|
+
setLifecycleStatus('idle');
|
|
350
|
+
setLifecycleError(null);
|
|
351
|
+
agentRuntimeStore.getState().reset();
|
|
352
|
+
}, [runtime?.agentId, runtime?.agentBaseUrl, getAuthHeaders]);
|
|
274
353
|
// ─── Auto-create agent when runtime is ready (connect mode) ───────
|
|
275
354
|
useEffect(() => {
|
|
276
355
|
if (!hasSpec &&
|
|
@@ -324,12 +403,12 @@ export function useAgentRuntimes(options = {}) {
|
|
|
324
403
|
let cancelled = false;
|
|
325
404
|
const bootstrap = async () => {
|
|
326
405
|
try {
|
|
327
|
-
const { token,
|
|
406
|
+
const { token, runtimesUrl } = await getAuthHeaders();
|
|
328
407
|
if (!token) {
|
|
329
408
|
return;
|
|
330
409
|
}
|
|
331
|
-
const { listRuntimes } = await import('
|
|
332
|
-
const runtimesResponse = await listRuntimes(token,
|
|
410
|
+
const { listRuntimes } = await import('../api/runtimes/runtimes');
|
|
411
|
+
const runtimesResponse = await listRuntimes(token, runtimesUrl);
|
|
333
412
|
const runtimes = runtimesResponse.runtimes || [];
|
|
334
413
|
const aiAgentRuntimes = runtimes.filter(rt => {
|
|
335
414
|
if (rt.environment_name !== 'ai-agents-env') {
|
|
@@ -441,6 +520,7 @@ export function useAgentRuntimes(options = {}) {
|
|
|
441
520
|
endpoint,
|
|
442
521
|
serviceManager,
|
|
443
522
|
createAgent,
|
|
523
|
+
teardown,
|
|
444
524
|
isCreating,
|
|
445
525
|
// Status
|
|
446
526
|
isReady,
|
|
@@ -487,13 +567,16 @@ export function useAgentRuntimesQuery(scope, queryOptions) {
|
|
|
487
567
|
}
|
|
488
568
|
const query = params.toString();
|
|
489
569
|
const resp = await requestDatalayer({
|
|
490
|
-
url: `${configuration.
|
|
570
|
+
url: `${configuration.runtimesUrl}/api/runtimes/v1/runtimes${query ? `?${query}` : ''}`,
|
|
491
571
|
method: 'GET',
|
|
492
572
|
});
|
|
493
573
|
if (resp.success && resp.runtimes) {
|
|
494
574
|
const agentRuntimes = resp.runtimes
|
|
495
575
|
.filter(rt => rt.environment_name === 'ai-agents-env')
|
|
496
|
-
.map(toAgentRuntimeData)
|
|
576
|
+
.map(toAgentRuntimeData)
|
|
577
|
+
// Drop stale echoes of pods deleted from this client so consumers
|
|
578
|
+
// never reconnect a ServiceManager to a dead ingress (CORS spam).
|
|
579
|
+
.filter(runtime => !isStaleDeletedRuntime(runtime));
|
|
497
580
|
agentRuntimes.forEach((runtime) => {
|
|
498
581
|
queryClient.setQueryData(agentQueryKeys.agentRuntimes.detail(runtime.pod_name), runtime);
|
|
499
582
|
});
|
|
@@ -518,11 +601,17 @@ export function useAgentRuntimeByPodName(podName) {
|
|
|
518
601
|
queryKey: agentQueryKeys.agentRuntimes.detail(podName ?? ''),
|
|
519
602
|
queryFn: async () => {
|
|
520
603
|
const resp = await requestDatalayer({
|
|
521
|
-
url: `${configuration.
|
|
604
|
+
url: `${configuration.runtimesUrl}/api/runtimes/v1/runtimes/${podName}`,
|
|
522
605
|
method: 'GET',
|
|
523
606
|
});
|
|
524
607
|
if (resp.runtime) {
|
|
525
|
-
|
|
608
|
+
const runtime = toAgentRuntimeData(resp.runtime);
|
|
609
|
+
if (isStaleDeletedRuntime(runtime)) {
|
|
610
|
+
// Stale echo of a pod deleted from this client — surface as an
|
|
611
|
+
// error so the poll stops and consumers tear the connection down.
|
|
612
|
+
throw new Error('Agent runtime deleted');
|
|
613
|
+
}
|
|
614
|
+
return runtime;
|
|
526
615
|
}
|
|
527
616
|
throw new Error('Failed to fetch agent runtime');
|
|
528
617
|
},
|
|
@@ -551,7 +640,7 @@ export function useCreateAgentRuntime() {
|
|
|
551
640
|
? [String(data.volumeUid).trim()]
|
|
552
641
|
: [];
|
|
553
642
|
return requestDatalayer({
|
|
554
|
-
url: `${configuration.
|
|
643
|
+
url: `${configuration.runtimesUrl}/api/runtimes/v1/runtimes`,
|
|
555
644
|
method: 'POST',
|
|
556
645
|
body: {
|
|
557
646
|
environment_name: data.environmentName || 'ai-agents-env',
|
|
@@ -563,11 +652,11 @@ export function useCreateAgentRuntime() {
|
|
|
563
652
|
agent_spec_id: data.agentSpecId || undefined,
|
|
564
653
|
agent_spec: data.agentSpec || undefined,
|
|
565
654
|
user_account_handle: data.userAccountHandle || undefined,
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
655
|
+
billing_entity_uid: data.billingEntityUid || undefined,
|
|
656
|
+
billing_entity_type: data.billingEntityType || undefined,
|
|
657
|
+
billing_entity_handle: data.billingEntityHandle || undefined,
|
|
658
|
+
billing_source_organization_uid: data.billingSourceOrganizationUid || undefined,
|
|
659
|
+
billing_source_organization_handle: data.billingSourceOrganizationHandle || undefined,
|
|
571
660
|
mount_home_folder: data.mountHomeFolder ?? false,
|
|
572
661
|
volume_uids: normalizedVolumeUids.length > 0 ? normalizedVolumeUids : undefined,
|
|
573
662
|
volume_uid: normalizedVolumeUids[0] || data.volumeUid || undefined,
|
|
@@ -577,6 +666,8 @@ export function useCreateAgentRuntime() {
|
|
|
577
666
|
onSuccess: resp => {
|
|
578
667
|
if (resp.success && resp.runtime) {
|
|
579
668
|
const mapped = toAgentRuntimeData(resp.runtime);
|
|
669
|
+
// A fresh runtime legitimately exists — drop any stale tombstone.
|
|
670
|
+
clearRuntimePodDeleted(mapped.pod_name);
|
|
580
671
|
queryClient.setQueryData(agentQueryKeys.agentRuntimes.detail(mapped.pod_name), mapped);
|
|
581
672
|
queryClient.invalidateQueries({
|
|
582
673
|
queryKey: agentQueryKeys.agentRuntimes.all(),
|
|
@@ -592,14 +683,70 @@ export function useDeleteAgentRuntime() {
|
|
|
592
683
|
const { configuration } = useCoreStore();
|
|
593
684
|
const { requestDatalayer } = useDatalayer({ notifyOnError: false });
|
|
594
685
|
const queryClient = useQueryClient();
|
|
686
|
+
const getErrorStatus = (error) => {
|
|
687
|
+
if (!error || typeof error !== 'object') {
|
|
688
|
+
return undefined;
|
|
689
|
+
}
|
|
690
|
+
const response = error.response;
|
|
691
|
+
return typeof response?.status === 'number' ? response.status : undefined;
|
|
692
|
+
};
|
|
693
|
+
const getErrorText = (error) => {
|
|
694
|
+
if (!error || typeof error !== 'object') {
|
|
695
|
+
return '';
|
|
696
|
+
}
|
|
697
|
+
const responseData = error.response?.data;
|
|
698
|
+
return String(responseData?.detail ||
|
|
699
|
+
responseData?.message ||
|
|
700
|
+
error.message ||
|
|
701
|
+
'').toLowerCase();
|
|
702
|
+
};
|
|
595
703
|
return useMutation({
|
|
596
704
|
mutationFn: async (podName) => {
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
705
|
+
try {
|
|
706
|
+
return await requestDatalayer({
|
|
707
|
+
url: `${configuration.runtimesUrl}/api/runtimes/v1/runtimes/${podName}`,
|
|
708
|
+
method: 'DELETE',
|
|
709
|
+
});
|
|
710
|
+
}
|
|
711
|
+
catch (error) {
|
|
712
|
+
const status = getErrorStatus(error);
|
|
713
|
+
const message = getErrorText(error);
|
|
714
|
+
const maybeAlreadyDeleted = status === 404 ||
|
|
715
|
+
message.includes('no reservation') ||
|
|
716
|
+
message.includes('unknown reservation') ||
|
|
717
|
+
message.includes('not found');
|
|
718
|
+
if (!maybeAlreadyDeleted) {
|
|
719
|
+
throw error;
|
|
720
|
+
}
|
|
721
|
+
// The backend can return an IAM reservation error even after the pod
|
|
722
|
+
// has already been deleted successfully. Confirm state by checking if
|
|
723
|
+
// the runtime detail endpoint still exists.
|
|
724
|
+
try {
|
|
725
|
+
await requestDatalayer({
|
|
726
|
+
url: `${configuration.runtimesUrl}/api/runtimes/v1/runtimes/${podName}`,
|
|
727
|
+
method: 'GET',
|
|
728
|
+
});
|
|
729
|
+
// Runtime still exists: propagate original DELETE failure.
|
|
730
|
+
throw error;
|
|
731
|
+
}
|
|
732
|
+
catch (checkError) {
|
|
733
|
+
const checkStatus = getErrorStatus(checkError);
|
|
734
|
+
if (checkStatus === 404) {
|
|
735
|
+
return { success: true, recovered: true };
|
|
736
|
+
}
|
|
737
|
+
throw error;
|
|
738
|
+
}
|
|
739
|
+
}
|
|
601
740
|
},
|
|
602
741
|
onSuccess: (_data, podName) => {
|
|
742
|
+
// Tombstone the pod so refetches that still echo it from the control
|
|
743
|
+
// plane (deletion lag) do not re-add it to the caches below.
|
|
744
|
+
markRuntimePodDeleted(podName);
|
|
745
|
+
// Prune the pod from the runtimes store immediately so the remote service
|
|
746
|
+
// managers dispose right away and stop polling the now-dead pod ingress
|
|
747
|
+
// (otherwise `/api/kernels` requests keep firing until the next
|
|
748
|
+
// `refreshRuntimePods()` poll tick, producing CORS errors).
|
|
749
|
+
runtimesStore.getState().removeRuntimePod(podName);
|
|
603
750
|
queryClient.setQueriesData({ queryKey: agentQueryKeys.agentRuntimes.lists() }, (current) => {
|
|
604
751
|
if (!Array.isArray(current)) {
|
|
605
752
|
return current;
|
|
@@ -707,6 +854,16 @@ export function useAgentsRuntimes(scope, queryOptions) {
|
|
|
707
854
|
const createRuntimeMutation = useCreateAgentRuntime();
|
|
708
855
|
const deleteRuntimeMutation = useDeleteAgentRuntime();
|
|
709
856
|
const refreshRuntimes = useRefreshAgentRuntimes();
|
|
857
|
+
const terminateRuntimeByPod = useCallback(async (podName, options) => {
|
|
858
|
+
const normalizedPodName = String(podName || '').trim();
|
|
859
|
+
if (!normalizedPodName) {
|
|
860
|
+
return;
|
|
861
|
+
}
|
|
862
|
+
if (options?.beforeTerminate) {
|
|
863
|
+
await options.beforeTerminate();
|
|
864
|
+
}
|
|
865
|
+
return deleteRuntimeMutation.mutateAsync(normalizedPodName);
|
|
866
|
+
}, [deleteRuntimeMutation]);
|
|
710
867
|
return useMemo(() => ({
|
|
711
868
|
runtimes: runtimesQuery.data ?? EMPTY_RUNTIMES,
|
|
712
869
|
isRuntimesLoading: runtimesQuery.isLoading,
|
|
@@ -714,7 +871,8 @@ export function useAgentsRuntimes(scope, queryOptions) {
|
|
|
714
871
|
runtimesError: runtimesQuery.error,
|
|
715
872
|
refetchRuntimes: () => runtimesQuery.refetch(),
|
|
716
873
|
refreshRuntimes,
|
|
717
|
-
|
|
874
|
+
terminateRuntimeByPod,
|
|
875
|
+
deleteRuntimeByPod: async (podName) => terminateRuntimeByPod(podName),
|
|
718
876
|
createRuntime: async (data) => createRuntimeMutation.mutateAsync(data),
|
|
719
877
|
}), [
|
|
720
878
|
runtimesQuery.data,
|
|
@@ -723,6 +881,7 @@ export function useAgentsRuntimes(scope, queryOptions) {
|
|
|
723
881
|
runtimesQuery.error,
|
|
724
882
|
runtimesQuery.refetch,
|
|
725
883
|
refreshRuntimes,
|
|
884
|
+
terminateRuntimeByPod,
|
|
726
885
|
createRuntimeMutation,
|
|
727
886
|
deleteRuntimeMutation,
|
|
728
887
|
]);
|
|
@@ -23,7 +23,7 @@ export const useAgentsService = (baseUrlOverride = 'api/ai-agents/v1') => {
|
|
|
23
23
|
const { requestDatalayer } = useDatalayer({ notifyOnError: false });
|
|
24
24
|
const createAgent = (documentId, documentType, ingress, token, kernelId, { signal, baseUrl = baseUrlOverride } = {}) => {
|
|
25
25
|
return requestDatalayer({
|
|
26
|
-
url: URLExt.join(configuration.
|
|
26
|
+
url: URLExt.join(configuration.aiAgentsUrl, baseUrl, 'agents'),
|
|
27
27
|
method: 'POST',
|
|
28
28
|
body: {
|
|
29
29
|
document_id: documentId,
|
|
@@ -39,28 +39,28 @@ export const useAgentsService = (baseUrlOverride = 'api/ai-agents/v1') => {
|
|
|
39
39
|
};
|
|
40
40
|
const getAgents = ({ signal, baseUrl = baseUrlOverride, } = {}) => {
|
|
41
41
|
return requestDatalayer({
|
|
42
|
-
url: URLExt.join(configuration.
|
|
42
|
+
url: URLExt.join(configuration.aiAgentsUrl, baseUrl, 'agents'),
|
|
43
43
|
method: 'GET',
|
|
44
44
|
signal,
|
|
45
45
|
});
|
|
46
46
|
};
|
|
47
47
|
const deleteAgent = (documentId, { signal, baseUrl = baseUrlOverride } = {}) => {
|
|
48
48
|
return requestDatalayer({
|
|
49
|
-
url: URLExt.join(configuration.
|
|
49
|
+
url: URLExt.join(configuration.aiAgentsUrl, baseUrl, 'agents', documentId),
|
|
50
50
|
method: 'DELETE',
|
|
51
51
|
signal,
|
|
52
52
|
});
|
|
53
53
|
};
|
|
54
54
|
const getAgent = (documentId, { signal, baseUrl = baseUrlOverride } = {}) => {
|
|
55
55
|
return requestDatalayer({
|
|
56
|
-
url: URLExt.join(configuration.
|
|
56
|
+
url: URLExt.join(configuration.aiAgentsUrl, baseUrl, 'agents', documentId),
|
|
57
57
|
method: 'GET',
|
|
58
58
|
signal,
|
|
59
59
|
});
|
|
60
60
|
};
|
|
61
61
|
const patchAgent = (documentId, ingress, token, kernelId, { signal, baseUrl = baseUrlOverride } = {}) => {
|
|
62
62
|
return requestDatalayer({
|
|
63
|
-
url: URLExt.join(configuration.
|
|
63
|
+
url: URLExt.join(configuration.aiAgentsUrl, baseUrl, 'agents', documentId),
|
|
64
64
|
method: 'PATCH',
|
|
65
65
|
body: {
|
|
66
66
|
runtime: ingress && token && kernelId
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2025-2026 Datalayer, Inc.
|
|
3
|
+
* Distributed under the terms of the Modified BSD License.
|
|
4
|
+
*/
|
|
5
|
+
import { useState } from 'react';
|
|
6
|
+
import { useCellStore } from '../state/substates';
|
|
7
|
+
import { takeHTMLNodeScreencapture } from '@datalayer/core/lib/utils/Screencapture';
|
|
8
|
+
const useCellOutputshot = () => {
|
|
9
|
+
const [outputshot, setOutputshot] = useState('');
|
|
10
|
+
const [error, setError] = useState();
|
|
11
|
+
const { update } = useCellStore();
|
|
12
|
+
const takeOutputshot = (node) => {
|
|
13
|
+
takeHTMLNodeScreencapture(node)
|
|
14
|
+
.then(outputshotData => {
|
|
15
|
+
setOutputshot(outputshotData);
|
|
16
|
+
update({
|
|
17
|
+
outputshotData,
|
|
18
|
+
});
|
|
19
|
+
return outputshotData;
|
|
20
|
+
})
|
|
21
|
+
.catch(reason => setError(reason));
|
|
22
|
+
};
|
|
23
|
+
return [outputshot, takeOutputshot, { error }];
|
|
24
|
+
};
|
|
25
|
+
export default useCellOutputshot;
|
|
@@ -48,7 +48,7 @@ export type TerminateAgentParams = {
|
|
|
48
48
|
* Calls ``GET /api/runtimes/v1/runtime-checkpoints`` and returns
|
|
49
49
|
* the list of checkpoint records in visible states.
|
|
50
50
|
*/
|
|
51
|
-
export declare function useCheckpointsQuery(): import("@tanstack/react-query").UseQueryResult<CheckpointData[]
|
|
51
|
+
export declare function useCheckpointsQuery(): import("@tanstack/react-query").UseQueryResult<NoInfer<CheckpointData[]>, Error>;
|
|
52
52
|
/**
|
|
53
53
|
* Hook to refresh the checkpoints list.
|
|
54
54
|
*/
|
|
@@ -73,14 +73,14 @@ export declare function useResumePausedAgentRuntime(): import("@tanstack/react-q
|
|
|
73
73
|
* until the checkpoint reaches ``paused`` or ``failed``.
|
|
74
74
|
* On success, both runtimes and checkpoints queries are invalidated.
|
|
75
75
|
*/
|
|
76
|
-
export declare function usePauseAgent(): import("@tanstack/react-query").UseMutationResult<import("
|
|
76
|
+
export declare function usePauseAgent(): import("@tanstack/react-query").UseMutationResult<import("../api/runtimes/runtimes").PauseResumeResponse, Error, PauseAgentParams, unknown>;
|
|
77
77
|
/**
|
|
78
78
|
* Hook to resume a paused agent runtime from a checkpoint.
|
|
79
79
|
*
|
|
80
80
|
* Calls ``POST .../resume`` then invalidates both runtimes and
|
|
81
81
|
* checkpoints queries so the UI reflects the new state.
|
|
82
82
|
*/
|
|
83
|
-
export declare function useResumeAgent(): import("@tanstack/react-query").UseMutationResult<import("
|
|
83
|
+
export declare function useResumeAgent(): import("@tanstack/react-query").UseMutationResult<import("../api/runtimes/runtimes").PauseResumeResponse, Error, ResumeAgentParams, unknown>;
|
|
84
84
|
/**
|
|
85
85
|
* Hook to create a named checkpoint (pause → wait → stay paused).
|
|
86
86
|
*
|
|
@@ -88,7 +88,7 @@ export declare function useResumeAgent(): import("@tanstack/react-query").UseMut
|
|
|
88
88
|
* this hook creates a named checkpoint record for later restore.
|
|
89
89
|
*/
|
|
90
90
|
export declare function useCheckpointAgent(): import("@tanstack/react-query").UseMutationResult<{
|
|
91
|
-
checkpoint: import("
|
|
91
|
+
checkpoint: import("../api/runtimes/checkpoints").RuntimeCheckpointData;
|
|
92
92
|
success: boolean;
|
|
93
93
|
message: string;
|
|
94
94
|
checkpoint_id: string | null;
|
|
@@ -163,12 +163,12 @@ export declare function useAgentLifecycle(options: AgentLifecycleOptions): Agent
|
|
|
163
163
|
* for pause, resume, and checkpoint lifecycle.
|
|
164
164
|
*/
|
|
165
165
|
export declare function useCheckpoints(): {
|
|
166
|
-
checkpointsQuery: import("@tanstack/react-query").UseQueryResult<CheckpointData[]
|
|
166
|
+
checkpointsQuery: import("@tanstack/react-query").UseQueryResult<NoInfer<CheckpointData[]>, Error>;
|
|
167
167
|
refresh: () => void;
|
|
168
|
-
pauseAgent: import("@tanstack/react-query").UseMutationResult<import("
|
|
169
|
-
resumeAgent: import("@tanstack/react-query").UseMutationResult<import("
|
|
168
|
+
pauseAgent: import("@tanstack/react-query").UseMutationResult<import("../api/runtimes/runtimes").PauseResumeResponse, Error, PauseAgentParams, unknown>;
|
|
169
|
+
resumeAgent: import("@tanstack/react-query").UseMutationResult<import("../api/runtimes/runtimes").PauseResumeResponse, Error, ResumeAgentParams, unknown>;
|
|
170
170
|
checkpointAgent: import("@tanstack/react-query").UseMutationResult<{
|
|
171
|
-
checkpoint: import("
|
|
171
|
+
checkpoint: import("../api/runtimes/checkpoints").RuntimeCheckpointData;
|
|
172
172
|
success: boolean;
|
|
173
173
|
message: string;
|
|
174
174
|
checkpoint_id: string | null;
|
|
@@ -14,7 +14,8 @@ import { useMemo, useState, useCallback } from 'react';
|
|
|
14
14
|
import { useQuery, useQueryClient, useMutation } from '@tanstack/react-query';
|
|
15
15
|
import { useIAMStore } from '@datalayer/core/lib/state';
|
|
16
16
|
import { useCoreStore, useDatalayer } from '@datalayer/core';
|
|
17
|
-
import { agentQueryKeys, AGENT_QUERY_OPTIONS } from './useAgentRuntimes';
|
|
17
|
+
import { agentQueryKeys, AGENT_QUERY_OPTIONS, clearRuntimePodDeleted, } from './useAgentRuntimes';
|
|
18
|
+
import { disposeSandboxServiceManagers } from '../services/sandboxServiceManagers';
|
|
18
19
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
19
20
|
// Query hooks
|
|
20
21
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
@@ -32,7 +33,7 @@ export function useCheckpointsQuery() {
|
|
|
32
33
|
queryKey: agentQueryKeys.checkpoints.lists(),
|
|
33
34
|
queryFn: async () => {
|
|
34
35
|
const resp = await requestDatalayer({
|
|
35
|
-
url: `${configuration.
|
|
36
|
+
url: `${configuration.runtimesUrl}/api/runtimes/v1/runtime-checkpoints`,
|
|
36
37
|
method: 'GET',
|
|
37
38
|
});
|
|
38
39
|
if (resp.success && resp.checkpoints) {
|
|
@@ -71,7 +72,7 @@ export function useDeletePausedAgentRuntime() {
|
|
|
71
72
|
return useMutation({
|
|
72
73
|
mutationFn: async (podName) => {
|
|
73
74
|
return requestDatalayer({
|
|
74
|
-
url: `${configuration.
|
|
75
|
+
url: `${configuration.runtimesUrl}/api/runtimes/v1/runtimes/${podName}/paused`,
|
|
75
76
|
method: 'DELETE',
|
|
76
77
|
});
|
|
77
78
|
},
|
|
@@ -101,11 +102,14 @@ export function useResumePausedAgentRuntime() {
|
|
|
101
102
|
return useMutation({
|
|
102
103
|
mutationFn: async (podName) => {
|
|
103
104
|
return requestDatalayer({
|
|
104
|
-
url: `${configuration.
|
|
105
|
+
url: `${configuration.runtimesUrl}/api/runtimes/v1/runtimes/${podName}/resume`,
|
|
105
106
|
method: 'POST',
|
|
106
107
|
});
|
|
107
108
|
},
|
|
108
|
-
onSuccess: () => {
|
|
109
|
+
onSuccess: (_data, podName) => {
|
|
110
|
+
// The pod can come back under the same name — drop any delete tombstone
|
|
111
|
+
// so the runtimes queries do not filter the resumed runtime out.
|
|
112
|
+
clearRuntimePodDeleted(podName);
|
|
109
113
|
queryClient.invalidateQueries({
|
|
110
114
|
queryKey: agentQueryKeys.agentRuntimes.all(),
|
|
111
115
|
});
|
|
@@ -131,10 +135,10 @@ export function usePauseAgent() {
|
|
|
131
135
|
mutationFn: async (params) => {
|
|
132
136
|
const { iamStore, coreStore } = await import('@datalayer/core/lib/state');
|
|
133
137
|
const token = iamStore.getState().token || '';
|
|
134
|
-
const
|
|
135
|
-
const { pauseRuntime } = await import('
|
|
138
|
+
const runtimesUrl = coreStore.getState().configuration?.runtimesUrl || '';
|
|
139
|
+
const { pauseRuntime } = await import('../api/runtimes/runtimes');
|
|
136
140
|
const mode = params.mode || 'light';
|
|
137
|
-
const resp = await pauseRuntime(token, params.podName,
|
|
141
|
+
const resp = await pauseRuntime(token, params.podName, runtimesUrl, {
|
|
138
142
|
agent_spec_id: params.agentSpecId,
|
|
139
143
|
checkpoint_mode: mode,
|
|
140
144
|
...(params.messages && mode === 'light'
|
|
@@ -143,15 +147,18 @@ export function usePauseAgent() {
|
|
|
143
147
|
...(params.agentSpec ? { agentspec: params.agentSpec } : {}),
|
|
144
148
|
});
|
|
145
149
|
if (resp.checkpoint_id) {
|
|
146
|
-
const { waitForCheckpointStatus } = await import('
|
|
147
|
-
const ckpt = await waitForCheckpointStatus(token, params.podName, resp.checkpoint_id, ['paused', 'failed'],
|
|
150
|
+
const { waitForCheckpointStatus } = await import('../api/runtimes/checkpoints');
|
|
151
|
+
const ckpt = await waitForCheckpointStatus(token, params.podName, resp.checkpoint_id, ['paused', 'failed'], runtimesUrl);
|
|
148
152
|
if (ckpt.status === 'failed') {
|
|
149
153
|
throw new Error(`Checkpoint ${resp.checkpoint_id} failed during ${mode.toUpperCase()} pause`);
|
|
150
154
|
}
|
|
151
155
|
}
|
|
152
156
|
return resp;
|
|
153
157
|
},
|
|
154
|
-
onSuccess: () => {
|
|
158
|
+
onSuccess: (_data, params) => {
|
|
159
|
+
// Pausing tears the pod down: dispose every ServiceManager any surface
|
|
160
|
+
// opened against the sandbox so their pollers stop immediately.
|
|
161
|
+
disposeSandboxServiceManagers(params.podName);
|
|
155
162
|
queryClient.invalidateQueries({
|
|
156
163
|
queryKey: agentQueryKeys.agentRuntimes.all(),
|
|
157
164
|
});
|
|
@@ -173,15 +180,18 @@ export function useResumeAgent() {
|
|
|
173
180
|
mutationFn: async (params) => {
|
|
174
181
|
const { iamStore, coreStore } = await import('@datalayer/core/lib/state');
|
|
175
182
|
const token = iamStore.getState().token || '';
|
|
176
|
-
const
|
|
177
|
-
const { resumeRuntime } = await import('
|
|
178
|
-
return resumeRuntime(token, params.podName,
|
|
183
|
+
const runtimesUrl = coreStore.getState().configuration?.runtimesUrl || '';
|
|
184
|
+
const { resumeRuntime } = await import('../api/runtimes/runtimes');
|
|
185
|
+
return resumeRuntime(token, params.podName, runtimesUrl, {
|
|
179
186
|
agent_spec_id: params.agentSpecId,
|
|
180
187
|
...(params.mode ? { checkpoint_mode: params.mode } : {}),
|
|
181
188
|
...(params.checkpointId ? { checkpoint_id: params.checkpointId } : {}),
|
|
182
189
|
});
|
|
183
190
|
},
|
|
184
|
-
onSuccess: () => {
|
|
191
|
+
onSuccess: (_data, params) => {
|
|
192
|
+
// The pod can come back under the same name — drop any delete tombstone
|
|
193
|
+
// so the runtimes queries do not filter the resumed runtime out.
|
|
194
|
+
clearRuntimePodDeleted(params.podName);
|
|
185
195
|
queryClient.invalidateQueries({
|
|
186
196
|
queryKey: agentQueryKeys.agentRuntimes.all(),
|
|
187
197
|
});
|
|
@@ -203,11 +213,11 @@ export function useCheckpointAgent() {
|
|
|
203
213
|
mutationFn: async (params) => {
|
|
204
214
|
const { iamStore, coreStore } = await import('@datalayer/core/lib/state');
|
|
205
215
|
const token = iamStore.getState().token || '';
|
|
206
|
-
const
|
|
207
|
-
const { pauseRuntime } = await import('
|
|
208
|
-
const { waitForCheckpointStatus } = await import('
|
|
216
|
+
const runtimesUrl = coreStore.getState().configuration?.runtimesUrl || '';
|
|
217
|
+
const { pauseRuntime } = await import('../api/runtimes/runtimes');
|
|
218
|
+
const { waitForCheckpointStatus } = await import('../api/runtimes/checkpoints');
|
|
209
219
|
const mode = params.mode || 'criu';
|
|
210
|
-
const pauseResp = await pauseRuntime(token, params.podName,
|
|
220
|
+
const pauseResp = await pauseRuntime(token, params.podName, runtimesUrl, {
|
|
211
221
|
name: params.name || `checkpoint-${Date.now()}`,
|
|
212
222
|
description: `${mode.toUpperCase()} checkpoint for ${params.agentSpecId}`,
|
|
213
223
|
checkpoint_mode: mode,
|
|
@@ -221,7 +231,7 @@ export function useCheckpointAgent() {
|
|
|
221
231
|
if (!checkpointId) {
|
|
222
232
|
throw new Error('Pause did not return a checkpoint_id');
|
|
223
233
|
}
|
|
224
|
-
const ckpt = await waitForCheckpointStatus(token, params.podName, checkpointId, ['paused', 'failed'],
|
|
234
|
+
const ckpt = await waitForCheckpointStatus(token, params.podName, checkpointId, ['paused', 'failed'], runtimesUrl);
|
|
225
235
|
if (ckpt.status === 'failed') {
|
|
226
236
|
throw new Error(`Checkpoint ${checkpointId} failed during ${mode.toUpperCase()} pause`);
|
|
227
237
|
}
|
|
@@ -249,9 +259,9 @@ export function useTerminateAgent() {
|
|
|
249
259
|
mutationFn: async (params) => {
|
|
250
260
|
const { iamStore, coreStore } = await import('@datalayer/core/lib/state');
|
|
251
261
|
const token = iamStore.getState().token || '';
|
|
252
|
-
const
|
|
253
|
-
const { deleteRuntime } = await import('
|
|
254
|
-
return deleteRuntime(token, params.podName,
|
|
262
|
+
const runtimesUrl = coreStore.getState().configuration?.runtimesUrl || '';
|
|
263
|
+
const { deleteRuntime } = await import('../api/runtimes/runtimes');
|
|
264
|
+
return deleteRuntime(token, params.podName, runtimesUrl);
|
|
255
265
|
},
|
|
256
266
|
onSuccess: () => {
|
|
257
267
|
queryClient.invalidateQueries({
|
|
@@ -330,9 +340,9 @@ export function useAgentLifecycle(options) {
|
|
|
330
340
|
try {
|
|
331
341
|
const { iamStore, coreStore } = await import('@datalayer/core/lib/state');
|
|
332
342
|
const token = iamStore.getState().token || '';
|
|
333
|
-
const
|
|
334
|
-
const { listRuntimes } = await import('
|
|
335
|
-
const runtimesResponse = await listRuntimes(token,
|
|
343
|
+
const runtimesUrl = coreStore.getState().configuration?.runtimesUrl || '';
|
|
344
|
+
const { listRuntimes } = await import('../api/runtimes/runtimes');
|
|
345
|
+
const runtimesResponse = await listRuntimes(token, runtimesUrl);
|
|
336
346
|
const runtimes = runtimesResponse.runtimes || [];
|
|
337
347
|
const aiAgentRuntimes = runtimes.filter(rt => {
|
|
338
348
|
if (rt.environment_name !== 'ai-agents-env') {
|