@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,60 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import type { AgentActionContext, AgentActionHandler, QuestionAnswer, QuestionnaireView } from '@wzrhine/agent-core';
|
|
3
|
+
/**
|
|
4
|
+
* Agent → user questionnaire (atlas 21, ADR-0011 §6). Collects information only: it never grants
|
|
5
|
+
* tool permissions.
|
|
6
|
+
*
|
|
7
|
+
* Data: `questionnaire.answers` is the host's draft. The card keeps a local mirror so typing
|
|
8
|
+
* stays responsive and reports every change with `onAnswerChange(answer)` (the host persists).
|
|
9
|
+
* The mirror is replaced by the props only when `questionnaire.revision` becomes newer (or the
|
|
10
|
+
* questionnaire id changes); an older revision is ignored (`isStaleRevision`), so a late
|
|
11
|
+
* snapshot never rolls the draft back.
|
|
12
|
+
*
|
|
13
|
+
* Submitting emits `onSubmit(answers, { actionId, targetId: id, baseRevision: revision })` with
|
|
14
|
+
* normalised answers (unanswered optional questions become `skipped`). Unanswered optional
|
|
15
|
+
* questions ask for an inline confirmation (`role="alert"`); unanswered required ones block.
|
|
16
|
+
* `unknown` keeps the same answers and revision: 「重试提交相同答案」 re-sends the stored answers
|
|
17
|
+
* with the same `actionId` (after a remount it uses `receipt.actionId`).
|
|
18
|
+
* `completed` / `expired` / `interrupted` render a read-only summary. If such an ended questionnaire
|
|
19
|
+
* still has a draft the host never saved (`draftStatus` `dirty` / `error`) and `onDiscardDraft` is
|
|
20
|
+
* given, the summary adds 「放弃未保存填写」 behind an AlertDialog confirmation (focus returns to the
|
|
21
|
+
* button on cancel; a rejected promise keeps the dialog open with an error).
|
|
22
|
+
*
|
|
23
|
+
* Keyboard (form level; ignored while an IME composes):
|
|
24
|
+
* - `1`…`n` choose option n, `n+1` toggles 「其他」 (not while typing in a textarea);
|
|
25
|
+
* - `Enter` → next question, or submit on the last (not in a textarea, not on a button);
|
|
26
|
+
* - `←` / `→` page (not in a textarea); `Ctrl/⌘ + Enter` submits from anywhere;
|
|
27
|
+
* - after paging, focus moves to the first control of the new page.
|
|
28
|
+
*
|
|
29
|
+
* Motion: the question body slides in on a single axis (`x` + opacity, `fast`) from the paging
|
|
30
|
+
* direction; reduced motion switches instantly. The dock entrance belongs to the caller.
|
|
31
|
+
*/
|
|
32
|
+
export interface QuestionnaireCardHandle {
|
|
33
|
+
/** Ask the host to persist the current answers now (e.g. before closing the page). */
|
|
34
|
+
flush: () => void | Promise<void>;
|
|
35
|
+
/** Focus the first control of the current page. */
|
|
36
|
+
focus: () => void;
|
|
37
|
+
}
|
|
38
|
+
export interface QuestionnaireCardProps extends Omit<React.FormHTMLAttributes<HTMLFormElement>, 'onSubmit' | 'children' | 'title'> {
|
|
39
|
+
questionnaire: QuestionnaireView;
|
|
40
|
+
onAnswerChange?: (answer: QuestionAnswer) => void;
|
|
41
|
+
onSubmit?: AgentActionHandler<[QuestionAnswer[], AgentActionContext]>;
|
|
42
|
+
/** Shown with a failed draft save. */
|
|
43
|
+
onRetrySave?: () => void;
|
|
44
|
+
/** Called by the `flush()` handle with the current answers. */
|
|
45
|
+
onFlush?: (answers: QuestionAnswer[]) => void | Promise<void>;
|
|
46
|
+
/** Read-only summary: copy the answers as plain text (host writes the clipboard). */
|
|
47
|
+
onCopyAnswers?: (text: string) => void;
|
|
48
|
+
/**
|
|
49
|
+
* Ended questionnaire (completed / expired / interrupted) with an unsaved draft (`draftStatus`
|
|
50
|
+
* `dirty` or `error`): drop the local draft. Confirmed through an AlertDialog. Return a Promise to
|
|
51
|
+
* keep the dialog open until the host settles.
|
|
52
|
+
*/
|
|
53
|
+
onDiscardDraft?: () => void | Promise<unknown>;
|
|
54
|
+
/** Header title override (default: `questionnaire.title` or 「需要你的回答」). */
|
|
55
|
+
title?: React.ReactNode;
|
|
56
|
+
/** Start on this page instead of the first unanswered question. */
|
|
57
|
+
initialPage?: number;
|
|
58
|
+
}
|
|
59
|
+
export declare const QuestionnaireCard: React.ForwardRefExoticComponent<QuestionnaireCardProps & React.RefAttributes<QuestionnaireCardHandle>>;
|
|
60
|
+
//# sourceMappingURL=QuestionnaireCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QuestionnaireCard.d.ts","sourceRoot":"","sources":["../../../src/components/intervention/QuestionnaireCard.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,cAAc,EAAE,iBAAiB,EAAgB,MAAM,qBAAqB,CAAC;AAUnI;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,WAAW,uBAAuB;IACtC,sFAAsF;IACtF,KAAK,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,mDAAmD;IACnD,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,sBAAuB,SAAQ,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,eAAe,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC;IAChI,aAAa,EAAE,iBAAiB,CAAC;IACjC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;IAClD,QAAQ,CAAC,EAAE,kBAAkB,CAAC,CAAC,cAAc,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;IACtE,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,+DAA+D;IAC/D,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,qFAAqF;IACrF,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,0EAA0E;IAC1E,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAoHD,eAAO,MAAM,iBAAiB,wGA2e5B,CAAC"}
|
|
@@ -0,0 +1,322 @@
|
|
|
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 { motion } from 'motion/react';
|
|
5
|
+
import { Alert, AlertDialog, Button, Callout, Checkbox, CheckboxGroup, IconButton, Radio, RadioGroup, Textarea, useRhineMotion } from '@wzrhine/react';
|
|
6
|
+
import { codePointLength, isStaleRevision } from '@wzrhine/agent-core';
|
|
7
|
+
import { AgentStatus } from '../../primitives/AgentStatus.js';
|
|
8
|
+
import { AgentIcon } from '../../primitives/icons.js';
|
|
9
|
+
import { useAgentMessages } from '../../provider/AgentMessages.js';
|
|
10
|
+
import { cx } from '../../utils/cx.js';
|
|
11
|
+
import { useActionLock } from './action-lock.js';
|
|
12
|
+
import { answerState, answerText, isOverLimit, isQuestionOptional, normalizeAnswers } from './questionnaire-answers.js';
|
|
13
|
+
const CUSTOM = '__rl_agent_custom__';
|
|
14
|
+
const EDITABLE = new Set(['waiting', 'drafting', 'saving']);
|
|
15
|
+
const READ_ONLY = new Set(['completed', 'expired', 'interrupted']);
|
|
16
|
+
const toMap = (answers) => new Map(answers.map((a) => [a.questionId, a]));
|
|
17
|
+
function isComposing(event) {
|
|
18
|
+
return event.nativeEvent.isComposing || event.keyCode === 229;
|
|
19
|
+
}
|
|
20
|
+
function summaryText(questions, answers, m, interrupted) {
|
|
21
|
+
return questions
|
|
22
|
+
.map((q) => {
|
|
23
|
+
const a = answers.get(q.id);
|
|
24
|
+
const text = answerText(q, a, m.questionJoin);
|
|
25
|
+
const value = a?.skipped ? m.questionSummarySkipped : (text ?? (interrupted ? m.questionSummaryUnansweredInterrupted : m.questionSummaryUnanswered));
|
|
26
|
+
return `${q.title}\n${value}`;
|
|
27
|
+
})
|
|
28
|
+
.join('\n\n');
|
|
29
|
+
}
|
|
30
|
+
/** Read-only answers for completed / expired / interrupted questionnaires. */
|
|
31
|
+
function Summary({ questionnaire, answers, title, onCopyAnswers, onDiscardDraft, className, rest, }) {
|
|
32
|
+
const m = useAgentMessages().intervention;
|
|
33
|
+
const id = React.useId();
|
|
34
|
+
const status = questionnaire.status;
|
|
35
|
+
const interrupted = status === 'interrupted';
|
|
36
|
+
const tone = status === 'completed' ? 'success' : interrupted ? 'warning' : 'neutral';
|
|
37
|
+
const unsaved = questionnaire.draftStatus === 'dirty' || questionnaire.draftStatus === 'error';
|
|
38
|
+
return (_jsxs("section", { ...rest, className: cx('rl-agent-question', className), "aria-labelledby": `${id}-title`, "data-status": status, "data-readonly": "", children: [_jsxs("header", { className: "rl-agent-question__header", children: [_jsx(AgentIcon, { name: "question", className: "rl-agent-question__icon" }), _jsx("h3", { id: `${id}-title`, className: "rl-agent-question__title", children: title }), _jsx(AgentStatus, { glyph: status === 'completed' ? 'done' : 'stopped', tone: tone, label: m.questionStatus[status] })] }), _jsx("p", { className: "rl-agent-question__summary-title", children: m.questionSummaryTitle[status] }), _jsx("dl", { className: "rl-agent-question__summary", children: questionnaire.questions.map((q) => {
|
|
39
|
+
const a = answers.get(q.id);
|
|
40
|
+
const text = answerText(q, a, m.questionJoin);
|
|
41
|
+
const state = a?.skipped ? 'skipped' : text ? 'answered' : 'unanswered';
|
|
42
|
+
return (_jsxs("div", { className: "rl-agent-question__summary-row", "data-state": state, children: [_jsx("dt", { children: q.title }), _jsx("dd", { children: state === 'skipped'
|
|
43
|
+
? m.questionSummarySkipped
|
|
44
|
+
: (text ?? (interrupted ? m.questionSummaryUnansweredInterrupted : m.questionSummaryUnanswered)) })] }, q.id));
|
|
45
|
+
}) }), unsaved && onDiscardDraft && (_jsxs("div", { className: "rl-agent-question__ended-draft", children: [_jsxs("p", { className: "rl-agent-question__ended-draft-text", children: [_jsx(AgentIcon, { name: "warning" }), _jsx("span", { children: m.questionEndedDraft })] }), _jsx(AlertDialog, { trigger: _jsx(Button, { size: "sm", variant: "secondary", iconStart: _jsx(AgentIcon, { name: "trash" }), children: m.questionDiscardDraft }), title: m.questionDiscardTitle, description: m.questionDiscardDescription, confirmLabel: m.questionDiscardConfirm, errorText: m.questionDiscardError, onConfirm: onDiscardDraft })] })), onCopyAnswers && (_jsx("div", { className: "rl-agent-question__footer", children: _jsx(Button, { size: "sm", variant: "secondary", iconStart: _jsx(AgentIcon, { name: "copy" }), onClick: () => onCopyAnswers(summaryText(questionnaire.questions, answers, m, interrupted)), children: m.questionCopy }) }))] }));
|
|
46
|
+
}
|
|
47
|
+
function firstControl(root) {
|
|
48
|
+
if (!root)
|
|
49
|
+
return null;
|
|
50
|
+
return (root.querySelector('[role="radio"][aria-checked="true"]:not([aria-disabled="true"])') ??
|
|
51
|
+
root.querySelector('[role="radio"]:not([aria-disabled="true"]), [role="checkbox"]:not([aria-disabled="true"]), textarea:not([disabled])') ??
|
|
52
|
+
root.querySelector('button:not([disabled])'));
|
|
53
|
+
}
|
|
54
|
+
export const QuestionnaireCard = React.forwardRef(function QuestionnaireCard({ questionnaire, onAnswerChange, onSubmit, onRetrySave, onFlush, onCopyAnswers, onDiscardDraft, title, initialPage, className, ...rest }, ref) {
|
|
55
|
+
const m = useAgentMessages().intervention;
|
|
56
|
+
const { reduced, resolve } = useRhineMotion();
|
|
57
|
+
const id = React.useId();
|
|
58
|
+
const { questions, status, revision } = questionnaire;
|
|
59
|
+
const total = questions.length;
|
|
60
|
+
const formRef = React.useRef(null);
|
|
61
|
+
const bodyRef = React.useRef(null);
|
|
62
|
+
// ----- local mirror; never rolls back to an older revision -----
|
|
63
|
+
const [mirror, setMirror] = React.useState(() => ({ id: questionnaire.id, revision, answers: toMap(questionnaire.answers) }));
|
|
64
|
+
let current = mirror;
|
|
65
|
+
if (mirror.id !== questionnaire.id || (revision !== mirror.revision && !isStaleRevision(mirror.revision, revision))) {
|
|
66
|
+
current = { id: questionnaire.id, revision, answers: toMap(questionnaire.answers) };
|
|
67
|
+
setMirror(current);
|
|
68
|
+
}
|
|
69
|
+
const answers = current.answers;
|
|
70
|
+
const [page, setPage] = React.useState(() => {
|
|
71
|
+
if (initialPage != null)
|
|
72
|
+
return Math.max(0, Math.min(total - 1, initialPage));
|
|
73
|
+
const first = questions.findIndex((q) => answerState(q, questionnaire.answers.find((a) => a.questionId === q.id)) === 'unanswered');
|
|
74
|
+
return Math.max(0, first);
|
|
75
|
+
});
|
|
76
|
+
const index = Math.max(0, Math.min(total - 1, page));
|
|
77
|
+
const [direction, setDirection] = React.useState(0);
|
|
78
|
+
const [confirming, setConfirming] = React.useState(null);
|
|
79
|
+
const focusAfterPaging = React.useRef(false);
|
|
80
|
+
const lastSubmit = React.useRef(null);
|
|
81
|
+
const lock = useActionLock(`${questionnaire.id}:${revision}:${status}:${questionnaire.submitStatus}`);
|
|
82
|
+
React.useImperativeHandle(ref, () => ({
|
|
83
|
+
flush: () => onFlush?.([...answers.values()]),
|
|
84
|
+
focus: () => firstControl(bodyRef.current)?.focus(),
|
|
85
|
+
}), [answers, onFlush]);
|
|
86
|
+
// The confirmation replaces the footer the user just activated: move focus to its safe action.
|
|
87
|
+
const backRef = React.useRef(null);
|
|
88
|
+
React.useEffect(() => {
|
|
89
|
+
if (confirming)
|
|
90
|
+
backRef.current?.focus();
|
|
91
|
+
}, [confirming]);
|
|
92
|
+
React.useEffect(() => {
|
|
93
|
+
if (!focusAfterPaging.current)
|
|
94
|
+
return;
|
|
95
|
+
focusAfterPaging.current = false;
|
|
96
|
+
firstControl(bodyRef.current)?.focus();
|
|
97
|
+
}, [index]);
|
|
98
|
+
const heading = title ?? questionnaire.title ?? m.questionTitle;
|
|
99
|
+
if (READ_ONLY.has(status)) {
|
|
100
|
+
return (_jsx(Summary, { questionnaire: questionnaire, answers: answers, title: heading, onCopyAnswers: onCopyAnswers, onDiscardDraft: onDiscardDraft, className: className, rest: rest }));
|
|
101
|
+
}
|
|
102
|
+
const busy = status === 'submit-pending' || questionnaire.submitStatus === 'submitting' || lock.locked;
|
|
103
|
+
const editable = EDITABLE.has(status) && !busy && !!onAnswerChange;
|
|
104
|
+
const unknown = status === 'unknown' || questionnaire.submitStatus === 'unknown';
|
|
105
|
+
const question = questions[index];
|
|
106
|
+
const states = questions.map((q) => answerState(q, answers.get(q.id)));
|
|
107
|
+
const answeredCount = states.filter((s) => s === 'answered').length;
|
|
108
|
+
const last = index === total - 1;
|
|
109
|
+
const update = (q, next) => {
|
|
110
|
+
if (!editable)
|
|
111
|
+
return;
|
|
112
|
+
setConfirming(null);
|
|
113
|
+
setMirror((prev) => {
|
|
114
|
+
const map = new Map(prev.answers);
|
|
115
|
+
map.set(q.id, next);
|
|
116
|
+
return { ...prev, answers: map };
|
|
117
|
+
});
|
|
118
|
+
onAnswerChange?.(next);
|
|
119
|
+
};
|
|
120
|
+
const go = (next) => {
|
|
121
|
+
const target = Math.max(0, Math.min(total - 1, next));
|
|
122
|
+
if (target === index)
|
|
123
|
+
return;
|
|
124
|
+
setDirection(target > index ? 1 : -1);
|
|
125
|
+
setConfirming(null);
|
|
126
|
+
focusAfterPaging.current = true;
|
|
127
|
+
setPage(target);
|
|
128
|
+
};
|
|
129
|
+
const send = (list, ctx) => {
|
|
130
|
+
if (!onSubmit)
|
|
131
|
+
return;
|
|
132
|
+
lock.run(() => {
|
|
133
|
+
lastSubmit.current = { answers: list, ctx };
|
|
134
|
+
return onSubmit(list, ctx);
|
|
135
|
+
});
|
|
136
|
+
};
|
|
137
|
+
const submit = (force = false) => {
|
|
138
|
+
if (busy || !onSubmit)
|
|
139
|
+
return;
|
|
140
|
+
if (unknown) {
|
|
141
|
+
retry();
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const result = normalizeAnswers(questions, answers);
|
|
145
|
+
if (result.missing.length) {
|
|
146
|
+
setConfirming('required');
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (result.overLimit.length) {
|
|
150
|
+
setConfirming('limit');
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const unanswered = states.filter((s) => s === 'unanswered').length;
|
|
154
|
+
if (unanswered > 0 && !force) {
|
|
155
|
+
setConfirming('skip');
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
setConfirming(null);
|
|
159
|
+
send(result.answers, { actionId: lock.nextActionId(), targetId: questionnaire.id, baseRevision: revision });
|
|
160
|
+
};
|
|
161
|
+
const retry = () => {
|
|
162
|
+
const prev = lastSubmit.current;
|
|
163
|
+
if (prev) {
|
|
164
|
+
send(prev.answers, prev.ctx);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
const actionId = questionnaire.receipt?.actionId;
|
|
168
|
+
if (!actionId)
|
|
169
|
+
return;
|
|
170
|
+
send(normalizeAnswers(questions, answers).answers, { actionId, targetId: questionnaire.id, baseRevision: revision });
|
|
171
|
+
};
|
|
172
|
+
const canRetry = unknown && !!onSubmit && questionnaire.receipt?.retryable !== false && (!!lastSubmit.current || !!questionnaire.receipt?.actionId);
|
|
173
|
+
const backToFirstOpen = () => {
|
|
174
|
+
const missing = confirming === 'required' ? questions.findIndex((q, i) => !isQuestionOptional(q) && states[i] === 'unanswered') : -1;
|
|
175
|
+
const over = confirming === 'limit' ? questions.findIndex((q) => isOverLimit(q, answers.get(q.id))) : -1;
|
|
176
|
+
const open = missing >= 0 ? missing : over >= 0 ? over : states.findIndex((s) => s === 'unanswered');
|
|
177
|
+
setConfirming(null);
|
|
178
|
+
if (open >= 0 && open !== index)
|
|
179
|
+
go(open);
|
|
180
|
+
else
|
|
181
|
+
window.requestAnimationFrame?.(() => firstControl(bodyRef.current)?.focus());
|
|
182
|
+
};
|
|
183
|
+
// ----- question body -----
|
|
184
|
+
const answer = question ? answers.get(question.id) : undefined;
|
|
185
|
+
const skipped = answer?.skipped === true;
|
|
186
|
+
const customOn = question?.kind !== 'text' && question?.allowCustom === true && typeof answer?.text === 'string';
|
|
187
|
+
const options = question?.options ?? [];
|
|
188
|
+
const choose = (optionId) => {
|
|
189
|
+
if (!question)
|
|
190
|
+
return;
|
|
191
|
+
if (question.kind === 'single')
|
|
192
|
+
update(question, { questionId: question.id, optionIds: [optionId] });
|
|
193
|
+
else {
|
|
194
|
+
const ids = answer?.optionIds ?? [];
|
|
195
|
+
const nextIds = ids.includes(optionId) ? ids.filter((x) => x !== optionId) : [...ids, optionId];
|
|
196
|
+
update(question, { questionId: question.id, optionIds: nextIds, ...(customOn ? { text: answer?.text } : null) });
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
const toggleCustom = (on) => {
|
|
200
|
+
if (!question)
|
|
201
|
+
return;
|
|
202
|
+
if (question.kind === 'single')
|
|
203
|
+
update(question, on ? { questionId: question.id, optionIds: [], text: answer?.text ?? '' } : { questionId: question.id, optionIds: [] });
|
|
204
|
+
else
|
|
205
|
+
update(question, { questionId: question.id, optionIds: answer?.optionIds ?? [], ...(on ? { text: answer?.text ?? '' } : null) });
|
|
206
|
+
};
|
|
207
|
+
const setText = (text) => {
|
|
208
|
+
if (!question)
|
|
209
|
+
return;
|
|
210
|
+
if (question.kind === 'text')
|
|
211
|
+
update(question, { questionId: question.id, text });
|
|
212
|
+
else
|
|
213
|
+
update(question, { questionId: question.id, optionIds: question.kind === 'single' ? [] : (answer?.optionIds ?? []), text });
|
|
214
|
+
};
|
|
215
|
+
const toggleSkip = () => {
|
|
216
|
+
if (!question)
|
|
217
|
+
return;
|
|
218
|
+
if (skipped)
|
|
219
|
+
update(question, { questionId: question.id });
|
|
220
|
+
else {
|
|
221
|
+
update(question, { questionId: question.id, skipped: true });
|
|
222
|
+
if (!last)
|
|
223
|
+
go(index + 1);
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
const focusCustomInput = () => window.requestAnimationFrame?.(() => bodyRef.current?.querySelector('textarea')?.focus());
|
|
227
|
+
// ----- keyboard -----
|
|
228
|
+
const isTextField = (target) => target instanceof HTMLTextAreaElement || (target instanceof HTMLInputElement && target.type !== 'checkbox' && target.type !== 'radio');
|
|
229
|
+
const onKeyDownCapture = (event) => {
|
|
230
|
+
// ← / → page; ↑ / ↓ keep moving inside a radio group (ARIA radio pattern).
|
|
231
|
+
if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight')
|
|
232
|
+
return;
|
|
233
|
+
if (isComposing(event) || event.altKey || event.ctrlKey || event.metaKey || event.shiftKey || isTextField(event.target) || total < 2)
|
|
234
|
+
return;
|
|
235
|
+
event.preventDefault();
|
|
236
|
+
event.stopPropagation();
|
|
237
|
+
go(index + (event.key === 'ArrowRight' ? 1 : -1));
|
|
238
|
+
};
|
|
239
|
+
const onKeyDown = (event) => {
|
|
240
|
+
if (isComposing(event) || !question)
|
|
241
|
+
return;
|
|
242
|
+
if (event.key === 'Enter' && (event.ctrlKey || event.metaKey)) {
|
|
243
|
+
event.preventDefault();
|
|
244
|
+
submit(confirming === 'skip');
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
if (isTextField(event.target) || event.altKey || event.ctrlKey || event.metaKey)
|
|
248
|
+
return;
|
|
249
|
+
if (event.key === 'Enter') {
|
|
250
|
+
// Buttons keep their own Enter activation.
|
|
251
|
+
if (event.target instanceof HTMLButtonElement)
|
|
252
|
+
return;
|
|
253
|
+
event.preventDefault();
|
|
254
|
+
if (last)
|
|
255
|
+
submit(confirming === 'skip');
|
|
256
|
+
else
|
|
257
|
+
go(index + 1);
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
if (!editable || skipped || question.kind === 'text' || !/^[1-9]$/.test(event.key))
|
|
261
|
+
return;
|
|
262
|
+
const digit = Number(event.key);
|
|
263
|
+
if (digit <= options.length) {
|
|
264
|
+
event.preventDefault();
|
|
265
|
+
choose(options[digit - 1].id);
|
|
266
|
+
}
|
|
267
|
+
else if (digit === options.length + 1 && question.allowCustom) {
|
|
268
|
+
event.preventDefault();
|
|
269
|
+
toggleCustom(!customOn);
|
|
270
|
+
if (!customOn)
|
|
271
|
+
focusCustomInput();
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
const titleId = `${id}-title`;
|
|
275
|
+
const promptId = `${id}-prompt`;
|
|
276
|
+
const countId = `${id}-count`;
|
|
277
|
+
const hintId = `${id}-hint`;
|
|
278
|
+
const count = answer?.text != null ? codePointLength(answer.text) : 0;
|
|
279
|
+
const over = question ? isOverLimit(question, answer) : false;
|
|
280
|
+
const unansweredCount = states.filter((s) => s === 'unanswered').length;
|
|
281
|
+
const requiredMissing = questions.filter((q, i) => !isQuestionOptional(q) && states[i] === 'unanswered').length;
|
|
282
|
+
const kbd = (n) => (_jsx("kbd", { className: "rl-agent-question__kbd", "aria-hidden": "true", children: n }));
|
|
283
|
+
const textInput = question && (question.kind === 'text' || customOn) && !skipped && (_jsxs("div", { className: "rl-agent-question__text", children: [_jsx(Textarea, { rows: question.kind === 'text' ? 3 : 2, autoResize: true, maxRows: 8, value: answer?.text ?? '', disabled: !editable, placeholder: m.questionPlaceholder, invalid: over, "aria-label": question.kind === 'text' ? question.title : m.questionOtherInput(question.title), "aria-describedby": [question.kind === 'text' && question.prompt ? promptId : undefined, question.maxLength != null ? countId : undefined].filter(Boolean).join(' ') || undefined, onValueChange: (value) => setText(value) }), question.maxLength != null && (_jsx("span", { id: countId, className: "rl-agent-question__count", "data-over": over || undefined, children: m.questionCount(count, question.maxLength) }))] }));
|
|
284
|
+
let body = null;
|
|
285
|
+
if (question) {
|
|
286
|
+
if (skipped) {
|
|
287
|
+
body = (_jsxs("fieldset", { className: "rl-agent-question__fieldset", disabled: !editable, children: [_jsx("legend", { className: "rl-agent-question__legend", children: question.title }), question.prompt && _jsx("p", { className: "rl-agent-question__prompt", children: question.prompt }), _jsx("p", { className: "rl-agent-question__skipped", children: m.questionSkipped })] }));
|
|
288
|
+
}
|
|
289
|
+
else if (question.kind === 'text') {
|
|
290
|
+
body = (_jsxs("fieldset", { className: "rl-agent-question__fieldset", children: [_jsxs("legend", { className: "rl-agent-question__legend", children: [question.title, !isQuestionOptional(question) && _jsx("span", { className: "rl-agent-question__required", children: m.questionRequired })] }), question.prompt && (_jsx("p", { id: promptId, className: "rl-agent-question__prompt", children: question.prompt })), textInput] }));
|
|
291
|
+
}
|
|
292
|
+
else if (question.kind === 'single') {
|
|
293
|
+
body = (_jsxs(_Fragment, { children: [_jsxs(RadioGroup, { className: "rl-agent-question__group", label: question.title, required: !isQuestionOptional(question), description: question.prompt, disabled: !editable, value: customOn ? CUSTOM : (answer?.optionIds?.[0] ?? null), onValueChange: (value) => {
|
|
294
|
+
if (value === CUSTOM) {
|
|
295
|
+
toggleCustom(true);
|
|
296
|
+
}
|
|
297
|
+
else if (typeof value === 'string')
|
|
298
|
+
choose(value);
|
|
299
|
+
}, children: [options.map((option, i) => (_jsx(Radio, { value: option.id, label: _jsxs(_Fragment, { children: [kbd(i + 1), option.label] }), description: option.description }, option.id))), question.allowCustom && _jsx(Radio, { value: CUSTOM, label: _jsxs(_Fragment, { children: [kbd(options.length + 1), m.questionOther] }), description: m.questionOtherDescription })] }), textInput] }));
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
const ids = answer?.optionIds ?? [];
|
|
303
|
+
body = (_jsxs(_Fragment, { children: [_jsxs(CheckboxGroup, { className: "rl-agent-question__group", label: question.title, required: !isQuestionOptional(question), description: question.prompt, disabled: !editable, value: customOn ? [...ids, CUSTOM] : ids, onValueChange: (next) => {
|
|
304
|
+
const nextCustom = next.includes(CUSTOM);
|
|
305
|
+
const nextIds = next.filter((x) => x !== CUSTOM);
|
|
306
|
+
update(question, { questionId: question.id, optionIds: nextIds, ...(nextCustom ? { text: answer?.text ?? '' } : null) });
|
|
307
|
+
}, children: [options.map((option, i) => (_jsx(Checkbox, { value: option.id, label: _jsxs(_Fragment, { children: [kbd(i + 1), option.label] }), description: option.description }, option.id))), question.allowCustom && _jsx(Checkbox, { value: CUSTOM, label: _jsxs(_Fragment, { children: [kbd(options.length + 1), m.questionOther] }), description: m.questionOtherDescription })] }), textInput] }));
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
const draftText = m.questionDraft[questionnaire.draftStatus];
|
|
311
|
+
const statusMeta = busy ? { glyph: 'pending', tone: 'info', active: true } : unknown ? { glyph: 'unknown', tone: 'warning' } : { glyph: 'waiting-user', tone: 'warning' };
|
|
312
|
+
return (_jsxs("form", { ...rest, ref: formRef, className: cx('rl-agent-question', className), "aria-labelledby": titleId, "aria-busy": busy || undefined, "data-status": status, noValidate: true, onSubmit: (event) => {
|
|
313
|
+
event.preventDefault();
|
|
314
|
+
submit(confirming === 'skip');
|
|
315
|
+
}, onKeyDownCapture: onKeyDownCapture, onKeyDown: onKeyDown, children: [_jsxs("header", { className: "rl-agent-question__header", children: [_jsx(AgentIcon, { name: "question", className: "rl-agent-question__icon" }), _jsx("h3", { id: titleId, className: "rl-agent-question__title", children: heading }), _jsx("span", { className: "rl-agent-question__progress", children: m.questionProgress(answeredCount, total) }), _jsx(AgentStatus, { glyph: statusMeta.glyph, tone: statusMeta.tone, active: statusMeta.active, label: busy ? m.questionStatus['submit-pending'] : m.questionStatus[unknown ? 'unknown' : status] })] }), total > 1 && (_jsxs("nav", { className: "rl-agent-question__pager", "aria-label": m.questionPager, children: [_jsx(IconButton, { size: "sm", variant: "ghost", icon: _jsx(AgentIcon, { name: "chevron-left" }), label: m.questionPagePrev, disabled: index === 0, onClick: () => go(index - 1) }), _jsx("ol", { className: "rl-agent-question__dots", children: questions.map((q, i) => (_jsx("li", { children: _jsx("button", { type: "button", className: "rl-agent-question__dot", "data-state": states[i], "aria-current": i === index ? 'step' : undefined, "aria-label": m.questionDot(i + 1, states[i]), onClick: () => go(i) }) }, q.id))) }), _jsx("span", { className: "rl-agent-question__page-no", "aria-hidden": "true", children: m.questionPageNo(index + 1, total) }), _jsx(IconButton, { size: "sm", variant: "ghost", icon: _jsx(AgentIcon, { name: "chevron-right" }), label: m.questionPageNext, disabled: last, onClick: () => go(index + 1) })] })), _jsx("div", { ref: bodyRef, className: "rl-agent-question__viewport", children: _jsx(motion.div, { className: "rl-agent-question__page", initial: direction === 0 ? false : { x: reduced ? 0 : direction * 12, opacity: reduced ? 1 : 0 }, animate: { x: 0, opacity: 1 }, transition: { x: resolve('transform', 'fast'), opacity: resolve('opacity', 'fast') }, children: body }, question?.id ?? 'empty') }), unknown && (_jsx(Callout, { tone: "warning", title: m.questionUnknownTitle, className: "rl-agent-question__unknown", children: questionnaire.receipt?.reason ?? m.questionUnknownBody })), questionnaire.submitStatus === 'rejected' && !unknown && (_jsx(Alert, { tone: "danger", title: m.questionRejected, children: questionnaire.receipt?.reason })), _jsxs("div", { className: "rl-agent-question__draft", role: "status", children: [draftText && (_jsxs("span", { className: "rl-agent-question__draft-text", "data-draft": questionnaire.draftStatus, children: [questionnaire.draftStatus === 'saved' && _jsx(AgentIcon, { name: "check" }), questionnaire.draftStatus === 'error' && _jsx(AgentIcon, { name: "warning" }), draftText] })), busy && _jsx("span", { className: "rl-agent-sr", children: m.questionSubmitting })] }), questionnaire.draftStatus === 'error' && onRetrySave && (_jsx("div", { className: "rl-agent-question__draft-retry", children: _jsx(Button, { size: "sm", variant: "ghost", iconStart: _jsx(AgentIcon, { name: "retry" }), onClick: onRetrySave, children: m.questionRetrySave }) })), _jsx("footer", { className: "rl-agent-question__footer", children: confirming ? (_jsxs("div", { className: "rl-agent-question__confirm", children: [_jsxs("p", { role: "alert", className: "rl-agent-question__confirm-text", children: [_jsx(AgentIcon, { name: "warning" }), confirming === 'skip'
|
|
316
|
+
? m.questionConfirm(unansweredCount)
|
|
317
|
+
: confirming === 'required'
|
|
318
|
+
? m.questionRequiredMissing(requiredMissing)
|
|
319
|
+
: m.questionOverLimit(questions.find((q) => isOverLimit(q, answers.get(q.id)))?.title ?? '')] }), _jsxs("div", { className: "rl-agent-question__actions", children: [_jsx(Button, { ref: backRef, size: "sm", variant: "secondary", onClick: backToFirstOpen, children: m.questionBack }), confirming === 'skip' && (_jsx(Button, { size: "sm", variant: "accent", loading: busy, onClick: () => submit(true), children: m.questionSkipAndSubmit }))] })] })) : (_jsxs(_Fragment, { children: [_jsx("span", { id: hintId, className: "rl-agent-question__hint", children: question?.kind === 'text' ? m.questionHintText : m.questionHintChoice(last) }), _jsxs("div", { className: "rl-agent-question__actions", children: [question && isQuestionOptional(question) && onAnswerChange && !unknown && (_jsx(Button, { size: "sm", variant: "ghost", disabled: !editable, onClick: toggleSkip, children: skipped ? m.questionUndoSkip : m.questionSkip })), !last && (_jsx(Button, { size: "sm", variant: "secondary", onClick: () => go(index + 1), children: m.questionNext })), onSubmit &&
|
|
320
|
+
(unknown ? (canRetry && (_jsx(Button, { type: "submit", size: "sm", variant: "primary", loading: busy, iconStart: _jsx(AgentIcon, { name: "retry" }), children: m.questionRetrySubmit }))) : (_jsx(Button, { type: "submit", size: "sm", variant: "accent", loading: busy, disabled: !EDITABLE.has(status) && !busy, children: m.questionSubmit })))] })] })) })] }));
|
|
321
|
+
});
|
|
322
|
+
//# sourceMappingURL=QuestionnaireCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QuestionnaireCard.js","sourceRoot":"","sources":["../../../src/components/intervention/QuestionnaireCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { AgentActionResult } from '@wzrhine/agent-core';
|
|
2
|
+
/**
|
|
3
|
+
* Per-mount action identity and double-submit guard shared by ApprovalPanel and QuestionnaireCard
|
|
4
|
+
* (ADR-0011 §4). Internal; not exported from the package.
|
|
5
|
+
*
|
|
6
|
+
* - `nextActionId()` = stable per-mount prefix (`React.useId`) + counter, so two cards on one page
|
|
7
|
+
* never collide and a retry can reuse the exact id of the attempt it repeats.
|
|
8
|
+
* - `run(call)` blocks re-entry synchronously (a ref, not state, so a double click inside one
|
|
9
|
+
* frame is caught). The lock holds while the handler's promise is pending (`pending` = true:
|
|
10
|
+
* the control shows busy) and afterwards until the view-model changes (`viewKey`). Only a
|
|
11
|
+
* `rejected` result or a thrown / rejected handler releases it at once, because then the
|
|
12
|
+
* host keeps the same view and the user may try again.
|
|
13
|
+
*/
|
|
14
|
+
export declare function useActionLock(viewKey: string): {
|
|
15
|
+
locked: boolean;
|
|
16
|
+
pending: boolean;
|
|
17
|
+
nextActionId: () => string;
|
|
18
|
+
run: (call: () => AgentActionResult | void | Promise<AgentActionResult | void>) => boolean;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=action-lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-lock.d.ts","sourceRoot":"","sources":["../../../src/components/intervention/action-lock.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM;;;;gBA2BxB,MAAM,iBAAiB,GAAG,IAAI,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,KAAG,OAAO;EA0BhG"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* Per-mount action identity and double-submit guard shared by ApprovalPanel and QuestionnaireCard
|
|
5
|
+
* (ADR-0011 §4). Internal; not exported from the package.
|
|
6
|
+
*
|
|
7
|
+
* - `nextActionId()` = stable per-mount prefix (`React.useId`) + counter, so two cards on one page
|
|
8
|
+
* never collide and a retry can reuse the exact id of the attempt it repeats.
|
|
9
|
+
* - `run(call)` blocks re-entry synchronously (a ref, not state, so a double click inside one
|
|
10
|
+
* frame is caught). The lock holds while the handler's promise is pending (`pending` = true:
|
|
11
|
+
* the control shows busy) and afterwards until the view-model changes (`viewKey`). Only a
|
|
12
|
+
* `rejected` result or a thrown / rejected handler releases it at once, because then the
|
|
13
|
+
* host keeps the same view and the user may try again.
|
|
14
|
+
*/
|
|
15
|
+
export function useActionLock(viewKey) {
|
|
16
|
+
const prefix = React.useId();
|
|
17
|
+
const counter = React.useRef(0);
|
|
18
|
+
const lockRef = React.useRef(null);
|
|
19
|
+
const [, force] = React.useReducer((n) => n + 1, 0);
|
|
20
|
+
const mounted = React.useRef(true);
|
|
21
|
+
React.useEffect(() => {
|
|
22
|
+
mounted.current = true;
|
|
23
|
+
return () => {
|
|
24
|
+
mounted.current = false;
|
|
25
|
+
};
|
|
26
|
+
}, []);
|
|
27
|
+
const lock = lockRef.current;
|
|
28
|
+
const locked = lock !== null && (lock.pending || lock.key === viewKey);
|
|
29
|
+
const pending = lock?.pending === true;
|
|
30
|
+
const nextActionId = React.useCallback(() => {
|
|
31
|
+
counter.current += 1;
|
|
32
|
+
return `${prefix.replace(/[^\w-]/g, '')}-${counter.current}`;
|
|
33
|
+
}, [prefix]);
|
|
34
|
+
const settle = (key, result, failed = false) => {
|
|
35
|
+
lockRef.current = failed || (result && result.status === 'rejected') ? null : { key, pending: false };
|
|
36
|
+
if (mounted.current)
|
|
37
|
+
force();
|
|
38
|
+
};
|
|
39
|
+
const run = (call) => {
|
|
40
|
+
const current = lockRef.current;
|
|
41
|
+
if (current && (current.pending || current.key === viewKey))
|
|
42
|
+
return false;
|
|
43
|
+
const key = viewKey;
|
|
44
|
+
lockRef.current = { key, pending: true };
|
|
45
|
+
let out;
|
|
46
|
+
try {
|
|
47
|
+
out = call();
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
lockRef.current = null;
|
|
51
|
+
force();
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
if (out && typeof out.then === 'function') {
|
|
55
|
+
force();
|
|
56
|
+
out.then((result) => settle(key, result), () => settle(key, undefined, true));
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
settle(key, out);
|
|
60
|
+
}
|
|
61
|
+
return true;
|
|
62
|
+
};
|
|
63
|
+
return { locked, pending, nextActionId, run };
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=action-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-lock.js","sourceRoot":"","sources":["../../../src/components/intervention/action-lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
type LocalIconName = 'shield-alert' | 'lock-open' | 'trash-warning';
|
|
3
|
+
export declare function InterventionIcon({ name, className }: {
|
|
4
|
+
name: LocalIconName;
|
|
5
|
+
className?: string;
|
|
6
|
+
}): React.JSX.Element;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=icons.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../../src/components/intervention/icons.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,KAAK,aAAa,GAAG,cAAc,GAAG,WAAW,GAAG,eAAe,CAAC;AAQpE,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,qBAMhG"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
const paths = {
|
|
4
|
+
'shield-alert': _jsx("path", { d: "M8 2 3 4v4c0 3 2.2 5 5 6 2.8-1 5-3 5-6V4L8 2ZM8 5.5v3M8 10.5v.01" }),
|
|
5
|
+
'lock-open': _jsx("path", { d: "M4 7.5h8v6H4zM5.5 7.5V5a2.5 2.5 0 0 1 4.9-.7M8 10v1.5" }),
|
|
6
|
+
'trash-warning': _jsx("path", { d: "M3 4.5h10M6.5 4.5v-2h3v2M4.5 4.5l.5 9h6l.5-9M8 7v3M8 11.5v.01" }),
|
|
7
|
+
};
|
|
8
|
+
export function InterventionIcon({ name, className }) {
|
|
9
|
+
return (_jsx("svg", { className: className ? `rl-agent-icon ${className}` : 'rl-agent-icon', viewBox: "0 0 16 16", "aria-hidden": "true", focusable: "false", "data-icon": name, children: paths[name] }));
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=icons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons.js","sourceRoot":"","sources":["../../../src/components/intervention/icons.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAWb,MAAM,KAAK,GAA2C;IACpD,cAAc,EAAE,eAAM,CAAC,EAAC,kEAAkE,GAAG;IAC7F,WAAW,EAAE,eAAM,CAAC,EAAC,uDAAuD,GAAG;IAC/E,eAAe,EAAE,eAAM,CAAC,EAAC,+DAA+D,GAAG;CAC5F,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,EAAE,IAAI,EAAE,SAAS,EAA+C;IAC/F,OAAO,CACL,cAAK,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,iBAAiB,SAAS,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,OAAO,EAAC,WAAW,iBAAa,MAAM,EAAC,SAAS,EAAC,OAAO,eAAY,IAAI,YACjJ,KAAK,CAAC,IAAI,CAAC,GACR,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { QuestionAnswer, QuestionView } from '@wzrhine/agent-core';
|
|
2
|
+
/**
|
|
3
|
+
* Pure answer helpers for QuestionnaireCard (ADR-0011 §6). No React; safe for adapters.
|
|
4
|
+
*
|
|
5
|
+
* Encoding of the custom "other" answer inside `QuestionAnswer` (the contract has no extra flag):
|
|
6
|
+
* - `text === undefined` → the custom option is not selected;
|
|
7
|
+
* - `text` is a string (possibly empty) → the custom option is selected and `text` is its content.
|
|
8
|
+
* For `single` questions a selected custom answer clears `optionIds`, and choosing an option clears `text`.
|
|
9
|
+
* For `text` questions `text` is the answer itself.
|
|
10
|
+
*/
|
|
11
|
+
export type QuestionAnswerState = 'answered' | 'skipped' | 'unanswered';
|
|
12
|
+
/** Questions are optional unless `optional === false`. */
|
|
13
|
+
export declare const isQuestionOptional: (question: QuestionView) => boolean;
|
|
14
|
+
/** Code-point length of the free text is over `maxLength`. */
|
|
15
|
+
export declare function isOverLimit(question: QuestionView, answer: QuestionAnswer | undefined): boolean;
|
|
16
|
+
export declare function answerState(question: QuestionView, answer: QuestionAnswer | undefined): QuestionAnswerState;
|
|
17
|
+
/**
|
|
18
|
+
* The answers to submit: answered questions normalised (unknown option ids and an unselected
|
|
19
|
+
* custom text dropped), explicitly skipped and unanswered optional questions as `skipped: true`.
|
|
20
|
+
* Unanswered required questions are returned in `missing` and must block submission.
|
|
21
|
+
*/
|
|
22
|
+
export declare function normalizeAnswers(questions: readonly QuestionView[], answers: ReadonlyMap<string, QuestionAnswer> | readonly QuestionAnswer[]): {
|
|
23
|
+
answers: QuestionAnswer[];
|
|
24
|
+
missing: string[];
|
|
25
|
+
overLimit: string[];
|
|
26
|
+
};
|
|
27
|
+
/** Human-readable answer of one question; `null` when there is none (caller picks the label). */
|
|
28
|
+
export declare function answerText(question: QuestionView, answer: QuestionAnswer | undefined, join: string): string | null;
|
|
29
|
+
//# sourceMappingURL=questionnaire-answers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"questionnaire-answers.d.ts","sourceRoot":"","sources":["../../../src/components/intervention/questionnaire-answers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExE;;;;;;;;GAQG;AAEH,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,SAAS,GAAG,YAAY,CAAC;AAExE,0DAA0D;AAC1D,eAAO,MAAM,kBAAkB,GAAI,UAAU,YAAY,YAAgC,CAAC;AAE1F,8DAA8D;AAC9D,wBAAgB,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,GAAG,SAAS,GAAG,OAAO,CAG/F;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,GAAG,SAAS,GAAG,mBAAmB,CAQ3G;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,SAAS,YAAY,EAAE,EAClC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,SAAS,cAAc,EAAE,GACvE;IAAE,OAAO,EAAE,cAAc,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAiCvE;AAED,iGAAiG;AACjG,wBAAgB,UAAU,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQlH"}
|