@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,97 @@
|
|
|
1
|
+
import { codePointLength } from '@wzrhine/agent-core';
|
|
2
|
+
/** Questions are optional unless `optional === false`. */
|
|
3
|
+
export const isQuestionOptional = (question) => question.optional !== false;
|
|
4
|
+
/** `single` / `multiple` are the built-in choice kinds; anything else (incl. `text` and custom
|
|
5
|
+
* kinds, ADR-0013 §4) answers through free text and/or renderer-owned option ids. */
|
|
6
|
+
export const isChoiceQuestion = (question) => question.kind === 'single' || question.kind === 'multiple';
|
|
7
|
+
/** Built-in kinds with their own controls; any other string is a custom kind. */
|
|
8
|
+
export const isKnownQuestionKind = (question) => isChoiceQuestion(question) || question.kind === 'text';
|
|
9
|
+
/** Code-point length of the free text is over `maxLength`. */
|
|
10
|
+
export function isOverLimit(question, answer) {
|
|
11
|
+
if (question.maxLength == null || answer?.text == null)
|
|
12
|
+
return false;
|
|
13
|
+
return codePointLength(answer.text) > question.maxLength;
|
|
14
|
+
}
|
|
15
|
+
export function answerState(question, answer) {
|
|
16
|
+
if (!answer)
|
|
17
|
+
return 'unanswered';
|
|
18
|
+
if (answer.skipped)
|
|
19
|
+
return 'skipped';
|
|
20
|
+
const hasText = typeof answer.text === 'string' && answer.text.trim() !== '';
|
|
21
|
+
if (question.kind === 'text')
|
|
22
|
+
return hasText ? 'answered' : 'unanswered';
|
|
23
|
+
if (!isKnownQuestionKind(question)) {
|
|
24
|
+
// Custom kinds own their answer shape: any option id or text counts (nothing is filtered out).
|
|
25
|
+
return hasText || (answer.optionIds ?? []).length > 0 ? 'answered' : 'unanswered';
|
|
26
|
+
}
|
|
27
|
+
const known = new Set((question.options ?? []).map((o) => o.id));
|
|
28
|
+
const hasOption = (answer.optionIds ?? []).some((id) => known.has(id));
|
|
29
|
+
return hasOption || (question.allowCustom === true && hasText) ? 'answered' : 'unanswered';
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The answers to submit: answered questions normalised (unknown option ids and an unselected
|
|
33
|
+
* custom text dropped), explicitly skipped and unanswered optional questions as `skipped: true`.
|
|
34
|
+
* Unanswered required questions are returned in `missing` and must block submission.
|
|
35
|
+
*/
|
|
36
|
+
export function normalizeAnswers(questions, answers) {
|
|
37
|
+
const map = answers instanceof Map ? answers : new Map(answers.map((a) => [a.questionId, a]));
|
|
38
|
+
const out = [];
|
|
39
|
+
const missing = [];
|
|
40
|
+
const overLimit = [];
|
|
41
|
+
for (const question of questions) {
|
|
42
|
+
const answer = map.get(question.id);
|
|
43
|
+
const state = answerState(question, answer);
|
|
44
|
+
if (state === 'answered' && isOverLimit(question, answer))
|
|
45
|
+
overLimit.push(question.id);
|
|
46
|
+
if (state === 'answered') {
|
|
47
|
+
const next = { questionId: question.id };
|
|
48
|
+
if (question.kind === 'text') {
|
|
49
|
+
next.text = answer.text;
|
|
50
|
+
}
|
|
51
|
+
else if (!isKnownQuestionKind(question)) {
|
|
52
|
+
// Custom kinds keep their answer verbatim; the custom renderer owns the shape.
|
|
53
|
+
if (answer.optionIds !== undefined)
|
|
54
|
+
next.optionIds = [...answer.optionIds];
|
|
55
|
+
if (typeof answer.text === 'string')
|
|
56
|
+
next.text = answer.text;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
const known = new Set((question.options ?? []).map((o) => o.id));
|
|
60
|
+
const ids = (answer.optionIds ?? []).filter((id) => known.has(id));
|
|
61
|
+
const custom = question.allowCustom === true && typeof answer.text === 'string' && answer.text.trim() !== '';
|
|
62
|
+
if (question.kind === 'single' && custom) {
|
|
63
|
+
next.optionIds = [];
|
|
64
|
+
next.text = answer.text;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
next.optionIds = question.kind === 'single' ? ids.slice(0, 1) : ids;
|
|
68
|
+
if (custom && question.kind === 'multiple')
|
|
69
|
+
next.text = answer.text;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
out.push(next);
|
|
73
|
+
}
|
|
74
|
+
else if (state === 'skipped' || isQuestionOptional(question)) {
|
|
75
|
+
out.push({ questionId: question.id, skipped: true });
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
missing.push(question.id);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return { answers: out, missing, overLimit };
|
|
82
|
+
}
|
|
83
|
+
/** Human-readable answer of one question; `null` when there is none (caller picks the label). */
|
|
84
|
+
export function answerText(question, answer, join) {
|
|
85
|
+
if (!answer || answer.skipped)
|
|
86
|
+
return null;
|
|
87
|
+
const parts = [];
|
|
88
|
+
if (question.kind !== 'text') {
|
|
89
|
+
for (const option of question.options ?? [])
|
|
90
|
+
if (answer.optionIds?.includes(option.id))
|
|
91
|
+
parts.push(option.label);
|
|
92
|
+
}
|
|
93
|
+
if (typeof answer.text === 'string' && answer.text.trim() !== '')
|
|
94
|
+
parts.push(answer.text);
|
|
95
|
+
return parts.length ? parts.join(join) : null;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=questionnaire-answers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"questionnaire-answers.js","sourceRoot":"","sources":["../../../src/components/intervention/questionnaire-answers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { CitationView, MessagePartView, MessageView, RunDetailsView } from '@wzrhine/agent-core';
|
|
3
|
+
import type { MessageActionCapabilities, MessageFeedback } from './MessageActions.js';
|
|
4
|
+
import type { ArtifactRenderer, MessagePartRenderers, ToolRenderer } from './renderers.js';
|
|
5
|
+
import type { CopyHandler } from './use-copy.js';
|
|
6
|
+
/**
|
|
7
|
+
* AgentMessage (atlas 05): one `<article>` per message, named by its header (author + time).
|
|
8
|
+
*
|
|
9
|
+
* - `user`: right-aligned bubble with a reading max-width; `assistant`: full reading column;
|
|
10
|
+
* `system`: centred notice; `tool`: compact assistant-like block.
|
|
11
|
+
* - Body: parts in order through MessagePart; consecutive inline parts (citations, attachments,
|
|
12
|
+
* references) flow together in one line box.
|
|
13
|
+
* - Metadata: edited / inherited markers and the usage footer; any number that is not `exact`
|
|
14
|
+
* carries its completeness label ("估计" / "部分统计"), never a bare figure.
|
|
15
|
+
* - Status: failed / interrupted / cancelled / partial render as glyph + text (static, no live
|
|
16
|
+
* region); `onRetry` adds a retry button for failed and interrupted messages.
|
|
17
|
+
* - Skills: `message.skillUses` renders a SkillUseList meta row ("已加载技能:…") automatically.
|
|
18
|
+
* - Run details: `details` (or `message.details`) renders RunDetails inside a "运行详情"
|
|
19
|
+
* Collapsible after the meta row; closed by default, controlled with `detailsOpen` /
|
|
20
|
+
* `onDetailsOpenChange`. Nothing renders when every field is missing.
|
|
21
|
+
* - Actions (MessageActions) render only for callbacks that are given and are hidden while the
|
|
22
|
+
* message is pending / streaming (copy stays available once text exists). `actionCapabilities`
|
|
23
|
+
* can switch single actions off with a reason (aria-disabled, never called). `onRestoreInput`
|
|
24
|
+
* ("重新编辑本轮输入") is offered on user and assistant messages that are not inherited, including
|
|
25
|
+
* failed ones — it is the recovery path for a turn whose answer did not arrive.
|
|
26
|
+
* - Streaming: a visually hidden `role="status"` announces the current phase once per change
|
|
27
|
+
* (throttled) and "回答已完成" when it settles — never the tokens themselves.
|
|
28
|
+
*
|
|
29
|
+
* Identity is the message id (the list keys by it); re-renders never replay an entrance — the
|
|
30
|
+
* entrance belongs to MessageList.
|
|
31
|
+
*/
|
|
32
|
+
export interface AgentMessagePartHandlers {
|
|
33
|
+
renderers?: MessagePartRenderers;
|
|
34
|
+
renderTool?: ToolRenderer;
|
|
35
|
+
renderArtifact?: ArtifactRenderer;
|
|
36
|
+
onOpenCitation?: (citation: CitationView) => void;
|
|
37
|
+
onRecoveryAction?: (errorId: string, actionId: string) => void;
|
|
38
|
+
onOpenThinking?: (thinkingId: string) => void;
|
|
39
|
+
}
|
|
40
|
+
export type AgentMessageProps = Omit<React.HTMLAttributes<HTMLElement>, 'children' | 'onCopy'> & AgentMessagePartHandlers & {
|
|
41
|
+
message: MessageView;
|
|
42
|
+
/** Model label shown after the assistant author. */
|
|
43
|
+
model?: string;
|
|
44
|
+
/** Replaces the rendering of single parts; receives the default rendering. */
|
|
45
|
+
renderPart?: (part: MessagePartView, rendered: React.ReactNode) => React.ReactNode;
|
|
46
|
+
onRetry?: (messageId: string) => void;
|
|
47
|
+
onCopy?: CopyHandler;
|
|
48
|
+
onRegenerate?: (messageId: string) => void;
|
|
49
|
+
onEdit?: (messageId: string) => void;
|
|
50
|
+
onFork?: (messageId: string) => void;
|
|
51
|
+
/** Put this turn's input back into the composer (distinct from `onEdit`). */
|
|
52
|
+
onRestoreInput?: (messageId: string) => void;
|
|
53
|
+
/** Per-message availability of the actions (e.g. fork off while a run is active). */
|
|
54
|
+
actionCapabilities?: (message: MessageView) => MessageActionCapabilities | undefined;
|
|
55
|
+
feedback?: MessageFeedback | null;
|
|
56
|
+
onFeedback?: (messageId: string, value: MessageFeedback | null) => void;
|
|
57
|
+
/** Run details shown in the "运行详情" disclosure; defaults to `message.details`. */
|
|
58
|
+
details?: RunDetailsView;
|
|
59
|
+
/** Controlled open state of the run-details disclosure. */
|
|
60
|
+
detailsOpen?: boolean;
|
|
61
|
+
defaultDetailsOpen?: boolean;
|
|
62
|
+
onDetailsOpenChange?: (open: boolean) => void;
|
|
63
|
+
/** Extra content after the body (e.g. a RunSummary from another family). */
|
|
64
|
+
footer?: React.ReactNode;
|
|
65
|
+
/** Minimum gap between streaming announcements (ms). */
|
|
66
|
+
announceInterval?: number;
|
|
67
|
+
};
|
|
68
|
+
/** Plain text of the copyable parts (text, markdown source, code). */
|
|
69
|
+
export declare function messagePlainText(message: MessageView): string;
|
|
70
|
+
export declare const AgentMessage: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLElement>, "children" | "onCopy"> & AgentMessagePartHandlers & {
|
|
71
|
+
message: MessageView;
|
|
72
|
+
/** Model label shown after the assistant author. */
|
|
73
|
+
model?: string;
|
|
74
|
+
/** Replaces the rendering of single parts; receives the default rendering. */
|
|
75
|
+
renderPart?: (part: MessagePartView, rendered: React.ReactNode) => React.ReactNode;
|
|
76
|
+
onRetry?: (messageId: string) => void;
|
|
77
|
+
onCopy?: CopyHandler;
|
|
78
|
+
onRegenerate?: (messageId: string) => void;
|
|
79
|
+
onEdit?: (messageId: string) => void;
|
|
80
|
+
onFork?: (messageId: string) => void;
|
|
81
|
+
/** Put this turn's input back into the composer (distinct from `onEdit`). */
|
|
82
|
+
onRestoreInput?: (messageId: string) => void;
|
|
83
|
+
/** Per-message availability of the actions (e.g. fork off while a run is active). */
|
|
84
|
+
actionCapabilities?: (message: MessageView) => MessageActionCapabilities | undefined;
|
|
85
|
+
feedback?: MessageFeedback | null;
|
|
86
|
+
onFeedback?: (messageId: string, value: MessageFeedback | null) => void;
|
|
87
|
+
/** Run details shown in the "运行详情" disclosure; defaults to `message.details`. */
|
|
88
|
+
details?: RunDetailsView;
|
|
89
|
+
/** Controlled open state of the run-details disclosure. */
|
|
90
|
+
detailsOpen?: boolean;
|
|
91
|
+
defaultDetailsOpen?: boolean;
|
|
92
|
+
onDetailsOpenChange?: (open: boolean) => void;
|
|
93
|
+
/** Extra content after the body (e.g. a RunSummary from another family). */
|
|
94
|
+
footer?: React.ReactNode;
|
|
95
|
+
/** Minimum gap between streaming announcements (ms). */
|
|
96
|
+
announceInterval?: number;
|
|
97
|
+
} & React.RefAttributes<HTMLElement>>;
|
|
98
|
+
//# sourceMappingURL=AgentMessage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentMessage.d.ts","sourceRoot":"","sources":["../../../src/components/message/AgentMessage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
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 { effectivePhase } from '@wzrhine/agent-core';
|
|
6
|
+
import { AgentIcon } from '../../primitives/icons.js';
|
|
7
|
+
import { StatusGlyph } from '../../primitives/StatusGlyph.js';
|
|
8
|
+
import { useAgentFormat, useAgentMessages } from '../../provider/AgentMessages.js';
|
|
9
|
+
import { cx } from '../../utils/cx.js';
|
|
10
|
+
import { MessageActions } from './MessageActions.js';
|
|
11
|
+
import { INLINE_PART_TYPES, MessagePart } from './MessagePart.js';
|
|
12
|
+
import { RunDetails, hasRunDetails } from './RunDetails.js';
|
|
13
|
+
import { SkillUseList } from './SkillUseList.js';
|
|
14
|
+
import { useThrottledText } from './use-copy.js';
|
|
15
|
+
const statusGlyph = {
|
|
16
|
+
failed: { glyph: 'failed', tone: 'danger' },
|
|
17
|
+
interrupted: { glyph: 'failed', tone: 'warning' },
|
|
18
|
+
cancelled: { glyph: 'stopped', tone: 'neutral' },
|
|
19
|
+
partial: { glyph: 'unknown', tone: 'warning' },
|
|
20
|
+
};
|
|
21
|
+
/** Plain text of the copyable parts (text, markdown source, code). */
|
|
22
|
+
export function messagePlainText(message) {
|
|
23
|
+
return message.parts
|
|
24
|
+
.map((part) => (part.type === 'text' ? part.text : part.type === 'markdown' ? part.source : part.type === 'code' ? part.code : ''))
|
|
25
|
+
.filter((text) => text.trim() !== '')
|
|
26
|
+
.join('\n\n');
|
|
27
|
+
}
|
|
28
|
+
function Usage({ usage }) {
|
|
29
|
+
const t = useAgentMessages().message;
|
|
30
|
+
const fmt = useAgentFormat();
|
|
31
|
+
const items = [
|
|
32
|
+
[t.usageInput, usage.input],
|
|
33
|
+
[t.usageOutput, usage.output],
|
|
34
|
+
[t.usageCacheRead, usage.cacheRead],
|
|
35
|
+
[t.usageCacheWrite, usage.cacheWrite],
|
|
36
|
+
[t.usageTotal, usage.total],
|
|
37
|
+
];
|
|
38
|
+
const shown = items.filter((item) => item[1] !== undefined);
|
|
39
|
+
const completeness = t.usageCompleteness[usage.completeness];
|
|
40
|
+
if (shown.length === 0 && !completeness && !usage.note)
|
|
41
|
+
return null;
|
|
42
|
+
return (_jsxs("p", { className: "rl-agent-usage", "data-completeness": usage.completeness, children: [_jsx("span", { className: "rl-agent-usage__label", children: t.usageLabel }), shown.map(([label, value]) => (_jsxs("span", { className: "rl-agent-usage__item", children: [label, " ", _jsx("span", { className: "rl-agent-usage__value", children: fmt.compact(value) })] }, label))), completeness && _jsx("span", { className: "rl-agent-usage__completeness", children: completeness }), usage.note && _jsx("span", { className: "rl-agent-usage__note", children: usage.note })] }));
|
|
43
|
+
}
|
|
44
|
+
/** Groups consecutive inline parts so chips share a line box. */
|
|
45
|
+
function groupParts(parts) {
|
|
46
|
+
const groups = [];
|
|
47
|
+
for (const part of parts) {
|
|
48
|
+
const inline = INLINE_PART_TYPES.has(part.type);
|
|
49
|
+
const last = groups[groups.length - 1];
|
|
50
|
+
if (last && last.inline && inline)
|
|
51
|
+
last.parts.push(part);
|
|
52
|
+
else
|
|
53
|
+
groups.push({ inline, parts: [part] });
|
|
54
|
+
}
|
|
55
|
+
return groups;
|
|
56
|
+
}
|
|
57
|
+
export const AgentMessage = React.forwardRef(function AgentMessage({ message, model, renderPart, renderers, renderTool, renderArtifact, onOpenCitation, onRecoveryAction, onOpenThinking, onRetry, onCopy, onRegenerate, onEdit, onFork, onRestoreInput, actionCapabilities, feedback, onFeedback, details: detailsProp, detailsOpen, defaultDetailsOpen, onDetailsOpenChange, footer, announceInterval = 1500, className, ...rest }, ref) {
|
|
58
|
+
const all = useAgentMessages();
|
|
59
|
+
const t = all.message;
|
|
60
|
+
const fmt = useAgentFormat();
|
|
61
|
+
const headerId = React.useId();
|
|
62
|
+
const { role, status } = message;
|
|
63
|
+
const busy = status === 'pending' || status === 'streaming';
|
|
64
|
+
// Announcement: phase while streaming, one line once it settles; history never announces.
|
|
65
|
+
const wasStreaming = React.useRef(status === 'streaming');
|
|
66
|
+
if (status === 'streaming')
|
|
67
|
+
wasStreaming.current = true;
|
|
68
|
+
const statusPart = [...message.parts].reverse().find((p) => p.type === 'status');
|
|
69
|
+
let announcement = '';
|
|
70
|
+
if (status === 'streaming') {
|
|
71
|
+
const phase = statusPart ? effectivePhase(statusPart.status, statusPart.phase) : undefined;
|
|
72
|
+
announcement = statusPart?.text ?? (phase ? all.status.phase[phase] : t.messageStatus.streaming);
|
|
73
|
+
}
|
|
74
|
+
else if (wasStreaming.current) {
|
|
75
|
+
announcement = status === 'complete' ? t.completedAnnouncement : t.messageStatus[status];
|
|
76
|
+
}
|
|
77
|
+
const announced = useThrottledText(announcement, announceInterval);
|
|
78
|
+
const statusText = role === 'user' && status === 'failed' ? t.sendFailed : t.messageStatus[status];
|
|
79
|
+
const glyph = statusGlyph[status];
|
|
80
|
+
const copyText = React.useMemo(() => messagePlainText(message), [message]);
|
|
81
|
+
const id = message.id;
|
|
82
|
+
const renderOne = (part) => {
|
|
83
|
+
const rendered = (_jsx(MessagePart, { part: part, renderers: renderers, renderTool: renderTool, renderArtifact: renderArtifact, onOpenCitation: onOpenCitation, onRecoveryAction: onRecoveryAction, onOpenThinking: onOpenThinking, onCopy: onCopy }, part.id));
|
|
84
|
+
return renderPart ? _jsx(React.Fragment, { children: renderPart(part, rendered) }, part.id) : rendered;
|
|
85
|
+
};
|
|
86
|
+
const author = message.author ?? t.author[role];
|
|
87
|
+
const showActions = !busy && role !== 'system';
|
|
88
|
+
const details = detailsProp ?? message.details;
|
|
89
|
+
const showDetails = hasRunDetails(details);
|
|
90
|
+
const skills = message.skillUses ?? [];
|
|
91
|
+
const capabilities = showActions ? actionCapabilities?.(message) : undefined;
|
|
92
|
+
return (_jsxs("article", { ...rest, ref: ref, className: cx('rl-agent-message', className), "data-role": role, "data-status": status, "data-message-id": id, "data-inherited": message.inherited || undefined, "aria-labelledby": headerId, "aria-busy": busy || undefined, children: [_jsxs("header", { className: "rl-agent-message__header", id: headerId, children: [role === 'assistant' && _jsx(AgentIcon, { name: "agent", className: "rl-agent-message__avatar" }), _jsx("span", { className: "rl-agent-message__author", children: author }), model && _jsx("span", { className: "rl-agent-message__model", children: model }), message.createdAt && (_jsx("time", { className: "rl-agent-message__time", dateTime: message.createdAt, children: fmt.time(message.createdAt) })), status === 'pending' && _jsx("span", { className: "rl-agent-message__pending", children: statusText })] }), _jsx("div", { className: "rl-agent-message__body", children: groupParts(message.parts).map((group) => group.inline ? (_jsx("p", { className: "rl-agent-message__inline", children: group.parts.map(renderOne) }, group.parts[0].id)) : (group.parts.map(renderOne))) }), glyph && statusText && (_jsxs("div", { className: "rl-agent-message__status", "data-tone": glyph.tone, children: [_jsx(StatusGlyph, { name: glyph.glyph, tone: glyph.tone, className: "rl-agent-message__status-glyph" }), _jsx("span", { children: statusText }), onRetry && (status === 'failed' || status === 'interrupted') && (_jsx(Button, { size: "sm", variant: "secondary", iconStart: _jsx(AgentIcon, { name: "retry" }), onClick: () => onRetry(id), children: t.retry }))] })), (message.edited || message.inherited || message.usage) && (_jsxs("div", { className: "rl-agent-message__meta", children: [message.edited && _jsx("span", { className: "rl-agent-message__marker", children: t.edited }), message.inherited && _jsx("span", { className: "rl-agent-message__marker", children: t.inherited }), message.usage && _jsx(Usage, { usage: message.usage })] })), skills.length > 0 && _jsx(SkillUseList, { className: "rl-agent-message__skills", skills: skills }), showDetails && (_jsx(Collapsible, { className: "rl-agent-message__details", panelClassName: "rl-agent-message__details-panel", triggerProps: { className: 'rl-agent-message__details-trigger' }, open: detailsOpen, defaultOpen: defaultDetailsOpen, onOpenChange: onDetailsOpenChange, trigger: _jsx("span", { children: t.runDetails }), children: _jsx(RunDetails, { details: details, "aria-label": t.runDetails }) })), footer, showActions && (_jsx(MessageActions, { className: "rl-agent-message__actions", copyText: copyText || undefined, onCopy: onCopy, onRegenerate: onRegenerate && role === 'assistant' ? () => onRegenerate(id) : undefined, onEdit: onEdit && role === 'user' && !message.inherited ? () => onEdit(id) : undefined, onFork: onFork ? () => onFork(id) : undefined, onRestoreInput: onRestoreInput && (role === 'user' || role === 'assistant') && !message.inherited ? () => onRestoreInput(id) : undefined, capabilities: capabilities, feedback: feedback, onFeedback: onFeedback && role === 'assistant' ? (value) => onFeedback(id, value) : undefined })), role !== 'user' && wasStreaming.current && (_jsx("span", { className: "rl-agent-sr", role: "status", children: announced }))] }));
|
|
93
|
+
});
|
|
94
|
+
//# sourceMappingURL=AgentMessage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentMessage.js","sourceRoot":"","sources":["../../../src/components/message/AgentMessage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { CitationView } from '@wzrhine/agent-core';
|
|
3
|
+
/**
|
|
4
|
+
* CitationChip (atlas 32): an inline `<button>` showing "[n]" (or a short label) inside running
|
|
5
|
+
* text. Hover / focus shows a card with title, source type, locator and excerpt; the same text is
|
|
6
|
+
* the button's description (`aria-describedby` → a `hidden` node), so it is never hover-only.
|
|
7
|
+
*
|
|
8
|
+
* - Available + `onOpen`: activating calls `onOpen(citation)`.
|
|
9
|
+
* - Available without `onOpen`: the chip is informational (card on hover / focus, description).
|
|
10
|
+
* - Unavailable: `aria-disabled`, still focusable, struck style, the reason is in the name and the
|
|
11
|
+
* card; `onOpen` is never called — a dead source is never presented as openable.
|
|
12
|
+
*
|
|
13
|
+
* Layout: same font size and inherited line height as the surrounding text, so a paragraph with
|
|
14
|
+
* many chips keeps its line rhythm and wraps between chips. Motion: background colour only.
|
|
15
|
+
*/
|
|
16
|
+
export type CitationChipProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children' | 'onClick' | 'type'> & {
|
|
17
|
+
citation: CitationView;
|
|
18
|
+
onOpen?: (citation: CitationView) => void;
|
|
19
|
+
/** Visible text instead of "[n]" (e.g. a short file name). */
|
|
20
|
+
label?: React.ReactNode;
|
|
21
|
+
/** Show the source-type icon before the index. */
|
|
22
|
+
showIcon?: boolean;
|
|
23
|
+
/** Custom icon content (SVG inner nodes); wins over the built-in source-type icon. */
|
|
24
|
+
icon?: React.ReactNode;
|
|
25
|
+
selected?: boolean;
|
|
26
|
+
};
|
|
27
|
+
export declare const CitationChip: React.ForwardRefExoticComponent<Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "type" | "children" | "onClick"> & {
|
|
28
|
+
citation: CitationView;
|
|
29
|
+
onOpen?: (citation: CitationView) => void;
|
|
30
|
+
/** Visible text instead of "[n]" (e.g. a short file name). */
|
|
31
|
+
label?: React.ReactNode;
|
|
32
|
+
/** Show the source-type icon before the index. */
|
|
33
|
+
showIcon?: boolean;
|
|
34
|
+
/** Custom icon content (SVG inner nodes); wins over the built-in source-type icon. */
|
|
35
|
+
icon?: React.ReactNode;
|
|
36
|
+
selected?: boolean;
|
|
37
|
+
} & React.RefAttributes<HTMLButtonElement>>;
|
|
38
|
+
//# sourceMappingURL=CitationChip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CitationChip.d.ts","sourceRoot":"","sources":["../../../src/components/message/CitationChip.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAsB,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAM5E;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC,GAAG;IACrH,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;IAC1C,8DAA8D;IAC9D,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sFAAsF;IACtF,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAYF,eAAO,MAAM,YAAY;cArBb,YAAY;aACb,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI;IACzC,8DAA8D;YACtD,KAAK,CAAC,SAAS;IACvB,kDAAkD;eACvC,OAAO;IAClB,sFAAsF;WAC/E,KAAK,CAAC,SAAS;eACX,OAAO;2CAsElB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
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 { Tooltip } from '@wzrhine/react';
|
|
5
|
+
import { AgentIcon } from '../../primitives/icons.js';
|
|
6
|
+
import { useAgentMessages } from '../../provider/AgentMessages.js';
|
|
7
|
+
import { cx } from '../../utils/cx.js';
|
|
8
|
+
/** Icon per built-in source type; custom types fall back to the `other` icon (ADR-0013 §2). */
|
|
9
|
+
const sourceIcon = {
|
|
10
|
+
file: 'file',
|
|
11
|
+
web: 'globe',
|
|
12
|
+
code: 'code',
|
|
13
|
+
dataset: 'database',
|
|
14
|
+
message: 'list',
|
|
15
|
+
other: 'link',
|
|
16
|
+
};
|
|
17
|
+
export const CitationChip = React.forwardRef(function CitationChip({ citation, onOpen, label, showIcon = false, icon, selected, className, ...rest }, ref) {
|
|
18
|
+
const t = useAgentMessages().message;
|
|
19
|
+
const descriptionId = React.useId();
|
|
20
|
+
const unavailable = citation.unavailable === true;
|
|
21
|
+
const openable = !unavailable && onOpen !== undefined;
|
|
22
|
+
const name = t.citationName(citation.index, citation.title) + (unavailable ? ` (${t.citationUnavailable})` : '');
|
|
23
|
+
const reason = unavailable ? (citation.reason ?? t.citationUnavailable) : undefined;
|
|
24
|
+
const sourceLabel = t.sourceType[citation.sourceType] ?? citation.sourceType;
|
|
25
|
+
const description = [sourceLabel, citation.locator, reason, citation.excerpt].filter(Boolean).join(' · ');
|
|
26
|
+
const card = (_jsxs("span", { className: "rl-agent-cite__card", children: [_jsx("span", { className: "rl-agent-cite__card-title", children: citation.title }), _jsxs("span", { className: "rl-agent-cite__card-meta", children: [sourceLabel, citation.locator && _jsx("span", { className: "rl-agent-cite__card-locator", children: citation.locator })] }), reason && _jsx("span", { className: "rl-agent-cite__card-reason", children: reason }), citation.excerpt && _jsx("span", { className: "rl-agent-cite__card-excerpt", children: citation.excerpt })] }));
|
|
27
|
+
return (_jsxs(_Fragment, { children: [_jsx(Tooltip, { content: card, className: "rl-agent-cite__tooltip", children: _jsxs("button", { ...rest, ref: ref, type: "button", className: cx('rl-agent-cite', className), "aria-label": name, "aria-describedby": descriptionId, "aria-disabled": unavailable || undefined, "aria-pressed": selected, "data-source": citation.sourceType, "data-unavailable": unavailable || undefined, "data-selected": selected || undefined, onClick: () => {
|
|
28
|
+
if (openable)
|
|
29
|
+
onOpen(citation);
|
|
30
|
+
}, children: [showIcon && (_jsx(AgentIcon, { name: sourceIcon[citation.sourceType] ?? 'link', className: "rl-agent-cite__icon", children: icon })), _jsx("span", { className: "rl-agent-cite__text", children: label ?? `[${citation.index}]` })] }) }), _jsx("span", { id: descriptionId, hidden: true, children: description })] }));
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=CitationChip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CitationChip.js","sourceRoot":"","sources":["../../../src/components/message/CitationChip.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AA2BvC,+FAA+F;AAC/F,MAAM,UAAU,GAA8C;IAC5D,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,OAAO;IACZ,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,UAAU;IACnB,OAAO,EAAE,MAAM;IACf,KAAK,EAAE,MAAM;CACd,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAC,UAAU,CAAuC,SAAS,YAAY,CACtG,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EACjF,GAAG;IAEH,MAAM,CAAC,GAAG,gBAAgB,EAAE,CAAC,OAAO,CAAC;IACrC,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;IACpC,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,KAAK,IAAI,CAAC;IAClD,MAAM,QAAQ,GAAG,CAAC,WAAW,IAAI,MAAM,KAAK,SAAS,CAAC;IACtD,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,mBAAmB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACjH,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACpF,MAAM,WAAW,GAAG,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC;IAC7E,MAAM,WAAW,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAE1G,MAAM,IAAI,GAAG,CACX,gBAAM,SAAS,EAAC,qBAAqB,aACnC,eAAM,SAAS,EAAC,2BAA2B,YAAE,QAAQ,CAAC,KAAK,GAAQ,EACnE,gBAAM,SAAS,EAAC,0BAA0B,aACvC,WAAW,EACX,QAAQ,CAAC,OAAO,IAAI,eAAM,SAAS,EAAC,6BAA6B,YAAE,QAAQ,CAAC,OAAO,GAAQ,IACvF,EACN,MAAM,IAAI,eAAM,SAAS,EAAC,4BAA4B,YAAE,MAAM,GAAQ,EACtE,QAAQ,CAAC,OAAO,IAAI,eAAM,SAAS,EAAC,6BAA6B,YAAE,QAAQ,CAAC,OAAO,GAAQ,IACvF,CACR,CAAC;IAEF,OAAO,CACL,8BACE,KAAC,OAAO,IAAC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAC,wBAAwB,YACxD,qBACM,IAAI,EACR,GAAG,EAAE,GAAG,EACR,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,EAAE,CAAC,eAAe,EAAE,SAAS,CAAC,gBAC7B,IAAI,sBACE,aAAa,mBAChB,WAAW,IAAI,SAAS,kBACzB,QAAQ,iBACT,QAAQ,CAAC,UAAU,sBACd,WAAW,IAAI,SAAS,mBAC3B,QAAQ,IAAI,SAAS,EACpC,OAAO,EAAE,GAAG,EAAE;wBACZ,IAAI,QAAQ;4BAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;oBACjC,CAAC,aAEA,QAAQ,IAAI,CACX,KAAC,SAAS,IAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,UAAgC,CAAC,IAAI,MAAM,EAAE,SAAS,EAAC,qBAAqB,YAC9G,IAAI,GACK,CACb,EACD,eAAM,SAAS,EAAC,qBAAqB,YAAE,KAAK,IAAI,IAAI,QAAQ,CAAC,KAAK,GAAG,GAAQ,IACtE,GACD,EACV,eAAM,EAAE,EAAE,aAAa,EAAE,MAAM,kBAC5B,WAAW,GACP,IACN,CACJ,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { CopyHandler } from './use-copy.js';
|
|
3
|
+
/**
|
|
4
|
+
* CodeBlock: a `<figure>` with a caption (language / file name) and a copy button over a
|
|
5
|
+
* horizontally scrollable `<pre><code>`. Long lines never widen the page; the scroller is
|
|
6
|
+
* focusable (`tabIndex=0`, named by the caption) so keyboard users can scroll it. No highlighting
|
|
7
|
+
* is done here: pass `children` (or MessagePart `renderers.code`) for a highlighted rendering.
|
|
8
|
+
*
|
|
9
|
+
* Copy: `onCopy` if given, else the Clipboard API; the button is not rendered when neither
|
|
10
|
+
* exists. The copied / failed state is announced through the button's own name and a polite
|
|
11
|
+
* status, then resets after a short delay. No motion.
|
|
12
|
+
*/
|
|
13
|
+
export type CodeBlockProps = Omit<React.HTMLAttributes<HTMLElement>, 'children' | 'onCopy'> & {
|
|
14
|
+
code: string;
|
|
15
|
+
language?: string;
|
|
16
|
+
filename?: string;
|
|
17
|
+
/** Show a line-number gutter (decorative, not copied). */
|
|
18
|
+
showLineNumbers?: boolean;
|
|
19
|
+
/** CSS length; taller code scrolls vertically inside the block. */
|
|
20
|
+
maxHeight?: string;
|
|
21
|
+
/** `false` hides the copy button. Default: shown when a copy path exists. */
|
|
22
|
+
copyable?: boolean;
|
|
23
|
+
onCopy?: CopyHandler;
|
|
24
|
+
/** Replaces the plain `<code>` content (e.g. host-highlighted tokens). The copy text stays `code`. */
|
|
25
|
+
children?: React.ReactNode;
|
|
26
|
+
/** Copy-button name override. */
|
|
27
|
+
copyLabel?: string;
|
|
28
|
+
};
|
|
29
|
+
export declare const CodeBlock: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLElement>, "children" | "onCopy"> & {
|
|
30
|
+
code: string;
|
|
31
|
+
language?: string;
|
|
32
|
+
filename?: string;
|
|
33
|
+
/** Show a line-number gutter (decorative, not copied). */
|
|
34
|
+
showLineNumbers?: boolean;
|
|
35
|
+
/** CSS length; taller code scrolls vertically inside the block. */
|
|
36
|
+
maxHeight?: string;
|
|
37
|
+
/** `false` hides the copy button. Default: shown when a copy path exists. */
|
|
38
|
+
copyable?: boolean;
|
|
39
|
+
onCopy?: CopyHandler;
|
|
40
|
+
/** Replaces the plain `<code>` content (e.g. host-highlighted tokens). The copy text stays `code`. */
|
|
41
|
+
children?: React.ReactNode;
|
|
42
|
+
/** Copy-button name override. */
|
|
43
|
+
copyLabel?: string;
|
|
44
|
+
} & React.RefAttributes<HTMLElement>>;
|
|
45
|
+
//# sourceMappingURL=CodeBlock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeBlock.d.ts","sourceRoot":"","sources":["../../../src/components/message/CodeBlock.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD;;;;;;;;;GASG;AACH,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC,GAAG;IAC5F,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,sGAAsG;IACtG,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,SAAS;UAhBd,MAAM;eACD,MAAM;eACN,MAAM;IACjB,0DAA0D;sBACxC,OAAO;IACzB,mEAAmE;gBACvD,MAAM;IAClB,6EAA6E;eAClE,OAAO;aACT,WAAW;IACpB,sGAAsG;eAC3F,KAAK,CAAC,SAAS;IAC1B,iCAAiC;gBACrB,MAAM;qCA2DlB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { IconButton } from '@wzrhine/react';
|
|
5
|
+
import { AgentIcon } from '../../primitives/icons.js';
|
|
6
|
+
import { useAgentMessages } from '../../provider/AgentMessages.js';
|
|
7
|
+
import { cx } from '../../utils/cx.js';
|
|
8
|
+
import { useClipboardAvailable, useCopy } from './use-copy.js';
|
|
9
|
+
export const CodeBlock = React.forwardRef(function CodeBlock({ code, language, filename, showLineNumbers = false, maxHeight, copyable = true, onCopy, children, copyLabel, className, style, ...rest }, ref) {
|
|
10
|
+
const t = useAgentMessages().message;
|
|
11
|
+
const captionId = React.useId();
|
|
12
|
+
const clipboard = useClipboardAvailable();
|
|
13
|
+
const { state, failed, copy } = useCopy(onCopy);
|
|
14
|
+
const canCopy = copyable && (onCopy !== undefined || clipboard);
|
|
15
|
+
const caption = filename ?? language ?? t.codeLabel;
|
|
16
|
+
const lines = React.useMemo(() => (showLineNumbers ? code.split('\n') : []), [code, showLineNumbers]);
|
|
17
|
+
const name = state === 'copied' ? t.copied : state === 'failed' ? t.copyFailed : (copyLabel ?? t.copyCode);
|
|
18
|
+
const scrollStyle = maxHeight ? { '--rl-agent-code-max-height': maxHeight } : undefined;
|
|
19
|
+
return (_jsxs("figure", { ...rest, ref: ref, className: cx('rl-agent-code', className), style: style, "data-line-numbers": showLineNumbers || undefined, children: [_jsxs("figcaption", { className: "rl-agent-code__caption", children: [_jsx(AgentIcon, { name: filename ? 'file' : 'code', className: "rl-agent-code__icon" }), _jsx("span", { id: captionId, className: "rl-agent-code__title", children: caption }), filename && language && _jsx("span", { className: "rl-agent-code__lang", children: language }), canCopy && (_jsx(IconButton, { className: "rl-agent-code__copy", size: "sm", variant: "ghost", label: name, "data-state": state, icon: _jsx(AgentIcon, { name: state === 'copied' ? 'check' : 'copy' }), onClick: () => void copy(code) })), canCopy && (_jsx("span", { className: "rl-agent-sr", role: "status", children: state === 'copied' ? t.copied : state === 'failed' ? t.copyFailed : '' }))] }), failed && _jsx("p", { className: "rl-agent-code__error", role: "alert", children: t.copyFailed }), _jsxs("div", { className: "rl-agent-code__scroll", tabIndex: 0, role: "region", "aria-labelledby": captionId, style: scrollStyle, "data-max-height": maxHeight ? '' : undefined, children: [showLineNumbers && (_jsx("span", { className: "rl-agent-code__gutter", "aria-hidden": "true", children: lines.map((_, i) => (_jsx("span", { children: i + 1 }, i))) })), _jsx("pre", { className: "rl-agent-code__pre", children: _jsx("code", { className: "rl-agent-code__code", "data-language": language, children: children ?? code }) })] })] }));
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=CodeBlock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeBlock.js","sourceRoot":"","sources":["../../../src/components/message/CodeBlock.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* JumpToLatest (atlas 35): floating pill shown while the reader is away from the newest content.
|
|
4
|
+
* A real `<button>` named "返回最新消息" (+ "N 条新消息" when `unreadCount` > 0). Appearing never
|
|
5
|
+
* moves focus; if the button held focus when it hides, focus is left to the caller (MessageList
|
|
6
|
+
* moves nothing — the viewport keeps the reading position).
|
|
7
|
+
*
|
|
8
|
+
* `loading`: the jump is in progress (smooth scroll / fetching the tail): `aria-busy`, spinner.
|
|
9
|
+
* Motion: MotionPresence `fade` (opacity, `fast`); reduced motion shows / hides at once.
|
|
10
|
+
*/
|
|
11
|
+
export type JumpToLatestProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children' | 'onClick' | 'type'> & {
|
|
12
|
+
/** At the newest content: the button is hidden. */
|
|
13
|
+
atLatest: boolean;
|
|
14
|
+
unreadCount?: number;
|
|
15
|
+
onJump: () => void;
|
|
16
|
+
loading?: boolean;
|
|
17
|
+
label?: string;
|
|
18
|
+
};
|
|
19
|
+
export declare const JumpToLatest: React.ForwardRefExoticComponent<Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "type" | "children" | "onClick"> & {
|
|
20
|
+
/** At the newest content: the button is hidden. */
|
|
21
|
+
atLatest: boolean;
|
|
22
|
+
unreadCount?: number;
|
|
23
|
+
onJump: () => void;
|
|
24
|
+
loading?: boolean;
|
|
25
|
+
label?: string;
|
|
26
|
+
} & React.RefAttributes<HTMLButtonElement>>;
|
|
27
|
+
//# sourceMappingURL=JumpToLatest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JumpToLatest.d.ts","sourceRoot":"","sources":["../../../src/components/message/JumpToLatest.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B;;;;;;;;GAQG;AACH,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC,GAAG;IACrH,mDAAmD;IACnD,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,YAAY;IARvB,mDAAmD;cACzC,OAAO;kBACH,MAAM;YACZ,MAAM,IAAI;cACR,OAAO;YACT,MAAM;2CA8Bd,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { MotionPresence, Spinner } from '@wzrhine/react';
|
|
5
|
+
import { AgentIcon } from '../../primitives/icons.js';
|
|
6
|
+
import { useAgentMessages } from '../../provider/AgentMessages.js';
|
|
7
|
+
import { cx } from '../../utils/cx.js';
|
|
8
|
+
export const JumpToLatest = React.forwardRef(function JumpToLatest({ atLatest, unreadCount = 0, onJump, loading = false, label, className, ...rest }, ref) {
|
|
9
|
+
const t = useAgentMessages().message;
|
|
10
|
+
const name = label ?? t.jumpToLatest;
|
|
11
|
+
const count = unreadCount > 0 ? t.newMessages(unreadCount) : undefined;
|
|
12
|
+
return (_jsx(MotionPresence, { show: !atLatest, preset: "fade", className: "rl-agent-jump", "data-slot": "jump-to-latest", children: _jsxs("button", { ...rest, ref: ref, type: "button", className: cx('rl-agent-jump__button', className), "aria-label": count ? t.jumpWithCount(name, count) : name, "aria-busy": loading || undefined, "data-unread": unreadCount > 0 || undefined, onClick: () => {
|
|
13
|
+
if (!loading)
|
|
14
|
+
onJump();
|
|
15
|
+
}, children: [loading ? _jsx(Spinner, { size: "sm" }) : _jsx(AgentIcon, { name: "arrow-down", className: "rl-agent-jump__icon" }), _jsx("span", { className: "rl-agent-jump__label", children: name }), count && _jsx("span", { className: "rl-agent-jump__count", children: count })] }) }));
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=JumpToLatest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JumpToLatest.js","sourceRoot":"","sources":["../../../src/components/message/JumpToLatest.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAoBvC,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAC,UAAU,CAAuC,SAAS,YAAY,CACtG,EAAE,QAAQ,EAAE,WAAW,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,GAAG,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EACjF,GAAG;IAEH,MAAM,CAAC,GAAG,gBAAgB,EAAE,CAAC,OAAO,CAAC;IACrC,MAAM,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,YAAY,CAAC;IACrC,MAAM,KAAK,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,OAAO,CACL,KAAC,cAAc,IAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAC,MAAM,EAAC,SAAS,EAAC,eAAe,eAAW,gBAAgB,YACjG,qBACM,IAAI,EACR,GAAG,EAAE,GAAG,EACR,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,EAAE,CAAC,uBAAuB,EAAE,SAAS,CAAC,gBACrC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,eAC5C,OAAO,IAAI,SAAS,iBAClB,WAAW,GAAG,CAAC,IAAI,SAAS,EACzC,OAAO,EAAE,GAAG,EAAE;gBACZ,IAAI,CAAC,OAAO;oBAAE,MAAM,EAAE,CAAC;YACzB,CAAC,aAEA,OAAO,CAAC,CAAC,CAAC,KAAC,OAAO,IAAC,IAAI,EAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAC,SAAS,IAAC,IAAI,EAAC,YAAY,EAAC,SAAS,EAAC,qBAAqB,GAAG,EAClG,eAAM,SAAS,EAAC,sBAAsB,YAAE,IAAI,GAAQ,EACnD,KAAK,IAAI,eAAM,SAAS,EAAC,sBAAsB,YAAE,KAAK,GAAQ,IACxD,GACM,CAClB,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { CopyHandler } from './use-copy.js';
|
|
3
|
+
import type { MarkdownRenderContext, MessagePartRenderers } from './renderers.js';
|
|
4
|
+
/**
|
|
5
|
+
* Markdown source through the host renderer, or the safe plain-text fallback: paragraphs keep
|
|
6
|
+
* their line breaks (`white-space: pre-wrap`), fenced code becomes a CodeBlock, and no HTML is
|
|
7
|
+
* ever parsed — `<b>` stays the four visible characters it is.
|
|
8
|
+
*/
|
|
9
|
+
export declare function MarkdownContent({ source, context, renderers, onCopy, className, }: {
|
|
10
|
+
source: string;
|
|
11
|
+
context: MarkdownRenderContext;
|
|
12
|
+
renderers?: MessagePartRenderers;
|
|
13
|
+
onCopy?: CopyHandler;
|
|
14
|
+
className?: string;
|
|
15
|
+
}): React.JSX.Element;
|
|
16
|
+
export declare function PlainText({ source, onCopy, className }: {
|
|
17
|
+
source: string;
|
|
18
|
+
onCopy?: CopyHandler;
|
|
19
|
+
className?: string;
|
|
20
|
+
}): React.JSX.Element;
|
|
21
|
+
//# sourceMappingURL=Markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Markdown.d.ts","sourceRoot":"","sources":["../../../src/components/message/Markdown.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAElF;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,OAAO,EACP,SAAS,EACT,MAAM,EACN,SAAS,GACV,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,qBAAqB,CAAC;IAC/B,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,qBAGA;AAED,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,qBAiBpH"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { cx } from '../../utils/cx.js';
|
|
5
|
+
import { CodeBlock } from './CodeBlock.js';
|
|
6
|
+
import { splitFences } from './plain-text.js';
|
|
7
|
+
/**
|
|
8
|
+
* Markdown source through the host renderer, or the safe plain-text fallback: paragraphs keep
|
|
9
|
+
* their line breaks (`white-space: pre-wrap`), fenced code becomes a CodeBlock, and no HTML is
|
|
10
|
+
* ever parsed — `<b>` stays the four visible characters it is.
|
|
11
|
+
*/
|
|
12
|
+
export function MarkdownContent({ source, context, renderers, onCopy, className, }) {
|
|
13
|
+
if (renderers?.markdown)
|
|
14
|
+
return _jsx("div", { className: cx('rl-agent-md', className), children: renderers.markdown(source, context) });
|
|
15
|
+
return _jsx(PlainText, { source: source, onCopy: onCopy, className: className });
|
|
16
|
+
}
|
|
17
|
+
export function PlainText({ source, onCopy, className }) {
|
|
18
|
+
const segments = React.useMemo(() => splitFences(source), [source]);
|
|
19
|
+
return (_jsx("div", { className: cx('rl-agent-md', className), "data-fallback": "", children: segments.map((segment, i) => segment.kind === 'code' ? (_jsx(CodeBlock, { code: segment.code, language: segment.language, onCopy: onCopy }, i)) : (segment.paragraphs.map((p, j) => (_jsx("p", { className: "rl-agent-md__p", children: p }, `${i}-${j}`))))) }));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=Markdown.js.map
|