@wzrhine/agent 0.0.0-stage → 0.2.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/CHANGELOG.md +40 -0
- package/LICENSE +21 -0
- package/README.md +29 -3
- package/dist/agent.css +16 -0
- package/dist/components/artifact/ArtifactCard.d.ts +59 -0
- package/dist/components/artifact/ArtifactCard.d.ts.map +1 -0
- package/dist/components/artifact/ArtifactCard.js +79 -0
- package/dist/components/artifact/ArtifactCard.js.map +1 -0
- package/dist/components/artifact/FilePreview.d.ts +121 -0
- package/dist/components/artifact/FilePreview.d.ts.map +1 -0
- package/dist/components/artifact/FilePreview.js +213 -0
- package/dist/components/artifact/FilePreview.js.map +1 -0
- package/dist/components/artifact/FilePreviewTabs.d.ts +51 -0
- package/dist/components/artifact/FilePreviewTabs.d.ts.map +1 -0
- package/dist/components/artifact/FilePreviewTabs.js +150 -0
- package/dist/components/artifact/FilePreviewTabs.js.map +1 -0
- package/dist/components/composer/AttachmentList.d.ts +33 -0
- package/dist/components/composer/AttachmentList.d.ts.map +1 -0
- package/dist/components/composer/AttachmentList.js +60 -0
- package/dist/components/composer/AttachmentList.js.map +1 -0
- package/dist/components/composer/Composer.d.ts +119 -0
- package/dist/components/composer/Composer.d.ts.map +1 -0
- package/dist/components/composer/Composer.js +336 -0
- package/dist/components/composer/Composer.js.map +1 -0
- package/dist/components/composer/ComposerInput.d.ts +103 -0
- package/dist/components/composer/ComposerInput.d.ts.map +1 -0
- package/dist/components/composer/ComposerInput.js +301 -0
- package/dist/components/composer/ComposerInput.js.map +1 -0
- package/dist/components/composer/ComposerNotice.d.ts +38 -0
- package/dist/components/composer/ComposerNotice.d.ts.map +1 -0
- package/dist/components/composer/ComposerNotice.js +16 -0
- package/dist/components/composer/ComposerNotice.js.map +1 -0
- package/dist/components/composer/MentionMenu.d.ts +37 -0
- package/dist/components/composer/MentionMenu.d.ts.map +1 -0
- package/dist/components/composer/MentionMenu.js +56 -0
- package/dist/components/composer/MentionMenu.js.map +1 -0
- package/dist/components/composer/MenuPanel.d.ts +49 -0
- package/dist/components/composer/MenuPanel.d.ts.map +1 -0
- package/dist/components/composer/MenuPanel.js +50 -0
- package/dist/components/composer/MenuPanel.js.map +1 -0
- package/dist/components/composer/ModelPicker.d.ts +53 -0
- package/dist/components/composer/ModelPicker.d.ts.map +1 -0
- package/dist/components/composer/ModelPicker.js +126 -0
- package/dist/components/composer/ModelPicker.js.map +1 -0
- package/dist/components/composer/PermissionPicker.d.ts +35 -0
- package/dist/components/composer/PermissionPicker.d.ts.map +1 -0
- package/dist/components/composer/PermissionPicker.js +51 -0
- package/dist/components/composer/PermissionPicker.js.map +1 -0
- package/dist/components/composer/ReferencePicker.d.ts +31 -0
- package/dist/components/composer/ReferencePicker.d.ts.map +1 -0
- package/dist/components/composer/ReferencePicker.js +50 -0
- package/dist/components/composer/ReferencePicker.js.map +1 -0
- package/dist/components/composer/SendStopButton.d.ts +73 -0
- package/dist/components/composer/SendStopButton.d.ts.map +1 -0
- package/dist/components/composer/SendStopButton.js +88 -0
- package/dist/components/composer/SendStopButton.js.map +1 -0
- package/dist/components/composer/SkillPicker.d.ts +26 -0
- package/dist/components/composer/SkillPicker.d.ts.map +1 -0
- package/dist/components/composer/SkillPicker.js +26 -0
- package/dist/components/composer/SkillPicker.js.map +1 -0
- package/dist/components/composer/SlashCommandMenu.d.ts +33 -0
- package/dist/components/composer/SlashCommandMenu.d.ts.map +1 -0
- package/dist/components/composer/SlashCommandMenu.js +43 -0
- package/dist/components/composer/SlashCommandMenu.js.map +1 -0
- package/dist/components/composer/composer-text.d.ts +10 -0
- package/dist/components/composer/composer-text.d.ts.map +1 -0
- package/dist/components/composer/composer-text.js +26 -0
- package/dist/components/composer/composer-text.js.map +1 -0
- package/dist/components/composer/composer-utils.d.ts +74 -0
- package/dist/components/composer/composer-utils.d.ts.map +1 -0
- package/dist/components/composer/composer-utils.js +133 -0
- package/dist/components/composer/composer-utils.js.map +1 -0
- package/dist/components/conversation/ConversationList.d.ts +94 -0
- package/dist/components/conversation/ConversationList.d.ts.map +1 -0
- package/dist/components/conversation/ConversationList.js +81 -0
- package/dist/components/conversation/ConversationList.js.map +1 -0
- package/dist/components/conversation/ConversationRow.d.ts +66 -0
- package/dist/components/conversation/ConversationRow.d.ts.map +1 -0
- package/dist/components/conversation/ConversationRow.js +65 -0
- package/dist/components/conversation/ConversationRow.js.map +1 -0
- package/dist/components/conversation/conversation-status.d.ts +21 -0
- package/dist/components/conversation/conversation-status.d.ts.map +1 -0
- package/dist/components/conversation/conversation-status.js +33 -0
- package/dist/components/conversation/conversation-status.js.map +1 -0
- package/dist/components/intervention/ApprovalDiff.d.ts +14 -0
- package/dist/components/intervention/ApprovalDiff.d.ts.map +1 -0
- package/dist/components/intervention/ApprovalDiff.js +25 -0
- package/dist/components/intervention/ApprovalDiff.js.map +1 -0
- package/dist/components/intervention/ApprovalPanel.d.ts +57 -0
- package/dist/components/intervention/ApprovalPanel.d.ts.map +1 -0
- package/dist/components/intervention/ApprovalPanel.js +111 -0
- package/dist/components/intervention/ApprovalPanel.js.map +1 -0
- package/dist/components/intervention/ErrorRecoveryNotice.d.ts +28 -0
- package/dist/components/intervention/ErrorRecoveryNotice.d.ts.map +1 -0
- package/dist/components/intervention/ErrorRecoveryNotice.js +31 -0
- package/dist/components/intervention/ErrorRecoveryNotice.js.map +1 -0
- package/dist/components/intervention/GrantList.d.ts +49 -0
- package/dist/components/intervention/GrantList.d.ts.map +1 -0
- package/dist/components/intervention/GrantList.js +58 -0
- package/dist/components/intervention/GrantList.js.map +1 -0
- package/dist/components/intervention/InterventionDock.d.ts +24 -0
- package/dist/components/intervention/InterventionDock.d.ts.map +1 -0
- package/dist/components/intervention/InterventionDock.js +18 -0
- package/dist/components/intervention/InterventionDock.js.map +1 -0
- package/dist/components/intervention/QuestionnaireCard.d.ts +81 -0
- package/dist/components/intervention/QuestionnaireCard.d.ts.map +1 -0
- package/dist/components/intervention/QuestionnaireCard.js +333 -0
- package/dist/components/intervention/QuestionnaireCard.js.map +1 -0
- package/dist/components/intervention/action-lock.d.ts +20 -0
- package/dist/components/intervention/action-lock.d.ts.map +1 -0
- package/dist/components/intervention/action-lock.js +65 -0
- package/dist/components/intervention/action-lock.js.map +1 -0
- package/dist/components/intervention/icons.d.ts +8 -0
- package/dist/components/intervention/icons.d.ts.map +1 -0
- package/dist/components/intervention/icons.js +11 -0
- package/dist/components/intervention/icons.js.map +1 -0
- package/dist/components/intervention/questionnaire-answers.d.ts +34 -0
- package/dist/components/intervention/questionnaire-answers.d.ts.map +1 -0
- package/dist/components/intervention/questionnaire-answers.js +97 -0
- package/dist/components/intervention/questionnaire-answers.js.map +1 -0
- package/dist/components/message/AgentMessage.d.ts +98 -0
- package/dist/components/message/AgentMessage.d.ts.map +1 -0
- package/dist/components/message/AgentMessage.js +94 -0
- package/dist/components/message/AgentMessage.js.map +1 -0
- package/dist/components/message/CitationChip.d.ts +38 -0
- package/dist/components/message/CitationChip.d.ts.map +1 -0
- package/dist/components/message/CitationChip.js +32 -0
- package/dist/components/message/CitationChip.js.map +1 -0
- package/dist/components/message/CodeBlock.d.ts +45 -0
- package/dist/components/message/CodeBlock.d.ts.map +1 -0
- package/dist/components/message/CodeBlock.js +21 -0
- package/dist/components/message/CodeBlock.js.map +1 -0
- package/dist/components/message/JumpToLatest.d.ts +27 -0
- package/dist/components/message/JumpToLatest.d.ts.map +1 -0
- package/dist/components/message/JumpToLatest.js +17 -0
- package/dist/components/message/JumpToLatest.js.map +1 -0
- package/dist/components/message/Markdown.d.ts +21 -0
- package/dist/components/message/Markdown.d.ts.map +1 -0
- package/dist/components/message/Markdown.js +21 -0
- package/dist/components/message/Markdown.js.map +1 -0
- package/dist/components/message/MessageActions.d.ts +67 -0
- package/dist/components/message/MessageActions.d.ts.map +1 -0
- package/dist/components/message/MessageActions.js +83 -0
- package/dist/components/message/MessageActions.js.map +1 -0
- package/dist/components/message/MessageList.d.ts +106 -0
- package/dist/components/message/MessageList.d.ts.map +1 -0
- package/dist/components/message/MessageList.js +327 -0
- package/dist/components/message/MessageList.js.map +1 -0
- package/dist/components/message/MessagePart.d.ts +44 -0
- package/dist/components/message/MessagePart.d.ts.map +1 -0
- package/dist/components/message/MessagePart.js +150 -0
- package/dist/components/message/MessagePart.js.map +1 -0
- package/dist/components/message/RunDetails.d.ts +26 -0
- package/dist/components/message/RunDetails.d.ts.map +1 -0
- package/dist/components/message/RunDetails.js +113 -0
- package/dist/components/message/RunDetails.js.map +1 -0
- package/dist/components/message/SkillUseList.d.ts +22 -0
- package/dist/components/message/SkillUseList.d.ts.map +1 -0
- package/dist/components/message/SkillUseList.js +20 -0
- package/dist/components/message/SkillUseList.js.map +1 -0
- package/dist/components/message/ThinkingBlock.d.ts +44 -0
- package/dist/components/message/ThinkingBlock.d.ts.map +1 -0
- package/dist/components/message/ThinkingBlock.js +34 -0
- package/dist/components/message/ThinkingBlock.js.map +1 -0
- package/dist/components/message/icons.d.ts +14 -0
- package/dist/components/message/icons.d.ts.map +1 -0
- package/dist/components/message/icons.js +16 -0
- package/dist/components/message/icons.js.map +1 -0
- package/dist/components/message/plain-text.d.ts +11 -0
- package/dist/components/message/plain-text.d.ts.map +1 -0
- package/dist/components/message/plain-text.js +58 -0
- package/dist/components/message/plain-text.js.map +1 -0
- package/dist/components/message/renderers.d.ts +30 -0
- package/dist/components/message/renderers.d.ts.map +1 -0
- package/dist/components/message/renderers.js +2 -0
- package/dist/components/message/renderers.js.map +1 -0
- package/dist/components/message/use-copy.d.ts +19 -0
- package/dist/components/message/use-copy.d.ts.map +1 -0
- package/dist/components/message/use-copy.js +67 -0
- package/dist/components/message/use-copy.js.map +1 -0
- package/dist/components/process/AgentProcess.d.ts +47 -0
- package/dist/components/process/AgentProcess.d.ts.map +1 -0
- package/dist/components/process/AgentProcess.js +78 -0
- package/dist/components/process/AgentProcess.js.map +1 -0
- package/dist/components/process/RunStatus.d.ts +60 -0
- package/dist/components/process/RunStatus.d.ts.map +1 -0
- package/dist/components/process/RunStatus.js +34 -0
- package/dist/components/process/RunStatus.js.map +1 -0
- package/dist/components/shell/AgentEmptyState.d.ts +35 -0
- package/dist/components/shell/AgentEmptyState.d.ts.map +1 -0
- package/dist/components/shell/AgentEmptyState.js +20 -0
- package/dist/components/shell/AgentEmptyState.js.map +1 -0
- package/dist/components/shell/AgentHeader.d.ts +84 -0
- package/dist/components/shell/AgentHeader.d.ts.map +1 -0
- package/dist/components/shell/AgentHeader.js +43 -0
- package/dist/components/shell/AgentHeader.js.map +1 -0
- package/dist/components/shell/AgentShell.d.ts +154 -0
- package/dist/components/shell/AgentShell.d.ts.map +1 -0
- package/dist/components/shell/AgentShell.js +210 -0
- package/dist/components/shell/AgentShell.js.map +1 -0
- package/dist/components/shell/AgentSidePane.d.ts +54 -0
- package/dist/components/shell/AgentSidePane.d.ts.map +1 -0
- package/dist/components/shell/AgentSidePane.js +26 -0
- package/dist/components/shell/AgentSidePane.js.map +1 -0
- package/dist/components/shell/ResizeHandle.d.ts +54 -0
- package/dist/components/shell/ResizeHandle.d.ts.map +1 -0
- package/dist/components/shell/ResizeHandle.js +94 -0
- package/dist/components/shell/ResizeHandle.js.map +1 -0
- package/dist/components/shell/use-controllable.d.ts +9 -0
- package/dist/components/shell/use-controllable.d.ts.map +1 -0
- package/dist/components/shell/use-controllable.js +26 -0
- package/dist/components/shell/use-controllable.js.map +1 -0
- package/dist/components/tools/ChunkPager.d.ts +48 -0
- package/dist/components/tools/ChunkPager.d.ts.map +1 -0
- package/dist/components/tools/ChunkPager.js +68 -0
- package/dist/components/tools/ChunkPager.js.map +1 -0
- package/dist/components/tools/CodeModeToolTree.d.ts +64 -0
- package/dist/components/tools/CodeModeToolTree.d.ts.map +1 -0
- package/dist/components/tools/CodeModeToolTree.js +97 -0
- package/dist/components/tools/CodeModeToolTree.js.map +1 -0
- package/dist/components/tools/DiffPreview.d.ts +83 -0
- package/dist/components/tools/DiffPreview.d.ts.map +1 -0
- package/dist/components/tools/DiffPreview.js +95 -0
- package/dist/components/tools/DiffPreview.js.map +1 -0
- package/dist/components/tools/ToolActivity.d.ts +63 -0
- package/dist/components/tools/ToolActivity.d.ts.map +1 -0
- package/dist/components/tools/ToolActivity.js +45 -0
- package/dist/components/tools/ToolActivity.js.map +1 -0
- package/dist/components/tools/ToolDetails.d.ts +118 -0
- package/dist/components/tools/ToolDetails.d.ts.map +1 -0
- package/dist/components/tools/ToolDetails.js +258 -0
- package/dist/components/tools/ToolDetails.js.map +1 -0
- package/dist/components/tools/ToolHistory.d.ts +48 -0
- package/dist/components/tools/ToolHistory.d.ts.map +1 -0
- package/dist/components/tools/ToolHistory.js +37 -0
- package/dist/components/tools/ToolHistory.js.map +1 -0
- package/dist/components/tools/ToolOutput.d.ts +61 -0
- package/dist/components/tools/ToolOutput.d.ts.map +1 -0
- package/dist/components/tools/ToolOutput.js +45 -0
- package/dist/components/tools/ToolOutput.js.map +1 -0
- package/dist/components/tools/ToolRecord.d.ts +58 -0
- package/dist/components/tools/ToolRecord.d.ts.map +1 -0
- package/dist/components/tools/ToolRecord.js +79 -0
- package/dist/components/tools/ToolRecord.js.map +1 -0
- package/dist/components/tools/shared.d.ts +93 -0
- package/dist/components/tools/shared.d.ts.map +1 -0
- package/dist/components/tools/shared.js +160 -0
- package/dist/components/tools/shared.js.map +1 -0
- package/dist/components/workspace/ActivityLedger.d.ts +44 -0
- package/dist/components/workspace/ActivityLedger.d.ts.map +1 -0
- package/dist/components/workspace/ActivityLedger.js +63 -0
- package/dist/components/workspace/ActivityLedger.js.map +1 -0
- package/dist/components/workspace/CompactionNotice.d.ts +63 -0
- package/dist/components/workspace/CompactionNotice.d.ts.map +1 -0
- package/dist/components/workspace/CompactionNotice.js +36 -0
- package/dist/components/workspace/CompactionNotice.js.map +1 -0
- package/dist/components/workspace/ContextUsage.d.ts +50 -0
- package/dist/components/workspace/ContextUsage.d.ts.map +1 -0
- package/dist/components/workspace/ContextUsage.js +106 -0
- package/dist/components/workspace/ContextUsage.js.map +1 -0
- package/dist/components/workspace/PersistentTerminal.d.ts +86 -0
- package/dist/components/workspace/PersistentTerminal.d.ts.map +1 -0
- package/dist/components/workspace/PersistentTerminal.js +155 -0
- package/dist/components/workspace/PersistentTerminal.js.map +1 -0
- package/dist/components/workspace/PinnedSummary.d.ts +43 -0
- package/dist/components/workspace/PinnedSummary.d.ts.map +1 -0
- package/dist/components/workspace/PinnedSummary.js +33 -0
- package/dist/components/workspace/PinnedSummary.js.map +1 -0
- package/dist/components/workspace/RunOverview.d.ts +29 -0
- package/dist/components/workspace/RunOverview.d.ts.map +1 -0
- package/dist/components/workspace/RunOverview.js +20 -0
- package/dist/components/workspace/RunOverview.js.map +1 -0
- package/dist/components/workspace/RunSummary.d.ts +35 -0
- package/dist/components/workspace/RunSummary.d.ts.map +1 -0
- package/dist/components/workspace/RunSummary.js +46 -0
- package/dist/components/workspace/RunSummary.js.map +1 -0
- package/dist/components/workspace/SubAgentCard.d.ts +64 -0
- package/dist/components/workspace/SubAgentCard.d.ts.map +1 -0
- package/dist/components/workspace/SubAgentCard.js +78 -0
- package/dist/components/workspace/SubAgentCard.js.map +1 -0
- package/dist/components/workspace/TerminalRow.d.ts +61 -0
- package/dist/components/workspace/TerminalRow.d.ts.map +1 -0
- package/dist/components/workspace/TerminalRow.js +65 -0
- package/dist/components/workspace/TerminalRow.js.map +1 -0
- package/dist/components/workspace/shared.d.ts +26 -0
- package/dist/components/workspace/shared.d.ts.map +1 -0
- package/dist/components/workspace/shared.js +41 -0
- package/dist/components/workspace/shared.js.map +1 -0
- package/dist/index.d.ts +136 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +79 -0
- package/dist/index.js.map +1 -0
- package/dist/motion/agent-motion.d.ts +62 -0
- package/dist/motion/agent-motion.d.ts.map +1 -0
- package/dist/motion/agent-motion.js +61 -0
- package/dist/motion/agent-motion.js.map +1 -0
- package/dist/primitives/AgentSpark.d.ts +17 -0
- package/dist/primitives/AgentSpark.d.ts.map +1 -0
- package/dist/primitives/AgentSpark.js +11 -0
- package/dist/primitives/AgentSpark.js.map +1 -0
- package/dist/primitives/AgentStatus.d.ts +32 -0
- package/dist/primitives/AgentStatus.d.ts.map +1 -0
- package/dist/primitives/AgentStatus.js +13 -0
- package/dist/primitives/AgentStatus.js.map +1 -0
- package/dist/primitives/StatusGlyph.d.ts +16 -0
- package/dist/primitives/StatusGlyph.d.ts.map +1 -0
- package/dist/primitives/StatusGlyph.js +31 -0
- package/dist/primitives/StatusGlyph.js.map +1 -0
- package/dist/primitives/icons.d.ts +13 -0
- package/dist/primitives/icons.d.ts.map +1 -0
- package/dist/primitives/icons.js +55 -0
- package/dist/primitives/icons.js.map +1 -0
- package/dist/provider/AgentMessages.d.ts +61 -0
- package/dist/provider/AgentMessages.d.ts.map +1 -0
- package/dist/provider/AgentMessages.js +81 -0
- package/dist/provider/AgentMessages.js.map +1 -0
- package/dist/provider/messages/composer.d.ts +112 -0
- package/dist/provider/messages/composer.d.ts.map +1 -0
- package/dist/provider/messages/composer.js +165 -0
- package/dist/provider/messages/composer.js.map +1 -0
- package/dist/provider/messages/intervention.d.ts +136 -0
- package/dist/provider/messages/intervention.d.ts.map +1 -0
- package/dist/provider/messages/intervention.js +321 -0
- package/dist/provider/messages/intervention.js.map +1 -0
- package/dist/provider/messages/message.d.ts +119 -0
- package/dist/provider/messages/message.d.ts.map +1 -0
- package/dist/provider/messages/message.js +224 -0
- package/dist/provider/messages/message.js.map +1 -0
- package/dist/provider/messages/shell.d.ts +70 -0
- package/dist/provider/messages/shell.d.ts.map +1 -0
- package/dist/provider/messages/shell.js +109 -0
- package/dist/provider/messages/shell.js.map +1 -0
- package/dist/provider/messages/status.d.ts +21 -0
- package/dist/provider/messages/status.d.ts.map +1 -0
- package/dist/provider/messages/status.js +195 -0
- package/dist/provider/messages/status.js.map +1 -0
- package/dist/provider/messages/tools.d.ts +217 -0
- package/dist/provider/messages/tools.d.ts.map +1 -0
- package/dist/provider/messages/tools.js +496 -0
- package/dist/provider/messages/tools.js.map +1 -0
- package/dist/provider/messages/workspace.d.ts +187 -0
- package/dist/provider/messages/workspace.d.ts.map +1 -0
- package/dist/provider/messages/workspace.js +333 -0
- package/dist/provider/messages/workspace.js.map +1 -0
- package/dist/styles/artifact.css +564 -0
- package/dist/styles/base.css +220 -0
- package/dist/styles/composer.css +1001 -0
- package/dist/styles/conversation.css +275 -0
- package/dist/styles/intervention.css +929 -0
- package/dist/styles/message.css +917 -0
- package/dist/styles/process.css +207 -0
- package/dist/styles/shell.css +453 -0
- package/dist/styles/tools.css +929 -0
- package/dist/styles/workspace.css +1297 -0
- package/dist/styles/wpi-adoption.css +24 -0
- package/dist/utils/cx.d.ts +3 -0
- package/dist/utils/cx.d.ts.map +1 -0
- package/dist/utils/cx.js +5 -0
- package/dist/utils/cx.js.map +1 -0
- package/package.json +64 -3
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { AgentActionHandler } from '@wzrhine/agent-core';
|
|
3
|
+
import type { CompactionPhase, CompactionStatus } from '../../provider/messages/workspace.js';
|
|
4
|
+
import type { WorkspaceMessagesProp } from './shared.js';
|
|
5
|
+
export type { CompactionPhase, CompactionStatus };
|
|
6
|
+
export type CompactionNoticeProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> & {
|
|
7
|
+
status: CompactionStatus;
|
|
8
|
+
/** Sub-step of a running compaction, shown as a sub-label. */
|
|
9
|
+
phase?: CompactionPhase;
|
|
10
|
+
/** Hint after a failed / interrupted compaction; default 「可输入 /compact 重试」. `null` hides it. */
|
|
11
|
+
retryHint?: React.ReactNode;
|
|
12
|
+
tokensBefore?: number;
|
|
13
|
+
tokensAfter?: number;
|
|
14
|
+
/** Elapsed time of a running compaction (the host updates it; nothing polls here). */
|
|
15
|
+
elapsedMs?: number;
|
|
16
|
+
/** Text of the compaction summary (plain text, or markdown through `renderMarkdown`). */
|
|
17
|
+
summary?: string;
|
|
18
|
+
renderMarkdown?: (source: string) => React.ReactNode;
|
|
19
|
+
/** Cancels a running compaction. */
|
|
20
|
+
onCancel?: AgentActionHandler;
|
|
21
|
+
/** Retries saving the result (`save-pending`). */
|
|
22
|
+
onRetrySave?: AgentActionHandler;
|
|
23
|
+
/** Summary disclosure (controlled). */
|
|
24
|
+
summaryOpen?: boolean;
|
|
25
|
+
onSummaryOpenChange?: (open: boolean) => void;
|
|
26
|
+
/** Busy flag for the buttons while an action is being submitted. */
|
|
27
|
+
busy?: boolean;
|
|
28
|
+
messages?: WorkspaceMessagesProp;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* CompactionNotice (Wpi context compaction bar): a strip in the message flow for one context
|
|
32
|
+
* compaction. Running: AgentSpark (executing rhythm) + 「正在整理上下文」 + elapsed + cancel.
|
|
33
|
+
* Completed: token delta 「32K → 12K token」 and an optional summary disclosure (Collapsible).
|
|
34
|
+
* `phase` adds a sub-label while running (「准备中」 / 「正在生成摘要」 / 「正在保存结果」).
|
|
35
|
+
* Failed and interrupted (the run stopped before the compaction settled; the old context is kept)
|
|
36
|
+
* show `retryHint`, default 「可输入 /compact 重试」. Save pending: 「重试保存」. The title is a polite
|
|
37
|
+
* status, so the transition to a settled state is announced once.
|
|
38
|
+
*/
|
|
39
|
+
export declare const CompactionNotice: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLDivElement>, "children"> & {
|
|
40
|
+
status: CompactionStatus;
|
|
41
|
+
/** Sub-step of a running compaction, shown as a sub-label. */
|
|
42
|
+
phase?: CompactionPhase;
|
|
43
|
+
/** Hint after a failed / interrupted compaction; default 「可输入 /compact 重试」. `null` hides it. */
|
|
44
|
+
retryHint?: React.ReactNode;
|
|
45
|
+
tokensBefore?: number;
|
|
46
|
+
tokensAfter?: number;
|
|
47
|
+
/** Elapsed time of a running compaction (the host updates it; nothing polls here). */
|
|
48
|
+
elapsedMs?: number;
|
|
49
|
+
/** Text of the compaction summary (plain text, or markdown through `renderMarkdown`). */
|
|
50
|
+
summary?: string;
|
|
51
|
+
renderMarkdown?: (source: string) => React.ReactNode;
|
|
52
|
+
/** Cancels a running compaction. */
|
|
53
|
+
onCancel?: AgentActionHandler;
|
|
54
|
+
/** Retries saving the result (`save-pending`). */
|
|
55
|
+
onRetrySave?: AgentActionHandler;
|
|
56
|
+
/** Summary disclosure (controlled). */
|
|
57
|
+
summaryOpen?: boolean;
|
|
58
|
+
onSummaryOpenChange?: (open: boolean) => void;
|
|
59
|
+
/** Busy flag for the buttons while an action is being submitted. */
|
|
60
|
+
busy?: boolean;
|
|
61
|
+
messages?: WorkspaceMessagesProp;
|
|
62
|
+
} & React.RefAttributes<HTMLDivElement>>;
|
|
63
|
+
//# sourceMappingURL=CompactionNotice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CompactionNotice.d.ts","sourceRoot":"","sources":["../../../src/components/workspace/CompactionNotice.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,kBAAkB,EAA8B,MAAM,qBAAqB,CAAC;AAK1F,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAE9F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAC;AAElD,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,GAAG;IAC3F,MAAM,EAAE,gBAAgB,CAAC;IACzB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,gGAAgG;IAChG,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sFAAsF;IACtF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yFAAyF;IACzF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;IACrD,oCAAoC;IACpC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,kDAAkD;IAClD,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,uCAAuC;IACvC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C,oEAAoE;IACpE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,qBAAqB,CAAC;CAClC,CAAC;AAUF;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB;YAzCnB,gBAAgB;IACxB,8DAA8D;YACtD,eAAe;IACvB,gGAAgG;gBACpF,KAAK,CAAC,SAAS;mBACZ,MAAM;kBACP,MAAM;IACpB,sFAAsF;gBAC1E,MAAM;IAClB,yFAAyF;cAC/E,MAAM;qBACC,CAAC,MAAM,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS;IACpD,oCAAoC;eACzB,kBAAkB;IAC7B,kDAAkD;kBACpC,kBAAkB;IAChC,uCAAuC;kBACzB,OAAO;0BACC,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI;IAC7C,oEAAoE;WAC7D,OAAO;eACH,qBAAqB;wCAoFhC,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { Button, Collapsible } from '@wzrhine/react';
|
|
5
|
+
import { useAgentFormat } from '../../provider/AgentMessages.js';
|
|
6
|
+
import { AgentSpark } from '../../primitives/AgentSpark.js';
|
|
7
|
+
import { StatusGlyph } from '../../primitives/StatusGlyph.js';
|
|
8
|
+
import { cx } from '../../utils/cx.js';
|
|
9
|
+
import { useWorkspaceMessages } from './shared.js';
|
|
10
|
+
const settledGlyph = {
|
|
11
|
+
completed: { glyph: 'compacting', tone: 'success' },
|
|
12
|
+
cancelled: { glyph: 'stopped', tone: 'neutral' },
|
|
13
|
+
failed: { glyph: 'failed', tone: 'danger' },
|
|
14
|
+
interrupted: { glyph: 'unknown', tone: 'warning' },
|
|
15
|
+
'save-pending': { glyph: 'saving', tone: 'warning' },
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* CompactionNotice (Wpi context compaction bar): a strip in the message flow for one context
|
|
19
|
+
* compaction. Running: AgentSpark (executing rhythm) + 「正在整理上下文」 + elapsed + cancel.
|
|
20
|
+
* Completed: token delta 「32K → 12K token」 and an optional summary disclosure (Collapsible).
|
|
21
|
+
* `phase` adds a sub-label while running (「准备中」 / 「正在生成摘要」 / 「正在保存结果」).
|
|
22
|
+
* Failed and interrupted (the run stopped before the compaction settled; the old context is kept)
|
|
23
|
+
* show `retryHint`, default 「可输入 /compact 重试」. Save pending: 「重试保存」. The title is a polite
|
|
24
|
+
* status, so the transition to a settled state is announced once.
|
|
25
|
+
*/
|
|
26
|
+
export const CompactionNotice = React.forwardRef(function CompactionNotice({ status, phase, retryHint, tokensBefore, tokensAfter, elapsedMs, summary, renderMarkdown, onCancel, onRetrySave, summaryOpen, onSummaryOpenChange, busy, messages: override, className, ...rest }, ref) {
|
|
27
|
+
const m = useWorkspaceMessages(override);
|
|
28
|
+
const format = useAgentFormat();
|
|
29
|
+
const running = status === 'running';
|
|
30
|
+
const delta = tokensBefore !== undefined && tokensAfter !== undefined ? m.compactionDelta(format.compact(tokensBefore), format.compact(tokensAfter)) : undefined;
|
|
31
|
+
const text = summary?.trim();
|
|
32
|
+
const glyph = running ? undefined : settledGlyph[status];
|
|
33
|
+
const hint = retryHint === undefined ? m.compactionRetryHint : retryHint;
|
|
34
|
+
return (_jsxs("div", { ...rest, ref: ref, className: cx('rl-agent-compaction', className), "data-status": status, children: [_jsxs("div", { className: "rl-agent-compaction__row", children: [running ? _jsx(AgentSpark, { phase: "executing" }) : _jsx(StatusGlyph, { name: glyph.glyph, tone: glyph.tone }), _jsxs("p", { className: "rl-agent-compaction__title", role: "status", children: [_jsx("span", { children: m.compactionStatus[status] }), running && phase && _jsx("span", { className: "rl-agent-compaction__phase", children: m.compactionPhase[phase] }), !running && delta && _jsx("span", { className: "rl-agent-compaction__delta", children: delta })] }), running && elapsedMs !== undefined && _jsx("span", { className: "rl-agent-compaction__elapsed", children: format.duration(elapsedMs) }), (status === 'failed' || status === 'interrupted') && hint != null && hint !== false && _jsx("span", { className: "rl-agent-compaction__hint", children: hint }), running && onCancel && (_jsx(Button, { size: "sm", variant: "ghost", loading: busy, onClick: () => void onCancel(), children: m.compactionCancel })), status === 'save-pending' && onRetrySave && (_jsx(Button, { size: "sm", variant: "secondary", loading: busy, onClick: () => void onRetrySave(), children: m.compactionRetrySave }))] }), !running && text && (_jsx(Collapsible, { className: "rl-agent-compaction__summary", open: summaryOpen, defaultOpen: summaryOpen === undefined ? false : undefined, onOpenChange: onSummaryOpenChange, trigger: _jsx("span", { children: m.compactionSummary }), children: renderMarkdown ? renderMarkdown(text) : _jsx("p", { className: "rl-agent-compaction__text", children: text }) }))] }));
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=CompactionNotice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CompactionNotice.js","sourceRoot":"","sources":["../../../src/components/workspace/CompactionNotice.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { PopoverAlign, PopoverSide } from '@wzrhine/react';
|
|
3
|
+
import type { ContextUsageView } from '@wzrhine/agent-core';
|
|
4
|
+
import type { WorkspaceMessagesProp } from './shared.js';
|
|
5
|
+
export type ContextUsageVariant = 'ring' | 'bar' | 'full';
|
|
6
|
+
export type ContextUsageProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> & {
|
|
7
|
+
usage: ContextUsageView;
|
|
8
|
+
/**
|
|
9
|
+
* `ring`: compact trigger (ring + 「12.4K / 32K」) that opens the full view in a Popover.
|
|
10
|
+
* `bar`: one line with a meter. `full`: meter, breakdown legend, warnings and note.
|
|
11
|
+
*/
|
|
12
|
+
variant?: ContextUsageVariant;
|
|
13
|
+
/** Popover placement for `ring`. */
|
|
14
|
+
side?: PopoverSide;
|
|
15
|
+
align?: PopoverAlign;
|
|
16
|
+
/** `ring`: also open the Popover on hover (focus and click still open it). */
|
|
17
|
+
openOnHover?: boolean;
|
|
18
|
+
open?: boolean;
|
|
19
|
+
onOpenChange?: (open: boolean) => void;
|
|
20
|
+
segmentScale?: 'full' | 'fit-used';
|
|
21
|
+
messages?: WorkspaceMessagesProp;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* ContextUsage (atlas 27): context / token budget. A percentage — the ring arc, the Meter — is
|
|
25
|
+
* drawn only when `usagePercent` returns a number (exact or estimated value with a reliable max);
|
|
26
|
+
* unknown or partial data shows text without a `role="meter"`. Non-exact numbers always carry
|
|
27
|
+
* 「估计值」 / 「部分数据」. Near (≥ 80%) and over the limit add a warning sentence, not only colour.
|
|
28
|
+
* `usage.stats` (cache hit rate, TTFT, TPS…) render in the full view and the popover as one
|
|
29
|
+
* `<dl>` per section; a missing value shows 「—」 (read as 「无数据」), never 0.
|
|
30
|
+
*
|
|
31
|
+
* Motion: none of its own (the Popover has its CSS transition); values update directly.
|
|
32
|
+
*/
|
|
33
|
+
export declare const ContextUsage: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLDivElement>, "children"> & {
|
|
34
|
+
usage: ContextUsageView;
|
|
35
|
+
/**
|
|
36
|
+
* `ring`: compact trigger (ring + 「12.4K / 32K」) that opens the full view in a Popover.
|
|
37
|
+
* `bar`: one line with a meter. `full`: meter, breakdown legend, warnings and note.
|
|
38
|
+
*/
|
|
39
|
+
variant?: ContextUsageVariant;
|
|
40
|
+
/** Popover placement for `ring`. */
|
|
41
|
+
side?: PopoverSide;
|
|
42
|
+
align?: PopoverAlign;
|
|
43
|
+
/** `ring`: also open the Popover on hover (focus and click still open it). */
|
|
44
|
+
openOnHover?: boolean;
|
|
45
|
+
open?: boolean;
|
|
46
|
+
onOpenChange?: (open: boolean) => void;
|
|
47
|
+
segmentScale?: "full" | "fit-used";
|
|
48
|
+
messages?: WorkspaceMessagesProp;
|
|
49
|
+
} & React.RefAttributes<HTMLDivElement>>;
|
|
50
|
+
//# sourceMappingURL=ContextUsage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextUsage.d.ts","sourceRoot":"","sources":["../../../src/components/workspace/ContextUsage.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAEhE,OAAO,KAAK,EAAE,gBAAgB,EAAkC,MAAM,qBAAqB,CAAC;AAK5F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAE1D,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,GAAG;IACvF,KAAK,EAAE,gBAAgB,CAAC;IACxB;;;OAGG;IACH,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,oCAAoC;IACpC,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IACnC,QAAQ,CAAC,EAAE,qBAAqB,CAAC;CAClC,CAAC;AAgHF;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY;WAzIhB,gBAAgB;IACvB;;;OAGG;cACO,mBAAmB;IAC7B,oCAAoC;WAC7B,WAAW;YACV,YAAY;IACpB,8EAA8E;kBAChE,OAAO;WACd,OAAO;mBACC,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI;mBACvB,MAAM,GAAG,UAAU;eACvB,qBAAqB;wCAuKhC,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { Meter, Popover } from '@wzrhine/react';
|
|
5
|
+
import { usageLevel, usagePercent } from '@wzrhine/agent-core';
|
|
6
|
+
import { useAgentFormat, useAgentMessages } from '../../provider/AgentMessages.js';
|
|
7
|
+
import { AgentIcon } from '../../primitives/icons.js';
|
|
8
|
+
import { cx } from '../../utils/cx.js';
|
|
9
|
+
import { completenessTag, useWorkspaceMessages } from './shared.js';
|
|
10
|
+
function useDerived(usage, override) {
|
|
11
|
+
const m = useWorkspaceMessages(override);
|
|
12
|
+
const status = useAgentMessages().status;
|
|
13
|
+
const format = useAgentFormat();
|
|
14
|
+
const percent = usagePercent(usage.used, usage.max, usage.completeness);
|
|
15
|
+
const level = usage.completeness === 'unknown' ? 'unknown' : usageLevel(usage.used, usage.max);
|
|
16
|
+
const value = (n) => (usage.unit === 'bytes' ? format.bytes(n) : format.compact(n));
|
|
17
|
+
let summary = m.contextUnknown;
|
|
18
|
+
if (usage.used !== undefined && usage.completeness !== 'unknown') {
|
|
19
|
+
summary = usage.max !== undefined && usage.max > 0 ? `${value(usage.used)} / ${value(usage.max)}` : value(usage.used);
|
|
20
|
+
}
|
|
21
|
+
return { m, percent, level, summary, tag: completenessTag(usage.estimated ? 'estimated' : usage.completeness, status.completeness), label: usage.label ?? m.contextTitle };
|
|
22
|
+
}
|
|
23
|
+
/** The ring: an arc for a reliable percentage, a dashed circle when there is none. */
|
|
24
|
+
function Ring({ percent, level }) {
|
|
25
|
+
const arc = percent === null ? null : Math.max(0, Math.min(100, percent));
|
|
26
|
+
return (_jsxs("svg", { className: "rl-agent-context__ring", viewBox: "0 0 16 16", "aria-hidden": "true", focusable: "false", "data-level": level, "data-unknown": arc === null || undefined, children: [_jsx("circle", { className: "rl-agent-context__ring-track", cx: "8", cy: "8", r: "6", pathLength: "100" }), arc !== null && _jsx("circle", { className: "rl-agent-context__ring-arc", cx: "8", cy: "8", r: "6", pathLength: "100", strokeDasharray: `${arc} 100` })] }));
|
|
27
|
+
}
|
|
28
|
+
function Warning({ level, m }) {
|
|
29
|
+
if (level !== 'near' && level !== 'over')
|
|
30
|
+
return null;
|
|
31
|
+
return (_jsxs("p", { className: "rl-agent-context__warning", "data-level": level, children: [_jsx(AgentIcon, { name: "warning" }), level === 'over' ? m.contextOver : m.contextNear] }));
|
|
32
|
+
}
|
|
33
|
+
/** Meter when the percentage is reliable; otherwise plain text (never a role=meter without a max). */
|
|
34
|
+
function Measure({ usage, d, size }) {
|
|
35
|
+
const { m, percent, level, summary, tag, label } = d;
|
|
36
|
+
const unit = m.contextUnit[usage.unit];
|
|
37
|
+
if (percent !== null && usage.used !== undefined && usage.max !== undefined) {
|
|
38
|
+
const text = `${summary} · ${m.contextPercent(percent)}`;
|
|
39
|
+
return (_jsx(Meter, { className: "rl-agent-context__meter", "data-level": level, size: size, label: _jsxs(_Fragment, { children: [label, tag && _jsx("span", { className: "rl-agent-context__tag", children: tag })] }), value: Math.min(usage.used, usage.max), high: usage.max * 0.8, optimum: 0, max: usage.max, valueText: text, getValueText: () => [summary, unit, m.contextPercent(percent), tag].filter(Boolean).join(' ') }));
|
|
40
|
+
}
|
|
41
|
+
return (_jsxs("p", { className: "rl-agent-context__line", "data-level": level, children: [_jsx("span", { className: "rl-agent-context__label", children: label }), _jsxs("span", { className: "rl-agent-context__value", children: [summary, usage.used !== undefined && usage.completeness !== 'unknown' && unit ? ` ${unit}` : ''] }), tag && _jsx("span", { className: "rl-agent-context__tag", children: tag }), (usage.max === undefined || usage.max <= 0) && usage.completeness !== 'unknown' && _jsx("span", { className: "rl-agent-context__hint", children: m.contextNoMax })] }));
|
|
42
|
+
}
|
|
43
|
+
function Breakdown({ usage, m, segmentScale }) {
|
|
44
|
+
const format = useAgentFormat();
|
|
45
|
+
const segments = (usage.segments ?? []).filter((s) => s.value > 0);
|
|
46
|
+
if (segments.length === 0)
|
|
47
|
+
return null;
|
|
48
|
+
const sum = segments.reduce((acc, s) => acc + s.value, 0);
|
|
49
|
+
// With a reliable max the stacked bar shows the share of the window; otherwise the composition.
|
|
50
|
+
const total = segmentScale === 'fit-used' ? sum : usage.max && usage.max > 0 && usage.completeness !== 'unknown' ? Math.max(usage.max, sum) : sum;
|
|
51
|
+
const value = (n) => (usage.unit === 'bytes' ? format.bytes(n) : format.compact(n));
|
|
52
|
+
return (_jsxs("div", { className: "rl-agent-context__breakdown", children: [_jsx("div", { className: "rl-agent-context__stack", "aria-hidden": "true", children: segments.map((s) => (_jsx("span", { className: "rl-agent-context__segment", "data-tone": s.tone ?? 'neutral', style: { inlineSize: `${(s.value / total) * 100}%` } }, s.id))) }), _jsx("ul", { className: "rl-agent-context__legend", "aria-label": m.contextBreakdown, children: segments.map((s) => (_jsxs("li", { className: "rl-agent-context__legend-item", children: [_jsx("span", { className: "rl-agent-context__swatch", "data-tone": s.tone ?? 'neutral', "aria-hidden": "true" }), _jsx("span", { className: "rl-agent-context__legend-label", children: s.label }), _jsx("span", { className: "rl-agent-context__legend-value", children: value(s.value) })] }, s.id))) })] }));
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* ContextUsage (atlas 27): context / token budget. A percentage — the ring arc, the Meter — is
|
|
56
|
+
* drawn only when `usagePercent` returns a number (exact or estimated value with a reliable max);
|
|
57
|
+
* unknown or partial data shows text without a `role="meter"`. Non-exact numbers always carry
|
|
58
|
+
* 「估计值」 / 「部分数据」. Near (≥ 80%) and over the limit add a warning sentence, not only colour.
|
|
59
|
+
* `usage.stats` (cache hit rate, TTFT, TPS…) render in the full view and the popover as one
|
|
60
|
+
* `<dl>` per section; a missing value shows 「—」 (read as 「无数据」), never 0.
|
|
61
|
+
*
|
|
62
|
+
* Motion: none of its own (the Popover has its CSS transition); values update directly.
|
|
63
|
+
*/
|
|
64
|
+
export const ContextUsage = React.forwardRef(function ContextUsage({ usage, variant = 'full', side = 'top', align = 'end', openOnHover, open, onOpenChange, segmentScale = 'full', messages: override, className, ...rest }, ref) {
|
|
65
|
+
const d = useDerived(usage, override);
|
|
66
|
+
const { m, level, summary, tag } = d;
|
|
67
|
+
if (variant === 'ring') {
|
|
68
|
+
return (_jsx("div", { ...rest, ref: ref, className: cx('rl-agent-context', className), "data-variant": "ring", "data-level": level, "data-disabled": usage.disabled ? true : undefined, "data-estimated": usage.estimated || usage.completeness === 'estimated' || undefined, children: _jsx(Popover, { side: side, align: align, size: "sm", openOnHover: openOnHover, open: open, onOpenChange: onOpenChange, title: m.contextTitle, trigger: _jsxs("button", { type: "button", className: "rl-agent-context__trigger", "data-level": level, "aria-label": m.contextTrigger(tag ? `${summary} · ${tag}` : summary), disabled: Boolean(usage.disabled), children: [_jsx(Ring, { percent: d.percent, level: level }), _jsx("span", { className: "rl-agent-context__value", children: summary }), tag && _jsx("span", { className: "rl-agent-context__tag", children: tag })] }), children: _jsx(ContextUsageDetail, { usage: usage, d: d, segmentScale: segmentScale }) }) }));
|
|
69
|
+
}
|
|
70
|
+
return (_jsx("div", { ...rest, ref: ref, className: cx('rl-agent-context', className), "data-variant": variant, "data-level": level, "data-disabled": usage.disabled ? true : undefined, "data-estimated": usage.estimated || usage.completeness === 'estimated' || undefined, "data-segment-scale": segmentScale, children: variant === 'bar' ? (_jsxs(_Fragment, { children: [_jsx(Measure, { usage: usage, d: d, size: "sm" }), _jsx(Warning, { level: level, m: m })] })) : (_jsx(ContextUsageDetail, { usage: usage, d: d, segmentScale: segmentScale })) }));
|
|
71
|
+
});
|
|
72
|
+
function ContextUsageDetail({ usage, d, segmentScale }) {
|
|
73
|
+
return (_jsxs("div", { className: "rl-agent-context__detail", children: [_jsx(Measure, { usage: usage, d: d, size: "md" }), _jsx(Warning, { level: d.level, m: d.m }), _jsx(Breakdown, { usage: usage, m: d.m, segmentScale: segmentScale }), _jsx(Stats, { sections: usage.stats, m: d.m }), usage.note && (_jsxs("p", { className: "rl-agent-context__note", children: [_jsx(AgentIcon, { name: "info" }), usage.note] }))] }));
|
|
74
|
+
}
|
|
75
|
+
function Stats({ sections, m }) {
|
|
76
|
+
const status = useAgentMessages().status;
|
|
77
|
+
const format = useAgentFormat();
|
|
78
|
+
const id = React.useId();
|
|
79
|
+
const shown = (sections ?? []).filter((s) => s.rows.length > 0);
|
|
80
|
+
if (shown.length === 0)
|
|
81
|
+
return null;
|
|
82
|
+
const valueOf = (row) => {
|
|
83
|
+
const v = row.value;
|
|
84
|
+
switch (row.unit) {
|
|
85
|
+
case 'ms':
|
|
86
|
+
return m.contextStatValue(format.duration(v), 'ms');
|
|
87
|
+
case 'tokens':
|
|
88
|
+
return m.contextStatValue(format.compact(v), 'tokens');
|
|
89
|
+
case 'percent':
|
|
90
|
+
return m.contextStatValue(format.number(Math.round(v * 10) / 10), 'percent');
|
|
91
|
+
case 'tokens-per-s':
|
|
92
|
+
return m.contextStatValue(format.number(Math.round(v * 10) / 10), 'tokens-per-s');
|
|
93
|
+
default:
|
|
94
|
+
return m.contextStatValue(format.number(v), 'count');
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
return (_jsx("div", { className: "rl-agent-context__stats", role: "group", "aria-label": m.contextStats, children: shown.map((section, i) => {
|
|
98
|
+
const titleId = `${id}-${i}`;
|
|
99
|
+
return (_jsxs("section", { className: "rl-agent-context__stat-section", "aria-labelledby": titleId, children: [_jsx("p", { id: titleId, className: "rl-agent-context__stat-title", children: section.title }), _jsx("dl", { className: "rl-agent-context__stat-list", children: section.rows.map((row, j) => {
|
|
100
|
+
const missing = row.value === undefined || !Number.isFinite(row.value) || row.completeness === 'unknown';
|
|
101
|
+
const tag = !missing && row.completeness ? completenessTag(row.completeness, status.completeness) : undefined;
|
|
102
|
+
return (_jsxs("div", { className: "rl-agent-context__stat", children: [_jsx("dt", { children: row.label }), _jsxs("dd", { "data-missing": missing || undefined, children: [missing ? (_jsxs(_Fragment, { children: [_jsx("span", { "aria-hidden": "true", children: "\u2014" }), _jsx("span", { className: "rl-agent-sr", children: m.contextStatMissing })] })) : (valueOf(row)), tag && _jsx("span", { className: "rl-agent-context__tag", children: tag })] })] }, `${row.label}-${j}`));
|
|
103
|
+
}) })] }, section.id));
|
|
104
|
+
}) }));
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=ContextUsage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextUsage.js","sourceRoot":"","sources":["../../../src/components/workspace/ContextUsage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { AgentActionHandler, MaterialPageView, TerminalView } from '@wzrhine/agent-core';
|
|
3
|
+
import type { ChunkPagerActions } from '../tools/ChunkPager.js';
|
|
4
|
+
import type { HeadingLevel, WorkspaceMessagesProp } from './shared.js';
|
|
5
|
+
/** Inherited / read-only terminals are history only: no input, no stop. */
|
|
6
|
+
export declare function isTerminalReadOnly(terminal: TerminalView): boolean;
|
|
7
|
+
export type PersistentTerminalProps = Omit<React.HTMLAttributes<HTMLElement>, 'children' | 'onInput'> & {
|
|
8
|
+
terminal: TerminalView;
|
|
9
|
+
/** Sends one line to the session. Without it (or when read-only) no input line is drawn. */
|
|
10
|
+
onInput?: AgentActionHandler<[text: string, terminal: TerminalView]>;
|
|
11
|
+
/** Requests a stop. Drawn only when `terminal.stoppable`. Also used by 「重试停止」. */
|
|
12
|
+
onStop?: AgentActionHandler<[terminal: TerminalView]>;
|
|
13
|
+
/** Loads older output (`terminal.outputTruncated`). The scroll position is kept. */
|
|
14
|
+
onLoadEarlier?: AgentActionHandler<[terminal: TerminalView]>;
|
|
15
|
+
/** Reads the newest output (`terminal.newerOutput`); draws 「有新输出,读取最新」. */
|
|
16
|
+
onReadLatest?: AgentActionHandler<[terminal: TerminalView]>;
|
|
17
|
+
/** Loads earlier entries of `terminal.history`. */
|
|
18
|
+
onLoadMoreHistory?: AgentActionHandler<[terminal: TerminalView]>;
|
|
19
|
+
/** One page of stored output; replaces the live tail with a `ChunkPager`. */
|
|
20
|
+
page?: MaterialPageView;
|
|
21
|
+
/** Paging callbacks for `page` (`canGoBack` defaults to false). */
|
|
22
|
+
pager?: Partial<ChunkPagerActions>;
|
|
23
|
+
headingLevel?: HeadingLevel;
|
|
24
|
+
/** Hide the name heading (e.g. inside `TerminalTabs`, where the tab already names it). */
|
|
25
|
+
hideName?: boolean;
|
|
26
|
+
messages?: WorkspaceMessagesProp;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* PersistentTerminal (atlas 22): one terminal session with its own lifecycle. A command
|
|
30
|
+
* returning never closes the session (`idle` says so); a stop request shows 「停止尚未确认」 until
|
|
31
|
+
* the adapter confirms it; `unknown` is never shown as ended.
|
|
32
|
+
*
|
|
33
|
+
* Accessibility: the console is `role="log"` with `aria-live="off"`, so streamed chunks are never
|
|
34
|
+
* read out one by one; the session status sits in a polite `role="status"` instead. The console
|
|
35
|
+
* is focusable for keyboard scrolling. The input is a labelled single-line field; Enter sends,
|
|
36
|
+
* except while an IME composition is active.
|
|
37
|
+
*
|
|
38
|
+
* `terminal.newerOutput` (the loaded snapshot is older than the session) adds 「有新输出,读取最新」
|
|
39
|
+
* (`onReadLatest`); `terminal.notes` render as small notes; `terminal.history` is an ordered list
|
|
40
|
+
* 「调用记录」 (command, glyph + status text, exit code, `<time>`) with `onLoadMoreHistory`. With
|
|
41
|
+
* `page` the stored output is read through a `ChunkPager` instead of the live tail.
|
|
42
|
+
*
|
|
43
|
+
* Motion: none. The cursor is a static block; the console follows new output only while the
|
|
44
|
+
* reader is at the bottom, otherwise a 「有新输出」 button appears.
|
|
45
|
+
*/
|
|
46
|
+
export declare const PersistentTerminal: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLElement>, "children" | "onInput"> & {
|
|
47
|
+
terminal: TerminalView;
|
|
48
|
+
/** Sends one line to the session. Without it (or when read-only) no input line is drawn. */
|
|
49
|
+
onInput?: AgentActionHandler<[text: string, terminal: TerminalView]>;
|
|
50
|
+
/** Requests a stop. Drawn only when `terminal.stoppable`. Also used by 「重试停止」. */
|
|
51
|
+
onStop?: AgentActionHandler<[terminal: TerminalView]>;
|
|
52
|
+
/** Loads older output (`terminal.outputTruncated`). The scroll position is kept. */
|
|
53
|
+
onLoadEarlier?: AgentActionHandler<[terminal: TerminalView]>;
|
|
54
|
+
/** Reads the newest output (`terminal.newerOutput`); draws 「有新输出,读取最新」. */
|
|
55
|
+
onReadLatest?: AgentActionHandler<[terminal: TerminalView]>;
|
|
56
|
+
/** Loads earlier entries of `terminal.history`. */
|
|
57
|
+
onLoadMoreHistory?: AgentActionHandler<[terminal: TerminalView]>;
|
|
58
|
+
/** One page of stored output; replaces the live tail with a `ChunkPager`. */
|
|
59
|
+
page?: MaterialPageView;
|
|
60
|
+
/** Paging callbacks for `page` (`canGoBack` defaults to false). */
|
|
61
|
+
pager?: Partial<ChunkPagerActions>;
|
|
62
|
+
headingLevel?: HeadingLevel;
|
|
63
|
+
/** Hide the name heading (e.g. inside `TerminalTabs`, where the tab already names it). */
|
|
64
|
+
hideName?: boolean;
|
|
65
|
+
messages?: WorkspaceMessagesProp;
|
|
66
|
+
} & React.RefAttributes<HTMLElement>>;
|
|
67
|
+
export type TerminalTabsProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'children' | 'onInput' | 'defaultValue'> & {
|
|
68
|
+
terminals: TerminalView[];
|
|
69
|
+
/** Active terminal id (controlled). */
|
|
70
|
+
value?: string;
|
|
71
|
+
defaultValue?: string;
|
|
72
|
+
onValueChange?: (id: string) => void;
|
|
73
|
+
onInput?: PersistentTerminalProps['onInput'];
|
|
74
|
+
onStop?: PersistentTerminalProps['onStop'];
|
|
75
|
+
onLoadEarlier?: PersistentTerminalProps['onLoadEarlier'];
|
|
76
|
+
onReadLatest?: PersistentTerminalProps['onReadLatest'];
|
|
77
|
+
onLoadMoreHistory?: PersistentTerminalProps['onLoadMoreHistory'];
|
|
78
|
+
headingLevel?: HeadingLevel;
|
|
79
|
+
messages?: WorkspaceMessagesProp;
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Several terminals as tabs (Tabs from `@wzrhine/react`: roving focus, arrow keys, Home / End).
|
|
83
|
+
* Each tab names the terminal and its status, so the status is readable without opening it.
|
|
84
|
+
*/
|
|
85
|
+
export declare function TerminalTabs({ terminals, value, defaultValue, onValueChange, onInput, onStop, onLoadEarlier, onReadLatest, onLoadMoreHistory, headingLevel, messages: override, className, ...rest }: TerminalTabsProps): React.JSX.Element;
|
|
86
|
+
//# sourceMappingURL=PersistentTerminal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PersistentTerminal.d.ts","sourceRoot":"","sources":["../../../src/components/workspace/PersistentTerminal.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { Button, Input, Tab, TabList, TabPanel, Tabs } from '@wzrhine/react';
|
|
5
|
+
import { terminalStatusMeta } from '@wzrhine/agent-core';
|
|
6
|
+
import { useAgentFormat, useAgentMessages } from '../../provider/AgentMessages.js';
|
|
7
|
+
import { ChunkPager } from '../tools/ChunkPager.js';
|
|
8
|
+
import { StatusGlyph } from '../../primitives/StatusGlyph.js';
|
|
9
|
+
import { AgentStatus, statusProps } from '../../primitives/AgentStatus.js';
|
|
10
|
+
import { AgentIcon } from '../../primitives/icons.js';
|
|
11
|
+
import { cx } from '../../utils/cx.js';
|
|
12
|
+
import { Heading, useWorkspaceMessages } from './shared.js';
|
|
13
|
+
/** Statuses in which the session accepts input. */
|
|
14
|
+
const INPUT_STATUSES = ['running', 'waiting-input'];
|
|
15
|
+
/** Statuses in which a stop request still makes sense. */
|
|
16
|
+
const STOP_STATUSES = ['opening', 'running', 'waiting-input', 'idle', 'unknown'];
|
|
17
|
+
/** Inherited / read-only terminals are history only: no input, no stop. */
|
|
18
|
+
export function isTerminalReadOnly(terminal) {
|
|
19
|
+
return Boolean(terminal.readOnly || terminal.inherited);
|
|
20
|
+
}
|
|
21
|
+
/** Distance from the bottom (in CSS pixels) that still counts as "following" the output. */
|
|
22
|
+
const FOLLOW_SLACK = 8;
|
|
23
|
+
/**
|
|
24
|
+
* PersistentTerminal (atlas 22): one terminal session with its own lifecycle. A command
|
|
25
|
+
* returning never closes the session (`idle` says so); a stop request shows 「停止尚未确认」 until
|
|
26
|
+
* the adapter confirms it; `unknown` is never shown as ended.
|
|
27
|
+
*
|
|
28
|
+
* Accessibility: the console is `role="log"` with `aria-live="off"`, so streamed chunks are never
|
|
29
|
+
* read out one by one; the session status sits in a polite `role="status"` instead. The console
|
|
30
|
+
* is focusable for keyboard scrolling. The input is a labelled single-line field; Enter sends,
|
|
31
|
+
* except while an IME composition is active.
|
|
32
|
+
*
|
|
33
|
+
* `terminal.newerOutput` (the loaded snapshot is older than the session) adds 「有新输出,读取最新」
|
|
34
|
+
* (`onReadLatest`); `terminal.notes` render as small notes; `terminal.history` is an ordered list
|
|
35
|
+
* 「调用记录」 (command, glyph + status text, exit code, `<time>`) with `onLoadMoreHistory`. With
|
|
36
|
+
* `page` the stored output is read through a `ChunkPager` instead of the live tail.
|
|
37
|
+
*
|
|
38
|
+
* Motion: none. The cursor is a static block; the console follows new output only while the
|
|
39
|
+
* reader is at the bottom, otherwise a 「有新输出」 button appears.
|
|
40
|
+
*/
|
|
41
|
+
export const PersistentTerminal = React.forwardRef(function PersistentTerminal({ terminal, onInput, onStop, onLoadEarlier, onReadLatest, onLoadMoreHistory, page, pager, headingLevel = 3, hideName = false, messages: override, className, ...rest }, ref) {
|
|
42
|
+
const m = useWorkspaceMessages(override);
|
|
43
|
+
const status = useAgentMessages().status;
|
|
44
|
+
const id = React.useId();
|
|
45
|
+
const nameId = `${id}-name`;
|
|
46
|
+
const readOnly = isTerminalReadOnly(terminal);
|
|
47
|
+
const meta = terminalStatusMeta[terminal.status];
|
|
48
|
+
const canInput = Boolean(onInput) && !readOnly && INPUT_STATUSES.includes(terminal.status);
|
|
49
|
+
const canStop = Boolean(onStop) && Boolean(terminal.stoppable) && !readOnly;
|
|
50
|
+
const stopPending = terminal.status === 'stop-pending';
|
|
51
|
+
const settled = terminal.status === 'ended' || terminal.status === 'failed';
|
|
52
|
+
return (_jsxs("section", { ...rest, ref: ref, className: cx('rl-agent-terminal', className), "aria-labelledby": nameId, "data-status": terminal.status, "data-readonly": readOnly || undefined, children: [_jsxs("header", { className: "rl-agent-terminal__header", children: [_jsx(AgentIcon, { name: "terminal", className: "rl-agent-terminal__icon" }), _jsxs("div", { className: "rl-agent-terminal__identity", children: [_jsx(Heading, { level: headingLevel, id: nameId, className: hideName ? 'rl-agent-sr' : 'rl-agent-terminal__name', children: terminal.name }), _jsx("span", { className: "rl-agent-terminal__id", children: terminal.id }), terminal.backend && _jsx("span", { className: "rl-agent-terminal__backend", children: m.terminalBackend[terminal.backend] }), terminal.shell && _jsx("span", { className: "rl-agent-terminal__shell", children: terminal.shell })] }), _jsxs("span", { role: "status", className: "rl-agent-terminal__status", children: [_jsx(AgentStatus, { ...statusProps(meta, status.terminal[terminal.status]) }), settled && terminal.exitCode !== undefined && _jsx("span", { className: "rl-agent-terminal__exit", children: m.terminalExitCode(terminal.exitCode) })] }), canStop && !stopPending && STOP_STATUSES.includes(terminal.status) && (_jsx(Button, { size: "sm", variant: "secondary", className: "rl-agent-terminal__stop", iconStart: _jsx(AgentIcon, { name: "stop" }), "aria-label": m.terminalStop(terminal.name), onClick: () => void onStop(terminal), children: m.terminalStopVisible }))] }), terminal.cwd && (_jsxs("p", { className: "rl-agent-terminal__cwd", title: terminal.cwd, children: [_jsx("span", { className: "rl-agent-terminal__cwd-label", children: m.terminalCwd }), _jsx("span", { className: "rl-agent-terminal__cwd-path", children: terminal.cwd })] })), readOnly && (_jsxs("p", { className: "rl-agent-terminal__notice", "data-tone": "neutral", children: [_jsx(AgentIcon, { name: "history" }), m.terminalReadOnly] })), stopPending && (_jsxs("div", { className: "rl-agent-terminal__notice", "data-tone": "warning", children: [_jsx(AgentIcon, { name: "warning" }), _jsx("span", { children: m.terminalStopPending }), canStop && (_jsx(Button, { size: "sm", variant: "ghost", iconStart: _jsx(AgentIcon, { name: "retry" }), onClick: () => void onStop(terminal), children: m.terminalRetryStop }))] })), terminal.status === 'unknown' && (_jsxs("p", { className: "rl-agent-terminal__notice", "data-tone": "warning", children: [_jsx(AgentIcon, { name: "warning" }), m.terminalUnknownNotice] })), terminal.status === 'idle' && !readOnly && (_jsxs("p", { className: "rl-agent-terminal__notice", "data-tone": "neutral", children: [_jsx(AgentIcon, { name: "info" }), m.terminalIdleNotice] })), terminal.receipt && (terminal.receipt.status === 'rejected' || terminal.receipt.status === 'unknown') && (_jsxs("p", { className: "rl-agent-terminal__notice", "data-tone": terminal.receipt.status === 'rejected' ? 'danger' : 'warning', children: [_jsx(AgentIcon, { name: "warning" }), status.action[terminal.receipt.status], terminal.receipt.reason ? ` · ${terminal.receipt.reason}` : ''] })), terminal.notes && terminal.notes.length > 0 && (_jsx("ul", { className: "rl-agent-terminal__notes", "aria-label": m.terminalNotes, children: terminal.notes.map((note, i) => (_jsxs("li", { className: "rl-agent-terminal__note", children: [_jsx(AgentIcon, { name: "info" }), _jsx("span", { children: note })] }, i))) })), terminal.newerOutput && onReadLatest && (_jsx("div", { className: "rl-agent-terminal__latest", children: _jsx(Button, { size: "sm", variant: "secondary", iconStart: _jsx(AgentIcon, { name: "arrow-down" }), onClick: () => void onReadLatest(terminal), children: m.terminalReadLatest }) })), page ? (_jsx(ChunkPager, { ...pager, className: "rl-agent-terminal__pager", page: page, label: m.terminalOutput(terminal.name), canGoBack: pager?.canGoBack ?? false })) : (_jsx(TerminalConsole, { terminal: terminal, messages: m, onLoadEarlier: onLoadEarlier, showCursor: canInput })), canInput && _jsx(TerminalInput, { terminal: terminal, onInput: onInput, messages: m }), terminal.history && terminal.history.length > 0 && (_jsx(TerminalHistory, { terminal: terminal, onLoadMore: onLoadMoreHistory, messages: m }))] }));
|
|
53
|
+
});
|
|
54
|
+
function TerminalConsole({ terminal, messages: m, onLoadEarlier, showCursor, }) {
|
|
55
|
+
const scrollRef = React.useRef(null);
|
|
56
|
+
const following = React.useRef(true);
|
|
57
|
+
const anchorFromBottom = React.useRef(null);
|
|
58
|
+
const [hasNew, setHasNew] = React.useState(false);
|
|
59
|
+
const output = terminal.output ?? '';
|
|
60
|
+
React.useLayoutEffect(() => {
|
|
61
|
+
const el = scrollRef.current;
|
|
62
|
+
if (!el)
|
|
63
|
+
return;
|
|
64
|
+
if (anchorFromBottom.current !== null) {
|
|
65
|
+
// Older output was prepended: keep the same lines under the reader's eyes.
|
|
66
|
+
el.scrollTop = el.scrollHeight - anchorFromBottom.current;
|
|
67
|
+
anchorFromBottom.current = null;
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (following.current)
|
|
71
|
+
el.scrollTop = el.scrollHeight;
|
|
72
|
+
else
|
|
73
|
+
setHasNew(true);
|
|
74
|
+
}, [output]);
|
|
75
|
+
const onScroll = () => {
|
|
76
|
+
const el = scrollRef.current;
|
|
77
|
+
if (!el)
|
|
78
|
+
return;
|
|
79
|
+
const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight <= FOLLOW_SLACK;
|
|
80
|
+
following.current = atBottom;
|
|
81
|
+
if (atBottom)
|
|
82
|
+
setHasNew(false);
|
|
83
|
+
};
|
|
84
|
+
const jumpToLatest = () => {
|
|
85
|
+
const el = scrollRef.current;
|
|
86
|
+
following.current = true;
|
|
87
|
+
setHasNew(false);
|
|
88
|
+
if (el)
|
|
89
|
+
el.scrollTop = el.scrollHeight;
|
|
90
|
+
el?.focus();
|
|
91
|
+
};
|
|
92
|
+
const loadEarlier = () => {
|
|
93
|
+
const el = scrollRef.current;
|
|
94
|
+
if (el)
|
|
95
|
+
anchorFromBottom.current = el.scrollHeight - el.scrollTop;
|
|
96
|
+
void onLoadEarlier?.(terminal);
|
|
97
|
+
};
|
|
98
|
+
return (_jsxs("div", { className: "rl-agent-terminal__console-wrap", children: [(terminal.outputTruncated || terminal.partialCapture) && (_jsxs("div", { className: "rl-agent-terminal__console-meta", children: [terminal.outputTruncated && onLoadEarlier && (_jsx(Button, { size: "sm", variant: "ghost", iconStart: _jsx(AgentIcon, { name: "arrow-up" }), onClick: loadEarlier, children: m.terminalLoadEarlier })), terminal.partialCapture && (_jsxs("span", { className: "rl-agent-terminal__partial", children: [_jsx(AgentIcon, { name: "warning" }), m.terminalPartialCapture] }))] })), _jsx("div", { ref: scrollRef, className: "rl-agent-terminal__console", role: "log", "aria-live": "off", "aria-label": m.terminalOutput(terminal.name), tabIndex: 0, onScroll: onScroll, children: output ? (_jsxs("pre", { className: "rl-agent-terminal__output", children: [output, showCursor && _jsx("span", { className: "rl-agent-terminal__cursor", "aria-hidden": "true" })] })) : (_jsx("p", { className: "rl-agent-terminal__empty", children: m.terminalNoOutput })) }), hasNew && (_jsx(Button, { size: "sm", variant: "secondary", className: "rl-agent-terminal__new", iconStart: _jsx(AgentIcon, { name: "arrow-down" }), onClick: jumpToLatest, children: m.terminalNewOutput }))] }));
|
|
99
|
+
}
|
|
100
|
+
const historyGlyph = {
|
|
101
|
+
running: { glyph: 'active', tone: 'info' },
|
|
102
|
+
returned: { glyph: 'done', tone: 'success' },
|
|
103
|
+
failed: { glyph: 'failed', tone: 'danger' },
|
|
104
|
+
unknown: { glyph: 'unknown', tone: 'warning' },
|
|
105
|
+
};
|
|
106
|
+
function TerminalHistory({ terminal, onLoadMore, messages: m, }) {
|
|
107
|
+
const format = useAgentFormat();
|
|
108
|
+
const id = React.useId();
|
|
109
|
+
const items = terminal.history ?? [];
|
|
110
|
+
return (_jsxs("section", { className: "rl-agent-terminal__history", "aria-labelledby": `${id}-title`, children: [_jsx("p", { id: `${id}-title`, className: "rl-agent-terminal__history-title", children: m.terminalHistory }), onLoadMore && (_jsx(Button, { size: "sm", variant: "ghost", className: "rl-agent-terminal__history-more", iconStart: _jsx(AgentIcon, { name: "arrow-up" }), onClick: () => void onLoadMore(terminal), children: m.terminalHistoryLoadMore })), _jsx("ol", { className: "rl-agent-terminal__history-list", children: items.map((item) => {
|
|
111
|
+
const g = historyGlyph[item.status] ?? historyGlyph.unknown;
|
|
112
|
+
return (_jsxs("li", { className: "rl-agent-terminal__history-item", "data-status": item.status, children: [_jsx("code", { className: "rl-agent-terminal__history-command", title: item.command, children: item.command }), _jsxs("span", { className: "rl-agent-terminal__history-status", "data-tone": g.tone, children: [_jsx(StatusGlyph, { name: g.glyph, tone: g.tone }), _jsx("span", { children: m.terminalHistoryStatus[item.status] ?? m.terminalHistoryStatus.unknown })] }), item.exitCode !== undefined && _jsx("span", { className: "rl-agent-terminal__history-exit", children: m.terminalExitCode(item.exitCode) }), item.at && (_jsx("time", { className: "rl-agent-terminal__history-time", dateTime: item.at, children: format.time(item.at) }))] }, item.id));
|
|
113
|
+
}) })] }));
|
|
114
|
+
}
|
|
115
|
+
function TerminalInput({ terminal, onInput, messages: m, }) {
|
|
116
|
+
const [draft, setDraft] = React.useState('');
|
|
117
|
+
const composing = React.useRef(false);
|
|
118
|
+
const inputId = React.useId();
|
|
119
|
+
const send = () => {
|
|
120
|
+
const text = draft;
|
|
121
|
+
setDraft('');
|
|
122
|
+
void onInput(text, terminal);
|
|
123
|
+
};
|
|
124
|
+
return (_jsxs("form", { className: "rl-agent-terminal__input", onSubmit: (event) => {
|
|
125
|
+
event.preventDefault();
|
|
126
|
+
send();
|
|
127
|
+
}, children: [_jsx("label", { htmlFor: inputId, className: "rl-agent-sr", children: m.terminalInputLabel(terminal.name) }), _jsx("span", { className: "rl-agent-terminal__prompt", "aria-hidden": "true", children: ">" }), _jsx(Input, { id: inputId, size: "sm", mono: true, className: "rl-agent-terminal__field", value: draft, placeholder: m.terminalInputPlaceholder, autoComplete: "off", spellCheck: false, onChange: (event) => setDraft(event.currentTarget.value), onCompositionStart: () => {
|
|
128
|
+
composing.current = true;
|
|
129
|
+
}, onCompositionEnd: () => {
|
|
130
|
+
composing.current = false;
|
|
131
|
+
}, onKeyDown: (event) => {
|
|
132
|
+
if (event.key !== 'Enter')
|
|
133
|
+
return;
|
|
134
|
+
// IME guard (ADR-0011 §8): composition flag, native isComposing and keyCode 229.
|
|
135
|
+
if (composing.current || event.nativeEvent.isComposing || event.keyCode === 229) {
|
|
136
|
+
event.preventDefault();
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
event.preventDefault();
|
|
140
|
+
send();
|
|
141
|
+
} }), _jsx(Button, { type: "submit", size: "sm", variant: "secondary", className: "rl-agent-terminal__send", iconStart: _jsx(AgentIcon, { name: "send" }), children: m.terminalSend })] }));
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Several terminals as tabs (Tabs from `@wzrhine/react`: roving focus, arrow keys, Home / End).
|
|
145
|
+
* Each tab names the terminal and its status, so the status is readable without opening it.
|
|
146
|
+
*/
|
|
147
|
+
export function TerminalTabs({ terminals, value, defaultValue, onValueChange, onInput, onStop, onLoadEarlier, onReadLatest, onLoadMoreHistory, headingLevel, messages: override, className, ...rest }) {
|
|
148
|
+
const m = useWorkspaceMessages(override);
|
|
149
|
+
const status = useAgentMessages().status;
|
|
150
|
+
if (terminals.length === 0) {
|
|
151
|
+
return (_jsx("p", { ...rest, className: cx('rl-agent-terminal-tabs__empty', className), children: m.terminalEmpty }));
|
|
152
|
+
}
|
|
153
|
+
return (_jsx("div", { ...rest, className: cx('rl-agent-terminal-tabs', className), children: _jsxs(Tabs, { value: value, defaultValue: value === undefined ? (defaultValue ?? terminals[0].id) : undefined, onValueChange: onValueChange, size: "sm", children: [_jsx(TabList, { "aria-label": m.terminalTabs, children: terminals.map((terminal) => (_jsx(Tab, { value: terminal.id, meta: status.terminal[terminal.status], children: terminal.name }, terminal.id))) }), terminals.map((terminal) => (_jsx(TabPanel, { value: terminal.id, className: "rl-agent-terminal-tabs__panel", children: _jsx(PersistentTerminal, { terminal: terminal, onInput: onInput, onStop: onStop, onLoadEarlier: onLoadEarlier, onReadLatest: onReadLatest, onLoadMoreHistory: onLoadMoreHistory, headingLevel: headingLevel, hideName: true, messages: override }) }, terminal.id)))] }) }));
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=PersistentTerminal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PersistentTerminal.js","sourceRoot":"","sources":["../../../src/components/workspace/PersistentTerminal.tsx"],"names":[],"mappings":"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"}
|