@datalayer/agent-runtimes 1.0.10 → 1.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +82 -1
- package/lib/{AgentLexical.d.ts → AgentDocument.d.ts} +5 -5
- package/lib/{AgentLexical.js → AgentDocument.js} +156 -26
- package/lib/AgentNode.js +32 -31
- package/lib/AgentNotebook.js +172 -17
- package/lib/AppExamples2.css +47 -0
- package/lib/AppExamples2.d.ts +3 -0
- package/lib/AppExamples2.js +21 -0
- package/lib/{agent-lexical-main.js → agent-document-main.js} +2 -2
- package/lib/agents/AgentRuntimeChat.d.ts +73 -0
- package/lib/agents/AgentRuntimeChat.js +198 -0
- package/lib/api/index.d.ts +12 -0
- package/lib/api/index.js +46 -0
- package/lib/api/runtimes/checkpoints.d.ts +122 -0
- package/lib/api/runtimes/checkpoints.js +118 -0
- package/lib/api/runtimes/environments.d.ts +9 -0
- package/lib/api/runtimes/environments.js +29 -0
- package/lib/api/runtimes/healthz.d.ts +15 -0
- package/lib/api/runtimes/healthz.js +44 -0
- package/lib/api/runtimes/index.d.ts +12 -0
- package/lib/api/runtimes/index.js +16 -0
- package/lib/api/runtimes/runtimes.d.ts +138 -0
- package/lib/api/runtimes/runtimes.js +230 -0
- package/lib/api/runtimes/snapshots.d.ts +38 -0
- package/lib/api/runtimes/snapshots.js +82 -0
- package/lib/api/scheduler/index.d.ts +6 -0
- package/lib/api/scheduler/index.js +10 -0
- package/lib/api/scheduler/schedules.d.ts +85 -0
- package/lib/api/scheduler/schedules.js +78 -0
- package/lib/api/spacer/documents.d.ts +12 -0
- package/lib/api/spacer/documents.js +43 -0
- package/lib/api/spacer/healthz.d.ts +15 -0
- package/lib/api/spacer/healthz.js +44 -0
- package/lib/api/spacer/index.d.ts +15 -0
- package/lib/api/spacer/index.js +19 -0
- package/lib/api/spacer/items.d.ts +25 -0
- package/lib/api/spacer/items.js +55 -0
- package/lib/api/spacer/lexicals.d.ts +34 -0
- package/lib/api/spacer/lexicals.js +89 -0
- package/lib/api/spacer/notebooks.d.ts +34 -0
- package/lib/api/spacer/notebooks.js +89 -0
- package/lib/api/spacer/spaces.d.ts +84 -0
- package/lib/api/spacer/spaces.js +170 -0
- package/lib/api/spacer/users.d.ts +9 -0
- package/lib/api/spacer/users.js +29 -0
- package/lib/chat/Chat.d.ts +1 -1
- package/lib/chat/Chat.js +54 -54
- package/lib/chat/ChatFloating.d.ts +2 -2
- package/lib/chat/ChatFloating.js +136 -25
- package/lib/chat/ChatSidebar.js +20 -22
- package/lib/chat/base/ChatBase.js +429 -39
- package/lib/chat/display/EmptyState.js +21 -21
- package/lib/chat/document/EphemeralDocument.d.ts +23 -0
- package/lib/chat/document/EphemeralDocument.js +270 -0
- package/lib/chat/header/ChatHeaderBase.d.ts +12 -2
- package/lib/chat/header/ChatHeaderBase.js +78 -23
- package/lib/chat/index.d.ts +1 -0
- package/lib/chat/index.js +2 -0
- package/lib/chat/notebook/EphemeralNotebook.d.ts +24 -0
- package/lib/chat/notebook/EphemeralNotebook.js +252 -0
- package/lib/chat/prompt/InputFooter.js +4 -1
- package/lib/client/AgentRuntimesClient.d.ts +127 -0
- package/lib/client/AgentRuntimesClient.js +36 -0
- package/lib/client/AgentsMixin.js +28 -28
- package/lib/client/SdkAgentRuntimesClient.d.ts +1 -1
- package/lib/client/SdkAgentRuntimesClient.js +1 -1
- package/lib/client/mixins/RuntimesMixin.d.ts +93 -0
- package/lib/client/mixins/RuntimesMixin.js +229 -0
- package/lib/client/mixins/SpacerMixin.d.ts +210 -0
- package/lib/client/mixins/SpacerMixin.js +615 -0
- package/lib/client/utils/spacerUtils.d.ts +18 -0
- package/lib/client/utils/spacerUtils.js +32 -0
- package/lib/collaboration/DatalayerCollaboration.d.ts +13 -0
- package/lib/collaboration/DatalayerCollaboration.js +28 -0
- package/lib/collaboration/DatalayerCollaborationProvider.d.ts +58 -0
- package/lib/collaboration/DatalayerCollaborationProvider.js +148 -0
- package/lib/collaboration/index.d.ts +2 -0
- package/lib/collaboration/index.js +6 -0
- package/lib/components/AgentSummary.d.ts +19 -0
- package/lib/components/AgentSummary.js +89 -0
- package/lib/components/a2ui/A2uiSurfaceComposed.d.ts +13 -0
- package/lib/components/a2ui/A2uiSurfaceComposed.js +110 -0
- package/lib/components/a2ui/index.d.ts +2 -0
- package/lib/components/a2ui/index.js +6 -0
- package/lib/components/a2ui/styles.d.ts +14 -0
- package/lib/components/a2ui/styles.js +142 -0
- package/lib/components/context/SpaceSelect.d.ts +2 -0
- package/lib/components/context/SpaceSelect.js +42 -0
- package/lib/components/flashes/FlashDisclaimer.d.ts +2 -0
- package/lib/components/flashes/FlashDisclaimer.js +17 -0
- package/lib/components/icons/ArtifactIcon.d.ts +10 -0
- package/lib/components/icons/ArtifactIcon.js +58 -0
- package/lib/components/icons/index.d.ts +1 -0
- package/lib/components/icons/index.js +5 -0
- package/lib/components/index.d.ts +5 -0
- package/lib/components/index.js +5 -0
- package/lib/components/nbgrader/NbGradesDetails.d.ts +5 -0
- package/lib/components/nbgrader/NbGradesDetails.js +19 -0
- package/lib/components/nbgrader/index.d.ts +1 -0
- package/lib/components/nbgrader/index.js +5 -0
- package/lib/components/progress/CreditsIndicator.d.ts +33 -0
- package/lib/components/progress/CreditsIndicator.js +23 -0
- package/lib/components/progress/index.d.ts +2 -0
- package/lib/components/progress/index.js +6 -0
- package/lib/components/runtimes/RuntimeCellVariables.d.ts +39 -0
- package/lib/components/runtimes/RuntimeCellVariables.js +172 -0
- package/lib/components/runtimes/RuntimeCellVariablesDialog.d.ts +37 -0
- package/lib/components/runtimes/RuntimeCellVariablesDialog.js +101 -0
- package/lib/components/runtimes/RuntimeLauncherDialog.d.ts +57 -0
- package/lib/components/runtimes/RuntimeLauncherDialog.js +275 -0
- package/lib/components/runtimes/RuntimePickerBase.d.ts +69 -0
- package/lib/components/runtimes/RuntimePickerBase.js +122 -0
- package/lib/components/runtimes/RuntimePickerCell.d.ts +34 -0
- package/lib/components/runtimes/RuntimePickerCell.js +104 -0
- package/lib/components/runtimes/RuntimePickerNotebook.d.ts +42 -0
- package/lib/components/runtimes/RuntimePickerNotebook.js +232 -0
- package/lib/components/runtimes/RuntimeReservationControl.d.ts +47 -0
- package/lib/components/runtimes/RuntimeReservationControl.js +42 -0
- package/lib/components/runtimes/RuntimeSimplePicker.d.ts +38 -0
- package/lib/components/runtimes/RuntimeSimplePicker.js +155 -0
- package/lib/components/runtimes/RuntimeTransfer.d.ts +16 -0
- package/lib/components/runtimes/RuntimeTransfer.js +5 -0
- package/lib/components/runtimes/RuntimeUtils.d.ts +17 -0
- package/lib/components/runtimes/RuntimeUtils.js +178 -0
- package/lib/components/runtimes/RuntimeVariables.d.ts +38 -0
- package/lib/components/runtimes/RuntimeVariables.js +75 -0
- package/lib/components/runtimes/index.d.ts +11 -0
- package/lib/components/runtimes/index.js +15 -0
- package/lib/components/scheduler/ScheduleMenu.d.ts +54 -0
- package/lib/components/scheduler/ScheduleMenu.js +154 -0
- package/lib/components/scheduler/index.d.ts +1 -0
- package/lib/components/scheduler/index.js +5 -0
- package/lib/components/snapshots/SandboxSnapshotMenu.d.ts +33 -0
- package/lib/components/snapshots/SandboxSnapshotMenu.js +169 -0
- package/lib/components/snapshots/index.d.ts +1 -0
- package/lib/components/snapshots/index.js +5 -0
- package/lib/components/snippets/SnippetDialog.d.ts +42 -0
- package/lib/components/snippets/SnippetDialog.js +42 -0
- package/lib/components/students/StudentItemStatus.d.ts +7 -0
- package/lib/components/students/StudentItemStatus.js +68 -0
- package/lib/components/students/index.d.ts +1 -0
- package/lib/components/students/index.js +5 -0
- package/lib/components/tokens/SpaceVariantToken.d.ts +5 -0
- package/lib/components/tokens/SpaceVariantToken.js +23 -0
- package/lib/components/tokens/index.d.ts +1 -0
- package/lib/components/tokens/index.js +5 -0
- package/lib/components/toolbars/AssignmentEditorToolbar.d.ts +4 -0
- package/lib/components/toolbars/AssignmentEditorToolbar.js +18 -0
- package/lib/components/toolbars/DocumentEditorToolbar.d.ts +2 -0
- package/lib/components/toolbars/DocumentEditorToolbar.js +12 -0
- package/lib/components/toolbars/NotebookEditorToolbar.d.ts +29 -0
- package/lib/components/toolbars/NotebookEditorToolbar.js +30 -0
- package/lib/context/ContextInspector.d.ts +1 -14
- package/lib/context/ContextInspector.js +3 -73
- package/lib/context/CostUsageChart.d.ts +4 -3
- package/lib/context/CostUsageChart.js +236 -35
- package/lib/context/MessageHistory.d.ts +30 -0
- package/lib/context/MessageHistory.js +129 -0
- package/lib/context/TokenUsageChart.d.ts +4 -3
- package/lib/context/TokenUsageChart.js +180 -30
- package/lib/context/TurnGraphChart.d.ts +1 -1
- package/lib/context/TurnGraphChart.js +6 -6
- package/lib/examples/A2UiAgentExample.d.ts +22 -0
- package/lib/examples/A2UiAgentExample.js +442 -0
- package/lib/examples/A2UiComponentsGalleryExample.d.ts +3 -0
- package/lib/examples/A2UiComponentsGalleryExample.js +863 -0
- package/lib/examples/A2UiContactCardExample.js +9 -5
- package/lib/examples/A2UiRestaurantExample.js +23 -8
- package/lib/examples/A2UiViewerExample.js +75 -3
- package/lib/examples/AgUiAgenticExample.d.ts +1 -12
- package/lib/examples/AgUiAgenticExample.js +52 -8
- package/lib/examples/AgUiBackendToolRenderingExample.d.ts +1 -16
- package/lib/examples/AgUiBackendToolRenderingExample.js +32 -17
- package/lib/examples/AgUiHaikuGenUiExample.d.ts +1 -17
- package/lib/examples/AgUiHaikuGenUiExample.js +49 -33
- package/lib/examples/AgUiHumanInTheLoopExample.d.ts +1 -12
- package/lib/examples/AgUiHumanInTheLoopExample.js +21 -6
- package/lib/examples/AgUiSharedStateExample.d.ts +1 -14
- package/lib/examples/AgUiSharedStateExample.js +21 -6
- package/lib/examples/AgUiToolsBasedGenUiExample.d.ts +1 -14
- package/lib/examples/AgUiToolsBasedGenUiExample.js +21 -6
- package/lib/examples/AgentCheckpointsExample.d.ts +1 -1
- package/lib/examples/AgentCheckpointsExample.js +9 -10
- package/lib/examples/AgentCodemodeExample.js +3 -3
- package/lib/examples/AgentEvalsExample.js +5 -5
- package/lib/examples/AgentGuardrailsExample.js +17 -12
- package/lib/examples/AgentHooksExample.js +14 -55
- package/lib/examples/AgentInferenceProviderExample.js +4 -4
- package/lib/examples/AgentLoopExample.d.ts +10 -0
- package/lib/examples/AgentLoopExample.js +304 -0
- package/lib/examples/AgentMCPExample.js +7 -7
- package/lib/examples/AgentMemoryExample.js +4 -4
- package/lib/examples/AgentMonitoringExample.js +114 -44
- package/lib/examples/AgentNotificationsExample.js +4 -4
- package/lib/examples/AgentOtelExample.d.ts +3 -3
- package/lib/examples/AgentOtelExample.js +15 -10
- package/lib/examples/AgentOutputsExample.js +6 -6
- package/lib/examples/AgentParametersExample.js +21 -33
- package/lib/examples/AgentSandboxExample.js +5 -5
- package/lib/examples/AgentSkillsExample.js +7 -7
- package/lib/examples/AgentSubagentsExample.js +4 -4
- package/lib/examples/AgentToolApprovalsExample.js +5 -5
- package/lib/examples/AgentTriggersExample.js +9 -9
- package/lib/examples/AgentspecsExample.js +63 -41
- package/lib/examples/ChatCustomExample.js +23 -77
- package/lib/examples/ChatExample.js +13 -44
- package/lib/examples/LexicalAgentExample.js +43 -91
- package/lib/examples/LexicalAgentSidebarExample.js +45 -73
- package/lib/examples/NotebookAgentExample.js +52 -81
- package/lib/examples/NotebookAgentSidebarExample.js +43 -71
- package/lib/examples/NotebookCollaborationExample.js +11 -9
- package/lib/examples/NotebookExample.js +5 -2
- package/lib/examples/components/AuthRequiredView.js +1 -1
- package/lib/examples/components/ExampleErrorBoundary.d.ts +46 -0
- package/lib/examples/components/ExampleErrorBoundary.js +67 -0
- package/lib/examples/components/haiku/haiku-card.css +11 -0
- package/lib/examples/components/weather/weather-card.css +11 -0
- package/lib/examples/example-selector.js +3 -1
- package/lib/examples/hooks/useExampleAgentRuntime.d.ts +35 -0
- package/lib/examples/hooks/useExampleAgentRuntime.js +82 -0
- package/lib/examples/hooks/useSpecRenderToolResult.d.ts +30 -0
- package/lib/examples/hooks/useSpecRenderToolResult.js +61 -0
- package/lib/examples/index.d.ts +3 -1
- package/lib/examples/index.js +3 -1
- package/lib/examples/main.js +340 -93
- package/lib/examples/utils/a2ui.d.ts +2 -0
- package/lib/examples/utils/a2ui.js +97 -2
- package/lib/examples/utils/agentSummaryStore.d.ts +21 -0
- package/lib/examples/utils/agentSummaryStore.js +23 -0
- package/lib/examples/utils/notebooks/Empty.ipynb.json +30 -30
- package/lib/examples/utils/runtimeTargetStore.d.ts +9 -0
- package/lib/examples/utils/runtimeTargetStore.js +27 -0
- package/lib/examples/utils/teardownAgents.d.ts +13 -0
- package/lib/examples/utils/teardownAgents.js +78 -0
- package/lib/examples/utils/useExampleAgentRuntimesUrl.d.ts +2 -0
- package/lib/examples/utils/useExampleAgentRuntimesUrl.js +26 -7
- package/lib/examples2/CellExample.d.ts +6 -0
- package/lib/examples2/CellExample.js +20 -0
- package/lib/examples2/DatalayerNotebookExample.d.ts +16 -0
- package/lib/examples2/DatalayerNotebookExample.js +109 -0
- package/lib/examples2/NativeNavigationExample.d.ts +8 -0
- package/lib/examples2/NativeNavigationExample.js +97 -0
- package/lib/examples2/NotebookExample.d.ts +6 -0
- package/lib/examples2/NotebookExample.js +19 -0
- package/lib/examples2/NotebookMutationsKernel.d.ts +2 -0
- package/lib/examples2/NotebookMutationsKernel.js +105 -0
- package/lib/examples2/NotebookMutationsServiceManager.d.ts +2 -0
- package/lib/examples2/NotebookMutationsServiceManager.js +109 -0
- package/lib/examples2/ReactRouterExample.d.ts +6 -0
- package/lib/examples2/ReactRouterExample.js +175 -0
- package/lib/examples2/example-selector.d.ts +22 -0
- package/lib/examples2/example-selector.js +45 -0
- package/lib/examples2/index.d.ts +2 -0
- package/lib/examples2/index.js +6 -0
- package/lib/examples2/lexical-theme.css +436 -0
- package/lib/examples2/main.d.ts +2 -0
- package/lib/examples2/main.js +330 -0
- package/lib/examples2/notebooks/IPyWidgetsExample.ipynb.json +101 -0
- package/lib/examples2/notebooks/IPyWidgetsExampleWithState.ipynb.json +112 -0
- package/lib/examples2/notebooks/Lite.ipynb.json +128 -0
- package/lib/examples2/notebooks/Matplotlib.ipynb.json +137 -0
- package/lib/examples2/notebooks/NotebookExample1.ipynb.json +126 -0
- package/lib/examples2/notebooks/NotebookExample2.ipynb.json +48 -0
- package/lib/examples2/notebooks/NotebookOutputs.ipynb.json +49 -0
- package/lib/examples2/notebooks/NotebookToCExample.ipynb.json +102 -0
- package/lib/examples2/notebooks/OutputIPyWidgetsExample.d.ts +145 -0
- package/lib/examples2/notebooks/OutputIPyWidgetsExample.js +153 -0
- package/lib/examples2/notebooks/PyGWalker.ipynb.json +55 -0
- package/lib/hooks/index.d.ts +9 -1
- package/lib/hooks/index.js +13 -1
- package/lib/hooks/useAIAgentsWebSocket.d.ts +1 -1
- package/lib/hooks/useAIAgentsWebSocket.js +39 -3
- package/lib/hooks/useAgentRuntimes.d.ts +15 -3
- package/lib/hooks/useAgentRuntimes.js +186 -27
- package/lib/hooks/useAgentsService.js +5 -5
- package/lib/hooks/useCellOutputshot.d.ts +4 -0
- package/lib/hooks/useCellOutputshot.js +25 -0
- package/lib/hooks/useCheckpoints.d.ts +8 -8
- package/lib/hooks/useCheckpoints.js +36 -26
- package/lib/hooks/useConfig.d.ts +1 -1
- package/lib/hooks/useMonitoring.d.ts +7 -5
- package/lib/hooks/useMonitoring.js +16 -10
- package/lib/hooks/useNotifications.d.ts +11 -11
- package/lib/hooks/useNotifications.js +1 -1
- package/lib/hooks/useProgressStore.d.ts +25 -0
- package/lib/hooks/useProgressStore.js +58 -0
- package/lib/hooks/useProgressTask.d.ts +9 -0
- package/lib/hooks/useProgressTask.js +41 -0
- package/lib/hooks/useProjects.d.ts +628 -0
- package/lib/hooks/useProjects.js +190 -0
- package/lib/hooks/useRuntimes.d.ts +5 -0
- package/lib/hooks/useRuntimes.js +34 -0
- package/lib/hooks/useToolApprovals.d.ts +6 -6
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/jupyter/exec/Python.d.ts +5 -0
- package/lib/jupyter/exec/Python.js +100 -0
- package/lib/jupyter/exec/Snippets.d.ts +105 -0
- package/lib/jupyter/exec/Snippets.js +101 -0
- package/lib/jupyter/exec/index.d.ts +2 -0
- package/lib/jupyter/exec/index.js +6 -0
- package/lib/jupyter/index.d.ts +2 -0
- package/lib/jupyter/index.js +6 -0
- package/lib/jupyter/kernelsHandler.d.ts +8 -0
- package/lib/jupyter/kernelsHandler.js +39 -0
- package/lib/mocks/models/CourseMock.d.ts +6 -0
- package/lib/mocks/models/CourseMock.js +29 -0
- package/lib/mocks/models/SpaceMock.d.ts +6 -0
- package/lib/mocks/models/SpaceMock.js +25 -0
- package/lib/models/Assignment.d.ts +7 -0
- package/lib/models/Assignment.js +5 -0
- package/lib/models/Cell.d.ts +8 -0
- package/lib/models/Cell.js +5 -0
- package/lib/models/CodeBlock.d.ts +10 -0
- package/lib/models/CodeBlock.js +5 -0
- package/lib/models/CodeSandboxSnapshot.d.ts +92 -0
- package/lib/models/CodeSandboxSnapshot.js +13 -0
- package/lib/models/CodeSandboxSnapshotDTO.d.ts +173 -0
- package/lib/models/CodeSandboxSnapshotDTO.js +139 -0
- package/lib/models/CodefeedBlocks.d.ts +7 -0
- package/lib/models/CodefeedBlocks.js +5 -0
- package/lib/models/Content.d.ts +5 -0
- package/lib/models/Content.js +5 -0
- package/lib/models/Course.d.ts +17 -0
- package/lib/models/Course.js +5 -0
- package/lib/models/Dataset.d.ts +16 -0
- package/lib/models/Dataset.js +5 -0
- package/lib/models/Document.d.ts +8 -0
- package/lib/models/Document.js +5 -0
- package/lib/models/Environment.d.ts +86 -0
- package/lib/models/Environment.js +5 -0
- package/lib/models/EnvironmentDTO.d.ts +125 -0
- package/lib/models/EnvironmentDTO.js +88 -0
- package/lib/models/Exercise.d.ts +16 -0
- package/lib/models/Exercise.js +5 -0
- package/lib/models/Item.d.ts +20 -0
- package/lib/models/Item.js +5 -0
- package/lib/models/ItemDTO.d.ts +74 -0
- package/lib/models/ItemDTO.js +186 -0
- package/lib/models/ItemType.d.ts +2 -0
- package/lib/models/ItemType.js +5 -0
- package/lib/models/Lesson.d.ts +5 -0
- package/lib/models/Lesson.js +5 -0
- package/lib/models/LexicalDTO.d.ts +155 -0
- package/lib/models/LexicalDTO.js +157 -0
- package/lib/models/Library.d.ts +10 -0
- package/lib/models/Library.js +5 -0
- package/lib/models/Notebook.d.ts +11 -0
- package/lib/models/Notebook.js +5 -0
- package/lib/models/NotebookDTO.d.ts +96 -0
- package/lib/models/NotebookDTO.js +153 -0
- package/lib/models/Page.d.ts +41 -0
- package/lib/models/Page.js +25 -0
- package/lib/models/PageTag.d.ts +19 -0
- package/lib/models/PageTag.js +94 -0
- package/lib/models/ProjectDTO.d.ts +89 -0
- package/lib/models/ProjectDTO.js +131 -0
- package/lib/models/Runtime.d.ts +160 -0
- package/lib/models/Runtime.js +18 -0
- package/lib/models/RuntimeDTO.d.ts +172 -0
- package/lib/models/RuntimeDTO.js +204 -0
- package/lib/models/Space.d.ts +35 -0
- package/lib/models/Space.js +66 -0
- package/lib/models/SpaceDTO.d.ts +334 -0
- package/lib/models/SpaceDTO.js +244 -0
- package/lib/models/SpaceItem.d.ts +10 -0
- package/lib/models/SpaceItem.js +5 -0
- package/lib/models/SpaceMember.d.ts +6 -0
- package/lib/models/SpaceMember.js +5 -0
- package/lib/models/StudentItem.d.ts +21 -0
- package/lib/models/StudentItem.js +5 -0
- package/lib/models/index.d.ts +32 -0
- package/lib/models/index.js +39 -0
- package/lib/protocols/AGUIAdapter.js +1 -1
- package/lib/runtimes/actions.d.ts +102 -0
- package/lib/runtimes/actions.js +249 -0
- package/lib/runtimes/apis.d.ts +273 -0
- package/lib/runtimes/apis.js +5 -0
- package/lib/runtimes/index.d.ts +5 -0
- package/lib/runtimes/index.js +9 -0
- package/lib/runtimes/settings.d.ts +15 -0
- package/lib/runtimes/settings.js +31 -0
- package/lib/runtimes/snapshots.d.ts +25 -0
- package/lib/runtimes/snapshots.js +150 -0
- package/lib/runtimes/utils.d.ts +7 -0
- package/lib/runtimes/utils.js +14 -0
- package/lib/services/DatalayerServiceManager.d.ts +23 -0
- package/lib/services/DatalayerServiceManager.js +90 -0
- package/lib/services/reconnectToRuntime.d.ts +32 -0
- package/lib/services/reconnectToRuntime.js +59 -0
- package/lib/services/sandboxServiceManagers.d.ts +31 -0
- package/lib/services/sandboxServiceManagers.js +57 -0
- package/lib/specs/agents/agents.d.ts +70 -26
- package/lib/specs/agents/agents.js +3994 -1639
- package/lib/specs/index.d.ts +1 -0
- package/lib/specs/index.js +1 -0
- package/lib/specs/loops.d.ts +34 -0
- package/lib/specs/loops.js +188 -0
- package/lib/specs/mcpServers.d.ts +1 -0
- package/lib/specs/mcpServers.js +17 -0
- package/lib/specs/models.d.ts +4 -0
- package/lib/specs/models.js +30 -0
- package/lib/specs/skills.d.ts +1 -0
- package/lib/specs/skills.js +18 -0
- package/lib/specs/tools.d.ts +15 -0
- package/lib/specs/tools.js +285 -0
- package/lib/state/index.d.ts +4 -0
- package/lib/state/index.js +10 -0
- package/lib/state/substates/CellState.d.ts +12 -0
- package/lib/state/substates/CellState.js +22 -0
- package/lib/state/substates/DocumentState.d.ts +10 -0
- package/lib/state/substates/DocumentState.js +14 -0
- package/lib/state/substates/GradeState.d.ts +10 -0
- package/lib/state/substates/GradeState.js +14 -0
- package/lib/state/substates/JupyterLabState.d.ts +16 -0
- package/lib/state/substates/JupyterLabState.js +17 -0
- package/lib/state/substates/NbformatState.d.ts +13 -0
- package/lib/state/substates/NbformatState.js +16 -0
- package/lib/state/substates/RuntimesState.d.ts +87 -0
- package/lib/state/substates/RuntimesState.js +192 -0
- package/lib/state/substates/SpaceState.d.ts +11 -0
- package/lib/state/substates/SpaceState.js +16 -0
- package/lib/state/substates/index.d.ts +8 -0
- package/lib/state/substates/index.js +14 -0
- package/lib/stores/agentRuntimeStore.d.ts +25 -2
- package/lib/stores/agentRuntimeStore.js +114 -19
- package/lib/stories/Button.stories.d.ts +1 -1
- package/lib/stories/Header.stories.d.ts +3 -3
- package/lib/test-setup.js +10 -0
- package/lib/types/agents-lifecycle.d.ts +5 -5
- package/lib/types/agents.d.ts +3 -3
- package/lib/types/agentspecs.d.ts +3 -1
- package/lib/types/chat.d.ts +135 -3
- package/lib/types/config.d.ts +19 -1
- package/lib/types/index.d.ts +1 -0
- package/lib/types/index.js +1 -0
- package/lib/types/loops.d.ts +64 -0
- package/lib/types/loops.js +5 -0
- package/lib/types/tools.d.ts +16 -0
- package/lib/utils/Cells.d.ts +2 -0
- package/lib/utils/Cells.js +28 -0
- package/package.json +24 -18
- package/scripts/codegen/__pycache__/versioning.cpython-313.pyc +0 -0
- package/scripts/codegen/generate_agents.py +21 -4
- package/scripts/codegen/generate_loops.py +443 -0
- package/lib/examples/A2UiComponentGalleryExample.d.ts +0 -3
- package/lib/examples/A2UiComponentGalleryExample.js +0 -361
- /package/lib/{agent-lexical-main.d.ts → agent-document-main.d.ts} +0 -0
|
@@ -7,6 +7,7 @@ import { useEffect, useMemo, useRef, useState } from 'react';
|
|
|
7
7
|
import ReactECharts from 'echarts-for-react';
|
|
8
8
|
import { buildOtelWebSocketUrl } from '@datalayer/core/lib/otel';
|
|
9
9
|
import { toMetricValue } from '../hooks/useMonitoring';
|
|
10
|
+
import { fetchOtelMetricRows } from '../hooks/useMonitoring';
|
|
10
11
|
import { subscribeOtelWs } from './otelWsPool';
|
|
11
12
|
import { agentRuntimeStore, getMonitoringCacheKey, useAgentRuntimeStore, } from '../stores/agentRuntimeStore';
|
|
12
13
|
const COST_RUN_METRIC = 'agent_runtimes.capability.cost.run.usd';
|
|
@@ -89,9 +90,7 @@ function extractCostPoints(rows, agentId) {
|
|
|
89
90
|
const metricName = row.metric_name;
|
|
90
91
|
return (metricName === COST_CUMULATIVE_METRIC || metricName === COST_RUN_METRIC);
|
|
91
92
|
});
|
|
92
|
-
|
|
93
|
-
filtered = filtered.filter(row => extractAgentId(row) === agentId);
|
|
94
|
-
}
|
|
93
|
+
filtered = filtered.filter(row => agentIdMatches(row, agentId));
|
|
95
94
|
const byTimestamp = new Map();
|
|
96
95
|
for (const row of filtered) {
|
|
97
96
|
const ts = rowTimestampKey(row);
|
|
@@ -111,22 +110,31 @@ function extractCostPoints(rows, agentId) {
|
|
|
111
110
|
});
|
|
112
111
|
for (const [, groupRows] of sorted) {
|
|
113
112
|
const cumulativeRows = groupRows.filter(r => r.metric_name === COST_CUMULATIVE_METRIC);
|
|
114
|
-
if (cumulativeRows.length === 0)
|
|
115
|
-
continue;
|
|
116
113
|
const runRows = groupRows.filter(r => r.metric_name === COST_RUN_METRIC);
|
|
117
|
-
|
|
118
|
-
// rows for the same timestamp should not be summed; keep the highest value.
|
|
119
|
-
const cumulativeUsd = cumulativeRows.reduce((max, row) => Math.max(max, toMetricValue(row)), 0);
|
|
120
|
-
const costUsd = runRows.reduce((sum, row) => sum + toMetricValue(row), 0);
|
|
121
|
-
if (!Number.isFinite(cumulativeUsd) || !Number.isFinite(costUsd))
|
|
114
|
+
if (cumulativeRows.length === 0 && runRows.length === 0)
|
|
122
115
|
continue;
|
|
123
|
-
|
|
116
|
+
// Resolve the running total for this timestamp. Preference order:
|
|
117
|
+
// 1. `agent.cost.cumulative_usd` attribute — the exact tracked total,
|
|
118
|
+
// emitted on both the run counter and the cumulative histogram and
|
|
119
|
+
// independent of the exporter's temporality.
|
|
120
|
+
// 2. The `cost.run.usd` counter value — exported with cumulative
|
|
121
|
+
// temporality, so each data point already holds the running total.
|
|
122
|
+
// 3. The cumulative histogram metric value (least reliable, since a
|
|
123
|
+
// histogram `sum` aggregates every recorded observation).
|
|
124
|
+
const attrCumulative = maxDefined(groupRows, extractCumulativeAttr);
|
|
125
|
+
const runCumulative = maxDefined(runRows, finiteMetricValue);
|
|
126
|
+
const histogramCumulative = maxDefined(cumulativeRows, finiteMetricValue);
|
|
127
|
+
const cumulativeUsd = attrCumulative ?? runCumulative ?? histogramCumulative ?? 0;
|
|
128
|
+
if (!Number.isFinite(cumulativeUsd))
|
|
129
|
+
continue;
|
|
130
|
+
const anchorRow = cumulativeRows[0] ?? runRows[0];
|
|
131
|
+
const timestampKey = rowTimestampKey(anchorRow);
|
|
124
132
|
if (!timestampKey)
|
|
125
133
|
continue;
|
|
126
134
|
points.push({
|
|
127
135
|
timestampKey,
|
|
128
|
-
timestampMs: rowTimestampMs(
|
|
129
|
-
costUsd,
|
|
136
|
+
timestampMs: rowTimestampMs(anchorRow),
|
|
137
|
+
costUsd: cumulativeUsd,
|
|
130
138
|
cumulativeUsd,
|
|
131
139
|
});
|
|
132
140
|
}
|
|
@@ -140,7 +148,7 @@ function extractServiceName(row) {
|
|
|
140
148
|
return candidate;
|
|
141
149
|
}
|
|
142
150
|
}
|
|
143
|
-
const resourceAttributes = row.resource_attributes;
|
|
151
|
+
const resourceAttributes = parseResourceAttributes(row.resource_attributes);
|
|
144
152
|
if (resourceAttributes && typeof resourceAttributes === 'object') {
|
|
145
153
|
const nested = resourceAttributes['service.name'];
|
|
146
154
|
if (typeof nested === 'string' && nested.length > 0) {
|
|
@@ -149,6 +157,75 @@ function extractServiceName(row) {
|
|
|
149
157
|
}
|
|
150
158
|
return undefined;
|
|
151
159
|
}
|
|
160
|
+
function parseResourceAttributes(attrs) {
|
|
161
|
+
if (attrs && typeof attrs === 'object' && !Array.isArray(attrs)) {
|
|
162
|
+
return attrs;
|
|
163
|
+
}
|
|
164
|
+
if (typeof attrs === 'string') {
|
|
165
|
+
try {
|
|
166
|
+
const parsed = JSON.parse(attrs);
|
|
167
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
168
|
+
return parsed;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
// Ignore malformed resource attributes payloads.
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return {};
|
|
176
|
+
}
|
|
177
|
+
function extractRuntimeId(row) {
|
|
178
|
+
const directCandidates = [
|
|
179
|
+
row.runtime_id,
|
|
180
|
+
row.runtime,
|
|
181
|
+
row.pod_name,
|
|
182
|
+
row.k8s_pod_name,
|
|
183
|
+
];
|
|
184
|
+
for (const candidate of directCandidates) {
|
|
185
|
+
if (typeof candidate === 'string' && candidate.trim().length > 0) {
|
|
186
|
+
return candidate.trim();
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
const parsedAttrs = parseAttributes(row.attributes);
|
|
190
|
+
const attrs = parsedAttrs &&
|
|
191
|
+
typeof parsedAttrs === 'object' &&
|
|
192
|
+
!Array.isArray(parsedAttrs)
|
|
193
|
+
? parsedAttrs
|
|
194
|
+
: {};
|
|
195
|
+
const attrCandidates = [
|
|
196
|
+
attrs['runtime.id'],
|
|
197
|
+
attrs['runtime.pod_name'],
|
|
198
|
+
attrs['k8s.pod.name'],
|
|
199
|
+
];
|
|
200
|
+
for (const candidate of attrCandidates) {
|
|
201
|
+
if (typeof candidate === 'string' && candidate.trim().length > 0) {
|
|
202
|
+
return candidate.trim();
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
const resourceAttributes = parseResourceAttributes(row.resource_attributes);
|
|
206
|
+
const resourceCandidates = [
|
|
207
|
+
resourceAttributes['runtime.id'],
|
|
208
|
+
resourceAttributes['runtime.pod_name'],
|
|
209
|
+
resourceAttributes['k8s.pod.name'],
|
|
210
|
+
];
|
|
211
|
+
for (const candidate of resourceCandidates) {
|
|
212
|
+
if (typeof candidate === 'string' && candidate.trim().length > 0) {
|
|
213
|
+
return candidate.trim();
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return undefined;
|
|
217
|
+
}
|
|
218
|
+
function rowMatchesSource(row, serviceName, runtimeId) {
|
|
219
|
+
const resolvedServiceName = String(serviceName || '').trim();
|
|
220
|
+
const resolvedRuntimeId = String(runtimeId || '').trim();
|
|
221
|
+
if (!resolvedServiceName && !resolvedRuntimeId) {
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
const serviceMatches = resolvedServiceName.length > 0 &&
|
|
225
|
+
extractServiceName(row) === resolvedServiceName;
|
|
226
|
+
const runtimeMatches = resolvedRuntimeId.length > 0 && extractRuntimeId(row) === resolvedRuntimeId;
|
|
227
|
+
return serviceMatches || runtimeMatches;
|
|
228
|
+
}
|
|
152
229
|
/** Extract `agent.id` from span/trace attributes. */
|
|
153
230
|
function extractAgentId(row) {
|
|
154
231
|
const attrs = parseAttributes(row.attributes);
|
|
@@ -157,11 +234,56 @@ function extractAgentId(row) {
|
|
|
157
234
|
return aid;
|
|
158
235
|
return undefined;
|
|
159
236
|
}
|
|
160
|
-
|
|
237
|
+
/**
|
|
238
|
+
* Extract the exact cumulative cost (USD) carried on the metric attributes as
|
|
239
|
+
* `agent.cost.cumulative_usd`. This is emitted on every cost metric and is the
|
|
240
|
+
* authoritative running total regardless of the exporter's temporality.
|
|
241
|
+
*/
|
|
242
|
+
function extractCumulativeAttr(row) {
|
|
243
|
+
const attrs = parseAttributes(row.attributes);
|
|
244
|
+
const candidate = attrs['agent.cost.cumulative_usd'];
|
|
245
|
+
if (typeof candidate === 'number' && Number.isFinite(candidate)) {
|
|
246
|
+
return candidate;
|
|
247
|
+
}
|
|
248
|
+
if (typeof candidate === 'string') {
|
|
249
|
+
const parsed = Number(candidate);
|
|
250
|
+
if (Number.isFinite(parsed))
|
|
251
|
+
return parsed;
|
|
252
|
+
}
|
|
253
|
+
return undefined;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Match a metric row against the requested agent. Rows fetched from the
|
|
257
|
+
* normalized metrics endpoint can arrive without attributes (so `agent.id`
|
|
258
|
+
* is unknown); those are kept because the service/runtime scope already
|
|
259
|
+
* narrows the data to this runtime's agent.
|
|
260
|
+
*/
|
|
261
|
+
function agentIdMatches(row, agentId) {
|
|
262
|
+
if (!agentId)
|
|
263
|
+
return true;
|
|
264
|
+
const rowAgentId = extractAgentId(row);
|
|
265
|
+
return rowAgentId === undefined || rowAgentId === agentId;
|
|
266
|
+
}
|
|
267
|
+
/** `toMetricValue` guarded to only return finite numbers. */
|
|
268
|
+
function finiteMetricValue(row) {
|
|
269
|
+
const value = toMetricValue(row);
|
|
270
|
+
return Number.isFinite(value) ? value : undefined;
|
|
271
|
+
}
|
|
272
|
+
/** Reduce rows to the maximum value produced by `selector`, ignoring gaps. */
|
|
273
|
+
function maxDefined(rows, selector) {
|
|
274
|
+
return rows.reduce((max, row) => {
|
|
275
|
+
const value = selector(row);
|
|
276
|
+
if (value === undefined)
|
|
277
|
+
return max;
|
|
278
|
+
return max === undefined ? value : Math.max(max, value);
|
|
279
|
+
}, undefined);
|
|
280
|
+
}
|
|
281
|
+
export function CostUsageChart({ serviceName, agentId, runtimeId, apiKey, datalayerUrl, wsUrl, liveCumulativeUsd, liveTimestampMs, height = 160, }) {
|
|
282
|
+
const cacheServiceKey = String(serviceName || runtimeId || '').trim() || undefined;
|
|
161
283
|
const monitoringCache = useAgentRuntimeStore(s => s.monitoringCache);
|
|
162
284
|
const mergeCostPoints = useAgentRuntimeStore(s => s.mergeCostPoints);
|
|
163
285
|
const upsertLocalCostPoint = useAgentRuntimeStore(s => s.upsertLocalCostPoint);
|
|
164
|
-
const cachedEntry = useMemo(() => resolveMonitoringEntry(monitoringCache,
|
|
286
|
+
const cachedEntry = useMemo(() => resolveMonitoringEntry(monitoringCache, cacheServiceKey, agentId), [agentId, cacheServiceKey, monitoringCache]);
|
|
165
287
|
const [points, setPoints] = useState([]);
|
|
166
288
|
const initialTimestampMsRef = useRef(Date.now());
|
|
167
289
|
const mergePoints = (existing, incoming) => {
|
|
@@ -196,16 +318,87 @@ export function CostUsageChart({ serviceName, agentId, apiKey, runUrl, wsRunUrl,
|
|
|
196
318
|
};
|
|
197
319
|
// ── Reset state on source switch ──────────────────────────────
|
|
198
320
|
useEffect(() => {
|
|
199
|
-
if (!
|
|
321
|
+
if (!cacheServiceKey) {
|
|
200
322
|
setPoints([]);
|
|
201
323
|
return;
|
|
202
324
|
}
|
|
203
325
|
setPoints((cachedEntry?.costPoints ?? []).map(localPointToCostPoint));
|
|
204
326
|
initialTimestampMsRef.current = Date.now();
|
|
205
|
-
}, [agentId,
|
|
327
|
+
}, [agentId, cacheServiceKey, cachedEntry]);
|
|
328
|
+
// Bootstrap chart with existing OTEL cost metrics before websocket updates.
|
|
329
|
+
useEffect(() => {
|
|
330
|
+
if (!cacheServiceKey || !apiKey || !datalayerUrl) {
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
let cancelled = false;
|
|
334
|
+
const loadInitialMetrics = async () => {
|
|
335
|
+
try {
|
|
336
|
+
const [runRows, cumulativeRows] = await Promise.all([
|
|
337
|
+
fetchOtelMetricRows({
|
|
338
|
+
metric: COST_RUN_METRIC,
|
|
339
|
+
serviceName,
|
|
340
|
+
datalayerUrl,
|
|
341
|
+
apiKey,
|
|
342
|
+
limit: 1000,
|
|
343
|
+
}),
|
|
344
|
+
fetchOtelMetricRows({
|
|
345
|
+
metric: COST_CUMULATIVE_METRIC,
|
|
346
|
+
serviceName,
|
|
347
|
+
datalayerUrl,
|
|
348
|
+
apiKey,
|
|
349
|
+
limit: 1000,
|
|
350
|
+
}),
|
|
351
|
+
]);
|
|
352
|
+
if (cancelled) {
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
const rows = [...runRows, ...cumulativeRows].filter(row => {
|
|
356
|
+
const castedRow = row;
|
|
357
|
+
if (!rowMatchesSource(castedRow, serviceName, runtimeId)) {
|
|
358
|
+
return false;
|
|
359
|
+
}
|
|
360
|
+
return agentIdMatches(castedRow, agentId);
|
|
361
|
+
});
|
|
362
|
+
const initialPoints = extractCostPoints(rows, agentId);
|
|
363
|
+
if (cancelled || initialPoints.length === 0) {
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
mergeCostPoints({
|
|
367
|
+
serviceName: cacheServiceKey,
|
|
368
|
+
agentId,
|
|
369
|
+
points: initialPoints.map(point => ({
|
|
370
|
+
timestampMs: point.timestampMs,
|
|
371
|
+
cumulativeUsd: point.cumulativeUsd,
|
|
372
|
+
})),
|
|
373
|
+
});
|
|
374
|
+
const mergedEntry = resolveMonitoringEntry(agentRuntimeStore.getState().monitoringCache, cacheServiceKey, agentId);
|
|
375
|
+
if (mergedEntry) {
|
|
376
|
+
setPoints(mergedEntry.costPoints.map(localPointToCostPoint));
|
|
377
|
+
}
|
|
378
|
+
else {
|
|
379
|
+
setPoints(initialPoints);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
catch {
|
|
383
|
+
// Fail open: websocket updates can still populate the chart.
|
|
384
|
+
}
|
|
385
|
+
};
|
|
386
|
+
void loadInitialMetrics();
|
|
387
|
+
return () => {
|
|
388
|
+
cancelled = true;
|
|
389
|
+
};
|
|
390
|
+
}, [
|
|
391
|
+
agentId,
|
|
392
|
+
apiKey,
|
|
393
|
+
cacheServiceKey,
|
|
394
|
+
datalayerUrl,
|
|
395
|
+
mergeCostPoints,
|
|
396
|
+
runtimeId,
|
|
397
|
+
serviceName,
|
|
398
|
+
]);
|
|
206
399
|
// Apply immediate post-turn updates from the monitoring websocket snapshot.
|
|
207
400
|
useEffect(() => {
|
|
208
|
-
if (!
|
|
401
|
+
if (!cacheServiceKey)
|
|
209
402
|
return;
|
|
210
403
|
if (typeof liveCumulativeUsd !== 'number' ||
|
|
211
404
|
!Number.isFinite(liveCumulativeUsd)) {
|
|
@@ -221,12 +414,12 @@ export function CostUsageChart({ serviceName, agentId, apiKey, runUrl, wsRunUrl,
|
|
|
221
414
|
cumulativeUsd: Math.max(0, liveCumulativeUsd),
|
|
222
415
|
};
|
|
223
416
|
upsertLocalCostPoint({
|
|
224
|
-
serviceName,
|
|
417
|
+
serviceName: cacheServiceKey,
|
|
225
418
|
agentId,
|
|
226
419
|
timestampMs,
|
|
227
420
|
cumulativeUsd: livePoint.cumulativeUsd,
|
|
228
421
|
});
|
|
229
|
-
const mergedEntry = resolveMonitoringEntry(agentRuntimeStore.getState().monitoringCache,
|
|
422
|
+
const mergedEntry = resolveMonitoringEntry(agentRuntimeStore.getState().monitoringCache, cacheServiceKey, agentId);
|
|
230
423
|
if (mergedEntry) {
|
|
231
424
|
setPoints(mergedEntry.costPoints.map(localPointToCostPoint));
|
|
232
425
|
}
|
|
@@ -235,6 +428,7 @@ export function CostUsageChart({ serviceName, agentId, apiKey, runUrl, wsRunUrl,
|
|
|
235
428
|
}
|
|
236
429
|
}, [
|
|
237
430
|
agentId,
|
|
431
|
+
cacheServiceKey,
|
|
238
432
|
liveCumulativeUsd,
|
|
239
433
|
liveTimestampMs,
|
|
240
434
|
serviceName,
|
|
@@ -242,10 +436,10 @@ export function CostUsageChart({ serviceName, agentId, apiKey, runUrl, wsRunUrl,
|
|
|
242
436
|
]);
|
|
243
437
|
// ── WebSocket subscription (shared connection pool) ─────────
|
|
244
438
|
useEffect(() => {
|
|
245
|
-
if (!
|
|
439
|
+
if (!cacheServiceKey || !apiKey)
|
|
246
440
|
return;
|
|
247
|
-
const rawBaseUrl =
|
|
248
|
-
|
|
441
|
+
const rawBaseUrl = wsUrl ||
|
|
442
|
+
datalayerUrl ||
|
|
249
443
|
(typeof window !== 'undefined' ? window.location.origin : '');
|
|
250
444
|
if (!rawBaseUrl)
|
|
251
445
|
return;
|
|
@@ -258,9 +452,9 @@ export function CostUsageChart({ serviceName, agentId, apiKey, runUrl, wsRunUrl,
|
|
|
258
452
|
window.location.protocol === 'https:'
|
|
259
453
|
? 'https:'
|
|
260
454
|
: 'http:'}//${typeof window !== 'undefined' ? window.location.host : ''}${rawBaseUrl}`;
|
|
261
|
-
let
|
|
455
|
+
let resolvedWsUrl;
|
|
262
456
|
try {
|
|
263
|
-
|
|
457
|
+
resolvedWsUrl = buildOtelWebSocketUrl({
|
|
264
458
|
baseUrl: baseWithProtocol,
|
|
265
459
|
token: apiKey,
|
|
266
460
|
});
|
|
@@ -268,28 +462,26 @@ export function CostUsageChart({ serviceName, agentId, apiKey, runUrl, wsRunUrl,
|
|
|
268
462
|
catch {
|
|
269
463
|
return;
|
|
270
464
|
}
|
|
271
|
-
const unsubscribe = subscribeOtelWs(
|
|
465
|
+
const unsubscribe = subscribeOtelWs(resolvedWsUrl, msg => {
|
|
272
466
|
if (msg.signal !== 'metrics')
|
|
273
467
|
return;
|
|
274
468
|
const rows = Array.isArray(msg.data) ? msg.data : [];
|
|
275
|
-
let matchingRows = rows.filter(row =>
|
|
276
|
-
//
|
|
277
|
-
|
|
278
|
-
matchingRows = matchingRows.filter(row => extractAgentId(row) === agentId);
|
|
279
|
-
}
|
|
469
|
+
let matchingRows = rows.filter(row => rowMatchesSource(row, serviceName, runtimeId));
|
|
470
|
+
// Keep rows for this agent (or rows without an agent.id attribute).
|
|
471
|
+
matchingRows = matchingRows.filter(row => agentIdMatches(row, agentId));
|
|
280
472
|
if (matchingRows.length === 0)
|
|
281
473
|
return;
|
|
282
474
|
const newPoints = extractCostPoints(matchingRows, agentId);
|
|
283
475
|
if (newPoints.length > 0) {
|
|
284
476
|
mergeCostPoints({
|
|
285
|
-
serviceName,
|
|
477
|
+
serviceName: cacheServiceKey,
|
|
286
478
|
agentId,
|
|
287
479
|
points: newPoints.map(point => ({
|
|
288
480
|
timestampMs: point.timestampMs,
|
|
289
481
|
cumulativeUsd: point.cumulativeUsd,
|
|
290
482
|
})),
|
|
291
483
|
});
|
|
292
|
-
const mergedEntry = resolveMonitoringEntry(agentRuntimeStore.getState().monitoringCache,
|
|
484
|
+
const mergedEntry = resolveMonitoringEntry(agentRuntimeStore.getState().monitoringCache, cacheServiceKey, agentId);
|
|
293
485
|
if (mergedEntry) {
|
|
294
486
|
setPoints(mergedEntry.costPoints.map(localPointToCostPoint));
|
|
295
487
|
}
|
|
@@ -299,7 +491,16 @@ export function CostUsageChart({ serviceName, agentId, apiKey, runUrl, wsRunUrl,
|
|
|
299
491
|
}
|
|
300
492
|
});
|
|
301
493
|
return unsubscribe;
|
|
302
|
-
}, [
|
|
494
|
+
}, [
|
|
495
|
+
agentId,
|
|
496
|
+
apiKey,
|
|
497
|
+
cacheServiceKey,
|
|
498
|
+
mergeCostPoints,
|
|
499
|
+
datalayerUrl,
|
|
500
|
+
runtimeId,
|
|
501
|
+
serviceName,
|
|
502
|
+
wsUrl,
|
|
503
|
+
]);
|
|
303
504
|
// ── Chart options ─────────────────────────────────────────────
|
|
304
505
|
const option = useMemo(() => {
|
|
305
506
|
const chartData = points.length > 0
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message detail from API.
|
|
3
|
+
*/
|
|
4
|
+
export interface MessageDetail {
|
|
5
|
+
role: string;
|
|
6
|
+
content: string;
|
|
7
|
+
estimatedTokens: number;
|
|
8
|
+
timestamp: string | null;
|
|
9
|
+
inContext: boolean;
|
|
10
|
+
toolName: string | null;
|
|
11
|
+
toolCallId: string | null;
|
|
12
|
+
isToolCall: boolean;
|
|
13
|
+
isToolResult: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Single message detail view.
|
|
17
|
+
*/
|
|
18
|
+
export declare function MessageDetailView({ message }: {
|
|
19
|
+
message: MessageDetail;
|
|
20
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
export interface MessageHistoryProps {
|
|
22
|
+
/** Full ordered list of conversation messages. */
|
|
23
|
+
messages: MessageDetail[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Renders the conversation message history split into out-of-context and
|
|
27
|
+
* in-context groups.
|
|
28
|
+
*/
|
|
29
|
+
export declare function MessageHistory({ messages }: MessageHistoryProps): import("react/jsx-runtime").JSX.Element;
|
|
30
|
+
export default MessageHistory;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
// Copyright (c) 2025-2026 Datalayer, Inc.
|
|
3
|
+
// Distributed under the terms of the Modified BSD License.
|
|
4
|
+
/**
|
|
5
|
+
* MessageHistory component - Renders the agent conversation message history,
|
|
6
|
+
* splitting messages into "in context" and "out of context" groups. Shared by
|
|
7
|
+
* the ContextInspector (Configuration tab) and the Monitoring tab so both
|
|
8
|
+
* surfaces display identical message details.
|
|
9
|
+
*/
|
|
10
|
+
import { Text, Label } from '@primer/react';
|
|
11
|
+
import { Box } from '@datalayer/primer-addons';
|
|
12
|
+
import { AiModelIcon, TerminalIcon, CommentDiscussionIcon, CheckCircleIcon, XCircleIcon, InfoIcon, ChevronDownIcon, ChevronRightIcon, } from '@primer/octicons-react';
|
|
13
|
+
import { useMemo, useState } from 'react';
|
|
14
|
+
import { TextPart } from '../chat/parts/TextPart';
|
|
15
|
+
/**
|
|
16
|
+
* Format token count for display.
|
|
17
|
+
*/
|
|
18
|
+
function formatTokens(tokens) {
|
|
19
|
+
if (tokens >= 1000000) {
|
|
20
|
+
return `${(tokens / 1000000).toFixed(1)}M`;
|
|
21
|
+
}
|
|
22
|
+
if (tokens >= 1000) {
|
|
23
|
+
return `${(tokens / 1000).toFixed(1)}K`;
|
|
24
|
+
}
|
|
25
|
+
return tokens.toString();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Single message detail view.
|
|
29
|
+
*/
|
|
30
|
+
export function MessageDetailView({ message }) {
|
|
31
|
+
const roleColors = {
|
|
32
|
+
user: 'accent.fg',
|
|
33
|
+
assistant: 'success.fg',
|
|
34
|
+
system: 'attention.fg',
|
|
35
|
+
tool: 'done.fg',
|
|
36
|
+
};
|
|
37
|
+
const roleIcons = {
|
|
38
|
+
user: CommentDiscussionIcon,
|
|
39
|
+
assistant: AiModelIcon,
|
|
40
|
+
system: InfoIcon,
|
|
41
|
+
tool: TerminalIcon,
|
|
42
|
+
};
|
|
43
|
+
const RoleIcon = roleIcons[message.role] || CommentDiscussionIcon;
|
|
44
|
+
const text = String(message.content || '');
|
|
45
|
+
const chatRole = message.role === 'user' ? 'user' : 'assistant';
|
|
46
|
+
const uiMessage = {
|
|
47
|
+
id: `history-${message.role}-${message.timestamp || 'now'}-${message.toolCallId || 'no-tool'}`,
|
|
48
|
+
role: chatRole,
|
|
49
|
+
parts: [{ type: 'text', text }],
|
|
50
|
+
};
|
|
51
|
+
return (_jsxs(Box, { sx: {
|
|
52
|
+
p: 2,
|
|
53
|
+
mb: 1,
|
|
54
|
+
bg: message.inContext ? 'canvas.default' : 'canvas.inset',
|
|
55
|
+
border: '1px solid',
|
|
56
|
+
borderColor: message.inContext ? 'border.default' : 'border.muted',
|
|
57
|
+
borderRadius: 2,
|
|
58
|
+
opacity: message.inContext ? 1 : 0.7,
|
|
59
|
+
}, children: [_jsxs(Box, { sx: { display: 'flex', alignItems: 'center', gap: 2, mb: 1 }, children: [_jsx(RoleIcon, { size: 14 }), _jsx(Text, { sx: {
|
|
60
|
+
fontWeight: 'semibold',
|
|
61
|
+
fontSize: 0,
|
|
62
|
+
color: roleColors[message.role] || 'fg.default',
|
|
63
|
+
textTransform: 'capitalize',
|
|
64
|
+
}, children: message.role }), message.toolName && (_jsx(Label, { size: "small", variant: "secondary", children: message.toolName })), message.isToolCall && (_jsx(Label, { size: "small", variant: "accent", children: "call" })), message.isToolResult && (_jsx(Label, { size: "small", variant: "success", children: "result" })), message.inContext ? (_jsx(CheckCircleIcon, { size: 12, fill: "var(--fgColor-success)" })) : (_jsx(XCircleIcon, { size: 12, fill: "var(--fgColor-muted)" })), _jsxs(Text, { sx: { fontSize: 0, color: 'fg.muted', ml: 'auto' }, children: [formatTokens(message.estimatedTokens), " tokens"] })] }), _jsx(Box, { sx: {
|
|
65
|
+
borderWidth: '2px',
|
|
66
|
+
borderStyle: 'solid',
|
|
67
|
+
borderColor: 'border.default',
|
|
68
|
+
borderRadius: 2,
|
|
69
|
+
overflow: 'hidden',
|
|
70
|
+
}, children: _jsx(TextPart, { text: text, message: uiMessage, isLastPart: false, onRegenerate: () => {
|
|
71
|
+
return;
|
|
72
|
+
} }) })] }));
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Renders the conversation message history split into out-of-context and
|
|
76
|
+
* in-context groups.
|
|
77
|
+
*/
|
|
78
|
+
export function MessageHistory({ messages }) {
|
|
79
|
+
const [expanded, setExpanded] = useState(false);
|
|
80
|
+
const { inContextMessages, outOfContextMessages } = useMemo(() => {
|
|
81
|
+
if (!messages) {
|
|
82
|
+
return { inContextMessages: [], outOfContextMessages: [] };
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
inContextMessages: messages.filter(m => m.inContext),
|
|
86
|
+
outOfContextMessages: messages.filter(m => !m.inContext),
|
|
87
|
+
};
|
|
88
|
+
}, [messages]);
|
|
89
|
+
const messageHistoryTokens = useMemo(() => {
|
|
90
|
+
if (!messages) {
|
|
91
|
+
return 0;
|
|
92
|
+
}
|
|
93
|
+
return messages.reduce((sum, message) => sum + (message.estimatedTokens || 0), 0);
|
|
94
|
+
}, [messages]);
|
|
95
|
+
return (_jsxs(Box, { sx: { mb: 2 }, children: [_jsxs(Box, { as: "button", onClick: () => setExpanded(!expanded), sx: {
|
|
96
|
+
display: 'flex',
|
|
97
|
+
alignItems: 'center',
|
|
98
|
+
gap: 2,
|
|
99
|
+
width: '100%',
|
|
100
|
+
p: 2,
|
|
101
|
+
bg: 'canvas.subtle',
|
|
102
|
+
border: '1px solid',
|
|
103
|
+
borderColor: 'border.default',
|
|
104
|
+
borderRadius: 2,
|
|
105
|
+
cursor: 'pointer',
|
|
106
|
+
'&:hover': {
|
|
107
|
+
bg: 'canvas.inset',
|
|
108
|
+
},
|
|
109
|
+
}, children: [expanded ? (_jsx(ChevronDownIcon, { size: 16 })) : (_jsx(ChevronRightIcon, { size: 16 })), _jsx(CommentDiscussionIcon, { size: 16 }), _jsx(Text, { sx: { fontWeight: 'semibold', flex: 1, textAlign: 'left' }, children: "Message History" }), _jsx(Label, { variant: "secondary", size: "small", children: messages?.length || 0 }), messageHistoryTokens > 0 && (_jsxs(Text, { sx: { fontSize: 0, color: 'fg.muted' }, children: [formatTokens(messageHistoryTokens), " tokens"] }))] }), expanded && (_jsx(Box, { sx: {
|
|
110
|
+
border: '1px solid',
|
|
111
|
+
borderColor: 'border.default',
|
|
112
|
+
borderTop: 'none',
|
|
113
|
+
borderRadius: '0 0 6px 6px',
|
|
114
|
+
p: 2,
|
|
115
|
+
}, children: !messages || messages.length === 0 ? (_jsx(Text, { sx: { color: 'fg.muted', fontSize: 1 }, children: "No messages yet" })) : (_jsxs(_Fragment, { children: [outOfContextMessages.length > 0 && (_jsxs(Box, { sx: { mb: 3 }, children: [_jsxs(Text, { sx: {
|
|
116
|
+
fontWeight: 'semibold',
|
|
117
|
+
fontSize: 1,
|
|
118
|
+
color: 'fg.muted',
|
|
119
|
+
mb: 2,
|
|
120
|
+
display: 'block',
|
|
121
|
+
}, children: ["Out of Context (", outOfContextMessages.length, ")"] }), outOfContextMessages.map((msg, idx) => (_jsx(MessageDetailView, { message: msg }, `out-${idx}`)))] })), inContextMessages.length > 0 && (_jsxs(Box, { children: [_jsxs(Text, { sx: {
|
|
122
|
+
fontWeight: 'semibold',
|
|
123
|
+
fontSize: 1,
|
|
124
|
+
color: 'success.fg',
|
|
125
|
+
mb: 2,
|
|
126
|
+
display: 'block',
|
|
127
|
+
}, children: ["In Context (", inContextMessages.length, ")"] }), inContextMessages.map((msg, idx) => (_jsx(MessageDetailView, { message: msg }, `in-${idx}`)))] }))] })) }))] }));
|
|
128
|
+
}
|
|
129
|
+
export default MessageHistory;
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
export interface TokenUsageChartProps {
|
|
2
2
|
serviceName?: string;
|
|
3
3
|
agentId?: string;
|
|
4
|
+
runtimeId?: string;
|
|
4
5
|
apiKey?: string;
|
|
5
|
-
|
|
6
|
-
|
|
6
|
+
datalayerUrl?: string;
|
|
7
|
+
wsUrl?: string;
|
|
7
8
|
liveSystemPromptTokens?: number;
|
|
8
9
|
liveToolsDescriptionTokens?: number;
|
|
9
10
|
liveUserMessageTokens?: number;
|
|
@@ -13,5 +14,5 @@ export interface TokenUsageChartProps {
|
|
|
13
14
|
height?: number;
|
|
14
15
|
days?: number;
|
|
15
16
|
}
|
|
16
|
-
export declare function TokenUsageChart({ serviceName, agentId, apiKey,
|
|
17
|
+
export declare function TokenUsageChart({ serviceName, agentId, runtimeId, apiKey, datalayerUrl, wsUrl, liveSystemPromptTokens, liveToolsDescriptionTokens, liveUserMessageTokens, liveAgentMessageTokens, liveToolsUsageTokens, liveTimestampMs, height, }: TokenUsageChartProps): import("react/jsx-runtime").JSX.Element;
|
|
17
18
|
export default TokenUsageChart;
|