@agent-native/toolkit 0.228.0-nightly-20261111212500 → 0.228.0
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/agent-native.eject.json +2 -0
- package/dist/app/agentkit/react/approval-card.d.ts.map +1 -1
- package/dist/app/agentkit/react/approval-card.js +5 -3
- package/dist/app/agentkit/react/approval-card.js.map +1 -1
- package/dist/app/agentkit/react/code-block.d.ts +32 -0
- package/dist/app/agentkit/react/code-block.d.ts.map +1 -0
- package/dist/app/agentkit/react/code-block.js +125 -0
- package/dist/app/agentkit/react/code-block.js.map +1 -0
- package/dist/app/agentkit/react/components.d.ts +33 -14
- package/dist/app/agentkit/react/components.d.ts.map +1 -1
- package/dist/app/agentkit/react/components.js +843 -168
- package/dist/app/agentkit/react/components.js.map +1 -1
- package/dist/app/agentkit/react/context-usage.d.ts +45 -0
- package/dist/app/agentkit/react/context-usage.d.ts.map +1 -0
- package/dist/app/agentkit/react/context-usage.js +93 -0
- package/dist/app/agentkit/react/context-usage.js.map +1 -0
- package/dist/app/agentkit/react/context.d.ts +42 -3
- package/dist/app/agentkit/react/context.d.ts.map +1 -1
- package/dist/app/agentkit/react/context.js +46 -1
- package/dist/app/agentkit/react/context.js.map +1 -1
- package/dist/app/agentkit/react/disclosure-content.d.ts +12 -0
- package/dist/app/agentkit/react/disclosure-content.d.ts.map +1 -0
- package/dist/app/agentkit/react/disclosure-content.js +33 -0
- package/dist/app/agentkit/react/disclosure-content.js.map +1 -0
- package/dist/app/agentkit/react/duration.d.ts +6 -0
- package/dist/app/agentkit/react/duration.d.ts.map +1 -0
- package/dist/app/agentkit/react/duration.js +21 -0
- package/dist/app/agentkit/react/duration.js.map +1 -0
- package/dist/app/agentkit/react/file-change.d.ts +33 -0
- package/dist/app/agentkit/react/file-change.d.ts.map +1 -0
- package/dist/app/agentkit/react/file-change.js +83 -0
- package/dist/app/agentkit/react/file-change.js.map +1 -0
- package/dist/app/agentkit/react/file-diff.d.ts +17 -0
- package/dist/app/agentkit/react/file-diff.d.ts.map +1 -0
- package/dist/app/agentkit/react/file-diff.js +94 -0
- package/dist/app/agentkit/react/file-diff.js.map +1 -0
- package/dist/app/agentkit/react/index.d.ts +7 -0
- package/dist/app/agentkit/react/index.d.ts.map +1 -1
- package/dist/app/agentkit/react/index.js +7 -0
- package/dist/app/agentkit/react/index.js.map +1 -1
- package/dist/app/agentkit/react/question-card.d.ts +67 -0
- package/dist/app/agentkit/react/question-card.d.ts.map +1 -0
- package/dist/app/agentkit/react/question-card.js +198 -0
- package/dist/app/agentkit/react/question-card.js.map +1 -0
- package/dist/app/agentkit/react/root.d.ts +3 -2
- package/dist/app/agentkit/react/root.d.ts.map +1 -1
- package/dist/app/agentkit/react/root.js +2 -2
- package/dist/app/agentkit/react/root.js.map +1 -1
- package/dist/app/agentkit/react/roving-focus.d.ts +4 -0
- package/dist/app/agentkit/react/roving-focus.d.ts.map +1 -0
- package/dist/app/agentkit/react/roving-focus.js +75 -0
- package/dist/app/agentkit/react/roving-focus.js.map +1 -0
- package/dist/app/agentkit/react/stack-trace.d.ts +34 -0
- package/dist/app/agentkit/react/stack-trace.d.ts.map +1 -0
- package/dist/app/agentkit/react/stack-trace.js +121 -0
- package/dist/app/agentkit/react/stack-trace.js.map +1 -0
- package/dist/app/agentkit/react/stop-button.d.ts.map +1 -1
- package/dist/app/agentkit/react/stop-button.js +22 -6
- package/dist/app/agentkit/react/stop-button.js.map +1 -1
- package/dist/app/agentkit/react/styles.css +1306 -395
- package/dist/app/agentkit/react/terminal.d.ts +28 -0
- package/dist/app/agentkit/react/terminal.d.ts.map +1 -0
- package/dist/app/agentkit/react/terminal.js +84 -0
- package/dist/app/agentkit/react/terminal.js.map +1 -0
- package/dist/app/agentkit/react/trace.d.ts +31 -0
- package/dist/app/agentkit/react/trace.d.ts.map +1 -0
- package/dist/app/agentkit/react/trace.js +73 -0
- package/dist/app/agentkit/react/trace.js.map +1 -0
- package/dist/app/blocks/library/HighlightedCode.d.ts +2 -1
- package/dist/app/blocks/library/HighlightedCode.d.ts.map +1 -1
- package/dist/app/blocks/library/HighlightedCode.js +8 -111
- package/dist/app/blocks/library/HighlightedCode.js.map +1 -1
- package/dist/app/chat/AgentKitAssistantChat.d.ts.map +1 -1
- package/dist/app/chat/AgentKitAssistantChat.js +23 -245
- package/dist/app/chat/AgentKitAssistantChat.js.map +1 -1
- package/dist/app/chat/agentkit-chat/guided-questions.d.ts +15 -1
- package/dist/app/chat/agentkit-chat/guided-questions.d.ts.map +1 -1
- package/dist/app/chat/agentkit-chat/guided-questions.js +142 -2
- package/dist/app/chat/agentkit-chat/guided-questions.js.map +1 -1
- package/dist/app/chat/agentkit-chat/history.js +1 -1
- package/dist/app/chat/agentkit-chat/history.js.map +1 -1
- package/dist/app/chat/agentkit-chat/index.d.ts +1 -1
- package/dist/app/chat/agentkit-chat/index.d.ts.map +1 -1
- package/dist/app/chat/agentkit-chat/index.js +1 -1
- package/dist/app/chat/agentkit-chat/index.js.map +1 -1
- package/dist/app/chat/agentkit-chat/labels.d.ts +5 -0
- package/dist/app/chat/agentkit-chat/labels.d.ts.map +1 -0
- package/dist/app/chat/agentkit-chat/labels.js +245 -0
- package/dist/app/chat/agentkit-chat/labels.js.map +1 -0
- package/dist/app/chat/agentkit-chat/questions.d.ts +1 -1
- package/dist/app/chat/agentkit-chat/questions.d.ts.map +1 -1
- package/dist/app/chat/agentkit-chat/questions.js +1 -1
- package/dist/app/chat/agentkit-chat/questions.js.map +1 -1
- package/dist/app/chat/agentkit-chat/root.d.ts.map +1 -1
- package/dist/app/chat/agentkit-chat/root.js +5 -64
- package/dist/app/chat/agentkit-chat/root.js.map +1 -1
- package/dist/app/chat/agentkit-chat/work-step-labels.d.ts +2 -0
- package/dist/app/chat/agentkit-chat/work-step-labels.d.ts.map +1 -1
- package/dist/app/chat/agentkit-chat/work-step-labels.js +31 -0
- package/dist/app/chat/agentkit-chat/work-step-labels.js.map +1 -1
- package/dist/app/chat/chat/markdown-renderer.d.ts +2 -12
- package/dist/app/chat/chat/markdown-renderer.d.ts.map +1 -1
- package/dist/app/chat/chat/markdown-renderer.js +2 -41
- package/dist/app/chat/chat/markdown-renderer.js.map +1 -1
- package/dist/app/chat/chat/tool-call-display.d.ts.map +1 -1
- package/dist/app/chat/chat/tool-call-display.js +2 -2
- package/dist/app/chat/chat/tool-call-display.js.map +1 -1
- package/dist/app/chat/conversation/AgentConversation.d.ts.map +1 -1
- package/dist/app/chat/conversation/AgentConversation.js +2 -37
- package/dist/app/chat/conversation/AgentConversation.js.map +1 -1
- package/dist/app/chat/tool-cells/BashCell.d.ts +3 -1
- package/dist/app/chat/tool-cells/BashCell.d.ts.map +1 -1
- package/dist/app/chat/tool-cells/BashCell.js +4 -40
- package/dist/app/chat/tool-cells/BashCell.js.map +1 -1
- package/dist/app/chat/tool-cells/EditCell.d.ts.map +1 -1
- package/dist/app/chat/tool-cells/EditCell.js +5 -108
- package/dist/app/chat/tool-cells/EditCell.js.map +1 -1
- package/dist/app/chat/tool-cells/FilesChangedSummary.d.ts.map +1 -1
- package/dist/app/chat/tool-cells/FilesChangedSummary.js +23 -81
- package/dist/app/chat/tool-cells/FilesChangedSummary.js.map +1 -1
- package/dist/app/chat/tool-cells/WriteCell.d.ts.map +1 -1
- package/dist/app/chat/tool-cells/WriteCell.js +5 -24
- package/dist/app/chat/tool-cells/WriteCell.js.map +1 -1
- package/dist/app/code-highlighter.d.ts +11 -0
- package/dist/app/code-highlighter.d.ts.map +1 -0
- package/dist/app/code-highlighter.js +122 -0
- package/dist/app/code-highlighter.js.map +1 -0
- package/dist/app/context-xray/ThreadContextRing.js +3 -3
- package/dist/app/context-xray/ThreadContextRing.js.map +1 -1
- package/dist/app/i18n/catalogs/ar-SA.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/ar-SA.js +22 -0
- package/dist/app/i18n/catalogs/ar-SA.js.map +1 -1
- package/dist/app/i18n/catalogs/de-DE.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/de-DE.js +22 -0
- package/dist/app/i18n/catalogs/de-DE.js.map +1 -1
- package/dist/app/i18n/catalogs/en-US.d.ts +22 -0
- package/dist/app/i18n/catalogs/en-US.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/en-US.js +22 -0
- package/dist/app/i18n/catalogs/en-US.js.map +1 -1
- package/dist/app/i18n/catalogs/es-ES.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/es-ES.js +22 -0
- package/dist/app/i18n/catalogs/es-ES.js.map +1 -1
- package/dist/app/i18n/catalogs/fr-FR.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/fr-FR.js +22 -0
- package/dist/app/i18n/catalogs/fr-FR.js.map +1 -1
- package/dist/app/i18n/catalogs/hi-IN.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/hi-IN.js +22 -0
- package/dist/app/i18n/catalogs/hi-IN.js.map +1 -1
- package/dist/app/i18n/catalogs/ja-JP.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/ja-JP.js +22 -0
- package/dist/app/i18n/catalogs/ja-JP.js.map +1 -1
- package/dist/app/i18n/catalogs/ko-KR.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/ko-KR.js +22 -0
- package/dist/app/i18n/catalogs/ko-KR.js.map +1 -1
- package/dist/app/i18n/catalogs/pt-BR.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/pt-BR.js +22 -0
- package/dist/app/i18n/catalogs/pt-BR.js.map +1 -1
- package/dist/app/i18n/catalogs/zh-CN.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/zh-CN.js +22 -0
- package/dist/app/i18n/catalogs/zh-CN.js.map +1 -1
- package/dist/app/i18n/catalogs/zh-TW.d.ts.map +1 -1
- package/dist/app/i18n/catalogs/zh-TW.js +22 -0
- package/dist/app/i18n/catalogs/zh-TW.js.map +1 -1
- package/dist/app/onboarding/first-run-first-paint.d.ts +10 -0
- package/dist/app/onboarding/first-run-first-paint.d.ts.map +1 -0
- package/dist/app/onboarding/first-run-first-paint.js +22 -0
- package/dist/app/onboarding/first-run-first-paint.js.map +1 -0
- package/dist/app/onboarding/first-run-startup-gate.d.ts +3 -1
- package/dist/app/onboarding/first-run-startup-gate.d.ts.map +1 -1
- package/dist/app/onboarding/first-run-startup-gate.js +30 -6
- package/dist/app/onboarding/first-run-startup-gate.js.map +1 -1
- package/dist/app/providers/AppProviders.d.ts.map +1 -1
- package/dist/app/providers/AppProviders.js +9 -2
- package/dist/app/providers/AppProviders.js.map +1 -1
- package/dist/app/providers/BuilderSignupActivation.d.ts +2 -1
- package/dist/app/providers/BuilderSignupActivation.d.ts.map +1 -1
- package/dist/app/providers/BuilderSignupActivation.js +6 -3
- package/dist/app/providers/BuilderSignupActivation.js.map +1 -1
- package/dist/app/shared/AppShellSkeleton.d.ts.map +1 -1
- package/dist/app/shared/AppShellSkeleton.js +11 -1
- package/dist/app/shared/AppShellSkeleton.js.map +1 -1
- package/dist/app/styles/agent-native.css +2 -2
- package/dist/app/styles/tokens/agent-kit.css +20 -3
- package/dist/composer/AgentSuggestionBar.d.ts.map +1 -1
- package/dist/composer/AgentSuggestionBar.js +2 -2
- package/dist/composer/AgentSuggestionBar.js.map +1 -1
- package/dist/composer/ComposerContextMenu.js +4 -4
- package/dist/composer/ComposerContextMenu.js.map +1 -1
- package/dist/composer/ComposerContextPicker.d.ts.map +1 -1
- package/dist/composer/ComposerContextPicker.js +2 -2
- package/dist/composer/ComposerContextPicker.js.map +1 -1
- package/dist/composer/ComposerContextPickerDialog.d.ts.map +1 -1
- package/dist/composer/ComposerContextPickerDialog.js +2 -2
- package/dist/composer/ComposerContextPickerDialog.js.map +1 -1
- package/dist/composer/ComposerModePicker.d.ts.map +1 -1
- package/dist/composer/ComposerModePicker.js +2 -1
- package/dist/composer/ComposerModePicker.js.map +1 -1
- package/dist/composer/ComposerPlusMenu.js +1 -1
- package/dist/composer/ComposerPlusMenu.js.map +1 -1
- package/dist/composer/MentionChip.js +1 -1
- package/dist/composer/MentionChip.js.map +1 -1
- package/dist/composer/MentionPopover.d.ts +3 -0
- package/dist/composer/MentionPopover.d.ts.map +1 -1
- package/dist/composer/MentionPopover.js +34 -15
- package/dist/composer/MentionPopover.js.map +1 -1
- package/dist/composer/MessageQueueDrawer.d.ts.map +1 -1
- package/dist/composer/MessageQueueDrawer.js +14 -9
- package/dist/composer/MessageQueueDrawer.js.map +1 -1
- package/dist/composer/PastedTextChip.d.ts.map +1 -1
- package/dist/composer/PastedTextChip.js +14 -18
- package/dist/composer/PastedTextChip.js.map +1 -1
- package/dist/composer/PromptBar.js +1 -1
- package/dist/composer/PromptBar.js.map +1 -1
- package/dist/composer/PromptComposer.d.ts.map +1 -1
- package/dist/composer/PromptComposer.js +11 -9
- package/dist/composer/PromptComposer.js.map +1 -1
- package/dist/composer/RealtimeVoiceMode.js +2 -2
- package/dist/composer/RealtimeVoiceMode.js.map +1 -1
- package/dist/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/composer/TiptapComposer.js +52 -89
- package/dist/composer/TiptapComposer.js.map +1 -1
- package/dist/composer/VoiceButton.d.ts +3 -1
- package/dist/composer/VoiceButton.d.ts.map +1 -1
- package/dist/composer/VoiceButton.js +10 -8
- package/dist/composer/VoiceButton.js.map +1 -1
- package/dist/composer/composer-notice.js +3 -3
- package/dist/composer/composer-notice.js.map +1 -1
- package/dist/composer/extensions/FileReference.js +1 -1
- package/dist/composer/extensions/FileReference.js.map +1 -1
- package/dist/composer/extensions/SkillReference.js +1 -1
- package/dist/composer/extensions/SkillReference.js.map +1 -1
- package/dist/composer/popover-surface.d.ts +1 -1
- package/dist/composer/popover-surface.d.ts.map +1 -1
- package/dist/composer/popover-surface.js +1 -1
- package/dist/composer/popover-surface.js.map +1 -1
- package/dist/context-ui/ContextUsageRing.d.ts +1 -45
- package/dist/context-ui/ContextUsageRing.d.ts.map +1 -1
- package/dist/context-ui/ContextUsageRing.js +2 -87
- package/dist/context-ui/ContextUsageRing.js.map +1 -1
- package/dist/context-ui/index.d.ts +2 -2
- package/dist/context-ui/index.d.ts.map +1 -1
- package/dist/context-ui/index.js +2 -2
- package/dist/context-ui/index.js.map +1 -1
- package/package.json +4 -4
- package/src/app/agentkit/react/approval-card.tsx +14 -2
- package/src/app/agentkit/react/code-block.spec.tsx +154 -0
- package/src/app/agentkit/react/code-block.tsx +317 -0
- package/src/app/agentkit/react/components.interaction.spec.tsx +7 -0
- package/src/app/agentkit/react/components.papercuts.spec.tsx +143 -2
- package/src/app/agentkit/react/components.spec.tsx +40 -47
- package/src/app/agentkit/react/components.tsx +1533 -413
- package/src/app/agentkit/react/composer-context.spec.tsx +35 -0
- package/src/app/agentkit/react/context-usage.tsx +353 -0
- package/src/app/agentkit/react/context.tsx +93 -1
- package/src/app/agentkit/react/disclosure-content.ts +42 -0
- package/src/app/agentkit/react/disclosures.spec.tsx +62 -4
- package/src/app/agentkit/react/duration.ts +22 -0
- package/src/app/agentkit/react/file-change.spec.tsx +124 -0
- package/src/app/agentkit/react/file-change.tsx +228 -0
- package/src/app/agentkit/react/file-diff.ts +110 -0
- package/src/app/agentkit/react/index.ts +7 -0
- package/src/app/agentkit/react/lifecycle.spec.tsx +565 -20
- package/src/app/agentkit/react/markdown.spec.tsx +18 -8
- package/src/app/agentkit/react/message-actions.spec.tsx +55 -1
- package/src/app/agentkit/react/notices.spec.tsx +4 -4
- package/src/app/agentkit/react/optimistic-send.spec.tsx +43 -0
- package/src/app/agentkit/react/question-card.spec.tsx +276 -0
- package/src/app/agentkit/react/question-card.tsx +533 -0
- package/src/app/agentkit/react/root.tsx +4 -0
- package/src/app/agentkit/react/roving-focus.spec.tsx +114 -0
- package/src/app/agentkit/react/roving-focus.ts +82 -0
- package/src/app/agentkit/react/stack-trace.spec.tsx +177 -0
- package/src/app/agentkit/react/stack-trace.tsx +281 -0
- package/src/app/agentkit/react/stop-button.spec.tsx +40 -0
- package/src/app/agentkit/react/stop-button.tsx +22 -5
- package/src/app/agentkit/react/styles.css +1306 -395
- package/src/app/agentkit/react/subagent-step.spec.tsx +554 -0
- package/src/app/agentkit/react/terminal.spec.tsx +228 -0
- package/src/app/agentkit/react/terminal.tsx +228 -0
- package/src/app/agentkit/react/trace.spec.tsx +120 -0
- package/src/app/agentkit/react/trace.tsx +239 -0
- package/src/app/blocks/library/HighlightedCode.tsx +14 -126
- package/src/app/chat/AgentKitAssistantChat.spec.tsx +28 -12
- package/src/app/chat/AgentKitAssistantChat.tsx +27 -253
- package/src/app/chat/agentkit-chat/approval-card.spec.tsx +1 -0
- package/src/app/chat/agentkit-chat/guided-questions.flow.spec.tsx +381 -0
- package/src/app/chat/agentkit-chat/guided-questions.tsx +236 -3
- package/src/app/chat/agentkit-chat/history.tsx +1 -1
- package/src/app/chat/agentkit-chat/index.ts +2 -0
- package/src/app/chat/agentkit-chat/labels.ts +259 -0
- package/src/app/chat/agentkit-chat/questions.ts +2 -0
- package/src/app/chat/agentkit-chat/root.spec.tsx +18 -0
- package/src/app/chat/agentkit-chat/root.tsx +5 -64
- package/src/app/chat/agentkit-chat/work-step-labels.ts +42 -0
- package/src/app/chat/chat/markdown-renderer.tsx +2 -59
- package/src/app/chat/chat/tool-call-display.spec.tsx +26 -14
- package/src/app/chat/chat/tool-call-display.tsx +2 -1
- package/src/app/chat/conversation/AgentConversation.tsx +2 -50
- package/src/app/chat/tool-cells/BashCell.tsx +14 -136
- package/src/app/chat/tool-cells/EditCell.tsx +11 -248
- package/src/app/chat/tool-cells/FilesChangedSummary.spec.tsx +62 -5
- package/src/app/chat/tool-cells/FilesChangedSummary.tsx +31 -162
- package/src/app/chat/tool-cells/WriteCell.tsx +11 -121
- package/src/app/code-highlighter.ts +131 -0
- package/src/app/context-xray/ThreadContextRing.tsx +7 -7
- package/src/app/i18n/catalogs/ar-SA.ts +22 -0
- package/src/app/i18n/catalogs/de-DE.ts +22 -0
- package/src/app/i18n/catalogs/en-US.ts +22 -0
- package/src/app/i18n/catalogs/es-ES.ts +22 -0
- package/src/app/i18n/catalogs/fr-FR.ts +22 -0
- package/src/app/i18n/catalogs/hi-IN.ts +22 -0
- package/src/app/i18n/catalogs/ja-JP.ts +22 -0
- package/src/app/i18n/catalogs/ko-KR.ts +22 -0
- package/src/app/i18n/catalogs/pt-BR.ts +22 -0
- package/src/app/i18n/catalogs/zh-CN.ts +22 -0
- package/src/app/i18n/catalogs/zh-TW.ts +22 -0
- package/src/app/onboarding/first-run-first-paint.spec.ts +39 -0
- package/src/app/onboarding/first-run-first-paint.ts +24 -0
- package/src/app/onboarding/first-run-startup-gate.spec.tsx +125 -13
- package/src/app/onboarding/first-run-startup-gate.tsx +48 -5
- package/src/app/providers/AppProviders.tsx +18 -0
- package/src/app/providers/BuilderSignupActivation.tsx +8 -2
- package/src/app/shared/AppShellSkeleton.spec.tsx +60 -1
- package/src/app/shared/AppShellSkeleton.tsx +31 -1
- package/src/app/styles/agent-native.css +2 -2
- package/src/app/styles/agent-native.spec.ts +2 -2
- package/src/app/styles/tokens/agent-kit.css +20 -3
- package/src/composer/AgentSuggestionBar.spec.tsx +3 -1
- package/src/composer/AgentSuggestionBar.tsx +5 -2
- package/src/composer/ComposerContextMenu.tsx +4 -4
- package/src/composer/ComposerContextPicker.tsx +8 -2
- package/src/composer/ComposerContextPickerDialog.tsx +5 -2
- package/src/composer/ComposerModePicker.tsx +2 -1
- package/src/composer/ComposerPlusMenu.tsx +1 -1
- package/src/composer/MentionChip.tsx +1 -1
- package/src/composer/MentionPopover.spec.tsx +108 -2
- package/src/composer/MentionPopover.tsx +93 -17
- package/src/composer/MessageQueueDrawer.spec.tsx +5 -5
- package/src/composer/MessageQueueDrawer.tsx +19 -12
- package/src/composer/PastedTextChip.spec.tsx +36 -0
- package/src/composer/PastedTextChip.tsx +52 -58
- package/src/composer/PromptBar.tsx +1 -1
- package/src/composer/PromptComposer.context.spec.tsx +2 -2
- package/src/composer/PromptComposer.submission.spec.tsx +27 -0
- package/src/composer/PromptComposer.tsx +17 -9
- package/src/composer/RealtimeVoiceMode.tsx +2 -2
- package/src/composer/TiptapComposer.model-picker.spec.tsx +23 -82
- package/src/composer/TiptapComposer.tsx +68 -145
- package/src/composer/VoiceButton.tsx +12 -7
- package/src/composer/composer-notice.tsx +3 -3
- package/src/composer/extensions/FileReference.tsx +1 -1
- package/src/composer/extensions/SkillReference.tsx +1 -1
- package/src/composer/popover-surface.ts +1 -1
- package/src/context-ui/ContextUsageRing.spec.tsx +33 -8
- package/src/context-ui/ContextUsageRing.tsx +13 -348
- package/src/context-ui/index.ts +7 -1
- package/dist/composer/ModelPickerParts.d.ts +0 -20
- package/dist/composer/ModelPickerParts.d.ts.map +0 -1
- package/dist/composer/ModelPickerParts.js +0 -77
- package/dist/composer/ModelPickerParts.js.map +0 -1
- package/src/composer/ModelPickerParts.tsx +0 -188
|
@@ -0,0 +1,554 @@
|
|
|
1
|
+
// @vitest-environment happy-dom
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
createAgentThreadState,
|
|
5
|
+
reduceAgentEvent,
|
|
6
|
+
type AgentKitController,
|
|
7
|
+
type AgentKitSnapshot,
|
|
8
|
+
type AgentThreadState,
|
|
9
|
+
} from "@agent-native/agentkit/client";
|
|
10
|
+
import type { AgentEvent } from "@agent-native/agentkit/protocol";
|
|
11
|
+
import { act } from "react";
|
|
12
|
+
import { createRoot, type Root } from "react-dom/client";
|
|
13
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
14
|
+
|
|
15
|
+
import {
|
|
16
|
+
AgentActivityGroup,
|
|
17
|
+
AgentCollaborationFeed,
|
|
18
|
+
AgentTaskGroup,
|
|
19
|
+
} from "./components.js";
|
|
20
|
+
import { AgentKitProvider } from "./context.js";
|
|
21
|
+
|
|
22
|
+
const threadId = "thread-subagent";
|
|
23
|
+
const runId = "run-subagent";
|
|
24
|
+
const app = { id: "Brain", kind: "agent", label: "Brain" };
|
|
25
|
+
|
|
26
|
+
type EventBody = AgentEvent extends infer Event
|
|
27
|
+
? Event extends AgentEvent
|
|
28
|
+
? Omit<Event, "id" | "threadId" | "runId" | "sequence" | "occurredAt">
|
|
29
|
+
: never
|
|
30
|
+
: never;
|
|
31
|
+
|
|
32
|
+
function threadFrom(bodies: EventBody[]): AgentThreadState {
|
|
33
|
+
let thread = createAgentThreadState(threadId);
|
|
34
|
+
bodies.forEach((body, index) => {
|
|
35
|
+
thread = reduceAgentEvent(thread, {
|
|
36
|
+
...body,
|
|
37
|
+
id: `event-${index + 1}`,
|
|
38
|
+
threadId,
|
|
39
|
+
runId,
|
|
40
|
+
sequence: index + 1,
|
|
41
|
+
occurredAt: `2026-11-11T00:00:${String(index + 1).padStart(2, "0")}.000Z`,
|
|
42
|
+
} as AgentEvent);
|
|
43
|
+
});
|
|
44
|
+
return thread;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function controllerFor(thread: AgentThreadState): AgentKitController {
|
|
48
|
+
const snapshot: AgentKitSnapshot = {
|
|
49
|
+
connection: "connected",
|
|
50
|
+
capabilities: {},
|
|
51
|
+
capabilitiesStatus: "ready",
|
|
52
|
+
threads: { [threadId]: thread },
|
|
53
|
+
revision: 0,
|
|
54
|
+
};
|
|
55
|
+
return {
|
|
56
|
+
getSnapshot: () => snapshot,
|
|
57
|
+
subscribe: () => () => undefined,
|
|
58
|
+
getThread: () => thread,
|
|
59
|
+
loadThread: vi.fn(async () => thread),
|
|
60
|
+
} as unknown as AgentKitController;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const delegation: EventBody[] = [
|
|
64
|
+
{ type: "run.started" },
|
|
65
|
+
{
|
|
66
|
+
type: "agent.registered",
|
|
67
|
+
agent: {
|
|
68
|
+
id: "call-1",
|
|
69
|
+
name: "Brain",
|
|
70
|
+
kind: "delegated-agent",
|
|
71
|
+
status: "working",
|
|
72
|
+
activeTaskId: "task-1",
|
|
73
|
+
origin: app,
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
type: "agent.interaction",
|
|
78
|
+
interaction: {
|
|
79
|
+
id: "call-1:delegated:1",
|
|
80
|
+
kind: "delegated",
|
|
81
|
+
agentId: "call-1",
|
|
82
|
+
scope: "external",
|
|
83
|
+
source: app,
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
type: "task.created",
|
|
88
|
+
task: {
|
|
89
|
+
id: "task-1",
|
|
90
|
+
title: "Summarize the release notes",
|
|
91
|
+
kind: "delegated-agent",
|
|
92
|
+
status: "running",
|
|
93
|
+
assignedAgentId: "call-1",
|
|
94
|
+
source: app,
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
type: "tool.started",
|
|
99
|
+
toolCall: {
|
|
100
|
+
id: "call-1-search",
|
|
101
|
+
name: "search-docs",
|
|
102
|
+
status: "running",
|
|
103
|
+
agentId: "call-1",
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
type: "agent.interaction",
|
|
108
|
+
interaction: {
|
|
109
|
+
id: "call-1:message:2",
|
|
110
|
+
kind: "messaged",
|
|
111
|
+
agentId: "call-1",
|
|
112
|
+
detail: "Found the runtime boundary.",
|
|
113
|
+
scope: "external",
|
|
114
|
+
source: app,
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
type: "activity.started",
|
|
119
|
+
activity: {
|
|
120
|
+
id: "call-1:progress",
|
|
121
|
+
kind: "agent",
|
|
122
|
+
label: "processing",
|
|
123
|
+
detail: "Reading the contract",
|
|
124
|
+
status: "running",
|
|
125
|
+
agentId: "call-1",
|
|
126
|
+
scope: "external",
|
|
127
|
+
source: app,
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
];
|
|
131
|
+
|
|
132
|
+
describe("AgentSubagentStep", () => {
|
|
133
|
+
let container: HTMLDivElement;
|
|
134
|
+
let root: Root;
|
|
135
|
+
|
|
136
|
+
beforeEach(() => {
|
|
137
|
+
vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true);
|
|
138
|
+
container = document.createElement("div");
|
|
139
|
+
document.body.appendChild(container);
|
|
140
|
+
root = createRoot(container);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
afterEach(() => {
|
|
144
|
+
act(() => root.unmount());
|
|
145
|
+
container.remove();
|
|
146
|
+
vi.unstubAllGlobals();
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
const render = async (thread: AgentThreadState) => {
|
|
150
|
+
await act(async () => {
|
|
151
|
+
root.render(
|
|
152
|
+
<AgentKitProvider
|
|
153
|
+
controller={controllerFor(thread)}
|
|
154
|
+
threadId={threadId}
|
|
155
|
+
>
|
|
156
|
+
<AgentCollaborationFeed runId={runId} />
|
|
157
|
+
<AgentTaskGroup runId={runId} />
|
|
158
|
+
<AgentActivityGroup runId={runId} excludeAgentActivities />
|
|
159
|
+
</AgentKitProvider>,
|
|
160
|
+
);
|
|
161
|
+
});
|
|
162
|
+
};
|
|
163
|
+
const steps = () =>
|
|
164
|
+
Array.from(
|
|
165
|
+
container.querySelectorAll<HTMLElement>(".agentkit-subagent-step"),
|
|
166
|
+
);
|
|
167
|
+
const header = (step: HTMLElement) =>
|
|
168
|
+
step.querySelector<HTMLElement>(":scope > .agentkit-activity-row");
|
|
169
|
+
const toggle = async (step: HTMLElement) => {
|
|
170
|
+
await act(async () =>
|
|
171
|
+
step
|
|
172
|
+
.querySelector<HTMLElement>(
|
|
173
|
+
":scope > .agentkit-activity-row .agentkit-disclosure-summary",
|
|
174
|
+
)
|
|
175
|
+
?.click(),
|
|
176
|
+
);
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
it("folds a running delegation into one collapsed step", async () => {
|
|
180
|
+
await render(threadFrom(delegation));
|
|
181
|
+
|
|
182
|
+
expect(steps()).toHaveLength(1);
|
|
183
|
+
const [step] = steps();
|
|
184
|
+
if (!step) throw new Error("No subagent step");
|
|
185
|
+
expect(step.dataset.status).toBe("running");
|
|
186
|
+
const row = header(step);
|
|
187
|
+
expect(row?.querySelector(".agentkit-agent-name")?.textContent).toBe(
|
|
188
|
+
"Brain",
|
|
189
|
+
);
|
|
190
|
+
// The chip's shimmer is not the only sign it is working.
|
|
191
|
+
expect(
|
|
192
|
+
row?.querySelector(".agentkit-agent .agentkit-visually-hidden")
|
|
193
|
+
?.textContent,
|
|
194
|
+
).toBe("Running");
|
|
195
|
+
expect(row?.querySelector(".agentkit-activity-label")?.textContent).toBe(
|
|
196
|
+
"working",
|
|
197
|
+
);
|
|
198
|
+
// The task it was given is the headline, not its progress line.
|
|
199
|
+
expect(row?.querySelector(".agentkit-activity-detail")?.textContent).toBe(
|
|
200
|
+
"Summarize the release notes",
|
|
201
|
+
);
|
|
202
|
+
expect(container.querySelector(".agentkit-tasks")).toBeNull();
|
|
203
|
+
expect(
|
|
204
|
+
step.querySelector(".agentkit-subagent-content")?.getAttribute("hidden"),
|
|
205
|
+
).toBe("until-found");
|
|
206
|
+
expect(container.textContent?.match(/Brain/g)).toHaveLength(1);
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
it("holds the agent's own calls and messages without repeating its name", async () => {
|
|
210
|
+
await render(threadFrom(delegation));
|
|
211
|
+
const [step] = steps();
|
|
212
|
+
if (!step) throw new Error("No subagent step");
|
|
213
|
+
await toggle(step);
|
|
214
|
+
|
|
215
|
+
const content = step.querySelector(".agentkit-subagent-content");
|
|
216
|
+
expect(content).not.toBeNull();
|
|
217
|
+
// Its call is here, not in the parent's work.
|
|
218
|
+
expect(
|
|
219
|
+
content?.querySelector('.agentkit-activity-item[data-status="running"]')
|
|
220
|
+
?.textContent,
|
|
221
|
+
).toContain("Search docs");
|
|
222
|
+
expect(
|
|
223
|
+
String(container.querySelector(".agentkit-activities")?.textContent),
|
|
224
|
+
).not.toContain("Search docs");
|
|
225
|
+
// Its state is said in words, not only by the shimmer.
|
|
226
|
+
expect(
|
|
227
|
+
content?.querySelector(
|
|
228
|
+
'.agentkit-activity-item[data-status="running"] .agentkit-visually-hidden',
|
|
229
|
+
)?.textContent,
|
|
230
|
+
).toBe("Running");
|
|
231
|
+
const message = content?.querySelector(
|
|
232
|
+
'.agentkit-agent-interaction[data-kind="messaged"]',
|
|
233
|
+
);
|
|
234
|
+
expect(message?.textContent).toContain("Found the runtime boundary");
|
|
235
|
+
// "delegated work" is what the row's status already says.
|
|
236
|
+
expect(content?.textContent).not.toContain("delegated work");
|
|
237
|
+
expect(content?.querySelector(".agentkit-agent")).toBeNull();
|
|
238
|
+
expect(container.textContent?.match(/Brain/g)).toHaveLength(1);
|
|
239
|
+
|
|
240
|
+
await toggle(step);
|
|
241
|
+
expect(
|
|
242
|
+
step.querySelector(".agentkit-subagent-content")?.getAttribute("hidden"),
|
|
243
|
+
).toBe("until-found");
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
it("shows how long a finished agent worked and its result in place", async () => {
|
|
247
|
+
await render(
|
|
248
|
+
threadFrom([
|
|
249
|
+
...delegation,
|
|
250
|
+
{
|
|
251
|
+
type: "activity.completed",
|
|
252
|
+
activity: {
|
|
253
|
+
id: "call-1:activity",
|
|
254
|
+
kind: "agent",
|
|
255
|
+
label: "finished",
|
|
256
|
+
status: "completed",
|
|
257
|
+
agentId: "call-1",
|
|
258
|
+
scope: "external",
|
|
259
|
+
source: app,
|
|
260
|
+
summary: [
|
|
261
|
+
{
|
|
262
|
+
type: "text",
|
|
263
|
+
text: "- **search-docs** `release` · done",
|
|
264
|
+
format: "markdown",
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
type: "text",
|
|
268
|
+
text: "The release adds a Subagent step.",
|
|
269
|
+
format: "markdown",
|
|
270
|
+
},
|
|
271
|
+
],
|
|
272
|
+
},
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
type: "agent.updated",
|
|
276
|
+
agent: {
|
|
277
|
+
id: "call-1",
|
|
278
|
+
name: "Brain",
|
|
279
|
+
kind: "delegated-agent",
|
|
280
|
+
status: "completed",
|
|
281
|
+
origin: app,
|
|
282
|
+
metadata: { durationMs: 8_000 },
|
|
283
|
+
},
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
type: "agent.interaction",
|
|
287
|
+
interaction: {
|
|
288
|
+
id: "call-1:completed:3",
|
|
289
|
+
kind: "completed",
|
|
290
|
+
agentId: "call-1",
|
|
291
|
+
scope: "external",
|
|
292
|
+
source: app,
|
|
293
|
+
},
|
|
294
|
+
},
|
|
295
|
+
]),
|
|
296
|
+
);
|
|
297
|
+
const [step] = steps();
|
|
298
|
+
if (!step) throw new Error("No subagent step");
|
|
299
|
+
expect(step.dataset.status).toBe("completed");
|
|
300
|
+
expect(
|
|
301
|
+
header(step)?.querySelector(".agentkit-activity-label")?.textContent,
|
|
302
|
+
).toBe("worked for 8s");
|
|
303
|
+
|
|
304
|
+
await toggle(step);
|
|
305
|
+
const content = step.querySelector(".agentkit-subagent-content");
|
|
306
|
+
// The reply reads as text, not behind a second "finished" disclosure.
|
|
307
|
+
expect(content?.textContent).toContain("The release adds a Subagent step.");
|
|
308
|
+
expect(content?.querySelector('[data-activity-kind="agent"]')).toBeNull();
|
|
309
|
+
expect(content?.textContent).not.toContain("finished");
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
it("marks a failed agent amber with its reason on the row", async () => {
|
|
313
|
+
await render(
|
|
314
|
+
threadFrom([
|
|
315
|
+
...delegation.slice(0, 3),
|
|
316
|
+
{
|
|
317
|
+
type: "agent.updated",
|
|
318
|
+
agent: {
|
|
319
|
+
id: "call-1",
|
|
320
|
+
name: "Brain",
|
|
321
|
+
kind: "delegated-agent",
|
|
322
|
+
status: "failed",
|
|
323
|
+
origin: app,
|
|
324
|
+
},
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
type: "agent.interaction",
|
|
328
|
+
interaction: {
|
|
329
|
+
id: "call-1:failed:2",
|
|
330
|
+
kind: "failed",
|
|
331
|
+
agentId: "call-1",
|
|
332
|
+
detail: "Needs setup first",
|
|
333
|
+
scope: "external",
|
|
334
|
+
source: app,
|
|
335
|
+
},
|
|
336
|
+
},
|
|
337
|
+
]),
|
|
338
|
+
);
|
|
339
|
+
const [step] = steps();
|
|
340
|
+
if (!step) throw new Error("No subagent step");
|
|
341
|
+
expect(step.dataset.status).toBe("failed");
|
|
342
|
+
expect(
|
|
343
|
+
header(step)?.querySelector('[data-trace-status="error"]'),
|
|
344
|
+
).not.toBeNull();
|
|
345
|
+
expect(
|
|
346
|
+
header(step)?.querySelector(
|
|
347
|
+
'.agentkit-agent[data-status="failed"] .tabler-icon-alert-triangle',
|
|
348
|
+
),
|
|
349
|
+
).not.toBeNull();
|
|
350
|
+
expect(
|
|
351
|
+
header(step)?.querySelector(".agentkit-activity-label")?.textContent,
|
|
352
|
+
).toBe("needs attention");
|
|
353
|
+
expect(
|
|
354
|
+
step.querySelector(":scope > .agentkit-activity-error")?.textContent,
|
|
355
|
+
).toBe("Needs setup first");
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
it("settles an agent still marked working once its run ends", async () => {
|
|
359
|
+
await render(threadFrom([...delegation, { type: "run.completed" }]));
|
|
360
|
+
const [step] = steps();
|
|
361
|
+
if (!step) throw new Error("No subagent step");
|
|
362
|
+
expect(step.dataset.status).toBe("completed");
|
|
363
|
+
expect(
|
|
364
|
+
header(step)
|
|
365
|
+
?.querySelector(".agentkit-agent")
|
|
366
|
+
?.getAttribute("data-status"),
|
|
367
|
+
).toBe("completed");
|
|
368
|
+
expect(header(step)?.textContent).not.toContain("Running");
|
|
369
|
+
});
|
|
370
|
+
|
|
371
|
+
it("names a failed or stopped call in words", async () => {
|
|
372
|
+
await render(
|
|
373
|
+
threadFrom([
|
|
374
|
+
...delegation.slice(0, 3),
|
|
375
|
+
{
|
|
376
|
+
type: "tool.started",
|
|
377
|
+
toolCall: {
|
|
378
|
+
id: "call-1-read",
|
|
379
|
+
name: "read-file",
|
|
380
|
+
status: "running",
|
|
381
|
+
agentId: "call-1",
|
|
382
|
+
},
|
|
383
|
+
},
|
|
384
|
+
{
|
|
385
|
+
type: "tool.updated",
|
|
386
|
+
toolCall: {
|
|
387
|
+
id: "call-1-read",
|
|
388
|
+
name: "read-file",
|
|
389
|
+
status: "failed",
|
|
390
|
+
agentId: "call-1",
|
|
391
|
+
error: { code: "denied", message: "Permission denied" },
|
|
392
|
+
},
|
|
393
|
+
},
|
|
394
|
+
{
|
|
395
|
+
type: "tool.started",
|
|
396
|
+
toolCall: {
|
|
397
|
+
id: "call-1-write",
|
|
398
|
+
name: "write-file",
|
|
399
|
+
status: "cancelled",
|
|
400
|
+
agentId: "call-1",
|
|
401
|
+
},
|
|
402
|
+
},
|
|
403
|
+
]),
|
|
404
|
+
);
|
|
405
|
+
const [step] = steps();
|
|
406
|
+
if (!step) throw new Error("No subagent step");
|
|
407
|
+
await toggle(step);
|
|
408
|
+
const words = (status: string) =>
|
|
409
|
+
step.querySelector(
|
|
410
|
+
`.agentkit-activity-item[data-status="${status}"] .agentkit-visually-hidden`,
|
|
411
|
+
)?.textContent;
|
|
412
|
+
expect(words("failed")).toBe("Failed");
|
|
413
|
+
expect(words("cancelled")).toBe("Stopped");
|
|
414
|
+
// A failed call keeps its row; its error is that row's error line.
|
|
415
|
+
expect(
|
|
416
|
+
step.querySelector('.agentkit-activity-item[data-status="failed"]')
|
|
417
|
+
?.textContent,
|
|
418
|
+
).toContain("Read file");
|
|
419
|
+
});
|
|
420
|
+
|
|
421
|
+
it("keeps an agent's other tasks in the task list", async () => {
|
|
422
|
+
await render(
|
|
423
|
+
threadFrom([
|
|
424
|
+
...delegation,
|
|
425
|
+
{
|
|
426
|
+
type: "task.created",
|
|
427
|
+
task: {
|
|
428
|
+
id: "task-2",
|
|
429
|
+
title: "Draft the changelog",
|
|
430
|
+
status: "pending",
|
|
431
|
+
assignedAgentId: "call-1",
|
|
432
|
+
},
|
|
433
|
+
},
|
|
434
|
+
]),
|
|
435
|
+
);
|
|
436
|
+
|
|
437
|
+
// The step shows the active task; the agent's other task stays listed.
|
|
438
|
+
expect(
|
|
439
|
+
header(steps()[0] as HTMLElement)?.querySelector(
|
|
440
|
+
".agentkit-activity-detail",
|
|
441
|
+
)?.textContent,
|
|
442
|
+
).toBe("Summarize the release notes");
|
|
443
|
+
expect(container.querySelector(".agentkit-tasks-count")?.textContent).toBe(
|
|
444
|
+
"0 of 1 done",
|
|
445
|
+
);
|
|
446
|
+
await act(async () =>
|
|
447
|
+
container.querySelector<HTMLElement>(".agentkit-tasks-summary")?.click(),
|
|
448
|
+
);
|
|
449
|
+
expect(
|
|
450
|
+
Array.from(
|
|
451
|
+
container.querySelectorAll(".agentkit-task-title"),
|
|
452
|
+
(title) => title.textContent,
|
|
453
|
+
),
|
|
454
|
+
).toEqual(["Draft the changelog"]);
|
|
455
|
+
});
|
|
456
|
+
|
|
457
|
+
it("gives each delegated agent its own step", async () => {
|
|
458
|
+
await render(
|
|
459
|
+
threadFrom([
|
|
460
|
+
...delegation,
|
|
461
|
+
{
|
|
462
|
+
type: "agent.registered",
|
|
463
|
+
agent: {
|
|
464
|
+
id: "call-2",
|
|
465
|
+
name: "Clips",
|
|
466
|
+
kind: "delegated-agent",
|
|
467
|
+
status: "working",
|
|
468
|
+
},
|
|
469
|
+
},
|
|
470
|
+
{
|
|
471
|
+
type: "activity.started",
|
|
472
|
+
activity: {
|
|
473
|
+
id: "call-2:progress",
|
|
474
|
+
kind: "agent",
|
|
475
|
+
label: "processing",
|
|
476
|
+
detail: "Finding the recording",
|
|
477
|
+
status: "running",
|
|
478
|
+
agentId: "call-2",
|
|
479
|
+
},
|
|
480
|
+
},
|
|
481
|
+
]),
|
|
482
|
+
);
|
|
483
|
+
expect(steps().map((step) => step.dataset.agentId)).toEqual([
|
|
484
|
+
"call-1",
|
|
485
|
+
"call-2",
|
|
486
|
+
]);
|
|
487
|
+
const second = steps()[1];
|
|
488
|
+
if (!second) throw new Error("No second step");
|
|
489
|
+
expect(
|
|
490
|
+
header(second)?.querySelector(".agentkit-activity-detail")?.textContent,
|
|
491
|
+
).toBe("Finding the recording");
|
|
492
|
+
});
|
|
493
|
+
});
|
|
494
|
+
|
|
495
|
+
describe("AgentTaskGroup progress", () => {
|
|
496
|
+
let container: HTMLDivElement;
|
|
497
|
+
let root: Root;
|
|
498
|
+
|
|
499
|
+
beforeEach(() => {
|
|
500
|
+
vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true);
|
|
501
|
+
container = document.createElement("div");
|
|
502
|
+
document.body.appendChild(container);
|
|
503
|
+
root = createRoot(container);
|
|
504
|
+
});
|
|
505
|
+
|
|
506
|
+
afterEach(() => {
|
|
507
|
+
act(() => root.unmount());
|
|
508
|
+
container.remove();
|
|
509
|
+
vi.unstubAllGlobals();
|
|
510
|
+
});
|
|
511
|
+
|
|
512
|
+
it("says how many tasks are done, not only how many there are", async () => {
|
|
513
|
+
const statuses = [
|
|
514
|
+
"completed",
|
|
515
|
+
"completed",
|
|
516
|
+
"running",
|
|
517
|
+
"pending",
|
|
518
|
+
"failed",
|
|
519
|
+
] as const;
|
|
520
|
+
const thread = threadFrom([
|
|
521
|
+
{ type: "run.started" },
|
|
522
|
+
...statuses.map(
|
|
523
|
+
(status, index): EventBody => ({
|
|
524
|
+
type: "task.created",
|
|
525
|
+
task: {
|
|
526
|
+
id: `task-${index}`,
|
|
527
|
+
title: `Task ${index + 1}`,
|
|
528
|
+
status,
|
|
529
|
+
...(index === 2 ? { progress: { completed: 3, total: 4 } } : {}),
|
|
530
|
+
},
|
|
531
|
+
}),
|
|
532
|
+
),
|
|
533
|
+
]);
|
|
534
|
+
await act(async () => {
|
|
535
|
+
root.render(
|
|
536
|
+
<AgentKitProvider
|
|
537
|
+
controller={controllerFor(thread)}
|
|
538
|
+
threadId={threadId}
|
|
539
|
+
>
|
|
540
|
+
<AgentTaskGroup runId={runId} />
|
|
541
|
+
</AgentKitProvider>,
|
|
542
|
+
);
|
|
543
|
+
});
|
|
544
|
+
expect(container.querySelector(".agentkit-tasks-count")?.textContent).toBe(
|
|
545
|
+
"2 of 5 done",
|
|
546
|
+
);
|
|
547
|
+
await act(async () =>
|
|
548
|
+
container.querySelector<HTMLElement>(".agentkit-tasks-summary")?.click(),
|
|
549
|
+
);
|
|
550
|
+
expect(
|
|
551
|
+
container.querySelector(".agentkit-task-progress")?.textContent,
|
|
552
|
+
).toBe("3 of 4 done");
|
|
553
|
+
});
|
|
554
|
+
});
|