@assistant-ui/react-devtools 1.2.6 → 1.2.7
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 +26 -8
- package/dist/DevToolsModal.d.ts +18 -2
- package/dist/DevToolsModal.d.ts.map +1 -1
- package/dist/DevToolsModal.js +25 -232
- package/dist/DevToolsModal.js.map +1 -1
- package/dist/DevToolsModalImpl.d.ts +11 -0
- package/dist/DevToolsModalImpl.d.ts.map +1 -0
- package/dist/DevToolsModalImpl.js +62 -0
- package/dist/DevToolsModalImpl.js.map +1 -0
- package/dist/data/createInProcessClient.d.ts +17 -0
- package/dist/data/createInProcessClient.d.ts.map +1 -0
- package/dist/data/createInProcessClient.js +54 -0
- package/dist/data/createInProcessClient.js.map +1 -0
- package/dist/data/projectApi.d.ts +22 -0
- package/dist/data/projectApi.d.ts.map +1 -0
- package/dist/data/projectApi.js +103 -0
- package/dist/data/projectApi.js.map +1 -0
- package/dist/data/types.d.ts +52 -0
- package/dist/data/types.d.ts.map +1 -0
- package/dist/data/types.js +10 -0
- package/dist/data/types.js.map +1 -0
- package/dist/data/useDevToolsClient.d.ts +19 -0
- package/dist/data/useDevToolsClient.d.ts.map +1 -0
- package/dist/data/useDevToolsClient.js +70 -0
- package/dist/data/useDevToolsClient.js.map +1 -0
- package/dist/index.d.ts +9 -10
- package/dist/index.js +7 -9
- package/dist/shell/DevToolsOverlay.d.ts +23 -0
- package/dist/shell/DevToolsOverlay.d.ts.map +1 -0
- package/dist/shell/DevToolsOverlay.js +106 -0
- package/dist/shell/DevToolsOverlay.js.map +1 -0
- package/dist/shell/DevToolsPanel.d.ts +23 -0
- package/dist/shell/DevToolsPanel.d.ts.map +1 -0
- package/dist/shell/DevToolsPanel.js +256 -0
- package/dist/shell/DevToolsPanel.js.map +1 -0
- package/dist/shell/ShadowRoot.d.ts +24 -0
- package/dist/shell/ShadowRoot.d.ts.map +1 -0
- package/dist/shell/ShadowRoot.js +107 -0
- package/dist/shell/ShadowRoot.js.map +1 -0
- package/dist/shell/SplitLayout.d.ts +28 -0
- package/dist/shell/SplitLayout.d.ts.map +1 -0
- package/dist/shell/SplitLayout.js +67 -0
- package/dist/shell/SplitLayout.js.map +1 -0
- package/dist/shell/registry.d.ts +41 -0
- package/dist/shell/registry.d.ts.map +1 -0
- package/dist/shell/registry.js +36 -0
- package/dist/shell/registry.js.map +1 -0
- package/dist/shell/tabs/ActivityTab.d.ts +13 -0
- package/dist/shell/tabs/ActivityTab.d.ts.map +1 -0
- package/dist/shell/tabs/ActivityTab.js +259 -0
- package/dist/shell/tabs/ActivityTab.js.map +1 -0
- package/dist/shell/tabs/ContextTab.d.ts +11 -0
- package/dist/shell/tabs/ContextTab.d.ts.map +1 -0
- package/dist/shell/tabs/ContextTab.js +210 -0
- package/dist/shell/tabs/ContextTab.js.map +1 -0
- package/dist/shell/tabs/RawTab.d.ts +11 -0
- package/dist/shell/tabs/RawTab.d.ts.map +1 -0
- package/dist/shell/tabs/RawTab.js +238 -0
- package/dist/shell/tabs/RawTab.js.map +1 -0
- package/dist/shell/tabs/ThreadTab.d.ts +12 -0
- package/dist/shell/tabs/ThreadTab.d.ts.map +1 -0
- package/dist/shell/tabs/ThreadTab.js +426 -0
- package/dist/shell/tabs/ThreadTab.js.map +1 -0
- package/dist/shell/tabs/navSelection.d.ts +10 -0
- package/dist/shell/tabs/navSelection.d.ts.map +1 -0
- package/dist/shell/tabs/navSelection.js +37 -0
- package/dist/shell/tabs/navSelection.js.map +1 -0
- package/dist/styles/panel.generated.d.ts +5 -0
- package/dist/styles/panel.generated.d.ts.map +1 -0
- package/dist/styles/panel.generated.js +6 -0
- package/dist/styles/panel.generated.js.map +1 -0
- package/dist/types.d.ts +1 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/common.d.ts +24 -0
- package/dist/utils/common.d.ts.map +1 -0
- package/dist/utils/common.js +64 -0
- package/dist/utils/common.js.map +1 -0
- package/dist/utils/diff.d.ts +16 -0
- package/dist/utils/diff.d.ts.map +1 -0
- package/dist/utils/diff.js +41 -0
- package/dist/utils/diff.js.map +1 -0
- package/dist/utils/serialization.d.ts.map +1 -1
- package/dist/utils/serialization.js +4 -1
- package/dist/utils/serialization.js.map +1 -1
- package/dist/views/activity/EventLogRow.d.ts +28 -0
- package/dist/views/activity/EventLogRow.d.ts.map +1 -0
- package/dist/views/activity/EventLogRow.js +185 -0
- package/dist/views/activity/EventLogRow.js.map +1 -0
- package/dist/views/activity/EventStreamPane.d.ts +11 -0
- package/dist/views/activity/EventStreamPane.d.ts.map +1 -0
- package/dist/views/activity/EventStreamPane.js +98 -0
- package/dist/views/activity/EventStreamPane.js.map +1 -0
- package/dist/views/activity/OrphansPane.d.ts +11 -0
- package/dist/views/activity/OrphansPane.d.ts.map +1 -0
- package/dist/views/activity/OrphansPane.js +39 -0
- package/dist/views/activity/OrphansPane.js.map +1 -0
- package/dist/views/activity/RunDetailPane.d.ts +11 -0
- package/dist/views/activity/RunDetailPane.d.ts.map +1 -0
- package/dist/views/activity/RunDetailPane.js +344 -0
- package/dist/views/activity/RunDetailPane.js.map +1 -0
- package/dist/views/activity/activityNodes.d.ts +39 -0
- package/dist/views/activity/activityNodes.d.ts.map +1 -0
- package/dist/views/activity/activityNodes.js +199 -0
- package/dist/views/activity/activityNodes.js.map +1 -0
- package/dist/views/activity/index.d.ts +6 -0
- package/dist/views/activity/index.js +6 -0
- package/dist/views/attachments/AttachmentList.d.ts +15 -0
- package/dist/views/attachments/AttachmentList.d.ts.map +1 -0
- package/dist/views/attachments/AttachmentList.js +279 -0
- package/dist/views/attachments/AttachmentList.js.map +1 -0
- package/dist/views/attachments/MediaPartView.d.ts +27 -0
- package/dist/views/attachments/MediaPartView.d.ts.map +1 -0
- package/dist/views/attachments/MediaPartView.js +180 -0
- package/dist/views/attachments/MediaPartView.js.map +1 -0
- package/dist/views/attachments/formatBytes.d.ts +8 -0
- package/dist/views/attachments/formatBytes.d.ts.map +1 -0
- package/dist/views/attachments/formatBytes.js +14 -0
- package/dist/views/attachments/formatBytes.js.map +1 -0
- package/dist/views/attachments/index.d.ts +5 -0
- package/dist/views/attachments/index.js +4 -0
- package/dist/views/attachments/parseAttachment.d.ts +8 -0
- package/dist/views/attachments/parseAttachment.d.ts.map +1 -0
- package/dist/views/attachments/parseAttachment.js +58 -0
- package/dist/views/attachments/parseAttachment.js.map +1 -0
- package/dist/views/attachments/types.d.ts +18 -0
- package/dist/views/attachments/types.d.ts.map +1 -0
- package/dist/views/attachments/types.js +0 -0
- package/dist/views/context/ContextDetail.d.ts +14 -0
- package/dist/views/context/ContextDetail.d.ts.map +1 -0
- package/dist/views/context/ContextDetail.js +87 -0
- package/dist/views/context/ContextDetail.js.map +1 -0
- package/dist/views/context/ToolUIsView.d.ts +9 -0
- package/dist/views/context/ToolUIsView.d.ts.map +1 -0
- package/dist/views/context/ToolUIsView.js +80 -0
- package/dist/views/context/ToolUIsView.js.map +1 -0
- package/dist/views/context/contextNodes.d.ts +32 -0
- package/dist/views/context/contextNodes.d.ts.map +1 -0
- package/dist/views/context/contextNodes.js +49 -0
- package/dist/views/context/contextNodes.js.map +1 -0
- package/dist/views/context/index.d.ts +4 -0
- package/dist/views/context/index.js +4 -0
- package/dist/views/mcp/McpView.d.ts +11 -0
- package/dist/views/mcp/McpView.d.ts.map +1 -0
- package/dist/views/mcp/McpView.js +239 -0
- package/dist/views/mcp/McpView.js.map +1 -0
- package/dist/views/mcp/index.d.ts +2 -0
- package/dist/views/mcp/index.js +2 -0
- package/dist/views/mcp/parse.d.ts +7 -0
- package/dist/views/mcp/parse.d.ts.map +1 -0
- package/dist/views/mcp/parse.js +43 -0
- package/dist/views/mcp/parse.js.map +1 -0
- package/dist/views/mcp/types.d.ts +22 -0
- package/dist/views/mcp/types.d.ts.map +1 -0
- package/dist/views/mcp/types.js +0 -0
- package/dist/views/message/ChainOfThought.d.ts +11 -0
- package/dist/views/message/ChainOfThought.d.ts.map +1 -0
- package/dist/views/message/ChainOfThought.js +132 -0
- package/dist/views/message/ChainOfThought.js.map +1 -0
- package/dist/views/message/MessageDetailPane.d.ts +12 -0
- package/dist/views/message/MessageDetailPane.d.ts.map +1 -0
- package/dist/views/message/MessageDetailPane.js +38 -0
- package/dist/views/message/MessageDetailPane.js.map +1 -0
- package/dist/views/message/MessageItem.d.ts +13 -0
- package/dist/views/message/MessageItem.d.ts.map +1 -0
- package/dist/views/message/MessageItem.js +136 -0
- package/dist/views/message/MessageItem.js.map +1 -0
- package/dist/views/message/MessageList.d.ts +13 -0
- package/dist/views/message/MessageList.d.ts.map +1 -0
- package/dist/views/message/MessageList.js +95 -0
- package/dist/views/message/MessageList.js.map +1 -0
- package/dist/views/message/MessageMetrics.d.ts +11 -0
- package/dist/views/message/MessageMetrics.d.ts.map +1 -0
- package/dist/views/message/MessageMetrics.js +93 -0
- package/dist/views/message/MessageMetrics.js.map +1 -0
- package/dist/views/message/MessageTimeline.d.ts +16 -0
- package/dist/views/message/MessageTimeline.d.ts.map +1 -0
- package/dist/views/message/MessageTimeline.js +100 -0
- package/dist/views/message/MessageTimeline.js.map +1 -0
- package/dist/views/message/PartDisclosure.d.ts +18 -0
- package/dist/views/message/PartDisclosure.d.ts.map +1 -0
- package/dist/views/message/PartDisclosure.js +79 -0
- package/dist/views/message/PartDisclosure.js.map +1 -0
- package/dist/views/message/PartView.d.ts +13 -0
- package/dist/views/message/PartView.d.ts.map +1 -0
- package/dist/views/message/PartView.js +416 -0
- package/dist/views/message/PartView.js.map +1 -0
- package/dist/views/message/RoleLabel.d.ts +11 -0
- package/dist/views/message/RoleLabel.d.ts.map +1 -0
- package/dist/views/message/RoleLabel.js +30 -0
- package/dist/views/message/RoleLabel.js.map +1 -0
- package/dist/views/message/StatusBadge.d.ts +17 -0
- package/dist/views/message/StatusBadge.d.ts.map +1 -0
- package/dist/views/message/StatusBadge.js +58 -0
- package/dist/views/message/StatusBadge.js.map +1 -0
- package/dist/views/message/ToolCallView.d.ts +13 -0
- package/dist/views/message/ToolCallView.d.ts.map +1 -0
- package/dist/views/message/ToolCallView.js +289 -0
- package/dist/views/message/ToolCallView.js.map +1 -0
- package/dist/views/message/TtftBar.d.ts +16 -0
- package/dist/views/message/TtftBar.d.ts.map +1 -0
- package/dist/views/message/TtftBar.js +128 -0
- package/dist/views/message/TtftBar.js.map +1 -0
- package/dist/views/message/index.d.ts +6 -0
- package/dist/views/message/index.js +5 -0
- package/dist/views/message/messagePlainText.d.ts +8 -0
- package/dist/views/message/messagePlainText.d.ts.map +1 -0
- package/dist/views/message/messagePlainText.js +39 -0
- package/dist/views/message/messagePlainText.js.map +1 -0
- package/dist/views/message/parse.d.ts +10 -0
- package/dist/views/message/parse.d.ts.map +1 -0
- package/dist/views/message/parse.js +235 -0
- package/dist/views/message/parse.js.map +1 -0
- package/dist/views/message/types.d.ts +114 -0
- package/dist/views/message/types.d.ts.map +1 -0
- package/dist/views/message/types.js +0 -0
- package/dist/views/model-context/ModelContextView.d.ts +26 -0
- package/dist/views/model-context/ModelContextView.d.ts.map +1 -0
- package/dist/views/model-context/ModelContextView.js +214 -0
- package/dist/views/model-context/ModelContextView.js.map +1 -0
- package/dist/views/nav.d.ts +19 -0
- package/dist/views/nav.d.ts.map +1 -0
- package/dist/views/nav.js +8 -0
- package/dist/views/nav.js.map +1 -0
- package/dist/views/raw/RawDetail.d.ts +15 -0
- package/dist/views/raw/RawDetail.d.ts.map +1 -0
- package/dist/views/raw/RawDetail.js +79 -0
- package/dist/views/raw/RawDetail.js.map +1 -0
- package/dist/views/raw/index.d.ts +3 -0
- package/dist/views/raw/index.js +3 -0
- package/dist/views/raw/rawNodes.d.ts +20 -0
- package/dist/views/raw/rawNodes.d.ts.map +1 -0
- package/dist/views/raw/rawNodes.js +78 -0
- package/dist/views/raw/rawNodes.js.map +1 -0
- package/dist/views/raw/statePreview.d.ts +5 -0
- package/dist/views/raw/statePreview.d.ts.map +1 -0
- package/dist/views/raw/statePreview.js +213 -0
- package/dist/views/raw/statePreview.js.map +1 -0
- package/dist/views/runs/PayloadDiff.d.ts +11 -0
- package/dist/views/runs/PayloadDiff.d.ts.map +1 -0
- package/dist/views/runs/PayloadDiff.js +92 -0
- package/dist/views/runs/PayloadDiff.js.map +1 -0
- package/dist/views/runs/parse.d.ts +8 -0
- package/dist/views/runs/parse.d.ts.map +1 -0
- package/dist/views/runs/parse.js +78 -0
- package/dist/views/runs/parse.js.map +1 -0
- package/dist/views/runs/types.d.ts +25 -0
- package/dist/views/runs/types.d.ts.map +1 -0
- package/dist/views/runs/types.js +0 -0
- package/dist/views/scopes/ScopesView.d.ts +9 -0
- package/dist/views/scopes/ScopesView.d.ts.map +1 -0
- package/dist/views/scopes/ScopesView.js +235 -0
- package/dist/views/scopes/ScopesView.js.map +1 -0
- package/dist/views/scopes/index.d.ts +2 -0
- package/dist/views/scopes/index.js +2 -0
- package/dist/views/scopes/parse.d.ts +7 -0
- package/dist/views/scopes/parse.d.ts.map +1 -0
- package/dist/views/scopes/parse.js +23 -0
- package/dist/views/scopes/parse.js.map +1 -0
- package/dist/views/scopes/types.d.ts +10 -0
- package/dist/views/scopes/types.d.ts.map +1 -0
- package/dist/views/scopes/types.js +0 -0
- package/dist/views/thread/ComposerAttachments.d.ts +11 -0
- package/dist/views/thread/ComposerAttachments.d.ts.map +1 -0
- package/dist/views/thread/ComposerAttachments.js +22 -0
- package/dist/views/thread/ComposerAttachments.js.map +1 -0
- package/dist/views/thread/ComposerFlags.d.ts +11 -0
- package/dist/views/thread/ComposerFlags.d.ts.map +1 -0
- package/dist/views/thread/ComposerFlags.js +54 -0
- package/dist/views/thread/ComposerFlags.js.map +1 -0
- package/dist/views/thread/ComposerQueue.d.ts +11 -0
- package/dist/views/thread/ComposerQueue.d.ts.map +1 -0
- package/dist/views/thread/ComposerQueue.js +55 -0
- package/dist/views/thread/ComposerQueue.js.map +1 -0
- package/dist/views/thread/ConversationList.d.ts +18 -0
- package/dist/views/thread/ConversationList.d.ts.map +1 -0
- package/dist/views/thread/ConversationList.js +228 -0
- package/dist/views/thread/ConversationList.js.map +1 -0
- package/dist/views/thread/ConversationStatusDot.d.ts +29 -0
- package/dist/views/thread/ConversationStatusDot.d.ts.map +1 -0
- package/dist/views/thread/ConversationStatusDot.js +91 -0
- package/dist/views/thread/ConversationStatusDot.js.map +1 -0
- package/dist/views/thread/ThreadDetails.d.ts +13 -0
- package/dist/views/thread/ThreadDetails.d.ts.map +1 -0
- package/dist/views/thread/ThreadDetails.js +170 -0
- package/dist/views/thread/ThreadDetails.js.map +1 -0
- package/dist/views/thread/Transcript.d.ts +21 -0
- package/dist/views/thread/Transcript.d.ts.map +1 -0
- package/dist/views/thread/Transcript.js +520 -0
- package/dist/views/thread/Transcript.js.map +1 -0
- package/dist/views/thread/index.d.ts +10 -0
- package/dist/views/thread/index.js +9 -0
- package/dist/views/thread/resolve.d.ts +13 -0
- package/dist/views/thread/resolve.d.ts.map +1 -0
- package/dist/views/thread/resolve.js +29 -0
- package/dist/views/thread/resolve.js.map +1 -0
- package/dist/views/thread/types.d.ts +50 -0
- package/dist/views/thread/types.d.ts.map +1 -0
- package/dist/views/thread/types.js +0 -0
- package/dist/views/thread/utils.d.ts +10 -0
- package/dist/views/thread/utils.d.ts.map +1 -0
- package/dist/views/thread/utils.js +77 -0
- package/dist/views/thread/utils.js.map +1 -0
- package/dist/views/ui/CenteredMessage.d.ts +11 -0
- package/dist/views/ui/CenteredMessage.d.ts.map +1 -0
- package/dist/views/ui/CenteredMessage.js +21 -0
- package/dist/views/ui/CenteredMessage.js.map +1 -0
- package/dist/views/ui/Chip.d.ts +13 -0
- package/dist/views/ui/Chip.d.ts.map +1 -0
- package/dist/views/ui/Chip.js +30 -0
- package/dist/views/ui/Chip.js.map +1 -0
- package/dist/views/ui/ControlButton.d.ts +10 -0
- package/dist/views/ui/ControlButton.d.ts.map +1 -0
- package/dist/views/ui/ControlButton.js +39 -0
- package/dist/views/ui/ControlButton.js.map +1 -0
- package/dist/views/ui/CopyButton.d.ts +19 -0
- package/dist/views/ui/CopyButton.d.ts.map +1 -0
- package/dist/views/ui/CopyButton.js +125 -0
- package/dist/views/ui/CopyButton.js.map +1 -0
- package/dist/views/ui/EmptyState.d.ts +11 -0
- package/dist/views/ui/EmptyState.d.ts.map +1 -0
- package/dist/views/ui/EmptyState.js +21 -0
- package/dist/views/ui/EmptyState.js.map +1 -0
- package/dist/views/ui/InfoCard.d.ts +22 -0
- package/dist/views/ui/InfoCard.d.ts.map +1 -0
- package/dist/views/ui/InfoCard.js +44 -0
- package/dist/views/ui/InfoCard.js.map +1 -0
- package/dist/views/ui/JSONTree.d.ts +16 -0
- package/dist/views/ui/JSONTree.d.ts.map +1 -0
- package/dist/views/ui/JSONTree.js +394 -0
- package/dist/views/ui/JSONTree.js.map +1 -0
- package/dist/views/ui/PaneHeader.d.ts +27 -0
- package/dist/views/ui/PaneHeader.d.ts.map +1 -0
- package/dist/views/ui/PaneHeader.js +71 -0
- package/dist/views/ui/PaneHeader.js.map +1 -0
- package/dist/views/ui/RailTime.d.ts +12 -0
- package/dist/views/ui/RailTime.d.ts.map +1 -0
- package/dist/views/ui/RailTime.js +49 -0
- package/dist/views/ui/RailTime.js.map +1 -0
- package/dist/views/ui/SectionLabel.d.ts +11 -0
- package/dist/views/ui/SectionLabel.d.ts.map +1 -0
- package/dist/views/ui/SectionLabel.js +21 -0
- package/dist/views/ui/SectionLabel.js.map +1 -0
- package/dist/views/ui/SelectableRow.d.ts +18 -0
- package/dist/views/ui/SelectableRow.d.ts.map +1 -0
- package/dist/views/ui/SelectableRow.js +49 -0
- package/dist/views/ui/SelectableRow.js.map +1 -0
- package/dist/views/ui/Sparkline.d.ts +17 -0
- package/dist/views/ui/Sparkline.d.ts.map +1 -0
- package/dist/views/ui/Sparkline.js +96 -0
- package/dist/views/ui/Sparkline.js.map +1 -0
- package/dist/views/ui/SummaryItem.d.ts +23 -0
- package/dist/views/ui/SummaryItem.d.ts.map +1 -0
- package/dist/views/ui/SummaryItem.js +59 -0
- package/dist/views/ui/SummaryItem.js.map +1 -0
- package/dist/views/ui/ToneBadge.d.ts +18 -0
- package/dist/views/ui/ToneBadge.d.ts.map +1 -0
- package/dist/views/ui/ToneBadge.js +34 -0
- package/dist/views/ui/ToneBadge.js.map +1 -0
- package/dist/views/ui/badgeTone.d.ts +21 -0
- package/dist/views/ui/badgeTone.d.ts.map +1 -0
- package/dist/views/ui/badgeTone.js +33 -0
- package/dist/views/ui/badgeTone.js.map +1 -0
- package/dist/views/ui/index.d.ts +16 -0
- package/dist/views/ui/index.js +16 -0
- package/dist/views/ui/useCopyToClipboard.d.ts +12 -0
- package/dist/views/ui/useCopyToClipboard.d.ts.map +1 -0
- package/dist/views/ui/useCopyToClipboard.js +44 -0
- package/dist/views/ui/useCopyToClipboard.js.map +1 -0
- package/package.json +9 -5
- package/src/DevToolsModal.tsx +26 -179
- package/src/DevToolsModalImpl.tsx +60 -0
- package/src/data/createInProcessClient.ts +66 -0
- package/src/data/projectApi.test.ts +100 -0
- package/src/data/projectApi.ts +169 -0
- package/src/data/types.ts +54 -0
- package/src/data/useDevToolsClient.ts +59 -0
- package/src/index.ts +16 -13
- package/src/shell/DevToolsOverlay.tsx +84 -0
- package/src/shell/DevToolsPanel.tsx +192 -0
- package/src/shell/ShadowRoot.tsx +85 -0
- package/src/shell/SplitLayout.tsx +46 -0
- package/src/shell/registry.ts +51 -0
- package/src/shell/tabs/ActivityTab.test.tsx +34 -0
- package/src/shell/tabs/ActivityTab.tsx +161 -0
- package/src/shell/tabs/ContextTab.test.tsx +37 -0
- package/src/shell/tabs/ContextTab.tsx +157 -0
- package/src/shell/tabs/RawTab.test.tsx +43 -0
- package/src/shell/tabs/RawTab.tsx +123 -0
- package/src/shell/tabs/ThreadTab.tsx +220 -0
- package/src/shell/tabs/navSelection.ts +17 -0
- package/src/styles/panel.css +153 -0
- package/src/styles/panel.generated.ts +2 -0
- package/src/types.ts +0 -5
- package/src/utils/common.test.ts +30 -0
- package/src/utils/common.ts +101 -0
- package/src/utils/diff.test.ts +37 -0
- package/src/utils/diff.ts +41 -0
- package/src/utils/serialization.test.ts +31 -0
- package/src/utils/serialization.ts +4 -1
- package/src/views/activity/EventLogRow.tsx +108 -0
- package/src/views/activity/EventStreamPane.tsx +86 -0
- package/src/views/activity/OrphansPane.tsx +23 -0
- package/src/views/activity/RunDetailPane.tsx +128 -0
- package/src/views/activity/activityNodes.test.ts +24 -0
- package/src/views/activity/activityNodes.ts +179 -0
- package/src/views/activity/index.ts +10 -0
- package/src/views/attachments/AttachmentList.tsx +122 -0
- package/src/views/attachments/MediaPartView.tsx +77 -0
- package/src/views/attachments/formatBytes.ts +15 -0
- package/src/views/attachments/index.ts +4 -0
- package/src/views/attachments/parseAttachment.test.ts +37 -0
- package/src/views/attachments/parseAttachment.ts +85 -0
- package/src/views/attachments/types.ts +15 -0
- package/src/views/context/ContextDetail.tsx +37 -0
- package/src/views/context/ToolUIsView.tsx +44 -0
- package/src/views/context/contextNodes.test.ts +31 -0
- package/src/views/context/contextNodes.ts +66 -0
- package/src/views/context/index.ts +4 -0
- package/src/views/mcp/McpView.tsx +125 -0
- package/src/views/mcp/index.ts +1 -0
- package/src/views/mcp/parse.test.ts +63 -0
- package/src/views/mcp/parse.ts +65 -0
- package/src/views/mcp/render.test.tsx +34 -0
- package/src/views/mcp/types.ts +20 -0
- package/src/views/message/ChainOfThought.tsx +74 -0
- package/src/views/message/MessageDetailPane.tsx +26 -0
- package/src/views/message/MessageItem.tsx +94 -0
- package/src/views/message/MessageList.tsx +48 -0
- package/src/views/message/MessageMetrics.tsx +68 -0
- package/src/views/message/MessageTimeline.test.tsx +78 -0
- package/src/views/message/MessageTimeline.tsx +51 -0
- package/src/views/message/PartDisclosure.tsx +32 -0
- package/src/views/message/PartView.tsx +197 -0
- package/src/views/message/RoleLabel.tsx +22 -0
- package/src/views/message/StatusBadge.tsx +28 -0
- package/src/views/message/ToolCallView.tsx +151 -0
- package/src/views/message/TtftBar.tsx +44 -0
- package/src/views/message/index.ts +5 -0
- package/src/views/message/messagePlainText.test.ts +48 -0
- package/src/views/message/messagePlainText.ts +65 -0
- package/src/views/message/parse.test.ts +269 -0
- package/src/views/message/parse.ts +282 -0
- package/src/views/message/render.test.tsx +128 -0
- package/src/views/message/types.ts +137 -0
- package/src/views/model-context/ModelContextView.tsx +71 -0
- package/src/views/model-context/render.test.tsx +24 -0
- package/src/views/nav.ts +18 -0
- package/src/views/raw/RawDetail.tsx +39 -0
- package/src/views/raw/index.ts +3 -0
- package/src/views/raw/rawNodes.test.ts +38 -0
- package/src/views/raw/rawNodes.ts +107 -0
- package/src/views/raw/statePreview.tsx +188 -0
- package/src/views/runs/PayloadDiff.tsx +49 -0
- package/src/views/runs/parse.test.ts +152 -0
- package/src/views/runs/parse.ts +110 -0
- package/src/views/runs/types.ts +23 -0
- package/src/views/scopes/ScopesView.tsx +105 -0
- package/src/views/scopes/index.ts +1 -0
- package/src/views/scopes/parse.test.ts +35 -0
- package/src/views/scopes/parse.ts +30 -0
- package/src/views/scopes/render.test.tsx +35 -0
- package/src/views/scopes/types.ts +6 -0
- package/src/views/thread/ComposerAttachments.test.tsx +36 -0
- package/src/views/thread/ComposerAttachments.tsx +8 -0
- package/src/views/thread/ComposerFlags.test.tsx +23 -0
- package/src/views/thread/ComposerFlags.tsx +19 -0
- package/src/views/thread/ComposerQueue.test.tsx +20 -0
- package/src/views/thread/ComposerQueue.tsx +26 -0
- package/src/views/thread/ConversationList.tsx +127 -0
- package/src/views/thread/ConversationStatusDot.test.ts +86 -0
- package/src/views/thread/ConversationStatusDot.tsx +126 -0
- package/src/views/thread/ThreadDetails.tsx +85 -0
- package/src/views/thread/Transcript.test.tsx +56 -0
- package/src/views/thread/Transcript.tsx +332 -0
- package/src/views/thread/index.ts +19 -0
- package/src/views/thread/render.test.tsx +41 -0
- package/src/views/thread/resolve.ts +36 -0
- package/src/views/thread/types.ts +53 -0
- package/src/views/thread/utils.test.ts +72 -0
- package/src/views/thread/utils.ts +149 -0
- package/src/views/ui/CenteredMessage.tsx +7 -0
- package/src/views/ui/Chip.tsx +17 -0
- package/src/views/ui/ControlButton.tsx +15 -0
- package/src/views/ui/CopyButton.tsx +73 -0
- package/src/views/ui/EmptyState.tsx +7 -0
- package/src/views/ui/InfoCard.tsx +35 -0
- package/src/views/ui/JSONTree.test.tsx +29 -0
- package/src/views/ui/JSONTree.tsx +240 -0
- package/src/views/ui/PaneHeader.tsx +46 -0
- package/src/views/ui/RailTime.tsx +27 -0
- package/src/views/ui/SectionLabel.tsx +7 -0
- package/src/views/ui/SelectableRow.tsx +41 -0
- package/src/views/ui/Sparkline.tsx +49 -0
- package/src/views/ui/SummaryItem.tsx +25 -0
- package/src/views/ui/ToneBadge.tsx +26 -0
- package/src/views/ui/badgeTone.ts +40 -0
- package/src/views/ui/index.ts +20 -0
- package/src/views/ui/useCopyToClipboard.ts +27 -0
- package/dist/DevToolsFrame.d.ts +0 -11
- package/dist/DevToolsFrame.d.ts.map +0 -1
- package/dist/DevToolsFrame.js +0 -66
- package/dist/DevToolsFrame.js.map +0 -1
- package/dist/DevToolsHost.d.ts +0 -38
- package/dist/DevToolsHost.d.ts.map +0 -1
- package/dist/DevToolsHost.js +0 -93
- package/dist/DevToolsHost.js.map +0 -1
- package/dist/ExtensionHost.d.ts +0 -10
- package/dist/ExtensionHost.d.ts.map +0 -1
- package/dist/ExtensionHost.js +0 -42
- package/dist/ExtensionHost.js.map +0 -1
- package/dist/FrameClient.d.ts +0 -38
- package/dist/FrameClient.d.ts.map +0 -1
- package/dist/FrameClient.js +0 -53
- package/dist/FrameClient.js.map +0 -1
- package/dist/FrameHost.d.ts +0 -11
- package/dist/FrameHost.d.ts.map +0 -1
- package/dist/FrameHost.js +0 -26
- package/dist/FrameHost.js.map +0 -1
- package/dist/constants.d.ts +0 -6
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js +0 -7
- package/dist/constants.js.map +0 -1
- package/dist/styles/DevToolsModal.styles.d.ts +0 -18
- package/dist/styles/DevToolsModal.styles.d.ts.map +0 -1
- package/dist/styles/DevToolsModal.styles.js +0 -120
- package/dist/styles/DevToolsModal.styles.js.map +0 -1
- package/src/DevToolsFrame.tsx +0 -55
- package/src/DevToolsHost.ts +0 -178
- package/src/ExtensionHost.ts +0 -57
- package/src/FrameClient.ts +0 -99
- package/src/FrameHost.ts +0 -31
- package/src/constants.ts +0 -2
- package/src/styles/DevToolsModal.styles.ts +0 -137
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { useCallback, useMemo, useSyncExternalStore } from "react";
|
|
2
|
+
import { inProcessClient } from "./createInProcessClient";
|
|
3
|
+
import { EMPTY_SNAPSHOT, type ApiInfo, type DevToolsClient } from "./types";
|
|
4
|
+
|
|
5
|
+
export interface DevToolsClientResult {
|
|
6
|
+
apiIds: number[];
|
|
7
|
+
selected: ApiInfo | undefined;
|
|
8
|
+
clearEvents: (apiId: number) => void;
|
|
9
|
+
switchToThread: (apiId: number, threadId: string) => void | Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Reads a DevToolsClient snapshot and resolves the selected instance. The panel
|
|
14
|
+
* depends only on this, so swapping the client swaps the data source without
|
|
15
|
+
* touching the UI. Pass a stable client reference (the default in-process client
|
|
16
|
+
* is a module singleton; memoize custom clients).
|
|
17
|
+
*/
|
|
18
|
+
export const useDevToolsClient = (
|
|
19
|
+
selectedApiId: number | null,
|
|
20
|
+
client: DevToolsClient = inProcessClient,
|
|
21
|
+
): DevToolsClientResult => {
|
|
22
|
+
// Bind the client methods so class-based or relay clients that rely on `this`
|
|
23
|
+
// work, and keep the references stable so useSyncExternalStore does not
|
|
24
|
+
// resubscribe on every render.
|
|
25
|
+
const store = useMemo(
|
|
26
|
+
() => ({
|
|
27
|
+
subscribe: (listener: () => void) => client.subscribe(listener),
|
|
28
|
+
getSnapshot: () => client.getSnapshot(),
|
|
29
|
+
getServerSnapshot: () =>
|
|
30
|
+
client.getServerSnapshot ? client.getServerSnapshot() : EMPTY_SNAPSHOT,
|
|
31
|
+
}),
|
|
32
|
+
[client],
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
const snapshot = useSyncExternalStore(
|
|
36
|
+
store.subscribe,
|
|
37
|
+
store.getSnapshot,
|
|
38
|
+
store.getServerSnapshot,
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
const selected =
|
|
42
|
+
selectedApiId !== null ? snapshot.byId.get(selectedApiId) : undefined;
|
|
43
|
+
|
|
44
|
+
const clearEvents = useCallback(
|
|
45
|
+
(apiId: number) => client.clearEvents(apiId),
|
|
46
|
+
[client],
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
const switchToThread = useCallback(
|
|
50
|
+
(apiId: number, threadId: string) => {
|
|
51
|
+
if (client.switchToThread) {
|
|
52
|
+
return client.switchToThread(apiId, threadId);
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
[client],
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
return { apiIds: snapshot.apiIds, selected, clearEvents, switchToThread };
|
|
59
|
+
};
|
package/src/index.ts
CHANGED
|
@@ -1,17 +1,20 @@
|
|
|
1
|
-
export { DevToolsModal } from "./DevToolsModal";
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
4
|
-
export {
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
export { DevToolsModal, type DevToolsModalProps } from "./DevToolsModal";
|
|
2
|
+
export { DevToolsPanel, type DevToolsPanelProps } from "./shell/DevToolsPanel";
|
|
3
|
+
export { ShadowRoot } from "./shell/ShadowRoot";
|
|
4
|
+
export {
|
|
5
|
+
builtinPlugins,
|
|
6
|
+
createDevToolsPlugin,
|
|
7
|
+
type DevToolsPanelPlugin,
|
|
8
|
+
type DevToolsTabContext,
|
|
9
|
+
} from "./shell/registry";
|
|
10
|
+
export type { ApiInfo, DevToolsClient, DevToolsSnapshot } from "./data/types";
|
|
11
|
+
export {
|
|
12
|
+
createInProcessClient,
|
|
13
|
+
inProcessClient,
|
|
14
|
+
} from "./data/createInProcessClient";
|
|
7
15
|
export {
|
|
8
16
|
normalizeToolList,
|
|
9
17
|
type NormalizedTool,
|
|
10
18
|
} from "./utils/toolNormalization";
|
|
11
|
-
export {
|
|
12
|
-
|
|
13
|
-
serializeModelContext,
|
|
14
|
-
} from "./utils/serialization";
|
|
15
|
-
// Export types
|
|
16
|
-
export type { SerializedModelContext, TabType, ViewMode } from "./types";
|
|
17
|
-
export * from "./constants";
|
|
19
|
+
export { serializeModelContext } from "./utils/serialization";
|
|
20
|
+
export type { SerializedModelContext } from "./types";
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useEffect, useState } from "react";
|
|
4
|
+
import { DevToolsPanel } from "./DevToolsPanel";
|
|
5
|
+
import type { DevToolsPanelPlugin } from "./registry";
|
|
6
|
+
import type { DevToolsClient } from "../data/types";
|
|
7
|
+
|
|
8
|
+
export interface DevToolsOverlayProps {
|
|
9
|
+
plugins?: DevToolsPanelPlugin[] | undefined;
|
|
10
|
+
theme: "light" | "dark";
|
|
11
|
+
client?: DevToolsClient | undefined;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* The full devtools surface (floating launcher + window), rendered inside the
|
|
16
|
+
* shadow root so every element is styled with the package's own Tailwind tokens
|
|
17
|
+
* and isolated from the host page. The window floats over the live app with no
|
|
18
|
+
* backdrop; close with the × or Escape.
|
|
19
|
+
*/
|
|
20
|
+
export const DevToolsOverlay = ({
|
|
21
|
+
plugins,
|
|
22
|
+
theme,
|
|
23
|
+
client,
|
|
24
|
+
}: DevToolsOverlayProps) => {
|
|
25
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
26
|
+
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
if (!isOpen) return;
|
|
29
|
+
const handleEscape = (event: KeyboardEvent) => {
|
|
30
|
+
if (event.key === "Escape") setIsOpen(false);
|
|
31
|
+
};
|
|
32
|
+
document.addEventListener("keydown", handleEscape);
|
|
33
|
+
return () => document.removeEventListener("keydown", handleEscape);
|
|
34
|
+
}, [isOpen]);
|
|
35
|
+
|
|
36
|
+
if (!isOpen) {
|
|
37
|
+
return (
|
|
38
|
+
<button
|
|
39
|
+
type="button"
|
|
40
|
+
onClick={() => setIsOpen(true)}
|
|
41
|
+
aria-label="Open assistant-ui DevTools"
|
|
42
|
+
title="Open assistant-ui DevTools"
|
|
43
|
+
className="bg-foreground text-background fixed end-5 bottom-5 z-[2147483646] flex size-9 [animation:aui-dt-launcher-in_200ms_cubic-bezier(0.175,0.885,0.32,1.1)] items-center justify-center rounded-full shadow-[var(--shadow-launcher)] backdrop-blur-2xl transition-transform duration-150 ease-out hover:scale-105 active:scale-95"
|
|
44
|
+
>
|
|
45
|
+
<svg
|
|
46
|
+
width="18"
|
|
47
|
+
height="18"
|
|
48
|
+
viewBox="0 0 24 24"
|
|
49
|
+
fill="none"
|
|
50
|
+
aria-hidden="true"
|
|
51
|
+
>
|
|
52
|
+
<path
|
|
53
|
+
d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"
|
|
54
|
+
stroke="currentColor"
|
|
55
|
+
strokeWidth="1.75"
|
|
56
|
+
strokeLinecap="round"
|
|
57
|
+
strokeLinejoin="round"
|
|
58
|
+
/>
|
|
59
|
+
</svg>
|
|
60
|
+
</button>
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return (
|
|
65
|
+
<>
|
|
66
|
+
<div
|
|
67
|
+
onClick={() => setIsOpen(false)}
|
|
68
|
+
className="fixed inset-0 z-[2147483646] [animation:aui-dt-fade-in_150ms_ease-out] bg-black/20 backdrop-blur-[3px]"
|
|
69
|
+
/>
|
|
70
|
+
<div
|
|
71
|
+
role="dialog"
|
|
72
|
+
aria-label="assistant-ui DevTools"
|
|
73
|
+
className="bg-background text-foreground border-border fixed top-1/2 left-1/2 z-[2147483647] flex h-[min(560px,80vh)] w-[min(960px,92vw)] -translate-x-1/2 -translate-y-1/2 [animation:aui-dt-window-in_200ms_cubic-bezier(0.175,0.885,0.32,1.1)] flex-col overflow-hidden rounded-xl border shadow-[var(--shadow-window)]"
|
|
74
|
+
>
|
|
75
|
+
<DevToolsPanel
|
|
76
|
+
theme={theme}
|
|
77
|
+
plugins={plugins}
|
|
78
|
+
client={client}
|
|
79
|
+
onClose={() => setIsOpen(false)}
|
|
80
|
+
/>
|
|
81
|
+
</div>
|
|
82
|
+
</>
|
|
83
|
+
);
|
|
84
|
+
};
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
4
|
+
import clsx from "clsx";
|
|
5
|
+
import { useDevToolsClient } from "../data/useDevToolsClient";
|
|
6
|
+
import { inProcessClient } from "../data/createInProcessClient";
|
|
7
|
+
import type { DevToolsClient } from "../data/types";
|
|
8
|
+
import { CenteredMessage } from "../views/ui";
|
|
9
|
+
import {
|
|
10
|
+
builtinPlugins,
|
|
11
|
+
type DevToolsPanelPlugin,
|
|
12
|
+
type DevToolsTabContext,
|
|
13
|
+
} from "./registry";
|
|
14
|
+
|
|
15
|
+
export interface DevToolsPanelProps {
|
|
16
|
+
/** Additional inspector tabs appended after the builtins. */
|
|
17
|
+
plugins?: DevToolsPanelPlugin[] | undefined;
|
|
18
|
+
/** Resolved theme, used to style plugin content and the dark variant. */
|
|
19
|
+
theme?: "light" | "dark";
|
|
20
|
+
/** When provided, a close control is rendered at the end of the tab bar. */
|
|
21
|
+
onClose?: (() => void) | undefined;
|
|
22
|
+
/** Data source. Defaults to the in-process DevToolsHooks client. */
|
|
23
|
+
client?: DevToolsClient | undefined;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export const DevToolsPanel = ({
|
|
27
|
+
plugins,
|
|
28
|
+
theme = "light",
|
|
29
|
+
onClose,
|
|
30
|
+
client,
|
|
31
|
+
}: DevToolsPanelProps) => {
|
|
32
|
+
const resolvedClient = client ?? inProcessClient;
|
|
33
|
+
const [selectedApiId, setSelectedApiId] = useState<number | null>(null);
|
|
34
|
+
const [activeTabId, setActiveTabId] = useState<string>("thread");
|
|
35
|
+
const [selectionByApi, setSelectionByApi] = useState<
|
|
36
|
+
Record<number, Record<string, string | null>>
|
|
37
|
+
>({});
|
|
38
|
+
const { apiIds, selected, clearEvents, switchToThread } = useDevToolsClient(
|
|
39
|
+
selectedApiId,
|
|
40
|
+
resolvedClient,
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
if (selectedApiId !== null && apiIds.includes(selectedApiId)) return;
|
|
45
|
+
setSelectedApiId(apiIds[0] ?? null);
|
|
46
|
+
}, [apiIds, selectedApiId]);
|
|
47
|
+
|
|
48
|
+
const allPlugins = useMemo(
|
|
49
|
+
() =>
|
|
50
|
+
[...builtinPlugins, ...(plugins ?? [])].sort(
|
|
51
|
+
(a, b) => (a.order ?? 0) - (b.order ?? 0),
|
|
52
|
+
),
|
|
53
|
+
[plugins],
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
const setSelectionFor = useCallback(
|
|
57
|
+
(apiId: number, tabId: string, nodeId: string | null) => {
|
|
58
|
+
setSelectionByApi((prev) => ({
|
|
59
|
+
...prev,
|
|
60
|
+
[apiId]: { ...prev[apiId], [tabId]: nodeId },
|
|
61
|
+
}));
|
|
62
|
+
},
|
|
63
|
+
[],
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
const visiblePlugins =
|
|
67
|
+
selected && selectedApiId !== null
|
|
68
|
+
? allPlugins.filter((plugin) =>
|
|
69
|
+
plugin.isAvailable
|
|
70
|
+
? plugin.isAvailable({
|
|
71
|
+
apiId: selectedApiId,
|
|
72
|
+
data: selected,
|
|
73
|
+
clearEvents,
|
|
74
|
+
theme,
|
|
75
|
+
selection: null,
|
|
76
|
+
setSelection: () => {},
|
|
77
|
+
})
|
|
78
|
+
: true,
|
|
79
|
+
)
|
|
80
|
+
: allPlugins;
|
|
81
|
+
|
|
82
|
+
const activePlugin =
|
|
83
|
+
visiblePlugins.find((plugin) => plugin.id === activeTabId) ??
|
|
84
|
+
visiblePlugins[0];
|
|
85
|
+
|
|
86
|
+
const ctx: DevToolsTabContext | null =
|
|
87
|
+
selected && selectedApiId !== null && activePlugin
|
|
88
|
+
? {
|
|
89
|
+
apiId: selectedApiId,
|
|
90
|
+
data: selected,
|
|
91
|
+
clearEvents,
|
|
92
|
+
theme,
|
|
93
|
+
selection: selectionByApi[selectedApiId]?.[activePlugin.id] ?? null,
|
|
94
|
+
setSelection: (nodeId) =>
|
|
95
|
+
setSelectionFor(selectedApiId, activePlugin.id, nodeId),
|
|
96
|
+
switchToThread: resolvedClient.switchToThread
|
|
97
|
+
? (threadId) => switchToThread(selectedApiId, threadId)
|
|
98
|
+
: undefined,
|
|
99
|
+
}
|
|
100
|
+
: null;
|
|
101
|
+
|
|
102
|
+
return (
|
|
103
|
+
<div className="text-foreground flex h-full flex-col text-[13px]">
|
|
104
|
+
<nav className="border-border flex h-10 shrink-0 items-center justify-between gap-2 border-b px-2 select-none">
|
|
105
|
+
<div className="flex h-full items-center">
|
|
106
|
+
{visiblePlugins.map((plugin) => {
|
|
107
|
+
const active = activePlugin?.id === plugin.id;
|
|
108
|
+
return (
|
|
109
|
+
<button
|
|
110
|
+
type="button"
|
|
111
|
+
key={plugin.id}
|
|
112
|
+
onClick={() => setActiveTabId(plugin.id)}
|
|
113
|
+
className={clsx(
|
|
114
|
+
"relative flex h-full items-center px-3 font-medium transition-colors",
|
|
115
|
+
active
|
|
116
|
+
? "text-foreground"
|
|
117
|
+
: "text-muted-foreground hover:text-foreground",
|
|
118
|
+
)}
|
|
119
|
+
>
|
|
120
|
+
{plugin.label}
|
|
121
|
+
{active ? (
|
|
122
|
+
<span className="bg-foreground absolute inset-x-2 -bottom-px h-0.5 rounded-full" />
|
|
123
|
+
) : null}
|
|
124
|
+
</button>
|
|
125
|
+
);
|
|
126
|
+
})}
|
|
127
|
+
</div>
|
|
128
|
+
|
|
129
|
+
<div className="flex items-center gap-2 pe-1">
|
|
130
|
+
{apiIds.length > 1 ? (
|
|
131
|
+
<select
|
|
132
|
+
value={selectedApiId ?? ""}
|
|
133
|
+
onChange={(event) => {
|
|
134
|
+
const value = Number(event.target.value);
|
|
135
|
+
setSelectedApiId(Number.isNaN(value) ? null : value);
|
|
136
|
+
}}
|
|
137
|
+
className="border-border text-muted-foreground hover:text-foreground h-7 rounded-md border bg-transparent px-2 text-[12px] transition-colors"
|
|
138
|
+
>
|
|
139
|
+
{apiIds.map((id) => (
|
|
140
|
+
<option key={id} value={id}>
|
|
141
|
+
API #{id}
|
|
142
|
+
</option>
|
|
143
|
+
))}
|
|
144
|
+
</select>
|
|
145
|
+
) : null}
|
|
146
|
+
|
|
147
|
+
<span className="text-muted-foreground flex items-center gap-1.5 text-[11px]">
|
|
148
|
+
<span className="size-1.5 rounded-full bg-emerald-500" />
|
|
149
|
+
{apiIds.length > 0
|
|
150
|
+
? `${apiIds.length} instance${apiIds.length > 1 ? "s" : ""}`
|
|
151
|
+
: "Waiting"}
|
|
152
|
+
</span>
|
|
153
|
+
|
|
154
|
+
{onClose ? (
|
|
155
|
+
<button
|
|
156
|
+
type="button"
|
|
157
|
+
onClick={onClose}
|
|
158
|
+
aria-label="Close DevTools"
|
|
159
|
+
className="text-muted-foreground hover:bg-accent hover:text-foreground flex size-7 items-center justify-center rounded-md transition-colors"
|
|
160
|
+
>
|
|
161
|
+
<svg
|
|
162
|
+
width="14"
|
|
163
|
+
height="14"
|
|
164
|
+
viewBox="0 0 24 24"
|
|
165
|
+
fill="none"
|
|
166
|
+
aria-hidden="true"
|
|
167
|
+
>
|
|
168
|
+
<path
|
|
169
|
+
d="M18 6 6 18M6 6l12 12"
|
|
170
|
+
stroke="currentColor"
|
|
171
|
+
strokeWidth="1.75"
|
|
172
|
+
strokeLinecap="round"
|
|
173
|
+
strokeLinejoin="round"
|
|
174
|
+
/>
|
|
175
|
+
</svg>
|
|
176
|
+
</button>
|
|
177
|
+
) : null}
|
|
178
|
+
</div>
|
|
179
|
+
</nav>
|
|
180
|
+
|
|
181
|
+
<section className="bg-background min-h-0 flex-1 overflow-hidden">
|
|
182
|
+
{ctx && activePlugin ? (
|
|
183
|
+
<activePlugin.Component {...ctx} />
|
|
184
|
+
) : (
|
|
185
|
+
<CenteredMessage>
|
|
186
|
+
Waiting for assistant-ui instance...
|
|
187
|
+
</CenteredMessage>
|
|
188
|
+
)}
|
|
189
|
+
</section>
|
|
190
|
+
</div>
|
|
191
|
+
);
|
|
192
|
+
};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useEffect, useRef, type CSSProperties, type ReactNode } from "react";
|
|
4
|
+
import { createRoot, type Root } from "react-dom/client";
|
|
5
|
+
import { panelCss } from "../styles/panel.generated";
|
|
6
|
+
|
|
7
|
+
const PROPERTY_STYLE_ID = "assistant-ui-devtools-properties";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Tailwind registers typed `@property --tw-*` custom properties. These register
|
|
11
|
+
* globally and are unreliable when declared only inside a shadow root, so a copy
|
|
12
|
+
* is hoisted to the document head once. The rest of the sheet stays scoped to
|
|
13
|
+
* the shadow root.
|
|
14
|
+
*/
|
|
15
|
+
const hoistAtProperties = () => {
|
|
16
|
+
if (document.getElementById(PROPERTY_STYLE_ID)) return;
|
|
17
|
+
const rules = panelCss.match(/@property\s+--[^{]+\{[^}]*\}/g);
|
|
18
|
+
if (!rules?.length) return;
|
|
19
|
+
const style = document.createElement("style");
|
|
20
|
+
style.id = PROPERTY_STYLE_ID;
|
|
21
|
+
style.textContent = rules.join("");
|
|
22
|
+
document.head.appendChild(style);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export interface ShadowRootProps {
|
|
26
|
+
theme: "light" | "dark";
|
|
27
|
+
className?: string;
|
|
28
|
+
style?: CSSProperties;
|
|
29
|
+
children: ReactNode;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Renders its children into an isolated shadow root with the compiled panel
|
|
34
|
+
* stylesheet. A dedicated React root is mounted inside the shadow root so
|
|
35
|
+
* React's event delegation works (a portal from the outer root would leave the
|
|
36
|
+
* listeners in the light DOM, where shadow retargeting breaks them).
|
|
37
|
+
*/
|
|
38
|
+
export const ShadowRoot = ({
|
|
39
|
+
theme,
|
|
40
|
+
className,
|
|
41
|
+
style,
|
|
42
|
+
children,
|
|
43
|
+
}: ShadowRootProps) => {
|
|
44
|
+
const hostRef = useRef<HTMLDivElement | null>(null);
|
|
45
|
+
const rootRef = useRef<Root | null>(null);
|
|
46
|
+
const mountRef = useRef<HTMLDivElement | null>(null);
|
|
47
|
+
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
const host = hostRef.current;
|
|
50
|
+
if (!host) return;
|
|
51
|
+
|
|
52
|
+
const shadow = host.shadowRoot ?? host.attachShadow({ mode: "open" });
|
|
53
|
+
if (!shadow.querySelector("style[data-aui-devtools]")) {
|
|
54
|
+
const styleEl = document.createElement("style");
|
|
55
|
+
styleEl.setAttribute("data-aui-devtools", "");
|
|
56
|
+
styleEl.textContent = panelCss;
|
|
57
|
+
shadow.appendChild(styleEl);
|
|
58
|
+
}
|
|
59
|
+
hoistAtProperties();
|
|
60
|
+
|
|
61
|
+
const mount = document.createElement("div");
|
|
62
|
+
mount.style.display = "contents";
|
|
63
|
+
shadow.appendChild(mount);
|
|
64
|
+
mountRef.current = mount;
|
|
65
|
+
rootRef.current = createRoot(mount);
|
|
66
|
+
|
|
67
|
+
return () => {
|
|
68
|
+
const root = rootRef.current;
|
|
69
|
+
rootRef.current = null;
|
|
70
|
+
mountRef.current = null;
|
|
71
|
+
queueMicrotask(() => {
|
|
72
|
+
root?.unmount();
|
|
73
|
+
mount.remove();
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
}, []);
|
|
77
|
+
|
|
78
|
+
useEffect(() => {
|
|
79
|
+
const mount = mountRef.current;
|
|
80
|
+
if (mount) mount.className = theme === "dark" ? "dark" : "";
|
|
81
|
+
rootRef.current?.render(children);
|
|
82
|
+
}, [children, theme]);
|
|
83
|
+
|
|
84
|
+
return <div ref={hostRef} className={className} style={style} />;
|
|
85
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import clsx from "clsx";
|
|
2
|
+
import type { ReactNode } from "react";
|
|
3
|
+
|
|
4
|
+
/** Shared nav rail + detail track sizing for the master/detail tabs. */
|
|
5
|
+
export const NAV_COL = "clamp(14rem,28%,18rem)_minmax(0,1fr)";
|
|
6
|
+
|
|
7
|
+
export interface SplitColumn {
|
|
8
|
+
key: string;
|
|
9
|
+
/** Fixed rail header; stays aligned across columns. */
|
|
10
|
+
header?: ReactNode | undefined;
|
|
11
|
+
/** Scrollable pane body. */
|
|
12
|
+
children: ReactNode;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Multi-column split surface. Each column keeps its header fixed and only the
|
|
17
|
+
* body scrolls, so rail titles and divider lines stay aligned across columns.
|
|
18
|
+
*/
|
|
19
|
+
export const SplitLayout = ({
|
|
20
|
+
sizes,
|
|
21
|
+
columns,
|
|
22
|
+
className,
|
|
23
|
+
}: {
|
|
24
|
+
/** Underscore-separated CSS grid track list, e.g. `12rem_minmax(0,1fr)`. */
|
|
25
|
+
sizes: string;
|
|
26
|
+
columns: SplitColumn[];
|
|
27
|
+
className?: string | undefined;
|
|
28
|
+
}) => (
|
|
29
|
+
<div
|
|
30
|
+
className={clsx("grid h-full min-h-0", className)}
|
|
31
|
+
style={{ gridTemplateColumns: sizes.split("_").join(" ") }}
|
|
32
|
+
>
|
|
33
|
+
{columns.map((column, index) => (
|
|
34
|
+
<div
|
|
35
|
+
key={column.key}
|
|
36
|
+
className={clsx(
|
|
37
|
+
"flex min-h-0 flex-col overflow-hidden",
|
|
38
|
+
index < columns.length - 1 && "border-border border-e",
|
|
39
|
+
)}
|
|
40
|
+
>
|
|
41
|
+
{column.header}
|
|
42
|
+
<div className="min-h-0 flex-1 overflow-y-auto">{column.children}</div>
|
|
43
|
+
</div>
|
|
44
|
+
))}
|
|
45
|
+
</div>
|
|
46
|
+
);
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { ComponentType } from "react";
|
|
2
|
+
import type { ApiInfo } from "../data/types";
|
|
3
|
+
import { ActivityTab } from "./tabs/ActivityTab";
|
|
4
|
+
import { ContextTab } from "./tabs/ContextTab";
|
|
5
|
+
import { RawTab } from "./tabs/RawTab";
|
|
6
|
+
import { ThreadTab } from "./tabs/ThreadTab";
|
|
7
|
+
|
|
8
|
+
export interface DevToolsTabContext {
|
|
9
|
+
/** The id of the assistant instance the panel is currently inspecting. */
|
|
10
|
+
apiId: number;
|
|
11
|
+
/** Projected, render-ready data for the inspected instance. */
|
|
12
|
+
data: ApiInfo;
|
|
13
|
+
/** Clears the buffered event log for an instance. */
|
|
14
|
+
clearEvents: (apiId: number) => void;
|
|
15
|
+
/** The resolved theme of the panel. */
|
|
16
|
+
theme: "light" | "dark";
|
|
17
|
+
/**
|
|
18
|
+
* The selected node id for this tab and instance, or null. Always a stable id
|
|
19
|
+
* (message id, run id, slice key, …), never an array index, so the detail
|
|
20
|
+
* pane does not jump as data streams in.
|
|
21
|
+
*/
|
|
22
|
+
selection: string | null;
|
|
23
|
+
/** Selects a node in this tab. Pass null to clear. Persisted per instance. */
|
|
24
|
+
setSelection: (nodeId: string | null) => void;
|
|
25
|
+
/** Switches the live app to a thread, when the runtime supports thread lists. */
|
|
26
|
+
switchToThread?: ((threadId: string) => void | Promise<void>) | undefined;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface DevToolsPanelPlugin {
|
|
30
|
+
/** Stable identifier used as the tab key. */
|
|
31
|
+
id: string;
|
|
32
|
+
/** Tab label shown in the navigation bar. */
|
|
33
|
+
label: string;
|
|
34
|
+
/** Lower numbers sort earlier; builtins occupy 10, 20, 30, 40. */
|
|
35
|
+
order?: number;
|
|
36
|
+
/** When provided and it returns false, the tab is hidden for the current instance. */
|
|
37
|
+
isAvailable?: (ctx: DevToolsTabContext) => boolean;
|
|
38
|
+
/** The tab body. Receives the tab context as props. */
|
|
39
|
+
Component: ComponentType<DevToolsTabContext>;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export const createDevToolsPlugin = (
|
|
43
|
+
plugin: DevToolsPanelPlugin,
|
|
44
|
+
): DevToolsPanelPlugin => plugin;
|
|
45
|
+
|
|
46
|
+
export const builtinPlugins: DevToolsPanelPlugin[] = [
|
|
47
|
+
{ id: "thread", label: "Thread", order: 10, Component: ThreadTab },
|
|
48
|
+
{ id: "context", label: "Context", order: 20, Component: ContextTab },
|
|
49
|
+
{ id: "activity", label: "Activity", order: 30, Component: ActivityTab },
|
|
50
|
+
{ id: "raw", label: "Raw", order: 40, Component: RawTab },
|
|
51
|
+
];
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { renderToStaticMarkup } from "react-dom/server";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { ActivityTab } from "./ActivityTab";
|
|
4
|
+
|
|
5
|
+
const base = 2_000_000_000_000;
|
|
6
|
+
const t = (ms: number) => new Date(base + ms);
|
|
7
|
+
|
|
8
|
+
describe("ActivityTab", () => {
|
|
9
|
+
it("renders a split layout with runs and an event stream", () => {
|
|
10
|
+
const html = renderToStaticMarkup(
|
|
11
|
+
<ActivityTab
|
|
12
|
+
apiId={1}
|
|
13
|
+
data={{
|
|
14
|
+
id: 1,
|
|
15
|
+
logs: [
|
|
16
|
+
{ time: t(0), event: "thread.runStart", data: { threadId: "T1" } },
|
|
17
|
+
{ time: t(150), event: "composer.send", data: { threadId: "T1" } },
|
|
18
|
+
{ time: t(900), event: "thread.runEnd", data: { threadId: "T1" } },
|
|
19
|
+
],
|
|
20
|
+
state: {},
|
|
21
|
+
}}
|
|
22
|
+
clearEvents={() => {}}
|
|
23
|
+
theme="light"
|
|
24
|
+
selection={null}
|
|
25
|
+
setSelection={() => {}}
|
|
26
|
+
/>,
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
expect(html).toContain("All events");
|
|
30
|
+
expect(html).toContain("Run #0");
|
|
31
|
+
expect(html).toContain("900ms");
|
|
32
|
+
expect(html).toContain("send");
|
|
33
|
+
});
|
|
34
|
+
});
|