@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
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2025-2026 Datalayer, Inc.
|
|
3
|
+
* Distributed under the terms of the Modified BSD License.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Fetch the session ID of a collaborative document from Datalayer.
|
|
7
|
+
*/
|
|
8
|
+
export async function requestDatalayerCollaborationSessionId({ url, token, fetchFn = fetch, }) {
|
|
9
|
+
const headers = {
|
|
10
|
+
Accept: 'application/json',
|
|
11
|
+
};
|
|
12
|
+
if (token) {
|
|
13
|
+
headers['Authorization'] = `Bearer ${token}`;
|
|
14
|
+
}
|
|
15
|
+
const response = await fetchFn(url, {
|
|
16
|
+
method: 'GET',
|
|
17
|
+
headers,
|
|
18
|
+
credentials: token ? 'include' : 'omit',
|
|
19
|
+
mode: 'cors',
|
|
20
|
+
cache: 'no-store',
|
|
21
|
+
});
|
|
22
|
+
if (response.ok) {
|
|
23
|
+
const content = await response.json();
|
|
24
|
+
return content['sessionId'];
|
|
25
|
+
}
|
|
26
|
+
console.error('Failed to fetch session ID.', response);
|
|
27
|
+
throw new Error('Failed to fetch session ID.');
|
|
28
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { ICollaborationProvider, ICollaborationProviderEvents } from '@datalayer/jupyter-react';
|
|
2
|
+
import { WebsocketProvider } from 'y-websocket';
|
|
3
|
+
export declare enum CollaborationStatus {
|
|
4
|
+
Disconnected = "disconnected",
|
|
5
|
+
Connecting = "connecting",
|
|
6
|
+
Connected = "connected",
|
|
7
|
+
Error = "error"
|
|
8
|
+
}
|
|
9
|
+
type SharedModel = Parameters<ICollaborationProvider['connect']>[0];
|
|
10
|
+
type ConnectOptions = Parameters<ICollaborationProvider['connect']>[2];
|
|
11
|
+
/**
|
|
12
|
+
* Configuration for Datalayer collaboration provider.
|
|
13
|
+
*/
|
|
14
|
+
export interface IDatalayerCollaborationConfig {
|
|
15
|
+
/**
|
|
16
|
+
* Base URL for the Datalayer server (optional, uses config from store if not provided).
|
|
17
|
+
*/
|
|
18
|
+
datalayerUrl?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Authentication token (optional, uses config from store if not provided).
|
|
21
|
+
*/
|
|
22
|
+
token?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Custom fetch function to use for HTTP requests.
|
|
25
|
+
* Useful for proxying requests in environments with CORS restrictions (e.g., VS Code webviews).
|
|
26
|
+
*/
|
|
27
|
+
fetchFn?: typeof fetch;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Datalayer collaboration provider.
|
|
31
|
+
*/
|
|
32
|
+
export declare class DatalayerCollaborationProvider implements ICollaborationProvider {
|
|
33
|
+
readonly type = "datalayer";
|
|
34
|
+
private _status;
|
|
35
|
+
private _provider;
|
|
36
|
+
private _sharedModel;
|
|
37
|
+
private _statusChanged;
|
|
38
|
+
private _errorOccurred;
|
|
39
|
+
private _syncStateChanged;
|
|
40
|
+
private _isDisposed;
|
|
41
|
+
private _config;
|
|
42
|
+
private _onSync;
|
|
43
|
+
private _onConnectionClose;
|
|
44
|
+
constructor(config: IDatalayerCollaborationConfig);
|
|
45
|
+
get status(): CollaborationStatus;
|
|
46
|
+
get isConnected(): boolean;
|
|
47
|
+
get isDisposed(): boolean;
|
|
48
|
+
get events(): ICollaborationProviderEvents;
|
|
49
|
+
private setStatus;
|
|
50
|
+
connect(sharedModel: SharedModel, documentId: string, options?: ConnectOptions): Promise<void>;
|
|
51
|
+
disconnect(): void;
|
|
52
|
+
getProvider(): WebsocketProvider | null;
|
|
53
|
+
getSharedModel(): SharedModel | null;
|
|
54
|
+
handleConnectionClose(event: CloseEvent): void;
|
|
55
|
+
handleSync(isSynced: boolean): void;
|
|
56
|
+
dispose(): void;
|
|
57
|
+
}
|
|
58
|
+
export default DatalayerCollaborationProvider;
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2025-2026 Datalayer, Inc.
|
|
3
|
+
* Distributed under the terms of the Modified BSD License.
|
|
4
|
+
*/
|
|
5
|
+
import { URLExt } from '@jupyterlab/coreutils';
|
|
6
|
+
import { Signal } from '@lumino/signaling';
|
|
7
|
+
import { WebsocketProvider } from 'y-websocket';
|
|
8
|
+
import { requestDatalayerCollaborationSessionId } from './DatalayerCollaboration';
|
|
9
|
+
export var CollaborationStatus;
|
|
10
|
+
(function (CollaborationStatus) {
|
|
11
|
+
CollaborationStatus["Disconnected"] = "disconnected";
|
|
12
|
+
CollaborationStatus["Connecting"] = "connecting";
|
|
13
|
+
CollaborationStatus["Connected"] = "connected";
|
|
14
|
+
CollaborationStatus["Error"] = "error";
|
|
15
|
+
})(CollaborationStatus || (CollaborationStatus = {}));
|
|
16
|
+
/**
|
|
17
|
+
* Datalayer collaboration provider.
|
|
18
|
+
*/
|
|
19
|
+
export class DatalayerCollaborationProvider {
|
|
20
|
+
type = 'datalayer';
|
|
21
|
+
_status = CollaborationStatus.Disconnected;
|
|
22
|
+
_provider = null;
|
|
23
|
+
_sharedModel = null;
|
|
24
|
+
_statusChanged = new Signal(this);
|
|
25
|
+
_errorOccurred = new Signal(this);
|
|
26
|
+
_syncStateChanged = new Signal(this);
|
|
27
|
+
_isDisposed = false;
|
|
28
|
+
_config;
|
|
29
|
+
_onSync = null;
|
|
30
|
+
_onConnectionClose = null;
|
|
31
|
+
constructor(config) {
|
|
32
|
+
this._config = config;
|
|
33
|
+
}
|
|
34
|
+
get status() {
|
|
35
|
+
return this._status;
|
|
36
|
+
}
|
|
37
|
+
get isConnected() {
|
|
38
|
+
return this._status === CollaborationStatus.Connected;
|
|
39
|
+
}
|
|
40
|
+
get isDisposed() {
|
|
41
|
+
return this._isDisposed;
|
|
42
|
+
}
|
|
43
|
+
get events() {
|
|
44
|
+
return {
|
|
45
|
+
statusChanged: this._statusChanged,
|
|
46
|
+
errorOccurred: this._errorOccurred,
|
|
47
|
+
syncStateChanged: this._syncStateChanged,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
setStatus(status) {
|
|
51
|
+
if (this._status !== status) {
|
|
52
|
+
this._status = status;
|
|
53
|
+
this._statusChanged.emit(status);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async connect(sharedModel, documentId, options) {
|
|
57
|
+
if (this.isConnected) {
|
|
58
|
+
console.warn('Already connected to Datalayer collaboration service');
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
this.setStatus(CollaborationStatus.Connecting);
|
|
62
|
+
try {
|
|
63
|
+
const datalayerUrl = this._config.datalayerUrl;
|
|
64
|
+
const token = this._config.token;
|
|
65
|
+
if (!datalayerUrl) {
|
|
66
|
+
throw new Error('Datalayer datalayerUrl is not configured - must be explicitly provided in DatalayerCollaborationProvider config');
|
|
67
|
+
}
|
|
68
|
+
if (!token) {
|
|
69
|
+
throw new Error('Datalayer token is not configured - must be explicitly provided in DatalayerCollaborationProvider config');
|
|
70
|
+
}
|
|
71
|
+
const { ydoc, awareness } = sharedModel;
|
|
72
|
+
const documentURL = URLExt.join(datalayerUrl, '/api/spacer/v1/documents');
|
|
73
|
+
const wsUrl = URLExt.join(datalayerUrl, '/api/spacer/v1/documents/ws').replace(/^http/, 'ws');
|
|
74
|
+
const sessionId = await requestDatalayerCollaborationSessionId({
|
|
75
|
+
url: URLExt.join(documentURL, documentId),
|
|
76
|
+
token,
|
|
77
|
+
fetchFn: this._config.fetchFn,
|
|
78
|
+
});
|
|
79
|
+
this._provider = new WebsocketProvider(wsUrl, documentId, ydoc, {
|
|
80
|
+
disableBc: true,
|
|
81
|
+
params: {
|
|
82
|
+
sessionId,
|
|
83
|
+
token,
|
|
84
|
+
},
|
|
85
|
+
awareness,
|
|
86
|
+
...options,
|
|
87
|
+
});
|
|
88
|
+
this._sharedModel = sharedModel;
|
|
89
|
+
this._onSync = (isSynced) => {
|
|
90
|
+
this.handleSync(isSynced);
|
|
91
|
+
};
|
|
92
|
+
this._onConnectionClose = (event) => {
|
|
93
|
+
if (event) {
|
|
94
|
+
this.handleConnectionClose(event);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
this._provider.on('sync', this._onSync);
|
|
98
|
+
this._provider.on('connection-close', this._onConnectionClose);
|
|
99
|
+
console.log('Connected to Datalayer collaboration service');
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
this.setStatus(CollaborationStatus.Error);
|
|
103
|
+
this._errorOccurred.emit(error);
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
disconnect() {
|
|
108
|
+
if (this._provider) {
|
|
109
|
+
if (this._onSync) {
|
|
110
|
+
this._provider.off('sync', this._onSync);
|
|
111
|
+
}
|
|
112
|
+
if (this._onConnectionClose) {
|
|
113
|
+
this._provider.off('connection-close', this._onConnectionClose);
|
|
114
|
+
}
|
|
115
|
+
this._provider.disconnect();
|
|
116
|
+
this._provider = null;
|
|
117
|
+
}
|
|
118
|
+
this._sharedModel = null;
|
|
119
|
+
this.setStatus(CollaborationStatus.Disconnected);
|
|
120
|
+
}
|
|
121
|
+
getProvider() {
|
|
122
|
+
return this._provider;
|
|
123
|
+
}
|
|
124
|
+
getSharedModel() {
|
|
125
|
+
return this._sharedModel;
|
|
126
|
+
}
|
|
127
|
+
handleConnectionClose(event) {
|
|
128
|
+
console.warn('Collaboration connection closed:', event);
|
|
129
|
+
this.setStatus(CollaborationStatus.Disconnected);
|
|
130
|
+
if (event.code === 4002) {
|
|
131
|
+
console.warn('Datalayer collaboration session expired');
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
handleSync(isSynced) {
|
|
135
|
+
this._syncStateChanged.emit(isSynced);
|
|
136
|
+
if (isSynced) {
|
|
137
|
+
this.setStatus(CollaborationStatus.Connected);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
dispose() {
|
|
141
|
+
if (this._isDisposed) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
this.disconnect();
|
|
145
|
+
this._isDisposed = true;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
export default DatalayerCollaborationProvider;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface AgentSummaryData {
|
|
3
|
+
agentName: string;
|
|
4
|
+
location: string;
|
|
5
|
+
specId?: string;
|
|
6
|
+
status?: string;
|
|
7
|
+
baseUrl?: string;
|
|
8
|
+
agentId?: string;
|
|
9
|
+
isReady?: boolean;
|
|
10
|
+
error?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface AgentSummaryProps {
|
|
13
|
+
summary: AgentSummaryData | null;
|
|
14
|
+
title?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Compact agent summary badge with a hover overlay for details.
|
|
18
|
+
*/
|
|
19
|
+
export declare const AgentSummary: React.FC<AgentSummaryProps>;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright (c) 2025-2026 Datalayer, Inc.
|
|
4
|
+
* Distributed under the terms of the Modified BSD License.
|
|
5
|
+
*/
|
|
6
|
+
import { useState } from 'react';
|
|
7
|
+
import { Spinner } from '@primer/react';
|
|
8
|
+
import { Box } from '@datalayer/primer-addons';
|
|
9
|
+
/**
|
|
10
|
+
* Statuses that represent an agent actively being created/started. The spinner
|
|
11
|
+
* only shows for these; app-navigation states ("selected", "switching") and
|
|
12
|
+
* settled states ("ready", "running", ...) never spin.
|
|
13
|
+
*/
|
|
14
|
+
const CREATING_STATUSES = new Set([
|
|
15
|
+
'creating',
|
|
16
|
+
'starting',
|
|
17
|
+
'launching',
|
|
18
|
+
'connecting',
|
|
19
|
+
'pending',
|
|
20
|
+
'resuming',
|
|
21
|
+
]);
|
|
22
|
+
/**
|
|
23
|
+
* Compact agent summary badge with a hover overlay for details.
|
|
24
|
+
*/
|
|
25
|
+
export const AgentSummary = ({ summary, title = 'Active Agent', }) => {
|
|
26
|
+
const [isHovering, setIsHovering] = useState(false);
|
|
27
|
+
const runtimeStatusUrl = summary?.baseUrl
|
|
28
|
+
? (() => {
|
|
29
|
+
const normalized = summary.baseUrl.replace(/\/$/, '');
|
|
30
|
+
if (normalized.endsWith('/api/v1')) {
|
|
31
|
+
return `${normalized}/runtime/status`;
|
|
32
|
+
}
|
|
33
|
+
return `${normalized}/api/v1/runtime/status`;
|
|
34
|
+
})()
|
|
35
|
+
: undefined;
|
|
36
|
+
if (!summary) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
const normalizedStatus = (summary.status || '').toLowerCase();
|
|
40
|
+
// Only show the spinner while the agent is genuinely being created: it is not
|
|
41
|
+
// ready, has no id yet, and its status is an active creation/startup state.
|
|
42
|
+
const isCreating = !summary.isReady &&
|
|
43
|
+
!summary.agentId &&
|
|
44
|
+
CREATING_STATUSES.has(normalizedStatus);
|
|
45
|
+
const hasError = Boolean(summary.error);
|
|
46
|
+
return (_jsxs(Box, { sx: { position: 'relative' }, onMouseEnter: () => setIsHovering(true), onMouseLeave: () => setIsHovering(false), children: [_jsxs(Box, { as: "button", type: "button", sx: {
|
|
47
|
+
px: 2,
|
|
48
|
+
py: '6px',
|
|
49
|
+
border: '1px solid',
|
|
50
|
+
borderColor: hasError ? 'danger.emphasis' : 'border.default',
|
|
51
|
+
borderRadius: 2,
|
|
52
|
+
bg: hasError ? 'danger.subtle' : 'canvas.default',
|
|
53
|
+
color: hasError ? 'danger.fg' : 'fg.default',
|
|
54
|
+
fontSize: 0,
|
|
55
|
+
cursor: 'default',
|
|
56
|
+
display: 'flex',
|
|
57
|
+
alignItems: 'center',
|
|
58
|
+
gap: 1,
|
|
59
|
+
}, children: [isCreating && _jsx(Spinner, { size: "small", sx: { width: 12, height: 12 } }), hasError && _jsx("span", { "aria-hidden": true, children: "\u26A0" }), summary.agentName, " \u00B7 ", summary.location] }), isHovering && (_jsxs(Box, { sx: {
|
|
60
|
+
position: 'absolute',
|
|
61
|
+
top: 'calc(100% + 8px)',
|
|
62
|
+
right: 0,
|
|
63
|
+
width: 360,
|
|
64
|
+
p: 2,
|
|
65
|
+
border: '1px solid',
|
|
66
|
+
borderColor: 'border.default',
|
|
67
|
+
borderRadius: 2,
|
|
68
|
+
bg: 'canvas.overlay',
|
|
69
|
+
boxShadow: 'shadow.large',
|
|
70
|
+
zIndex: 120,
|
|
71
|
+
fontSize: 0,
|
|
72
|
+
color: 'fg.default',
|
|
73
|
+
}, children: [_jsx(Box, { sx: { mb: 1, fontWeight: 600 }, children: title }), _jsxs(Box, { sx: { color: 'fg.muted' }, children: ["Name: ", summary.agentName] }), _jsxs(Box, { sx: { color: 'fg.muted' }, children: ["Location: ", summary.location] }), _jsxs(Box, { sx: { color: 'fg.muted' }, children: ["Spec: ", summary.specId || '—'] }), _jsxs(Box, { sx: { color: 'fg.muted' }, children: ["Status: ", isCreating ? 'creating' : summary.status || '—'] }), _jsxs(Box, { sx: { color: 'fg.muted', wordBreak: 'break-all' }, children: ["Base URL: ", summary.baseUrl || '—'] }), _jsxs(Box, { sx: {
|
|
74
|
+
color: 'fg.muted',
|
|
75
|
+
wordBreak: 'break-all',
|
|
76
|
+
display: 'flex',
|
|
77
|
+
alignItems: 'center',
|
|
78
|
+
gap: 1,
|
|
79
|
+
}, children: ["Agent ID:", ' ', summary.agentId ? (summary.agentId) : isCreating ? (_jsxs(_Fragment, { children: [_jsx(Spinner, { size: "small", sx: { width: 12, height: 12 } }), "Creating\u2026"] })) : ('—')] }), _jsxs(Box, { sx: { color: 'fg.muted', wordBreak: 'break-all' }, children: ["Runtime status:", ' ', runtimeStatusUrl ? (_jsx(Box, { as: "a", href: runtimeStatusUrl, target: "_blank", rel: "noopener noreferrer", sx: { color: 'accent.fg', textDecoration: 'underline' }, children: runtimeStatusUrl })) : ('n/a')] }), hasError && (_jsxs(Box, { sx: {
|
|
80
|
+
mt: 1,
|
|
81
|
+
p: 1,
|
|
82
|
+
border: '1px solid',
|
|
83
|
+
borderColor: 'danger.muted',
|
|
84
|
+
borderRadius: 2,
|
|
85
|
+
bg: 'danger.subtle',
|
|
86
|
+
color: 'danger.fg',
|
|
87
|
+
wordBreak: 'break-word',
|
|
88
|
+
}, children: ["Error: ", summary.error] }))] }))] }));
|
|
89
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type ReactComponentImplementation } from '@a2ui/react/v0_9';
|
|
2
|
+
import type { SurfaceModel } from '@a2ui/web_core/v0_9';
|
|
3
|
+
export interface A2uiSurfaceComposedProps {
|
|
4
|
+
surface: SurfaceModel<ReactComponentImplementation>;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Composed surface wrapper for all A2UI v0.9 consumers.
|
|
8
|
+
*
|
|
9
|
+
* This normalizes class names when upstream CSS modules are absent and applies
|
|
10
|
+
* basic semantic classes so application-level styles can consistently target
|
|
11
|
+
* rendered A2UI HTML.
|
|
12
|
+
*/
|
|
13
|
+
export declare function A2uiSurfaceComposed({ surface }: A2uiSurfaceComposedProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright (c) 2025-2026 Datalayer, Inc.
|
|
4
|
+
* Distributed under the terms of the Modified BSD License.
|
|
5
|
+
*/
|
|
6
|
+
import { useEffect, useRef } from 'react';
|
|
7
|
+
import { A2uiSurface, } from '@a2ui/react/v0_9';
|
|
8
|
+
function applyA2uiClassFallbacks(root) {
|
|
9
|
+
root.querySelectorAll('button').forEach(el => {
|
|
10
|
+
el.classList.remove('undefined');
|
|
11
|
+
const btn = el;
|
|
12
|
+
// Tab headers are not regular primary buttons: they need to convey which
|
|
13
|
+
// one is selected. Leave them to the `.a2ui-tab-button` scope styles and
|
|
14
|
+
// clear inline declarations so the class-driven active state can apply.
|
|
15
|
+
if (btn.classList.contains('a2ui-tab-button')) {
|
|
16
|
+
btn.style.removeProperty('background');
|
|
17
|
+
btn.style.removeProperty('border');
|
|
18
|
+
btn.style.removeProperty('color');
|
|
19
|
+
btn.style.removeProperty('border-radius');
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
// Choice-picker chips are toggle buttons whose selected/unselected state is
|
|
23
|
+
// driven by React (class `selected` + `aria-pressed`). Do NOT coerce them
|
|
24
|
+
// into primary buttons: React rewrites their className on every toggle,
|
|
25
|
+
// which would drop injected classes, and the observer does not watch
|
|
26
|
+
// attribute mutations. Let the `.chip` scope styles handle both states.
|
|
27
|
+
if (btn.classList.contains('chip')) {
|
|
28
|
+
btn.style.removeProperty('background');
|
|
29
|
+
btn.style.removeProperty('background-color');
|
|
30
|
+
btn.style.removeProperty('border');
|
|
31
|
+
btn.style.removeProperty('color');
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (!el.classList.contains('a2ui-button')) {
|
|
35
|
+
el.classList.add('a2ui-button');
|
|
36
|
+
}
|
|
37
|
+
if (!el.classList.contains('a2ui-button-primary')) {
|
|
38
|
+
el.classList.add('a2ui-button-primary');
|
|
39
|
+
}
|
|
40
|
+
// Ensure class-driven theming can react live to CSS variable changes by
|
|
41
|
+
// clearing any stale inline declarations from previous renders.
|
|
42
|
+
btn.style.removeProperty('background');
|
|
43
|
+
btn.style.removeProperty('border');
|
|
44
|
+
btn.style.removeProperty('color');
|
|
45
|
+
btn.style.removeProperty('border-radius');
|
|
46
|
+
btn.style.removeProperty('padding');
|
|
47
|
+
btn.style.removeProperty('font-weight');
|
|
48
|
+
btn.style.removeProperty('cursor');
|
|
49
|
+
});
|
|
50
|
+
root
|
|
51
|
+
.querySelectorAll("input[type='text'], input[type='number'], input[type='password'], input[type='datetime-local'], textarea")
|
|
52
|
+
.forEach(el => {
|
|
53
|
+
el.classList.remove('undefined');
|
|
54
|
+
if (!el.classList.contains('a2ui-textfield-input')) {
|
|
55
|
+
el.classList.add('a2ui-textfield-input');
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
root.querySelectorAll('label').forEach(el => {
|
|
59
|
+
el.classList.remove('undefined');
|
|
60
|
+
if (!el.classList.contains('a2ui-textfield-label')) {
|
|
61
|
+
el.classList.add('a2ui-textfield-label');
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
root.querySelectorAll('span').forEach(el => {
|
|
65
|
+
if (el.textContent && /invalid|required|error/i.test(el.textContent)) {
|
|
66
|
+
if (!el.classList.contains('a2ui-textfield-error')) {
|
|
67
|
+
el.classList.add('a2ui-textfield-error');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
root.querySelectorAll('.body, .caption').forEach(el => {
|
|
72
|
+
el.classList.remove('undefined');
|
|
73
|
+
if (!el.classList.contains('a2ui-text')) {
|
|
74
|
+
el.classList.add('a2ui-text');
|
|
75
|
+
}
|
|
76
|
+
if (el.classList.contains('caption') &&
|
|
77
|
+
!el.classList.contains('a2ui-caption')) {
|
|
78
|
+
el.classList.add('a2ui-caption');
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Composed surface wrapper for all A2UI v0.9 consumers.
|
|
84
|
+
*
|
|
85
|
+
* This normalizes class names when upstream CSS modules are absent and applies
|
|
86
|
+
* basic semantic classes so application-level styles can consistently target
|
|
87
|
+
* rendered A2UI HTML.
|
|
88
|
+
*/
|
|
89
|
+
export function A2uiSurfaceComposed({ surface }) {
|
|
90
|
+
const rootRef = useRef(null);
|
|
91
|
+
useEffect(() => {
|
|
92
|
+
const root = rootRef.current;
|
|
93
|
+
if (!root) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const apply = () => applyA2uiClassFallbacks(root);
|
|
97
|
+
apply();
|
|
98
|
+
const observer = new MutationObserver(() => {
|
|
99
|
+
apply();
|
|
100
|
+
});
|
|
101
|
+
observer.observe(root, {
|
|
102
|
+
childList: true,
|
|
103
|
+
subtree: true,
|
|
104
|
+
});
|
|
105
|
+
return () => {
|
|
106
|
+
observer.disconnect();
|
|
107
|
+
};
|
|
108
|
+
}, [surface]);
|
|
109
|
+
return (_jsx("div", { ref: rootRef, children: _jsx(A2uiSurface, { surface: surface }) }));
|
|
110
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { BetterSystemStyleObject } from '@primer/react';
|
|
2
|
+
/**
|
|
3
|
+
* Shared style scope for A2UI-rendered HTML.
|
|
4
|
+
*
|
|
5
|
+
* Uses A2UI CSS custom properties so consumers can drive visuals from their
|
|
6
|
+
* own theme system (Primer tokens, app-level variables, etc.).
|
|
7
|
+
*
|
|
8
|
+
* NOTE: This must be a plain style object (not the result of
|
|
9
|
+
* `@styled-system/css`), because it is consumed by spreading into a Primer
|
|
10
|
+
* `sx` prop (`sx={{ ...A2UI_RENDER_SCOPE_SX }}`). `css()` returns a *function*,
|
|
11
|
+
* which spreads to `{}` and silently drops every rule — leaving A2UI surfaces
|
|
12
|
+
* unthemed (browser-default grey, ignoring color mode).
|
|
13
|
+
*/
|
|
14
|
+
export declare const A2UI_RENDER_SCOPE_SX: BetterSystemStyleObject;
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2025-2026 Datalayer, Inc.
|
|
3
|
+
* Distributed under the terms of the Modified BSD License.
|
|
4
|
+
*/
|
|
5
|
+
const A2UI_INPUT_SELECTOR = '& .a2ui-textfield-input';
|
|
6
|
+
const A2UI_INPUT_FOCUS_SELECTOR = '& .a2ui-textfield-input:focus';
|
|
7
|
+
const A2UI_INPUT_HOVER_SELECTOR = '& .a2ui-textfield-input:hover';
|
|
8
|
+
/**
|
|
9
|
+
* Shared style scope for A2UI-rendered HTML.
|
|
10
|
+
*
|
|
11
|
+
* Uses A2UI CSS custom properties so consumers can drive visuals from their
|
|
12
|
+
* own theme system (Primer tokens, app-level variables, etc.).
|
|
13
|
+
*
|
|
14
|
+
* NOTE: This must be a plain style object (not the result of
|
|
15
|
+
* `@styled-system/css`), because it is consumed by spreading into a Primer
|
|
16
|
+
* `sx` prop (`sx={{ ...A2UI_RENDER_SCOPE_SX }}`). `css()` returns a *function*,
|
|
17
|
+
* which spreads to `{}` and silently drops every rule — leaving A2UI surfaces
|
|
18
|
+
* unthemed (browser-default grey, ignoring color mode).
|
|
19
|
+
*/
|
|
20
|
+
export const A2UI_RENDER_SCOPE_SX = {
|
|
21
|
+
// Icons render via `font-size: var(--a2ui-icon-size, …xl 24px)`. When the
|
|
22
|
+
// Material Symbols font is not loaded the raw name (e.g. "phone") shows as
|
|
23
|
+
// text; the 24px fallback makes those labels look larger than the adjacent
|
|
24
|
+
// values. Pin the icon size to the surrounding text size so they align.
|
|
25
|
+
'--a2ui-icon-size': '1em',
|
|
26
|
+
'& .a2ui-card': {
|
|
27
|
+
background: 'var(--a2ui-card-background, var(--a2ui-color-surface, #f6f8fa))',
|
|
28
|
+
border: '1px solid var(--a2ui-color-border, #d0d7de)',
|
|
29
|
+
borderRadius: 'var(--a2ui-card-border-radius, 12px)',
|
|
30
|
+
boxShadow: 'var(--a2ui-card-box-shadow, none)',
|
|
31
|
+
},
|
|
32
|
+
'& .a2ui-text': {
|
|
33
|
+
color: 'var(--a2ui-color-on-surface, var(--a2ui-color-on-background, #1f2328))',
|
|
34
|
+
margin: 0,
|
|
35
|
+
},
|
|
36
|
+
'& .a2ui-caption': {
|
|
37
|
+
color: 'var(--a2ui-text-caption-color, var(--a2ui-color-on-surface, #656d76))',
|
|
38
|
+
},
|
|
39
|
+
'& .a2ui-button': {
|
|
40
|
+
appearance: 'none',
|
|
41
|
+
cursor: 'pointer',
|
|
42
|
+
border: '1px solid var(--a2ui-color-primary, #1f883d)',
|
|
43
|
+
background: 'var(--a2ui-color-primary, #1f883d)',
|
|
44
|
+
color: 'var(--a2ui-color-on-primary, #ffffff)',
|
|
45
|
+
borderRadius: 'var(--a2ui-button-border-radius, 6px)',
|
|
46
|
+
padding: 'var(--a2ui-button-padding, 5px 16px)',
|
|
47
|
+
fontWeight: 'var(--a2ui-button-font-weight, 500)',
|
|
48
|
+
boxShadow: 'var(--a2ui-button-box-shadow, none)',
|
|
49
|
+
transition: 'background-color 0.15s ease, border-color 0.15s ease',
|
|
50
|
+
},
|
|
51
|
+
'& .a2ui-button:hover': {
|
|
52
|
+
background: 'var(--a2ui-color-primary-hover, #1a7f37)',
|
|
53
|
+
borderColor: 'var(--a2ui-color-primary-hover, #1a7f37)',
|
|
54
|
+
},
|
|
55
|
+
'& .a2ui-button:disabled': {
|
|
56
|
+
opacity: 0.6,
|
|
57
|
+
cursor: 'not-allowed',
|
|
58
|
+
},
|
|
59
|
+
'& .a2ui-tab-button': {
|
|
60
|
+
appearance: 'none',
|
|
61
|
+
background: 'transparent',
|
|
62
|
+
border: 'none',
|
|
63
|
+
borderBottom: '2px solid transparent',
|
|
64
|
+
borderRadius: 0,
|
|
65
|
+
marginBottom: '-1px',
|
|
66
|
+
padding: 'var(--a2ui-tab-padding, 8px 16px)',
|
|
67
|
+
color: 'var(--a2ui-tab-color, var(--a2ui-color-on-surface, #656d76))',
|
|
68
|
+
cursor: 'pointer',
|
|
69
|
+
fontFamily: 'inherit',
|
|
70
|
+
fontSize: 'var(--a2ui-font-size-sm, 14px)',
|
|
71
|
+
fontWeight: 500,
|
|
72
|
+
boxShadow: 'none',
|
|
73
|
+
transition: 'color 0.15s ease, border-color 0.15s ease, background-color 0.15s ease',
|
|
74
|
+
},
|
|
75
|
+
'& .a2ui-tab-button:hover': {
|
|
76
|
+
color: 'var(--a2ui-tab-color-hover, var(--a2ui-color-primary, #1f883d))',
|
|
77
|
+
background: 'var(--a2ui-tab-background-hover, var(--a2ui-color-surface, #f6f8fa))',
|
|
78
|
+
},
|
|
79
|
+
'& .a2ui-tab-button.active': {
|
|
80
|
+
color: 'var(--a2ui-tab-color-active, var(--a2ui-color-primary, #1f883d))',
|
|
81
|
+
borderBottomColor: 'var(--a2ui-tab-border-active, var(--a2ui-color-primary, #1f883d))',
|
|
82
|
+
fontWeight: 600,
|
|
83
|
+
},
|
|
84
|
+
'& .chip': {
|
|
85
|
+
appearance: 'none',
|
|
86
|
+
padding: 'var(--a2ui-choicepicker-chip-padding, 4px 12px)',
|
|
87
|
+
borderRadius: 'var(--a2ui-choicepicker-chip-border-radius, 999px)',
|
|
88
|
+
border: '1px solid var(--a2ui-color-border, #d0d7de)',
|
|
89
|
+
background: 'var(--a2ui-color-surface, #f6f8fa)',
|
|
90
|
+
color: 'var(--a2ui-color-on-surface, #1f2328)',
|
|
91
|
+
cursor: 'pointer',
|
|
92
|
+
fontFamily: 'inherit',
|
|
93
|
+
fontSize: 'var(--a2ui-font-size-sm, 14px)',
|
|
94
|
+
fontWeight: 500,
|
|
95
|
+
boxShadow: 'none',
|
|
96
|
+
transition: 'background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease',
|
|
97
|
+
},
|
|
98
|
+
'& .chip:hover': {
|
|
99
|
+
borderColor: 'var(--a2ui-color-border-hover, var(--a2ui-color-primary, #1f883d))',
|
|
100
|
+
},
|
|
101
|
+
'& .chip.selected, & .chip[aria-pressed="true"]': {
|
|
102
|
+
background: 'var(--a2ui-color-primary, #1f883d)',
|
|
103
|
+
borderColor: 'var(--a2ui-color-primary, #1f883d)',
|
|
104
|
+
color: 'var(--a2ui-color-on-primary, #ffffff)',
|
|
105
|
+
},
|
|
106
|
+
[A2UI_INPUT_SELECTOR]: {
|
|
107
|
+
width: '100%',
|
|
108
|
+
minHeight: 'var(--a2ui-control-height, 32px)',
|
|
109
|
+
boxSizing: 'border-box',
|
|
110
|
+
background: 'var(--a2ui-textfield-background, var(--a2ui-color-input, var(--a2ui-color-background, #ffffff)))',
|
|
111
|
+
color: 'var(--a2ui-textfield-color, var(--a2ui-color-on-input, var(--a2ui-color-on-background, #1f2328)))',
|
|
112
|
+
border: 'var(--a2ui-textfield-border, 1px solid var(--a2ui-color-border, #d0d7de))',
|
|
113
|
+
borderRadius: 'var(--a2ui-textfield-border-radius, 6px)',
|
|
114
|
+
padding: 'var(--a2ui-textfield-padding, 5px 12px)',
|
|
115
|
+
fontSize: 'var(--a2ui-font-size-sm, 14px)',
|
|
116
|
+
lineHeight: '20px',
|
|
117
|
+
transition: 'border-color 0.15s ease, box-shadow 0.15s ease',
|
|
118
|
+
},
|
|
119
|
+
[A2UI_INPUT_HOVER_SELECTOR]: {
|
|
120
|
+
borderColor: 'var(--a2ui-textfield-color-border-hover, var(--a2ui-color-border-hover, #8c959f))',
|
|
121
|
+
},
|
|
122
|
+
[A2UI_INPUT_FOCUS_SELECTOR]: {
|
|
123
|
+
outline: 'none',
|
|
124
|
+
borderColor: 'var(--a2ui-textfield-color-border-focus, var(--a2ui-color-primary, #1f883d))',
|
|
125
|
+
boxShadow: '0 0 0 3px color-mix(in srgb, var(--a2ui-color-primary, #1f883d) 25%, transparent)',
|
|
126
|
+
},
|
|
127
|
+
'& .a2ui-textfield-label': {
|
|
128
|
+
color: 'var(--a2ui-textfield-label-color, var(--a2ui-color-on-surface, var(--a2ui-color-on-background, #1f2328)))',
|
|
129
|
+
fontWeight: 600,
|
|
130
|
+
fontSize: 'var(--a2ui-font-size-xs, 12px)',
|
|
131
|
+
marginBottom: 'var(--a2ui-spacing-xxs, 4px)',
|
|
132
|
+
display: 'inline-block',
|
|
133
|
+
},
|
|
134
|
+
'& .a2ui-textfield-error': {
|
|
135
|
+
color: 'var(--a2ui-textfield-color-error, #d1242f)',
|
|
136
|
+
fontSize: 'var(--a2ui-font-size-xs, 12px)',
|
|
137
|
+
marginTop: 'var(--a2ui-spacing-xs, 4px)',
|
|
138
|
+
},
|
|
139
|
+
'& input[type="checkbox"]': {
|
|
140
|
+
accentColor: 'var(--a2ui-color-primary, #1f883d)',
|
|
141
|
+
},
|
|
142
|
+
};
|