@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
|
@@ -42,16 +42,14 @@ import { ChatInlinePlugin } from '../lexical/ChatInlinePlugin';
|
|
|
42
42
|
import { useChatInlineToolbarItems } from '../lexical/useChatInlineToolbarItems';
|
|
43
43
|
import { useLexicalTools } from '../tools/adapters/agent-runtimes/lexicalHooks';
|
|
44
44
|
import { editorConfig } from './lexical/editorConfig';
|
|
45
|
+
import { useExampleAgentRuntimesUrl } from './utils/useExampleAgentRuntimesUrl';
|
|
46
|
+
import { useExampleAgentRuntime } from './hooks/useExampleAgentRuntime';
|
|
45
47
|
import { DEFAULT_MODEL } from '../specs';
|
|
46
48
|
import '@datalayer/jupyter-lexical/style/index.css';
|
|
47
49
|
import './lexical/lexical-theme.css';
|
|
48
50
|
// Fixed lexical document ID
|
|
49
51
|
const LEXICAL_ID = 'agui-lexical-example';
|
|
50
|
-
// Base URL for agent-runtimes server
|
|
51
|
-
const BASE_URL = 'http://localhost:8765';
|
|
52
52
|
const AGENT_ID = 'lexical-agent-runtime-example';
|
|
53
|
-
// Vercel AI endpoint for lexical operations
|
|
54
|
-
const VERCEL_AI_ENDPOINT = `${BASE_URL}/api/v1/vercel-ai/${AGENT_ID}`;
|
|
55
53
|
function getJupyterSandboxUrl(serviceManager) {
|
|
56
54
|
const envUrl = import.meta.env.VITE_JUPYTER_SANDBOX_URL;
|
|
57
55
|
if (envUrl) {
|
|
@@ -75,87 +73,6 @@ function getJupyterSandboxUrl(serviceManager) {
|
|
|
75
73
|
* Hook to ensure the example-agent exists on the server.
|
|
76
74
|
* Creates it if it doesn't exist.
|
|
77
75
|
*/
|
|
78
|
-
function useEnsureAgent(agentId, baseUrl, jupyterSandboxUrl) {
|
|
79
|
-
const [isReady, setIsReady] = useState(false);
|
|
80
|
-
const [error, setError] = useState(null);
|
|
81
|
-
useEffect(() => {
|
|
82
|
-
let mounted = true;
|
|
83
|
-
async function ensureAgent() {
|
|
84
|
-
try {
|
|
85
|
-
if (!jupyterSandboxUrl) {
|
|
86
|
-
if (mounted) {
|
|
87
|
-
setError('Could not detect Jupyter server URL from Lexical service manager.');
|
|
88
|
-
setIsReady(false);
|
|
89
|
-
}
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
// Try to create the agent (will fail if already exists, which is fine)
|
|
93
|
-
const response = await fetch(`${baseUrl}/api/v1/agents`, {
|
|
94
|
-
method: 'POST',
|
|
95
|
-
headers: {
|
|
96
|
-
'Content-Type': 'application/json',
|
|
97
|
-
},
|
|
98
|
-
body: JSON.stringify({
|
|
99
|
-
name: agentId,
|
|
100
|
-
description: 'Demo agent for lexical example',
|
|
101
|
-
agent_library: 'pydantic-ai',
|
|
102
|
-
transport: 'vercel-ai',
|
|
103
|
-
model: DEFAULT_MODEL,
|
|
104
|
-
system_prompt: 'You are a helpful AI assistant that helps users work with documents. You can help with writing, editing, and formatting content.',
|
|
105
|
-
enable_codemode: false,
|
|
106
|
-
sandbox_variant: 'jupyter',
|
|
107
|
-
jupyter_sandbox: jupyterSandboxUrl,
|
|
108
|
-
}),
|
|
109
|
-
});
|
|
110
|
-
if (mounted) {
|
|
111
|
-
if (response.ok) {
|
|
112
|
-
console.log(`[AgentRuntimeLexicalAgentExample] Created agent: ${agentId}`);
|
|
113
|
-
setError(null);
|
|
114
|
-
setIsReady(true);
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
const rawBody = await response.text().catch(() => '');
|
|
118
|
-
let detail = rawBody;
|
|
119
|
-
try {
|
|
120
|
-
const parsed = rawBody ? JSON.parse(rawBody) : {};
|
|
121
|
-
if (typeof parsed.detail === 'string' &&
|
|
122
|
-
parsed.detail.length > 0) {
|
|
123
|
-
detail = parsed.detail;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
catch {
|
|
127
|
-
// Keep raw body as fallback detail.
|
|
128
|
-
}
|
|
129
|
-
const alreadyExists = response.status === 409 ||
|
|
130
|
-
response.status === 400 ||
|
|
131
|
-
/already exists/i.test(detail || '');
|
|
132
|
-
if (alreadyExists) {
|
|
133
|
-
console.log(`[AgentRuntimeLexicalAgentExample] Reusing existing agent: ${agentId}`);
|
|
134
|
-
setError(null);
|
|
135
|
-
setIsReady(true);
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
setError(detail || `Failed to create agent: ${response.status}`);
|
|
139
|
-
setIsReady(false);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
catch (err) {
|
|
145
|
-
if (mounted) {
|
|
146
|
-
console.error('[AgentRuntimeLexicalAgentExample] Error creating agent:', err);
|
|
147
|
-
setError(err instanceof Error ? err.message : 'Failed to connect to server');
|
|
148
|
-
setIsReady(false);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
ensureAgent();
|
|
153
|
-
return () => {
|
|
154
|
-
mounted = false;
|
|
155
|
-
};
|
|
156
|
-
}, [agentId, baseUrl, jupyterSandboxUrl]);
|
|
157
|
-
return { isReady, error };
|
|
158
|
-
}
|
|
159
76
|
// import contentLexical from './lexicals/vscode.lexical';
|
|
160
77
|
// const INITIAL_CONTENT = JSON.stringify(contentLexical);
|
|
161
78
|
const INITIAL_CONTENT = undefined; // Use default empty document
|
|
@@ -228,7 +145,7 @@ function LexicalToolsPlugin({ onToolsReady, }) {
|
|
|
228
145
|
}, [tools, onToolsReady]);
|
|
229
146
|
return null;
|
|
230
147
|
}
|
|
231
|
-
const LexicalUI = React.memo(function LexicalUI({ content = INITIAL_CONTENT, serviceManager, onToolsReady, }) {
|
|
148
|
+
const LexicalUI = React.memo(function LexicalUI({ content = INITIAL_CONTENT, serviceManager, endpoint, onToolsReady, }) {
|
|
232
149
|
const [floatingAnchorElem, setFloatingAnchorElem] = useState(null);
|
|
233
150
|
const [_isLinkEditMode, setIsLinkEditMode] = useState(false);
|
|
234
151
|
// AI actions registered as toolbar items via the primer-addons toolbar extensibility
|
|
@@ -261,13 +178,48 @@ const LexicalUI = React.memo(function LexicalUI({ content = INITIAL_CONTENT, ser
|
|
|
261
178
|
minHeight: '600px',
|
|
262
179
|
}, children: _jsxs(LexicalConfigProvider, { lexicalId: LEXICAL_ID, serviceManager: serviceManager, children: [_jsx(LexicalToolsPlugin, { onToolsReady: onToolsReady }), _jsx(LexicalComposer, { initialConfig: editorConfig, children: _jsxs("div", { className: "lexical-editor-inner", ref: onRef, children: [_jsx(LexicalStatePlugin, {}), _jsx(RichTextPlugin, { contentEditable: _jsx(ContentEditable, { className: "lexical-editor-content", "aria-label": "Lexical Editor" }), ErrorBoundary: LexicalErrorBoundary }), _jsx(OnChangePlugin, { onChange: handleChange }), _jsx(HistoryPlugin, {}), _jsx(AutoFocusPlugin, {}), _jsx(ListPlugin, {}), _jsx(CheckListPlugin, {}), _jsx(LinkPlugin, {}), _jsx(AutoLinkPlugin, {}), _jsx(ListMaxIndentLevelPlugin, { maxDepth: 7 }), _jsx(MarkdownShortcutPlugin, { transformers: TRANSFORMERS }), _jsx(LoadContentPlugin, { content: content }), _jsx(CodeHighlightPlugin, {}), _jsx(ImagesPlugin, { captionsEnabled: false }), _jsx(HorizontalRulePlugin, {}), _jsx(EquationsPlugin, {}), _jsx(YouTubePlugin, {}), _jsx(ExcalidrawPlugin, {}), _jsx(CollapsiblePlugin, {}), _jsx(AutoEmbedPlugin, {}), _jsx(TablePlugin, {}), _jsx(TableCellResizerPlugin, {}), _jsx(JupyterCellPlugin, {}), _jsx(ThemedJupyterProvider, { children: _jsx(SimpleKernelPluginsInner, { serviceManager: serviceManager }) }), floatingAnchorElem && (_jsxs(_Fragment, { children: [_jsx(DraggableBlockPlugin, { anchorElem: floatingAnchorElem }), _jsx(FloatingTextFormatToolbarPlugin, { anchorElem: floatingAnchorElem, setIsLinkEditMode: setIsLinkEditMode, extraItems: toolbarItems }), _jsx(CodeActionMenuPlugin, { anchorElem: floatingAnchorElem })] })), _jsx(ChatInlinePlugin, { protocol: {
|
|
263
180
|
type: 'vercel-ai',
|
|
264
|
-
endpoint
|
|
181
|
+
endpoint,
|
|
265
182
|
}, isOpen: isAiOpen, onClose: closeAi, pendingPrompt: pendingPrompt, onPendingPromptConsumed: clearPendingPrompt })] }) })] }) })] }));
|
|
266
183
|
});
|
|
267
184
|
function LexicalWithChat({ content, serviceManager, }) {
|
|
185
|
+
const baseUrl = useExampleAgentRuntimesUrl();
|
|
186
|
+
const vercelAiEndpoint = `${baseUrl}/api/v1/vercel-ai/${AGENT_ID}`;
|
|
187
|
+
const [createRequested, setCreateRequested] = useState(false);
|
|
268
188
|
const jupyterSandboxUrl = useMemo(() => getJupyterSandboxUrl(serviceManager), [serviceManager]);
|
|
269
|
-
|
|
270
|
-
|
|
189
|
+
const { agentId, isReady, status, error, createAgent } = useExampleAgentRuntime({
|
|
190
|
+
exampleId: 'LexicalAgentExample',
|
|
191
|
+
agentName: AGENT_ID,
|
|
192
|
+
autoCreateAgent: false,
|
|
193
|
+
agentConfig: {
|
|
194
|
+
name: AGENT_ID,
|
|
195
|
+
description: 'Demo agent for lexical example',
|
|
196
|
+
protocol: 'vercel-ai',
|
|
197
|
+
model: DEFAULT_MODEL,
|
|
198
|
+
systemPrompt: 'You are a helpful AI assistant that helps users work with documents. You can help with writing, editing, and formatting content.',
|
|
199
|
+
enableCodemode: false,
|
|
200
|
+
sandboxVariant: 'jupyter',
|
|
201
|
+
jupyterSandbox: jupyterSandboxUrl,
|
|
202
|
+
},
|
|
203
|
+
});
|
|
204
|
+
useEffect(() => {
|
|
205
|
+
if (!jupyterSandboxUrl || createRequested || agentId) {
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
setCreateRequested(true);
|
|
209
|
+
void createAgent({
|
|
210
|
+
name: AGENT_ID,
|
|
211
|
+
description: 'Demo agent for lexical example',
|
|
212
|
+
protocol: 'vercel-ai',
|
|
213
|
+
model: DEFAULT_MODEL,
|
|
214
|
+
systemPrompt: 'You are a helpful AI assistant that helps users work with documents. You can help with writing, editing, and formatting content.',
|
|
215
|
+
enableCodemode: false,
|
|
216
|
+
sandboxVariant: 'jupyter',
|
|
217
|
+
jupyterSandbox: jupyterSandboxUrl,
|
|
218
|
+
}).catch(() => {
|
|
219
|
+
setCreateRequested(false);
|
|
220
|
+
});
|
|
221
|
+
}, [jupyterSandboxUrl, createRequested, agentId, createAgent]);
|
|
222
|
+
const effectiveReady = isReady || status === 'ready';
|
|
271
223
|
// State to hold tools - populated by LexicalToolsPlugin inside the context
|
|
272
224
|
const [tools, setTools] = useState([]);
|
|
273
225
|
// Stable callback for receiving tools from LexicalToolsPlugin
|
|
@@ -284,7 +236,7 @@ function LexicalWithChat({ content, serviceManager, }) {
|
|
|
284
236
|
width: '100vw',
|
|
285
237
|
display: 'flex',
|
|
286
238
|
overflow: 'hidden',
|
|
287
|
-
}, children: [_jsx(LexicalUI, { content: content, serviceManager: serviceManager, onToolsReady: handleToolsReady }), error && (_jsxs(Box, { sx: {
|
|
239
|
+
}, children: [_jsx(LexicalUI, { content: content, serviceManager: serviceManager, endpoint: vercelAiEndpoint, onToolsReady: handleToolsReady }), error && (_jsxs(Box, { sx: {
|
|
288
240
|
position: 'fixed',
|
|
289
241
|
bottom: 20,
|
|
290
242
|
right: 20,
|
|
@@ -293,7 +245,7 @@ function LexicalWithChat({ content, serviceManager, }) {
|
|
|
293
245
|
color: 'danger.fg',
|
|
294
246
|
borderRadius: 2,
|
|
295
247
|
maxWidth: 300,
|
|
296
|
-
}, children: [_jsx("strong", { children: "Error:" }), " ", error] })),
|
|
248
|
+
}, children: [_jsx("strong", { children: "Error:" }), " ", error] })), effectiveReady && (_jsx(ChatFloating, { protocol: "vercel-ai", endpoint: vercelAiEndpoint, title: "Lexical AI Agent Runtime", description: "Hi! I can help you edit documents. Try: 'Insert a heading', 'Add a code block', or 'Create a list'", defaultOpen: true, defaultViewMode: "panel", position: "bottom-right", frontendTools: tools, useStore: false, showModelSelector: true, showToolsMenu: true, showSkillsMenu: true, suggestions: [
|
|
297
249
|
{
|
|
298
250
|
title: 'Insert heading',
|
|
299
251
|
message: 'Insert a heading that says "Welcome"',
|
|
@@ -42,15 +42,15 @@ import { ChatInlinePlugin } from '../lexical/ChatInlinePlugin';
|
|
|
42
42
|
import { useChatInlineToolbarItems } from '../lexical/useChatInlineToolbarItems';
|
|
43
43
|
import { useLexicalTools } from '../tools/adapters/agent-runtimes/lexicalHooks';
|
|
44
44
|
import { editorConfig } from './lexical/editorConfig';
|
|
45
|
+
import { useExampleAgentRuntimesUrl } from './utils/useExampleAgentRuntimesUrl';
|
|
46
|
+
import { useExampleAgentRuntime } from './hooks/useExampleAgentRuntime';
|
|
45
47
|
import { DEFAULT_MODEL } from '../specs';
|
|
46
48
|
import '@datalayer/jupyter-lexical/style/index.css';
|
|
47
49
|
import './lexical/lexical-theme.css';
|
|
48
50
|
// Fixed lexical document ID
|
|
49
51
|
const LEXICAL_ID = 'chat-lexical-example';
|
|
50
52
|
// Default configuration
|
|
51
|
-
const DEFAULT_BASE_URL = import.meta.env.VITE_BASE_URL || 'http://localhost:8765';
|
|
52
53
|
const DEFAULT_AGENT_ID = import.meta.env.VITE_AGENT_ID || 'lexical-sidebar-agent-runtime-example';
|
|
53
|
-
const VERCEL_AI_ENDPOINT = `${DEFAULT_BASE_URL}/api/v1/vercel-ai/${DEFAULT_AGENT_ID}`;
|
|
54
54
|
function getJupyterSandboxUrl(serviceManager) {
|
|
55
55
|
const envUrl = import.meta.env.VITE_JUPYTER_SANDBOX_URL;
|
|
56
56
|
if (envUrl) {
|
|
@@ -70,70 +70,6 @@ function getJupyterSandboxUrl(serviceManager) {
|
|
|
70
70
|
const separator = baseUrl.includes('?') ? '&' : '?';
|
|
71
71
|
return `${baseUrl}${separator}token=${encodeURIComponent(token)}`;
|
|
72
72
|
}
|
|
73
|
-
function useEnsureAgent(agentId, baseUrl, jupyterSandboxUrl) {
|
|
74
|
-
const [isReady, setIsReady] = useState(false);
|
|
75
|
-
const [error, setError] = useState(null);
|
|
76
|
-
useEffect(() => {
|
|
77
|
-
let mounted = true;
|
|
78
|
-
async function ensureAgent() {
|
|
79
|
-
try {
|
|
80
|
-
if (!jupyterSandboxUrl) {
|
|
81
|
-
if (mounted) {
|
|
82
|
-
setError('Could not detect Jupyter server URL from Lexical service manager.');
|
|
83
|
-
setIsReady(false);
|
|
84
|
-
}
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
const response = await fetch(`${baseUrl}/api/v1/agents`, {
|
|
88
|
-
method: 'POST',
|
|
89
|
-
headers: {
|
|
90
|
-
'Content-Type': 'application/json',
|
|
91
|
-
},
|
|
92
|
-
body: JSON.stringify({
|
|
93
|
-
name: agentId,
|
|
94
|
-
description: 'Demo agent for lexical sidebar example',
|
|
95
|
-
agent_library: 'pydantic-ai',
|
|
96
|
-
transport: 'vercel-ai',
|
|
97
|
-
model: DEFAULT_MODEL,
|
|
98
|
-
system_prompt: 'You are a helpful AI assistant that helps users work with lexical documents. For document operations, always use the lexical frontend tools so actions happen in the live document UI. Use executeCode only for temporary inspection code that should not modify persisted document content.',
|
|
99
|
-
enable_codemode: false,
|
|
100
|
-
sandbox_variant: 'jupyter',
|
|
101
|
-
jupyter_sandbox: jupyterSandboxUrl,
|
|
102
|
-
}),
|
|
103
|
-
});
|
|
104
|
-
if (mounted) {
|
|
105
|
-
if (response.ok) {
|
|
106
|
-
console.warn(`[LexicalAgentSidebarExample] Created agent: ${agentId}`);
|
|
107
|
-
setError(null);
|
|
108
|
-
setIsReady(true);
|
|
109
|
-
}
|
|
110
|
-
else if (response.status === 409 || response.status === 400) {
|
|
111
|
-
console.warn(`[LexicalAgentSidebarExample] Reusing existing agent: ${agentId}`);
|
|
112
|
-
setError(null);
|
|
113
|
-
setIsReady(true);
|
|
114
|
-
}
|
|
115
|
-
else {
|
|
116
|
-
const errorData = await response.json().catch(() => ({}));
|
|
117
|
-
setError(errorData.detail || `Failed to create agent: ${response.status}`);
|
|
118
|
-
setIsReady(false);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
catch (err) {
|
|
123
|
-
if (mounted) {
|
|
124
|
-
console.error('[LexicalAgentSidebarExample] Error creating agent:', err);
|
|
125
|
-
setError(err instanceof Error ? err.message : 'Failed to connect to server');
|
|
126
|
-
setIsReady(false);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
void ensureAgent();
|
|
131
|
-
return () => {
|
|
132
|
-
mounted = false;
|
|
133
|
-
};
|
|
134
|
-
}, [agentId, baseUrl, jupyterSandboxUrl]);
|
|
135
|
-
return { isReady, error };
|
|
136
|
-
}
|
|
137
73
|
/**
|
|
138
74
|
* Lexical plugin for code highlighting
|
|
139
75
|
*/
|
|
@@ -144,7 +80,7 @@ function CodeHighlightingPlugin() {
|
|
|
144
80
|
}, [editor]);
|
|
145
81
|
return null;
|
|
146
82
|
}
|
|
147
|
-
function LexicalEditor({ serviceManager }) {
|
|
83
|
+
function LexicalEditor({ serviceManager, endpoint }) {
|
|
148
84
|
const [floatingAnchorElem, setFloatingAnchorElem] = useState(null);
|
|
149
85
|
const [_isLinkEditMode, setIsLinkEditMode] = useState(false);
|
|
150
86
|
// AI actions registered as toolbar items
|
|
@@ -177,24 +113,60 @@ function LexicalEditor({ serviceManager }) {
|
|
|
177
113
|
pointerEvents: 'none',
|
|
178
114
|
}, children: "Start typing or use the chat to create content..." }), ErrorBoundary: LexicalErrorBoundary }), _jsx(HistoryPlugin, {}), _jsx(AutoFocusPlugin, {}), _jsx(OnChangePlugin, { onChange: onChange }), _jsx(MarkdownShortcutPlugin, { transformers: TRANSFORMERS }), _jsx(CodeHighlightingPlugin, {}), _jsx(ListPlugin, {}), _jsx(CheckListPlugin, {}), _jsx(LinkPlugin, {}), _jsx(TablePlugin, {}), _jsx(TableCellResizerPlugin, {}), _jsx(JupyterCellPlugin, {}), _jsx(JupyterInputOutputPlugin, {}), _jsx(ImagesPlugin, {}), _jsx(HorizontalRulePlugin, {}), _jsx(EquationsPlugin, {}), _jsx(YouTubePlugin, {}), _jsx(ExcalidrawPlugin, {}), _jsx(CollapsiblePlugin, {}), _jsx(AutoLinkPlugin, {}), _jsx(AutoEmbedPlugin, {}), _jsx(ListMaxIndentLevelPlugin, { maxDepth: 7 }), floatingAnchorElem && (_jsxs(_Fragment, { children: [_jsx(ComponentPickerMenuPlugin, {}), _jsx(DraggableBlockPlugin, { anchorElem: floatingAnchorElem }), _jsx(FloatingTextFormatToolbarPlugin, { anchorElem: floatingAnchorElem, setIsLinkEditMode: setIsLinkEditMode, extraItems: toolbarItems }), _jsx(CodeActionMenuPlugin, { anchorElem: floatingAnchorElem })] })), _jsx(ChatInlinePlugin, { protocol: {
|
|
179
115
|
type: 'vercel-ai',
|
|
180
|
-
endpoint
|
|
116
|
+
endpoint,
|
|
181
117
|
}, isOpen: isAiOpen, onClose: closeAi, pendingPrompt: pendingPrompt, onPendingPromptConsumed: clearPendingPrompt })] })] }) }));
|
|
182
118
|
}
|
|
183
119
|
export function ChatLexicalAgentExampleInner({ serviceManager, }) {
|
|
120
|
+
const baseUrl = useExampleAgentRuntimesUrl();
|
|
121
|
+
const vercelAiEndpoint = `${baseUrl}/api/v1/vercel-ai/${DEFAULT_AGENT_ID}`;
|
|
122
|
+
const [createRequested, setCreateRequested] = useState(false);
|
|
184
123
|
const jupyterSandboxUrl = useMemo(() => getJupyterSandboxUrl(serviceManager), [serviceManager]);
|
|
185
|
-
const { isReady, error } =
|
|
124
|
+
const { agentId, isReady, status, error, createAgent } = useExampleAgentRuntime({
|
|
125
|
+
exampleId: 'LexicalAgentSidebarExample',
|
|
126
|
+
agentName: DEFAULT_AGENT_ID,
|
|
127
|
+
autoCreateAgent: false,
|
|
128
|
+
agentConfig: {
|
|
129
|
+
name: DEFAULT_AGENT_ID,
|
|
130
|
+
description: 'Demo agent for lexical sidebar example',
|
|
131
|
+
protocol: 'vercel-ai',
|
|
132
|
+
model: DEFAULT_MODEL,
|
|
133
|
+
systemPrompt: 'You are a helpful AI assistant that helps users work with lexical documents. For document operations, always use the lexical frontend tools so actions happen in the live document UI. Use executeCode only for temporary inspection code that should not modify persisted document content.',
|
|
134
|
+
enableCodemode: false,
|
|
135
|
+
sandboxVariant: 'jupyter',
|
|
136
|
+
jupyterSandbox: jupyterSandboxUrl,
|
|
137
|
+
},
|
|
138
|
+
});
|
|
139
|
+
useEffect(() => {
|
|
140
|
+
if (!jupyterSandboxUrl || createRequested || agentId) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
setCreateRequested(true);
|
|
144
|
+
void createAgent({
|
|
145
|
+
name: DEFAULT_AGENT_ID,
|
|
146
|
+
description: 'Demo agent for lexical sidebar example',
|
|
147
|
+
protocol: 'vercel-ai',
|
|
148
|
+
model: DEFAULT_MODEL,
|
|
149
|
+
systemPrompt: 'You are a helpful AI assistant that helps users work with lexical documents. For document operations, always use the lexical frontend tools so actions happen in the live document UI. Use executeCode only for temporary inspection code that should not modify persisted document content.',
|
|
150
|
+
enableCodemode: false,
|
|
151
|
+
sandboxVariant: 'jupyter',
|
|
152
|
+
jupyterSandbox: jupyterSandboxUrl,
|
|
153
|
+
}).catch(() => {
|
|
154
|
+
setCreateRequested(false);
|
|
155
|
+
});
|
|
156
|
+
}, [jupyterSandboxUrl, createRequested, agentId, createAgent]);
|
|
157
|
+
const effectiveReady = isReady || status === 'ready';
|
|
186
158
|
// Get lexical tools for ChatSidebar
|
|
187
159
|
const tools = useLexicalTools(LEXICAL_ID);
|
|
188
160
|
// Build Vercel AI protocol config
|
|
189
161
|
const protocolConfig = useMemo(() => {
|
|
190
162
|
return {
|
|
191
163
|
type: 'vercel-ai',
|
|
192
|
-
endpoint:
|
|
164
|
+
endpoint: vercelAiEndpoint,
|
|
193
165
|
agentId: DEFAULT_AGENT_ID,
|
|
194
166
|
enableConfigQuery: true,
|
|
195
|
-
configEndpoint: `${
|
|
167
|
+
configEndpoint: `${baseUrl}/api/v1/configure`,
|
|
196
168
|
};
|
|
197
|
-
}, []);
|
|
169
|
+
}, [baseUrl, vercelAiEndpoint]);
|
|
198
170
|
return (_jsxs(_Fragment, { children: [_jsxs(Box, { sx: {
|
|
199
171
|
height: 'calc(100vh - 70px)',
|
|
200
172
|
width: '100vw',
|
|
@@ -215,7 +187,7 @@ export function ChatLexicalAgentExampleInner({ serviceManager, }) {
|
|
|
215
187
|
display: 'flex',
|
|
216
188
|
overflow: 'hidden',
|
|
217
189
|
bg: 'canvas.default',
|
|
218
|
-
}, children: _jsx(LexicalEditor, { serviceManager: serviceManager }) })] }),
|
|
190
|
+
}, children: _jsx(LexicalEditor, { serviceManager: serviceManager, endpoint: vercelAiEndpoint }) })] }), effectiveReady && (_jsx(ChatSidebar, { title: "AI Assistant", protocol: protocolConfig, position: "right", width: 400, showNewChatButton: true, showClearButton: true, showSettingsButton: true, defaultOpen: true, panelProps: {
|
|
219
191
|
protocol: protocolConfig,
|
|
220
192
|
frontendTools: tools,
|
|
221
193
|
useStore: true,
|
|
@@ -15,13 +15,15 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
15
15
|
*
|
|
16
16
|
* @module examples/NotebookAgentExample
|
|
17
17
|
*/
|
|
18
|
-
import React, { useEffect, useMemo, useState } from 'react';
|
|
18
|
+
import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
|
19
19
|
import { Box } from '@datalayer/primer-addons';
|
|
20
20
|
import { Notebook } from '@datalayer/jupyter-react';
|
|
21
21
|
import { ThemedJupyterProvider } from './utils/themedProvider';
|
|
22
22
|
// Agent-runtimes imports
|
|
23
23
|
import { ChatFloating } from '../chat';
|
|
24
24
|
import { useNotebookTools } from '../tools/adapters/agent-runtimes/notebookHooks';
|
|
25
|
+
import { useExampleAgentRuntimesUrl } from './utils/useExampleAgentRuntimesUrl';
|
|
26
|
+
import { useExampleAgentRuntime } from './hooks/useExampleAgentRuntime';
|
|
25
27
|
// Import Matplotlib notebook
|
|
26
28
|
import MatplotlibNotebook from './utils/notebooks/Matplotlib.ipynb.json';
|
|
27
29
|
import { DEFAULT_MODEL } from '../specs';
|
|
@@ -29,11 +31,7 @@ import { DEFAULT_MODEL } from '../specs';
|
|
|
29
31
|
const NOTEBOOK_ID = 'agui-notebook-example';
|
|
30
32
|
// Use the imported Matplotlib notebook
|
|
31
33
|
const NOTEBOOK_CONTENT = MatplotlibNotebook;
|
|
32
|
-
// Base URL for agent-runtimes server
|
|
33
|
-
const BASE_URL = 'http://localhost:8765';
|
|
34
34
|
const AGENT_ID = 'notebook-agent-runtime-example';
|
|
35
|
-
// Vercel AI endpoint
|
|
36
|
-
const VERCEL_AI_ENDPOINT = `${BASE_URL}/api/v1/vercel-ai/${AGENT_ID}`;
|
|
37
35
|
function getJupyterSandboxUrl(serviceManager) {
|
|
38
36
|
const envUrl = import.meta.env.VITE_JUPYTER_SANDBOX_URL;
|
|
39
37
|
if (envUrl) {
|
|
@@ -53,74 +51,7 @@ function getJupyterSandboxUrl(serviceManager) {
|
|
|
53
51
|
const separator = baseUrl.includes('?') ? '&' : '?';
|
|
54
52
|
return `${baseUrl}${separator}token=${encodeURIComponent(token)}`;
|
|
55
53
|
}
|
|
56
|
-
|
|
57
|
-
* Hook to ensure the example-agent is aligned with the active notebook runtime.
|
|
58
|
-
* Recreates the agent with jupyter sandbox settings from the Notebook UI.
|
|
59
|
-
*/
|
|
60
|
-
function useEnsureAgent(agentId, baseUrl, jupyterSandboxUrl) {
|
|
61
|
-
const [isReady, setIsReady] = useState(false);
|
|
62
|
-
const [error, setError] = useState(null);
|
|
63
|
-
useEffect(() => {
|
|
64
|
-
let mounted = true;
|
|
65
|
-
async function ensureAgent() {
|
|
66
|
-
try {
|
|
67
|
-
if (!jupyterSandboxUrl) {
|
|
68
|
-
if (mounted) {
|
|
69
|
-
setError('Could not detect Jupyter server URL from Notebook service manager.');
|
|
70
|
-
setIsReady(false);
|
|
71
|
-
}
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
const response = await fetch(`${baseUrl}/api/v1/agents`, {
|
|
75
|
-
method: 'POST',
|
|
76
|
-
headers: {
|
|
77
|
-
'Content-Type': 'application/json',
|
|
78
|
-
},
|
|
79
|
-
body: JSON.stringify({
|
|
80
|
-
name: agentId,
|
|
81
|
-
description: 'Demo agent for notebook example',
|
|
82
|
-
agent_library: 'pydantic-ai',
|
|
83
|
-
transport: 'vercel-ai',
|
|
84
|
-
model: DEFAULT_MODEL,
|
|
85
|
-
system_prompt: 'You are a helpful AI assistant that helps users work with Jupyter notebooks. For notebook operations, always use the notebook frontend tools (runCell, readAllCells, readCell, insertCell, updateCell, deleteCells) so actions happen in the live notebook UI. Use executeCode only for temporary inspection code that should not modify notebook cells.',
|
|
86
|
-
enable_codemode: false,
|
|
87
|
-
sandbox_variant: 'jupyter',
|
|
88
|
-
jupyter_sandbox: jupyterSandboxUrl,
|
|
89
|
-
}),
|
|
90
|
-
});
|
|
91
|
-
if (mounted) {
|
|
92
|
-
if (response.ok) {
|
|
93
|
-
console.warn(`[AgentRuntimeExample] Created agent: ${agentId}`);
|
|
94
|
-
setError(null);
|
|
95
|
-
setIsReady(true);
|
|
96
|
-
}
|
|
97
|
-
else if (response.status === 409 || response.status === 400) {
|
|
98
|
-
// Agent already exists; reuse it and continue.
|
|
99
|
-
console.warn(`[AgentRuntimeExample] Reusing existing agent: ${agentId}`);
|
|
100
|
-
setError(null);
|
|
101
|
-
setIsReady(true);
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
const errorData = await response.json().catch(() => ({}));
|
|
105
|
-
setError(errorData.detail || `Failed to create agent: ${response.status}`);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
catch (err) {
|
|
110
|
-
if (mounted) {
|
|
111
|
-
console.error('[AgentRuntimeExample] Error creating agent:', err);
|
|
112
|
-
setError(err instanceof Error ? err.message : 'Failed to connect to server');
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
ensureAgent();
|
|
117
|
-
return () => {
|
|
118
|
-
mounted = false;
|
|
119
|
-
};
|
|
120
|
-
}, [agentId, baseUrl, jupyterSandboxUrl]);
|
|
121
|
-
return { isReady, error };
|
|
122
|
-
}
|
|
123
|
-
const NotebookUI = React.memo(function NotebookUI({ serviceManager, }) {
|
|
54
|
+
const NotebookUI = React.memo(function NotebookUI({ serviceManager, onSessionConnection, }) {
|
|
124
55
|
return (_jsxs(Box, { sx: {
|
|
125
56
|
flex: 1,
|
|
126
57
|
display: 'flex',
|
|
@@ -138,19 +69,57 @@ const NotebookUI = React.memo(function NotebookUI({ serviceManager, }) {
|
|
|
138
69
|
borderRadius: 2,
|
|
139
70
|
padding: 3,
|
|
140
71
|
backgroundColor: 'canvas.default',
|
|
141
|
-
}, children: serviceManager ? (_jsx(ThemedJupyterProvider, { children: _jsx(Notebook, { nbformat: NOTEBOOK_CONTENT, id: NOTEBOOK_ID, serviceManager: serviceManager, height: "calc(100vh - 300px)", cellSidebarMargin: 120, startDefaultKernel: true }) })) : (_jsx(Box, { sx: { padding: 3 }, children: _jsx("p", { children: "Loading service manager..." }) })) })] }));
|
|
72
|
+
}, children: serviceManager ? (_jsx(ThemedJupyterProvider, { children: _jsx(Notebook, { nbformat: NOTEBOOK_CONTENT, id: NOTEBOOK_ID, serviceManager: serviceManager, onSessionConnection: onSessionConnection, height: "calc(100vh - 300px)", cellSidebarMargin: 120, startDefaultKernel: true }) })) : (_jsx(Box, { sx: { padding: 3 }, children: _jsx("p", { children: "Loading service manager..." }) })) })] }));
|
|
142
73
|
});
|
|
143
74
|
function NotebookWithChat({ serviceManager, }) {
|
|
75
|
+
const baseUrl = useExampleAgentRuntimesUrl();
|
|
144
76
|
const jupyterSandboxUrl = useMemo(() => getJupyterSandboxUrl(serviceManager), [serviceManager]);
|
|
145
|
-
|
|
146
|
-
const
|
|
77
|
+
const [createRequested, setCreateRequested] = useState(false);
|
|
78
|
+
const [notebookKernel, setNotebookKernel] = useState(null);
|
|
79
|
+
const { agentId, isReady, status, error, createAgent } = useExampleAgentRuntime({
|
|
80
|
+
exampleId: 'NotebookAgentExample',
|
|
81
|
+
agentName: AGENT_ID,
|
|
82
|
+
autoCreateAgent: false,
|
|
83
|
+
agentConfig: {
|
|
84
|
+
name: AGENT_ID,
|
|
85
|
+
description: 'Demo agent for notebook example',
|
|
86
|
+
protocol: 'vercel-ai',
|
|
87
|
+
model: DEFAULT_MODEL,
|
|
88
|
+
systemPrompt: 'You are a helpful AI assistant that helps users work with Jupyter notebooks. For notebook operations, always use the notebook frontend tools (runCell, readAllCells, readCell, insertCell, updateCell, deleteCells) so actions happen in the live notebook UI. Use executeCode only for temporary inspection code that should not modify notebook cells.',
|
|
89
|
+
enableCodemode: false,
|
|
90
|
+
sandboxVariant: 'jupyter',
|
|
91
|
+
jupyterSandbox: jupyterSandboxUrl,
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
useEffect(() => {
|
|
95
|
+
if (!jupyterSandboxUrl || createRequested || agentId) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
setCreateRequested(true);
|
|
99
|
+
void createAgent({
|
|
100
|
+
name: AGENT_ID,
|
|
101
|
+
description: 'Demo agent for notebook example',
|
|
102
|
+
protocol: 'vercel-ai',
|
|
103
|
+
model: DEFAULT_MODEL,
|
|
104
|
+
systemPrompt: 'You are a helpful AI assistant that helps users work with Jupyter notebooks. For notebook operations, always use the notebook frontend tools (runCell, readAllCells, readCell, insertCell, updateCell, deleteCells) so actions happen in the live notebook UI. Use executeCode only for temporary inspection code that should not modify notebook cells.',
|
|
105
|
+
enableCodemode: false,
|
|
106
|
+
sandboxVariant: 'jupyter',
|
|
107
|
+
jupyterSandbox: jupyterSandboxUrl,
|
|
108
|
+
}).catch(() => {
|
|
109
|
+
setCreateRequested(false);
|
|
110
|
+
});
|
|
111
|
+
}, [jupyterSandboxUrl, createRequested, agentId, createAgent]);
|
|
112
|
+
const effectiveReady = isReady || status === 'ready';
|
|
113
|
+
const handleSessionConnection = useCallback((session) => {
|
|
114
|
+
setNotebookKernel(session?.kernel ?? null);
|
|
115
|
+
}, []);
|
|
147
116
|
const protocolConfig = useMemo(() => ({
|
|
148
117
|
type: 'vercel-ai',
|
|
149
|
-
endpoint:
|
|
118
|
+
endpoint: `${baseUrl}/api/v1/vercel-ai/${AGENT_ID}`,
|
|
150
119
|
agentId: AGENT_ID,
|
|
151
120
|
enableConfigQuery: true,
|
|
152
|
-
configEndpoint: `${
|
|
153
|
-
}), []);
|
|
121
|
+
configEndpoint: `${baseUrl}/api/v1/configure`,
|
|
122
|
+
}), [baseUrl]);
|
|
154
123
|
// Get notebook tools for ChatFloating
|
|
155
124
|
const frontendTools = useNotebookTools(NOTEBOOK_ID);
|
|
156
125
|
return (_jsxs(Box, { sx: {
|
|
@@ -158,7 +127,7 @@ function NotebookWithChat({ serviceManager, }) {
|
|
|
158
127
|
width: '100%',
|
|
159
128
|
display: 'flex',
|
|
160
129
|
overflow: 'hidden',
|
|
161
|
-
}, children: [_jsx(NotebookUI, { serviceManager: serviceManager }), error && (_jsxs(Box, { sx: {
|
|
130
|
+
}, children: [_jsx(NotebookUI, { serviceManager: serviceManager, onSessionConnection: handleSessionConnection }), error && (_jsxs(Box, { sx: {
|
|
162
131
|
position: 'fixed',
|
|
163
132
|
bottom: 20,
|
|
164
133
|
right: 20,
|
|
@@ -167,7 +136,9 @@ function NotebookWithChat({ serviceManager, }) {
|
|
|
167
136
|
color: 'danger.fg',
|
|
168
137
|
borderRadius: 2,
|
|
169
138
|
maxWidth: 300,
|
|
170
|
-
}, children: [_jsx("strong", { children: "Error:" }), " ", error] })),
|
|
139
|
+
}, children: [_jsx("strong", { children: "Error:" }), " ", error] })), effectiveReady && (_jsx(ChatFloating, { protocol: protocolConfig, title: "Notebook AI Agent Runtime", description: "Hi! I can help you edit notebook cells. Try: 'Add a new code cell', 'Run cell 1', or 'Delete the last cell'", defaultOpen: true, defaultViewMode: "panel", position: "bottom-right", frontendTools: frontendTools, useStore: false, showModelSelector: true, showToolsMenu: true, showSkillsMenu: true, panelProps: {
|
|
140
|
+
kernel: notebookKernel,
|
|
141
|
+
}, suggestions: [
|
|
171
142
|
{
|
|
172
143
|
title: 'Add a cell',
|
|
173
144
|
message: 'Insert a random cell to the notebook',
|