@datalayer/agent-runtimes 1.0.10 → 1.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +82 -1
- package/lib/{AgentLexical.d.ts → AgentDocument.d.ts} +5 -5
- package/lib/{AgentLexical.js → AgentDocument.js} +156 -26
- package/lib/AgentNode.js +32 -31
- package/lib/AgentNotebook.js +172 -17
- package/lib/AppExamples2.css +47 -0
- package/lib/AppExamples2.d.ts +3 -0
- package/lib/AppExamples2.js +21 -0
- package/lib/{agent-lexical-main.js → agent-document-main.js} +2 -2
- package/lib/agents/AgentRuntimeChat.d.ts +73 -0
- package/lib/agents/AgentRuntimeChat.js +198 -0
- package/lib/api/index.d.ts +12 -0
- package/lib/api/index.js +46 -0
- package/lib/api/runtimes/checkpoints.d.ts +122 -0
- package/lib/api/runtimes/checkpoints.js +118 -0
- package/lib/api/runtimes/environments.d.ts +9 -0
- package/lib/api/runtimes/environments.js +29 -0
- package/lib/api/runtimes/healthz.d.ts +15 -0
- package/lib/api/runtimes/healthz.js +44 -0
- package/lib/api/runtimes/index.d.ts +12 -0
- package/lib/api/runtimes/index.js +16 -0
- package/lib/api/runtimes/runtimes.d.ts +138 -0
- package/lib/api/runtimes/runtimes.js +230 -0
- package/lib/api/runtimes/snapshots.d.ts +38 -0
- package/lib/api/runtimes/snapshots.js +82 -0
- package/lib/api/scheduler/index.d.ts +6 -0
- package/lib/api/scheduler/index.js +10 -0
- package/lib/api/scheduler/schedules.d.ts +85 -0
- package/lib/api/scheduler/schedules.js +78 -0
- package/lib/api/spacer/documents.d.ts +12 -0
- package/lib/api/spacer/documents.js +43 -0
- package/lib/api/spacer/healthz.d.ts +15 -0
- package/lib/api/spacer/healthz.js +44 -0
- package/lib/api/spacer/index.d.ts +15 -0
- package/lib/api/spacer/index.js +19 -0
- package/lib/api/spacer/items.d.ts +25 -0
- package/lib/api/spacer/items.js +55 -0
- package/lib/api/spacer/lexicals.d.ts +34 -0
- package/lib/api/spacer/lexicals.js +89 -0
- package/lib/api/spacer/notebooks.d.ts +34 -0
- package/lib/api/spacer/notebooks.js +89 -0
- package/lib/api/spacer/spaces.d.ts +84 -0
- package/lib/api/spacer/spaces.js +170 -0
- package/lib/api/spacer/users.d.ts +9 -0
- package/lib/api/spacer/users.js +29 -0
- package/lib/chat/Chat.d.ts +1 -1
- package/lib/chat/Chat.js +54 -54
- package/lib/chat/ChatFloating.d.ts +2 -2
- package/lib/chat/ChatFloating.js +136 -25
- package/lib/chat/ChatSidebar.js +20 -22
- package/lib/chat/base/ChatBase.js +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/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 +3 -1
- package/lib/examples/hooks/useExampleAgentRuntime.d.ts +35 -0
- package/lib/examples/hooks/useExampleAgentRuntime.js +82 -0
- package/lib/examples/hooks/useSpecRenderToolResult.d.ts +30 -0
- package/lib/examples/hooks/useSpecRenderToolResult.js +61 -0
- package/lib/examples/index.d.ts +3 -1
- package/lib/examples/index.js +3 -1
- package/lib/examples/main.js +340 -93
- package/lib/examples/utils/a2ui.d.ts +2 -0
- package/lib/examples/utils/a2ui.js +97 -2
- package/lib/examples/utils/agentSummaryStore.d.ts +21 -0
- package/lib/examples/utils/agentSummaryStore.js +23 -0
- package/lib/examples/utils/notebooks/Empty.ipynb.json +30 -30
- package/lib/examples/utils/runtimeTargetStore.d.ts +9 -0
- package/lib/examples/utils/runtimeTargetStore.js +27 -0
- package/lib/examples/utils/teardownAgents.d.ts +13 -0
- package/lib/examples/utils/teardownAgents.js +78 -0
- package/lib/examples/utils/useExampleAgentRuntimesUrl.d.ts +2 -0
- package/lib/examples/utils/useExampleAgentRuntimesUrl.js +26 -7
- package/lib/examples2/CellExample.d.ts +6 -0
- package/lib/examples2/CellExample.js +20 -0
- package/lib/examples2/DatalayerNotebookExample.d.ts +16 -0
- package/lib/examples2/DatalayerNotebookExample.js +109 -0
- package/lib/examples2/NativeNavigationExample.d.ts +8 -0
- package/lib/examples2/NativeNavigationExample.js +97 -0
- package/lib/examples2/NotebookExample.d.ts +6 -0
- package/lib/examples2/NotebookExample.js +19 -0
- package/lib/examples2/NotebookMutationsKernel.d.ts +2 -0
- package/lib/examples2/NotebookMutationsKernel.js +105 -0
- package/lib/examples2/NotebookMutationsServiceManager.d.ts +2 -0
- package/lib/examples2/NotebookMutationsServiceManager.js +109 -0
- package/lib/examples2/ReactRouterExample.d.ts +6 -0
- package/lib/examples2/ReactRouterExample.js +175 -0
- package/lib/examples2/example-selector.d.ts +22 -0
- package/lib/examples2/example-selector.js +45 -0
- package/lib/examples2/index.d.ts +2 -0
- package/lib/examples2/index.js +6 -0
- package/lib/examples2/lexical-theme.css +436 -0
- package/lib/examples2/main.d.ts +2 -0
- package/lib/examples2/main.js +330 -0
- package/lib/examples2/notebooks/IPyWidgetsExample.ipynb.json +101 -0
- package/lib/examples2/notebooks/IPyWidgetsExampleWithState.ipynb.json +112 -0
- package/lib/examples2/notebooks/Lite.ipynb.json +128 -0
- package/lib/examples2/notebooks/Matplotlib.ipynb.json +137 -0
- package/lib/examples2/notebooks/NotebookExample1.ipynb.json +126 -0
- package/lib/examples2/notebooks/NotebookExample2.ipynb.json +48 -0
- package/lib/examples2/notebooks/NotebookOutputs.ipynb.json +49 -0
- package/lib/examples2/notebooks/NotebookToCExample.ipynb.json +102 -0
- package/lib/examples2/notebooks/OutputIPyWidgetsExample.d.ts +145 -0
- package/lib/examples2/notebooks/OutputIPyWidgetsExample.js +153 -0
- package/lib/examples2/notebooks/PyGWalker.ipynb.json +55 -0
- package/lib/hooks/index.d.ts +9 -1
- package/lib/hooks/index.js +13 -1
- package/lib/hooks/useAIAgentsWebSocket.d.ts +1 -1
- package/lib/hooks/useAIAgentsWebSocket.js +39 -3
- package/lib/hooks/useAgentRuntimes.d.ts +15 -3
- package/lib/hooks/useAgentRuntimes.js +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 +70 -26
- package/lib/specs/agents/agents.js +3994 -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 +3 -1
- 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__/versioning.cpython-313.pyc +0 -0
- package/scripts/codegen/generate_agents.py +21 -4
- package/scripts/codegen/generate_loops.py +443 -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
|
@@ -0,0 +1,615 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2025-2026 Datalayer, Inc.
|
|
3
|
+
* Distributed under the terms of the Modified BSD License.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Spacer mixin for managing workspaces, notebooks, and content.
|
|
7
|
+
* @module client/mixins/SpacerMixin
|
|
8
|
+
*/
|
|
9
|
+
import * as spaces from '../../api/spacer/spaces';
|
|
10
|
+
import * as notebooks from '../../api/spacer/notebooks';
|
|
11
|
+
import * as users from '../../api/spacer/users';
|
|
12
|
+
import * as lexicals from '../../api/spacer/lexicals';
|
|
13
|
+
import * as documents from '../../api/spacer/documents';
|
|
14
|
+
import * as items from '../../api/spacer/items';
|
|
15
|
+
import { NotebookDTO } from '../../models/NotebookDTO';
|
|
16
|
+
import { LexicalDTO } from '../../models/LexicalDTO';
|
|
17
|
+
import { SpaceDTO } from '../../models/SpaceDTO';
|
|
18
|
+
import { ProjectDTO } from '../../models/ProjectDTO';
|
|
19
|
+
import { HealthCheck } from '@datalayer/core/lib/models/HealthCheck';
|
|
20
|
+
import { convertSpaceItemsToModels } from '../utils/spacerUtils';
|
|
21
|
+
import { generateHandle } from '@datalayer/core/lib/client/utils/slugify';
|
|
22
|
+
/** Spacer mixin providing workspace and content management. */
|
|
23
|
+
export function SpacerMixin(Base) {
|
|
24
|
+
return class extends Base {
|
|
25
|
+
// ========================================================================
|
|
26
|
+
// User
|
|
27
|
+
// ========================================================================
|
|
28
|
+
/**
|
|
29
|
+
* Get all workspaces for the authenticated user.
|
|
30
|
+
* @returns Array of Space instances
|
|
31
|
+
*/
|
|
32
|
+
async getMySpaces() {
|
|
33
|
+
const token = this.getToken();
|
|
34
|
+
const spacerUrl = this.getSpacerUrl();
|
|
35
|
+
const response = await users.getMySpaces(token, spacerUrl);
|
|
36
|
+
return response.spaces.map(s => new SpaceDTO(s, this));
|
|
37
|
+
}
|
|
38
|
+
// ========================================================================
|
|
39
|
+
// Spaces
|
|
40
|
+
// ========================================================================
|
|
41
|
+
/**
|
|
42
|
+
* Create a new workspace.
|
|
43
|
+
* @param name - Space name
|
|
44
|
+
* @param description - Space description
|
|
45
|
+
* @param variant - Space variant type
|
|
46
|
+
* @param spaceHandle - Unique handle for the space
|
|
47
|
+
* @param organizationId - Organization ID
|
|
48
|
+
* @param seedSpaceId - Seed space ID for initialization
|
|
49
|
+
* @param isPublic - Whether the space is public
|
|
50
|
+
* @returns Created Space instance
|
|
51
|
+
*/
|
|
52
|
+
async createSpace(name, description, variant, spaceHandle, organizationId, seedSpaceId, isPublic) {
|
|
53
|
+
const token = this.getToken();
|
|
54
|
+
const spacerUrl = this.getSpacerUrl();
|
|
55
|
+
const data = {
|
|
56
|
+
name,
|
|
57
|
+
description,
|
|
58
|
+
variant,
|
|
59
|
+
spaceHandle,
|
|
60
|
+
organizationId,
|
|
61
|
+
seedSpaceId,
|
|
62
|
+
public: isPublic,
|
|
63
|
+
};
|
|
64
|
+
const response = await spaces.createSpace(token, data, spacerUrl);
|
|
65
|
+
if (!response.space) {
|
|
66
|
+
throw new Error('Failed to create space: no space returned');
|
|
67
|
+
}
|
|
68
|
+
return new SpaceDTO(response.space, this);
|
|
69
|
+
}
|
|
70
|
+
// ========================================================================
|
|
71
|
+
// Notebooks
|
|
72
|
+
// ========================================================================
|
|
73
|
+
/**
|
|
74
|
+
* Create a new notebook.
|
|
75
|
+
* @param spaceId - ID of the space to create the notebook in
|
|
76
|
+
* @param name - Name of the notebook
|
|
77
|
+
* @param description - Description of the notebook
|
|
78
|
+
* @param file - Optional file for notebook content
|
|
79
|
+
* @returns Created Notebook instance
|
|
80
|
+
*/
|
|
81
|
+
async createNotebook(spaceId, name, description, file) {
|
|
82
|
+
// Get the Space model instance
|
|
83
|
+
const spaces = await this.getMySpaces();
|
|
84
|
+
const spaceModel = spaces.find((s) => s.uid === spaceId);
|
|
85
|
+
if (!spaceModel) {
|
|
86
|
+
throw new Error(`Space with ID '${spaceId}' not found`);
|
|
87
|
+
}
|
|
88
|
+
// Use the Space model's createNotebook method
|
|
89
|
+
return await spaceModel.createNotebook({
|
|
90
|
+
name,
|
|
91
|
+
description,
|
|
92
|
+
file,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get a notebook by ID.
|
|
97
|
+
* @param id - Notebook ID
|
|
98
|
+
* @returns Notebook instance
|
|
99
|
+
*/
|
|
100
|
+
async getNotebook(id) {
|
|
101
|
+
const spacerUrl = this.getSpacerUrl();
|
|
102
|
+
const token = this.getToken();
|
|
103
|
+
const response = await notebooks.getNotebook(token, id, spacerUrl);
|
|
104
|
+
if (!response.notebook) {
|
|
105
|
+
throw new Error(`Notebook with ID '${id}' not found`);
|
|
106
|
+
}
|
|
107
|
+
return new NotebookDTO(response.notebook, this);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Update a notebook.
|
|
111
|
+
* @param id - Notebook ID
|
|
112
|
+
* @param name - Optional new name for the notebook
|
|
113
|
+
* @param description - Optional new description for the notebook
|
|
114
|
+
* @returns Updated Notebook instance
|
|
115
|
+
*/
|
|
116
|
+
async updateNotebook(id, name, description) {
|
|
117
|
+
const spacerUrl = this.getSpacerUrl();
|
|
118
|
+
const token = this.getToken();
|
|
119
|
+
const data = {};
|
|
120
|
+
if (name !== undefined)
|
|
121
|
+
data.name = name;
|
|
122
|
+
if (description !== undefined)
|
|
123
|
+
data.description = description;
|
|
124
|
+
const response = await notebooks.updateNotebook(token, id, data, spacerUrl);
|
|
125
|
+
if (!response.notebook) {
|
|
126
|
+
throw new Error('Failed to update notebook: no notebook returned');
|
|
127
|
+
}
|
|
128
|
+
return new NotebookDTO(response.notebook, this);
|
|
129
|
+
}
|
|
130
|
+
// ========================================================================
|
|
131
|
+
// Lexicals
|
|
132
|
+
// ========================================================================
|
|
133
|
+
/**
|
|
134
|
+
* Create a new lexical document.
|
|
135
|
+
* @param spaceId - ID of the space to create the lexical document in
|
|
136
|
+
* @param name - Name of the lexical document
|
|
137
|
+
* @param description - Description of the lexical document
|
|
138
|
+
* @param file - Optional file for document content
|
|
139
|
+
* @returns Created Lexical instance
|
|
140
|
+
*/
|
|
141
|
+
async createLexical(spaceId, name, description, file) {
|
|
142
|
+
// Get the Space model instance
|
|
143
|
+
const spaces = await this.getMySpaces();
|
|
144
|
+
const spaceModel = spaces.find((s) => s.uid === spaceId);
|
|
145
|
+
if (!spaceModel) {
|
|
146
|
+
throw new Error(`Space with ID '${spaceId}' not found`);
|
|
147
|
+
}
|
|
148
|
+
// Use the Space model's createLexical method
|
|
149
|
+
return await spaceModel.createLexical({
|
|
150
|
+
name,
|
|
151
|
+
description,
|
|
152
|
+
file,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get a lexical document by ID.
|
|
157
|
+
* @param id - Document ID
|
|
158
|
+
* @returns Lexical instance
|
|
159
|
+
*/
|
|
160
|
+
async getLexical(id) {
|
|
161
|
+
const spacerUrl = this.getSpacerUrl();
|
|
162
|
+
const token = this.getToken();
|
|
163
|
+
const response = await lexicals.getLexical(token, id, spacerUrl);
|
|
164
|
+
if (!response.document) {
|
|
165
|
+
throw new Error(`Lexical document with ID '${id}' not found`);
|
|
166
|
+
}
|
|
167
|
+
return new LexicalDTO(response.document, this);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Update a lexical document.
|
|
171
|
+
* @param id - Document ID
|
|
172
|
+
* @param name - Optional new name for the lexical document
|
|
173
|
+
* @param description - Optional new description for the lexical document
|
|
174
|
+
* @returns Updated Lexical instance
|
|
175
|
+
*/
|
|
176
|
+
async updateLexical(id, name, description) {
|
|
177
|
+
const spacerUrl = this.getSpacerUrl();
|
|
178
|
+
const token = this.getToken();
|
|
179
|
+
const data = {};
|
|
180
|
+
if (name !== undefined)
|
|
181
|
+
data.name = name;
|
|
182
|
+
if (description !== undefined)
|
|
183
|
+
data.description = description;
|
|
184
|
+
const response = await lexicals.updateLexical(token, id, data, spacerUrl);
|
|
185
|
+
return new LexicalDTO(response.document, this);
|
|
186
|
+
}
|
|
187
|
+
// ========================================================================
|
|
188
|
+
// Items
|
|
189
|
+
// ========================================================================
|
|
190
|
+
/**
|
|
191
|
+
* Get the items of a space as model instances.
|
|
192
|
+
* @param spaceId - Space ID
|
|
193
|
+
* @returns Array of Notebook and Lexical model instances
|
|
194
|
+
*/
|
|
195
|
+
async getSpaceItems(spaceId) {
|
|
196
|
+
const spacerUrl = this.getSpacerUrl();
|
|
197
|
+
const token = this.getToken();
|
|
198
|
+
const response = await items.getSpaceItems(token, spaceId, spacerUrl);
|
|
199
|
+
// Use shared utility function to convert items to model instances
|
|
200
|
+
return convertSpaceItemsToModels(response.items, this);
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Get a single item from a space.
|
|
204
|
+
* @param itemId - Item ID to retrieve
|
|
205
|
+
* @returns Notebook or Lexical model instance
|
|
206
|
+
* @throws Error if item not found
|
|
207
|
+
*/
|
|
208
|
+
async getSpaceItem(itemId) {
|
|
209
|
+
const spacerUrl = this.getSpacerUrl();
|
|
210
|
+
const token = this.getToken();
|
|
211
|
+
const response = await items.getItem(token, itemId, spacerUrl);
|
|
212
|
+
if (!response.success || !response.item) {
|
|
213
|
+
throw new Error(`Space item '${itemId}' not found`);
|
|
214
|
+
}
|
|
215
|
+
// Determine item type and create appropriate model
|
|
216
|
+
const item = response.item;
|
|
217
|
+
if (item.type_s === 'notebook' || item.notebook_name_s !== undefined) {
|
|
218
|
+
return new NotebookDTO(item, this);
|
|
219
|
+
}
|
|
220
|
+
else if (item.type_s === 'lexical' ||
|
|
221
|
+
item.document_name_s !== undefined) {
|
|
222
|
+
return new LexicalDTO(item, this);
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
throw new Error(`Unknown item type for item '${itemId}'`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Delete an item from a space.
|
|
230
|
+
* @param itemId - Item ID to delete
|
|
231
|
+
* @throws Error if deletion fails
|
|
232
|
+
*/
|
|
233
|
+
async deleteSpaceItem(itemId) {
|
|
234
|
+
const spacerUrl = this.getSpacerUrl();
|
|
235
|
+
const token = this.getToken();
|
|
236
|
+
// First, check if the item exists
|
|
237
|
+
try {
|
|
238
|
+
const getResponse = await items.getItem(token, itemId, spacerUrl);
|
|
239
|
+
if (!getResponse.success || !getResponse.item) {
|
|
240
|
+
throw new Error(`Space item '${itemId}' not found`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
// If getItem throws (e.g., 404), wrap in descriptive error
|
|
245
|
+
if (error.message?.includes('404') ||
|
|
246
|
+
error.message?.includes('not found')) {
|
|
247
|
+
throw new Error(`Failed to delete space item '${itemId}': Item not found`);
|
|
248
|
+
}
|
|
249
|
+
throw new Error(`Failed to delete space item '${itemId}': ${error.message}`);
|
|
250
|
+
}
|
|
251
|
+
// Item exists, proceed with deletion
|
|
252
|
+
const response = await items.deleteItem(token, itemId, spacerUrl);
|
|
253
|
+
if (!response.success) {
|
|
254
|
+
throw new Error(`Failed to delete space item '${itemId}': ${response.message}`);
|
|
255
|
+
}
|
|
256
|
+
// Success - return void
|
|
257
|
+
}
|
|
258
|
+
// ========================================================================
|
|
259
|
+
// Content Loading with CDN Support
|
|
260
|
+
// ========================================================================
|
|
261
|
+
async getContent(itemId) {
|
|
262
|
+
const spacerUrl = this.getSpacerUrl();
|
|
263
|
+
const token = this.getToken();
|
|
264
|
+
// First, get the item to check for CDN URL
|
|
265
|
+
const response = await items.getItem(token, itemId, spacerUrl);
|
|
266
|
+
if (!response.success || !response.item) {
|
|
267
|
+
throw new Error(`Space item '${itemId}' not found`);
|
|
268
|
+
}
|
|
269
|
+
const item = response.item;
|
|
270
|
+
const cdnUrl = item.cdn_url_s;
|
|
271
|
+
if (cdnUrl) {
|
|
272
|
+
// Load content from CDN
|
|
273
|
+
const cdnResponse = await fetch(cdnUrl);
|
|
274
|
+
if (!cdnResponse.ok) {
|
|
275
|
+
throw new Error(`Failed to load content from CDN: ${cdnResponse.statusText}`);
|
|
276
|
+
}
|
|
277
|
+
return await cdnResponse.json();
|
|
278
|
+
}
|
|
279
|
+
// No CDN URL, return content from item
|
|
280
|
+
return item.content;
|
|
281
|
+
}
|
|
282
|
+
// ========================================================================
|
|
283
|
+
// Service Health Checks
|
|
284
|
+
// ========================================================================
|
|
285
|
+
/**
|
|
286
|
+
* Check the health status of the Spacer service.
|
|
287
|
+
* Performs a lightweight check to verify service accessibility.
|
|
288
|
+
*
|
|
289
|
+
* @returns Health check result with status and response time
|
|
290
|
+
*/
|
|
291
|
+
async checkSpacerHealth() {
|
|
292
|
+
const startTime = Date.now();
|
|
293
|
+
const errors = [];
|
|
294
|
+
let status = 'unknown';
|
|
295
|
+
let healthy = false;
|
|
296
|
+
try {
|
|
297
|
+
// Test basic connectivity by getting user spaces (lightweight operation)
|
|
298
|
+
const spaces = await this.getMySpaces();
|
|
299
|
+
const responseTime = Date.now() - startTime;
|
|
300
|
+
if (Array.isArray(spaces)) {
|
|
301
|
+
healthy = true;
|
|
302
|
+
status = 'operational';
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
status = 'degraded';
|
|
306
|
+
errors.push('Unexpected response format from spaces endpoint');
|
|
307
|
+
}
|
|
308
|
+
return new HealthCheck({
|
|
309
|
+
healthy,
|
|
310
|
+
status,
|
|
311
|
+
responseTime,
|
|
312
|
+
errors,
|
|
313
|
+
timestamp: new Date(),
|
|
314
|
+
}, this);
|
|
315
|
+
}
|
|
316
|
+
catch (error) {
|
|
317
|
+
const responseTime = Date.now() - startTime;
|
|
318
|
+
status = 'down';
|
|
319
|
+
errors.push(`Service unreachable: ${error}`);
|
|
320
|
+
return new HealthCheck({
|
|
321
|
+
healthy: false,
|
|
322
|
+
status,
|
|
323
|
+
responseTime,
|
|
324
|
+
errors,
|
|
325
|
+
timestamp: new Date(),
|
|
326
|
+
}, this);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Get collaboration session ID for a document
|
|
331
|
+
*/
|
|
332
|
+
async getCollaborationSessionId(documentId) {
|
|
333
|
+
const token = this.getToken();
|
|
334
|
+
const spacerUrl = this.getSpacerUrl();
|
|
335
|
+
const response = await documents.getCollaborationSessionId(token, documentId, spacerUrl);
|
|
336
|
+
if (!response.success || !response.sessionId) {
|
|
337
|
+
throw new Error(`Failed to get collaboration session ID for document '${documentId}': ${response.error || 'Unknown error'}`);
|
|
338
|
+
}
|
|
339
|
+
return response.sessionId;
|
|
340
|
+
}
|
|
341
|
+
// ========================================================================
|
|
342
|
+
// Additional Space Operations
|
|
343
|
+
// ========================================================================
|
|
344
|
+
/**
|
|
345
|
+
* Get a space by UID.
|
|
346
|
+
* @param uid - Space UID
|
|
347
|
+
* @returns Space instance
|
|
348
|
+
*/
|
|
349
|
+
async getSpace(uid) {
|
|
350
|
+
const token = this.getToken();
|
|
351
|
+
const spacerUrl = this.getSpacerUrl();
|
|
352
|
+
const response = await spaces.getSpace(token, uid, spacerUrl);
|
|
353
|
+
if (!response.space) {
|
|
354
|
+
throw new Error(`Space with UID '${uid}' not found`);
|
|
355
|
+
}
|
|
356
|
+
return new SpaceDTO(response.space, this);
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Update a space (owner updating their own space).
|
|
360
|
+
* @param uid - Space UID
|
|
361
|
+
* @param data - Update data (supports arbitrary Solr fields)
|
|
362
|
+
* @returns Updated Space instance
|
|
363
|
+
*/
|
|
364
|
+
async updateSpace(uid, data) {
|
|
365
|
+
const token = this.getToken();
|
|
366
|
+
const spacerUrl = this.getSpacerUrl();
|
|
367
|
+
const response = await spaces.updateSpace(token, uid, data, spacerUrl);
|
|
368
|
+
if (!response.space) {
|
|
369
|
+
throw new Error(`Failed to update space '${uid}'`);
|
|
370
|
+
}
|
|
371
|
+
return new SpaceDTO(response.space, this);
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Update a user-specific space (e.g., org admin context).
|
|
375
|
+
* @param uid - Space UID
|
|
376
|
+
* @param userId - User ID
|
|
377
|
+
* @param data - Update data (supports arbitrary Solr fields)
|
|
378
|
+
* @returns Updated Space instance
|
|
379
|
+
*/
|
|
380
|
+
async updateUserSpace(uid, userId, data) {
|
|
381
|
+
const token = this.getToken();
|
|
382
|
+
const spacerUrl = this.getSpacerUrl();
|
|
383
|
+
const response = await spaces.updateUserSpace(token, uid, userId, data, spacerUrl);
|
|
384
|
+
if (!response.space) {
|
|
385
|
+
throw new Error(`Failed to update space '${uid}' for user '${userId}'`);
|
|
386
|
+
}
|
|
387
|
+
return new SpaceDTO(response.space, this);
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Delete a space and all its contents.
|
|
391
|
+
* @param uid - Space UID
|
|
392
|
+
*/
|
|
393
|
+
async deleteSpace(uid) {
|
|
394
|
+
const token = this.getToken();
|
|
395
|
+
const spacerUrl = this.getSpacerUrl();
|
|
396
|
+
await spaces.deleteSpace(token, uid, spacerUrl);
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Make a space public.
|
|
400
|
+
* @param uid - Space UID
|
|
401
|
+
* @returns Updated Space instance
|
|
402
|
+
*/
|
|
403
|
+
async makeSpacePublic(uid) {
|
|
404
|
+
const token = this.getToken();
|
|
405
|
+
const spacerUrl = this.getSpacerUrl();
|
|
406
|
+
const response = await spaces.makeSpacePublic(token, uid, spacerUrl);
|
|
407
|
+
if (!response.space) {
|
|
408
|
+
throw new Error(`Failed to make space '${uid}' public`);
|
|
409
|
+
}
|
|
410
|
+
return new SpaceDTO(response.space, this);
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Make a space private.
|
|
414
|
+
* @param uid - Space UID
|
|
415
|
+
* @returns Updated Space instance
|
|
416
|
+
*/
|
|
417
|
+
async makeSpacePrivate(uid) {
|
|
418
|
+
const token = this.getToken();
|
|
419
|
+
const spacerUrl = this.getSpacerUrl();
|
|
420
|
+
const response = await spaces.makeSpacePrivate(token, uid, spacerUrl);
|
|
421
|
+
if (!response.space) {
|
|
422
|
+
throw new Error(`Failed to make space '${uid}' private`);
|
|
423
|
+
}
|
|
424
|
+
return new SpaceDTO(response.space, this);
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Export a space and its contents.
|
|
428
|
+
* @param uid - Space UID
|
|
429
|
+
* @returns Export data
|
|
430
|
+
*/
|
|
431
|
+
async exportSpace(uid) {
|
|
432
|
+
const token = this.getToken();
|
|
433
|
+
const spacerUrl = this.getSpacerUrl();
|
|
434
|
+
return spaces.exportSpace(token, uid, spacerUrl);
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Clone a notebook.
|
|
438
|
+
* @param id - Notebook ID to clone
|
|
439
|
+
* @returns Cloned Notebook instance
|
|
440
|
+
*/
|
|
441
|
+
async cloneNotebook(id) {
|
|
442
|
+
const token = this.getToken();
|
|
443
|
+
const spacerUrl = this.getSpacerUrl();
|
|
444
|
+
const response = await notebooks.cloneNotebook(token, id, spacerUrl);
|
|
445
|
+
if (!response.notebook) {
|
|
446
|
+
throw new Error(`Failed to clone notebook '${id}'`);
|
|
447
|
+
}
|
|
448
|
+
return new NotebookDTO(response.notebook, this);
|
|
449
|
+
}
|
|
450
|
+
/**
|
|
451
|
+
* Clone a lexical document.
|
|
452
|
+
* @param id - Document ID to clone
|
|
453
|
+
* @returns Cloned Lexical instance
|
|
454
|
+
*/
|
|
455
|
+
async cloneLexical(id) {
|
|
456
|
+
const token = this.getToken();
|
|
457
|
+
const spacerUrl = this.getSpacerUrl();
|
|
458
|
+
const response = await lexicals.cloneLexical(token, id, spacerUrl);
|
|
459
|
+
if (!response.document) {
|
|
460
|
+
throw new Error(`Failed to clone lexical document '${id}'`);
|
|
461
|
+
}
|
|
462
|
+
return new LexicalDTO(response.document, this);
|
|
463
|
+
}
|
|
464
|
+
// ========================================================================
|
|
465
|
+
// Projects
|
|
466
|
+
// ========================================================================
|
|
467
|
+
/**
|
|
468
|
+
* Get all projects for the authenticated user.
|
|
469
|
+
* Projects are spaces with variant='project'.
|
|
470
|
+
* @returns Array of Project instances
|
|
471
|
+
*/
|
|
472
|
+
async getProjects() {
|
|
473
|
+
// Use getMySpaces and filter by variant, because the
|
|
474
|
+
// /spaces/types/project endpoint returns empty results.
|
|
475
|
+
const allSpaces = await this.getMySpaces();
|
|
476
|
+
const isProjectSpace = (space) => {
|
|
477
|
+
const raw = space.rawData();
|
|
478
|
+
const variant = raw?.variant_s ?? space.variant;
|
|
479
|
+
if (variant !== 'project') {
|
|
480
|
+
return false;
|
|
481
|
+
}
|
|
482
|
+
const items = Array.isArray(raw?.items)
|
|
483
|
+
? raw.items
|
|
484
|
+
: raw?.items && typeof raw.items === 'object'
|
|
485
|
+
? [raw.items]
|
|
486
|
+
: [];
|
|
487
|
+
if (items.length === 0) {
|
|
488
|
+
return true;
|
|
489
|
+
}
|
|
490
|
+
const hasNotebook = items.some((item) => (item?.type_s ?? item?.type) === 'notebook');
|
|
491
|
+
const hasDocument = items.some((item) => {
|
|
492
|
+
const type = item?.type_s ?? item?.type;
|
|
493
|
+
return type === 'document' || type === 'lexical';
|
|
494
|
+
});
|
|
495
|
+
return hasNotebook && hasDocument;
|
|
496
|
+
};
|
|
497
|
+
return allSpaces
|
|
498
|
+
.filter(s => isProjectSpace(s))
|
|
499
|
+
.map(s => new ProjectDTO(s.rawData()));
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Get a project by UID.
|
|
503
|
+
* @param uid - Project UID
|
|
504
|
+
* @returns Project instance
|
|
505
|
+
*/
|
|
506
|
+
async getProject(uid) {
|
|
507
|
+
const token = this.getToken();
|
|
508
|
+
const spacerUrl = this.getSpacerUrl();
|
|
509
|
+
const response = await spaces.getSpace(token, uid, spacerUrl);
|
|
510
|
+
if (!response.space) {
|
|
511
|
+
throw new Error(`Project with UID '${uid}' not found`);
|
|
512
|
+
}
|
|
513
|
+
return new ProjectDTO(response.space);
|
|
514
|
+
}
|
|
515
|
+
/**
|
|
516
|
+
* Create a new project.
|
|
517
|
+
* @param name - Project name
|
|
518
|
+
* @param description - Project description
|
|
519
|
+
* @returns Created Project instance
|
|
520
|
+
*/
|
|
521
|
+
async createProject(name, description) {
|
|
522
|
+
const token = this.getToken();
|
|
523
|
+
const spacerUrl = this.getSpacerUrl();
|
|
524
|
+
const spaceHandle = generateHandle(name);
|
|
525
|
+
const data = {
|
|
526
|
+
name,
|
|
527
|
+
description: description || '',
|
|
528
|
+
variant: 'project',
|
|
529
|
+
spaceHandle,
|
|
530
|
+
organizationId: '',
|
|
531
|
+
seedSpaceId: '',
|
|
532
|
+
public: false,
|
|
533
|
+
};
|
|
534
|
+
const response = await spaces.createSpace(token, data, spacerUrl);
|
|
535
|
+
if (!response.space) {
|
|
536
|
+
throw new Error('Failed to create project: no project returned');
|
|
537
|
+
}
|
|
538
|
+
return new ProjectDTO(response.space);
|
|
539
|
+
}
|
|
540
|
+
/**
|
|
541
|
+
* Update a project.
|
|
542
|
+
* @param uid - Project UID
|
|
543
|
+
* @param data - Update data (supports arbitrary Solr fields)
|
|
544
|
+
* @returns Updated Project instance
|
|
545
|
+
*/
|
|
546
|
+
async updateProject(uid, data) {
|
|
547
|
+
const token = this.getToken();
|
|
548
|
+
const spacerUrl = this.getSpacerUrl();
|
|
549
|
+
// Resolve userId from: IAM mixin cache > AuthenticationManager cache > whoami()
|
|
550
|
+
let resolvedUserId;
|
|
551
|
+
const iamUser = this.currentUserCache;
|
|
552
|
+
if (iamUser) {
|
|
553
|
+
resolvedUserId = iamUser.uid ?? iamUser.id;
|
|
554
|
+
}
|
|
555
|
+
if (!resolvedUserId) {
|
|
556
|
+
const authUser = this.auth?.getCurrentUser?.();
|
|
557
|
+
if (authUser) {
|
|
558
|
+
resolvedUserId = authUser.uid ?? authUser.id;
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
if (!resolvedUserId) {
|
|
562
|
+
try {
|
|
563
|
+
const user = await this.whoami();
|
|
564
|
+
resolvedUserId = user?.uid ?? user?.id;
|
|
565
|
+
}
|
|
566
|
+
catch (_e) {
|
|
567
|
+
// whoami() not available — no user context
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
if (!resolvedUserId) {
|
|
571
|
+
throw new Error('Cannot update project: no authenticated user');
|
|
572
|
+
}
|
|
573
|
+
const response = await spaces.updateUserSpace(token, uid, resolvedUserId, data, spacerUrl);
|
|
574
|
+
if (response.space) {
|
|
575
|
+
return new ProjectDTO(response.space);
|
|
576
|
+
}
|
|
577
|
+
// Backend returns space: null on success for user-scoped updates.
|
|
578
|
+
// Re-fetch the project to return fresh data.
|
|
579
|
+
const freshResponse = await spaces.getSpace(token, uid, spacerUrl);
|
|
580
|
+
if (!freshResponse.space) {
|
|
581
|
+
throw new Error(`Failed to update project '${uid}'`);
|
|
582
|
+
}
|
|
583
|
+
return new ProjectDTO(freshResponse.space);
|
|
584
|
+
}
|
|
585
|
+
/**
|
|
586
|
+
* Rename a project.
|
|
587
|
+
* @param uid - Project UID
|
|
588
|
+
* @param newName - New project name
|
|
589
|
+
* @param description - Project description to preserve.
|
|
590
|
+
* @param userId - Authenticated user ID for user-scoped update.
|
|
591
|
+
* @returns Updated Project instance
|
|
592
|
+
*/
|
|
593
|
+
async renameProject(uid, newName, description) {
|
|
594
|
+
const data = { name: newName };
|
|
595
|
+
if (description !== undefined) {
|
|
596
|
+
data.description = description;
|
|
597
|
+
}
|
|
598
|
+
return this.updateProject(uid, data);
|
|
599
|
+
}
|
|
600
|
+
/**
|
|
601
|
+
* Get default items (notebook UID and document UID) for a project.
|
|
602
|
+
* @param uid - Project UID
|
|
603
|
+
* @returns Default notebook and document UIDs
|
|
604
|
+
*/
|
|
605
|
+
async getProjectDefaultItems(uid) {
|
|
606
|
+
const token = this.getToken();
|
|
607
|
+
const spacerUrl = this.getSpacerUrl();
|
|
608
|
+
const response = await spaces.getSpaceDefaultItems(token, uid, spacerUrl);
|
|
609
|
+
return {
|
|
610
|
+
defaultNotebookUid: response.default_notebook_uid,
|
|
611
|
+
defaultDocumentUid: response.default_document_uid,
|
|
612
|
+
};
|
|
613
|
+
}
|
|
614
|
+
};
|
|
615
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for Spacer-related operations to avoid code duplication.
|
|
3
|
+
* @module client/utils/spacerUtils
|
|
4
|
+
*/
|
|
5
|
+
import type { GetSpaceItemsResponse } from '../../models/SpaceDTO';
|
|
6
|
+
import type { AgentRuntimesClient as DatalayerClient } from '../AgentRuntimesClient';
|
|
7
|
+
import { NotebookDTO } from '../../models/NotebookDTO';
|
|
8
|
+
import { LexicalDTO } from '../../models/LexicalDTO';
|
|
9
|
+
/**
|
|
10
|
+
* Convert raw space items from API response to model instances.
|
|
11
|
+
* This utility function is shared between Space.getItems() and SpacerMixin.getSpaceItems()
|
|
12
|
+
* to avoid code duplication.
|
|
13
|
+
*
|
|
14
|
+
* @param response - Raw API response containing space items
|
|
15
|
+
* @param client - Client instance to pass to model constructors
|
|
16
|
+
* @returns Array of Notebook and Lexical model instances
|
|
17
|
+
*/
|
|
18
|
+
export declare function convertSpaceItemsToModels(items: GetSpaceItemsResponse['items'], client: DatalayerClient): (NotebookDTO | LexicalDTO)[];
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2025-2026 Datalayer, Inc.
|
|
3
|
+
* Distributed under the terms of the Modified BSD License.
|
|
4
|
+
*/
|
|
5
|
+
import { NotebookDTO } from '../../models/NotebookDTO';
|
|
6
|
+
import { LexicalDTO } from '../../models/LexicalDTO';
|
|
7
|
+
import { ItemTypes } from '@datalayer/core/lib/client/constants';
|
|
8
|
+
/**
|
|
9
|
+
* Convert raw space items from API response to model instances.
|
|
10
|
+
* This utility function is shared between Space.getItems() and SpacerMixin.getSpaceItems()
|
|
11
|
+
* to avoid code duplication.
|
|
12
|
+
*
|
|
13
|
+
* @param response - Raw API response containing space items
|
|
14
|
+
* @param client - Client instance to pass to model constructors
|
|
15
|
+
* @returns Array of Notebook and Lexical model instances
|
|
16
|
+
*/
|
|
17
|
+
export function convertSpaceItemsToModels(items, client) {
|
|
18
|
+
const modelItems = [];
|
|
19
|
+
for (const item of items) {
|
|
20
|
+
// Check various possible type fields
|
|
21
|
+
const itemType = item.type_s;
|
|
22
|
+
// Only include notebooks and lexicals
|
|
23
|
+
if (itemType === ItemTypes.NOTEBOOK) {
|
|
24
|
+
modelItems.push(new NotebookDTO(item, client));
|
|
25
|
+
}
|
|
26
|
+
else if (itemType === ItemTypes.LEXICAL) {
|
|
27
|
+
modelItems.push(new LexicalDTO(item, client));
|
|
28
|
+
}
|
|
29
|
+
// Skip everything else (exercises, cells, etc.)
|
|
30
|
+
}
|
|
31
|
+
return modelItems;
|
|
32
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type IFetchSessionId = {
|
|
2
|
+
url: string;
|
|
3
|
+
token?: string;
|
|
4
|
+
/**
|
|
5
|
+
* Custom fetch function to use instead of global fetch.
|
|
6
|
+
* Useful for proxying requests in environments with CORS restrictions (e.g., VS Code webviews).
|
|
7
|
+
*/
|
|
8
|
+
fetchFn?: typeof fetch;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Fetch the session ID of a collaborative document from Datalayer.
|
|
12
|
+
*/
|
|
13
|
+
export declare function requestDatalayerCollaborationSessionId({ url, token, fetchFn, }: IFetchSessionId): Promise<string>;
|