@datalayer/agent-runtimes 1.3.88 → 1.3.90
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/lib/Agent.js +2 -18
- package/lib/AgentDocument.js +5 -55
- package/lib/AgentNode.js +31 -208
- package/lib/AgentNotebook.js +5 -59
- package/lib/agent-node/AgentNodeGallery.js +23 -111
- package/lib/agents/AgentDetails.js +36 -274
- package/lib/agents/AgentRuntimeChat.js +1 -8
- package/lib/chat/Chat.js +7 -46
- package/lib/chat/ChatFloating.js +15 -100
- package/lib/chat/ChatInline.js +5 -47
- package/lib/chat/ChatPopupStandalone.js +5 -53
- package/lib/chat/ChatSidebar.js +4 -51
- package/lib/chat/ChatStandalone.js +4 -45
- package/lib/chat/EphemeralSurfaceControl.js +5 -25
- package/lib/chat/assistant/AssistantContextMenu.d.ts +8 -0
- package/lib/chat/assistant/AssistantContextMenu.js +17 -1
- package/lib/chat/assistant/AssistantStage.js +6 -25
- package/lib/chat/assistant/BalloonParts.js +8 -40
- package/lib/chat/assistant/BalloonVisual.js +2 -2
- package/lib/chat/assistant/ConversationBalloon.js +2 -11
- package/lib/chat/assistant/DecisionAsk.js +3 -3
- package/lib/chat/assistant/SandboxDetailsDialog.js +3 -17
- package/lib/chat/assistant/SpeechBalloon.js +14 -78
- package/lib/chat/base/ChatBase.js +37 -172
- package/lib/chat/display/EmptyState.js +7 -35
- package/lib/chat/display/FloatingBrandButton.js +4 -34
- package/lib/chat/display/PoweredByTag.js +3 -14
- package/lib/chat/document/EphemeralDocument.js +3 -18
- package/lib/chat/header/ChatHeader.js +1 -17
- package/lib/chat/header/ChatHeaderBase.js +2 -24
- package/lib/chat/header/ChatViewModeToggle.js +7 -29
- package/lib/chat/indicators/McpStatusIndicator.js +3 -12
- package/lib/chat/indicators/SandboxStatusIndicator.js +6 -34
- package/lib/chat/indicators/SkillsStatusIndicator.js +3 -12
- package/lib/chat/indicators/TypingDots.js +1 -11
- package/lib/chat/messages/ChatMessageList.js +58 -185
- package/lib/chat/messages/ChatMessages.js +15 -79
- package/lib/chat/messages/FormSubmissionMessage.js +2 -33
- package/lib/chat/messages/NotebookToolSurfaces.js +12 -41
- package/lib/chat/messages/TurnFooter.js +4 -10
- package/lib/chat/notebook/EphemeralNotebook.js +2 -10
- package/lib/chat/parts/ReasoningPart.js +2 -16
- package/lib/chat/parts/TextPart.js +2 -12
- package/lib/chat/parts/ToolPart.js +16 -90
- package/lib/chat/presence/Presence.js +5 -33
- package/lib/chat/prompt/FloatingCard.js +1 -13
- package/lib/chat/prompt/InputPrompt.js +1 -6
- package/lib/chat/prompt/InputPromptBase.js +4 -17
- package/lib/chat/prompt/InputPromptLexical.js +44 -45
- package/lib/chat/prompt/InputPromptText.js +1 -1
- package/lib/chat/prompt/footer/InPromptFooter.js +1 -8
- package/lib/chat/prompt/menus/AgentsMenu.js +1 -1
- package/lib/chat/prompt/menus/InlineAgentsMenu.js +1 -1
- package/lib/chat/prompt/menus/ModelSelector.js +1 -5
- package/lib/chat/prompt/menus/SkillsMenu.js +3 -30
- package/lib/chat/prompt/menus/SuggestionsMenu.js +1 -1
- package/lib/chat/prompt/menus/ToolsMenu.js +4 -48
- package/lib/chat/prompt/plugins/AgentMentionPlugin.js +2 -9
- package/lib/chat/prompt/plugins/CommandPlugin.js +2 -9
- package/lib/chat/prompt/plugins/MentionChip.js +1 -15
- package/lib/chat/prompt/stack.js +1 -19
- package/lib/chat/tools/A2AAgentDialog.js +9 -42
- package/lib/chat/tools/SubagentActivity.js +5 -22
- package/lib/chat/tools/ToolApprovalBanner.js +4 -34
- package/lib/chat/tools/ToolApprovalDialog.js +4 -19
- package/lib/chat/tools/ToolCallDisplay.js +12 -97
- package/lib/chat/usage/ContextPie.js +4 -45
- package/lib/components/a2ui/datalayer/Chart.js +4 -10
- package/lib/components/a2ui/datalayer/Chat.js +2 -10
- package/lib/components/a2ui/datalayer/Download.js +1 -1
- package/lib/components/a2ui/datalayer/Evidence.js +1 -15
- package/lib/components/a2ui/datalayer/FileUpload.js +1 -12
- package/lib/components/a2ui/datalayer/Table.js +9 -17
- package/lib/components/a2ui/datalayer/formWidgets.js +3 -2
- package/lib/components/a2ui/datalayer/parts.js +1 -16
- package/lib/components/agents/AgentSummary.js +1 -51
- package/lib/components/cards/NotificationEventCard.js +6 -72
- package/lib/components/cards/OutputCard.js +4 -48
- package/lib/components/cards/ToolApprovalCard.js +2 -35
- package/lib/components/code-sandboxes/CodeSandboxCellVariables.js +1 -1
- package/lib/components/code-sandboxes/CodeSandboxEnvironmentSelect.js +4 -14
- package/lib/components/code-sandboxes/CodeSandboxPicker.js +16 -21
- package/lib/components/code-sandboxes/CodeSandboxVariables.js +2 -2
- package/lib/components/scheduler/ScheduleMenu.js +5 -10
- package/lib/components/specs/SpecPayloadPreview.js +1 -26
- package/lib/components/teams/A2ATeamGraph.d.ts +4 -3
- package/lib/components/teams/A2ATeamGraph.js +25 -71
- package/lib/components/teams/AnswerSurfacesView.js +2 -2
- package/lib/components/teams/NotebookPreview.js +1 -10
- package/lib/components/teams/NotebookPreviewView.js +2 -3
- package/lib/components/teams/SceneTranscript.js +3 -17
- package/lib/components/teams/SceneView.js +1 -8
- package/lib/components/teams/TeamNotebook.js +5 -13
- package/lib/components/teams/TeamNotebookView.js +2 -12
- package/lib/components/teams/index.d.ts +1 -0
- package/lib/components/teams/index.js +1 -0
- package/lib/components/teams/useBalloonRoom.d.ts +39 -0
- package/lib/components/teams/useBalloonRoom.js +89 -0
- package/lib/config/AgentConfiguration.js +22 -225
- package/lib/context/ContextDistribution.js +7 -41
- package/lib/context/ContextInspector.js +9 -107
- package/lib/context/ContextPanel.js +11 -86
- package/lib/context/ContextUsage.js +6 -34
- package/lib/context/CostTracker.js +7 -42
- package/lib/context/MessageHistory.js +3 -37
- package/lib/context/TurnGraphChart.js +9 -41
- package/lib/examples/A2UiAgentExample.js +6 -108
- package/lib/examples/A2UiComponentsGalleryExample.js +1 -1
- package/lib/examples/A2UiContactCardExample.js +1 -1
- package/lib/examples/A2UiJupyterOutputExample.js +25 -125
- package/lib/examples/A2UiRestaurantExample.js +1 -1
- package/lib/examples/A2UiViewerExample.js +1 -1
- package/lib/examples/AgUiAgenticExample.js +3 -35
- package/lib/examples/AgUiBackendToolRenderingExample.js +2 -25
- package/lib/examples/AgUiHaikuGenUiExample.js +2 -32
- package/lib/examples/AgUiHumanInTheLoopExample.js +5 -59
- package/lib/examples/AgUiSharedStateExample.js +6 -56
- package/lib/examples/AgUiToolsBasedGenUiExample.js +25 -120
- package/lib/examples/AgentA2AExample.js +1 -15
- package/lib/examples/AgentA2ATeamExample.js +6 -30
- package/lib/examples/AgentCheckpointsExample.js +11 -145
- package/lib/examples/AgentCodeSandboxExample.js +5 -108
- package/lib/examples/AgentCodeSandboxesExample.js +3 -30
- package/lib/examples/AgentCodemodeExample.js +9 -85
- package/lib/examples/AgentCompactionExample.js +3 -64
- package/lib/examples/AgentDecideExample.js +1 -13
- package/lib/examples/AgentEvalsExample.js +5 -60
- package/lib/examples/AgentGuardrailsExample.js +4 -28
- package/lib/examples/AgentHooksExample.js +1 -1
- package/lib/examples/AgentInferenceProviderExample.js +5 -96
- package/lib/examples/AgentMCPExample.js +7 -105
- package/lib/examples/AgentMemoryExample.js +5 -74
- package/lib/examples/AgentMonitoringExample.js +7 -53
- package/lib/examples/AgentNotificationsExample.js +3 -61
- package/lib/examples/AgentOtelExample.js +3 -72
- package/lib/examples/AgentOutputsExample.js +6 -81
- package/lib/examples/AgentParametersExample.js +2 -37
- package/lib/examples/AgentSkillsExample.js +3 -45
- package/lib/examples/AgentSubagentsExample.js +6 -56
- package/lib/examples/AgentToolApprovalsExample.js +1 -11
- package/lib/examples/AgentTriggersExample.js +29 -239
- package/lib/examples/AgentspecsExample.js +6 -60
- package/lib/examples/AssistantExample.js +5 -5
- package/lib/examples/AssistantGalleryExample.js +8 -65
- package/lib/examples/CellExample.js +1 -6
- package/lib/examples/ChatCustomExample.js +2 -31
- package/lib/examples/ChatExample.js +1 -9
- package/lib/examples/ChatStandaloneExample.js +3 -37
- package/lib/examples/CopilotKitLexicalExample.js +1 -24
- package/lib/examples/DecksAgent.js +1 -1
- package/lib/examples/DocumentPageAgent.js +1 -1
- package/lib/examples/HomeExample.js +14 -62
- package/lib/examples/Lexical2Example.js +3 -32
- package/lib/examples/LexicalAgentExample.js +2 -34
- package/lib/examples/LexicalAgentSidebarExample.js +3 -34
- package/lib/examples/LoopAppComputerExample.js +1 -1
- package/lib/examples/LoopShellExample.js +2 -2
- package/lib/examples/LoopStrategyExample.js +15 -87
- package/lib/examples/LoopWorkspaceEmbed.js +2 -18
- package/lib/examples/LoopWorkspaceExample.js +2 -2
- package/lib/examples/NotebookAgentExample.js +2 -33
- package/lib/examples/NotebookAgentSidebarExample.js +3 -46
- package/lib/examples/NotebookCollaborationExample.js +1 -31
- package/lib/examples/NotebookExample.js +1 -18
- package/lib/examples/NotebookPageAgent.js +1 -1
- package/lib/examples/ScenesExample.js +5 -24
- package/lib/examples/VoiceChatExample.js +1 -1
- package/lib/examples/components/AuthRequiredView.js +1 -7
- package/lib/examples/components/ErrorView.js +1 -8
- package/lib/examples/components/ExampleErrorBoundary.js +1 -14
- package/lib/examples/components/FooterMetrics.js +1 -7
- package/lib/examples/components/Header.js +12 -51
- package/lib/examples/components/HeaderControls.js +1 -9
- package/lib/examples/components/LexicalEditor.js +1 -8
- package/lib/examples/components/MainContent.js +1 -13
- package/lib/examples/components/MockFileBrowser.js +4 -40
- package/lib/examples/components/SessionTabs.js +1 -1
- package/lib/examples/components/TimeTravel.js +1 -13
- package/lib/examples/main.js +13 -81
- package/lib/examples/scenes/A2UiComponentsGalleryScene.js +3 -34
- package/lib/examples/scenes/A2UiContactCardScene.js +3 -35
- package/lib/examples/scenes/A2UiRestaurantScene.js +3 -53
- package/lib/examples/scenes/A2UiViewerScene.js +3 -34
- package/lib/examples/utils/AssistantGalleryGrid.js +6 -35
- package/lib/examples2/DatalayerNotebookExample.js +3 -33
- package/lib/examples2/NativeNavigationExample.js +4 -10
- package/lib/examples2/NotebookMutationsKernel.js +2 -1
- package/lib/examples2/NotebookMutationsServiceManager.js +2 -1
- package/lib/examples2/ReactRouterExample.js +14 -42
- package/lib/hooks/useToolApprovals.d.ts +2 -34
- package/lib/hooks/useToolApprovals.js +1 -64
- package/lib/identity/AgentIdentity.js +17 -62
- package/lib/identity/IdentityConnect.js +13 -59
- package/lib/identity/OAuthCallback.js +6 -44
- package/lib/lexical/ChatInlinePlugin.js +6 -14
- package/lib/loop/apps/AppRenderer.d.ts +4 -3
- package/lib/loop/apps/AppRenderer.js +11 -12
- package/lib/loop/apps/appspec.js +6 -3
- package/lib/loop/embed/AppEmbed.d.ts +1 -1
- package/lib/loop/embed/AppEmbed.js +2 -1
- package/lib/loop/embed/LoopEmbed.js +1 -7
- package/lib/loop/embed/embedConfig.d.ts +3 -3
- package/lib/loop/embed/embedConfig.js +2 -3
- package/lib/loop/embed/embedTheme.d.ts +4 -4
- package/lib/loop/embed/embedTheme.js +11 -7
- package/lib/loop/plugins/a2a-sidebar/A2ASidebar.js +7 -34
- package/lib/loop/plugins/a2ui/A2uiView.js +4 -12
- package/lib/loop/plugins/a2ui-surface/InlineSurface.js +1 -16
- package/lib/loop/plugins/a2ui-surface/SurfaceToolResult.js +2 -12
- package/lib/loop/plugins/agents/AnonymousKeyBadge.js +3 -2
- package/lib/loop/plugins/agents/SandboxSelector.js +3 -7
- package/lib/loop/plugins/agents/SandboxView.js +4 -27
- package/lib/loop/plugins/agents/TeamMemberPicker.js +2 -2
- package/lib/loop/plugins/agentspecs/AgentspecPicker.js +3 -2
- package/lib/loop/plugins/app-activity/AppActivity.js +1 -1
- package/lib/loop/plugins/app-computer/AppComputer.js +5 -21
- package/lib/loop/plugins/app-elements/AppElements.js +2 -31
- package/lib/loop/plugins/app-page/AppPage.js +1 -1
- package/lib/loop/plugins/app-rules/AppRulesCard.js +4 -20
- package/lib/loop/plugins/assistant/index.js +1 -13
- package/lib/loop/plugins/chat/ChatView.js +40 -106
- package/lib/loop/plugins/checkpoints-sidebar/CheckpointsSidebar.js +2 -13
- package/lib/loop/plugins/decks/DeckSurface.js +2 -2
- package/lib/loop/plugins/document/DocumentView.js +4 -12
- package/lib/loop/plugins/document-toolbar/SandboxStatusItem.js +3 -8
- package/lib/loop/plugins/graph/GraphView.js +2 -2
- package/lib/loop/plugins/input-prompt/ComposerView.js +1 -1
- package/lib/loop/plugins/notebook/NotebookView.js +3 -11
- package/lib/loop/plugins/page-layout/SplitLayout.js +11 -34
- package/lib/loop/plugins/page-layout/TurnPanel.js +9 -35
- package/lib/loop/plugins/shell/useEditorPreviews.js +3 -2
- package/lib/loop/plugins/subagent-activity/SubagentPulse.js +1 -13
- package/lib/loop/plugins/window-frame/WindowFrame.js +10 -44
- package/lib/loop/plugins/window-frame/index.js +1 -1
- package/lib/loop/shell/LoopWorkspace.js +34 -77
- package/lib/loop/shell/PluginToggles.js +4 -15
- package/lib/loop/shell/SidebarRail.js +8 -40
- package/lib/loop/shell/ViewSwitcher.js +4 -24
- package/lib/loop-main.js +2 -3
- package/lib/mcp/McpServerManager.js +6 -37
- package/lib/portable/index.d.ts +11 -0
- package/lib/portable/index.js +20 -0
- package/lib/protocols/AGUIAdapter.js +2 -2
- package/lib/protocols/BaseProtocolAdapter.d.ts +2 -0
- package/lib/protocols/BaseProtocolAdapter.js +4 -0
- package/lib/specs/apps.js +6 -0
- package/lib/specs/appspecSchema.js +11 -4
- package/lib/stories/loop/ReferenceScreens.js +17 -91
- package/lib/stories/loop/pictures-main.js +1 -1
- package/lib/types/agentspecs.d.ts +5 -2
- package/lib/types/protocol.d.ts +2 -0
- package/lib/utils/approvals.d.ts +59 -0
- package/lib/utils/approvals.js +101 -0
- package/lib/voice/VoiceInput.js +3 -39
- package/package.json +2 -2
- package/scripts/codegen/generate_envvars.py +0 -1
- package/lib/shims/primerAddonsBox.d.ts +0 -1
- package/lib/shims/primerAddonsBox.js +0 -7
|
@@ -40,33 +40,7 @@ const numberFmt = new Intl.NumberFormat();
|
|
|
40
40
|
/** Live compaction status: spinner while running, details when complete. */
|
|
41
41
|
const CompactionPanel = ({ maxTokens }) => {
|
|
42
42
|
const compaction = useAgentRuntimeCompaction();
|
|
43
|
-
return (_jsxs(Box, { sx: {
|
|
44
|
-
p: 3,
|
|
45
|
-
borderBottom: '1px solid',
|
|
46
|
-
borderColor: 'border.default',
|
|
47
|
-
}, children: [_jsx(Heading, { as: "h4", sx: { fontSize: 1, mb: 2 }, children: "Compaction" }), _jsxs(Box, { sx: { display: 'flex', alignItems: 'center', gap: 2, mb: 2 }, children: [_jsx(StackIcon, { size: 14 }), _jsxs(Text, { sx: { fontSize: 0, color: 'fg.muted' }, children: ["Budget: ", numberFmt.format(maxTokens), " tokens"] })] }), !compaction && (_jsx(Text, { as: "p", sx: { fontSize: 0, color: 'fg.muted', m: 0 }, children: "No compaction yet. Keep chatting \u2014 once the history exceeds the token budget, older messages are summarized automatically." })), compaction?.phase === 'start' && (_jsxs(Box, { sx: {
|
|
48
|
-
display: 'flex',
|
|
49
|
-
alignItems: 'center',
|
|
50
|
-
gap: 2,
|
|
51
|
-
p: 2,
|
|
52
|
-
border: '1px solid',
|
|
53
|
-
borderColor: 'attention.emphasis',
|
|
54
|
-
borderRadius: 2,
|
|
55
|
-
bg: 'attention.subtle',
|
|
56
|
-
}, children: [_jsx(Spinner, { size: "small" }), _jsxs(Box, { children: [_jsx(Text, { sx: { fontSize: 1, fontWeight: 'bold' }, children: "Compacting\u2026" }), _jsxs(Text, { as: "p", sx: { fontSize: 0, color: 'fg.muted', m: 0 }, children: ["Summarizing ", numberFmt.format(compaction.beforeMessages), " messages (~", numberFmt.format(compaction.beforeTokens), " tokens)"] })] })] })), compaction?.phase === 'end' && (_jsxs(Box, { sx: {
|
|
57
|
-
p: 2,
|
|
58
|
-
border: '1px solid',
|
|
59
|
-
borderColor: compaction.reduced
|
|
60
|
-
? 'success.emphasis'
|
|
61
|
-
: 'border.default',
|
|
62
|
-
borderRadius: 2,
|
|
63
|
-
bg: compaction.reduced ? 'success.subtle' : 'canvas.subtle',
|
|
64
|
-
}, children: [_jsxs(Box, { sx: { display: 'flex', alignItems: 'center', gap: 2, mb: 2 }, children: [_jsx(CheckCircleIcon, { size: 14 }), _jsx(Text, { sx: { fontSize: 1, fontWeight: 'bold' }, children: compaction.reduced ? 'Compacted' : 'History already minimal' })] }), _jsxs(Box, { sx: {
|
|
65
|
-
display: 'flex',
|
|
66
|
-
flexDirection: 'column',
|
|
67
|
-
gap: 1,
|
|
68
|
-
fontSize: 0,
|
|
69
|
-
}, children: [_jsxs(Box, { sx: { display: 'flex', alignItems: 'center', gap: 1 }, children: [_jsx(Text, { sx: { color: 'fg.muted', minWidth: 64 }, children: "Tokens" }), _jsx(Text, { sx: { fontFamily: 'mono' }, children: numberFmt.format(compaction.beforeTokens) }), _jsx(ArrowRightIcon, { size: 12 }), _jsx(Text, { sx: { fontFamily: 'mono' }, children: numberFmt.format(compaction.afterTokens ?? compaction.beforeTokens) })] }), _jsxs(Box, { sx: { display: 'flex', alignItems: 'center', gap: 1 }, children: [_jsx(Text, { sx: { color: 'fg.muted', minWidth: 64 }, children: "Messages" }), _jsx(Text, { sx: { fontFamily: 'mono' }, children: numberFmt.format(compaction.beforeMessages) }), _jsx(ArrowRightIcon, { size: 12 }), _jsx(Text, { sx: { fontFamily: 'mono' }, children: numberFmt.format(compaction.afterMessages ?? compaction.beforeMessages) })] }), _jsxs(Box, { sx: { display: 'flex', alignItems: 'center', gap: 1 }, children: [_jsx(ClockIcon, { size: 12 }), _jsx(Text, { sx: { color: 'fg.muted', minWidth: 52 }, children: "Time" }), _jsxs(Text, { sx: { fontFamily: 'mono' }, children: [numberFmt.format(Math.round(compaction.durationMs ?? 0)), " ms"] })] }), typeof compaction.compactionCount === 'number' && (_jsxs(Box, { sx: { display: 'flex', alignItems: 'center', gap: 1 }, children: [_jsx(Text, { sx: { color: 'fg.muted', minWidth: 64 }, children: "Total runs" }), _jsx(Text, { sx: { fontFamily: 'mono' }, children: numberFmt.format(compaction.compactionCount) })] }))] })] }))] }));
|
|
43
|
+
return (_jsxs(Box, { p: 3, borderBottom: "1px solid", borderColor: "border.default", children: [_jsx(Heading, { as: "h4", sx: { fontSize: 1, mb: 2 }, children: "Compaction" }), _jsxs(Box, { display: "flex", alignItems: "center", gap: 2, mb: 2, children: [_jsx(StackIcon, { size: 14 }), _jsxs(Text, { sx: { fontSize: 0, color: 'fg.muted' }, children: ["Budget: ", numberFmt.format(maxTokens), " tokens"] })] }), !compaction && (_jsx(Text, { as: "p", sx: { fontSize: 0, color: 'fg.muted', m: 0 }, children: "No compaction yet. Keep chatting \u2014 once the history exceeds the token budget, older messages are summarized automatically." })), compaction?.phase === 'start' && (_jsxs(Box, { display: "flex", alignItems: "center", gap: 2, p: 2, border: "1px solid", borderColor: "attention.emphasis", borderRadius: 2, bg: "attention.subtle", children: [_jsx(Spinner, { size: "small" }), _jsxs(Box, { children: [_jsx(Text, { sx: { fontSize: 1, fontWeight: 'bold' }, children: "Compacting\u2026" }), _jsxs(Text, { as: "p", sx: { fontSize: 0, color: 'fg.muted', m: 0 }, children: ["Summarizing ", numberFmt.format(compaction.beforeMessages), " messages (~", numberFmt.format(compaction.beforeTokens), " tokens)"] })] })] })), compaction?.phase === 'end' && (_jsxs(Box, { p: 2, border: "1px solid", borderColor: compaction.reduced ? 'success.emphasis' : 'border.default', borderRadius: 2, bg: compaction.reduced ? 'success.subtle' : 'canvas.subtle', children: [_jsxs(Box, { display: "flex", alignItems: "center", gap: 2, mb: 2, children: [_jsx(CheckCircleIcon, { size: 14 }), _jsx(Text, { sx: { fontSize: 1, fontWeight: 'bold' }, children: compaction.reduced ? 'Compacted' : 'History already minimal' })] }), _jsxs(Box, { display: "flex", flexDirection: "column", gap: 1, fontSize: 0, children: [_jsxs(Box, { display: "flex", alignItems: "center", gap: 1, children: [_jsx(Text, { sx: { color: 'fg.muted', minWidth: 64 }, children: "Tokens" }), _jsx(Text, { sx: { fontFamily: 'mono' }, children: numberFmt.format(compaction.beforeTokens) }), _jsx(ArrowRightIcon, { size: 12 }), _jsx(Text, { sx: { fontFamily: 'mono' }, children: numberFmt.format(compaction.afterTokens ?? compaction.beforeTokens) })] }), _jsxs(Box, { display: "flex", alignItems: "center", gap: 1, children: [_jsx(Text, { sx: { color: 'fg.muted', minWidth: 64 }, children: "Messages" }), _jsx(Text, { sx: { fontFamily: 'mono' }, children: numberFmt.format(compaction.beforeMessages) }), _jsx(ArrowRightIcon, { size: 12 }), _jsx(Text, { sx: { fontFamily: 'mono' }, children: numberFmt.format(compaction.afterMessages ?? compaction.beforeMessages) })] }), _jsxs(Box, { display: "flex", alignItems: "center", gap: 1, children: [_jsx(ClockIcon, { size: 12 }), _jsx(Text, { sx: { color: 'fg.muted', minWidth: 52 }, children: "Time" }), _jsxs(Text, { sx: { fontFamily: 'mono' }, children: [numberFmt.format(Math.round(compaction.durationMs ?? 0)), " ms"] })] }), typeof compaction.compactionCount === 'number' && (_jsxs(Box, { display: "flex", alignItems: "center", gap: 1, children: [_jsx(Text, { sx: { color: 'fg.muted', minWidth: 64 }, children: "Total runs" }), _jsx(Text, { sx: { fontFamily: 'mono' }, children: numberFmt.format(compaction.compactionCount) })] }))] })] }))] }));
|
|
70
44
|
};
|
|
71
45
|
const AgentCompactionInner = () => {
|
|
72
46
|
const agentName = useRef(uniqueAgentId(AGENT_NAME)).current;
|
|
@@ -81,48 +55,13 @@ const AgentCompactionInner = () => {
|
|
|
81
55
|
: [createAgentCompactionPlugin(launchedMaxTokens)], [launchedMaxTokens]);
|
|
82
56
|
// Setup phase: choose the compaction token budget before launching.
|
|
83
57
|
if (launchedMaxTokens === null) {
|
|
84
|
-
return (_jsx(Box, { sx: {
|
|
85
|
-
display: 'flex',
|
|
86
|
-
alignItems: 'center',
|
|
87
|
-
justifyContent: 'center',
|
|
88
|
-
height: '100%',
|
|
89
|
-
bg: 'canvas.default',
|
|
90
|
-
}, children: _jsxs(Box, { sx: {
|
|
91
|
-
width: 460,
|
|
92
|
-
maxWidth: '90%',
|
|
93
|
-
p: 4,
|
|
94
|
-
border: '1px solid',
|
|
95
|
-
borderColor: 'border.default',
|
|
96
|
-
borderRadius: 2,
|
|
97
|
-
bg: 'canvas.subtle',
|
|
98
|
-
}, children: [_jsxs(Box, { sx: { display: 'flex', alignItems: 'center', gap: 2, mb: 2 }, children: [_jsx(HistoryIcon, { size: 20 }), _jsx(Heading, { as: "h3", sx: { fontSize: 3 }, children: "History Compaction" })] }), _jsx(Text, { as: "p", sx: { fontSize: 1, color: 'fg.muted', mt: 0, mb: 3 }, children: "Set the context token budget before launching. When the conversation grows past this budget, older messages are summarized so the input stays within the limit. A lower budget triggers compaction sooner." }), _jsxs(FormControl, { children: [_jsxs(FormControl.Label, { children: ["Max context tokens: ", numberFmt.format(maxTokensInput)] }), _jsx(Box, { sx: { mt: 2 }, children: _jsx("input", { type: "range", min: MIN_MAX_TOKENS, max: tokenLimit, step: 500, value: maxTokensInput, onChange: e => setMaxTokensInput(Number(e.target.value)), style: { width: '100%' } }) }), _jsxs(FormControl.Caption, { children: ["Agentspec max: ", numberFmt.format(tokenLimit), " tokens (model limit)"] })] }), _jsx(Box, { sx: { display: 'flex', justifyContent: 'flex-end', mt: 3 }, children: _jsx(Button, { variant: "primary", leadingVisual: HistoryIcon, "data-compaction-launch": true, onClick: () => {
|
|
58
|
+
return (_jsx(Box, { display: "flex", alignItems: "center", justifyContent: "center", height: "100%", bg: "canvas.default", children: _jsxs(Box, { width: 460, maxWidth: "90%", p: 4, border: "1px solid", borderColor: "border.default", borderRadius: 2, bg: "canvas.subtle", children: [_jsxs(Box, { display: "flex", alignItems: "center", gap: 2, mb: 2, children: [_jsx(HistoryIcon, { size: 20 }), _jsx(Heading, { as: "h3", sx: { fontSize: 3 }, children: "History Compaction" })] }), _jsx(Text, { as: "p", sx: { fontSize: 1, color: 'fg.muted', mt: 0, mb: 3 }, children: "Set the context token budget before launching. When the conversation grows past this budget, older messages are summarized so the input stays within the limit. A lower budget triggers compaction sooner." }), _jsxs(FormControl, { children: [_jsxs(FormControl.Label, { children: ["Max context tokens: ", numberFmt.format(maxTokensInput)] }), _jsx(Box, { mt: 2, children: _jsx("input", { type: "range", min: MIN_MAX_TOKENS, max: tokenLimit, step: 500, value: maxTokensInput, onChange: e => setMaxTokensInput(Number(e.target.value)), style: { width: '100%' } }) }), _jsxs(FormControl.Caption, { children: ["Agentspec max: ", numberFmt.format(tokenLimit), " tokens (model limit)"] })] }), _jsx(Box, { display: "flex", justifyContent: "flex-end", mt: 3, children: _jsx(Button, { variant: "primary", leadingVisual: HistoryIcon, "data-compaction-launch": true, onClick: () => {
|
|
99
59
|
// Clear any prior compaction status from a previous stream.
|
|
100
60
|
agentRuntimeStore.getState().setCompaction(null);
|
|
101
61
|
setLaunchedMaxTokens(maxTokensInput);
|
|
102
62
|
}, children: "Launch agent" }) })] }) }));
|
|
103
63
|
}
|
|
104
|
-
return (_jsxs(Box, { sx: {
|
|
105
|
-
height: '100%',
|
|
106
|
-
display: 'flex',
|
|
107
|
-
flexDirection: 'column',
|
|
108
|
-
bg: 'canvas.default',
|
|
109
|
-
}, children: [_jsxs(Box, { sx: {
|
|
110
|
-
display: 'flex',
|
|
111
|
-
alignItems: 'center',
|
|
112
|
-
gap: 2,
|
|
113
|
-
px: 3,
|
|
114
|
-
py: 2,
|
|
115
|
-
borderBottom: '1px solid',
|
|
116
|
-
borderColor: 'border.default',
|
|
117
|
-
flexShrink: 0,
|
|
118
|
-
}, children: [_jsx(HistoryIcon, { size: 16 }), _jsx(Heading, { as: "h3", sx: { fontSize: 2, flex: 1 }, children: "Compaction Demo" }), _jsx(Label, { variant: "accent", children: "local" }), _jsxs(Label, { variant: "accent", children: [numberFmt.format(launchedMaxTokens), " tok budget"] })] }), _jsxs(Box, { sx: { flex: 1, minHeight: 0, display: 'flex' }, children: [_jsx(Box, { sx: { flex: 1, minWidth: 0 }, children: _jsx(LoopEmbed, { serverUrl: agentBaseUrl, target: "local", showAgentVariants: true, agentId: agentName, editors: false, showHeader: true, plugins: plugins }, launchedMaxTokens) }), _jsxs(Box, { sx: {
|
|
119
|
-
width: 320,
|
|
120
|
-
borderLeft: '1px solid',
|
|
121
|
-
borderColor: 'border.default',
|
|
122
|
-
display: 'flex',
|
|
123
|
-
flexDirection: 'column',
|
|
124
|
-
overflow: 'auto',
|
|
125
|
-
}, children: [_jsx(CompactionPanel, { maxTokens: launchedMaxTokens }), _jsxs(Box, { sx: { p: 3 }, children: [_jsx(Heading, { as: "h4", sx: { fontSize: 1, mb: 2 }, children: "How It Works" }), _jsxs(Text, { as: "p", sx: { fontSize: 0, color: 'fg.muted', mb: 2 }, children: ["Before each model request, the compaction capability estimates the history size. When it exceeds a fraction of the", ' ', numberFmt.format(launchedMaxTokens), "-token budget, older messages are replaced by an LLM-generated summary while recent messages are preserved."] }), _jsxs(Text, { as: "p", sx: { fontSize: 0, color: 'fg.muted', mb: 0 }, children: ["The budget is capped at the agentspec model's token limit (", numberFmt.format(tokenLimit), "). Lower it to trigger compaction with a shorter conversation."] })] })] })] })] }));
|
|
64
|
+
return (_jsxs(Box, { height: "100%", display: "flex", flexDirection: "column", bg: "canvas.default", children: [_jsxs(Box, { display: "flex", alignItems: "center", gap: 2, px: 3, py: 2, borderBottom: "1px solid", borderColor: "border.default", flexShrink: 0, children: [_jsx(HistoryIcon, { size: 16 }), _jsx(Heading, { as: "h3", sx: { fontSize: 2, flex: 1 }, children: "Compaction Demo" }), _jsx(Label, { variant: "accent", children: "local" }), _jsxs(Label, { variant: "accent", children: [numberFmt.format(launchedMaxTokens), " tok budget"] })] }), _jsxs(Box, { flex: 1, minHeight: 0, display: "flex", children: [_jsx(Box, { flex: 1, minWidth: 0, children: _jsx(LoopEmbed, { serverUrl: agentBaseUrl, target: "local", showAgentVariants: true, agentId: agentName, editors: false, showHeader: true, plugins: plugins }, launchedMaxTokens) }), _jsxs(Box, { width: 320, borderLeft: "1px solid", borderColor: "border.default", display: "flex", flexDirection: "column", overflow: "auto", children: [_jsx(CompactionPanel, { maxTokens: launchedMaxTokens }), _jsxs(Box, { p: 3, children: [_jsx(Heading, { as: "h4", sx: { fontSize: 1, mb: 2 }, children: "How It Works" }), _jsxs(Text, { as: "p", sx: { fontSize: 0, color: 'fg.muted', mb: 2 }, children: ["Before each model request, the compaction capability estimates the history size. When it exceeds a fraction of the", ' ', numberFmt.format(launchedMaxTokens), "-token budget, older messages are replaced by an LLM-generated summary while recent messages are preserved."] }), _jsxs(Text, { as: "p", sx: { fontSize: 0, color: 'fg.muted', mb: 0 }, children: ["The budget is capped at the agentspec model's token limit (", numberFmt.format(tokenLimit), "). Lower it to trigger compaction with a shorter conversation."] })] })] })] })] }));
|
|
126
65
|
};
|
|
127
66
|
const AgentCompactionExample = () => (_jsx(ThemedProvider, { children: _jsx(AgentCompactionInner, {}) }));
|
|
128
67
|
export default AgentCompactionExample;
|
|
@@ -56,18 +56,6 @@ const AgentDecideExample = () => {
|
|
|
56
56
|
// The Local agent is the application's: created under its id with its
|
|
57
57
|
// spec, so that the server runs its instructions, its tool and its rule.
|
|
58
58
|
const localAgent = useMemo(() => ({ createPayload: appDatalayerCreatePayload(app) }), [app]);
|
|
59
|
-
return (_jsx(ThemedProvider, { children: _jsxs(Box, { sx: {
|
|
60
|
-
height: '100vh',
|
|
61
|
-
minHeight: 0,
|
|
62
|
-
display: 'flex',
|
|
63
|
-
bg: 'canvas.default',
|
|
64
|
-
}, children: [_jsx(Box, { sx: { flex: 1, minWidth: 0, minHeight: 0 }, children: _jsx(AppRenderer, { app: app, serverUrl: serverUrl, target: "local", localAgent: localAgent, plugins: plugins }) }), _jsxs(Box, { as: "aside", sx: {
|
|
65
|
-
width: 320,
|
|
66
|
-
flexShrink: 0,
|
|
67
|
-
p: 3,
|
|
68
|
-
borderLeft: '1px solid',
|
|
69
|
-
borderColor: 'border.default',
|
|
70
|
-
overflowY: 'auto',
|
|
71
|
-
}, children: [_jsxs(Heading, { as: "h2", sx: { fontSize: 2, mb: 2 }, children: [app.emoji, " Decide"] }), _jsx(Text, { as: "p", sx: { fontSize: 1, mb: 2 }, children: "Typed decisions asked of Jev, the typed-decision model: yes or no with its probability, one of named options, or a score, each with its confidence." }), _jsxs(Text, { as: "p", sx: { fontSize: 1, mb: 2 }, children: [_jsx("strong", { children: "In the chat" }), ": ask \u201CIs this ticket urgent? \u2018Help! My payouts have been failing for 3 days.\u2019\u201D Its agent calls the ", _jsx("code", { children: "decide" }), " tool, a read it does without asking."] }), _jsxs(Text, { as: "p", sx: { fontSize: 1, mb: 2 }, children: [_jsx("strong", { children: "From the assistant" }), ": hover the character below and choose ", _jsx("em", { children: "Ask a decision" }), " \u2014 the situation, the question, and its type. The answer comes back in its balloon."] }), _jsxs(Text, { as: "p", sx: { fontSize: 0, color: 'fg.muted' }, children: ["Runs on the local agent-runtimes server at ", serverUrl, ", which asks Jev through ai-inference."] })] })] }) }));
|
|
59
|
+
return (_jsx(ThemedProvider, { children: _jsxs(Box, { height: "100vh", minHeight: 0, display: "flex", bg: "canvas.default", children: [_jsx(Box, { flex: 1, minWidth: 0, minHeight: 0, children: _jsx(AppRenderer, { app: app, serverUrl: serverUrl, target: "local", localAgent: localAgent, plugins: plugins }) }), _jsxs(Box, { as: "aside", width: 320, flexShrink: 0, p: 3, borderLeft: "1px solid", borderColor: "border.default", overflowY: "auto", children: [_jsxs(Heading, { as: "h2", sx: { fontSize: 2, mb: 2 }, children: [app.emoji, " Decide"] }), _jsx(Text, { as: "p", sx: { fontSize: 1, mb: 2 }, children: "Typed decisions asked of Jev, the typed-decision model: yes or no with its probability, one of named options, or a score, each with its confidence." }), _jsxs(Text, { as: "p", sx: { fontSize: 1, mb: 2 }, children: [_jsx("strong", { children: "In the chat" }), ": ask \u201CIs this ticket urgent? \u2018Help! My payouts have been failing for 3 days.\u2019\u201D Its agent calls the ", _jsx("code", { children: "decide" }), " tool, a read it does without asking."] }), _jsxs(Text, { as: "p", sx: { fontSize: 1, mb: 2 }, children: [_jsx("strong", { children: "From the assistant" }), ": hover the character below and choose ", _jsx("em", { children: "Ask a decision" }), " \u2014 the situation, the question, and its type. The answer comes back in its balloon."] }), _jsxs(Text, { as: "p", sx: { fontSize: 0, color: 'fg.muted' }, children: ["Runs on the local agent-runtimes server at ", serverUrl, ", which asks Jev through ai-inference."] })] })] }) }));
|
|
72
60
|
};
|
|
73
61
|
export default AgentDecideExample;
|
|
@@ -342,14 +342,7 @@ const AgentEvalsInner = ({ onLogout, executionTarget }) => {
|
|
|
342
342
|
// ── Loading / Error ───────────────────────────────────────────────────
|
|
343
343
|
// Local: the Loop must mount to create the agent, so no waiting screen.
|
|
344
344
|
if (executionTarget !== 'local' && !isAgentReady && agentStatus !== 'error') {
|
|
345
|
-
return (_jsxs(Box, { sx: {
|
|
346
|
-
display: 'flex',
|
|
347
|
-
flexDirection: 'column',
|
|
348
|
-
alignItems: 'center',
|
|
349
|
-
justifyContent: 'center',
|
|
350
|
-
height: '100%',
|
|
351
|
-
gap: 3,
|
|
352
|
-
}, children: [_jsx(Spinner, { size: "large" }), _jsx(Text, { sx: { color: 'fg.muted' }, children: agentStatus === 'launching'
|
|
345
|
+
return (_jsxs(Box, { display: "flex", flexDirection: "column", alignItems: "center", justifyContent: "center", height: "100%", gap: 3, children: [_jsx(Spinner, { size: "large" }), _jsx(Text, { sx: { color: 'fg.muted' }, children: agentStatus === 'launching'
|
|
353
346
|
? 'Launching runtime for eval agent…'
|
|
354
347
|
: 'Creating eval example agent…' })] }));
|
|
355
348
|
}
|
|
@@ -357,70 +350,22 @@ const AgentEvalsInner = ({ onLogout, executionTarget }) => {
|
|
|
357
350
|
return _jsx(ErrorView, { error: effectiveError, onLogout: onLogout });
|
|
358
351
|
}
|
|
359
352
|
if (isBootstrapping) {
|
|
360
|
-
return (_jsxs(Box, { sx: {
|
|
361
|
-
display: 'flex',
|
|
362
|
-
flexDirection: 'column',
|
|
363
|
-
alignItems: 'center',
|
|
364
|
-
justifyContent: 'center',
|
|
365
|
-
height: '100%',
|
|
366
|
-
gap: 3,
|
|
367
|
-
}, children: [_jsx(Spinner, { size: "large" }), _jsx(Text, { sx: { color: 'fg.muted' }, children: "Preparing hosted eval and experiment..." })] }));
|
|
353
|
+
return (_jsxs(Box, { display: "flex", flexDirection: "column", alignItems: "center", justifyContent: "center", height: "100%", gap: 3, children: [_jsx(Spinner, { size: "large" }), _jsx(Text, { sx: { color: 'fg.muted' }, children: "Preparing hosted eval and experiment..." })] }));
|
|
368
354
|
}
|
|
369
355
|
const latestScore = evalRuns.length > 0 ? evalRuns[0].score : null;
|
|
370
356
|
void latestScore;
|
|
371
|
-
return (_jsxs(Box, { sx: {
|
|
372
|
-
height: '100%',
|
|
373
|
-
minHeight: 0,
|
|
374
|
-
display: 'flex',
|
|
375
|
-
flexDirection: 'column',
|
|
376
|
-
}, children: [_jsxs(Box, { sx: {
|
|
377
|
-
display: 'flex',
|
|
378
|
-
alignItems: 'center',
|
|
379
|
-
gap: 2,
|
|
380
|
-
px: 3,
|
|
381
|
-
py: 2,
|
|
382
|
-
borderBottom: '1px solid',
|
|
383
|
-
borderColor: 'border.default',
|
|
384
|
-
flexShrink: 0,
|
|
385
|
-
}, children: [_jsx(BeakerIcon, { size: 16 }), _jsxs(Box, { sx: { flex: 1, minWidth: 0 }, children: [_jsxs(Heading, { as: "h3", sx: { fontSize: 2 }, children: ["Evaluation \u2014 ", runtimeName] }), _jsxs(Text, { sx: {
|
|
357
|
+
return (_jsxs(Box, { height: "100%", minHeight: 0, display: "flex", flexDirection: "column", children: [_jsxs(Box, { display: "flex", alignItems: "center", gap: 2, px: 3, py: 2, borderBottom: "1px solid", borderColor: "border.default", flexShrink: 0, children: [_jsx(BeakerIcon, { size: 16 }), _jsxs(Box, { flex: 1, minWidth: 0, children: [_jsxs(Heading, { as: "h3", sx: { fontSize: 2 }, children: ["Evaluation \u2014 ", runtimeName] }), _jsxs(Text, { sx: {
|
|
386
358
|
fontSize: 0,
|
|
387
359
|
color: 'fg.muted',
|
|
388
360
|
display: 'block',
|
|
389
361
|
overflow: 'hidden',
|
|
390
362
|
textOverflow: 'ellipsis',
|
|
391
363
|
whiteSpace: 'nowrap',
|
|
392
|
-
}, children: ["Runtime API: ", runtimeCreationBaseUrl, "/api/runtimes/v1/runtimes"] })] }), _jsxs(Label, { size: "small", variant: "accent", children: ["Target: ", runtimeTargetCapabilities(executionTarget).label] })] }), _jsxs(Box, {
|
|
393
|
-
width: 350,
|
|
394
|
-
borderLeft: '1px solid',
|
|
395
|
-
borderColor: 'border.default',
|
|
396
|
-
display: 'flex',
|
|
397
|
-
flexDirection: 'column',
|
|
398
|
-
overflow: 'auto',
|
|
399
|
-
}, children: [_jsxs(Box, { sx: {
|
|
400
|
-
p: 3,
|
|
401
|
-
borderBottom: '1px solid',
|
|
402
|
-
borderColor: 'border.default',
|
|
403
|
-
}, children: [_jsxs(Box, { sx: { display: 'flex', alignItems: 'center', gap: 1, mb: 2 }, children: [_jsx(BeakerIcon, { size: 16 }), _jsx(Heading, { as: "h3", sx: { fontSize: 2 }, children: "Run Evaluation" })] }), _jsx(Text, { as: "p", sx: { fontSize: 0, color: 'fg.muted', mb: 3 }, children: "Execute the default evaluation suite and persist results to /api/ai-agents/v1/evals." }), _jsx(Button, { size: "small", variant: "primary", leadingVisual: PlayIcon, onClick: handleRunEval, disabled: isRunning, sx: { width: '100%' }, children: isRunning ? 'Running…' : 'Run Eval Suite' }), flash && (_jsx(Flash, { variant: flash.toLowerCase().includes('failed') ? 'danger' : 'success', sx: { mt: 2, fontSize: 0 }, children: flash }))] }), _jsxs(Box, { sx: { p: 3, flex: 1, overflow: 'auto' }, children: [_jsx(Heading, { as: "h4", sx: { fontSize: 1, mb: 2 }, children: "Evaluation History" }), evalRuns.length === 0 ? (_jsx(Text, { sx: { color: 'fg.muted', fontSize: 0 }, children: "No evaluation runs recorded yet." })) : (evalRuns.slice(0, 20).map(run => (_jsxs(Box, { sx: {
|
|
404
|
-
p: 2,
|
|
405
|
-
mb: 2,
|
|
406
|
-
border: '1px solid',
|
|
407
|
-
borderColor: 'border.default',
|
|
408
|
-
borderRadius: 2,
|
|
409
|
-
}, children: [_jsxs(Box, { sx: {
|
|
410
|
-
display: 'flex',
|
|
411
|
-
justifyContent: 'space-between',
|
|
412
|
-
alignItems: 'center',
|
|
413
|
-
mb: 1,
|
|
414
|
-
}, children: [_jsx(Text, { sx: { fontSize: 0, fontWeight: 'bold' }, children: run.suiteName }), _jsxs(Label, { variant: run.score >= 0.8
|
|
364
|
+
}, children: ["Runtime API: ", runtimeCreationBaseUrl, "/api/runtimes/v1/runtimes"] })] }), _jsxs(Label, { size: "small", variant: "accent", children: ["Target: ", runtimeTargetCapabilities(executionTarget).label] })] }), _jsxs(Box, { flex: 1, minHeight: 0, display: "flex", children: [_jsx(Box, { flex: 1, minWidth: 0, children: _jsx(LoopEmbed, { serverUrl: agentBaseUrl, target: "local", showAgentVariants: true, agentId: agentId, editors: false, showHeader: true, plugins: LOOP_PLUGINS_AGENTEVA }) }), _jsxs(Box, { width: 350, borderLeft: "1px solid", borderColor: "border.default", display: "flex", flexDirection: "column", overflow: "auto", children: [_jsxs(Box, { p: 3, borderBottom: "1px solid", borderColor: "border.default", children: [_jsxs(Box, { display: "flex", alignItems: "center", gap: 1, mb: 2, children: [_jsx(BeakerIcon, { size: 16 }), _jsx(Heading, { as: "h3", sx: { fontSize: 2 }, children: "Run Evaluation" })] }), _jsx(Text, { as: "p", sx: { fontSize: 0, color: 'fg.muted', mb: 3 }, children: "Execute the default evaluation suite and persist results to /api/ai-agents/v1/evals." }), _jsx(Button, { size: "small", variant: "primary", leadingVisual: PlayIcon, onClick: handleRunEval, disabled: isRunning, sx: { width: '100%' }, children: isRunning ? 'Running…' : 'Run Eval Suite' }), flash && (_jsx(Flash, { variant: flash.toLowerCase().includes('failed') ? 'danger' : 'success', sx: { mt: 2, fontSize: 0 }, children: flash }))] }), _jsxs(Box, { p: 3, flex: 1, overflow: "auto", children: [_jsx(Heading, { as: "h4", sx: { fontSize: 1, mb: 2 }, children: "Evaluation History" }), evalRuns.length === 0 ? (_jsx(Text, { sx: { color: 'fg.muted', fontSize: 0 }, children: "No evaluation runs recorded yet." })) : (evalRuns.slice(0, 20).map(run => (_jsxs(Box, { p: 2, mb: 2, border: "1px solid", borderColor: "border.default", borderRadius: 2, children: [_jsxs(Box, { display: "flex", justifyContent: "space-between", alignItems: "center", mb: 1, children: [_jsx(Text, { sx: { fontSize: 0, fontWeight: 'bold' }, children: run.suiteName }), _jsxs(Label, { variant: run.score >= 0.8
|
|
415
365
|
? 'success'
|
|
416
366
|
: run.score >= 0.5
|
|
417
367
|
? 'attention'
|
|
418
|
-
: 'danger', size: "small", children: [(run.score * 100).toFixed(0), "%"] })] }), _jsx(ProgressBar, { progress: run.score * 100, sx: { mb: 1 } }), _jsxs(Box, {
|
|
419
|
-
display: 'flex',
|
|
420
|
-
justifyContent: 'space-between',
|
|
421
|
-
fontSize: 0,
|
|
422
|
-
color: 'fg.muted',
|
|
423
|
-
}, children: [_jsxs(Text, { children: [_jsx(CheckCircleIcon, { size: 12 }), " ", run.passed, " passed"] }), _jsxs(Text, { children: [_jsx(XCircleIcon, { size: 12 }), " ", run.failed, " failed"] }), _jsx(Text, { children: new Date(run.timestamp).toLocaleDateString() })] })] }, run.id))))] })] })] })] }));
|
|
368
|
+
: 'danger', size: "small", children: [(run.score * 100).toFixed(0), "%"] })] }), _jsx(ProgressBar, { progress: run.score * 100, sx: { mb: 1 } }), _jsxs(Box, { display: "flex", justifyContent: "space-between", fontSize: 0, color: "fg.muted", children: [_jsxs(Text, { children: [_jsx(CheckCircleIcon, { size: 12 }), " ", run.passed, " passed"] }), _jsxs(Text, { children: [_jsx(XCircleIcon, { size: 12 }), " ", run.failed, " failed"] }), _jsx(Text, { children: new Date(run.timestamp).toLocaleDateString() })] })] }, run.id))))] })] })] })] }));
|
|
424
369
|
};
|
|
425
370
|
// ─── Sync token to core IAM store ──────────────────────────────────────────
|
|
426
371
|
const syncTokenToIamStore = (token) => {
|
|
@@ -423,37 +423,13 @@ const AgentGuardrailsInner = ({ onLogout, }) => {
|
|
|
423
423
|
: costPercent > 50
|
|
424
424
|
? 'attention.fg'
|
|
425
425
|
: 'success.fg';
|
|
426
|
-
return (_jsxs(Box, { sx: {
|
|
427
|
-
height: '100%',
|
|
428
|
-
display: 'flex',
|
|
429
|
-
flexDirection: 'column',
|
|
430
|
-
}, children: [_jsxs(Box, { sx: {
|
|
431
|
-
display: 'flex',
|
|
432
|
-
alignItems: 'center',
|
|
433
|
-
gap: 3,
|
|
434
|
-
px: 3,
|
|
435
|
-
py: 2,
|
|
436
|
-
borderBottom: '1px solid',
|
|
437
|
-
borderColor: 'border.default',
|
|
438
|
-
flexShrink: 0,
|
|
439
|
-
}, children: [isReconnectedAgent && (_jsx(Label, { variant: "secondary", size: "small", children: "Reconnected" })), _jsxs(Box, { sx: { display: 'flex', alignItems: 'center', gap: 1 }, children: [_jsx(ShieldCheckIcon, { size: 16 }), _jsxs(Heading, { as: "h3", sx: { fontSize: 2 }, children: ["Guardrails Demo \u2014 ", runtimeName] })] }), _jsx(Label, { variant: wsState === 'connected' ? 'success' : 'secondary', children: wsState }), _jsxs(Box, { sx: { flex: 1, maxWidth: 300 }, children: [_jsxs(Box, { sx: {
|
|
440
|
-
display: 'flex',
|
|
441
|
-
justifyContent: 'space-between',
|
|
442
|
-
fontSize: 0,
|
|
443
|
-
mb: 1,
|
|
444
|
-
}, children: [_jsxs(Text, { sx: { color: costColor, fontWeight: 'semibold' }, children: ["$", runCostUsd.toFixed(4)] }), _jsx(Text, { sx: { color: 'fg.muted' }, children: runBudgetUsd != null
|
|
426
|
+
return (_jsxs(Box, { height: "100%", display: "flex", flexDirection: "column", children: [_jsxs(Box, { display: "flex", alignItems: "center", gap: 3, px: 3, py: 2, borderBottom: "1px solid", borderColor: "border.default", flexShrink: 0, children: [isReconnectedAgent && (_jsx(Label, { variant: "secondary", size: "small", children: "Reconnected" })), _jsxs(Box, { display: "flex", alignItems: "center", gap: 1, children: [_jsx(ShieldCheckIcon, { size: 16 }), _jsxs(Heading, { as: "h3", sx: { fontSize: 2 }, children: ["Guardrails Demo \u2014 ", runtimeName] })] }), _jsx(Label, { variant: wsState === 'connected' ? 'success' : 'secondary', children: wsState }), _jsxs(Box, { flex: 1, maxWidth: 300, children: [_jsxs(Box, { display: "flex", justifyContent: "space-between", fontSize: 0, mb: 1, children: [_jsxs(Text, { sx: { color: costColor, fontWeight: 'semibold' }, children: ["$", runCostUsd.toFixed(4)] }), _jsx(Text, { sx: { color: 'fg.muted' }, children: runBudgetUsd != null
|
|
445
427
|
? ` / $${runBudgetUsd.toFixed(2)} run budget`
|
|
446
|
-
: ' / no run budget' })] }), _jsxs(ProgressBar, { "aria-label": "Run budget usage", "aria-valuenow": Math.max(0, costPercent), sx: { height: 6 }, children: [_jsx(ProgressBar.Item, { progress: usageSafePercent, style: { backgroundColor: 'var(--bgColor-success-emphasis)' }, "aria-label": `Healthy usage ${usageSafePercent.toFixed(1)}%` }), _jsx(ProgressBar.Item, { progress: usageWatchPercent, style: { backgroundColor: 'var(--bgColor-accent-emphasis)' }, "aria-label": `Watch usage ${usageWatchPercent.toFixed(1)}%` }), _jsx(ProgressBar.Item, { progress: usageDangerPercent, style: { backgroundColor: 'var(--bgColor-danger-emphasis)' }, "aria-label": `Critical usage ${usageDangerPercent.toFixed(1)}%` })] }), _jsxs(Box, { sx: {
|
|
447
|
-
display: 'flex',
|
|
448
|
-
alignItems: 'center',
|
|
449
|
-
gap: 2,
|
|
450
|
-
flexWrap: 'wrap',
|
|
451
|
-
mt: 1,
|
|
452
|
-
}, role: "presentation", children: [_jsxs(Box, { sx: { display: 'flex', alignItems: 'center', gap: 1 }, children: [_jsx(DotFillIcon, { size: 12, fill: "var(--bgColor-success-emphasis)" }), _jsx(Text, { sx: { fontSize: 0, color: 'fg.muted' }, children: "0-50%" })] }), _jsxs(Box, { sx: { display: 'flex', alignItems: 'center', gap: 1 }, children: [_jsx(DotFillIcon, { size: 12, fill: "var(--bgColor-accent-emphasis)" }), _jsx(Text, { sx: { fontSize: 0, color: 'fg.muted' }, children: "50-80%" })] }), _jsxs(Box, { sx: { display: 'flex', alignItems: 'center', gap: 1 }, children: [_jsx(DotFillIcon, { size: 12, fill: "var(--bgColor-danger-emphasis)" }), _jsx(Text, { sx: { fontSize: 0, color: 'fg.muted' }, children: "80-100%" })] }), overBudgetPercent > 0 && (_jsxs(Label, { variant: "danger", size: "small", children: ["+", overBudgetPercent.toFixed(1), "% over"] }))] })] }), _jsxs(Label, { variant: otelSampleTimestamp == null ? 'secondary' : 'success', children: ["OTEL ", otelSampleTimestamp == null ? 'waiting' : 'live'] }), cumulativeCostUsd != null && (_jsxs(Label, { variant: "secondary", children: ["Total $", cumulativeCostUsd.toFixed(4)] })), _jsxs(Label, { variant: "secondary", children: [totalTokens.toLocaleString(), " tokens"] })] }), isOverRunBudget && (_jsx(Flash, { variant: "danger", sx: { mx: 3, mt: 2 }, children: _jsxs(Text, { sx: { fontSize: 1 }, children: [_jsx("strong", { children: "Run budget exceeded." }), " Current run cost is $", runCostUsd.toFixed(4), " against a budget of $", runBudgetDisplayUsd, overBudgetAmountUsd > 0
|
|
428
|
+
: ' / no run budget' })] }), _jsxs(ProgressBar, { "aria-label": "Run budget usage", "aria-valuenow": Math.max(0, costPercent), sx: { height: 6 }, children: [_jsx(ProgressBar.Item, { progress: usageSafePercent, style: { backgroundColor: 'var(--bgColor-success-emphasis)' }, "aria-label": `Healthy usage ${usageSafePercent.toFixed(1)}%` }), _jsx(ProgressBar.Item, { progress: usageWatchPercent, style: { backgroundColor: 'var(--bgColor-accent-emphasis)' }, "aria-label": `Watch usage ${usageWatchPercent.toFixed(1)}%` }), _jsx(ProgressBar.Item, { progress: usageDangerPercent, style: { backgroundColor: 'var(--bgColor-danger-emphasis)' }, "aria-label": `Critical usage ${usageDangerPercent.toFixed(1)}%` })] }), _jsxs(Box, { display: "flex", alignItems: "center", gap: 2, flexWrap: "wrap", mt: 1, role: "presentation", children: [_jsxs(Box, { display: "flex", alignItems: "center", gap: 1, children: [_jsx(DotFillIcon, { size: 12, fill: "var(--bgColor-success-emphasis)" }), _jsx(Text, { sx: { fontSize: 0, color: 'fg.muted' }, children: "0-50%" })] }), _jsxs(Box, { display: "flex", alignItems: "center", gap: 1, children: [_jsx(DotFillIcon, { size: 12, fill: "var(--bgColor-accent-emphasis)" }), _jsx(Text, { sx: { fontSize: 0, color: 'fg.muted' }, children: "50-80%" })] }), _jsxs(Box, { display: "flex", alignItems: "center", gap: 1, children: [_jsx(DotFillIcon, { size: 12, fill: "var(--bgColor-danger-emphasis)" }), _jsx(Text, { sx: { fontSize: 0, color: 'fg.muted' }, children: "80-100%" })] }), overBudgetPercent > 0 && (_jsxs(Label, { variant: "danger", size: "small", children: ["+", overBudgetPercent.toFixed(1), "% over"] }))] })] }), _jsxs(Label, { variant: otelSampleTimestamp == null ? 'secondary' : 'success', children: ["OTEL ", otelSampleTimestamp == null ? 'waiting' : 'live'] }), cumulativeCostUsd != null && (_jsxs(Label, { variant: "secondary", children: ["Total $", cumulativeCostUsd.toFixed(4)] })), _jsxs(Label, { variant: "secondary", children: [totalTokens.toLocaleString(), " tokens"] })] }), isOverRunBudget && (_jsx(Flash, { variant: "danger", sx: { mx: 3, mt: 2 }, children: _jsxs(Text, { sx: { fontSize: 1 }, children: [_jsx("strong", { children: "Run budget exceeded." }), " Current run cost is $", runCostUsd.toFixed(4), " against a budget of $", runBudgetDisplayUsd, overBudgetAmountUsd > 0
|
|
453
429
|
? ` (over by $${overBudgetAmountUsd.toFixed(4)}).`
|
|
454
|
-
: '.', ' ', "Start a new run or increase the run budget before continuing."] }) })), approvals.map(req => (_jsx(Flash, { variant: "warning", sx: { mx: 3, mt: 2 }, children: _jsxs(Box, {
|
|
430
|
+
: '.', ' ', "Start a new run or increase the run budget before continuing."] }) })), approvals.map(req => (_jsx(Flash, { variant: "warning", sx: { mx: 3, mt: 2 }, children: _jsxs(Box, { display: "flex", alignItems: "center", gap: 2, children: [_jsxs(Text, { sx: { flex: 1, fontSize: 1 }, children: [_jsx("strong", { children: req.tool_name }), " requests approval", req.tool_args
|
|
455
431
|
? ` — ${JSON.stringify(req.tool_args).slice(0, 120)}`
|
|
456
|
-
: ''] }), _jsx(Button, { size: "small", variant: "primary", leadingVisual: CheckIcon, onClick: () => handleApprove(req.id), disabled: approvalLoading === req.id, children: "Approve" }), _jsx(Button, { size: "small", variant: "danger", leadingVisual: XIcon, onClick: () => handleReject(req.id), disabled: approvalLoading === req.id, children: "Reject" })] }) }, req.id))), _jsx(Box, {
|
|
432
|
+
: ''] }), _jsx(Button, { size: "small", variant: "primary", leadingVisual: CheckIcon, onClick: () => handleApprove(req.id), disabled: approvalLoading === req.id, children: "Approve" }), _jsx(Button, { size: "small", variant: "danger", leadingVisual: XIcon, onClick: () => handleReject(req.id), disabled: approvalLoading === req.id, children: "Reject" })] }) }, req.id))), _jsx(Box, { flex: 1, minHeight: 0, children: _jsx(LoopEmbed, { serverUrl: agentBaseUrl, target: "local", showAgentVariants: true, agentId: agentId, editors: false, showHeader: true, plugins: chatPlugins }) })] }));
|
|
457
433
|
};
|
|
458
434
|
// ─── Sync token to core IAM store ──────────────────────────────────────────
|
|
459
435
|
const syncTokenToIamStore = (token) => {
|
|
@@ -27,7 +27,7 @@ const AgentHooksExample = () => {
|
|
|
27
27
|
// Unique per mount, so two tabs do not fight over one server-side agent.
|
|
28
28
|
const agentName = useMemo(() => uniqueAgentId(AGENT_NAME), []);
|
|
29
29
|
const plugins = useMemo(() => [AgentHooksPlugin], []);
|
|
30
|
-
return (_jsx(ThemedProvider, { children: _jsx(Box, {
|
|
30
|
+
return (_jsx(ThemedProvider, { children: _jsx(Box, { height: "100vh", minHeight: 0, children: _jsx(LoopEmbed
|
|
31
31
|
// The examples Vite server has no /api proxy; the page origin would
|
|
32
32
|
// send agent creation to port 3000 and fail loudly.
|
|
33
33
|
, {
|
|
@@ -6,7 +6,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
6
6
|
/// <reference types="vite/client" />
|
|
7
7
|
import { useCallback, useEffect, useMemo, useRef, useState, } from 'react';
|
|
8
8
|
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
|
9
|
-
import {
|
|
9
|
+
import { Box } from '@datalayer/primer-addons';
|
|
10
|
+
import { Button, Heading, SegmentedControl, Spinner, Text, } from '@primer/react';
|
|
10
11
|
import { ThemedProvider } from './utils/themedProvider';
|
|
11
12
|
import { uniqueAgentId } from './utils/agentId';
|
|
12
13
|
import { useExampleAgentRuntimesUrl } from './utils/useExampleAgentRuntimesUrl';
|
|
@@ -30,18 +31,7 @@ const stringifyPayload = (value) => {
|
|
|
30
31
|
return String(value);
|
|
31
32
|
}
|
|
32
33
|
};
|
|
33
|
-
const ProviderBadge = ({ provider, }) => (_jsx(Box, {
|
|
34
|
-
px: 2,
|
|
35
|
-
py: '2px',
|
|
36
|
-
borderRadius: 999,
|
|
37
|
-
border: '1px solid',
|
|
38
|
-
borderColor: 'border.default',
|
|
39
|
-
fontSize: 0,
|
|
40
|
-
color: 'fg.muted',
|
|
41
|
-
bg: 'canvas.default',
|
|
42
|
-
textTransform: 'uppercase',
|
|
43
|
-
letterSpacing: '0.03em',
|
|
44
|
-
}, children: provider }));
|
|
34
|
+
const ProviderBadge = ({ provider, }) => (_jsx(Box, { px: 2, py: "2px", borderRadius: 999, border: "1px solid", borderColor: "border.default", fontSize: 0, color: "fg.muted", bg: "canvas.default", textTransform: "uppercase", letterSpacing: "0.03em", children: provider }));
|
|
45
35
|
const AgentInferenceProviderExampleInner = () => {
|
|
46
36
|
const { token } = useSimpleAuthStore();
|
|
47
37
|
const [provider, setProvider] = useState('local');
|
|
@@ -187,88 +177,7 @@ const AgentInferenceProviderExampleInner = () => {
|
|
|
187
177
|
return next;
|
|
188
178
|
});
|
|
189
179
|
}, []);
|
|
190
|
-
return (_jsx(ThemedProvider, { children: _jsxs(Box, { sx: {
|
|
191
|
-
height: '100%',
|
|
192
|
-
minHeight: 0,
|
|
193
|
-
width: '100%',
|
|
194
|
-
display: 'grid',
|
|
195
|
-
gridTemplateColumns: ['1fr', '1fr', 'minmax(680px, 1fr) 420px'],
|
|
196
|
-
gridTemplateRows: 'minmax(0, 1fr)',
|
|
197
|
-
overflow: 'hidden',
|
|
198
|
-
bg: 'canvas.default',
|
|
199
|
-
}, children: [_jsxs(Box, { sx: {
|
|
200
|
-
height: '100%',
|
|
201
|
-
borderRight: ['none', 'none', '1px solid'],
|
|
202
|
-
borderColor: 'border.default',
|
|
203
|
-
p: 3,
|
|
204
|
-
display: 'flex',
|
|
205
|
-
flexDirection: 'column',
|
|
206
|
-
gap: 3,
|
|
207
|
-
minHeight: 0,
|
|
208
|
-
overflow: 'hidden',
|
|
209
|
-
}, children: [_jsxs(Box, { sx: {
|
|
210
|
-
display: 'flex',
|
|
211
|
-
justifyContent: 'space-between',
|
|
212
|
-
alignItems: 'center',
|
|
213
|
-
flexWrap: 'wrap',
|
|
214
|
-
gap: 2,
|
|
215
|
-
}, children: [_jsxs(Box, { children: [_jsx(Heading, { as: "h2", sx: { fontSize: 4, mb: 1 }, children: "Agent Inference Provider Example" }), _jsxs(Text, { sx: { color: 'fg.muted', fontSize: 1 }, children: ["Launches a local agent runtime from ", AGENTSPEC_ID, " and lets you switch between local and datalayer inference."] })] }), _jsx(ProviderBadge, { provider: provider })] }), _jsxs(SegmentedControl, { "aria-label": "Inference provider", fullWidth: true, children: [_jsx(SegmentedControl.Button, { selected: provider === 'local', onClick: () => onProviderChange('local'), children: "local" }), _jsx(SegmentedControl.Button, { selected: provider === 'datalayer', onClick: () => onProviderChange('datalayer'), children: "datalayer" })] }), _jsxs(Box, { sx: {
|
|
216
|
-
display: 'flex',
|
|
217
|
-
gap: 2,
|
|
218
|
-
alignItems: 'center',
|
|
219
|
-
flexWrap: 'wrap',
|
|
220
|
-
}, children: [isLaunching ? _jsx(Spinner, { size: "small" }) : null, _jsxs(Text, { sx: { fontSize: 1, color: 'fg.muted' }, children: ["Runtime URL: ", baseUrl] }), _jsxs(Text, { sx: { fontSize: 1, color: 'fg.muted' }, children: ["Inference URL: ", inferenceUrl] }), _jsxs(Text, { sx: { fontSize: 1, color: 'fg.muted' }, children: ["Agent ID: ", agentId || 'launching...'] })] }), error ? (_jsx(Box, { sx: {
|
|
221
|
-
p: 2,
|
|
222
|
-
borderRadius: 2,
|
|
223
|
-
border: '1px solid',
|
|
224
|
-
borderColor: 'danger.emphasis',
|
|
225
|
-
bg: 'danger.subtle',
|
|
226
|
-
color: 'danger.fg',
|
|
227
|
-
fontSize: 1,
|
|
228
|
-
}, children: error })) : null, _jsx(Box, { sx: {
|
|
229
|
-
flexGrow: 1,
|
|
230
|
-
flexShrink: 1,
|
|
231
|
-
flexBasis: 0,
|
|
232
|
-
minHeight: 0,
|
|
233
|
-
border: '1px solid',
|
|
234
|
-
borderColor: 'border.default',
|
|
235
|
-
borderRadius: 2,
|
|
236
|
-
overflow: 'hidden',
|
|
237
|
-
bg: 'canvas.default',
|
|
238
|
-
}, children: agentId && !isLaunching ? (_jsx(LoopEmbed, { serverUrl: baseUrl, target: "local", showAgentVariants: true, agentId: agentId, editors: false, showHeader: true, plugins: plugins }, agentId)) : (_jsxs(Box, { sx: {
|
|
239
|
-
height: '100%',
|
|
240
|
-
display: 'flex',
|
|
241
|
-
alignItems: 'center',
|
|
242
|
-
justifyContent: 'center',
|
|
243
|
-
gap: 2,
|
|
244
|
-
color: 'fg.muted',
|
|
245
|
-
}, children: [_jsx(Spinner, { size: "small" }), _jsx(Text, { sx: { fontSize: 1 }, children: "Launching provider runtime\u2026" })] })) })] }), _jsxs(Box, { sx: {
|
|
246
|
-
p: 3,
|
|
247
|
-
display: ['none', 'none', 'flex'],
|
|
248
|
-
flexDirection: 'column',
|
|
249
|
-
gap: 2,
|
|
250
|
-
minHeight: 0,
|
|
251
|
-
overflow: 'hidden',
|
|
252
|
-
bg: 'canvas.default',
|
|
253
|
-
}, children: [_jsx(Heading, { as: "h3", sx: { fontSize: 2 }, children: "Provider Event Stream" }), _jsx(Text, { sx: { color: 'fg.muted', fontSize: 1 }, children: "Low-level request/response events exchanged with the inference provider (newest first)." }), _jsx(Box, { sx: {
|
|
254
|
-
flex: 1,
|
|
255
|
-
minHeight: 0,
|
|
256
|
-
overflowY: 'auto',
|
|
257
|
-
display: 'flex',
|
|
258
|
-
flexDirection: 'column',
|
|
259
|
-
gap: 2,
|
|
260
|
-
}, children: providerEvents.length === 0 ? (_jsx(Box, { sx: {
|
|
261
|
-
border: '1px dashed',
|
|
262
|
-
borderColor: 'border.default',
|
|
263
|
-
borderRadius: 2,
|
|
264
|
-
p: 3,
|
|
265
|
-
}, children: _jsx(Text, { sx: { color: 'fg.muted', fontSize: 1 }, children: "No provider events yet." }) })) : (orderedProviderEvents.map(event => (_jsxs(Box, { sx: {
|
|
266
|
-
border: '1px solid',
|
|
267
|
-
borderColor: 'border.default',
|
|
268
|
-
borderRadius: 2,
|
|
269
|
-
p: 2,
|
|
270
|
-
bg: 'canvas.default',
|
|
271
|
-
}, children: [_jsx(Text, { sx: {
|
|
180
|
+
return (_jsx(ThemedProvider, { children: _jsxs(Box, { height: "100%", minHeight: 0, width: "100%", display: "grid", gridTemplateColumns: ['1fr', '1fr', 'minmax(680px, 1fr) 420px'], gridTemplateRows: "minmax(0, 1fr)", overflow: "hidden", bg: "canvas.default", children: [_jsxs(Box, { height: "100%", borderRight: ['none', 'none', '1px solid'], borderColor: "border.default", p: 3, display: "flex", flexDirection: "column", gap: 3, minHeight: 0, overflow: "hidden", children: [_jsxs(Box, { display: "flex", justifyContent: "space-between", alignItems: "center", flexWrap: "wrap", gap: 2, children: [_jsxs(Box, { children: [_jsx(Heading, { as: "h2", sx: { fontSize: 4, mb: 1 }, children: "Agent Inference Provider Example" }), _jsxs(Text, { sx: { color: 'fg.muted', fontSize: 1 }, children: ["Launches a local agent runtime from ", AGENTSPEC_ID, " and lets you switch between local and datalayer inference."] })] }), _jsx(ProviderBadge, { provider: provider })] }), _jsxs(SegmentedControl, { "aria-label": "Inference provider", fullWidth: true, children: [_jsx(SegmentedControl.Button, { selected: provider === 'local', onClick: () => onProviderChange('local'), children: "local" }), _jsx(SegmentedControl.Button, { selected: provider === 'datalayer', onClick: () => onProviderChange('datalayer'), children: "datalayer" })] }), _jsxs(Box, { display: "flex", gap: 2, alignItems: "center", flexWrap: "wrap", children: [isLaunching ? _jsx(Spinner, { size: "small" }) : null, _jsxs(Text, { sx: { fontSize: 1, color: 'fg.muted' }, children: ["Runtime URL: ", baseUrl] }), _jsxs(Text, { sx: { fontSize: 1, color: 'fg.muted' }, children: ["Inference URL: ", inferenceUrl] }), _jsxs(Text, { sx: { fontSize: 1, color: 'fg.muted' }, children: ["Agent ID: ", agentId || 'launching...'] })] }), error ? (_jsx(Box, { p: 2, borderRadius: 2, border: "1px solid", borderColor: "danger.emphasis", bg: "danger.subtle", color: "danger.fg", fontSize: 1, children: error })) : null, _jsx(Box, { flexGrow: 1, flexShrink: 1, flexBasis: 0, minHeight: 0, border: "1px solid", borderColor: "border.default", borderRadius: 2, overflow: "hidden", bg: "canvas.default", children: agentId && !isLaunching ? (_jsx(LoopEmbed, { serverUrl: baseUrl, target: "local", showAgentVariants: true, agentId: agentId, editors: false, showHeader: true, plugins: plugins }, agentId)) : (_jsxs(Box, { height: "100%", display: "flex", alignItems: "center", justifyContent: "center", gap: 2, color: "fg.muted", children: [_jsx(Spinner, { size: "small" }), _jsx(Text, { sx: { fontSize: 1 }, children: "Launching provider runtime\u2026" })] })) })] }), _jsxs(Box, { p: 3, display: ['none', 'none', 'flex'], flexDirection: "column", gap: 2, minHeight: 0, overflow: "hidden", bg: "canvas.default", children: [_jsx(Heading, { as: "h3", sx: { fontSize: 2 }, children: "Provider Event Stream" }), _jsx(Text, { sx: { color: 'fg.muted', fontSize: 1 }, children: "Low-level request/response events exchanged with the inference provider (newest first)." }), _jsx(Box, { flex: 1, minHeight: 0, overflowY: "auto", display: "flex", flexDirection: "column", gap: 2, children: providerEvents.length === 0 ? (_jsx(Box, { border: "1px dashed", borderColor: "border.default", borderRadius: 2, p: 3, children: _jsx(Text, { sx: { color: 'fg.muted', fontSize: 1 }, children: "No provider events yet." }) })) : (orderedProviderEvents.map(event => (_jsxs(Box, { border: "1px solid", borderColor: "border.default", borderRadius: 2, p: 2, bg: "canvas.default", children: [_jsx(Text, { sx: {
|
|
272
181
|
display: 'block',
|
|
273
182
|
fontSize: 0,
|
|
274
183
|
color: 'fg.muted',
|
|
@@ -284,7 +193,7 @@ const AgentInferenceProviderExampleInner = () => {
|
|
|
284
193
|
color: 'fg.muted',
|
|
285
194
|
fontSize: 0,
|
|
286
195
|
mt: 1,
|
|
287
|
-
}, children: new Date(event.createdAt).toLocaleTimeString() }), _jsx(Box, {
|
|
196
|
+
}, children: new Date(event.createdAt).toLocaleTimeString() }), _jsx(Box, { mt: 2, children: _jsx(Button, { size: "small", variant: "invisible", onClick: () => toggleEventExpanded(event.id), children: expandedEventIds.has(event.id)
|
|
288
197
|
? 'Hide details'
|
|
289
198
|
: 'Show details' }) }), expandedEventIds.has(event.id) ? (_jsx(Text, { as: "pre", sx: {
|
|
290
199
|
mt: 2,
|
|
@@ -41,29 +41,15 @@ const McpToolCard = ({ tool }) => {
|
|
|
41
41
|
const schemaProps = tool.inputSchema
|
|
42
42
|
?.properties;
|
|
43
43
|
const paramNames = schemaProps ? Object.keys(schemaProps) : [];
|
|
44
|
-
return (_jsxs(Box, { sx: {
|
|
45
|
-
border: '1px solid',
|
|
46
|
-
borderColor: 'border.default',
|
|
47
|
-
borderRadius: 2,
|
|
48
|
-
p: 2,
|
|
49
|
-
mb: 2,
|
|
50
|
-
bg: 'canvas.default',
|
|
51
|
-
}, children: [_jsxs(Box, { sx: { display: 'flex', alignItems: 'center', gap: 1, mb: 1 }, children: [_jsx(ToolsIcon, { size: 14 }), _jsx(Text, { sx: { fontWeight: 600, fontSize: 1 }, children: tool.name })] }), tool.description && (_jsx(Text, { as: "p", sx: { fontSize: 0, color: 'fg.muted', mb: 1, mt: 0 }, children: tool.description })), _jsxs(Text, { sx: {
|
|
44
|
+
return (_jsxs(Box, { border: "1px solid", borderColor: "border.default", borderRadius: 2, p: 2, mb: 2, bg: "canvas.default", children: [_jsxs(Box, { display: "flex", alignItems: "center", gap: 1, mb: 1, children: [_jsx(ToolsIcon, { size: 14 }), _jsx(Text, { sx: { fontWeight: 600, fontSize: 1 }, children: tool.name })] }), tool.description && (_jsx(Text, { as: "p", sx: { fontSize: 0, color: 'fg.muted', mb: 1, mt: 0 }, children: tool.description })), _jsxs(Text, { sx: {
|
|
52
45
|
fontSize: 0,
|
|
53
46
|
fontFamily: 'mono',
|
|
54
47
|
color: 'fg.muted',
|
|
55
48
|
display: 'block',
|
|
56
|
-
}, children: ["server: ", tool.serverName] }), paramNames.length > 0 && (_jsx(Box, {
|
|
49
|
+
}, children: ["server: ", tool.serverName] }), paramNames.length > 0 && (_jsx(Box, { mt: 1, display: "flex", gap: 1, flexWrap: "wrap", children: paramNames.map(p => (_jsx(PrimerToken, { text: p, size: "small" }, p))) }))] }));
|
|
57
50
|
};
|
|
58
51
|
/* ── Server status card ───────────────────────────────── */
|
|
59
|
-
const McpServerCard = ({ server }) => (_jsxs(Box, { sx: {
|
|
60
|
-
p: 2,
|
|
61
|
-
mb: 2,
|
|
62
|
-
border: '1px solid',
|
|
63
|
-
borderColor: 'border.default',
|
|
64
|
-
borderRadius: 2,
|
|
65
|
-
bg: 'canvas.default',
|
|
66
|
-
}, children: [_jsxs(Box, { sx: { display: 'flex', alignItems: 'center', gap: 1, mb: 1 }, children: [server.emoji && _jsx(Text, { sx: { fontSize: 2 }, children: server.emoji }), _jsx(Text, { sx: { fontWeight: 600, fontSize: 1 }, children: server.name }), _jsx(Label, { size: "small", variant: server.status === 'started' ? 'success' : 'secondary', children: server.status })] }), server.description && (_jsx(Text, { as: "p", sx: { fontSize: 0, color: 'fg.muted', mt: 0, mb: 1 }, children: server.description })), _jsxs(Text, { sx: { fontSize: 0, color: 'fg.muted' }, children: [server.toolsCount, " tool", server.toolsCount !== 1 ? 's' : '', " available"] })] }));
|
|
52
|
+
const McpServerCard = ({ server }) => (_jsxs(Box, { p: 2, mb: 2, border: "1px solid", borderColor: "border.default", borderRadius: 2, bg: "canvas.default", children: [_jsxs(Box, { display: "flex", alignItems: "center", gap: 1, mb: 1, children: [server.emoji && _jsx(Text, { sx: { fontSize: 2 }, children: server.emoji }), _jsx(Text, { sx: { fontWeight: 600, fontSize: 1 }, children: server.name }), _jsx(Label, { size: "small", variant: server.status === 'started' ? 'success' : 'secondary', children: server.status })] }), server.description && (_jsx(Text, { as: "p", sx: { fontSize: 0, color: 'fg.muted', mt: 0, mb: 1 }, children: server.description })), _jsxs(Text, { sx: { fontSize: 0, color: 'fg.muted' }, children: [server.toolsCount, " tool", server.toolsCount !== 1 ? 's' : '', " available"] })] }));
|
|
67
53
|
const McpStatusPanel = ({ data }) => {
|
|
68
54
|
const servers = data?.servers ?? [];
|
|
69
55
|
const aggregate = deriveAggregate(servers);
|
|
@@ -71,43 +57,10 @@ const McpStatusPanel = ({ data }) => {
|
|
|
71
57
|
return (_jsx(Text, { sx: { color: 'fg.muted', fontSize: 1 }, children: "Waiting for websocket snapshot..." }));
|
|
72
58
|
}
|
|
73
59
|
if (aggregate === 'none') {
|
|
74
|
-
return (_jsxs(Box, { sx: {
|
|
75
|
-
p: 2,
|
|
76
|
-
border: '1px solid',
|
|
77
|
-
borderColor: 'border.default',
|
|
78
|
-
borderRadius: 2,
|
|
79
|
-
display: 'flex',
|
|
80
|
-
alignItems: 'center',
|
|
81
|
-
gap: 2,
|
|
82
|
-
}, children: [_jsx(ServerIcon, { size: 16 }), _jsx(Text, { sx: { fontSize: 0, color: 'fg.muted' }, children: "No MCP server is defined for this agent." })] }));
|
|
60
|
+
return (_jsxs(Box, { p: 2, border: "1px solid", borderColor: "border.default", borderRadius: 2, display: "flex", alignItems: "center", gap: 2, children: [_jsx(ServerIcon, { size: 16 }), _jsx(Text, { sx: { fontSize: 0, color: 'fg.muted' }, children: "No MCP server is defined for this agent." })] }));
|
|
83
61
|
}
|
|
84
|
-
return (_jsxs(Box, {
|
|
85
|
-
|
|
86
|
-
alignItems: 'center',
|
|
87
|
-
gap: 2,
|
|
88
|
-
}, children: [_jsx(Box, { as: "span", sx: {
|
|
89
|
-
display: 'inline-block',
|
|
90
|
-
width: 10,
|
|
91
|
-
height: 10,
|
|
92
|
-
borderRadius: '50%',
|
|
93
|
-
bg: MCP_STATUS_COLORS[aggregate],
|
|
94
|
-
flexShrink: 0,
|
|
95
|
-
} }), _jsx(Text, { sx: { fontSize: 1 }, children: MCP_STATUS_LABELS[aggregate] })] }), servers.map(s => (_jsx(Box, { sx: {
|
|
96
|
-
p: 2,
|
|
97
|
-
border: '1px solid',
|
|
98
|
-
borderColor: 'border.default',
|
|
99
|
-
borderRadius: 2,
|
|
100
|
-
display: 'flex',
|
|
101
|
-
alignItems: 'center',
|
|
102
|
-
gap: 2,
|
|
103
|
-
}, children: _jsxs(Box, { sx: { flex: 1, minWidth: 0 }, children: [_jsxs(Box, { sx: { display: 'flex', alignItems: 'center', gap: 1 }, children: [s.status === 'started' ? (_jsx(CheckCircleIcon, { size: 14, fill: "success.fg" })) : s.status === 'failed' ? (_jsx(XCircleIcon, { size: 14, fill: "danger.fg" })) : (_jsx(Box, { as: "span", sx: {
|
|
104
|
-
width: 8,
|
|
105
|
-
height: 8,
|
|
106
|
-
borderRadius: '50%',
|
|
107
|
-
bg: MCP_STATUS_COLORS[s.status] ??
|
|
108
|
-
MCP_STATUS_COLORS.not_started,
|
|
109
|
-
display: 'inline-block',
|
|
110
|
-
} })), _jsx(Text, { sx: { fontSize: 1, fontWeight: 'bold' }, children: s.id })] }), _jsxs(Text, { sx: { fontSize: 0, color: 'fg.muted' }, children: [s.status, s.status === 'started' && s.tools_count !== undefined
|
|
62
|
+
return (_jsxs(Box, { display: "flex", flexDirection: "column", gap: 2, children: [_jsxs(Box, { display: "flex", alignItems: "center", gap: 2, children: [_jsx(Box, { as: "span", display: "inline-block", width: 10, height: 10, borderRadius: "50%", bg: MCP_STATUS_COLORS[aggregate], flexShrink: 0 }), _jsx(Text, { sx: { fontSize: 1 }, children: MCP_STATUS_LABELS[aggregate] })] }), servers.map(s => (_jsx(Box, { p: 2, border: "1px solid", borderColor: "border.default", borderRadius: 2, display: "flex", alignItems: "center", gap: 2, children: _jsxs(Box, { flex: 1, minWidth: 0, children: [_jsxs(Box, { display: "flex", alignItems: "center", gap: 1, children: [s.status === 'started' ? (_jsx(CheckCircleIcon, { size: 14, fill: "success.fg" })) : s.status === 'failed' ? (_jsx(XCircleIcon, { size: 14, fill: "danger.fg" })) : (_jsx(Box, { as: "span", width: 8, height: 8, borderRadius: "50%", bg: MCP_STATUS_COLORS[s.status] ??
|
|
63
|
+
MCP_STATUS_COLORS.not_started, display: "inline-block" })), _jsx(Text, { sx: { fontSize: 1, fontWeight: 'bold' }, children: s.id })] }), _jsxs(Text, { sx: { fontSize: 0, color: 'fg.muted' }, children: [s.status, s.status === 'started' && s.tools_count !== undefined
|
|
111
64
|
? ` · ${s.tools_count} tool${s.tools_count !== 1 ? 's' : ''}`
|
|
112
65
|
: '', s.status === 'failed' && s.error ? ` — ${s.error}` : ''] })] }) }, s.id)))] }));
|
|
113
66
|
};
|
|
@@ -350,58 +303,7 @@ const AgentMCPInner = ({ onLogout }) => {
|
|
|
350
303
|
if (runtimeStatus === 'error' || hookError) {
|
|
351
304
|
return _jsx(ErrorView, { error: hookError, onLogout: onLogout });
|
|
352
305
|
}
|
|
353
|
-
return (_jsxs(Box, { sx: {
|
|
354
|
-
height: '100%',
|
|
355
|
-
display: 'flex',
|
|
356
|
-
flexDirection: 'column',
|
|
357
|
-
}, children: [isReconnectedAgent && (_jsx(Box, { sx: {
|
|
358
|
-
px: 3,
|
|
359
|
-
py: 1,
|
|
360
|
-
borderBottom: '1px solid',
|
|
361
|
-
borderColor: 'border.default',
|
|
362
|
-
}, children: _jsx(Text, { sx: { color: 'fg.muted', fontSize: 0 }, children: "Agent already running - reconnected." }) })), _jsxs(Box, { sx: { flex: 1, minHeight: 0, display: 'flex' }, children: [_jsx(Box, { sx: { flex: 1, minWidth: 0 }, children: _jsx(LoopEmbed, { serverUrl: agentBaseUrl, target: "local", showAgentVariants: true, agentId: agentId, editors: false, showHeader: true, plugins: chatPlugins }) }), _jsxs(Box, { sx: {
|
|
363
|
-
width: 320,
|
|
364
|
-
minWidth: 260,
|
|
365
|
-
borderLeft: '1px solid',
|
|
366
|
-
borderColor: 'border.default',
|
|
367
|
-
display: 'flex',
|
|
368
|
-
flexDirection: 'column',
|
|
369
|
-
minHeight: 0,
|
|
370
|
-
bg: 'canvas.default',
|
|
371
|
-
}, children: [_jsxs(Box, { sx: {
|
|
372
|
-
p: 2,
|
|
373
|
-
borderBottom: '1px solid',
|
|
374
|
-
borderColor: 'border.default',
|
|
375
|
-
}, children: [_jsx(Heading, { as: "h4", sx: { fontSize: 1, mb: 1 }, children: _jsxs(Box, { sx: { display: 'inline-flex', alignItems: 'center', gap: 1 }, children: [_jsx(ServerIcon, { size: 16 }), "MCP Servers & Tools"] }) }), _jsxs(Box, { sx: { display: 'flex', alignItems: 'center', gap: 2 }, children: [_jsx(Box, { as: "span", sx: {
|
|
376
|
-
display: 'inline-block',
|
|
377
|
-
width: 8,
|
|
378
|
-
height: 8,
|
|
379
|
-
borderRadius: '50%',
|
|
380
|
-
bg: MCP_STATUS_COLORS[aggregate],
|
|
381
|
-
flexShrink: 0,
|
|
382
|
-
} }), _jsxs(Text, { sx: { fontSize: 0, color: 'fg.muted' }, children: [MCP_STATUS_LABELS[aggregate], " \u00B7 ", totalTools, " tool", totalTools !== 1 ? 's' : ''] })] })] }), _jsxs(Box, { sx: { p: 2, overflow: 'auto', flex: 1 }, children: [_jsxs(Box, { sx: { mb: 3 }, children: [_jsx(Heading, { as: "h5", sx: { fontSize: 1, mb: 2 }, children: "MCP Servers" }), _jsx(McpStatusPanel, { data: mcpStatusData })] }), mcpServers.length === 0 ? (_jsxs(Box, { sx: {
|
|
383
|
-
display: 'flex',
|
|
384
|
-
flexDirection: 'column',
|
|
385
|
-
alignItems: 'center',
|
|
386
|
-
gap: 2,
|
|
387
|
-
py: 4,
|
|
388
|
-
}, children: [_jsx(Spinner, { size: "medium" }), _jsx(Text, { sx: { fontSize: 0, color: 'fg.muted' }, children: "Waiting for MCP servers to start..." })] })) : (_jsxs(_Fragment, { children: [mcpServers.map(server => (_jsxs(Box, { children: [_jsx(McpServerCard, { server: server }), server.tools.length > 0 && (_jsx(Box, { sx: { pl: 2 }, children: server.tools.map(tool => (_jsx(McpToolCard, { tool: tool }, `${tool.serverId}-${tool.name}`))) }))] }, server.id))), _jsxs(Box, { sx: {
|
|
389
|
-
mt: 3,
|
|
390
|
-
p: 2,
|
|
391
|
-
borderRadius: 2,
|
|
392
|
-
bg: 'canvas.default',
|
|
393
|
-
border: '1px solid',
|
|
394
|
-
borderColor: 'border.muted',
|
|
395
|
-
}, children: [_jsx(Heading, { as: "h5", sx: { fontSize: 0, mb: 1 }, children: "MCP (Model Context Protocol)" }), _jsxs(Box, { sx: { fontSize: 0, color: 'fg.muted' }, children: [_jsxs(Box, { sx: {
|
|
396
|
-
display: 'flex',
|
|
397
|
-
alignItems: 'center',
|
|
398
|
-
gap: 1,
|
|
399
|
-
mb: 1,
|
|
400
|
-
}, children: [_jsx(GlobeIcon, { size: 12 }), _jsxs(Text, { children: [_jsx("strong", { children: "Servers:" }), " Discover and start MCP servers that expose tools to the agent"] })] }), _jsxs(Box, { sx: {
|
|
401
|
-
display: 'flex',
|
|
402
|
-
alignItems: 'center',
|
|
403
|
-
gap: 1,
|
|
404
|
-
}, children: [_jsx(ToolsIcon, { size: 12 }), _jsxs(Text, { children: [_jsx("strong", { children: "Tools:" }), " Individual capabilities exposed by each server (search, fetch, etc.)"] })] })] })] })] }))] })] })] })] }));
|
|
306
|
+
return (_jsxs(Box, { height: "100%", display: "flex", flexDirection: "column", children: [isReconnectedAgent && (_jsx(Box, { px: 3, py: 1, borderBottom: "1px solid", borderColor: "border.default", children: _jsx(Text, { sx: { color: 'fg.muted', fontSize: 0 }, children: "Agent already running - reconnected." }) })), _jsxs(Box, { flex: 1, minHeight: 0, display: "flex", children: [_jsx(Box, { flex: 1, minWidth: 0, children: _jsx(LoopEmbed, { serverUrl: agentBaseUrl, target: "local", showAgentVariants: true, agentId: agentId, editors: false, showHeader: true, plugins: chatPlugins }) }), _jsxs(Box, { width: 320, minWidth: 260, borderLeft: "1px solid", borderColor: "border.default", display: "flex", flexDirection: "column", minHeight: 0, bg: "canvas.default", children: [_jsxs(Box, { p: 2, borderBottom: "1px solid", borderColor: "border.default", children: [_jsx(Heading, { as: "h4", sx: { fontSize: 1, mb: 1 }, children: _jsxs(Box, { display: "inline-flex", alignItems: "center", gap: 1, children: [_jsx(ServerIcon, { size: 16 }), "MCP Servers & Tools"] }) }), _jsxs(Box, { display: "flex", alignItems: "center", gap: 2, children: [_jsx(Box, { as: "span", display: "inline-block", width: 8, height: 8, borderRadius: "50%", bg: MCP_STATUS_COLORS[aggregate], flexShrink: 0 }), _jsxs(Text, { sx: { fontSize: 0, color: 'fg.muted' }, children: [MCP_STATUS_LABELS[aggregate], " \u00B7 ", totalTools, " tool", totalTools !== 1 ? 's' : ''] })] })] }), _jsxs(Box, { p: 2, overflow: "auto", flex: 1, children: [_jsxs(Box, { mb: 3, children: [_jsx(Heading, { as: "h5", sx: { fontSize: 1, mb: 2 }, children: "MCP Servers" }), _jsx(McpStatusPanel, { data: mcpStatusData })] }), mcpServers.length === 0 ? (_jsxs(Box, { display: "flex", flexDirection: "column", alignItems: "center", gap: 2, py: 4, children: [_jsx(Spinner, { size: "medium" }), _jsx(Text, { sx: { fontSize: 0, color: 'fg.muted' }, children: "Waiting for MCP servers to start..." })] })) : (_jsxs(_Fragment, { children: [mcpServers.map(server => (_jsxs(Box, { children: [_jsx(McpServerCard, { server: server }), server.tools.length > 0 && (_jsx(Box, { pl: 2, children: server.tools.map(tool => (_jsx(McpToolCard, { tool: tool }, `${tool.serverId}-${tool.name}`))) }))] }, server.id))), _jsxs(Box, { mt: 3, p: 2, borderRadius: 2, bg: "canvas.default", border: "1px solid", borderColor: "border.muted", children: [_jsx(Heading, { as: "h5", sx: { fontSize: 0, mb: 1 }, children: "MCP (Model Context Protocol)" }), _jsxs(Box, { fontSize: 0, color: "fg.muted", children: [_jsxs(Box, { display: "flex", alignItems: "center", gap: 1, mb: 1, children: [_jsx(GlobeIcon, { size: 12 }), _jsxs(Text, { children: [_jsx("strong", { children: "Servers:" }), " Discover and start MCP servers that expose tools to the agent"] })] }), _jsxs(Box, { display: "flex", alignItems: "center", gap: 1, children: [_jsx(ToolsIcon, { size: 12 }), _jsxs(Text, { children: [_jsx("strong", { children: "Tools:" }), " Individual capabilities exposed by each server (search, fetch, etc.)"] })] })] })] })] }))] })] })] })] }));
|
|
405
307
|
};
|
|
406
308
|
const syncTokenToIamStore = (token) => {
|
|
407
309
|
import('../state/substates').then(({ iamStore }) => {
|