@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
|
@@ -616,6 +616,41 @@ describe("AgentKit composer context submission", () => {
|
|
|
616
616
|
},
|
|
617
617
|
);
|
|
618
618
|
|
|
619
|
+
it.each(["immediate", "queued"] as const)(
|
|
620
|
+
"sends a custom agent mention as a run reference on %s submissions",
|
|
621
|
+
async (intent) => {
|
|
622
|
+
const runtime = transport();
|
|
623
|
+
if (intent === "queued") withActiveRun(runtime);
|
|
624
|
+
client = new AgentKitClient({ transport: runtime });
|
|
625
|
+
if (intent === "queued") await client.loadThread("thread-1");
|
|
626
|
+
await act(async () =>
|
|
627
|
+
root.render(
|
|
628
|
+
<AgentKitProvider controller={client} threadId="thread-1">
|
|
629
|
+
<AgentKitComposer autoFocus={false} />
|
|
630
|
+
</AgentKitProvider>,
|
|
631
|
+
),
|
|
632
|
+
);
|
|
633
|
+
const researcher = {
|
|
634
|
+
type: "custom-agent" as const,
|
|
635
|
+
path: "agents/researcher.md",
|
|
636
|
+
name: "Researcher",
|
|
637
|
+
source: "agent:custom",
|
|
638
|
+
refType: "custom-agent",
|
|
639
|
+
refId: "researcher",
|
|
640
|
+
};
|
|
641
|
+
await act(async () => {
|
|
642
|
+
await capture.props!.onSubmit("Find sources", [], [researcher], {
|
|
643
|
+
intent,
|
|
644
|
+
});
|
|
645
|
+
});
|
|
646
|
+
const input =
|
|
647
|
+
intent === "queued"
|
|
648
|
+
? runtime.queueMessage.mock.calls[0][0]
|
|
649
|
+
: runtime.startRun.mock.calls[0][0];
|
|
650
|
+
expect(input.references).toEqual([researcher]);
|
|
651
|
+
},
|
|
652
|
+
);
|
|
653
|
+
|
|
619
654
|
it.each(["immediate", "queued"] as const)(
|
|
620
655
|
"includes mode instructions without context items in %s submissions",
|
|
621
656
|
async (intent) => {
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
import {
|
|
2
|
+
IconAlertTriangle,
|
|
3
|
+
IconChevronDown,
|
|
4
|
+
IconChevronRight,
|
|
5
|
+
} from "@tabler/icons-react";
|
|
6
|
+
import { useId, useState, type CSSProperties, type ReactNode } from "react";
|
|
7
|
+
|
|
8
|
+
import { COMPOSER_POPOVER_SURFACE_CLASS } from "../../../composer/popover-surface.js";
|
|
9
|
+
import {
|
|
10
|
+
fallbackContextTranslate,
|
|
11
|
+
type ContextTranslate,
|
|
12
|
+
} from "../../../context-ui/types.js";
|
|
13
|
+
import { Button } from "../../../ui/button.js";
|
|
14
|
+
import {
|
|
15
|
+
Popover,
|
|
16
|
+
PopoverContent,
|
|
17
|
+
PopoverTrigger,
|
|
18
|
+
} from "../../../ui/popover.js";
|
|
19
|
+
import { Spinner } from "../../../ui/spinner.js";
|
|
20
|
+
import {
|
|
21
|
+
Tooltip,
|
|
22
|
+
TooltipContent,
|
|
23
|
+
TooltipProvider,
|
|
24
|
+
TooltipTrigger,
|
|
25
|
+
} from "../../../ui/tooltip.js";
|
|
26
|
+
|
|
27
|
+
export const CONTEXT_USAGE_WARNING_FRACTION = 0.8;
|
|
28
|
+
|
|
29
|
+
export interface ContextUsageSegmentView {
|
|
30
|
+
kind: string;
|
|
31
|
+
label: string;
|
|
32
|
+
tokens: number;
|
|
33
|
+
color?: string | undefined;
|
|
34
|
+
colorClass?: string | undefined;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export type ContextCompactState =
|
|
38
|
+
| { state: "idle" }
|
|
39
|
+
| { state: "running" }
|
|
40
|
+
| { state: "done"; message: string }
|
|
41
|
+
| { state: "error"; message: string };
|
|
42
|
+
|
|
43
|
+
/** 779.8k, 1M, 1.05M: the window's own unit, never "1000k". */
|
|
44
|
+
export function formatContextWindowTokens(tokens: number): string {
|
|
45
|
+
const value = Math.max(0, Math.round(tokens));
|
|
46
|
+
if (value >= 1_000_000) return `${Number((value / 1_000_000).toFixed(2))}M`;
|
|
47
|
+
if (value >= 1000) return `${Number((value / 1000).toFixed(1))}k`;
|
|
48
|
+
return String(value);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function contextUsagePercent(
|
|
52
|
+
usedTokens: number,
|
|
53
|
+
windowTokens: number,
|
|
54
|
+
): number {
|
|
55
|
+
return Math.round((usedTokens / windowTokens) * 100);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function formatWindowShare(tokens: number, windowTokens: number): string {
|
|
59
|
+
return `${((Math.max(0, tokens) / windowTokens) * 100).toFixed(1)}%`;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const CONTEXT_RING_RADIUS = 7;
|
|
63
|
+
const CONTEXT_RING_CIRCUMFERENCE = 2 * Math.PI * CONTEXT_RING_RADIUS;
|
|
64
|
+
|
|
65
|
+
export function contextRingDashOffset(fraction: number): number {
|
|
66
|
+
const share = Math.min(1, Math.max(0, fraction));
|
|
67
|
+
return CONTEXT_RING_CIRCUMFERENCE * (1 - share);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function segmentStyle(
|
|
71
|
+
segment: Pick<ContextUsageSegmentView, "color">,
|
|
72
|
+
width?: string,
|
|
73
|
+
): CSSProperties | undefined {
|
|
74
|
+
if (!segment.color && !width) return undefined;
|
|
75
|
+
return {
|
|
76
|
+
...(segment.color ? { background: segment.color } : {}),
|
|
77
|
+
...(width ? { width } : {}),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Never pad a small share or round the caps: a short dash on a track reads as a spinner.
|
|
82
|
+
function ContextRing({
|
|
83
|
+
fraction,
|
|
84
|
+
warning,
|
|
85
|
+
}: {
|
|
86
|
+
fraction: number;
|
|
87
|
+
warning: boolean;
|
|
88
|
+
}) {
|
|
89
|
+
return (
|
|
90
|
+
<svg
|
|
91
|
+
aria-hidden="true"
|
|
92
|
+
viewBox="0 0 20 20"
|
|
93
|
+
className="agentkit-context-ring"
|
|
94
|
+
data-context-ring=""
|
|
95
|
+
>
|
|
96
|
+
<circle
|
|
97
|
+
cx="10"
|
|
98
|
+
cy="10"
|
|
99
|
+
r={CONTEXT_RING_RADIUS}
|
|
100
|
+
fill="none"
|
|
101
|
+
strokeWidth="3"
|
|
102
|
+
className="agentkit-context-ring-track"
|
|
103
|
+
data-context-ring-track=""
|
|
104
|
+
/>
|
|
105
|
+
<circle
|
|
106
|
+
cx="10"
|
|
107
|
+
cy="10"
|
|
108
|
+
r={CONTEXT_RING_RADIUS}
|
|
109
|
+
fill="none"
|
|
110
|
+
strokeWidth="3"
|
|
111
|
+
strokeLinecap="butt"
|
|
112
|
+
strokeDasharray={CONTEXT_RING_CIRCUMFERENCE}
|
|
113
|
+
strokeDashoffset={contextRingDashOffset(fraction)}
|
|
114
|
+
className="agentkit-context-ring-fill"
|
|
115
|
+
data-warning={warning ? "true" : undefined}
|
|
116
|
+
data-context-ring-fill=""
|
|
117
|
+
/>
|
|
118
|
+
</svg>
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** Opens `children`, usually `ContextUsagePanel`, in a popover. */
|
|
123
|
+
export function ContextUsageRing({
|
|
124
|
+
usedTokens,
|
|
125
|
+
windowTokens,
|
|
126
|
+
open,
|
|
127
|
+
onOpenChange,
|
|
128
|
+
children,
|
|
129
|
+
translate = fallbackContextTranslate,
|
|
130
|
+
}: {
|
|
131
|
+
usedTokens: number;
|
|
132
|
+
windowTokens: number;
|
|
133
|
+
open: boolean;
|
|
134
|
+
onOpenChange: (open: boolean) => void;
|
|
135
|
+
children: ReactNode;
|
|
136
|
+
translate?: ContextTranslate;
|
|
137
|
+
}) {
|
|
138
|
+
const fraction = usedTokens / windowTokens;
|
|
139
|
+
const warning = fraction >= CONTEXT_USAGE_WARNING_FRACTION;
|
|
140
|
+
const label = translate("agentChat.contextRing.usedLabel", {
|
|
141
|
+
defaultValue: "Context {{percent}}% used",
|
|
142
|
+
percent: contextUsagePercent(usedTokens, windowTokens),
|
|
143
|
+
});
|
|
144
|
+
return (
|
|
145
|
+
<TooltipProvider delayDuration={200}>
|
|
146
|
+
<Popover open={open} onOpenChange={onOpenChange}>
|
|
147
|
+
<Tooltip>
|
|
148
|
+
<TooltipTrigger asChild>
|
|
149
|
+
<PopoverTrigger asChild>
|
|
150
|
+
<button
|
|
151
|
+
type="button"
|
|
152
|
+
aria-label={label}
|
|
153
|
+
data-agent-composer-slot="context-ring"
|
|
154
|
+
data-warning={warning ? "true" : undefined}
|
|
155
|
+
data-state={open ? "open" : "closed"}
|
|
156
|
+
className="agentkit-context-ring-trigger"
|
|
157
|
+
>
|
|
158
|
+
<ContextRing fraction={fraction} warning={warning} />
|
|
159
|
+
</button>
|
|
160
|
+
</PopoverTrigger>
|
|
161
|
+
</TooltipTrigger>
|
|
162
|
+
<TooltipContent>{label}</TooltipContent>
|
|
163
|
+
</Tooltip>
|
|
164
|
+
<PopoverContent
|
|
165
|
+
side="top"
|
|
166
|
+
align="end"
|
|
167
|
+
sideOffset={6}
|
|
168
|
+
collisionPadding={8}
|
|
169
|
+
data-agent-native-composer-popover="true"
|
|
170
|
+
// Portaled outside the chat, so it needs `agentkit-tokens` itself.
|
|
171
|
+
className={`agentkit-tokens w-[min(calc(100vw-2rem),22rem)] ${COMPOSER_POPOVER_SURFACE_CLASS}`}
|
|
172
|
+
>
|
|
173
|
+
{children}
|
|
174
|
+
</PopoverContent>
|
|
175
|
+
</Popover>
|
|
176
|
+
</TooltipProvider>
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export function ContextUsagePanel({
|
|
181
|
+
usedTokens,
|
|
182
|
+
windowTokens,
|
|
183
|
+
segments,
|
|
184
|
+
tokensUntilAutoCompact,
|
|
185
|
+
compact,
|
|
186
|
+
onCompact,
|
|
187
|
+
translate = fallbackContextTranslate,
|
|
188
|
+
}: {
|
|
189
|
+
usedTokens: number;
|
|
190
|
+
windowTokens: number;
|
|
191
|
+
segments: readonly ContextUsageSegmentView[];
|
|
192
|
+
/** Omitted when no automatic threshold applies or it could not be read. */
|
|
193
|
+
tokensUntilAutoCompact?: number | undefined;
|
|
194
|
+
compact: ContextCompactState;
|
|
195
|
+
onCompact?: (() => void) | undefined;
|
|
196
|
+
translate?: ContextTranslate;
|
|
197
|
+
}) {
|
|
198
|
+
const [expanded, setExpanded] = useState(false);
|
|
199
|
+
const breakdownId = useId();
|
|
200
|
+
const percent = contextUsagePercent(usedTokens, windowTokens);
|
|
201
|
+
const warning = usedTokens / windowTokens >= CONTEXT_USAGE_WARNING_FRACTION;
|
|
202
|
+
const barTotal = Math.max(usedTokens, windowTokens);
|
|
203
|
+
const breakdownLabel = translate("agentChat.contextRing.breakdown", {
|
|
204
|
+
defaultValue: "Breakdown",
|
|
205
|
+
});
|
|
206
|
+
const rows: ContextUsageSegmentView[] = [
|
|
207
|
+
...segments,
|
|
208
|
+
{
|
|
209
|
+
kind: "free-space",
|
|
210
|
+
label: translate("agentChat.contextRing.freeSpace", {
|
|
211
|
+
defaultValue: "Free space",
|
|
212
|
+
}),
|
|
213
|
+
tokens: Math.max(0, windowTokens - usedTokens),
|
|
214
|
+
},
|
|
215
|
+
];
|
|
216
|
+
return (
|
|
217
|
+
<div className="agentkit-context-usage" data-context-usage-panel="">
|
|
218
|
+
<div className="agentkit-context-usage-header">
|
|
219
|
+
<span className="agentkit-context-usage-title">
|
|
220
|
+
{translate("agentChat.contextRing.title", {
|
|
221
|
+
defaultValue: "Context window",
|
|
222
|
+
})}
|
|
223
|
+
</span>
|
|
224
|
+
<span className="agentkit-context-usage-total">
|
|
225
|
+
{translate("agentChat.contextRing.usage", {
|
|
226
|
+
defaultValue: "{{used}} / {{window}} ({{percent}}%)",
|
|
227
|
+
used: formatContextWindowTokens(usedTokens),
|
|
228
|
+
window: formatContextWindowTokens(windowTokens),
|
|
229
|
+
percent,
|
|
230
|
+
})}
|
|
231
|
+
</span>
|
|
232
|
+
<Button
|
|
233
|
+
type="button"
|
|
234
|
+
variant="ghost"
|
|
235
|
+
size="icon-xs"
|
|
236
|
+
className="agentkit-context-usage-toggle rounded-[var(--agent-kit-radius-xs,0.25rem)]"
|
|
237
|
+
aria-label={breakdownLabel}
|
|
238
|
+
aria-expanded={expanded}
|
|
239
|
+
aria-controls={breakdownId}
|
|
240
|
+
onClick={() => setExpanded((current) => !current)}
|
|
241
|
+
>
|
|
242
|
+
{expanded ? (
|
|
243
|
+
<IconChevronDown aria-hidden="true" className="agentkit-icon" />
|
|
244
|
+
) : (
|
|
245
|
+
<IconChevronRight aria-hidden="true" className="agentkit-icon" />
|
|
246
|
+
)}
|
|
247
|
+
</Button>
|
|
248
|
+
</div>
|
|
249
|
+
<div
|
|
250
|
+
role="img"
|
|
251
|
+
aria-label={segments
|
|
252
|
+
.map(
|
|
253
|
+
(segment) =>
|
|
254
|
+
`${segment.label} ${formatContextWindowTokens(segment.tokens)}`,
|
|
255
|
+
)
|
|
256
|
+
.join(", ")}
|
|
257
|
+
className="agentkit-context-usage-bar"
|
|
258
|
+
data-context-usage-bar=""
|
|
259
|
+
>
|
|
260
|
+
{segments.map((segment) => (
|
|
261
|
+
<span
|
|
262
|
+
key={segment.kind}
|
|
263
|
+
data-context-usage-segment={segment.kind}
|
|
264
|
+
className={segment.colorClass}
|
|
265
|
+
style={segmentStyle(
|
|
266
|
+
segment,
|
|
267
|
+
`${(segment.tokens / barTotal) * 100}%`,
|
|
268
|
+
)}
|
|
269
|
+
/>
|
|
270
|
+
))}
|
|
271
|
+
</div>
|
|
272
|
+
<div
|
|
273
|
+
id={breakdownId}
|
|
274
|
+
hidden={!expanded}
|
|
275
|
+
className="agentkit-context-usage-breakdown"
|
|
276
|
+
data-context-usage-breakdown=""
|
|
277
|
+
>
|
|
278
|
+
<table>
|
|
279
|
+
<tbody>
|
|
280
|
+
{rows.map((row) => (
|
|
281
|
+
<tr key={row.kind} data-context-usage-row={row.kind}>
|
|
282
|
+
<td>
|
|
283
|
+
<span
|
|
284
|
+
aria-hidden="true"
|
|
285
|
+
data-context-usage-swatch=""
|
|
286
|
+
className={
|
|
287
|
+
row.colorClass
|
|
288
|
+
? `agentkit-context-usage-swatch ${row.colorClass}`
|
|
289
|
+
: "agentkit-context-usage-swatch"
|
|
290
|
+
}
|
|
291
|
+
style={segmentStyle(row)}
|
|
292
|
+
/>
|
|
293
|
+
</td>
|
|
294
|
+
<td>{row.label}</td>
|
|
295
|
+
<td>{formatContextWindowTokens(row.tokens)}</td>
|
|
296
|
+
<td>{formatWindowShare(row.tokens, windowTokens)}</td>
|
|
297
|
+
</tr>
|
|
298
|
+
))}
|
|
299
|
+
</tbody>
|
|
300
|
+
</table>
|
|
301
|
+
</div>
|
|
302
|
+
{tokensUntilAutoCompact !== undefined ? (
|
|
303
|
+
<p
|
|
304
|
+
className="agentkit-context-usage-caption"
|
|
305
|
+
data-warning={warning ? "true" : undefined}
|
|
306
|
+
>
|
|
307
|
+
{warning ? (
|
|
308
|
+
<IconAlertTriangle aria-hidden="true" className="agentkit-icon" />
|
|
309
|
+
) : null}
|
|
310
|
+
{translate("agentChat.contextRing.untilAutoCompact", {
|
|
311
|
+
defaultValue: "{{tokens}} until auto-compact",
|
|
312
|
+
tokens: formatContextWindowTokens(tokensUntilAutoCompact),
|
|
313
|
+
})}
|
|
314
|
+
</p>
|
|
315
|
+
) : null}
|
|
316
|
+
{compact.state === "done" ? (
|
|
317
|
+
<p role="status" className="agentkit-context-usage-caption">
|
|
318
|
+
{compact.message}
|
|
319
|
+
</p>
|
|
320
|
+
) : null}
|
|
321
|
+
{compact.state === "error" ? (
|
|
322
|
+
<p
|
|
323
|
+
role="alert"
|
|
324
|
+
className="agentkit-context-usage-caption"
|
|
325
|
+
data-warning="true"
|
|
326
|
+
>
|
|
327
|
+
<IconAlertTriangle aria-hidden="true" className="agentkit-icon" />
|
|
328
|
+
<span>{compact.message}</span>
|
|
329
|
+
</p>
|
|
330
|
+
) : null}
|
|
331
|
+
{onCompact ? (
|
|
332
|
+
<div className="agentkit-context-usage-actions">
|
|
333
|
+
<Button
|
|
334
|
+
type="button"
|
|
335
|
+
variant="outline"
|
|
336
|
+
size="xs"
|
|
337
|
+
className="rounded-[var(--agent-kit-radius-xs,0.25rem)]"
|
|
338
|
+
disabled={compact.state === "running"}
|
|
339
|
+
aria-busy={compact.state === "running" || undefined}
|
|
340
|
+
onClick={onCompact}
|
|
341
|
+
>
|
|
342
|
+
{compact.state === "running" ? (
|
|
343
|
+
<Spinner className="size-3" />
|
|
344
|
+
) : null}
|
|
345
|
+
{translate("agentChat.contextRing.compactNow", {
|
|
346
|
+
defaultValue: "Compact now",
|
|
347
|
+
})}
|
|
348
|
+
</Button>
|
|
349
|
+
</div>
|
|
350
|
+
) : null}
|
|
351
|
+
</div>
|
|
352
|
+
);
|
|
353
|
+
}
|
|
@@ -47,6 +47,7 @@ import {
|
|
|
47
47
|
} from "react";
|
|
48
48
|
|
|
49
49
|
import type { AgentChatDataChartLayout } from "./data-chart-layout.js";
|
|
50
|
+
import { formatAgentKitDuration } from "./duration.js";
|
|
50
51
|
import type { AgentMessageContentOrderResolver } from "./message-content-order.js";
|
|
51
52
|
import {
|
|
52
53
|
AGENTKIT_CLIENT_REQUEST_ID_METADATA_KEY,
|
|
@@ -263,6 +264,23 @@ export interface AgentKitLabels {
|
|
|
263
264
|
workStepReadPagesOther: string;
|
|
264
265
|
workStepFetchedOne: string;
|
|
265
266
|
workStepFetchedOther: string;
|
|
267
|
+
/** A message's citations: "Used 1 source", "Used {{count}} sources". */
|
|
268
|
+
workStepSourcesOne: string;
|
|
269
|
+
workStepSourcesOther: string;
|
|
270
|
+
/** A folded run of two or more framework frames in a stack trace. */
|
|
271
|
+
workStepFrameworkFrames: string;
|
|
272
|
+
workStepCopyStackTrace: string;
|
|
273
|
+
/** Takes {{code}}; shown only for a nonzero exit. */
|
|
274
|
+
workStepTerminalExitCode: string;
|
|
275
|
+
workStepTerminalTimedOut: string;
|
|
276
|
+
workStepTerminalEarlierLines: string;
|
|
277
|
+
workStepCopyOutput: string;
|
|
278
|
+
/** A file change cut short in what was kept. */
|
|
279
|
+
workStepFilePartial: string;
|
|
280
|
+
workStepFileMoreLines: string;
|
|
281
|
+
/** Screen-reader prefix for an added or removed diff line. */
|
|
282
|
+
workStepLineAdded: string;
|
|
283
|
+
workStepLineRemoved: string;
|
|
266
284
|
workStepReadFilesOne: string;
|
|
267
285
|
workStepReadFilesOther: string;
|
|
268
286
|
workStepEditedOne: string;
|
|
@@ -286,6 +304,19 @@ export interface AgentKitLabels {
|
|
|
286
304
|
durationSecondShort: string;
|
|
287
305
|
agents: string;
|
|
288
306
|
tasks: string;
|
|
307
|
+
tasksProgress: string;
|
|
308
|
+
question: string;
|
|
309
|
+
questionProgress: string;
|
|
310
|
+
questionProgressLabel: string;
|
|
311
|
+
questionOwnResponse: string;
|
|
312
|
+
questionAnswer: string;
|
|
313
|
+
questionSkip: string;
|
|
314
|
+
questionNext: string;
|
|
315
|
+
questionSend: string;
|
|
316
|
+
questionRecommended: string;
|
|
317
|
+
questionDismiss: string;
|
|
318
|
+
questionChooseFiles: string;
|
|
319
|
+
questionRemoveFile: string;
|
|
289
320
|
toolInput?: string;
|
|
290
321
|
toolResult?: string;
|
|
291
322
|
activityValueIdentifierHidden?: string;
|
|
@@ -383,6 +414,8 @@ export interface AgentKitLabels {
|
|
|
383
414
|
dropFilesToAttach: string;
|
|
384
415
|
dropFileFailed: string;
|
|
385
416
|
scrollToBottom: string;
|
|
417
|
+
/** Skip link past the transcript; visible only when focused. */
|
|
418
|
+
skipToComposer: string;
|
|
386
419
|
formatTimestamp?: (createdAt: string) => string;
|
|
387
420
|
error: string;
|
|
388
421
|
renderError: string;
|
|
@@ -399,6 +432,8 @@ export interface AgentKitLabels {
|
|
|
399
432
|
agentResumed: string;
|
|
400
433
|
agentMessaged: string;
|
|
401
434
|
agentDelegated: string;
|
|
435
|
+
agentWorking: string;
|
|
436
|
+
agentWorkedFor: string;
|
|
402
437
|
agentPaused: string;
|
|
403
438
|
agentCompleted: string;
|
|
404
439
|
agentFailed: string;
|
|
@@ -474,6 +509,18 @@ export const defaultAgentKitLabels: ResolvedAgentKitLabels = {
|
|
|
474
509
|
workStepReadPagesOther: "Read {{count}} pages",
|
|
475
510
|
workStepFetchedOne: "Fetched 1 URL",
|
|
476
511
|
workStepFetchedOther: "Fetched {{count}} URLs",
|
|
512
|
+
workStepSourcesOne: "Used 1 source",
|
|
513
|
+
workStepSourcesOther: "Used {{count}} sources",
|
|
514
|
+
workStepFrameworkFrames: "{{count}} framework frames",
|
|
515
|
+
workStepCopyStackTrace: "Copy stack trace",
|
|
516
|
+
workStepTerminalExitCode: "Exit code {{code}}",
|
|
517
|
+
workStepTerminalTimedOut: "Timed out",
|
|
518
|
+
workStepTerminalEarlierLines: "Show {{count}} earlier lines",
|
|
519
|
+
workStepCopyOutput: "Copy output",
|
|
520
|
+
workStepFilePartial: "Partial",
|
|
521
|
+
workStepFileMoreLines: "Show {{count}} more lines",
|
|
522
|
+
workStepLineAdded: "Added",
|
|
523
|
+
workStepLineRemoved: "Removed",
|
|
477
524
|
workStepReadFilesOne: "Read 1 file",
|
|
478
525
|
workStepReadFilesOther: "Read {{count}} files",
|
|
479
526
|
workStepEditedOne: "Edited 1 file",
|
|
@@ -496,6 +543,19 @@ export const defaultAgentKitLabels: ResolvedAgentKitLabels = {
|
|
|
496
543
|
durationSecondShort: "s",
|
|
497
544
|
agents: "Agent collaboration",
|
|
498
545
|
tasks: "Agent tasks",
|
|
546
|
+
tasksProgress: "{{completed}} of {{total}} done",
|
|
547
|
+
question: "Question",
|
|
548
|
+
questionProgress: "{{current}}/{{total}}",
|
|
549
|
+
questionProgressLabel: "{{current}} of {{total}}",
|
|
550
|
+
questionOwnResponse: "Or write your own response",
|
|
551
|
+
questionAnswer: "Write your answer",
|
|
552
|
+
questionSkip: "Skip",
|
|
553
|
+
questionNext: "Next",
|
|
554
|
+
questionSend: "Send",
|
|
555
|
+
questionRecommended: "Recommended",
|
|
556
|
+
questionDismiss: "Dismiss questions",
|
|
557
|
+
questionChooseFiles: "Choose files…",
|
|
558
|
+
questionRemoveFile: "Remove {{name}}",
|
|
499
559
|
toolInput: "Input",
|
|
500
560
|
toolResult: "Result",
|
|
501
561
|
activityValueIdentifierHidden: "[Identifier hidden]",
|
|
@@ -590,6 +650,7 @@ export const defaultAgentKitLabels: ResolvedAgentKitLabels = {
|
|
|
590
650
|
dropFilesToAttach: "Drop files to attach",
|
|
591
651
|
dropFileFailed: "Could not add the dropped file. Try a different format.",
|
|
592
652
|
scrollToBottom: "Scroll to bottom",
|
|
653
|
+
skipToComposer: "Skip to message box",
|
|
593
654
|
error: "Something went wrong",
|
|
594
655
|
renderError: "This content couldn’t be displayed.",
|
|
595
656
|
runFailed: "Run failed",
|
|
@@ -605,6 +666,8 @@ export const defaultAgentKitLabels: ResolvedAgentKitLabels = {
|
|
|
605
666
|
agentResumed: "resumed working",
|
|
606
667
|
agentMessaged: "sent a message",
|
|
607
668
|
agentDelegated: "delegated work",
|
|
669
|
+
agentWorking: "working",
|
|
670
|
+
agentWorkedFor: "worked for {{duration}}",
|
|
608
671
|
agentPaused: "paused",
|
|
609
672
|
agentCompleted: "finished",
|
|
610
673
|
agentFailed: "needs attention",
|
|
@@ -710,6 +773,10 @@ export interface AgentKitProviderProps {
|
|
|
710
773
|
workedForRowLayout?: AgentChatWorkedForRowLayout;
|
|
711
774
|
dataChartLayout?: AgentChatDataChartLayout;
|
|
712
775
|
formatWorkedForDuration?: (durationMs: number) => string;
|
|
776
|
+
/** Detail beside an interaction row's label; undefined keeps its own. */
|
|
777
|
+
formatAgentInteractionDetail?: (
|
|
778
|
+
interaction: AgentInteraction,
|
|
779
|
+
) => string | undefined;
|
|
713
780
|
/** Display name for a model id in run details; the id shows without it. */
|
|
714
781
|
formatModelName?: (model: string) => string;
|
|
715
782
|
onClientEffect?: (effect: {
|
|
@@ -738,7 +805,7 @@ export interface AgentKitThreadLoadState {
|
|
|
738
805
|
retry?: () => void;
|
|
739
806
|
}
|
|
740
807
|
|
|
741
|
-
interface ResolvedAgentKitLabels extends AgentKitLabels {
|
|
808
|
+
export interface ResolvedAgentKitLabels extends AgentKitLabels {
|
|
742
809
|
toolInput: string;
|
|
743
810
|
toolResult: string;
|
|
744
811
|
queueSendNow: string;
|
|
@@ -768,6 +835,9 @@ export interface AgentKitContextValue {
|
|
|
768
835
|
workedForRowLayout?: AgentChatWorkedForRowLayout;
|
|
769
836
|
dataChartLayout?: AgentChatDataChartLayout;
|
|
770
837
|
formatWorkedForDuration?: (durationMs: number) => string;
|
|
838
|
+
formatAgentInteractionDetail?: (
|
|
839
|
+
interaction: AgentInteraction,
|
|
840
|
+
) => string | undefined;
|
|
771
841
|
formatModelName?: (model: string) => string;
|
|
772
842
|
registerComposerFocus: (threadId: ThreadId, focus: () => void) => () => void;
|
|
773
843
|
requestComposerFocus: (threadId: ThreadId) => void;
|
|
@@ -856,6 +926,7 @@ export function AgentKitProvider({
|
|
|
856
926
|
workedForRowLayout: workedForRowLayoutInput,
|
|
857
927
|
dataChartLayout: dataChartLayoutInput,
|
|
858
928
|
formatWorkedForDuration,
|
|
929
|
+
formatAgentInteractionDetail,
|
|
859
930
|
formatModelName: formatModelNameInput,
|
|
860
931
|
onClientEffect: onClientEffectInput,
|
|
861
932
|
threadLoad,
|
|
@@ -971,6 +1042,7 @@ export function AgentKitProvider({
|
|
|
971
1042
|
workedForRowLayout,
|
|
972
1043
|
dataChartLayout,
|
|
973
1044
|
formatWorkedForDuration,
|
|
1045
|
+
formatAgentInteractionDetail,
|
|
974
1046
|
formatModelName,
|
|
975
1047
|
registerComposerFocus,
|
|
976
1048
|
requestComposerFocus,
|
|
@@ -994,6 +1066,7 @@ export function AgentKitProvider({
|
|
|
994
1066
|
workedForRowLayout,
|
|
995
1067
|
dataChartLayout,
|
|
996
1068
|
formatWorkedForDuration,
|
|
1069
|
+
formatAgentInteractionDetail,
|
|
997
1070
|
formatModelName,
|
|
998
1071
|
registerComposerFocus,
|
|
999
1072
|
requestComposerFocus,
|
|
@@ -1135,6 +1208,25 @@ function useAgentKitControllerSnapshot(
|
|
|
1135
1208
|
);
|
|
1136
1209
|
}
|
|
1137
1210
|
|
|
1211
|
+
/** Falls back to English defaults so parts also work outside a provider. */
|
|
1212
|
+
export function useAgentKitLabels(): ResolvedAgentKitLabels {
|
|
1213
|
+
return useContext(AgentKitContext)?.labels ?? defaultAgentKitLabels;
|
|
1214
|
+
}
|
|
1215
|
+
|
|
1216
|
+
export function useAgentKitDurationFormat(): (durationMs: number) => string {
|
|
1217
|
+
const value = useContext(AgentKitContext);
|
|
1218
|
+
const labels = value?.labels ?? defaultAgentKitLabels;
|
|
1219
|
+
return (
|
|
1220
|
+
value?.formatWorkedForDuration ??
|
|
1221
|
+
((durationMs) =>
|
|
1222
|
+
formatAgentKitDuration(durationMs, {
|
|
1223
|
+
hour: labels.durationHourShort,
|
|
1224
|
+
minute: labels.durationMinuteShort,
|
|
1225
|
+
second: labels.durationSecondShort,
|
|
1226
|
+
}))
|
|
1227
|
+
);
|
|
1228
|
+
}
|
|
1229
|
+
|
|
1138
1230
|
export function useAgentKit(): AgentKitContextValue {
|
|
1139
1231
|
const value = useContext(AgentKitContext);
|
|
1140
1232
|
if (!value) throw new Error("AgentKit hooks require an AgentKitProvider.");
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createContext,
|
|
3
|
+
useContext,
|
|
4
|
+
useEffect,
|
|
5
|
+
useRef,
|
|
6
|
+
useState,
|
|
7
|
+
type RefObject,
|
|
8
|
+
} from "react";
|
|
9
|
+
|
|
10
|
+
import { scheduleIdleMount } from "./idle-mount.js";
|
|
11
|
+
|
|
12
|
+
/** True while a long thread opens, so closed rows can mount later. */
|
|
13
|
+
export const AgentKitDeferClosedContentContext = createContext(false);
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Keeps closed content mounted for find-in-page; in a long thread it mounts
|
|
17
|
+
* at idle, so the history paints first.
|
|
18
|
+
*/
|
|
19
|
+
export function useUntilFoundContent(
|
|
20
|
+
open: boolean,
|
|
21
|
+
onReveal: (() => void) | undefined,
|
|
22
|
+
): { ref: RefObject<HTMLDivElement | null>; mounted: boolean } {
|
|
23
|
+
const ref = useRef<HTMLDivElement>(null);
|
|
24
|
+
const revealRef = useRef(onReveal);
|
|
25
|
+
revealRef.current = onReveal;
|
|
26
|
+
const deferClosed = useContext(AgentKitDeferClosedContentContext);
|
|
27
|
+
const [contentMounted, setContentMounted] = useState(open || !deferClosed);
|
|
28
|
+
if (open && !contentMounted) setContentMounted(true);
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
if (contentMounted) return;
|
|
31
|
+
return scheduleIdleMount(() => setContentMounted(true));
|
|
32
|
+
}, [contentMounted]);
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
const element = ref.current;
|
|
35
|
+
if (!element || open) return;
|
|
36
|
+
element.setAttribute("hidden", "until-found");
|
|
37
|
+
const reveal = () => revealRef.current?.();
|
|
38
|
+
element.addEventListener("beforematch", reveal);
|
|
39
|
+
return () => element.removeEventListener("beforematch", reveal);
|
|
40
|
+
}, [open]);
|
|
41
|
+
return { ref, mounted: contentMounted || open };
|
|
42
|
+
}
|