@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,26 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export interface SkillOption {
|
|
3
|
+
id: string;
|
|
4
|
+
label: string;
|
|
5
|
+
source?: string;
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
disabledReason?: string;
|
|
8
|
+
}
|
|
9
|
+
export type SkillPickerProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'children' | 'onChange'> & {
|
|
10
|
+
skills: readonly SkillOption[];
|
|
11
|
+
selected: readonly SkillOption[];
|
|
12
|
+
onChange: (skills: SkillOption[]) => void;
|
|
13
|
+
max?: number;
|
|
14
|
+
open?: boolean;
|
|
15
|
+
defaultOpen?: boolean;
|
|
16
|
+
onOpenChange?: (open: boolean) => void;
|
|
17
|
+
anchor?: React.RefObject<HTMLElement | null> | HTMLElement;
|
|
18
|
+
hideTrigger?: boolean;
|
|
19
|
+
loading?: boolean;
|
|
20
|
+
error?: React.ReactNode;
|
|
21
|
+
onRetry?: () => void;
|
|
22
|
+
onLimitReached?: (max: number) => void;
|
|
23
|
+
disabled?: boolean;
|
|
24
|
+
};
|
|
25
|
+
export declare function SkillPicker({ skills, selected, onChange, max, open, defaultOpen, onOpenChange, anchor, hideTrigger, loading, error, onRetry, onLimitReached, disabled, className, ...rest }: SkillPickerProps): React.JSX.Element;
|
|
26
|
+
//# sourceMappingURL=SkillPicker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SkillPicker.d.ts","sourceRoot":"","sources":["../../../src/components/composer/SkillPicker.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,MAAM,WAAW,WAAW;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAAE;AACzH,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC,GAAG;IACnG,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IAC/B,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IACjC,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,WAAW,CAAC;IAC3D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAO,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,WAAmB,EAAE,OAAe,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,QAAgB,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,gBAAgB,qBAuBzO"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Button, Popover, Tag } from '@wzrhine/react';
|
|
4
|
+
import { useAgentMessages } from '../../provider/AgentMessages.js';
|
|
5
|
+
import { cx } from '../../utils/cx.js';
|
|
6
|
+
export function SkillPicker({ skills, selected, onChange, max = 4, open, defaultOpen, onOpenChange, anchor, hideTrigger = false, loading = false, error, onRetry, onLimitReached, disabled = false, className, ...rest }) {
|
|
7
|
+
const m = useAgentMessages().composer;
|
|
8
|
+
const trigger = hideTrigger ? undefined : _jsx(Button, { size: "sm", variant: "ghost", disabled: disabled, children: m.skillPicker.add });
|
|
9
|
+
const selectedIds = new Set(selected.map((item) => item.id));
|
|
10
|
+
const choose = (item) => {
|
|
11
|
+
if (disabled)
|
|
12
|
+
return;
|
|
13
|
+
if (selectedIds.has(item.id)) {
|
|
14
|
+
// An invalid/stale selection remains removable even though the option itself is disabled.
|
|
15
|
+
onChange(selected.filter((entry) => entry.id !== item.id));
|
|
16
|
+
}
|
|
17
|
+
else if (!item.disabled) {
|
|
18
|
+
if (selected.length < max)
|
|
19
|
+
onChange([...selected, item]);
|
|
20
|
+
else
|
|
21
|
+
onLimitReached?.(max);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
return _jsxs("div", { ...rest, className: cx('rl-agent-skill-picker', className), children: [_jsxs(Popover, { trigger: trigger, anchor: anchor, open: open, defaultOpen: defaultOpen, onOpenChange: onOpenChange, title: m.skillPicker.label, initialFocus: false, children: [_jsx("div", { role: "listbox", "aria-label": m.skillPicker.label, "aria-multiselectable": "true", children: loading ? _jsx("p", { role: "status", children: m.skillPicker.loading }) : error ? _jsxs("div", { role: "alert", children: [_jsx("p", { children: error === true ? m.skillPicker.error : error }), onRetry && _jsx(Button, { size: "sm", variant: "ghost", onClick: onRetry, children: m.retry })] }) : skills.length === 0 ? _jsx("p", { children: m.skillPicker.empty }) : skills.map((item) => _jsxs("button", { type: "button", role: "option", "aria-selected": selectedIds.has(item.id), "aria-disabled": item.disabled || undefined, disabled: item.disabled && !selectedIds.has(item.id), title: item.disabledReason, onClick: () => choose(item), children: [_jsx("span", { children: item.label }), item.source && _jsx("small", { children: item.source })] }, item.id)) }), _jsx("p", { className: "rl-agent-skill-picker__limit", children: m.skillPicker.limit(String(max)) })] }), selected.length > 0 && _jsx("div", { className: "rl-agent-skill-picker__selected", "aria-label": m.skillPicker.label, children: selected.map((item) => _jsx(Tag, { tone: item.disabled ? 'invalid' : 'neutral', onRemove: () => choose(item), disabled: disabled, children: item.label }, item.id)) })] });
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=SkillPicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SkillPicker.js","sourceRoot":"","sources":["../../../src/components/composer/SkillPicker.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { CommandOption } from '@wzrhine/agent-core';
|
|
3
|
+
export interface SlashCommandMenuProps {
|
|
4
|
+
open: boolean;
|
|
5
|
+
/** Text typed after `/`. */
|
|
6
|
+
query: string;
|
|
7
|
+
/** Options in display order. Composer orders them commands first, then skills (`orderCommandOptions`). */
|
|
8
|
+
options: readonly CommandOption[];
|
|
9
|
+
activeIndex: number;
|
|
10
|
+
onActiveIndexChange: (index: number) => void;
|
|
11
|
+
/** Click on an enabled option. The host decides: insert a token or dispatch an action. */
|
|
12
|
+
onSelect: (option: CommandOption) => void;
|
|
13
|
+
/** Click on a disabled option: nothing is dispatched, the host may show the reason. */
|
|
14
|
+
onDisabledSelect?: (option: CommandOption) => void;
|
|
15
|
+
loading?: boolean;
|
|
16
|
+
id?: string;
|
|
17
|
+
/** `top` / `bottom` = absolutely positioned against the composer; `inline` = in normal flow (standalone use). */
|
|
18
|
+
side?: 'top' | 'bottom' | 'inline';
|
|
19
|
+
title?: React.ReactNode;
|
|
20
|
+
className?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* `/` command and skill picker (atlas 16). Same mechanics as MentionMenu: listbox panel above the
|
|
24
|
+
* composer, focus stays in the textarea, ↑ / ↓ clamp, Enter / Tab choose, Esc closes and
|
|
25
|
+
* remembers the query. Rows show `/name`, aliases, description, the shortcut (`<kbd>`, visual
|
|
26
|
+
* only) and, for disabled entries, the reason. Selected skills carry a check and "已选用".
|
|
27
|
+
*
|
|
28
|
+
* The menu never executes anything: choosing calls `onSelect`; a disabled entry calls
|
|
29
|
+
* `onDisabledSelect` instead. Groups: `option.group`, else 命令 / 技能 by kind.
|
|
30
|
+
* Motion: MotionPresence `fade` (reduced → instant).
|
|
31
|
+
*/
|
|
32
|
+
export declare function SlashCommandMenu({ open, query, options, activeIndex, onActiveIndexChange, onSelect, onDisabledSelect, loading, id, side, title, className, }: SlashCommandMenuProps): React.JSX.Element;
|
|
33
|
+
//# sourceMappingURL=SlashCommandMenu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SlashCommandMenu.d.ts","sourceRoot":"","sources":["../../../src/components/composer/SlashCommandMenu.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAMzD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,OAAO,CAAC;IACd,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,0GAA0G;IAC1G,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,0FAA0F;IAC1F,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IAC1C,uFAAuF;IACvF,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IACnD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,iHAAiH;IACjH,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACnC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,KAAK,EACL,OAAO,EACP,WAAW,EACX,mBAAmB,EACnB,QAAQ,EACR,gBAAgB,EAChB,OAAe,EACf,EAAE,EACF,IAAI,EACJ,KAAK,EACL,SAAS,GACV,EAAE,qBAAqB,qBA8FvB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
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 { Spinner } from '@wzrhine/react';
|
|
5
|
+
import { AgentIcon } from '../../primitives/icons.js';
|
|
6
|
+
import { useAgentMessages } from '../../provider/AgentMessages.js';
|
|
7
|
+
import { groupOptions } from './composer-utils.js';
|
|
8
|
+
import { Highlight, MenuGroup, MenuOption, MenuPanel } from './MenuPanel.js';
|
|
9
|
+
/**
|
|
10
|
+
* `/` command and skill picker (atlas 16). Same mechanics as MentionMenu: listbox panel above the
|
|
11
|
+
* composer, focus stays in the textarea, ↑ / ↓ clamp, Enter / Tab choose, Esc closes and
|
|
12
|
+
* remembers the query. Rows show `/name`, aliases, description, the shortcut (`<kbd>`, visual
|
|
13
|
+
* only) and, for disabled entries, the reason. Selected skills carry a check and "已选用".
|
|
14
|
+
*
|
|
15
|
+
* The menu never executes anything: choosing calls `onSelect`; a disabled entry calls
|
|
16
|
+
* `onDisabledSelect` instead. Groups: `option.group`, else 命令 / 技能 by kind.
|
|
17
|
+
* Motion: MotionPresence `fade` (reduced → instant).
|
|
18
|
+
*/
|
|
19
|
+
export function SlashCommandMenu({ open, query, options, activeIndex, onActiveIndexChange, onSelect, onDisabledSelect, loading = false, id, side, title, className, }) {
|
|
20
|
+
const messages = useAgentMessages().composer;
|
|
21
|
+
const autoId = React.useId();
|
|
22
|
+
const base = id ?? autoId;
|
|
23
|
+
const listboxId = `${base}-listbox`;
|
|
24
|
+
const choose = (index) => {
|
|
25
|
+
const option = options[index];
|
|
26
|
+
if (!option)
|
|
27
|
+
return;
|
|
28
|
+
if (option.disabled)
|
|
29
|
+
onDisabledSelect?.(option);
|
|
30
|
+
else
|
|
31
|
+
onSelect(option);
|
|
32
|
+
};
|
|
33
|
+
let status = null;
|
|
34
|
+
if (loading) {
|
|
35
|
+
status = (_jsxs("p", { className: "rl-agent-menu__status", role: "status", children: [_jsx(Spinner, { size: "sm" }), messages.commandLoading] }));
|
|
36
|
+
}
|
|
37
|
+
else if (options.length === 0) {
|
|
38
|
+
status = (_jsx("p", { className: "rl-agent-menu__status", role: "status", children: messages.commandEmpty }));
|
|
39
|
+
}
|
|
40
|
+
const groupLabel = (o) => o.group ?? (o.kind === 'skill' ? messages.skillGroup : messages.commandGroup);
|
|
41
|
+
return (_jsx(MenuPanel, { open: open, panelId: `${base}-panel`, listboxId: listboxId, label: messages.commandTitle, title: title ?? messages.commandTitle, keys: messages.commandKeys, icon: _jsx(AgentIcon, { name: "slash" }), side: side, status: status, count: loading ? 0 : options.length, activeIndex: activeIndex, className: className, children: groupOptions(options, groupLabel).map((group) => (_jsx(MenuGroup, { label: group.label, children: group.items.map(({ option, index }) => (_jsxs(MenuOption, { listboxId: listboxId, index: index, active: index === activeIndex, disabled: option.disabled, onActivate: onActiveIndexChange, onChoose: choose, "data-kind": option.kind, children: [_jsx(AgentIcon, { name: option.kind === 'skill' ? 'spark' : option.kind === 'action' ? 'tool' : 'slash', className: "rl-agent-menu__icon" }), _jsxs("span", { className: "rl-agent-menu__body", children: [_jsxs("span", { className: "rl-agent-menu__label", children: [_jsx("span", { children: _jsx(Highlight, { text: option.label, query: query }) }), _jsxs("span", { className: "rl-agent-menu__command", children: ["/", _jsx(Highlight, { text: option.name, query: query })] }), option.aliases && option.aliases.length > 0 && (_jsx("span", { className: "rl-agent-menu__aliases", children: option.aliases.map((a) => `/${a}`).join(' ') }))] }), option.disabled ? (_jsx("span", { className: "rl-agent-menu__reason", children: messages.optionUnavailable(option.disabledReason) })) : (option.description && _jsx("span", { className: "rl-agent-menu__detail", children: option.description }))] }), option.shortcut && (_jsx("kbd", { className: "rl-agent-menu__kbd", "aria-hidden": "true", children: option.shortcut })), option.selected && (_jsxs(_Fragment, { children: [_jsx(AgentIcon, { name: "check", className: "rl-agent-menu__trail" }), _jsx("span", { className: "rl-agent-sr", children: messages.skillSelected })] }))] }, option.id))) }, group.key))) }));
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=SlashCommandMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SlashCommandMenu.js","sourceRoot":"","sources":["../../../src/components/composer/SlashCommandMenu.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `stripStray` that also maps the caret: isolate characters left over from partial edits (e.g. a
|
|
3
|
+
* selection that cut half a token) are removed, and the caret moves left by the number of removed
|
|
4
|
+
* characters before it. Returns the input untouched when nothing is stray.
|
|
5
|
+
*/
|
|
6
|
+
export declare function stripStrayWithCaret(value: string, caret: number): {
|
|
7
|
+
value: string;
|
|
8
|
+
caret: number;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=composer-text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composer-text.d.ts","sourceRoot":"","sources":["../../../src/components/composer/composer-text.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAelG"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { TOKEN_CLOSE, TOKEN_OPEN, parseTokens, stripStray } from '@wzrhine/agent-core';
|
|
2
|
+
/**
|
|
3
|
+
* `stripStray` that also maps the caret: isolate characters left over from partial edits (e.g. a
|
|
4
|
+
* selection that cut half a token) are removed, and the caret moves left by the number of removed
|
|
5
|
+
* characters before it. Returns the input untouched when nothing is stray.
|
|
6
|
+
*/
|
|
7
|
+
export function stripStrayWithCaret(value, caret) {
|
|
8
|
+
if (!value.includes(TOKEN_OPEN) && !value.includes(TOKEN_CLOSE))
|
|
9
|
+
return { value, caret };
|
|
10
|
+
const next = stripStray(value);
|
|
11
|
+
if (next === value)
|
|
12
|
+
return { value, caret };
|
|
13
|
+
const keep = new Set();
|
|
14
|
+
for (const token of parseTokens(value)) {
|
|
15
|
+
keep.add(token.start);
|
|
16
|
+
keep.add(token.end - 1);
|
|
17
|
+
}
|
|
18
|
+
let removedBefore = 0;
|
|
19
|
+
for (let i = 0; i < Math.min(caret, value.length); i += 1) {
|
|
20
|
+
const ch = value[i];
|
|
21
|
+
if ((ch === TOKEN_OPEN || ch === TOKEN_CLOSE) && !keep.has(i))
|
|
22
|
+
removedBefore += 1;
|
|
23
|
+
}
|
|
24
|
+
return { value: next, caret: Math.max(0, caret - removedBefore) };
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=composer-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composer-text.js","sourceRoot":"","sources":["../../../src/components/composer/composer-text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEvF;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAa,EAAE,KAAa;IAC9D,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACzF,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC1B,CAAC;IACD,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1D,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,EAAE,KAAK,UAAU,IAAI,EAAE,KAAK,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,aAAa,IAAI,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,aAAa,CAAC,EAAE,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { ActionStatus, CommandOption, DraftStatus, MentionOption, RunStatus, TriggerChar } from '@wzrhine/agent-core';
|
|
2
|
+
/** DOM id of option `index` in the listbox `listboxId` (used by aria-activedescendant). */
|
|
3
|
+
export declare function menuOptionId(listboxId: string, index: number): string;
|
|
4
|
+
/**
|
|
5
|
+
* Next active index for ↑ / ↓. Clamped at both ends (no wrap-around), so holding a key never
|
|
6
|
+
* jumps from the last option back to the first. Disabled options stay reachable: their reason is
|
|
7
|
+
* read out when active. Returns -1 for an empty list.
|
|
8
|
+
*/
|
|
9
|
+
export declare function moveActiveIndex(count: number, index: number, delta: number): number;
|
|
10
|
+
/** Splits an `@` query into the drilled folder prefix (`src/components/`) and the filter (`but`). */
|
|
11
|
+
export declare function splitMentionQuery(query: string): {
|
|
12
|
+
directory: string;
|
|
13
|
+
filter: string;
|
|
14
|
+
};
|
|
15
|
+
/** Query after drilling into a folder option: `src/` + `components/`. */
|
|
16
|
+
export declare function drillQuery(query: string, option: MentionOption): string;
|
|
17
|
+
/** Default token name for a mention: the drilled folder prefix + the option label (`src/agent.ts`). */
|
|
18
|
+
export declare function defaultMentionTokenName(option: MentionOption, query: string): string;
|
|
19
|
+
/** Case-insensitive filter over label and detail, using the filter part of the query. */
|
|
20
|
+
export declare function filterMentionOptions(options: readonly MentionOption[], query: string): MentionOption[];
|
|
21
|
+
/** Matches name, aliases, label and description; exact name / alias matches come first. */
|
|
22
|
+
export declare function filterCommandOptions(options: readonly CommandOption[], query: string): CommandOption[];
|
|
23
|
+
/** Commands (and actions) first, then skills, keeping the host order inside each kind. */
|
|
24
|
+
export declare function orderCommandOptions(options: readonly CommandOption[]): CommandOption[];
|
|
25
|
+
export interface OptionGroup<T> {
|
|
26
|
+
key: string;
|
|
27
|
+
label: string | undefined;
|
|
28
|
+
items: Array<{
|
|
29
|
+
option: T;
|
|
30
|
+
index: number;
|
|
31
|
+
}>;
|
|
32
|
+
}
|
|
33
|
+
/** Groups consecutive options by `group(option)`, keeping their flat index for keyboard state. */
|
|
34
|
+
export declare function groupOptions<T>(options: readonly T[], group: (option: T) => string | undefined): OptionGroup<T>[];
|
|
35
|
+
/** Removes every `trigger + name` token (and one adjacent space) from a value. */
|
|
36
|
+
export declare function removeTokens(value: string, trigger: TriggerChar, name: string): string;
|
|
37
|
+
/** Thumbnails are only drawn from `data:image/`, `blob:` or same-origin URLs handed in by the host. */
|
|
38
|
+
export declare function isSafeThumbnail(url: string | undefined, origin?: string): boolean;
|
|
39
|
+
/** Visible state of the persistent send / stop button (ADR-0011 §3–4). */
|
|
40
|
+
export type SendStopState = 'send' | 'sending' | 'send-unknown' | 'retry-save' | 'stop' | 'stop-pending' | 'stop-unknown';
|
|
41
|
+
export interface SendStopInput {
|
|
42
|
+
canSend: boolean;
|
|
43
|
+
/** Explicit mode; otherwise derived from `runStatus`. */
|
|
44
|
+
mode?: 'send' | 'stop';
|
|
45
|
+
runStatus?: RunStatus;
|
|
46
|
+
/** Receipt of the last send. */
|
|
47
|
+
sendStatus?: ActionStatus;
|
|
48
|
+
/** Receipt of the last stop request. */
|
|
49
|
+
stopStatus?: ActionStatus;
|
|
50
|
+
draftStatus?: DraftStatus;
|
|
51
|
+
hasSend: boolean;
|
|
52
|
+
hasStop: boolean;
|
|
53
|
+
hasRetry: boolean;
|
|
54
|
+
/** From the unknown receipt: whether retrying the same action is safe (default true). */
|
|
55
|
+
retryable?: boolean;
|
|
56
|
+
hasRetrySave: boolean;
|
|
57
|
+
}
|
|
58
|
+
export interface SendStopResolved {
|
|
59
|
+
state: SendStopState;
|
|
60
|
+
/** Whether activating the button does something right now. */
|
|
61
|
+
enabled: boolean;
|
|
62
|
+
/** Which callback an activation calls. */
|
|
63
|
+
action: 'send' | 'stop' | 'retry' | 'retry-save' | null;
|
|
64
|
+
/** Icon shown: arrow or square. */
|
|
65
|
+
icon: 'send' | 'stop';
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Decides the button state. "Stop sent" ≠ "stopped": while the run is `cancelling` or the stop
|
|
69
|
+
* request is in flight / accepted but the run still runs, the button is `stop-pending` (inert).
|
|
70
|
+
* Unknown receipts never look like success and never create a new action: they offer the retry
|
|
71
|
+
* callback (same actionId, host-owned) when it is safe, otherwise stay inert.
|
|
72
|
+
*/
|
|
73
|
+
export declare function resolveSendStop(input: SendStopInput): SendStopResolved;
|
|
74
|
+
//# sourceMappingURL=composer-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composer-utils.d.ts","sourceRoot":"","sources":["../../../src/components/composer/composer-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { canStopRun, encodeToken } from '@wzrhine/agent-core';
|
|
2
|
+
/*
|
|
3
|
+
* Pure helpers for the composer family (no React). Hosts may use the filters for local option
|
|
4
|
+
* lists; remote lists are filtered by the host in `onMentionQuery` / `onCommandQuery`.
|
|
5
|
+
*/
|
|
6
|
+
/** DOM id of option `index` in the listbox `listboxId` (used by aria-activedescendant). */
|
|
7
|
+
export function menuOptionId(listboxId, index) {
|
|
8
|
+
return `${listboxId}-option-${index}`;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Next active index for ↑ / ↓. Clamped at both ends (no wrap-around), so holding a key never
|
|
12
|
+
* jumps from the last option back to the first. Disabled options stay reachable: their reason is
|
|
13
|
+
* read out when active. Returns -1 for an empty list.
|
|
14
|
+
*/
|
|
15
|
+
export function moveActiveIndex(count, index, delta) {
|
|
16
|
+
if (count <= 0)
|
|
17
|
+
return -1;
|
|
18
|
+
if (index < 0)
|
|
19
|
+
return delta > 0 ? 0 : count - 1;
|
|
20
|
+
return Math.max(0, Math.min(count - 1, index + delta));
|
|
21
|
+
}
|
|
22
|
+
/** Splits an `@` query into the drilled folder prefix (`src/components/`) and the filter (`but`). */
|
|
23
|
+
export function splitMentionQuery(query) {
|
|
24
|
+
const slash = query.lastIndexOf('/');
|
|
25
|
+
return slash === -1 ? { directory: '', filter: query } : { directory: query.slice(0, slash + 1), filter: query.slice(slash + 1) };
|
|
26
|
+
}
|
|
27
|
+
/** Query after drilling into a folder option: `src/` + `components/`. */
|
|
28
|
+
export function drillQuery(query, option) {
|
|
29
|
+
return `${splitMentionQuery(query).directory}${option.label}/`;
|
|
30
|
+
}
|
|
31
|
+
/** Default token name for a mention: the drilled folder prefix + the option label (`src/agent.ts`). */
|
|
32
|
+
export function defaultMentionTokenName(option, query) {
|
|
33
|
+
return `${splitMentionQuery(query).directory}${option.label}`;
|
|
34
|
+
}
|
|
35
|
+
/** Case-insensitive filter over label and detail, using the filter part of the query. */
|
|
36
|
+
export function filterMentionOptions(options, query) {
|
|
37
|
+
const needle = splitMentionQuery(query).filter.toLowerCase();
|
|
38
|
+
if (!needle)
|
|
39
|
+
return [...options];
|
|
40
|
+
return options.filter((o) => o.label.toLowerCase().includes(needle) || (o.detail ?? '').toLowerCase().includes(needle));
|
|
41
|
+
}
|
|
42
|
+
/** Matches name, aliases, label and description; exact name / alias matches come first. */
|
|
43
|
+
export function filterCommandOptions(options, query) {
|
|
44
|
+
const needle = query.toLowerCase();
|
|
45
|
+
if (!needle)
|
|
46
|
+
return [...options];
|
|
47
|
+
const hits = options.filter((o) => [o.name, o.label, o.description ?? '', ...(o.aliases ?? [])].some((text) => text.toLowerCase().includes(needle)));
|
|
48
|
+
const exact = (o) => o.name.toLowerCase() === needle || (o.aliases ?? []).some((a) => a.toLowerCase() === needle);
|
|
49
|
+
return [...hits.filter(exact), ...hits.filter((o) => !exact(o))];
|
|
50
|
+
}
|
|
51
|
+
/** Commands (and actions) first, then skills, keeping the host order inside each kind. */
|
|
52
|
+
export function orderCommandOptions(options) {
|
|
53
|
+
return [...options.filter((o) => o.kind !== 'skill'), ...options.filter((o) => o.kind === 'skill')];
|
|
54
|
+
}
|
|
55
|
+
/** Groups consecutive options by `group(option)`, keeping their flat index for keyboard state. */
|
|
56
|
+
export function groupOptions(options, group) {
|
|
57
|
+
const groups = [];
|
|
58
|
+
options.forEach((option, index) => {
|
|
59
|
+
const label = group(option);
|
|
60
|
+
const last = groups[groups.length - 1];
|
|
61
|
+
if (last && last.label === label)
|
|
62
|
+
last.items.push({ option, index });
|
|
63
|
+
else
|
|
64
|
+
groups.push({ key: `${groups.length}-${label ?? ''}`, label, items: [{ option, index }] });
|
|
65
|
+
});
|
|
66
|
+
return groups;
|
|
67
|
+
}
|
|
68
|
+
/** Removes every `trigger + name` token (and one adjacent space) from a value. */
|
|
69
|
+
export function removeTokens(value, trigger, name) {
|
|
70
|
+
const token = encodeToken(trigger, name);
|
|
71
|
+
let out = value;
|
|
72
|
+
for (;;) {
|
|
73
|
+
const at = out.indexOf(token);
|
|
74
|
+
if (at === -1)
|
|
75
|
+
return out;
|
|
76
|
+
let start = at;
|
|
77
|
+
let end = at + token.length;
|
|
78
|
+
if (out[end] === ' ')
|
|
79
|
+
end += 1;
|
|
80
|
+
else if (start > 0 && out[start - 1] === ' ')
|
|
81
|
+
start -= 1;
|
|
82
|
+
out = out.slice(0, start) + out.slice(end);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/** Thumbnails are only drawn from `data:image/`, `blob:` or same-origin URLs handed in by the host. */
|
|
86
|
+
export function isSafeThumbnail(url, origin) {
|
|
87
|
+
if (!url)
|
|
88
|
+
return false;
|
|
89
|
+
if (/^data:image\//i.test(url) || /^blob:/i.test(url))
|
|
90
|
+
return true;
|
|
91
|
+
if (/^[a-z][a-z\d+.-]*:/i.test(url) || url.startsWith('//')) {
|
|
92
|
+
if (!origin)
|
|
93
|
+
return false;
|
|
94
|
+
try {
|
|
95
|
+
return new URL(url).origin === origin;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Relative URL: same origin by definition.
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Decides the button state. "Stop sent" ≠ "stopped": while the run is `cancelling` or the stop
|
|
106
|
+
* request is in flight / accepted but the run still runs, the button is `stop-pending` (inert).
|
|
107
|
+
* Unknown receipts never look like success and never create a new action: they offer the retry
|
|
108
|
+
* callback (same actionId, host-owned) when it is safe, otherwise stay inert.
|
|
109
|
+
*/
|
|
110
|
+
export function resolveSendStop(input) {
|
|
111
|
+
const stoppable = input.mode === 'stop' || (input.mode === undefined && input.runStatus !== undefined && (canStopRun(input.runStatus) || input.runStatus === 'cancelling'));
|
|
112
|
+
if (stoppable && (input.hasStop || input.runStatus === 'cancelling' || input.stopStatus !== undefined)) {
|
|
113
|
+
if (input.runStatus === 'cancelling' || input.stopStatus === 'submitting' || input.stopStatus === 'accepted') {
|
|
114
|
+
return { state: 'stop-pending', enabled: false, action: null, icon: 'stop' };
|
|
115
|
+
}
|
|
116
|
+
if (input.stopStatus === 'unknown') {
|
|
117
|
+
const canRetry = input.hasRetry && input.retryable !== false;
|
|
118
|
+
return { state: 'stop-unknown', enabled: canRetry, action: canRetry ? 'retry' : null, icon: 'stop' };
|
|
119
|
+
}
|
|
120
|
+
return { state: 'stop', enabled: input.hasStop, action: input.hasStop ? 'stop' : null, icon: 'stop' };
|
|
121
|
+
}
|
|
122
|
+
if (input.sendStatus === 'submitting')
|
|
123
|
+
return { state: 'sending', enabled: false, action: null, icon: 'send' };
|
|
124
|
+
if (input.sendStatus === 'unknown') {
|
|
125
|
+
const canRetry = input.hasRetry && input.retryable !== false;
|
|
126
|
+
return { state: 'send-unknown', enabled: canRetry, action: canRetry ? 'retry' : null, icon: 'send' };
|
|
127
|
+
}
|
|
128
|
+
if (input.draftStatus === 'error' && input.hasRetrySave)
|
|
129
|
+
return { state: 'retry-save', enabled: true, action: 'retry-save', icon: 'send' };
|
|
130
|
+
const enabled = input.canSend && input.hasSend && !stoppable;
|
|
131
|
+
return { state: 'send', enabled, action: enabled ? 'send' : null, icon: 'send' };
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=composer-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composer-utils.js","sourceRoot":"","sources":["../../../src/components/composer/composer-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { ConversationSection, ConversationView } from '@wzrhine/agent-core';
|
|
3
|
+
import type { ConversationRowProps } from './ConversationRow.js';
|
|
4
|
+
/**
|
|
5
|
+
* ConversationList (atlas 03): grouped conversation index with search, selection and row actions.
|
|
6
|
+
*
|
|
7
|
+
* - Data in, actions out: `sections` are rendered as given (the host filters for `search`, sorts
|
|
8
|
+
* and dedupes); empty sections are skipped. Selection is `selectedId` + `onSelect`, nothing
|
|
9
|
+
* else: a background refresh (new `sections`) never changes the selection or moves focus.
|
|
10
|
+
* If the focused row disappears and focus fell back to `<body>`, focus moves to the nearest
|
|
11
|
+
* remaining row so keyboard users are not dropped at the top of the page.
|
|
12
|
+
* - Structure: each group is a heading (`headingLevel`, default h2) and a `<ul>` labelled by it;
|
|
13
|
+
* rows are `<li>` with real buttons. The viewport scrolls on its own.
|
|
14
|
+
* - Keyboard: one row is the Tab stop (the focused, else selected, else first row); ↑ / ↓ move
|
|
15
|
+
* focus between rows across groups, Home / End jump to the first / last row. Enter / Space
|
|
16
|
+
* select (native button). Tab from a row reaches its "more" button, then leaves the list.
|
|
17
|
+
* - Search: rendered only with `onSearchChange` (labelled `type="search"` input). The result
|
|
18
|
+
* count is announced through a polite status that is mounted before the query changes.
|
|
19
|
+
* - States: `loading` without items shows skeleton rows (`aria-busy`, sr text); with items it
|
|
20
|
+
* keeps them and marks the list busy. `error` shows an Alert with 「重试」 when `onRetry` is
|
|
21
|
+
* given. No items shows an EmptyState (search-empty when `search` is non-empty).
|
|
22
|
+
* - Motion: one shared selection ghost glides between rows via motion/react `layoutId`, scoped
|
|
23
|
+
* per instance with `useId` (two lists never trade ghosts), on `resolve('transform', 'base')`;
|
|
24
|
+
* under reduced motion it jumps. Rows themselves never animate layout, so 300 rows stay cheap.
|
|
25
|
+
*/
|
|
26
|
+
export type ConversationListProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect' | 'children'> & {
|
|
27
|
+
sections: ConversationSection[];
|
|
28
|
+
selectedId?: string;
|
|
29
|
+
onSelect?: (id: string) => void;
|
|
30
|
+
/** Controlled search query; the host filters `sections`. */
|
|
31
|
+
search?: string;
|
|
32
|
+
/** Renders the search input. */
|
|
33
|
+
onSearchChange?: (query: string) => void;
|
|
34
|
+
loading?: boolean;
|
|
35
|
+
/** Error message; `true` uses the default copy. */
|
|
36
|
+
error?: React.ReactNode;
|
|
37
|
+
onRetry?: () => void;
|
|
38
|
+
/** Extra controls per row (rendered before the "more" menu). */
|
|
39
|
+
renderActions?: (item: ConversationView) => React.ReactNode;
|
|
40
|
+
onPin?: ConversationRowProps['onPin'];
|
|
41
|
+
onArchive?: ConversationRowProps['onArchive'];
|
|
42
|
+
onUnarchive?: ConversationRowProps['onUnarchive'];
|
|
43
|
+
onDelete?: ConversationRowProps['onDelete'];
|
|
44
|
+
/** Rows that cannot be selected or acted on (e.g. while a switch is pending). */
|
|
45
|
+
isDisabled?: (item: ConversationView) => boolean;
|
|
46
|
+
/** Level of the group headings (and the empty-state title). */
|
|
47
|
+
headingLevel?: 2 | 3 | 4 | 5 | 6;
|
|
48
|
+
/** Accessible name of the list region. */
|
|
49
|
+
label?: string;
|
|
50
|
+
/** Empty state shown when there are no conversations and no search. */
|
|
51
|
+
empty?: React.ReactNode;
|
|
52
|
+
/** Reference time for row timestamps (default: now). */
|
|
53
|
+
now?: Date;
|
|
54
|
+
/** Number of skeleton rows while loading. */
|
|
55
|
+
skeletonRows?: number;
|
|
56
|
+
collapsibleGroups?: boolean;
|
|
57
|
+
collapsedGroups?: readonly string[];
|
|
58
|
+
onCollapsedGroupsChange?: (groups: string[]) => void;
|
|
59
|
+
};
|
|
60
|
+
export declare const ConversationList: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLDivElement>, "children" | "onSelect"> & {
|
|
61
|
+
sections: ConversationSection[];
|
|
62
|
+
selectedId?: string;
|
|
63
|
+
onSelect?: (id: string) => void;
|
|
64
|
+
/** Controlled search query; the host filters `sections`. */
|
|
65
|
+
search?: string;
|
|
66
|
+
/** Renders the search input. */
|
|
67
|
+
onSearchChange?: (query: string) => void;
|
|
68
|
+
loading?: boolean;
|
|
69
|
+
/** Error message; `true` uses the default copy. */
|
|
70
|
+
error?: React.ReactNode;
|
|
71
|
+
onRetry?: () => void;
|
|
72
|
+
/** Extra controls per row (rendered before the "more" menu). */
|
|
73
|
+
renderActions?: (item: ConversationView) => React.ReactNode;
|
|
74
|
+
onPin?: ConversationRowProps["onPin"];
|
|
75
|
+
onArchive?: ConversationRowProps["onArchive"];
|
|
76
|
+
onUnarchive?: ConversationRowProps["onUnarchive"];
|
|
77
|
+
onDelete?: ConversationRowProps["onDelete"];
|
|
78
|
+
/** Rows that cannot be selected or acted on (e.g. while a switch is pending). */
|
|
79
|
+
isDisabled?: (item: ConversationView) => boolean;
|
|
80
|
+
/** Level of the group headings (and the empty-state title). */
|
|
81
|
+
headingLevel?: 2 | 3 | 4 | 5 | 6;
|
|
82
|
+
/** Accessible name of the list region. */
|
|
83
|
+
label?: string;
|
|
84
|
+
/** Empty state shown when there are no conversations and no search. */
|
|
85
|
+
empty?: React.ReactNode;
|
|
86
|
+
/** Reference time for row timestamps (default: now). */
|
|
87
|
+
now?: Date;
|
|
88
|
+
/** Number of skeleton rows while loading. */
|
|
89
|
+
skeletonRows?: number;
|
|
90
|
+
collapsibleGroups?: boolean;
|
|
91
|
+
collapsedGroups?: readonly string[];
|
|
92
|
+
onCollapsedGroupsChange?: (groups: string[]) => void;
|
|
93
|
+
} & React.RefAttributes<HTMLDivElement>>;
|
|
94
|
+
//# sourceMappingURL=ConversationList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConversationList.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/ConversationList.tsx"],"names":[],"mappings":"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"}
|