@wzrhine/agent 0.0.0-stage → 0.1.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 +23 -0
- package/LICENSE +21 -0
- package/README.md +29 -3
- package/dist/agent.css +15 -0
- package/dist/components/artifact/ArtifactCard.d.ts +56 -0
- package/dist/components/artifact/ArtifactCard.d.ts.map +1 -0
- package/dist/components/artifact/ArtifactCard.js +78 -0
- package/dist/components/artifact/ArtifactCard.js.map +1 -0
- package/dist/components/artifact/FilePreview.d.ts +117 -0
- package/dist/components/artifact/FilePreview.d.ts.map +1 -0
- package/dist/components/artifact/FilePreview.js +207 -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 +56 -0
- package/dist/components/composer/AttachmentList.js.map +1 -0
- package/dist/components/composer/Composer.d.ts +113 -0
- package/dist/components/composer/Composer.d.ts.map +1 -0
- package/dist/components/composer/Composer.js +327 -0
- package/dist/components/composer/Composer.js.map +1 -0
- package/dist/components/composer/ComposerInput.d.ts +101 -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 +55 -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 +40 -0
- package/dist/components/composer/ModelPicker.d.ts.map +1 -0
- package/dist/components/composer/ModelPicker.js +115 -0
- package/dist/components/composer/ModelPicker.js.map +1 -0
- package/dist/components/composer/PermissionPicker.d.ts +31 -0
- package/dist/components/composer/PermissionPicker.d.ts.map +1 -0
- package/dist/components/composer/PermissionPicker.js +43 -0
- package/dist/components/composer/PermissionPicker.js.map +1 -0
- package/dist/components/composer/SendStopButton.d.ts +71 -0
- package/dist/components/composer/SendStopButton.d.ts.map +1 -0
- package/dist/components/composer/SendStopButton.js +87 -0
- package/dist/components/composer/SendStopButton.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 +88 -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 +30 -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 +60 -0
- package/dist/components/intervention/QuestionnaireCard.d.ts.map +1 -0
- package/dist/components/intervention/QuestionnaireCard.js +322 -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 +29 -0
- package/dist/components/intervention/questionnaire-answers.d.ts.map +1 -0
- package/dist/components/intervention/questionnaire-answers.js +81 -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 +34 -0
- package/dist/components/message/CitationChip.d.ts.map +1 -0
- package/dist/components/message/CitationChip.js +30 -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 +63 -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 +100 -0
- package/dist/components/message/MessageList.d.ts.map +1 -0
- package/dist/components/message/MessageList.js +266 -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 +146 -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 +18 -0
- package/dist/components/message/use-copy.d.ts.map +1 -0
- package/dist/components/message/use-copy.js +65 -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 +38 -0
- package/dist/components/shell/AgentHeader.js.map +1 -0
- package/dist/components/shell/AgentShell.d.ts +138 -0
- package/dist/components/shell/AgentShell.d.ts.map +1 -0
- package/dist/components/shell/AgentShell.js +206 -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 +50 -0
- package/dist/components/shell/ResizeHandle.d.ts.map +1 -0
- package/dist/components/shell/ResizeHandle.js +84 -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 +106 -0
- package/dist/components/tools/ToolDetails.d.ts.map +1 -0
- package/dist/components/tools/ToolDetails.js +247 -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 +54 -0
- package/dist/components/tools/ToolRecord.d.ts.map +1 -0
- package/dist/components/tools/ToolRecord.js +78 -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 +44 -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/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 +60 -0
- package/dist/components/workspace/SubAgentCard.d.ts.map +1 -0
- package/dist/components/workspace/SubAgentCard.js +73 -0
- package/dist/components/workspace/SubAgentCard.js.map +1 -0
- package/dist/components/workspace/TerminalRow.d.ts +51 -0
- package/dist/components/workspace/TerminalRow.d.ts.map +1 -0
- package/dist/components/workspace/TerminalRow.js +62 -0
- package/dist/components/workspace/TerminalRow.js.map +1 -0
- package/dist/components/workspace/shared.d.ts +22 -0
- package/dist/components/workspace/shared.d.ts.map +1 -0
- package/dist/components/workspace/shared.js +36 -0
- package/dist/components/workspace/shared.js.map +1 -0
- package/dist/index.d.ts +130 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +76 -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 +10 -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 +7 -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 +51 -0
- package/dist/provider/AgentMessages.d.ts.map +1 -0
- package/dist/provider/AgentMessages.js +77 -0
- package/dist/provider/AgentMessages.js.map +1 -0
- package/dist/provider/messages/composer.d.ts +90 -0
- package/dist/provider/messages/composer.d.ts.map +1 -0
- package/dist/provider/messages/composer.js +155 -0
- package/dist/provider/messages/composer.js.map +1 -0
- package/dist/provider/messages/intervention.d.ts +135 -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 +118 -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 +20 -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 +210 -0
- package/dist/provider/messages/tools.d.ts.map +1 -0
- package/dist/provider/messages/tools.js +482 -0
- package/dist/provider/messages/tools.js.map +1 -0
- package/dist/provider/messages/workspace.d.ts +176 -0
- package/dist/provider/messages/workspace.d.ts.map +1 -0
- package/dist/provider/messages/workspace.js +325 -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 +441 -0
- package/dist/styles/tools.css +929 -0
- package/dist/styles/workspace.css +1294 -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,33 @@
|
|
|
1
|
+
import { effectivePhase, runPhaseMeta, runStatusMeta } from '@wzrhine/agent-core';
|
|
2
|
+
const attentionGlyph = {
|
|
3
|
+
approval: { glyph: 'approval', tone: 'warning' },
|
|
4
|
+
question: { glyph: 'waiting-user', tone: 'warning' },
|
|
5
|
+
children: { glyph: 'children', tone: 'info' },
|
|
6
|
+
error: { glyph: 'failed', tone: 'danger' },
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Attention (needs the user) wins over the run status. Settled, uneventful runs (`idle`,
|
|
10
|
+
* `completed`, `cancelled`) show no glyph: the list would otherwise be a column of check marks.
|
|
11
|
+
* `failed` / `interrupted` stay visible. No run status = nothing (unknown is never shown as success).
|
|
12
|
+
*/
|
|
13
|
+
export function conversationStatus(item, status, shell) {
|
|
14
|
+
if (item.attention) {
|
|
15
|
+
const meta = attentionGlyph[item.attention];
|
|
16
|
+
return { ...meta, label: shell.attention[item.attention], active: false, kind: 'attention' };
|
|
17
|
+
}
|
|
18
|
+
const run = item.runStatus;
|
|
19
|
+
if (!run || run === 'idle' || run === 'completed' || run === 'cancelled')
|
|
20
|
+
return null;
|
|
21
|
+
const phase = effectivePhase(run, item.runPhase);
|
|
22
|
+
const runMeta = runStatusMeta[run];
|
|
23
|
+
if (phase && runMeta.active) {
|
|
24
|
+
const meta = runPhaseMeta[phase];
|
|
25
|
+
return { glyph: meta.glyph, tone: meta.tone, label: status.phase[phase], active: meta.active, kind: 'run' };
|
|
26
|
+
}
|
|
27
|
+
return { glyph: runMeta.glyph, tone: runMeta.tone, label: status.run[run], active: runMeta.active, kind: 'run' };
|
|
28
|
+
}
|
|
29
|
+
/** Same calendar day in local time. */
|
|
30
|
+
export function isSameDay(a, b) {
|
|
31
|
+
return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=conversation-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-status.js","sourceRoot":"","sources":["../../../src/components/conversation/conversation-status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAclF,MAAM,cAAc,GAAoG;IACtH,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE;IAChD,QAAQ,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE;IACpD,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE;IAC7C,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;CAC3C,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAsB,EAAE,MAA2B,EAAE,KAAyB;IAC/G,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5C,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAC/F,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC;IAC3B,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IACtF,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QACjC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC9G,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACnH,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,SAAS,CAAC,CAAO,EAAE,CAAO;IACxC,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;AAC7G,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { FileDiffView } from '@wzrhine/agent-core';
|
|
3
|
+
/**
|
|
4
|
+
* Minimal read-only diff list for approval material (internal; not exported). Hosts that want
|
|
5
|
+
* the full tools `DiffPreview` pass it through `ApprovalPanel renderMaterial`.
|
|
6
|
+
*
|
|
7
|
+
* A11y: a `<figure>` named by the path; each hunk is an `<ol>` whose rows carry the sign as text
|
|
8
|
+
* (`+` / `−`, plus a visually hidden "新增 / 删除" word) so the change is never colour only.
|
|
9
|
+
* Long lines scroll horizontally inside the bounded frame instead of widening the page.
|
|
10
|
+
*/
|
|
11
|
+
export declare function ApprovalDiff({ diff }: {
|
|
12
|
+
diff: FileDiffView;
|
|
13
|
+
}): React.JSX.Element;
|
|
14
|
+
//# sourceMappingURL=ApprovalDiff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApprovalDiff.d.ts","sourceRoot":"","sources":["../../../src/components/intervention/ApprovalDiff.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGxD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,qBAoD5D"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { useAgentMessages } from '../../provider/AgentMessages.js';
|
|
5
|
+
/**
|
|
6
|
+
* Minimal read-only diff list for approval material (internal; not exported). Hosts that want
|
|
7
|
+
* the full tools `DiffPreview` pass it through `ApprovalPanel renderMaterial`.
|
|
8
|
+
*
|
|
9
|
+
* A11y: a `<figure>` named by the path; each hunk is an `<ol>` whose rows carry the sign as text
|
|
10
|
+
* (`+` / `−`, plus a visually hidden "新增 / 删除" word) so the change is never colour only.
|
|
11
|
+
* Long lines scroll horizontally inside the bounded frame instead of widening the page.
|
|
12
|
+
*/
|
|
13
|
+
export function ApprovalDiff({ diff }) {
|
|
14
|
+
const m = useAgentMessages().intervention;
|
|
15
|
+
const captionId = React.useId();
|
|
16
|
+
const additions = diff.additions ?? diff.hunks.reduce((n, h) => n + h.lines.filter((l) => l.kind === 'add').length, 0);
|
|
17
|
+
const deletions = diff.deletions ?? diff.hunks.reduce((n, h) => n + h.lines.filter((l) => l.kind === 'remove').length, 0);
|
|
18
|
+
const empty = diff.hunks.every((h) => h.lines.length === 0);
|
|
19
|
+
return (_jsxs("figure", { className: "rl-agent-approval-diff", "aria-labelledby": captionId, children: [_jsxs("figcaption", { id: captionId, className: "rl-agent-approval-diff__caption", children: [_jsx("span", { className: "rl-agent-approval-diff__change", children: m.diffChange[diff.change] }), _jsxs("span", { className: "rl-agent-approval-diff__path", children: [diff.path, diff.movedTo ? ` → ${diff.movedTo}` : ''] }), _jsx("span", { className: "rl-agent-approval-diff__stats", children: m.diffStats(additions, deletions) }), _jsx("span", { className: "rl-agent-sr", children: m.diffLabel(diff.path) })] }), diff.binary ? (_jsx("p", { className: "rl-agent-approval-diff__note", children: m.diffBinary })) : empty ? (_jsx("p", { className: "rl-agent-approval-diff__note", children: m.diffEmpty })) : (_jsx("div", { className: "rl-agent-approval-diff__scroll", tabIndex: 0, role: "group", "aria-labelledby": captionId, children: diff.hunks.map((hunk) => (_jsxs("div", { className: "rl-agent-approval-diff__hunk", children: [hunk.header && _jsx("p", { className: "rl-agent-approval-diff__header", children: hunk.header }), _jsx("ol", { className: "rl-agent-approval-diff__lines", children: hunk.lines.map((line, i) => {
|
|
20
|
+
const sign = line.kind === 'add' ? '+' : line.kind === 'remove' ? '−' : ' ';
|
|
21
|
+
const number = line.kind === 'remove' ? line.oldLine : (line.newLine ?? line.oldLine);
|
|
22
|
+
return (_jsxs("li", { className: "rl-agent-approval-diff__line", "data-kind": line.kind, children: [_jsx("span", { className: "rl-agent-approval-diff__no", "aria-hidden": "true", children: number ?? '' }), _jsx("span", { className: "rl-agent-approval-diff__sign", "aria-hidden": "true", children: sign }), line.kind === 'add' && _jsxs("span", { className: "rl-agent-sr", children: [m.diffAdded, " "] }), line.kind === 'remove' && _jsxs("span", { className: "rl-agent-sr", children: [m.diffRemoved, " "] }), _jsx("code", { className: "rl-agent-approval-diff__text", children: line.text === '' ? ' ' : line.text })] }, i));
|
|
23
|
+
}) })] }, hunk.id))) })), diff.truncated && _jsx("p", { className: "rl-agent-approval-diff__note", children: m.diffTruncated })] }));
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=ApprovalDiff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApprovalDiff.js","sourceRoot":"","sources":["../../../src/components/intervention/ApprovalDiff.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnE;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,EAAE,IAAI,EAA0B;IAC3D,MAAM,CAAC,GAAG,gBAAgB,EAAE,CAAC,YAAY,CAAC;IAC1C,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;IAChC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACvH,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC1H,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;IAC5D,OAAO,CACL,kBAAQ,SAAS,EAAC,wBAAwB,qBAAkB,SAAS,aACnE,sBAAY,EAAE,EAAE,SAAS,EAAE,SAAS,EAAC,iCAAiC,aACpE,eAAM,SAAS,EAAC,gCAAgC,YAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAQ,EACnF,gBAAM,SAAS,EAAC,8BAA8B,aAC3C,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IACpC,EACP,eAAM,SAAS,EAAC,+BAA+B,YAAE,CAAC,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,GAAQ,EAC1F,eAAM,SAAS,EAAC,aAAa,YAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAQ,IAClD,EACZ,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CACb,YAAG,SAAS,EAAC,8BAA8B,YAAE,CAAC,CAAC,UAAU,GAAK,CAC/D,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CACV,YAAG,SAAS,EAAC,8BAA8B,YAAE,CAAC,CAAC,SAAS,GAAK,CAC9D,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,gCAAgC,EAAC,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAC,OAAO,qBAAkB,SAAS,YACjG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACxB,eAAmB,SAAS,EAAC,8BAA8B,aACxD,IAAI,CAAC,MAAM,IAAI,YAAG,SAAS,EAAC,gCAAgC,YAAE,IAAI,CAAC,MAAM,GAAK,EAC/E,aAAI,SAAS,EAAC,+BAA+B,YAC1C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;gCAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;gCAC5E,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;gCACtF,OAAO,CACL,cAAY,SAAS,EAAC,8BAA8B,eAAY,IAAI,CAAC,IAAI,aACvE,eAAM,SAAS,EAAC,4BAA4B,iBAAa,MAAM,YAC5D,MAAM,IAAI,EAAE,GACR,EACP,eAAM,SAAS,EAAC,8BAA8B,iBAAa,MAAM,YAC9D,IAAI,GACA,EACN,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,gBAAM,SAAS,EAAC,aAAa,aAAE,CAAC,CAAC,SAAS,SAAS,EAC1E,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,gBAAM,SAAS,EAAC,aAAa,aAAE,CAAC,CAAC,WAAW,SAAS,EAChF,eAAM,SAAS,EAAC,8BAA8B,YAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAQ,KATnF,CAAC,CAUL,CACN,CAAC;4BACJ,CAAC,CAAC,GACC,KApBG,IAAI,CAAC,EAAE,CAqBX,CACP,CAAC,GACE,CACP,EACA,IAAI,CAAC,SAAS,IAAI,YAAG,SAAS,EAAC,8BAA8B,YAAE,CAAC,CAAC,aAAa,GAAK,IAC7E,CACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { AgentActionContext, AgentActionHandler, ApprovalScope, ApprovalView } from '@wzrhine/agent-core';
|
|
3
|
+
/**
|
|
4
|
+
* Tool-permission approval card (atlas 20, ADR-0011 §6).
|
|
5
|
+
*
|
|
6
|
+
* Behaviour
|
|
7
|
+
* - **Reject is always possible** while a decision is open (waiting, material-loading,
|
|
8
|
+
* unavailable, unknown): it never depends on the material. It is busy only while a decision is
|
|
9
|
+
* being submitted and gone once the request is approved, rejected or expired.
|
|
10
|
+
* - **Allow** needs `status === 'waiting'` and `availability.allowed` (the adapter verified the
|
|
11
|
+
* full material and revision). Otherwise it is disabled and the reason is shown as visible text
|
|
12
|
+
* linked with `aria-describedby`. "Trust for this session" appears only when `scopes` offers
|
|
13
|
+
* `'session'` and `onApprove` exists. A capability without a callback renders no button.
|
|
14
|
+
* - Every decision emits `AgentActionContext { actionId, targetId: operationId, baseRevision:
|
|
15
|
+
* revision }`. `actionId` = stable per-mount id + counter. Re-entry is blocked synchronously
|
|
16
|
+
* (double click) until the handler settles, and for `accepted` / `unknown` results until the
|
|
17
|
+
* view-model changes.
|
|
18
|
+
* - `unknown`: a warning explains the decision may or may not have arrived; the control that sent
|
|
19
|
+
* it becomes 「重试提交」, which calls the same handler with the **same** `actionId` and scope.
|
|
20
|
+
* No retry is offered when `receipt.retryable === false` or the attempt was made in another mount.
|
|
21
|
+
* - `approved` / `rejected` are static receipts; `expired` hides the decision and offers only
|
|
22
|
+
* `onRefresh` when given. Buttons only emit intent; the host adapter is the authority.
|
|
23
|
+
*
|
|
24
|
+
* A11y: `<section aria-labelledby>` on the title; the status pill pairs glyph + text; a visually
|
|
25
|
+
* hidden `role="status"` region (mounted with the card) announces submitting / unknown / receipts.
|
|
26
|
+
* New approvals never steal focus; `autoFocus` focuses the title (`tabIndex=-1`) once on mount.
|
|
27
|
+
*
|
|
28
|
+
* Motion: none of its own. Wrap in `AgentEntrance kind="card"` (InterventionDock does) for the
|
|
29
|
+
* first entrance; the evidence disclosure is the Collapsible height transition. Reduced motion
|
|
30
|
+
* changes nothing that carries information.
|
|
31
|
+
*/
|
|
32
|
+
export interface ApprovalPanelProps extends Omit<React.HTMLAttributes<HTMLElement>, 'title' | 'children'> {
|
|
33
|
+
approval: ApprovalView;
|
|
34
|
+
onApprove?: AgentActionHandler<[ApprovalScope, AgentActionContext]>;
|
|
35
|
+
onReject?: AgentActionHandler<[AgentActionContext]>;
|
|
36
|
+
/** Shown in `unavailable`: reload the approval material. */
|
|
37
|
+
onRetryMaterial?: () => void;
|
|
38
|
+
/** Shown in `expired`: refresh the approval state from the runtime. */
|
|
39
|
+
onRefresh?: () => void;
|
|
40
|
+
/** Custom material view (e.g. tools `DiffPreview`). Default: an internal read-only diff of `approval.diff`. */
|
|
41
|
+
renderMaterial?: (approval: ApprovalView) => React.ReactNode;
|
|
42
|
+
/** `compact` docks above the composer: tighter spacing, evidence always behind a disclosure. */
|
|
43
|
+
density?: 'compact' | 'full';
|
|
44
|
+
/** Focus the title once on mount. Off by default: new approvals never steal focus. */
|
|
45
|
+
autoFocus?: boolean;
|
|
46
|
+
/** Title element level. Default 3. */
|
|
47
|
+
headingLevel?: 2 | 3 | 4;
|
|
48
|
+
/** Evidence with more items than this (or with long values) goes behind a disclosure. Default 3. */
|
|
49
|
+
evidenceCollapseAt?: number;
|
|
50
|
+
/** Overrides of the footer note and button labels. */
|
|
51
|
+
rejectNote?: React.ReactNode;
|
|
52
|
+
rejectLabel?: string;
|
|
53
|
+
allowLabel?: string;
|
|
54
|
+
allowSessionLabel?: string;
|
|
55
|
+
}
|
|
56
|
+
export declare const ApprovalPanel: React.ForwardRefExoticComponent<ApprovalPanelProps & React.RefAttributes<HTMLElement>>;
|
|
57
|
+
//# sourceMappingURL=ApprovalPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApprovalPanel.d.ts","sourceRoot":"","sources":["../../../src/components/intervention/ApprovalPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EACV,kBAAkB,EAClB,kBAAkB,EAIlB,aAAa,EAEb,YAAY,EAEb,MAAM,qBAAqB,CAAC;AAS7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACvG,QAAQ,EAAE,YAAY,CAAC;IACvB,SAAS,CAAC,EAAE,kBAAkB,CAAC,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC,CAAC;IACpE,QAAQ,CAAC,EAAE,kBAAkB,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACpD,4DAA4D;IAC5D,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,+GAA+G;IAC/G,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,KAAK,CAAC,SAAS,CAAC;IAC7D,gGAAgG;IAChG,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC7B,sFAAsF;IACtF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sCAAsC;IACtC,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,oGAAoG;IACpG,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,sDAAsD;IACtD,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAkDD,eAAO,MAAM,aAAa,wFAgTxB,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
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 { Button, Callout, Collapsible, Skeleton, StatusBadge } from '@wzrhine/react';
|
|
5
|
+
import { AgentStatus } from '../../primitives/AgentStatus.js';
|
|
6
|
+
import { AgentIcon } from '../../primitives/icons.js';
|
|
7
|
+
import { useAgentFormat, useAgentMessages } from '../../provider/AgentMessages.js';
|
|
8
|
+
import { cx } from '../../utils/cx.js';
|
|
9
|
+
import { useActionLock } from './action-lock.js';
|
|
10
|
+
import { ApprovalDiff } from './ApprovalDiff.js';
|
|
11
|
+
import { InterventionIcon } from './icons.js';
|
|
12
|
+
const statusGlyph = {
|
|
13
|
+
waiting: { glyph: 'approval', tone: 'warning' },
|
|
14
|
+
'material-loading': { glyph: 'pending', tone: 'info', active: true },
|
|
15
|
+
unavailable: { glyph: 'unknown', tone: 'warning' },
|
|
16
|
+
submitting: { glyph: 'pending', tone: 'info', active: true },
|
|
17
|
+
unknown: { glyph: 'unknown', tone: 'warning' },
|
|
18
|
+
approved: { glyph: 'done', tone: 'success' },
|
|
19
|
+
rejected: { glyph: 'stopped', tone: 'danger' },
|
|
20
|
+
expired: { glyph: 'stopped', tone: 'neutral' },
|
|
21
|
+
};
|
|
22
|
+
const riskStatus = { low: 'neutral', medium: 'warning', high: 'danger' };
|
|
23
|
+
const OPEN = ['waiting', 'material-loading', 'unavailable', 'unknown'];
|
|
24
|
+
function isLong(item) {
|
|
25
|
+
return item.value.length > 160 || item.value.split('\n').length > 4;
|
|
26
|
+
}
|
|
27
|
+
function EvidenceList({ evidence }) {
|
|
28
|
+
return (_jsx("dl", { className: "rl-agent-approval__evidence", children: evidence.map((item) => (_jsxs("div", { className: "rl-agent-approval__evidence-row", "data-format": item.format ?? 'text', children: [_jsx("dt", { children: item.label }), _jsx("dd", { children: item.format === 'code' || item.format === 'json' ? (_jsx("pre", { className: "rl-agent-approval__pre", tabIndex: 0, children: _jsx("code", { children: item.value }) })) : item.format === 'path' ? (_jsx("code", { className: "rl-agent-approval__mono", children: item.value })) : (item.value) })] }, item.id))) }));
|
|
29
|
+
}
|
|
30
|
+
export const ApprovalPanel = React.forwardRef(function ApprovalPanel({ approval, onApprove, onReject, onRetryMaterial, onRefresh, renderMaterial, density = 'full', autoFocus = false, headingLevel = 3, evidenceCollapseAt = 3, rejectNote, rejectLabel, allowLabel, allowSessionLabel, className, ...rest }, ref) {
|
|
31
|
+
const m = useAgentMessages().intervention;
|
|
32
|
+
const fmt = useAgentFormat();
|
|
33
|
+
const id = React.useId();
|
|
34
|
+
const titleId = `${id}-title`;
|
|
35
|
+
const allowReasonId = `${id}-allow-reason`;
|
|
36
|
+
const headingRef = React.useRef(null);
|
|
37
|
+
const { status, operationId, revision } = approval;
|
|
38
|
+
const lock = useActionLock(`${operationId}:${revision}:${status}`);
|
|
39
|
+
const [attempt, setAttempt] = React.useState(null);
|
|
40
|
+
// A different operation in the same mount starts from a clean slate.
|
|
41
|
+
const [seenOperation, setSeenOperation] = React.useState(operationId);
|
|
42
|
+
if (seenOperation !== operationId) {
|
|
43
|
+
setSeenOperation(operationId);
|
|
44
|
+
setAttempt(null);
|
|
45
|
+
}
|
|
46
|
+
React.useEffect(() => {
|
|
47
|
+
if (autoFocus)
|
|
48
|
+
headingRef.current?.focus();
|
|
49
|
+
// Mount only: later approvals never move focus.
|
|
50
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
51
|
+
}, []);
|
|
52
|
+
const open = OPEN.includes(status);
|
|
53
|
+
const submitting = status === 'submitting' || (lock.locked && open);
|
|
54
|
+
const scopes = approval.scopes ?? ['once'];
|
|
55
|
+
const toolName = approval.tool.displayName ?? approval.tool.name;
|
|
56
|
+
const Heading = `h${headingLevel}`;
|
|
57
|
+
const send = (kind, scope, ctx) => {
|
|
58
|
+
const handler = kind === 'approve' ? onApprove : onReject;
|
|
59
|
+
if (!handler)
|
|
60
|
+
return;
|
|
61
|
+
lock.run(() => {
|
|
62
|
+
setAttempt({ kind, scope, ctx });
|
|
63
|
+
return kind === 'approve' ? onApprove(scope, ctx) : onReject(ctx);
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
const fresh = () => ({ actionId: lock.nextActionId(), targetId: operationId, baseRevision: revision });
|
|
67
|
+
// ----- allow gating -----
|
|
68
|
+
const allowEnabled = status === 'waiting' && approval.availability.allowed && !submitting;
|
|
69
|
+
let allowReason;
|
|
70
|
+
if (!allowEnabled && open) {
|
|
71
|
+
if (status === 'waiting')
|
|
72
|
+
allowReason = submitting ? m.approvalAllowBlocked.submitting : (approval.availability.reason ?? m.approvalNotAllowed);
|
|
73
|
+
else
|
|
74
|
+
allowReason = m.approvalAllowBlocked[status] ?? approval.availability.reason;
|
|
75
|
+
}
|
|
76
|
+
const retryable = approval.receipt?.retryable !== false;
|
|
77
|
+
const canRetry = status === 'unknown' && attempt !== null && retryable && (attempt.kind === 'approve' ? !!onApprove : !!onReject);
|
|
78
|
+
const sr = status === 'submitting'
|
|
79
|
+
? m.approvalSubmitting
|
|
80
|
+
: status === 'unknown'
|
|
81
|
+
? m.approvalUnknownTitle
|
|
82
|
+
: status === 'approved'
|
|
83
|
+
? m.approvalApproved
|
|
84
|
+
: status === 'rejected'
|
|
85
|
+
? m.approvalRejected
|
|
86
|
+
: status === 'expired'
|
|
87
|
+
? m.approvalExpiredTitle
|
|
88
|
+
: '';
|
|
89
|
+
const evidence = approval.evidence ?? [];
|
|
90
|
+
const collapseEvidence = evidence.length > 0 && (density === 'compact' || evidence.length > evidenceCollapseAt || evidence.some(isLong));
|
|
91
|
+
// ----- material -----
|
|
92
|
+
let material = null;
|
|
93
|
+
if (status === 'material-loading') {
|
|
94
|
+
material = (_jsxs("div", { className: "rl-agent-approval__loading", "aria-busy": "true", children: [_jsx("p", { className: "rl-agent-approval__loading-text", children: m.approvalMaterialLoading }), _jsx(Skeleton, { lines: 3 })] }));
|
|
95
|
+
}
|
|
96
|
+
else if (status === 'unavailable') {
|
|
97
|
+
material = (_jsxs("div", { className: "rl-agent-approval__unavailable", children: [_jsx(Callout, { tone: "warning", title: m.approvalUnavailable, className: "rl-agent-approval__callout", children: approval.availability.reason ?? m.approvalUnavailableHint }), onRetryMaterial && (_jsx(Button, { size: "sm", variant: "secondary", iconStart: _jsx(AgentIcon, { name: "retry" }), onClick: onRetryMaterial, children: m.approvalRetryMaterial }))] }));
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
const custom = renderMaterial?.(approval);
|
|
101
|
+
material = custom ?? (approval.diff ? _jsx(ApprovalDiff, { diff: approval.diff }) : null);
|
|
102
|
+
}
|
|
103
|
+
const receiptTime = approval.receipt?.at ? (_jsx("time", { className: "rl-agent-approval__receipt-time", dateTime: approval.receipt.at, children: m.approvalReceiptAt(fmt.time(approval.receipt.at)) })) : null;
|
|
104
|
+
const busyKind = submitting ? attempt?.kind : undefined;
|
|
105
|
+
const showReject = !!onReject && (open || status === 'submitting') && !(status === 'unknown' && attempt?.kind === 'reject');
|
|
106
|
+
const showAllow = !!onApprove && (open || status === 'submitting') && !(status === 'unknown' && attempt?.kind === 'approve');
|
|
107
|
+
const meta = statusGlyph[status];
|
|
108
|
+
return (_jsxs("section", { ...rest, ref: ref, className: cx('rl-agent-approval', className), "aria-labelledby": titleId, "data-status": status, "data-density": density, "data-risk": approval.risk, children: [_jsxs("header", { className: "rl-agent-approval__header", children: [_jsxs("div", { className: "rl-agent-approval__eyebrow", children: [_jsx(InterventionIcon, { name: "shield-alert", className: "rl-agent-approval__shield" }), _jsx("span", { className: "rl-agent-approval__operation", children: m.approvalOperation(operationId) }), _jsx(AgentStatus, { glyph: meta.glyph, tone: meta.tone, active: meta.active, label: m.approvalStatus[status] }), approval.risk && (_jsx(StatusBadge, { size: "sm", status: riskStatus[approval.risk], className: "rl-agent-approval__risk", children: m.approvalRisk[approval.risk] }))] }), _jsxs(Heading, { id: titleId, ref: headingRef, tabIndex: -1, className: "rl-agent-approval__title", children: [_jsx("span", { className: "rl-agent-approval__tool", children: toolName }), approval.reason && (_jsxs(_Fragment, { children: [_jsx("span", { className: "rl-agent-approval__sep", "aria-hidden": "true", children: "\u00B7" }), _jsx("span", { className: "rl-agent-approval__reason", children: approval.reason })] }))] })] }), _jsxs("div", { className: "rl-agent-approval__body", children: [approval.tool.subject && (_jsxs("p", { className: "rl-agent-approval__line", children: [_jsx("span", { className: "rl-agent-approval__label", children: m.approvalSubject }), _jsx("code", { className: "rl-agent-approval__subject", children: approval.tool.subject })] })), _jsx("p", { className: "rl-agent-approval__summary", children: approval.summary }), (approval.scope || approval.expiresAt) && (_jsxs("p", { className: "rl-agent-approval__meta", children: [approval.scope && (_jsxs("span", { children: [_jsx("span", { className: "rl-agent-approval__label", children: m.approvalScope }), " ", approval.scope] })), approval.expiresAt && (_jsxs("span", { children: [_jsx("span", { className: "rl-agent-approval__label", children: m.approvalExpires }), ' ', _jsx("time", { dateTime: approval.expiresAt, children: fmt.time(approval.expiresAt) })] }))] })), approval.irreversible && (_jsx(Callout, { tone: "danger", title: m.approvalIrreversibleTitle, icon: _jsx(InterventionIcon, { name: "trash-warning" }), children: approval.irreversible })), approval.unsandboxed && (_jsx(Callout, { tone: "warning", title: m.approvalUnsandboxedTitle, icon: _jsx(InterventionIcon, { name: "lock-open" }), children: m.approvalUnsandboxed })), material != null && material !== false && _jsx("div", { className: "rl-agent-approval__material", children: material }), evidence.length > 0 &&
|
|
109
|
+
(collapseEvidence ? (_jsx(Collapsible, { className: "rl-agent-approval__details", trigger: _jsx("span", { children: m.approvalEvidenceToggle(evidence.length) }), children: _jsx(EvidenceList, { evidence: evidence }) })) : (_jsxs("div", { className: "rl-agent-approval__details", children: [_jsx("p", { className: "rl-agent-approval__label", children: m.approvalEvidence }), _jsx(EvidenceList, { evidence: evidence })] })))] }), status === 'unknown' && (_jsx("div", { className: "rl-agent-approval__unknown", children: _jsx(Callout, { tone: "warning", title: m.approvalUnknownTitle, children: approval.receipt?.reason ?? (retryable ? m.approvalUnknownBody : m.approvalUnknownNotRetryable) }) })), status === 'approved' && (_jsxs("p", { className: "rl-agent-approval__receipt", "data-tone": "success", children: [_jsx(AgentIcon, { name: "check" }), _jsx("span", { children: attempt?.scope === 'session' ? m.approvalApprovedSession : m.approvalApproved }), receiptTime] })), status === 'rejected' && (_jsxs("p", { className: "rl-agent-approval__receipt", "data-tone": "danger", children: [_jsx(AgentIcon, { name: "close" }), _jsx("span", { children: approval.receipt?.reason ?? m.approvalRejected }), receiptTime] })), status === 'expired' && (_jsxs("div", { className: "rl-agent-approval__expired", children: [_jsx(Callout, { tone: "neutral", title: m.approvalExpiredTitle, icon: _jsx(AgentIcon, { name: "clock" }), className: "rl-agent-approval__callout", children: m.approvalExpiredBody }), onRefresh && (_jsx(Button, { size: "sm", variant: "secondary", iconStart: _jsx(AgentIcon, { name: "retry" }), onClick: onRefresh, children: m.approvalRefresh }))] })), (showReject || showAllow || canRetry) && (_jsxs("footer", { className: "rl-agent-approval__footer", children: [showReject && _jsx("p", { className: "rl-agent-approval__note", children: rejectNote ?? m.approvalRejectNote }), allowReason && showAllow && (_jsxs("p", { id: allowReasonId, className: "rl-agent-approval__allow-reason", children: [_jsx(AgentIcon, { name: "info" }), _jsx("span", { children: allowReason })] })), _jsxs("div", { className: "rl-agent-approval__actions", children: [canRetry && (_jsx(Button, { size: "sm", variant: "primary", loading: submitting, iconStart: _jsx(AgentIcon, { name: "retry" }), onClick: () => attempt && send(attempt.kind, attempt.scope, attempt.ctx), children: m.approvalRetrySubmit })), showReject && (_jsx(Button, { size: "sm", variant: "secondary", loading: busyKind === 'reject', disabled: submitting && busyKind !== 'reject', onClick: () => send('reject', 'once', fresh()), children: rejectLabel ?? m.approvalReject })), showAllow && scopes.includes('session') && (_jsx(Button, { size: "sm", variant: "secondary", loading: busyKind === 'approve' && attempt?.scope === 'session', disabled: !allowEnabled && !(busyKind === 'approve' && attempt?.scope === 'session'), "aria-describedby": allowReason ? allowReasonId : undefined, onClick: () => send('approve', 'session', fresh()), children: allowSessionLabel ?? m.approvalAllowSession })), showAllow && (_jsx(Button, { size: "sm", variant: "accent", loading: busyKind === 'approve' && attempt?.scope !== 'session', disabled: !allowEnabled && !(busyKind === 'approve' && attempt?.scope !== 'session'), "aria-describedby": allowReason ? allowReasonId : undefined, onClick: () => send('approve', 'once', fresh()), children: allowLabel ?? m.approvalAllowOnce }))] })] })), _jsx("p", { className: "rl-agent-sr", role: "status", children: sr })] }));
|
|
110
|
+
});
|
|
111
|
+
//# sourceMappingURL=ApprovalPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApprovalPanel.js","sourceRoot":"","sources":["../../../src/components/intervention/ApprovalPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { RecoveryView } from '@wzrhine/agent-core';
|
|
3
|
+
/**
|
|
4
|
+
* Error and recovery notice (atlas 34). Tells the user what was kept, what is still unconfirmed
|
|
5
|
+
* and which recovery actions are safe.
|
|
6
|
+
*
|
|
7
|
+
* - Severity follows `kind`: `retryable` / `offline` info, `save-pending` / `cancel-unconfirmed` /
|
|
8
|
+
* `timeout` / `unknown` warning, `tool-side-effects` danger, `resolved` success. Each kind also
|
|
9
|
+
* gets a fixed consequence sentence from the copy table ("停止尚未确认,工具可能仍在运行",
|
|
10
|
+
* "工具可能已产生外部影响,不会自动重放", "重试保存不会再次调用模型") so the states stay distinct.
|
|
11
|
+
* - Actions come from the view (`actions[]`, labels must name what they act on) and call
|
|
12
|
+
* `onAction(id)`. Without `onAction` no button is rendered.
|
|
13
|
+
* - `role="alert"` only for danger kinds and only when `announce` (default true): it sits on the
|
|
14
|
+
* message, not on the buttons. Everything else is static. Nothing blinks or loops.
|
|
15
|
+
* - `onDismiss` adds a close button for `resolved` notices only; the caller moves focus.
|
|
16
|
+
*/
|
|
17
|
+
export interface ErrorRecoveryNoticeProps extends Omit<React.HTMLAttributes<HTMLElement>, 'title' | 'children'> {
|
|
18
|
+
recovery: RecoveryView;
|
|
19
|
+
onAction?: (actionId: string) => void;
|
|
20
|
+
/** Resolved notices only. */
|
|
21
|
+
onDismiss?: () => void;
|
|
22
|
+
/** Announce danger notices with `role="alert"`. Pass `false` for notices restored from history. */
|
|
23
|
+
announce?: boolean;
|
|
24
|
+
/** Ids of actions currently running (button shows busy). */
|
|
25
|
+
busyActionIds?: readonly string[];
|
|
26
|
+
}
|
|
27
|
+
export declare const ErrorRecoveryNotice: React.ForwardRefExoticComponent<ErrorRecoveryNoticeProps & React.RefAttributes<HTMLElement>>;
|
|
28
|
+
//# sourceMappingURL=ErrorRecoveryNotice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorRecoveryNotice.d.ts","sourceRoot":"","sources":["../../../src/components/intervention/ErrorRecoveryNotice.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAa,YAAY,EAAmB,MAAM,qBAAqB,CAAC;AAMpF;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,wBAAyB,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IAC7G,QAAQ,EAAE,YAAY,CAAC;IACvB,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,mGAAmG;IACnG,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4DAA4D;IAC5D,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAeD,eAAO,MAAM,mBAAmB,8FAiE9B,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { Button, IconButton } from '@wzrhine/react';
|
|
5
|
+
import { AgentStatus } from '../../primitives/AgentStatus.js';
|
|
6
|
+
import { AgentIcon } from '../../primitives/icons.js';
|
|
7
|
+
import { useAgentMessages } from '../../provider/AgentMessages.js';
|
|
8
|
+
import { cx } from '../../utils/cx.js';
|
|
9
|
+
const kindMeta = {
|
|
10
|
+
retryable: { tone: 'info', glyph: 'reconnecting' },
|
|
11
|
+
'save-pending': { tone: 'warning', glyph: 'saving' },
|
|
12
|
+
'cancel-unconfirmed': { tone: 'warning', glyph: 'stopping' },
|
|
13
|
+
'tool-side-effects': { tone: 'danger', glyph: 'failed' },
|
|
14
|
+
timeout: { tone: 'warning', glyph: 'failed' },
|
|
15
|
+
offline: { tone: 'info', glyph: 'offline' },
|
|
16
|
+
unknown: { tone: 'warning', glyph: 'unknown' },
|
|
17
|
+
resolved: { tone: 'success', glyph: 'done' },
|
|
18
|
+
};
|
|
19
|
+
const variantOf = { primary: 'primary', secondary: 'secondary', danger: 'secondary' };
|
|
20
|
+
export const ErrorRecoveryNotice = React.forwardRef(function ErrorRecoveryNotice({ recovery, onAction, onDismiss, announce = true, busyActionIds, className, ...rest }, ref) {
|
|
21
|
+
const m = useAgentMessages().intervention;
|
|
22
|
+
const id = React.useId();
|
|
23
|
+
const titleId = `${id}-title`;
|
|
24
|
+
const { kind } = recovery;
|
|
25
|
+
const meta = kindMeta[kind];
|
|
26
|
+
const alert = meta.tone === 'danger' && announce;
|
|
27
|
+
const note = m.recoveryNote[kind];
|
|
28
|
+
return (_jsxs("section", { ...rest, ref: ref, className: cx('rl-agent-recovery', className), "aria-labelledby": titleId, "data-kind": kind, "data-tone": meta.tone, children: [_jsxs("div", { className: "rl-agent-recovery__message", role: alert ? 'alert' : undefined, children: [_jsxs("div", { className: "rl-agent-recovery__head", children: [_jsx(AgentStatus, { glyph: meta.glyph, tone: meta.tone, label: m.recoveryKind[kind], className: "rl-agent-recovery__kind" }), recovery.code && (_jsxs("span", { className: "rl-agent-recovery__code", children: [_jsxs("span", { className: "rl-agent-sr", children: [m.recoveryCode, " "] }), _jsx("code", { children: recovery.code })] }))] }), _jsx("p", { id: titleId, className: "rl-agent-recovery__title", children: recovery.title }), recovery.message && _jsx("p", { className: "rl-agent-recovery__text", children: recovery.message }), note && _jsx("p", { className: "rl-agent-recovery__note", children: note }), recovery.preserved && recovery.preserved.length > 0 && (_jsxs("div", { className: "rl-agent-recovery__preserved", children: [_jsx("span", { className: "rl-agent-recovery__preserved-label", children: m.recoveryPreserved }), _jsx("ul", { className: "rl-agent-recovery__preserved-list", children: recovery.preserved.map((item) => (_jsxs("li", { children: [_jsx(AgentIcon, { name: "check" }), _jsx("span", { children: item })] }, item))) })] }))] }), onAction && recovery.actions && recovery.actions.length > 0 && (_jsx("div", { className: "rl-agent-recovery__actions", children: recovery.actions.map((action) => (_jsx(Button, { size: "sm", variant: variantOf[action.tone ?? 'secondary'], "data-tone": action.tone, className: "rl-agent-recovery__action", loading: busyActionIds?.includes(action.id), onClick: () => onAction(action.id), children: action.label }, action.id))) })), onDismiss && kind === 'resolved' && (_jsx(IconButton, { className: "rl-agent-recovery__dismiss", size: "sm", variant: "ghost", icon: _jsx(AgentIcon, { name: "close" }), label: m.recoveryDismiss, onClick: onDismiss }))] }));
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=ErrorRecoveryNotice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorRecoveryNotice.js","sourceRoot":"","sources":["../../../src/components/intervention/ErrorRecoveryNotice.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { AgentActionContext, AgentActionHandler, GrantView } from '@wzrhine/agent-core';
|
|
3
|
+
/**
|
|
4
|
+
* Standing permissions the user granted (session trust for a task, extra directory access…),
|
|
5
|
+
* typically in a settings pane or side panel (ADR-0011 §6, `GrantView`).
|
|
6
|
+
*
|
|
7
|
+
* Behaviour
|
|
8
|
+
* - Each row shows the target verbatim in mono, its detail, the scope label and availability.
|
|
9
|
+
* An unavailable grant shows its reason as text (never colour alone) and, when `onReselect`
|
|
10
|
+
* is given, a 「重新选择」 button so the host can let the user pick the target again.
|
|
11
|
+
* - 「撤销」 appears only when `onRevoke` is given. Every revoke emits `AgentActionContext
|
|
12
|
+
* { actionId, targetId: grant.id }`; `actionId` = stable per-row-mount id + counter (the shared
|
|
13
|
+
* intervention action lock), so double clicks never send twice and two lists never collide.
|
|
14
|
+
* - Receipts: `submitting` → the row is `aria-busy` and its button busy; `unknown` → 「结果待确认」
|
|
15
|
+
* plus 「重试撤销」 that re-sends the **same** `actionId` (from this mount or `receipt.actionId`),
|
|
16
|
+
* unless `receipt.retryable === false`; `rejected` → the reason, revoke available again;
|
|
17
|
+
* `accepted` → 「已撤销」 until the host drops the row. The host adapter is the authority.
|
|
18
|
+
* - `loading` shows a skeleton (list `aria-busy`), `error` an Alert with `onRetry`, no grants the
|
|
19
|
+
* `empty` text. `addSlot` is a host-provided chooser (e.g. a "添加目录" Button + picker) in the header.
|
|
20
|
+
*
|
|
21
|
+
* A11y: `<section aria-labelledby>`; grants are a `<ul>`; row buttons are named after their target
|
|
22
|
+
* (「撤销 npm test」) while the visible text stays short; a visually hidden `role="status"` announces
|
|
23
|
+
* revoke progress and unconfirmed results. No focus is moved.
|
|
24
|
+
*
|
|
25
|
+
* Motion: none. Rows appear and leave instantly; reduced motion changes nothing.
|
|
26
|
+
*/
|
|
27
|
+
export interface GrantListProps extends Omit<React.HTMLAttributes<HTMLElement>, 'title' | 'children'> {
|
|
28
|
+
/** Heading (default from messages: 「会话授权」). */
|
|
29
|
+
title?: React.ReactNode;
|
|
30
|
+
grants: readonly GrantView[];
|
|
31
|
+
/** Revoke one grant. Without it no revoke button is rendered. */
|
|
32
|
+
onRevoke?: AgentActionHandler<[GrantView, AgentActionContext]>;
|
|
33
|
+
/** Unavailable grants: let the host re-select the target. */
|
|
34
|
+
onReselect?: (grant: GrantView) => void;
|
|
35
|
+
loading?: boolean;
|
|
36
|
+
/** Load failure text; shows an Alert (with 「重新读取」 when `onRetry` is given). */
|
|
37
|
+
error?: React.ReactNode;
|
|
38
|
+
onRetry?: () => void;
|
|
39
|
+
/** Text when there are no grants (default from messages). */
|
|
40
|
+
empty?: React.ReactNode;
|
|
41
|
+
/** Note under the list, e.g. what revoking does. */
|
|
42
|
+
footerNote?: React.ReactNode;
|
|
43
|
+
/** Host-provided chooser for adding a grant, shown in the header. */
|
|
44
|
+
addSlot?: React.ReactNode;
|
|
45
|
+
/** Title element level. Default 3. */
|
|
46
|
+
headingLevel?: 2 | 3 | 4;
|
|
47
|
+
}
|
|
48
|
+
export declare const GrantList: React.ForwardRefExoticComponent<GrantListProps & React.RefAttributes<HTMLElement>>;
|
|
49
|
+
//# sourceMappingURL=GrantList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrantList.d.ts","sourceRoot":"","sources":["../../../src/components/intervention/GrantList.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAM7F;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACnG,+CAA+C;IAC/C,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IAC7B,iEAAiE;IACjE,QAAQ,CAAC,EAAE,kBAAkB,CAAC,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAC/D,6DAA6D;IAC7D,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+EAA+E;IAC/E,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,oDAAoD;IACpD,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,qEAAqE;IACrE,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,sCAAsC;IACtC,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;CAC1B;AAkHD,eAAO,MAAM,SAAS,oFAmEpB,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { Alert, Button, Skeleton, StatusBadge } 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 { useActionLock } from './action-lock.js';
|
|
9
|
+
function GrantRow({ grant, onRevoke, onReselect }) {
|
|
10
|
+
const m = useAgentMessages().intervention;
|
|
11
|
+
const id = React.useId();
|
|
12
|
+
const detailId = `${id}-detail`;
|
|
13
|
+
const status = grant.receipt?.status ?? 'idle';
|
|
14
|
+
const lock = useActionLock(`${grant.id}:${status}:${grant.available ? 1 : 0}`);
|
|
15
|
+
const attempt = React.useRef(null);
|
|
16
|
+
const send = (ctx) => {
|
|
17
|
+
if (!onRevoke)
|
|
18
|
+
return;
|
|
19
|
+
lock.run(() => {
|
|
20
|
+
attempt.current = ctx;
|
|
21
|
+
return onRevoke(grant, ctx);
|
|
22
|
+
});
|
|
23
|
+
};
|
|
24
|
+
// The lock also holds after a sync / accepted / unknown result until the receipt changes.
|
|
25
|
+
const submitting = status === 'submitting' || lock.locked;
|
|
26
|
+
const unknown = status === 'unknown';
|
|
27
|
+
const accepted = status === 'accepted';
|
|
28
|
+
const retryId = attempt.current?.actionId ?? grant.receipt?.actionId;
|
|
29
|
+
const describedBy = grant.detail || !grant.available ? detailId : undefined;
|
|
30
|
+
const canRetry = unknown && !!onRevoke && grant.receipt?.retryable !== false && retryId !== undefined;
|
|
31
|
+
return (_jsxs("li", { className: "rl-agent-grant", "data-available": grant.available || undefined, "data-receipt": status, "aria-busy": submitting || undefined, children: [_jsxs("div", { className: "rl-agent-grant__main", children: [_jsx("code", { className: "rl-agent-grant__target", children: grant.target }), _jsxs(StatusBadge, { size: "sm", status: "neutral", appearance: "outline", className: "rl-agent-grant__scope", children: [_jsxs("span", { className: "rl-agent-sr", children: [m.grantScope, " "] }), grant.scopeLabel] })] }), (grant.detail || !grant.available) && (_jsxs("div", { id: detailId, className: "rl-agent-grant__detail", children: [grant.detail && _jsx("p", { className: "rl-agent-grant__text", children: grant.detail }), !grant.available && (_jsxs("p", { className: "rl-agent-grant__unavailable", children: [_jsx(AgentIcon, { name: "warning" }), _jsxs("span", { children: [_jsx("span", { className: "rl-agent-grant__unavailable-label", children: m.grantUnavailable }), " ", grant.reason ?? m.grantUnavailableReason] })] }))] })), unknown && (_jsxs("p", { className: "rl-agent-grant__receipt", "data-tone": "warning", children: [_jsx(AgentIcon, { name: "warning" }), _jsxs("span", { children: [_jsx("strong", { className: "rl-agent-grant__receipt-title", children: m.grantUnknownTitle }), ' ', grant.receipt?.reason ?? (grant.receipt?.retryable === false ? m.grantUnknownNotRetryable : m.grantUnknownBody)] })] })), status === 'rejected' && (_jsxs("p", { className: "rl-agent-grant__receipt", "data-tone": "danger", children: [_jsx(AgentIcon, { name: "close" }), _jsx("span", { children: grant.receipt?.reason ?? m.grantRejected })] })), accepted && (_jsxs("p", { className: "rl-agent-grant__receipt", "data-tone": "success", children: [_jsx(AgentIcon, { name: "check" }), _jsx("span", { children: m.grantRevoked })] })), !accepted && (onRevoke || (!grant.available && onReselect)) && (_jsxs("div", { className: "rl-agent-grant__actions", children: [!grant.available && onReselect && (_jsx(Button, { size: "sm", variant: "secondary", "aria-label": m.grantReselectLabel(grant.target), disabled: submitting, onClick: () => onReselect(grant), children: m.grantReselect })), onRevoke &&
|
|
32
|
+
(canRetry ? (_jsx(Button, { size: "sm", variant: "primary", loading: submitting, iconStart: _jsx(AgentIcon, { name: "retry" }), "aria-label": m.grantRetryRevokeLabel(grant.target), onClick: () => send({ actionId: retryId, targetId: grant.id }), children: m.grantRetryRevoke })) : (!unknown && (_jsx(Button, { size: "sm", variant: "secondary", loading: submitting, "aria-label": m.grantRevokeLabel(grant.target), "aria-describedby": describedBy, onClick: () => send({ actionId: lock.nextActionId(), targetId: grant.id }), children: m.grantRevoke }))))] }))] }));
|
|
33
|
+
}
|
|
34
|
+
export const GrantList = React.forwardRef(function GrantList({ title, grants, onRevoke, onReselect, loading = false, error, onRetry, empty, footerNote, addSlot, headingLevel = 3, className, ...rest }, ref) {
|
|
35
|
+
const m = useAgentMessages().intervention;
|
|
36
|
+
const id = React.useId();
|
|
37
|
+
const titleId = `${id}-title`;
|
|
38
|
+
const Heading = `h${headingLevel}`;
|
|
39
|
+
const hasError = error != null && error !== false;
|
|
40
|
+
const busy = grants.find((g) => g.receipt?.status === 'submitting');
|
|
41
|
+
const unknown = grants.find((g) => g.receipt?.status === 'unknown');
|
|
42
|
+
const sr = busy ? m.grantRevokingSr(busy.target) : unknown ? m.grantUnknownSr(unknown.target) : '';
|
|
43
|
+
let body;
|
|
44
|
+
if (loading) {
|
|
45
|
+
body = (_jsxs("div", { className: "rl-agent-grants__loading", "aria-busy": "true", children: [_jsx("p", { className: "rl-agent-grants__loading-text", children: m.grantLoading }), _jsx(Skeleton, { lines: 3 })] }));
|
|
46
|
+
}
|
|
47
|
+
else if (hasError) {
|
|
48
|
+
body = (_jsx(Alert, { tone: "danger", title: m.grantError, className: "rl-agent-grants__error", action: onRetry ? (_jsx(Button, { size: "sm", variant: "secondary", iconStart: _jsx(AgentIcon, { name: "retry" }), onClick: onRetry, children: m.grantRetry })) : undefined, children: error === true ? null : error }));
|
|
49
|
+
}
|
|
50
|
+
else if (grants.length === 0) {
|
|
51
|
+
body = _jsx("p", { className: "rl-agent-grants__empty", children: empty ?? m.grantEmpty });
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
body = (_jsx("ul", { className: "rl-agent-grants__list", children: grants.map((grant) => (_jsx(GrantRow, { grant: grant, onRevoke: onRevoke, onReselect: onReselect }, grant.id))) }));
|
|
55
|
+
}
|
|
56
|
+
return (_jsxs("section", { ...rest, ref: ref, className: cx('rl-agent-grants', className), "aria-labelledby": titleId, "aria-busy": loading || undefined, children: [_jsxs("header", { className: "rl-agent-grants__header", children: [_jsx(Heading, { id: titleId, className: "rl-agent-grants__title", children: title ?? m.grantTitle }), !loading && !hasError && grants.length > 0 && _jsx("span", { className: "rl-agent-grants__count", children: m.grantCount(grants.length) }), addSlot != null && addSlot !== false && _jsx("div", { className: "rl-agent-grants__add", children: addSlot })] }), body, footerNote != null && footerNote !== false && _jsx("p", { className: "rl-agent-grants__note", children: footerNote }), _jsx("p", { className: "rl-agent-sr", role: "status", children: sr })] }));
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=GrantList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrantList.js","sourceRoot":"","sources":["../../../src/components/intervention/GrantList.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Stacks the current interventions (ApprovalPanel, QuestionnaireCard, ErrorRecoveryNotice)
|
|
4
|
+
* directly above the composer.
|
|
5
|
+
*
|
|
6
|
+
* - Children are the cards; give each a stable `key` (operation / questionnaire id). Cards that
|
|
7
|
+
* arrive after the first render enter once with `AgentEntrance kind="card"` (opacity + 8px +
|
|
8
|
+
* scale .985, `panel`); cards present on first render are static unless `animateInitial`.
|
|
9
|
+
* The entrance is frozen at mount, so status updates never replay it.
|
|
10
|
+
* - The dock opens with a CSS `grid-template-rows: 0fr → 1fr` transition on
|
|
11
|
+
* `--rl-motion-base` (zero under reduced motion: it snaps open, nothing is hidden).
|
|
12
|
+
* - `moreCount` > 0 shows 「还有 N 个待处理」 for approvals queued behind the visible one.
|
|
13
|
+
* - It is a labelled region only while it has content. It never moves focus.
|
|
14
|
+
*/
|
|
15
|
+
export interface InterventionDockProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
16
|
+
/** Number of further pending interventions not shown. */
|
|
17
|
+
moreCount?: number;
|
|
18
|
+
/** Animate cards already present on the first render. Default false (restored state). */
|
|
19
|
+
animateInitial?: boolean;
|
|
20
|
+
/** Accessible name of the region. */
|
|
21
|
+
label?: string;
|
|
22
|
+
}
|
|
23
|
+
export declare const InterventionDock: React.ForwardRefExoticComponent<InterventionDockProps & React.RefAttributes<HTMLDivElement>>;
|
|
24
|
+
//# sourceMappingURL=InterventionDock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InterventionDock.d.ts","sourceRoot":"","sources":["../../../src/components/intervention/InterventionDock.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,qBAAsB,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;IACjF,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yFAAyF;IACzF,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,gBAAgB,8FAoC3B,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { AgentEntrance } from '../../motion/agent-motion.js';
|
|
5
|
+
import { useAgentMessages } from '../../provider/AgentMessages.js';
|
|
6
|
+
import { cx } from '../../utils/cx.js';
|
|
7
|
+
export const InterventionDock = React.forwardRef(function InterventionDock({ moreCount = 0, animateInitial = false, label, className, children, ...rest }, ref) {
|
|
8
|
+
const m = useAgentMessages().intervention;
|
|
9
|
+
const items = React.Children.toArray(children).filter(React.isValidElement);
|
|
10
|
+
const open = items.length > 0;
|
|
11
|
+
const firstRender = React.useRef(true);
|
|
12
|
+
React.useEffect(() => {
|
|
13
|
+
firstRender.current = false;
|
|
14
|
+
}, []);
|
|
15
|
+
const animate = !firstRender.current || animateInitial;
|
|
16
|
+
return (_jsx("div", { ...rest, ref: ref, className: cx('rl-agent-dock', className), "data-open": open || undefined, role: open ? 'region' : undefined, "aria-label": open ? (label ?? m.dockLabel) : undefined, children: _jsx("div", { className: "rl-agent-dock__inner", children: open && (_jsxs("div", { className: "rl-agent-dock__stack", children: [moreCount > 0 && _jsx("p", { className: "rl-agent-dock__more", children: m.dockMore(moreCount) }), items.map((item) => (_jsx(AgentEntrance, { kind: "card", animate: animate, className: "rl-agent-dock__item", children: item }, item.key ?? undefined)))] })) }) }));
|
|
17
|
+
});
|
|
18
|
+
//# sourceMappingURL=InterventionDock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InterventionDock.js","sourceRoot":"","sources":["../../../src/components/intervention/InterventionDock.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAwBvC,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC,UAAU,CAAwC,SAAS,gBAAgB,CAC/G,EAAE,SAAS,GAAG,CAAC,EAAE,cAAc,GAAG,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAC9E,GAAG;IAEH,MAAM,CAAC,GAAG,gBAAgB,EAAE,CAAC,YAAY,CAAC;IAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAC5E,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9B,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACvC,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,WAAW,CAAC,OAAO,GAAG,KAAK,CAAC;IAC9B,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,MAAM,OAAO,GAAG,CAAC,WAAW,CAAC,OAAO,IAAI,cAAc,CAAC;IAEvD,OAAO,CACL,iBACM,IAAI,EACR,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,eAAe,EAAE,SAAS,CAAC,eAC9B,IAAI,IAAI,SAAS,EAC5B,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,gBACrB,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,YAErD,cAAK,SAAS,EAAC,sBAAsB,YAClC,IAAI,IAAI,CACP,eAAK,SAAS,EAAC,sBAAsB,aAClC,SAAS,GAAG,CAAC,IAAI,YAAG,SAAS,EAAC,qBAAqB,YAAE,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAK,EAC/E,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,KAAC,aAAa,IAA6B,IAAI,EAAC,MAAM,EAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAC,qBAAqB,YACrG,IAAI,IADa,IAAI,CAAC,GAAG,IAAI,SAAS,CAEzB,CACjB,CAAC,IACE,CACP,GACG,GACF,CACP,CAAC;AACJ,CAAC,CAAC,CAAC"}
|