@cat-factory/app 0.302.1 → 0.303.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/README.md +16 -0
- package/app/app.config.ts +19 -10
- package/app/assets/css/main.css +13 -13
- package/app/assets/css/prose.css +22 -22
- package/app/assets/css/tokens.css +298 -0
- package/app/components/assistant/AssistantModal.vue +22 -22
- package/app/components/auth/AuthGate.vue +1 -1
- package/app/components/auth/BackendMisconfiguredScreen.vue +10 -10
- package/app/components/auth/LoginScreen.vue +34 -36
- package/app/components/auth/ResetPasswordScreen.vue +12 -12
- package/app/components/auth/UserMenu.vue +4 -4
- package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +27 -25
- package/app/components/binaryOutput/BinaryOutputReport.vue +15 -15
- package/app/components/binaryOutput/StoredAssetView.vue +5 -5
- package/app/components/board/AddTaskModal.vue +17 -20
- package/app/components/board/AgentFailureCard.vue +11 -11
- package/app/components/board/AgentFailureHistory.vue +2 -2
- package/app/components/board/BoardCanvas.vue +6 -5
- package/app/components/board/CreateInitiativeModal.vue +8 -10
- package/app/components/board/DependencyConnectOverlay.vue +1 -1
- package/app/components/board/FailureHistoryList.vue +7 -7
- package/app/components/board/RecurringPipelineModal.vue +17 -17
- package/app/components/board/ReviewFrictionDialog.vue +6 -6
- package/app/components/board/StepExecutionHistory.vue +13 -13
- package/app/components/board/TaskDependencyEdges.vue +8 -8
- package/app/components/board/nodes/AgentChip.vue +10 -10
- package/app/components/board/nodes/BlockNode.vue +29 -29
- package/app/components/board/nodes/DecisionBadge.vue +2 -2
- package/app/components/board/nodes/EpicNode.vue +14 -10
- package/app/components/board/nodes/FrameSwimlanes.vue +7 -9
- package/app/components/board/nodes/InitiativeCard.vue +8 -8
- package/app/components/board/nodes/LaneGroup.vue +1 -1
- package/app/components/board/nodes/LaneTask.vue +2 -2
- package/app/components/board/nodes/ResizeGrips.vue +4 -4
- package/app/components/board/nodes/TaskCard.vue +18 -18
- package/app/components/board/nodes/TaskLane.vue +5 -5
- package/app/components/board/nodes/TaskPipelineMini.vue +18 -18
- package/app/components/bootstrap/AdoptionReviewModal.vue +29 -26
- package/app/components/bootstrap/BootstrapModal.vue +21 -23
- package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
- package/app/components/brainstorm/BrainstormWindow.vue +30 -33
- package/app/components/bugFishing/BugFishingWindow.vue +49 -49
- package/app/components/clarity/ClarityReviewWindow.vue +30 -30
- package/app/components/common/AsyncViewError.vue +5 -5
- package/app/components/common/ClarificationItem.vue +8 -13
- package/app/components/common/ConfirmDialog.vue +4 -2
- package/app/components/common/DescriptorFields.vue +1 -1
- package/app/components/common/EmptyState.vue +3 -3
- package/app/components/common/InterviewGateNotice.vue +7 -7
- package/app/components/common/KeyboardShortcutsHelp.vue +1 -1
- package/app/components/common/MarkdownProse.vue +14 -13
- package/app/components/consensus/ConsensusSessionWindow.vue +26 -26
- package/app/components/context/ContextAttachmentFields.vue +17 -17
- package/app/components/docs/DocInterviewWindow.vue +14 -14
- package/app/components/documents/ContextDocumentPicker.vue +17 -17
- package/app/components/documents/DocumentImportModal.vue +7 -7
- package/app/components/documents/DocumentSourceConnectModal.vue +3 -3
- package/app/components/documents/DocumentSyncState.vue +5 -5
- package/app/components/documents/DocumentTemplatesModal.vue +15 -15
- package/app/components/documents/RepoContextDocPicker.vue +5 -5
- package/app/components/documents/SpawnPreviewModal.vue +12 -12
- package/app/components/documents/StartFromDesignModal.vue +11 -11
- package/app/components/documents/TaskContextDocs.vue +5 -5
- package/app/components/environments/EnvSetupStepper.vue +6 -6
- package/app/components/environments/EnvironmentStatusPanel.vue +17 -17
- package/app/components/environments/steps/EnvPickStep.vue +3 -3
- package/app/components/environments/steps/EnvPreflightStep.vue +9 -9
- package/app/components/environments/steps/EnvReviewStep.vue +25 -22
- package/app/components/environments/steps/EnvSaveStep.vue +7 -5
- package/app/components/environments/steps/JourneyStepNav.vue +1 -1
- package/app/components/focus/BlockFocusView.vue +17 -19
- package/app/components/followUp/FollowUpWindow.vue +23 -23
- package/app/components/forkDecision/ForkDecisionWindow.vue +37 -39
- package/app/components/foundational/FoundationalContractSummary.vue +7 -7
- package/app/components/foundational/FoundationalServiceCatalogList.vue +11 -11
- package/app/components/foundational/FoundationalServiceManager.vue +1 -1
- package/app/components/foundational/FoundationalServiceRegistry.vue +13 -13
- package/app/components/foundational/FoundationalServiceSources.vue +13 -13
- package/app/components/foundational/FoundationalSuppressions.vue +7 -7
- package/app/components/foundational/ServiceCatalogConnection.vue +10 -10
- package/app/components/fragments/FragmentLibraryManager.vue +41 -44
- package/app/components/fragments/FragmentSelector.vue +13 -13
- package/app/components/fragments/GitHubDocUrlImport.vue +1 -1
- package/app/components/gates/GateFailingCheckList.vue +5 -5
- package/app/components/gates/GateResultView.vue +50 -47
- package/app/components/github/AddServiceFromRepoModal.vue +14 -14
- package/app/components/github/BranchProtectionPreflight.vue +13 -13
- package/app/components/github/GitHubConnect.vue +7 -7
- package/app/components/github/GitHubOnboarding.vue +7 -7
- package/app/components/github/GitHubPanel.vue +37 -40
- package/app/components/github/RepoTreeBrowser.vue +18 -18
- package/app/components/humanTest/HumanTestWindow.vue +30 -33
- package/app/components/initiative/InitiativePlanNotice.vue +5 -5
- package/app/components/initiative/InitiativePlanReview.vue +27 -29
- package/app/components/initiative/InitiativePlanningWindow.vue +10 -10
- package/app/components/initiative/InitiativeTrackerWindow.vue +71 -65
- package/app/components/inputGate/InputGateNotice.vue +2 -4
- package/app/components/judge/JudgeResultView.vue +30 -32
- package/app/components/kaizen/KaizenPanel.vue +40 -36
- package/app/components/kaizen/KaizenStepStatus.vue +21 -21
- package/app/components/layout/AccountAuditLog.vue +10 -10
- package/app/components/layout/AccountDeploymentSettings.vue +20 -20
- package/app/components/layout/AccountFailureKindRules.vue +13 -13
- package/app/components/layout/AccountFoundationalSettings.vue +1 -1
- package/app/components/layout/AccountFragmentSettings.vue +1 -1
- package/app/components/layout/AccountModelPolicySettings.vue +9 -9
- package/app/components/layout/AccountPlatformAlertSettings.vue +11 -11
- package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
- package/app/components/layout/AccountRunCredentialSettings.vue +5 -5
- package/app/components/layout/AccountSkillSettings.vue +1 -1
- package/app/components/layout/AccountTeamSettings.vue +23 -15
- package/app/components/layout/AiProvidersBanner.vue +11 -8
- package/app/components/layout/AppearanceSwitcher.vue +108 -0
- package/app/components/layout/BoardSwitcher.vue +8 -11
- package/app/components/layout/BoardToolbar.vue +3 -3
- package/app/components/layout/CommandBar.vue +7 -9
- package/app/components/layout/ConnectionStatusBanner.vue +2 -2
- package/app/components/layout/DefaultTestEnvBanner.vue +5 -5
- package/app/components/layout/GitHubPatBanner.vue +5 -5
- package/app/components/layout/GitHubPatPermissionsBanner.vue +16 -10
- package/app/components/layout/InfraSetupBanner.vue +6 -6
- package/app/components/layout/IntegrationsHub.vue +15 -15
- package/app/components/layout/LanguageSwitcher.vue +5 -5
- package/app/components/layout/ModelProvidersHub.vue +13 -16
- package/app/components/layout/NotificationsInbox.vue +10 -10
- package/app/components/layout/PersonalSetupModal.vue +8 -8
- package/app/components/layout/ProviderConfigBanner.vue +4 -4
- package/app/components/layout/RolePrompt.vue +7 -7
- package/app/components/layout/SideBar.vue +6 -4
- package/app/components/layout/SpendWarningBanner.vue +17 -14
- package/app/components/layout/TranslationWarningBanner.vue +4 -4
- package/app/components/layout/UiModeSwitcher.vue +13 -13
- package/app/components/layout/UiRoleSwitcher.vue +8 -8
- package/app/components/layout/WorkspaceMembersSettings.vue +15 -11
- package/app/components/media/ArtifactLightbox.vue +13 -13
- package/app/components/media/ImageCompare.vue +31 -24
- package/app/components/merge/MergeEffortChips.vue +2 -2
- package/app/components/notifications/NotificationSettingsPanel.vue +14 -12
- package/app/components/observability/OutcomeFilterChips.vue +6 -6
- package/app/components/observability/RunFailureSummary.vue +28 -25
- package/app/components/observability/StepMetricsBar.vue +26 -28
- package/app/components/observability/StepModelActivity.vue +2 -2
- package/app/components/observability/ToolCallList.vue +24 -24
- package/app/components/outcome/OutcomeSummaryWindow.vue +47 -47
- package/app/components/palettes/AgentPalette.vue +8 -8
- package/app/components/palettes/AgentTierSelect.vue +1 -1
- package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
- package/app/components/panels/AgentStepDetail.vue +52 -51
- package/app/components/panels/AttemptEntryHeader.vue +4 -6
- package/app/components/panels/DecisionModal.vue +7 -7
- package/app/components/panels/GenericStructuredResultView.vue +7 -7
- package/app/components/panels/InspectorPanel.vue +17 -17
- package/app/components/panels/MergerResultView.vue +19 -19
- package/app/components/panels/ObservabilityPanel.vue +115 -123
- package/app/components/panels/OperatorDashboardPanel.vue +89 -97
- package/app/components/panels/ReportsPanel.vue +69 -66
- package/app/components/panels/ReportsSpendBreakdown.vue +9 -9
- package/app/components/panels/ResultWindowShell.vue +38 -38
- package/app/components/panels/RunDetailLoadState.vue +2 -2
- package/app/components/panels/StepContainerStatus.vue +9 -9
- package/app/components/panels/StepDelegatedStatus.logic.spec.ts +135 -0
- package/app/components/panels/StepDelegatedStatus.logic.ts +160 -0
- package/app/components/panels/StepDelegatedStatus.vue +181 -0
- package/app/components/panels/StepEffortReport.vue +16 -15
- package/app/components/panels/StepFragmentAdherence.vue +14 -10
- package/app/components/panels/StepMetadataCard.vue +74 -45
- package/app/components/panels/StepReproductionReport.vue +25 -21
- package/app/components/panels/StepRunMeta.vue +20 -20
- package/app/components/panels/StepTestReport.logic.spec.ts +8 -3
- package/app/components/panels/StepTestReport.logic.ts +4 -4
- package/app/components/panels/StepTestReport.vue +28 -28
- package/app/components/panels/StepToolServers.vue +14 -11
- package/app/components/panels/StepValidationReport.vue +7 -7
- package/app/components/panels/inspector/ContainerSummary.vue +9 -9
- package/app/components/panels/inspector/DocReferenceRepos.vue +3 -3
- package/app/components/panels/inspector/EnvProbeReport.vue +24 -27
- package/app/components/panels/inspector/EpicChildren.vue +8 -12
- package/app/components/panels/inspector/FrontendBindingsResolved.vue +11 -11
- package/app/components/panels/inspector/FrontendConfig.vue +37 -41
- package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
- package/app/components/panels/inspector/InspectorSection.vue +6 -6
- package/app/components/panels/inspector/RecurringScheduleSettings.vue +16 -19
- package/app/components/panels/inspector/ServiceConnections.vue +2 -2
- package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
- package/app/components/panels/inspector/ServiceSelfTests.vue +21 -17
- package/app/components/panels/inspector/ServiceTestConfig.vue +51 -59
- package/app/components/panels/inspector/ServiceTestSecrets.vue +5 -5
- package/app/components/panels/inspector/ServiceTestingContext.vue +3 -3
- package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
- package/app/components/panels/inspector/TaskAgentConfig.vue +3 -3
- package/app/components/panels/inspector/TaskAprioriBranches.vue +8 -5
- package/app/components/panels/inspector/TaskDependencies.vue +1 -1
- package/app/components/panels/inspector/TaskEstimateBadge.vue +11 -11
- package/app/components/panels/inspector/TaskExecution.vue +17 -17
- package/app/components/panels/inspector/TaskReviewTarget.vue +2 -2
- package/app/components/panels/inspector/TaskRunSettings.vue +35 -37
- package/app/components/panels/inspector/TaskStructure.vue +3 -3
- package/app/components/pipeline/AgentKindIcon.vue +1 -1
- package/app/components/pipeline/AgentPromptEditor.vue +17 -17
- package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -56
- package/app/components/pipeline/EstimateThresholdFields.vue +4 -4
- package/app/components/pipeline/GateConfigFields.vue +13 -10
- package/app/components/pipeline/IterationCapPrompt.vue +4 -2
- package/app/components/pipeline/PipelineBuilder.vue +47 -55
- package/app/components/pipeline/PipelineHealthModal.vue +27 -29
- package/app/components/pipeline/PipelinePicker.vue +10 -10
- package/app/components/pipeline/PipelinePreview.vue +10 -10
- package/app/components/pipeline/PipelineProgress.vue +64 -67
- package/app/components/prReview/PrReviewPhaseBadge.vue +7 -7
- package/app/components/prReview/PrReviewWindow.vue +75 -77
- package/app/components/providers/AiPresetMismatchDialog.vue +5 -5
- package/app/components/providers/AiProviderOnboardingModal.vue +9 -9
- package/app/components/providers/ApiKeysSection.vue +13 -13
- package/app/components/providers/PersonalCredentialModal.vue +2 -2
- package/app/components/providers/PersonalSubscriptionSection.vue +10 -10
- package/app/components/providers/SignInRequiredNotice.vue +1 -1
- package/app/components/providers/VendorCredentialsModal.vue +10 -10
- package/app/components/provisioning/ProvisioningLogsDrawer.vue +13 -13
- package/app/components/ralph/RalphLoopResultView.vue +28 -30
- package/app/components/recurring/RecurrenceEditor.vue +2 -2
- package/app/components/requirements/RequirementsReviewWindow.vue +51 -58
- package/app/components/riskPolicy/RiskPolicyPicker.vue +12 -15
- package/app/components/riskPolicy/RiskPolicyPreview.vue +14 -14
- package/app/components/sandbox/SandboxPanel.vue +58 -59
- package/app/components/settings/AccountSettingsPanel.vue +1 -1
- package/app/components/settings/ApiTokensPanel.vue +10 -10
- package/app/components/settings/BudgetSettings.vue +18 -22
- package/app/components/settings/CapabilityCredentialsPanel.vue +15 -15
- package/app/components/settings/CloudflareHandlerSection.vue +20 -20
- package/app/components/settings/ComposeEnvironmentSetupSection.vue +13 -13
- package/app/components/settings/ConnectionTestVerdict.vue +3 -3
- package/app/components/settings/ConnectionWarnings.vue +1 -1
- package/app/components/settings/ConsensusGroupsSection.vue +27 -35
- package/app/components/settings/CustomManifestTypeEditor.vue +10 -10
- package/app/components/settings/DefaultProvisionTypeSection.vue +6 -6
- package/app/components/settings/InfraHandlersConfigurator.vue +24 -22
- package/app/components/settings/InfrastructureBackendPicker.vue +6 -6
- package/app/components/settings/InfrastructureWindow.vue +5 -5
- package/app/components/settings/IssueTrackerPanel.vue +29 -23
- package/app/components/settings/KubernetesEngineForm.vue +11 -11
- package/app/components/settings/KubernetesEnvironmentForm.vue +4 -4
- package/app/components/settings/LocalContainerPoolSettings.vue +6 -11
- package/app/components/settings/LocalModelEndpointsPanel.vue +20 -18
- package/app/components/settings/McpAuthorizeScreen.vue +13 -15
- package/app/components/settings/McpOAuthCallbackScreen.vue +16 -10
- package/app/components/settings/MergeClassRulesEditor.vue +6 -9
- package/app/components/settings/MergeRolePolicyEditor.vue +16 -16
- package/app/components/settings/ModelConfigurationPanel.vue +23 -30
- package/app/components/settings/ModelPresetHealthModal.vue +15 -13
- package/app/components/settings/ObservabilityConnectionPanel.vue +4 -4
- package/app/components/settings/OpenRouterCatalogPanel.vue +23 -19
- package/app/components/settings/PackageRegistriesPanel.vue +8 -8
- package/app/components/settings/ProviderConnectionTab.vue +8 -11
- package/app/components/settings/ProviderManifestEditor.vue +9 -9
- package/app/components/settings/ProviderPreferenceEditor.vue +8 -8
- package/app/components/settings/RiskPolicyCreateForm.vue +10 -10
- package/app/components/settings/RiskPolicyEditorRow.vue +14 -14
- package/app/components/settings/RiskPolicyHealthModal.vue +15 -13
- package/app/components/settings/RiskPolicyInheritedRow.vue +1 -1
- package/app/components/settings/RiskPolicyPanel.vue +10 -15
- package/app/components/settings/ServiceFragmentDefaultsPanel.vue +7 -7
- package/app/components/settings/SharedStacksPanel.vue +9 -12
- package/app/components/settings/TaskSourceCard.vue +4 -4
- package/app/components/settings/TaskTypeSuppressionsPanel.vue +6 -6
- package/app/components/settings/ToolServerChecklist.vue +36 -29
- package/app/components/settings/UsageSettings.vue +15 -15
- package/app/components/settings/UserSecretsSection.vue +9 -12
- package/app/components/settings/WorkspaceMetadataSettings.vue +5 -5
- package/app/components/settings/WorkspaceSettingsPanel.vue +47 -47
- package/app/components/skills/ReviewSkillQueue.vue +10 -10
- package/app/components/skills/SkillLibraryManager.vue +23 -20
- package/app/components/slack/SlackPanel.vue +13 -17
- package/app/components/spec/ServiceSpecWindow.vue +45 -42
- package/app/components/tasks/BugHuntModal.vue +24 -27
- package/app/components/tasks/ContextIssuePicker.vue +11 -11
- package/app/components/tasks/TaskContextIssues.vue +3 -3
- package/app/components/tasks/TaskImportModal.vue +7 -7
- package/app/components/tasks/TaskSourceConnectModal.vue +10 -8
- package/app/components/testing/TestReportWindow.vue +99 -82
- package/app/components/theme/ThemeImportModal.vue +115 -0
- package/app/components/tutorial/TutorialCatalogue.vue +9 -9
- package/app/components/tutorial/TutorialNudge.vue +5 -5
- package/app/components/tutorial/TutorialOverlay.vue +12 -12
- package/app/components/tutorial/TutorialPrompt.vue +6 -9
- package/app/components/vcs/GitLabConnect.vue +4 -4
- package/app/components/vcs/VcsConnectSurfaces.vue +2 -2
- package/app/components/visualConfirm/VisualConfirmationWindow.vue +36 -36
- package/app/composables/api/client.ts +6 -1
- package/app/composables/usePipelineErrorToast.ts +17 -0
- package/app/modular/agent-kinds.ts +24 -0
- package/app/pages/index.vue +5 -5
- package/app/plugins/theme.client.ts +125 -0
- package/app/spa-loading-template.html +52 -14
- package/app/stores/agents.ts +1 -1
- package/app/stores/theme.spec.ts +56 -0
- package/app/stores/theme.ts +87 -0
- package/app/types/domain.ts +19 -0
- package/app/types/execution.ts +4 -0
- package/app/utils/agentOutput.ts +1 -1
- package/app/utils/binaryOutput.ts +6 -6
- package/app/utils/bootstrapSteps.ts +14 -14
- package/app/utils/catalog.ts +87 -83
- package/app/utils/colorTint.ts +10 -0
- package/app/utils/failureKinds.ts +1 -0
- package/app/utils/observability.ts +3 -3
- package/app/utils/pipelineRender.ts +13 -17
- package/app/utils/swimlanes.ts +4 -4
- package/app/utils/theme/bootPalette.spec.ts +54 -0
- package/app/utils/theme/bootPalette.ts +108 -0
- package/app/utils/theme/builtins.spec.ts +38 -0
- package/app/utils/theme/builtins.ts +55 -0
- package/app/utils/theme/css.ts +162 -0
- package/app/utils/theme/doc.ts +353 -0
- package/app/utils/theme/link.ts +93 -0
- package/app/utils/theme/presets.ts +509 -0
- package/app/utils/theme/theme.spec.ts +224 -0
- package/i18n/locales/de.json +61 -4
- package/i18n/locales/en.json +70 -4
- package/i18n/locales/es.json +61 -4
- package/i18n/locales/fr.json +61 -4
- package/i18n/locales/he.json +61 -4
- package/i18n/locales/it.json +61 -4
- package/i18n/locales/ja.json +61 -4
- package/i18n/locales/pl.json +61 -4
- package/i18n/locales/tr.json +61 -4
- package/i18n/locales/uk.json +61 -4
- package/nuxt.config.ts +37 -11
- package/package.json +10 -9
|
@@ -298,7 +298,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
298
298
|
<ResultWindowShell
|
|
299
299
|
:open="open"
|
|
300
300
|
icon="i-lucide-bug"
|
|
301
|
-
icon-class="bg-
|
|
301
|
+
icon-class="bg-primary/15 text-primary"
|
|
302
302
|
:title="t('clarity.title')"
|
|
303
303
|
:subtitle="block?.title"
|
|
304
304
|
variant="centered"
|
|
@@ -314,14 +314,14 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
314
314
|
<div class="flex min-h-0 flex-1 flex-col lg:flex-row">
|
|
315
315
|
<!-- main column -->
|
|
316
316
|
<div class="min-w-0 flex-1 overflow-y-auto px-6 py-5">
|
|
317
|
-
<p class="mb-4 text-sm text-
|
|
317
|
+
<p class="mb-4 text-sm text-muted">
|
|
318
318
|
<i18n-t keypath="clarity.intro" tag="span" scope="global">
|
|
319
319
|
<template #level>{{ block?.level ?? t('clarity.itemFallback') }}</template>
|
|
320
320
|
<template #answer
|
|
321
|
-
><span class="text-
|
|
321
|
+
><span class="text-toned">{{ t('clarity.introAnswer') }}</span></template
|
|
322
322
|
>
|
|
323
323
|
<template #dismiss
|
|
324
|
-
><span class="text-
|
|
324
|
+
><span class="text-toned">{{ t('clarity.introDismiss') }}</span></template
|
|
325
325
|
>
|
|
326
326
|
</i18n-t>
|
|
327
327
|
</p>
|
|
@@ -330,7 +330,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
330
330
|
gate step, so there's nothing to do here until then -->
|
|
331
331
|
<div
|
|
332
332
|
v-if="!review && !busy && !loading"
|
|
333
|
-
class="rounded-lg border border-dashed border-
|
|
333
|
+
class="rounded-lg border border-dashed border-muted p-8 text-center text-sm text-dimmed"
|
|
334
334
|
>
|
|
335
335
|
{{ t('clarity.empty') }}
|
|
336
336
|
</div>
|
|
@@ -338,7 +338,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
338
338
|
<!-- working state (initial fetch on open, or a reviewer pass running) -->
|
|
339
339
|
<div
|
|
340
340
|
v-else-if="(busy || loading) && !review"
|
|
341
|
-
class="flex items-center justify-center gap-2 p-8 text-sm text-
|
|
341
|
+
class="flex items-center justify-center gap-2 p-8 text-sm text-muted"
|
|
342
342
|
>
|
|
343
343
|
<UIcon name="i-lucide-loader-circle" class="h-4 w-4 animate-spin" />
|
|
344
344
|
{{ loading && !busy ? t('clarity.loadingReview') : t('clarity.triaging') }}
|
|
@@ -348,7 +348,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
348
348
|
<!-- converged: reviewer satisfied -->
|
|
349
349
|
<div
|
|
350
350
|
v-if="incorporated"
|
|
351
|
-
class="mb-4 flex items-center gap-2 rounded-lg border border-
|
|
351
|
+
class="mb-4 flex items-center gap-2 rounded-lg border border-app-success-900/60 bg-app-success-950/30 p-4 text-sm text-app-success-300"
|
|
352
352
|
>
|
|
353
353
|
<UIcon name="i-lucide-circle-check" class="h-5 w-5 shrink-0" />
|
|
354
354
|
{{ t('clarity.converged') }}
|
|
@@ -368,7 +368,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
368
368
|
the human can see which of the two LLM calls is currently in progress. -->
|
|
369
369
|
<div
|
|
370
370
|
v-else-if="working"
|
|
371
|
-
class="mb-4 flex items-center gap-2 rounded-lg border border-
|
|
371
|
+
class="mb-4 flex items-center gap-2 rounded-lg border border-primary/60 bg-primary/10 p-4 text-sm text-primary"
|
|
372
372
|
>
|
|
373
373
|
<UIcon name="i-lucide-loader-circle" class="h-5 w-5 shrink-0 animate-spin" />
|
|
374
374
|
<span v-if="incorporating">
|
|
@@ -384,17 +384,17 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
384
384
|
<div
|
|
385
385
|
v-for="item in sortedItems"
|
|
386
386
|
:key="item.id"
|
|
387
|
-
class="rounded-lg border border-
|
|
387
|
+
class="rounded-lg border border-default bg-default/60 p-3"
|
|
388
388
|
:class="{ 'opacity-60': item.status === 'dismissed' }"
|
|
389
389
|
>
|
|
390
390
|
<div class="flex items-start gap-2">
|
|
391
391
|
<UIcon
|
|
392
392
|
:name="CATEGORY_ICON[item.category]"
|
|
393
|
-
class="mt-0.5 h-4 w-4 shrink-0 text-
|
|
393
|
+
class="mt-0.5 h-4 w-4 shrink-0 text-muted"
|
|
394
394
|
/>
|
|
395
395
|
<div class="min-w-0 flex-1">
|
|
396
396
|
<div class="flex flex-wrap items-center gap-1.5">
|
|
397
|
-
<span class="text-sm font-medium text-
|
|
397
|
+
<span class="text-sm font-medium text-highlighted">{{ item.title }}</span>
|
|
398
398
|
<UBadge size="xs" variant="subtle" :color="SEVERITY_COLOR[item.severity]">
|
|
399
399
|
{{ t(SEVERITY_LABELS[item.severity]) }}
|
|
400
400
|
</UBadge>
|
|
@@ -414,7 +414,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
414
414
|
card around it takes the span (see the shell's `width` prop: the unit is the
|
|
415
415
|
paragraph, not the section). The badge row above and the answer control
|
|
416
416
|
below are what the full width is actually for. -->
|
|
417
|
-
<p class="mt-1 max-w-3xl whitespace-pre-line text-sm text-
|
|
417
|
+
<p class="mt-1 max-w-3xl whitespace-pre-line text-sm text-muted">
|
|
418
418
|
{{ item.detail }}
|
|
419
419
|
</p>
|
|
420
420
|
|
|
@@ -422,9 +422,9 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
422
422
|
the answer lives in the textarea below, seeded from the reply) -->
|
|
423
423
|
<div
|
|
424
424
|
v-if="item.reply && item.status !== 'open' && item.status !== 'answered'"
|
|
425
|
-
class="mt-2 max-w-3xl rounded-md border-s-2 border-
|
|
425
|
+
class="mt-2 max-w-3xl rounded-md border-s-2 border-muted bg-app-950/40 px-3 py-1.5 text-sm text-toned"
|
|
426
426
|
>
|
|
427
|
-
<span class="text-[10px] uppercase tracking-wide text-
|
|
427
|
+
<span class="text-[10px] uppercase tracking-wide text-dimmed">
|
|
428
428
|
{{ t('clarity.answerLabel') }}
|
|
429
429
|
</span>
|
|
430
430
|
<p class="whitespace-pre-line">{{ item.reply }}</p>
|
|
@@ -479,8 +479,8 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
479
479
|
</div>
|
|
480
480
|
|
|
481
481
|
<!-- clarified document: the standard-format bug report -->
|
|
482
|
-
<section v-if="outline" class="mt-6 border-t border-
|
|
483
|
-
<div class="mb-3 flex items-center gap-1.5 text-[11px] text-
|
|
482
|
+
<section v-if="outline" class="mt-6 border-t border-default pt-5">
|
|
483
|
+
<div class="mb-3 flex items-center gap-1.5 text-[11px] text-app-success-400">
|
|
484
484
|
<UIcon name="i-lucide-file-check-2" class="h-3.5 w-3.5" />
|
|
485
485
|
<span class="font-semibold uppercase tracking-wide">
|
|
486
486
|
{{ incorporated ? t('clarity.docHeading') : t('clarity.docHeadingDraft') }}
|
|
@@ -497,18 +497,18 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
497
497
|
>
|
|
498
498
|
<UIcon
|
|
499
499
|
name="i-lucide-chevron-right"
|
|
500
|
-
class="h-3.5 w-3.5 shrink-0 text-
|
|
500
|
+
class="h-3.5 w-3.5 shrink-0 text-dimmed transition-transform"
|
|
501
501
|
:class="collapsed[s.id] ? '' : 'rotate-90'"
|
|
502
502
|
/>
|
|
503
503
|
<span
|
|
504
|
-
class="font-semibold text-
|
|
504
|
+
class="font-semibold text-highlighted"
|
|
505
505
|
:class="s.depth <= 1 ? 'text-base' : s.depth === 2 ? 'text-sm' : 'text-xs'"
|
|
506
506
|
v-html="s.titleHtml"
|
|
507
507
|
/>
|
|
508
508
|
</button>
|
|
509
509
|
<div
|
|
510
510
|
v-show="!s.title || !collapsed[s.id]"
|
|
511
|
-
class="reader-prose mt-1 ps-5.5 text-[13px] leading-relaxed text-
|
|
511
|
+
class="reader-prose mt-1 ps-5.5 text-[13px] leading-relaxed text-toned"
|
|
512
512
|
v-html="s.bodyHtml"
|
|
513
513
|
/>
|
|
514
514
|
</div>
|
|
@@ -521,32 +521,32 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
521
521
|
tablet, UX-32). The informational stats collapse away below `lg` to keep the
|
|
522
522
|
bottom bar compact; the actions themselves always show. -->
|
|
523
523
|
<aside
|
|
524
|
-
class="flex w-full shrink-0 flex-col border-t border-
|
|
524
|
+
class="flex w-full shrink-0 flex-col border-t border-default lg:w-72 lg:border-s lg:border-t-0"
|
|
525
525
|
>
|
|
526
526
|
<div class="flex flex-col gap-4 px-4 py-5">
|
|
527
|
-
<div v-if="review" class="hidden space-y-2 text-xs text-
|
|
527
|
+
<div v-if="review" class="hidden space-y-2 text-xs text-muted lg:block">
|
|
528
528
|
<div class="flex items-center justify-between">
|
|
529
529
|
<span>{{ t('clarity.rail.findings') }}</span>
|
|
530
|
-
<span class="text-
|
|
530
|
+
<span class="text-toned">{{ review.items.length }}</span>
|
|
531
531
|
</div>
|
|
532
532
|
<div class="flex items-center justify-between">
|
|
533
533
|
<span>{{ t('clarity.rail.open') }}</span>
|
|
534
|
-
<span class="text-
|
|
534
|
+
<span class="text-toned">{{ openCount }}</span>
|
|
535
535
|
</div>
|
|
536
536
|
<div class="flex items-center justify-between">
|
|
537
537
|
<span>{{ t('clarity.rail.answered') }}</span>
|
|
538
|
-
<span class="text-
|
|
538
|
+
<span class="text-toned">{{ answeredCount }}</span>
|
|
539
539
|
</div>
|
|
540
540
|
<div v-if="review.model" class="flex items-center justify-between">
|
|
541
541
|
<span>{{ t('clarity.rail.model') }}</span>
|
|
542
|
-
<span class="truncate ps-2 text-
|
|
542
|
+
<span class="truncate ps-2 text-dimmed">{{
|
|
543
543
|
models.labelForRef(review.model) ?? review.model
|
|
544
544
|
}}</span>
|
|
545
545
|
</div>
|
|
546
546
|
</div>
|
|
547
547
|
|
|
548
548
|
<!-- action: ready (answer → incorporate / proceed) -->
|
|
549
|
-
<div v-if="review && status === 'ready'" class="space-y-2 border-t border-
|
|
549
|
+
<div v-if="review && status === 'ready'" class="space-y-2 border-t border-default pt-4">
|
|
550
550
|
<UButton
|
|
551
551
|
v-if="canProceed"
|
|
552
552
|
color="primary"
|
|
@@ -574,7 +574,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
574
574
|
>
|
|
575
575
|
{{ t('clarity.incorporateAnswers') }}
|
|
576
576
|
</UButton>
|
|
577
|
-
<p class="text-[11px] leading-relaxed text-
|
|
577
|
+
<p class="text-[11px] leading-relaxed text-dimmed">
|
|
578
578
|
<template v-if="canProceed">
|
|
579
579
|
{{ t('clarity.hint.proceed') }}
|
|
580
580
|
</template>
|
|
@@ -586,7 +586,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
586
586
|
</div>
|
|
587
587
|
|
|
588
588
|
<!-- action: merged (inspect → re-review / redo) -->
|
|
589
|
-
<div v-if="review && merged" class="space-y-2 border-t border-
|
|
589
|
+
<div v-if="review && merged" class="space-y-2 border-t border-default pt-4">
|
|
590
590
|
<UButton
|
|
591
591
|
color="primary"
|
|
592
592
|
size="sm"
|
|
@@ -636,14 +636,14 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
636
636
|
{{ t('clarity.redoWithDirection') }}
|
|
637
637
|
</UButton>
|
|
638
638
|
</div>
|
|
639
|
-
<p class="text-[11px] leading-relaxed text-
|
|
639
|
+
<p class="text-[11px] leading-relaxed text-dimmed">
|
|
640
640
|
{{ t('clarity.redoHint') }}
|
|
641
641
|
</p>
|
|
642
642
|
</div>
|
|
643
643
|
|
|
644
644
|
<div
|
|
645
645
|
v-if="review && incorporated"
|
|
646
|
-
class="border-t border-
|
|
646
|
+
class="border-t border-default pt-4 text-[11px] leading-relaxed text-dimmed"
|
|
647
647
|
>
|
|
648
648
|
{{ t('clarity.incorporatedFooter') }}
|
|
649
649
|
</div>
|
|
@@ -11,15 +11,15 @@ function reload() {
|
|
|
11
11
|
<template>
|
|
12
12
|
<div
|
|
13
13
|
data-testid="async-view-error"
|
|
14
|
-
class="fixed inset-0 z-50 grid place-items-center bg-
|
|
14
|
+
class="fixed inset-0 z-50 grid place-items-center bg-app-950/80 p-6 backdrop-blur-sm"
|
|
15
15
|
role="alert"
|
|
16
16
|
>
|
|
17
|
-
<div class="max-w-sm rounded-2xl border border-
|
|
18
|
-
<div class="flex items-center gap-2 text-sm font-semibold text-
|
|
19
|
-
<UIcon name="i-lucide-unplug" class="h-4 w-4 shrink-0 text-
|
|
17
|
+
<div class="max-w-sm rounded-2xl border border-muted bg-default p-5 shadow-2xl">
|
|
18
|
+
<div class="flex items-center gap-2 text-sm font-semibold text-app-100">
|
|
19
|
+
<UIcon name="i-lucide-unplug" class="h-4 w-4 shrink-0 text-app-warning-400" />
|
|
20
20
|
{{ t('errors.asyncView.title') }}
|
|
21
21
|
</div>
|
|
22
|
-
<p class="mt-2 text-[12px] leading-relaxed text-
|
|
22
|
+
<p class="mt-2 text-[12px] leading-relaxed text-muted">
|
|
23
23
|
{{ t('errors.asyncView.body') }}
|
|
24
24
|
</p>
|
|
25
25
|
<UButton class="mt-4" color="primary" variant="soft" size="xs" @click="reload">
|
|
@@ -49,21 +49,18 @@ const draft = computed({
|
|
|
49
49
|
</script>
|
|
50
50
|
|
|
51
51
|
<template>
|
|
52
|
-
<div
|
|
53
|
-
class="rounded-lg border border-slate-800 bg-slate-950/40 p-3"
|
|
54
|
-
data-testid="clarification-item"
|
|
55
|
-
>
|
|
52
|
+
<div class="rounded-lg border border-default bg-app-950/40 p-3" data-testid="clarification-item">
|
|
56
53
|
<div class="flex items-start justify-between gap-2">
|
|
57
|
-
<p class="text-[13px] font-medium text-
|
|
54
|
+
<p class="text-[13px] font-medium text-default">{{ prompt }}</p>
|
|
58
55
|
<slot name="badges" />
|
|
59
56
|
</div>
|
|
60
|
-
<p v-if="detail" class="mt-1 whitespace-pre-wrap text-[12px] leading-relaxed text-
|
|
57
|
+
<p v-if="detail" class="mt-1 whitespace-pre-wrap text-[12px] leading-relaxed text-muted">
|
|
61
58
|
{{ detail }}
|
|
62
59
|
</p>
|
|
63
60
|
|
|
64
61
|
<!-- dismissed: a "not relevant" chip + reopen -->
|
|
65
62
|
<div v-if="dismissed" class="mt-2 flex items-center justify-between gap-2">
|
|
66
|
-
<span class="inline-flex items-center gap-1 text-[11px] text-
|
|
63
|
+
<span class="inline-flex items-center gap-1 text-[11px] text-dimmed">
|
|
67
64
|
<UIcon name="i-lucide-x" class="h-3.5 w-3.5" />{{ t('clarification.dismissed') }}
|
|
68
65
|
</span>
|
|
69
66
|
<UButton
|
|
@@ -82,7 +79,7 @@ const draft = computed({
|
|
|
82
79
|
<!-- a recommendation is being requested/generated: a working chip, no answer box -->
|
|
83
80
|
<div
|
|
84
81
|
v-else-if="requested"
|
|
85
|
-
class="mt-2 inline-flex items-center gap-1 text-[11px] text-
|
|
82
|
+
class="mt-2 inline-flex items-center gap-1 text-[11px] text-primary"
|
|
86
83
|
data-testid="clarification-requested"
|
|
87
84
|
>
|
|
88
85
|
<UIcon name="i-lucide-loader-circle" class="h-3.5 w-3.5 animate-spin" />
|
|
@@ -131,15 +128,13 @@ const draft = computed({
|
|
|
131
128
|
<!-- inline AI suggestion + "use this answer" -->
|
|
132
129
|
<div
|
|
133
130
|
v-if="recommendation"
|
|
134
|
-
class="mt-2 rounded-md border border-
|
|
131
|
+
class="mt-2 rounded-md border border-primary/50 bg-primary/10 p-2"
|
|
135
132
|
data-testid="clarification-recommendation"
|
|
136
133
|
>
|
|
137
|
-
<div
|
|
138
|
-
class="mb-1 flex items-center gap-1 text-[10px] uppercase tracking-wide text-indigo-300"
|
|
139
|
-
>
|
|
134
|
+
<div class="mb-1 flex items-center gap-1 text-[10px] uppercase tracking-wide text-primary">
|
|
140
135
|
<UIcon name="i-lucide-wand-2" class="h-3 w-3" />{{ t('clarification.suggestion') }}
|
|
141
136
|
</div>
|
|
142
|
-
<p class="whitespace-pre-wrap text-[12px] text-
|
|
137
|
+
<p class="whitespace-pre-wrap text-[12px] text-default">{{ recommendation }}</p>
|
|
143
138
|
<UButton
|
|
144
139
|
class="mt-1.5"
|
|
145
140
|
size="xs"
|
|
@@ -60,11 +60,13 @@ const isDestructive = computed(() => current.value?.variant === 'destructive')
|
|
|
60
60
|
<div
|
|
61
61
|
v-if="current?.icon"
|
|
62
62
|
class="flex h-9 w-9 shrink-0 items-center justify-center rounded-lg"
|
|
63
|
-
:class="
|
|
63
|
+
:class="
|
|
64
|
+
isDestructive ? 'bg-app-error-500/10 text-app-error-400' : 'bg-accented/40 text-toned'
|
|
65
|
+
"
|
|
64
66
|
>
|
|
65
67
|
<UIcon :name="current.icon" class="h-5 w-5" />
|
|
66
68
|
</div>
|
|
67
|
-
<p v-if="current?.description" class="text-sm text-
|
|
69
|
+
<p v-if="current?.description" class="text-sm text-toned">
|
|
68
70
|
{{ current.description }}
|
|
69
71
|
</p>
|
|
70
72
|
</div>
|
|
@@ -112,7 +112,7 @@ function selectItems(field: DescriptorField) {
|
|
|
112
112
|
testid that would have to be slugified to be selectable. -->
|
|
113
113
|
<p
|
|
114
114
|
v-if="caption"
|
|
115
|
-
class="-mb-1 text-[11px] font-semibold uppercase tracking-wide text-
|
|
115
|
+
class="-mb-1 text-[11px] font-semibold uppercase tracking-wide text-muted"
|
|
116
116
|
:class="{ 'pt-2': startsGroup }"
|
|
117
117
|
:data-testid="`${testidPrefix}-section`"
|
|
118
118
|
>
|
|
@@ -17,12 +17,12 @@ withDefaults(
|
|
|
17
17
|
|
|
18
18
|
<template>
|
|
19
19
|
<div
|
|
20
|
-
class="flex flex-col items-center justify-center text-center text-
|
|
20
|
+
class="flex flex-col items-center justify-center text-center text-dimmed"
|
|
21
21
|
:class="compact ? 'gap-1 py-4' : 'gap-2 py-10'"
|
|
22
22
|
data-testid="empty-state"
|
|
23
23
|
>
|
|
24
|
-
<UIcon :name="icon" :class="compact ? 'h-5 w-5' : 'h-8 w-8'" class="text-
|
|
25
|
-
<p :class="compact ? 'text-xs' : 'text-sm'" class="font-medium text-
|
|
24
|
+
<UIcon :name="icon" :class="compact ? 'h-5 w-5' : 'h-8 w-8'" class="text-app-600" />
|
|
25
|
+
<p :class="compact ? 'text-xs' : 'text-sm'" class="font-medium text-muted">
|
|
26
26
|
{{ title }}
|
|
27
27
|
</p>
|
|
28
28
|
<p v-if="description" :class="compact ? 'text-[11px]' : 'text-xs'" class="max-w-xs">
|
|
@@ -21,19 +21,19 @@ defineProps<{
|
|
|
21
21
|
<template>
|
|
22
22
|
<div
|
|
23
23
|
v-if="variant === 'working'"
|
|
24
|
-
class="flex flex-col items-center gap-2 rounded-lg border border-
|
|
24
|
+
class="flex flex-col items-center gap-2 rounded-lg border border-default bg-app-950/40 p-6 text-center"
|
|
25
25
|
:data-testid="testid"
|
|
26
26
|
>
|
|
27
|
-
<UIcon name="i-lucide-loader-circle" class="h-5 w-5 animate-spin text-
|
|
28
|
-
<p class="text-[13px] text-
|
|
29
|
-
<p class="text-[12px] text-
|
|
27
|
+
<UIcon name="i-lucide-loader-circle" class="h-5 w-5 animate-spin text-primary" />
|
|
28
|
+
<p class="text-[13px] text-default">{{ title }}</p>
|
|
29
|
+
<p class="text-[12px] text-muted">{{ hint }}</p>
|
|
30
30
|
</div>
|
|
31
31
|
<div
|
|
32
32
|
v-else
|
|
33
|
-
class="rounded-lg border border-
|
|
33
|
+
class="rounded-lg border border-app-error-900/60 bg-app-error-950/20 p-4 text-center"
|
|
34
34
|
:data-testid="testid"
|
|
35
35
|
>
|
|
36
|
-
<p class="text-[13px] text-
|
|
37
|
-
<p class="mt-1 text-[12px] text-
|
|
36
|
+
<p class="text-[13px] text-app-error-200">{{ title }}</p>
|
|
37
|
+
<p class="mt-1 text-[12px] text-muted">{{ hint }}</p>
|
|
38
38
|
</div>
|
|
39
39
|
</template>
|
|
@@ -37,7 +37,7 @@ const shortcuts = computed(() => [
|
|
|
37
37
|
:key="i"
|
|
38
38
|
class="flex items-center justify-between gap-4 rounded-md px-1 py-1.5"
|
|
39
39
|
>
|
|
40
|
-
<dt class="text-sm text-
|
|
40
|
+
<dt class="text-sm text-toned">{{ s.label }}</dt>
|
|
41
41
|
<dd class="flex shrink-0 items-center gap-1">
|
|
42
42
|
<UKbd v-for="k in s.keys" :key="k" :value="k" />
|
|
43
43
|
</dd>
|
|
@@ -22,7 +22,8 @@ const html = computed(() => renderMarkdown(props.text))
|
|
|
22
22
|
|
|
23
23
|
<style scoped>
|
|
24
24
|
/* Prose styling for the sanitized markdown injected via v-html (out of scoped reach
|
|
25
|
-
without :deep), mirroring the
|
|
25
|
+
without :deep), mirroring the reader's `prose.css` token for token so both flip with the
|
|
26
|
+
theme and the mode. */
|
|
26
27
|
.cf-prose :deep(p) {
|
|
27
28
|
margin: 0.5rem 0;
|
|
28
29
|
}
|
|
@@ -48,36 +49,36 @@ const html = computed(() => renderMarkdown(props.text))
|
|
|
48
49
|
}
|
|
49
50
|
.cf-prose :deep(strong) {
|
|
50
51
|
font-weight: 600;
|
|
51
|
-
color:
|
|
52
|
+
color: var(--ui-text-highlighted);
|
|
52
53
|
}
|
|
53
54
|
.cf-prose :deep(em) {
|
|
54
55
|
font-style: italic;
|
|
55
56
|
}
|
|
56
57
|
.cf-prose :deep(code) {
|
|
57
58
|
border-radius: 0.25rem;
|
|
58
|
-
background:
|
|
59
|
+
background: var(--ui-bg-elevated);
|
|
59
60
|
padding: 0.1rem 0.3rem;
|
|
60
|
-
font-family:
|
|
61
|
+
font-family: var(--font-mono);
|
|
61
62
|
font-size: 0.85em;
|
|
62
|
-
color:
|
|
63
|
+
color: var(--ui-primary);
|
|
63
64
|
}
|
|
64
65
|
.cf-prose :deep(pre) {
|
|
65
66
|
margin: 0.6rem 0;
|
|
66
67
|
overflow: auto;
|
|
67
68
|
border-radius: 0.5rem;
|
|
68
|
-
background:
|
|
69
|
+
background: var(--app-bg-canvas);
|
|
69
70
|
padding: 0.75rem 0.9rem;
|
|
70
71
|
}
|
|
71
72
|
.cf-prose :deep(pre code) {
|
|
72
73
|
background: transparent;
|
|
73
74
|
padding: 0;
|
|
74
|
-
color:
|
|
75
|
+
color: var(--ui-text-toned);
|
|
75
76
|
}
|
|
76
77
|
.cf-prose :deep(blockquote) {
|
|
77
78
|
margin: 0.6rem 0;
|
|
78
|
-
border-left: 3px solid
|
|
79
|
+
border-left: 3px solid color-mix(in srgb, var(--ui-primary) 50%, transparent);
|
|
79
80
|
padding-left: 0.75rem;
|
|
80
|
-
color:
|
|
81
|
+
color: var(--ui-text-muted);
|
|
81
82
|
}
|
|
82
83
|
.cf-prose :deep(h1),
|
|
83
84
|
.cf-prose :deep(h2),
|
|
@@ -85,7 +86,7 @@ const html = computed(() => renderMarkdown(props.text))
|
|
|
85
86
|
.cf-prose :deep(h4) {
|
|
86
87
|
margin: 0.7rem 0 0.4rem;
|
|
87
88
|
font-weight: 600;
|
|
88
|
-
color:
|
|
89
|
+
color: var(--ui-text-highlighted);
|
|
89
90
|
}
|
|
90
91
|
.cf-prose :deep(table) {
|
|
91
92
|
margin: 0.6rem 0;
|
|
@@ -94,16 +95,16 @@ const html = computed(() => renderMarkdown(props.text))
|
|
|
94
95
|
}
|
|
95
96
|
.cf-prose :deep(th),
|
|
96
97
|
.cf-prose :deep(td) {
|
|
97
|
-
border: 1px solid
|
|
98
|
+
border: 1px solid var(--ui-border-muted);
|
|
98
99
|
padding: 0.3rem 0.6rem;
|
|
99
100
|
}
|
|
100
101
|
.cf-prose :deep(th) {
|
|
101
|
-
background:
|
|
102
|
+
background: var(--ui-bg-elevated);
|
|
102
103
|
font-weight: 600;
|
|
103
104
|
}
|
|
104
105
|
.cf-prose :deep(hr) {
|
|
105
106
|
margin: 1rem 0;
|
|
106
107
|
border: none;
|
|
107
|
-
border-top: 1px solid
|
|
108
|
+
border-top: 1px solid var(--ui-border-muted);
|
|
108
109
|
}
|
|
109
110
|
</style>
|
|
@@ -68,10 +68,10 @@ const STATUS_LABEL_KEYS: Record<string, string> = {
|
|
|
68
68
|
failed: 'consensus.status.failed',
|
|
69
69
|
}
|
|
70
70
|
const STATUS_CLASS: Record<string, string> = {
|
|
71
|
-
running: 'bg-
|
|
72
|
-
synthesizing: 'bg-
|
|
73
|
-
done: 'bg-
|
|
74
|
-
failed: 'bg-
|
|
71
|
+
running: 'bg-app-info-500/15 text-app-info-300',
|
|
72
|
+
synthesizing: 'bg-primary/15 text-primary',
|
|
73
|
+
done: 'bg-app-success-500/15 text-app-success-300',
|
|
74
|
+
failed: 'bg-app-error-500/15 text-app-error-300',
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
function strategyLabel(strategy: string): string {
|
|
@@ -116,7 +116,7 @@ function topScore(c: ConsensusContribution): { label: string; value: number } |
|
|
|
116
116
|
<ResultWindowShell
|
|
117
117
|
:open="open"
|
|
118
118
|
icon="i-lucide-users-round"
|
|
119
|
-
icon-class="bg-
|
|
119
|
+
icon-class="bg-app-warning-500/15 text-app-warning-300"
|
|
120
120
|
:title="headerTitle"
|
|
121
121
|
:subtitle="headerSubtitle"
|
|
122
122
|
variant="centered"
|
|
@@ -130,31 +130,31 @@ function topScore(c: ConsensusContribution): { label: string; value: number } |
|
|
|
130
130
|
this task" has the transcript but not the reason. -->
|
|
131
131
|
<span
|
|
132
132
|
v-if="session.groupName"
|
|
133
|
-
class="rounded-full bg-
|
|
133
|
+
class="rounded-full bg-app-success-900/50 px-2.5 py-1 text-xs font-medium text-app-success-200"
|
|
134
134
|
:title="t('consensus.groupTitle')"
|
|
135
135
|
>
|
|
136
136
|
{{ session.groupName }}
|
|
137
137
|
</span>
|
|
138
138
|
<span
|
|
139
139
|
class="rounded-full px-2.5 py-1 text-xs font-medium"
|
|
140
|
-
:class="STATUS_CLASS[session.status] ?? 'bg-
|
|
140
|
+
:class="STATUS_CLASS[session.status] ?? 'bg-accented text-toned'"
|
|
141
141
|
>
|
|
142
142
|
{{ statusLabel(session.status) }}
|
|
143
143
|
</span>
|
|
144
144
|
</template>
|
|
145
145
|
|
|
146
146
|
<div class="flex-1 overflow-y-auto px-6 py-5">
|
|
147
|
-
<div v-if="loading && !session" class="py-16 text-center text-sm text-
|
|
147
|
+
<div v-if="loading && !session" class="py-16 text-center text-sm text-dimmed">
|
|
148
148
|
{{ t('consensus.loading') }}
|
|
149
149
|
</div>
|
|
150
|
-
<div v-else-if="!session" class="py-16 text-center text-sm text-
|
|
150
|
+
<div v-else-if="!session" class="py-16 text-center text-sm text-dimmed">
|
|
151
151
|
{{ t('consensus.empty') }}
|
|
152
152
|
</div>
|
|
153
153
|
<template v-else>
|
|
154
154
|
<!-- failure -->
|
|
155
155
|
<div
|
|
156
156
|
v-if="session.status === 'failed'"
|
|
157
|
-
class="mb-5 flex items-start gap-2 rounded-lg border border-
|
|
157
|
+
class="mb-5 flex items-start gap-2 rounded-lg border border-app-error-800/60 bg-app-error-950/40 px-4 py-3 text-sm text-app-error-200"
|
|
158
158
|
>
|
|
159
159
|
<span class="min-w-0 flex-1">{{
|
|
160
160
|
t('consensus.failed', { error: session.error ?? t('consensus.unknownError') })
|
|
@@ -165,25 +165,25 @@ function topScore(c: ConsensusContribution): { label: string; value: number } |
|
|
|
165
165
|
<!-- synthesized result -->
|
|
166
166
|
<section v-if="session.synthesis" class="mb-6">
|
|
167
167
|
<div class="mb-2 flex items-center gap-2">
|
|
168
|
-
<h3 class="text-xs font-semibold uppercase tracking-wide text-
|
|
168
|
+
<h3 class="text-xs font-semibold uppercase tracking-wide text-muted">
|
|
169
169
|
{{ t('consensus.synthesizedResult') }}
|
|
170
170
|
</h3>
|
|
171
171
|
<span
|
|
172
172
|
v-if="session.confidence != null"
|
|
173
|
-
class="rounded bg-
|
|
173
|
+
class="rounded bg-app-success-500/15 px-1.5 py-0.5 text-xs text-app-success-300"
|
|
174
174
|
>{{ t('consensus.confidence', { pct: pct(session.confidence) }) }}</span
|
|
175
175
|
>
|
|
176
176
|
<CopyButton :text="session.synthesis" class="ms-auto -my-1" />
|
|
177
177
|
</div>
|
|
178
178
|
<MarkdownProse
|
|
179
179
|
:text="session.synthesis"
|
|
180
|
-
class="rounded-lg border border-
|
|
180
|
+
class="rounded-lg border border-default bg-app-950/60 px-4 py-3 text-sm text-default"
|
|
181
181
|
/>
|
|
182
182
|
<ul v-if="session.dissent?.length" class="mt-2 space-y-1">
|
|
183
183
|
<li
|
|
184
184
|
v-for="(d, i) in session.dissent"
|
|
185
185
|
:key="i"
|
|
186
|
-
class="flex items-start gap-2 text-xs text-
|
|
186
|
+
class="flex items-start gap-2 text-xs text-app-warning-300/90"
|
|
187
187
|
>
|
|
188
188
|
<UIcon name="i-lucide-triangle-alert" class="mt-0.5 h-3.5 w-3.5 shrink-0" />
|
|
189
189
|
<span>{{ d }}</span>
|
|
@@ -193,20 +193,20 @@ function topScore(c: ConsensusContribution): { label: string; value: number } |
|
|
|
193
193
|
|
|
194
194
|
<!-- participants -->
|
|
195
195
|
<section class="mb-6">
|
|
196
|
-
<h3 class="mb-2 text-xs font-semibold uppercase tracking-wide text-
|
|
196
|
+
<h3 class="mb-2 text-xs font-semibold uppercase tracking-wide text-muted">
|
|
197
197
|
{{ t('consensus.panel') }}
|
|
198
198
|
</h3>
|
|
199
199
|
<div class="flex flex-wrap gap-2">
|
|
200
200
|
<div
|
|
201
201
|
v-for="(p, i) in session.participants"
|
|
202
202
|
:key="p.id"
|
|
203
|
-
class="rounded-lg border border-
|
|
203
|
+
class="rounded-lg border border-default bg-app-950/40 px-3 py-1.5 text-xs"
|
|
204
204
|
>
|
|
205
|
-
<span class="font-medium text-
|
|
205
|
+
<span class="font-medium text-default">{{
|
|
206
206
|
t('consensus.expert', { letter: String.fromCharCode(65 + i) })
|
|
207
207
|
}}</span>
|
|
208
|
-
<span class="text-
|
|
209
|
-
<span v-if="p.modelId" class="ms-1 text-
|
|
208
|
+
<span class="text-muted"> · {{ p.role }}</span>
|
|
209
|
+
<span v-if="p.modelId" class="ms-1 text-dimmed"
|
|
210
210
|
>({{ models.labelForRef(p.modelId) ?? p.modelId }})</span
|
|
211
211
|
>
|
|
212
212
|
</div>
|
|
@@ -215,7 +215,7 @@ function topScore(c: ConsensusContribution): { label: string; value: number } |
|
|
|
215
215
|
|
|
216
216
|
<!-- rounds -->
|
|
217
217
|
<section v-for="round in session.rounds" :key="round.index" class="mb-5">
|
|
218
|
-
<h3 class="mb-2 text-xs font-semibold uppercase tracking-wide text-
|
|
218
|
+
<h3 class="mb-2 text-xs font-semibold uppercase tracking-wide text-muted">
|
|
219
219
|
{{ t('consensus.round.heading', { n: round.index + 1 }) }} ·
|
|
220
220
|
{{ roundLabel(round.kind) }}
|
|
221
221
|
</h3>
|
|
@@ -223,16 +223,16 @@ function topScore(c: ConsensusContribution): { label: string; value: number } |
|
|
|
223
223
|
<div
|
|
224
224
|
v-for="c in round.contributions"
|
|
225
225
|
:key="c.participantId"
|
|
226
|
-
class="rounded-lg border border-
|
|
226
|
+
class="rounded-lg border border-default bg-app-950/40 px-4 py-3"
|
|
227
227
|
>
|
|
228
228
|
<div class="mb-1 flex items-center gap-2">
|
|
229
|
-
<span class="text-xs font-semibold text-
|
|
229
|
+
<span class="text-xs font-semibold text-default">{{
|
|
230
230
|
anonLabel(c.participantId)
|
|
231
231
|
}}</span>
|
|
232
|
-
<span class="text-xs text-
|
|
232
|
+
<span class="text-xs text-dimmed">{{ roleFor(c.participantId) }}</span>
|
|
233
233
|
<span
|
|
234
234
|
v-if="topScore(c)"
|
|
235
|
-
class="ms-auto rounded bg-
|
|
235
|
+
class="ms-auto rounded bg-elevated px-1.5 py-0.5 text-xs text-toned"
|
|
236
236
|
>{{
|
|
237
237
|
t('consensus.topScore', {
|
|
238
238
|
label: topScore(c)!.label,
|
|
@@ -242,12 +242,12 @@ function topScore(c: ConsensusContribution): { label: string; value: number } |
|
|
|
242
242
|
>
|
|
243
243
|
<CopyButton :text="c.text" :class="topScore(c) ? '-my-1' : 'ms-auto -my-1'" />
|
|
244
244
|
</div>
|
|
245
|
-
<MarkdownProse :text="c.text" class="text-sm text-
|
|
245
|
+
<MarkdownProse :text="c.text" class="text-sm text-toned" />
|
|
246
246
|
<div v-if="c.scores?.length" class="mt-2 flex flex-wrap gap-1.5">
|
|
247
247
|
<span
|
|
248
248
|
v-for="s in c.scores"
|
|
249
249
|
:key="s.dimension"
|
|
250
|
-
class="rounded bg-
|
|
250
|
+
class="rounded bg-elevated/80 px-1.5 py-0.5 text-xs text-muted"
|
|
251
251
|
>{{ s.dimension }}: {{ pct(s.value) }}</span
|
|
252
252
|
>
|
|
253
253
|
</div>
|