@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,58 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { ToolCallView } from '@wzrhine/agent-core';
|
|
3
|
+
import type { ToolDetailActions } from './ToolDetails.js';
|
|
4
|
+
/**
|
|
5
|
+
* ToolRecord (atlas 12): one tool call. The whole row is the disclosure trigger (a real
|
|
6
|
+
* `<button>` from `@wzrhine/react` Collapsible, `aria-expanded` / `aria-controls`) whose
|
|
7
|
+
* accessible name reads category, name, subject, summary, status and elapsed time. The raw tool
|
|
8
|
+
* name is in the name's `title` and in the details.
|
|
9
|
+
*
|
|
10
|
+
* Details mount on first open (the panel is unmounted while closed). When
|
|
11
|
+
* `tool.detailsLoaded === false`, opening calls `onLoadDetails(id)` once and shows a skeleton in
|
|
12
|
+
* an `aria-busy` container until the adapter delivers the record; `detailsError` shows the
|
|
13
|
+
* failure with a retry that calls `onLoadDetails` again. A summary is never presented as the full
|
|
14
|
+
* record. The expanded state lives here (or in `expanded` / `onExpandedChange`) and survives any
|
|
15
|
+
* status change. Height animates through Collapsible (CSS, interruptible, instant when reduced);
|
|
16
|
+
* the row itself has no layout animation.
|
|
17
|
+
*/
|
|
18
|
+
export type ToolRecordProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> & {
|
|
19
|
+
tool: ToolCallView;
|
|
20
|
+
expanded?: boolean;
|
|
21
|
+
defaultExpanded?: boolean;
|
|
22
|
+
onExpandedChange?: (expanded: boolean, id: string) => void;
|
|
23
|
+
/** Called when the row opens and `tool.detailsLoaded === false`, and on retry. */
|
|
24
|
+
onLoadDetails?: (id: string) => void;
|
|
25
|
+
/** Loading the full record failed (shown with a retry when `onLoadDetails` exists). */
|
|
26
|
+
detailsError?: React.ReactNode;
|
|
27
|
+
detailsLoading?: boolean;
|
|
28
|
+
onRetry?: (tool: ToolCallView) => void;
|
|
29
|
+
/** Override the detail body. Return `undefined` to fall back to the built-in view. */
|
|
30
|
+
renderDetail?: (tool: ToolCallView) => React.ReactNode | undefined;
|
|
31
|
+
/** Callbacks for the built-in detail views (read more, reload, open terminal…). */
|
|
32
|
+
detailActions?: ToolDetailActions;
|
|
33
|
+
/** Controls placed next to the row (outside the trigger button), e.g. 「在对话中定位」. */
|
|
34
|
+
actions?: React.ReactNode;
|
|
35
|
+
/** Extra content at the end of the details (e.g. Code Mode script). */
|
|
36
|
+
detailsFooter?: React.ReactNode;
|
|
37
|
+
};
|
|
38
|
+
export declare const ToolRecord: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLDivElement>, "children"> & {
|
|
39
|
+
tool: ToolCallView;
|
|
40
|
+
expanded?: boolean;
|
|
41
|
+
defaultExpanded?: boolean;
|
|
42
|
+
onExpandedChange?: (expanded: boolean, id: string) => void;
|
|
43
|
+
/** Called when the row opens and `tool.detailsLoaded === false`, and on retry. */
|
|
44
|
+
onLoadDetails?: (id: string) => void;
|
|
45
|
+
/** Loading the full record failed (shown with a retry when `onLoadDetails` exists). */
|
|
46
|
+
detailsError?: React.ReactNode;
|
|
47
|
+
detailsLoading?: boolean;
|
|
48
|
+
onRetry?: (tool: ToolCallView) => void;
|
|
49
|
+
/** Override the detail body. Return `undefined` to fall back to the built-in view. */
|
|
50
|
+
renderDetail?: (tool: ToolCallView) => React.ReactNode | undefined;
|
|
51
|
+
/** Callbacks for the built-in detail views (read more, reload, open terminal…). */
|
|
52
|
+
detailActions?: ToolDetailActions;
|
|
53
|
+
/** Controls placed next to the row (outside the trigger button), e.g. 「在对话中定位」. */
|
|
54
|
+
actions?: React.ReactNode;
|
|
55
|
+
/** Extra content at the end of the details (e.g. Code Mode script). */
|
|
56
|
+
detailsFooter?: React.ReactNode;
|
|
57
|
+
} & React.RefAttributes<HTMLDivElement>>;
|
|
58
|
+
//# sourceMappingURL=ToolRecord.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolRecord.d.ts","sourceRoot":"","sources":["../../../src/components/tools/ToolRecord.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAG1D;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,GAAG;IACrF,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,kFAAkF;IAClF,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,uFAAuF;IACvF,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IACvC,sFAAsF;IACtF,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;IACnE,mFAAmF;IACnF,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,mFAAmF;IACnF,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,uEAAuE;IACvE,aAAa,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACjC,CAAC;AAEF,eAAO,MAAM,UAAU;UApBf,YAAY;eACP,OAAO;sBACA,OAAO;uBACN,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,KAAK,IAAI;IAC1D,kFAAkF;oBAClE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI;IACpC,uFAAuF;mBACxE,KAAK,CAAC,SAAS;qBACb,OAAO;cACd,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI;IACtC,sFAAsF;mBACvE,CAAC,IAAI,EAAE,YAAY,KAAK,KAAK,CAAC,SAAS,GAAG,SAAS;IAClE,mFAAmF;oBACnE,iBAAiB;IACjC,mFAAmF;cACzE,KAAK,CAAC,SAAS;IACzB,uEAAuE;oBACvD,KAAK,CAAC,SAAS;wCA2H/B,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { toolStatusMeta } from '@wzrhine/agent-core';
|
|
5
|
+
import { Collapsible, Skeleton } from '@wzrhine/react';
|
|
6
|
+
import { useAgentFormat, useAgentMessages } from '../../provider/AgentMessages.js';
|
|
7
|
+
import { cx } from '../../utils/cx.js';
|
|
8
|
+
import { ToolDetail } from './ToolDetails.js';
|
|
9
|
+
import { ActionButton, ToolCategoryChip, Notice, ToolStatusPill } from './shared.js';
|
|
10
|
+
export const ToolRecord = React.forwardRef(function ToolRecord({ tool, expanded, defaultExpanded = false, onExpandedChange, onLoadDetails, detailsError, detailsLoading = false, onRetry, renderDetail, detailActions, actions, detailsFooter, className, ...rest }, ref) {
|
|
11
|
+
const messages = useAgentMessages();
|
|
12
|
+
const m = messages.tools;
|
|
13
|
+
const fmt = useAgentFormat();
|
|
14
|
+
const [innerOpen, setInnerOpen] = React.useState(defaultExpanded);
|
|
15
|
+
const open = expanded ?? innerOpen;
|
|
16
|
+
const requested = React.useRef(false);
|
|
17
|
+
const needsLoad = tool.detailsLoaded === false || detailsLoading;
|
|
18
|
+
const disabled = Boolean(tool.disabled);
|
|
19
|
+
// One request per row while the record is missing; StrictMode-safe via the ref.
|
|
20
|
+
React.useEffect(() => {
|
|
21
|
+
if (!needsLoad) {
|
|
22
|
+
requested.current = false;
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (open && !requested.current && onLoadDetails && detailsError == null) {
|
|
26
|
+
requested.current = true;
|
|
27
|
+
onLoadDetails(tool.id);
|
|
28
|
+
}
|
|
29
|
+
}, [open, needsLoad, onLoadDetails, detailsError, tool.id]);
|
|
30
|
+
const setOpen = (next) => {
|
|
31
|
+
if (expanded === undefined)
|
|
32
|
+
setInnerOpen(next);
|
|
33
|
+
onExpandedChange?.(next, tool.id);
|
|
34
|
+
};
|
|
35
|
+
const category = tool.category ?? 'other';
|
|
36
|
+
const name = tool.displayName ?? tool.name;
|
|
37
|
+
const statusLabel = messages.status.tool[tool.status] ?? tool.status;
|
|
38
|
+
const elapsed = tool.elapsedMs != null ? fmt.duration(tool.elapsedMs) : undefined;
|
|
39
|
+
const label = m.rowLabel({
|
|
40
|
+
category: messages.status.category[category],
|
|
41
|
+
name,
|
|
42
|
+
subject: tool.subject,
|
|
43
|
+
summary: tool.summary,
|
|
44
|
+
status: statusLabel,
|
|
45
|
+
elapsed: elapsed ? messages.status.elapsed(elapsed) : undefined,
|
|
46
|
+
});
|
|
47
|
+
const meta = toolStatusMeta[tool.status] ?? toolStatusMeta.unknown;
|
|
48
|
+
const trigger = (_jsxs("span", { className: "rl-agent-tool-row", children: [_jsx(ToolCategoryChip, { category: category, className: "rl-agent-tool-row__chip" }), _jsxs("span", { className: "rl-agent-tool-row__main", children: [_jsx("span", { className: "rl-agent-tool-row__name", title: tool.name, children: name }), tool.subject && (_jsx("span", { className: "rl-agent-tool-row__subject", title: tool.subject, children: tool.subject })), tool.summary && _jsx("span", { className: "rl-agent-tool-row__summary", children: tool.summary })] }), _jsxs("span", { className: "rl-agent-tool-row__status", children: [_jsx(ToolStatusPill, { status: tool.status }), elapsed && _jsx("span", { className: "rl-agent-tool-row__elapsed", children: elapsed })] })] }));
|
|
49
|
+
return (_jsx("div", { ...rest, ref: ref, className: cx('rl-agent-tool', className), "data-status": tool.status, "data-category": category, "data-active": meta.active || undefined, "data-tool-id": tool.id, "data-disabled": disabled || undefined, children: _jsxs("div", { className: "rl-agent-tool__head", children: [tool.failure && _jsxs(Notice, { tone: "danger", action: tool.failure.retryable && onRetry && _jsx(ActionButton, { icon: "retry", onClick: () => onRetry(tool), children: m.retry }), children: [_jsx("code", { children: tool.failure.code }), " ", tool.failure.message] }), _jsx(Collapsible, { className: "rl-agent-tool__disclosure", open: open, disabled: disabled, onOpenChange: setOpen, trigger: trigger, triggerProps: {
|
|
50
|
+
className: 'rl-agent-tool__trigger',
|
|
51
|
+
'aria-label': label,
|
|
52
|
+
}, panelClassName: "rl-agent-tool__panel", children: _jsx(ToolRecordDetails, { tool: tool, name: name, needsLoad: needsLoad, detailsError: detailsError, onRetry: onLoadDetails ? () => onLoadDetails(tool.id) : undefined, renderDetail: renderDetail, detailActions: detailActions, footer: detailsFooter }) }), actions != null && _jsx("div", { className: "rl-agent-tool__actions", children: actions })] }) }));
|
|
53
|
+
});
|
|
54
|
+
function ToolRecordDetails({ tool, name, needsLoad, detailsError, onRetry, renderDetail, detailActions, footer, }) {
|
|
55
|
+
const messages = useAgentMessages();
|
|
56
|
+
const m = messages.tools;
|
|
57
|
+
const auth = tool.authorization;
|
|
58
|
+
let body;
|
|
59
|
+
if (needsLoad && detailsError != null) {
|
|
60
|
+
body = (_jsx(Notice, { tone: "danger", action: onRetry && (_jsx(ActionButton, { icon: "retry", onClick: onRetry, children: m.retry })), children: detailsError === true || detailsError === '' ? m.detailsError : detailsError }));
|
|
61
|
+
}
|
|
62
|
+
else if (needsLoad) {
|
|
63
|
+
body = (_jsxs("div", { className: "rl-agent-tool__loading", "aria-busy": "true", children: [_jsx(Skeleton, { shape: "text", lines: 3 }), _jsx("p", { className: "rl-agent-tool__loading-text", role: "status", children: m.loadingDetails })] }));
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
const custom = renderDetail?.(tool);
|
|
67
|
+
body =
|
|
68
|
+
custom !== undefined ? (custom) : tool.detail ? (_jsx(ToolDetail, { tool: tool, ...detailActions })) : (_jsx("p", { className: "rl-agent-detail__aside", children: m.noDetails }));
|
|
69
|
+
}
|
|
70
|
+
const receipt = tool.receipt && tool.receipt.status !== 'idle' ? tool.receipt : undefined;
|
|
71
|
+
return (_jsxs("div", { className: "rl-agent-tool__details", role: "group", "aria-label": m.detailsRegion(name), children: [_jsxs("p", { className: "rl-agent-tool__facts", children: [_jsx("code", { className: "rl-agent-tool__raw", title: m.rawName(tool.name), children: tool.name }), auth && _jsx("span", { className: "rl-agent-tool__auth", children: m.authorization(m.authorizationDecision[auth.decision], auth.source) })] }), body, receipt && (_jsxs(Notice, { tone: receipt.status === 'unknown'
|
|
72
|
+
? 'warning'
|
|
73
|
+
: receipt.status === 'rejected'
|
|
74
|
+
? 'danger'
|
|
75
|
+
: receipt.status === 'accepted'
|
|
76
|
+
? 'success'
|
|
77
|
+
: 'info', children: [m.receipt[receipt.status], receipt.reason ? ` · ${receipt.reason}` : ''] })), footer] }));
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=ToolRecord.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolRecord.js","sourceRoot":"","sources":["../../../src/components/tools/ToolRecord.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { AgentTone, StatusGlyphName, ToolCategory, ToolStatus } from '@wzrhine/agent-core';
|
|
3
|
+
import type { AgentIconName } from '../../primitives/icons.js';
|
|
4
|
+
/** Icon + tone per tool category. Tone is never the only signal: the chip always has text. */
|
|
5
|
+
export declare const categoryMeta: Record<ToolCategory, {
|
|
6
|
+
icon: AgentIconName;
|
|
7
|
+
tone: AgentTone | 'ink';
|
|
8
|
+
}>;
|
|
9
|
+
export declare function ToolCategoryChip({ category, className }: {
|
|
10
|
+
category?: ToolCategory | (string & {});
|
|
11
|
+
className?: string;
|
|
12
|
+
}): React.JSX.Element;
|
|
13
|
+
/** Status pill for a tool status: glyph + shared label (+ meta). */
|
|
14
|
+
export declare function ToolStatusPill({ status, meta, appearance, }: {
|
|
15
|
+
status: ToolStatus;
|
|
16
|
+
meta?: React.ReactNode;
|
|
17
|
+
appearance?: 'pill' | 'inline';
|
|
18
|
+
}): React.JSX.Element;
|
|
19
|
+
/** Plain glyph + tone + label pill for local enums (diff status, execution state…). */
|
|
20
|
+
export declare function Pill({ glyph, tone, label, active, }: {
|
|
21
|
+
glyph: StatusGlyphName;
|
|
22
|
+
tone: AgentTone;
|
|
23
|
+
label: React.ReactNode;
|
|
24
|
+
active?: boolean;
|
|
25
|
+
}): React.JSX.Element;
|
|
26
|
+
/** Copy text to the clipboard. `onCopyText` replaces the default `navigator.clipboard` write. */
|
|
27
|
+
export declare function CopyButton({ text, label, onCopyText, className, }: {
|
|
28
|
+
text: string;
|
|
29
|
+
/** Accessible name; defaults to 「复制」. */
|
|
30
|
+
label?: string;
|
|
31
|
+
onCopyText?: (text: string) => void | Promise<void>;
|
|
32
|
+
className?: string;
|
|
33
|
+
}): React.JSX.Element;
|
|
34
|
+
/** Small text button used for in-detail actions (load more, reload, open terminal). */
|
|
35
|
+
export declare function ActionButton({ children, icon, onClick, tone, disabled, busy, describedBy, }: {
|
|
36
|
+
children: React.ReactNode;
|
|
37
|
+
icon?: AgentIconName;
|
|
38
|
+
onClick: () => void;
|
|
39
|
+
tone?: 'accent' | 'neutral';
|
|
40
|
+
disabled?: boolean;
|
|
41
|
+
busy?: boolean;
|
|
42
|
+
describedBy?: string;
|
|
43
|
+
}): React.JSX.Element;
|
|
44
|
+
/**
|
|
45
|
+
* Bounded, horizontally scrollable code view. Optional line numbers start at `startLine` and are
|
|
46
|
+
* `aria-hidden` + unselectable, so copying the code never copies the gutter. The scroller is a
|
|
47
|
+
* focusable named region, so keyboard users can scroll it.
|
|
48
|
+
*/
|
|
49
|
+
export declare function CodeView({ code, label, startLine, tone, className, }: {
|
|
50
|
+
code: string;
|
|
51
|
+
label: string;
|
|
52
|
+
/** Show a line-number gutter starting at this 1-based line. */
|
|
53
|
+
startLine?: number;
|
|
54
|
+
tone?: 'surface' | 'inverse';
|
|
55
|
+
className?: string;
|
|
56
|
+
}): React.JSX.Element;
|
|
57
|
+
export interface MetaEntry {
|
|
58
|
+
label: React.ReactNode;
|
|
59
|
+
value: React.ReactNode;
|
|
60
|
+
mono?: boolean;
|
|
61
|
+
}
|
|
62
|
+
/** Key/value facts of a detail view (`<dl>`); entries with an empty value are dropped. */
|
|
63
|
+
export declare function MetaList({ items, label, className, }: {
|
|
64
|
+
items: Array<MetaEntry | false | null | undefined | ''>;
|
|
65
|
+
label?: string;
|
|
66
|
+
className?: string;
|
|
67
|
+
}): React.JSX.Element | null;
|
|
68
|
+
/** One-line notice inside a detail: icon + text, toned. Not a live region. */
|
|
69
|
+
export declare function Notice({ tone, children, action, id, }: {
|
|
70
|
+
tone?: 'neutral' | 'info' | 'warning' | 'danger' | 'success';
|
|
71
|
+
children: React.ReactNode;
|
|
72
|
+
action?: React.ReactNode;
|
|
73
|
+
id?: string;
|
|
74
|
+
}): React.JSX.Element;
|
|
75
|
+
/** Pretty-print JSON content; anything that does not parse is returned untouched. */
|
|
76
|
+
export declare function prettyJson(content: string): string;
|
|
77
|
+
/** Serialise an arbitrary value for display (strings stay as-is unless they hold JSON). */
|
|
78
|
+
export declare function toDisplayJson(value: unknown): string;
|
|
79
|
+
/** Maximum number of rows that still get an entrance when they arrive together. */
|
|
80
|
+
export declare const ENTRANCE_BATCH_LIMIT = 20;
|
|
81
|
+
/**
|
|
82
|
+
* Tracks which ids appeared after the first render. Returns, per id, its index within the batch
|
|
83
|
+
* that just arrived (for stagger) or `-1` for rows present at mount / already seen. Batches larger
|
|
84
|
+
* than `ENTRANCE_BATCH_LIMIT` get no entrance at all (history restore, page loads).
|
|
85
|
+
*/
|
|
86
|
+
export declare function useFreshIndex(ids: readonly string[]): (id: string) => number;
|
|
87
|
+
/** Statuses that mean "still moving". */
|
|
88
|
+
export declare const ACTIVE_TOOL_STATUSES: readonly ToolStatus[];
|
|
89
|
+
export declare const FAILED_TOOL_STATUSES: readonly ToolStatus[];
|
|
90
|
+
/** Fixed display order for aggregated status counts. */
|
|
91
|
+
export declare const TOOL_STATUS_ORDER: readonly ToolStatus[];
|
|
92
|
+
export declare function countStatuses(statuses: readonly ToolStatus[]): Array<[ToolStatus, number]>;
|
|
93
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/components/tools/shared.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { toolStatusMeta } from '@wzrhine/agent-core';
|
|
5
|
+
import { useAgentMessages } from '../../provider/AgentMessages.js';
|
|
6
|
+
import { AgentIcon } from '../../primitives/icons.js';
|
|
7
|
+
import { AgentStatus } from '../../primitives/AgentStatus.js';
|
|
8
|
+
import { cx } from '../../utils/cx.js';
|
|
9
|
+
/*
|
|
10
|
+
* Small building blocks shared by the tools family: category chip, copy button, bounded code
|
|
11
|
+
* view, key/value list, inline notice and the "fresh rows" tracker that decides which rows get a
|
|
12
|
+
* first entrance. Internal to the family (only the types that leak into public props are exported
|
|
13
|
+
* from the package entry).
|
|
14
|
+
*/
|
|
15
|
+
/** Icon + tone per tool category. Tone is never the only signal: the chip always has text. */
|
|
16
|
+
export const categoryMeta = {
|
|
17
|
+
read: { icon: 'file', tone: 'info' },
|
|
18
|
+
write: { icon: 'edit', tone: 'accent' },
|
|
19
|
+
execute: { icon: 'terminal', tone: 'ink' },
|
|
20
|
+
network: { icon: 'globe', tone: 'info' },
|
|
21
|
+
model: { icon: 'model', tone: 'neutral' },
|
|
22
|
+
agent: { icon: 'agent', tone: 'neutral' },
|
|
23
|
+
question: { icon: 'question', tone: 'neutral' },
|
|
24
|
+
other: { icon: 'tool', tone: 'neutral' },
|
|
25
|
+
};
|
|
26
|
+
export function ToolCategoryChip({ category = 'other', className }) {
|
|
27
|
+
const m = useAgentMessages();
|
|
28
|
+
const meta = categoryMeta[category] ?? categoryMeta.other;
|
|
29
|
+
return (_jsxs("span", { className: cx('rl-agent-tool-chip', className), "data-category": category, "data-tone": meta.tone, children: [_jsx(AgentIcon, { name: meta.icon }), _jsx("span", { className: "rl-agent-tool-chip__label", children: m.status.category[category] ?? category })] }));
|
|
30
|
+
}
|
|
31
|
+
/** Status pill for a tool status: glyph + shared label (+ meta). */
|
|
32
|
+
export function ToolStatusPill({ status, meta, appearance, }) {
|
|
33
|
+
const m = useAgentMessages();
|
|
34
|
+
const s = toolStatusMeta[status] ?? toolStatusMeta.unknown;
|
|
35
|
+
return (_jsx(AgentStatus, { glyph: s.glyph, tone: s.tone, active: s.active, label: m.status.tool[status] ?? status, meta: meta, appearance: appearance }));
|
|
36
|
+
}
|
|
37
|
+
/** Plain glyph + tone + label pill for local enums (diff status, execution state…). */
|
|
38
|
+
export function Pill({ glyph, tone, label, active, }) {
|
|
39
|
+
return _jsx(AgentStatus, { glyph: glyph, tone: tone, label: label, active: active });
|
|
40
|
+
}
|
|
41
|
+
/** Copy text to the clipboard. `onCopyText` replaces the default `navigator.clipboard` write. */
|
|
42
|
+
export function CopyButton({ text, label, onCopyText, className, }) {
|
|
43
|
+
const m = useAgentMessages().tools;
|
|
44
|
+
const [state, setState] = React.useState('idle');
|
|
45
|
+
const timer = React.useRef(undefined);
|
|
46
|
+
React.useEffect(() => () => clearTimeout(timer.current), []);
|
|
47
|
+
const copy = async () => {
|
|
48
|
+
try {
|
|
49
|
+
if (onCopyText)
|
|
50
|
+
await onCopyText(text);
|
|
51
|
+
else if (typeof navigator !== 'undefined' && navigator.clipboard)
|
|
52
|
+
await navigator.clipboard.writeText(text);
|
|
53
|
+
else
|
|
54
|
+
throw new Error('clipboard unavailable');
|
|
55
|
+
setState('copied');
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
setState('failed');
|
|
59
|
+
}
|
|
60
|
+
clearTimeout(timer.current);
|
|
61
|
+
// Reset the visible confirmation; the status text stays announced once.
|
|
62
|
+
timer.current = setTimeout(() => setState('idle'), 2000);
|
|
63
|
+
};
|
|
64
|
+
const name = label ?? m.copy;
|
|
65
|
+
return (_jsxs("span", { className: cx('rl-agent-copy', className), children: [_jsxs("button", { type: "button", className: "rl-agent-tool-button", "data-size": "sm", "aria-label": name, title: name, onClick: () => void copy(), children: [_jsx(AgentIcon, { name: state === 'copied' ? 'check' : 'copy' }), _jsx("span", { className: "rl-agent-tool-button__text", "aria-hidden": "true", children: state === 'copied' ? m.copied : state === 'failed' ? m.copyFailed : m.copy })] }), _jsx("span", { className: "rl-agent-sr", role: "status", children: state === 'copied' ? m.copied : state === 'failed' ? m.copyFailed : '' })] }));
|
|
66
|
+
}
|
|
67
|
+
/** Small text button used for in-detail actions (load more, reload, open terminal). */
|
|
68
|
+
export function ActionButton({ children, icon, onClick, tone, disabled, busy, describedBy, }) {
|
|
69
|
+
return (_jsxs("button", { type: "button", className: "rl-agent-tool-button", "data-tone": tone, disabled: disabled, "aria-busy": busy || undefined, "aria-disabled": busy || undefined, "aria-describedby": describedBy, onClick: busy ? undefined : onClick, children: [icon && _jsx(AgentIcon, { name: icon }), _jsx("span", { className: "rl-agent-tool-button__text", children: children })] }));
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Bounded, horizontally scrollable code view. Optional line numbers start at `startLine` and are
|
|
73
|
+
* `aria-hidden` + unselectable, so copying the code never copies the gutter. The scroller is a
|
|
74
|
+
* focusable named region, so keyboard users can scroll it.
|
|
75
|
+
*/
|
|
76
|
+
export function CodeView({ code, label, startLine, tone = 'surface', className, }) {
|
|
77
|
+
const lines = React.useMemo(() => code.replace(/\r\n/g, '\n').split('\n'), [code]);
|
|
78
|
+
return (_jsx("div", { className: cx('rl-agent-code', className), "data-tone": tone, role: "region", tabIndex: 0, "aria-label": label, children: _jsx("pre", { className: "rl-agent-code__pre", children: _jsx("code", { children: startLine != null
|
|
79
|
+
? lines.map((line, i) => (_jsxs("span", { className: "rl-agent-code__line", children: [_jsx("span", { className: "rl-agent-code__ln", "aria-hidden": "true", children: startLine + i }), _jsx("span", { className: "rl-agent-code__text", children: line }), i < lines.length - 1 ? '\n' : null] }, i)))
|
|
80
|
+
: code }) }) }));
|
|
81
|
+
}
|
|
82
|
+
/** Key/value facts of a detail view (`<dl>`); entries with an empty value are dropped. */
|
|
83
|
+
export function MetaList({ items, label, className, }) {
|
|
84
|
+
const shown = items.filter((x) => !!x && x.value != null && x.value !== '' && x.value !== false);
|
|
85
|
+
if (shown.length === 0)
|
|
86
|
+
return null;
|
|
87
|
+
return (_jsx("dl", { className: cx('rl-agent-tool-meta', className), "aria-label": label, children: shown.map((item, i) => (_jsxs("div", { className: "rl-agent-tool-meta__item", children: [_jsx("dt", { children: item.label }), _jsx("dd", { "data-mono": item.mono || undefined, children: item.value })] }, i))) }));
|
|
88
|
+
}
|
|
89
|
+
/** One-line notice inside a detail: icon + text, toned. Not a live region. */
|
|
90
|
+
export function Notice({ tone = 'neutral', children, action, id, }) {
|
|
91
|
+
const icon = tone === 'warning' || tone === 'danger' ? 'warning' : tone === 'success' ? 'check' : 'info';
|
|
92
|
+
return (_jsxs("div", { className: "rl-agent-notice", "data-tone": tone, children: [_jsx(AgentIcon, { name: icon }), _jsx("p", { className: "rl-agent-notice__text", id: id, children: children }), action != null && _jsx("span", { className: "rl-agent-notice__action", children: action })] }));
|
|
93
|
+
}
|
|
94
|
+
/** Pretty-print JSON content; anything that does not parse is returned untouched. */
|
|
95
|
+
export function prettyJson(content) {
|
|
96
|
+
try {
|
|
97
|
+
return JSON.stringify(JSON.parse(content), null, 2);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return content;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/** Serialise an arbitrary value for display (strings stay as-is unless they hold JSON). */
|
|
104
|
+
export function toDisplayJson(value) {
|
|
105
|
+
if (value === undefined)
|
|
106
|
+
return '';
|
|
107
|
+
if (typeof value === 'string')
|
|
108
|
+
return prettyJson(value);
|
|
109
|
+
try {
|
|
110
|
+
return JSON.stringify(value, null, 2) ?? String(value);
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return String(value);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/** Maximum number of rows that still get an entrance when they arrive together. */
|
|
117
|
+
export const ENTRANCE_BATCH_LIMIT = 20;
|
|
118
|
+
/**
|
|
119
|
+
* Tracks which ids appeared after the first render. Returns, per id, its index within the batch
|
|
120
|
+
* that just arrived (for stagger) or `-1` for rows present at mount / already seen. Batches larger
|
|
121
|
+
* than `ENTRANCE_BATCH_LIMIT` get no entrance at all (history restore, page loads).
|
|
122
|
+
*/
|
|
123
|
+
export function useFreshIndex(ids) {
|
|
124
|
+
const known = React.useRef(null);
|
|
125
|
+
if (known.current === null)
|
|
126
|
+
known.current = new Set(ids);
|
|
127
|
+
const seen = known.current;
|
|
128
|
+
const fresh = ids.filter((id) => !seen.has(id));
|
|
129
|
+
React.useEffect(() => {
|
|
130
|
+
for (const id of ids)
|
|
131
|
+
seen.add(id);
|
|
132
|
+
});
|
|
133
|
+
const allow = fresh.length > 0 && fresh.length <= ENTRANCE_BATCH_LIMIT;
|
|
134
|
+
return (id) => (allow ? fresh.indexOf(id) : -1);
|
|
135
|
+
}
|
|
136
|
+
/** Statuses that mean "still moving". */
|
|
137
|
+
export const ACTIVE_TOOL_STATUSES = ['queued', 'running', 'waiting-approval', 'waiting-user', 'waiting-children'];
|
|
138
|
+
export const FAILED_TOOL_STATUSES = ['failed', 'denied', 'timed-out'];
|
|
139
|
+
/** Fixed display order for aggregated status counts. */
|
|
140
|
+
export const TOOL_STATUS_ORDER = [
|
|
141
|
+
'running',
|
|
142
|
+
'queued',
|
|
143
|
+
'waiting-approval',
|
|
144
|
+
'waiting-user',
|
|
145
|
+
'waiting-children',
|
|
146
|
+
'unknown',
|
|
147
|
+
'failed',
|
|
148
|
+
'timed-out',
|
|
149
|
+
'denied',
|
|
150
|
+
'partial',
|
|
151
|
+
'cancelled',
|
|
152
|
+
'completed',
|
|
153
|
+
];
|
|
154
|
+
export function countStatuses(statuses) {
|
|
155
|
+
const counts = new Map();
|
|
156
|
+
for (const s of statuses)
|
|
157
|
+
counts.set(s, (counts.get(s) ?? 0) + 1);
|
|
158
|
+
return TOOL_STATUS_ORDER.filter((s) => counts.has(s)).map((s) => [s, counts.get(s)]);
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/components/tools/shared.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { LedgerEventView } from '@wzrhine/agent-core';
|
|
3
|
+
import type { LedgerFilterKey } from '../../provider/messages/workspace.js';
|
|
4
|
+
import type { WorkspaceMessagesProp } from './shared.js';
|
|
5
|
+
/** Events in sequence order, duplicates dropped (first occurrence wins). */
|
|
6
|
+
export declare function orderLedger(events: readonly LedgerEventView[]): LedgerEventView[];
|
|
7
|
+
export type ActivityLedgerProps = Omit<React.HTMLAttributes<HTMLElement>, 'children'> & {
|
|
8
|
+
events: LedgerEventView[];
|
|
9
|
+
/** Actor filter (controlled). */
|
|
10
|
+
filter?: LedgerFilterKey;
|
|
11
|
+
defaultFilter?: LedgerFilterKey;
|
|
12
|
+
onFilterChange?: (filter: LedgerFilterKey) => void;
|
|
13
|
+
/** Opens one event; each row title becomes a button. */
|
|
14
|
+
onOpenEvent?: (event: LedgerEventView) => void;
|
|
15
|
+
/** First load in progress (Skeleton rows, `aria-busy`). */
|
|
16
|
+
loading?: boolean;
|
|
17
|
+
/** Show the filter tabs (default true). */
|
|
18
|
+
showFilters?: boolean;
|
|
19
|
+
messages?: WorkspaceMessagesProp;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* ActivityLedger (atlas 33): audit events of agent, tool, system and user in `sequence` order.
|
|
23
|
+
* Filtering hides rows but never reorders them; duplicate ids are dropped. Each row has the
|
|
24
|
+
* actor (icon + text), title, optional detail, a `<time dateTime>` and the outcome as glyph +
|
|
25
|
+
* text. Filter tabs are `@wzrhine/react` Tabs (arrow keys, `aria-selected`).
|
|
26
|
+
*
|
|
27
|
+
* Motion: rows present on first render are static; rows that arrive later enter once with
|
|
28
|
+
* AgentEntrance `row` (4px, fast; reduced → no movement). Nothing replays on filter changes.
|
|
29
|
+
*/
|
|
30
|
+
export declare const ActivityLedger: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLElement>, "children"> & {
|
|
31
|
+
events: LedgerEventView[];
|
|
32
|
+
/** Actor filter (controlled). */
|
|
33
|
+
filter?: LedgerFilterKey;
|
|
34
|
+
defaultFilter?: LedgerFilterKey;
|
|
35
|
+
onFilterChange?: (filter: LedgerFilterKey) => void;
|
|
36
|
+
/** Opens one event; each row title becomes a button. */
|
|
37
|
+
onOpenEvent?: (event: LedgerEventView) => void;
|
|
38
|
+
/** First load in progress (Skeleton rows, `aria-busy`). */
|
|
39
|
+
loading?: boolean;
|
|
40
|
+
/** Show the filter tabs (default true). */
|
|
41
|
+
showFilters?: boolean;
|
|
42
|
+
messages?: WorkspaceMessagesProp;
|
|
43
|
+
} & React.RefAttributes<HTMLElement>>;
|
|
44
|
+
//# sourceMappingURL=ActivityLedger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActivityLedger.d.ts","sourceRoot":"","sources":["../../../src/components/workspace/ActivityLedger.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAA0B,eAAe,EAAmB,MAAM,qBAAqB,CAAC;AAOpG,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,sCAAsC,CAAC;AAE9F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAczD,4EAA4E;AAC5E,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,GAAG,eAAe,EAAE,CAKjF;AAED,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,GAAG;IACtF,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,iCAAiC;IACjC,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,aAAa,CAAC,EAAE,eAAe,CAAC;IAChC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,wDAAwD;IACxD,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC/C,2DAA2D;IAC3D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,qBAAqB,CAAC;CAClC,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc;YAvBjB,eAAe,EAAE;IACzB,iCAAiC;aACxB,eAAe;oBACR,eAAe;qBACd,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI;IAClD,wDAAwD;kBAC1C,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI;IAC9C,2DAA2D;cACjD,OAAO;IACjB,2CAA2C;kBAC7B,OAAO;eACV,qBAAqB;qCA8FhC,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { Skeleton, Tab, TabList, Tabs } from '@wzrhine/react';
|
|
5
|
+
import { dedupeById } from '@wzrhine/agent-core';
|
|
6
|
+
import { useAgentFormat } from '../../provider/AgentMessages.js';
|
|
7
|
+
import { AgentEntrance } from '../../motion/agent-motion.js';
|
|
8
|
+
import { StatusGlyph } from '../../primitives/StatusGlyph.js';
|
|
9
|
+
import { AgentIcon } from '../../primitives/icons.js';
|
|
10
|
+
import { cx } from '../../utils/cx.js';
|
|
11
|
+
import { useIsNewId, useWorkspaceMessages } from './shared.js';
|
|
12
|
+
const FILTERS = ['all', 'agent', 'tool', 'system', 'user'];
|
|
13
|
+
const actorIcon = { agent: 'agent', tool: 'tool', system: 'info', user: 'at' };
|
|
14
|
+
const outcomeGlyph = {
|
|
15
|
+
info: { glyph: 'idle', tone: 'info' },
|
|
16
|
+
success: { glyph: 'done', tone: 'success' },
|
|
17
|
+
warning: { glyph: 'unknown', tone: 'warning' },
|
|
18
|
+
danger: { glyph: 'failed', tone: 'danger' },
|
|
19
|
+
neutral: { glyph: 'idle', tone: 'neutral' },
|
|
20
|
+
};
|
|
21
|
+
/** Events in sequence order, duplicates dropped (first occurrence wins). */
|
|
22
|
+
export function orderLedger(events) {
|
|
23
|
+
return dedupeById(events)
|
|
24
|
+
.map((event, index) => ({ event, index }))
|
|
25
|
+
.sort((a, b) => a.event.sequence - b.event.sequence || a.index - b.index)
|
|
26
|
+
.map(({ event }) => event);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* ActivityLedger (atlas 33): audit events of agent, tool, system and user in `sequence` order.
|
|
30
|
+
* Filtering hides rows but never reorders them; duplicate ids are dropped. Each row has the
|
|
31
|
+
* actor (icon + text), title, optional detail, a `<time dateTime>` and the outcome as glyph +
|
|
32
|
+
* text. Filter tabs are `@wzrhine/react` Tabs (arrow keys, `aria-selected`).
|
|
33
|
+
*
|
|
34
|
+
* Motion: rows present on first render are static; rows that arrive later enter once with
|
|
35
|
+
* AgentEntrance `row` (4px, fast; reduced → no movement). Nothing replays on filter changes.
|
|
36
|
+
*/
|
|
37
|
+
export const ActivityLedger = React.forwardRef(function ActivityLedger({ events, filter, defaultFilter = 'all', onFilterChange, onOpenEvent, loading, showFilters = true, messages: override, className, ...rest }, ref) {
|
|
38
|
+
const m = useWorkspaceMessages(override);
|
|
39
|
+
const format = useAgentFormat();
|
|
40
|
+
const [innerFilter, setInnerFilter] = React.useState(defaultFilter);
|
|
41
|
+
const active = filter ?? innerFilter;
|
|
42
|
+
const ordered = React.useMemo(() => orderLedger(events), [events]);
|
|
43
|
+
const isNew = useIsNewId(ordered.map((e) => e.id));
|
|
44
|
+
const visible = active === 'all' ? ordered : ordered.filter((e) => e.actor === active);
|
|
45
|
+
const counts = React.useMemo(() => {
|
|
46
|
+
const c = { all: ordered.length, agent: 0, tool: 0, system: 0, user: 0 };
|
|
47
|
+
for (const e of ordered)
|
|
48
|
+
c[e.actor] += 1;
|
|
49
|
+
return c;
|
|
50
|
+
}, [ordered]);
|
|
51
|
+
const listId = React.useId();
|
|
52
|
+
const change = (next) => {
|
|
53
|
+
const key = next;
|
|
54
|
+
if (filter === undefined)
|
|
55
|
+
setInnerFilter(key);
|
|
56
|
+
onFilterChange?.(key);
|
|
57
|
+
};
|
|
58
|
+
return (_jsxs("section", { ...rest, ref: ref, className: cx('rl-agent-ledger', className), "aria-label": m.ledgerList, "aria-busy": loading || undefined, children: [showFilters && (_jsx(Tabs, { value: active, onValueChange: change, size: "sm", variant: "segmented", className: "rl-agent-ledger__filters", children: _jsx(TabList, { "aria-label": m.ledgerFilters, children: FILTERS.map((key) => (_jsx(Tab, { value: key, meta: counts[key], "aria-controls": listId, children: m.ledgerFilter[key] }, key))) }) })), loading && ordered.length === 0 ? (_jsxs("div", { className: "rl-agent-ledger__loading", children: [_jsx(Skeleton, { lines: 3 }), _jsx("span", { className: "rl-agent-sr", children: m.ledgerLoading })] })) : visible.length === 0 ? (_jsx("p", { className: "rl-agent-ledger__empty", id: listId, children: ordered.length === 0 ? m.ledgerEmpty : m.ledgerEmptyFiltered })) : (_jsx("ol", { className: "rl-agent-ledger__list", id: listId, children: visible.map((event) => {
|
|
59
|
+
const outcome = event.outcome ? outcomeGlyph[event.outcome] : undefined;
|
|
60
|
+
return (_jsxs(AgentEntrance, { as: "li", kind: "row", animate: isNew(event.id), className: "rl-agent-ledger__row", "data-actor": event.actor, "data-outcome": event.outcome, children: [_jsxs("span", { className: "rl-agent-ledger__actor", children: [_jsx(AgentIcon, { name: actorIcon[event.actor] }), _jsx("span", { children: m.ledgerActor[event.actor] })] }), _jsxs("span", { className: "rl-agent-ledger__main", children: [onOpenEvent ? (_jsx("button", { type: "button", className: "rl-agent-ledger__title rl-agent-ledger__open", "aria-label": m.ledgerOpen(event.title), onClick: () => onOpenEvent(event), children: event.title })) : (_jsx("span", { className: "rl-agent-ledger__title", children: event.title })), event.detail && _jsx("span", { className: "rl-agent-ledger__detail", children: event.detail })] }), outcome && (_jsxs("span", { className: "rl-agent-ledger__outcome", "data-tone": outcome.tone, children: [_jsx(StatusGlyph, { name: outcome.glyph, tone: outcome.tone }), _jsx("span", { children: m.ledgerOutcome[event.outcome] })] })), _jsx("time", { className: "rl-agent-ledger__time", dateTime: event.at, children: format.time(event.at) })] }, event.id));
|
|
61
|
+
}) }))] }));
|
|
62
|
+
});
|
|
63
|
+
//# sourceMappingURL=ActivityLedger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActivityLedger.js","sourceRoot":"","sources":["../../../src/components/workspace/ActivityLedger.tsx"],"names":[],"mappings":"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"}
|