@cat-factory/app 0.302.2 → 0.303.1
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 +99 -14
- 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 +26 -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
|
@@ -207,8 +207,8 @@ const CLASS_HINTS = computed<Record<FindingClass, string>>(() => ({
|
|
|
207
207
|
practice: t('requirements.findingClass.practiceHint'),
|
|
208
208
|
}))
|
|
209
209
|
const CLASS_LABEL_COLOR = {
|
|
210
|
-
judgement: 'text-
|
|
211
|
-
practice: 'text-
|
|
210
|
+
judgement: 'text-app-warning-300',
|
|
211
|
+
practice: 'text-app-info-300',
|
|
212
212
|
} as const satisfies Record<FindingClass, string>
|
|
213
213
|
|
|
214
214
|
// How sure the Writer says it is. Shown on every suggestion, because the confidence is what an
|
|
@@ -449,9 +449,9 @@ const ATTENTION_LABELS = computed<Record<FindingAttention, string>>(() => ({
|
|
|
449
449
|
settled: t('requirements.group.settled'),
|
|
450
450
|
}))
|
|
451
451
|
const ATTENTION_LABEL_COLOR = {
|
|
452
|
-
action: 'text-
|
|
453
|
-
waiting: 'text-
|
|
454
|
-
settled: 'text-
|
|
452
|
+
action: 'text-app-warning-300',
|
|
453
|
+
waiting: 'text-primary',
|
|
454
|
+
settled: 'text-dimmed',
|
|
455
455
|
} as const satisfies Record<FindingAttention, string>
|
|
456
456
|
// Whether a finding's recorded reply is the human's OWN answer (vs an untouched auto-generated
|
|
457
457
|
// recommended default). Drives the "User answered" marker on the Answer option.
|
|
@@ -699,7 +699,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
699
699
|
<ResultWindowShell
|
|
700
700
|
:open="open"
|
|
701
701
|
icon="i-lucide-clipboard-check"
|
|
702
|
-
icon-class="bg-
|
|
702
|
+
icon-class="bg-primary/15 text-primary"
|
|
703
703
|
:title="t('requirements.title')"
|
|
704
704
|
:subtitle="block?.title"
|
|
705
705
|
:step-ref="{ instanceId, stepIndex }"
|
|
@@ -716,31 +716,26 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
716
716
|
<div class="flex min-h-0 flex-1 flex-col lg:flex-row">
|
|
717
717
|
<!-- main column -->
|
|
718
718
|
<div class="min-w-0 flex-1 overflow-y-auto px-6 py-5">
|
|
719
|
-
<i18n-t
|
|
720
|
-
keypath="requirements.intro"
|
|
721
|
-
tag="p"
|
|
722
|
-
class="mb-4 text-sm text-slate-400"
|
|
723
|
-
scope="global"
|
|
724
|
-
>
|
|
719
|
+
<i18n-t keypath="requirements.intro" tag="p" class="mb-4 text-sm text-muted" scope="global">
|
|
725
720
|
<template #level>{{ block?.level ?? t('requirements.levelFallback') }}</template>
|
|
726
721
|
<template #answer
|
|
727
|
-
><span class="text-
|
|
722
|
+
><span class="text-toned">{{ t('requirements.answerVerb') }}</span></template
|
|
728
723
|
>
|
|
729
724
|
<template #dismiss
|
|
730
|
-
><span class="text-
|
|
725
|
+
><span class="text-toned">{{ t('requirements.dismissVerb') }}</span></template
|
|
731
726
|
>
|
|
732
727
|
</i18n-t>
|
|
733
728
|
|
|
734
729
|
<!-- Why the findings never ask a technical question: this gate settles the
|
|
735
730
|
product/business layer, and the architect/researcher steps settle the rest.
|
|
736
731
|
Without this a reader reads the missing technical questions as an oversight. -->
|
|
737
|
-
<p class="mb-4 text-xs text-
|
|
732
|
+
<p class="mb-4 text-xs text-dimmed">{{ t('requirements.scopeNote') }}</p>
|
|
738
733
|
|
|
739
734
|
<!-- empty state — the reviewer runs automatically as the first pipeline
|
|
740
735
|
gate step, so there's nothing to do here until then -->
|
|
741
736
|
<div
|
|
742
737
|
v-if="!review && !busy && !loading"
|
|
743
|
-
class="rounded-lg border border-dashed border-
|
|
738
|
+
class="rounded-lg border border-dashed border-muted p-8 text-center text-sm text-dimmed"
|
|
744
739
|
>
|
|
745
740
|
{{ t('requirements.empty') }}
|
|
746
741
|
</div>
|
|
@@ -748,7 +743,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
748
743
|
<!-- working state (initial fetch on open, or a reviewer pass running) -->
|
|
749
744
|
<div
|
|
750
745
|
v-else-if="(busy || loading) && !review"
|
|
751
|
-
class="flex items-center justify-center gap-2 p-8 text-sm text-
|
|
746
|
+
class="flex items-center justify-center gap-2 p-8 text-sm text-muted"
|
|
752
747
|
>
|
|
753
748
|
<UIcon name="i-lucide-loader-circle" class="h-4 w-4 animate-spin" />
|
|
754
749
|
{{ loading && !busy ? t('requirements.loadingReview') : t('requirements.reviewing') }}
|
|
@@ -758,7 +753,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
758
753
|
<!-- converged: reviewer satisfied -->
|
|
759
754
|
<div
|
|
760
755
|
v-if="incorporated"
|
|
761
|
-
class="mb-4 flex items-center gap-2 rounded-lg border border-
|
|
756
|
+
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"
|
|
762
757
|
data-testid="requirements-settled"
|
|
763
758
|
>
|
|
764
759
|
<UIcon name="i-lucide-circle-check" class="h-5 w-5 shrink-0" />
|
|
@@ -779,7 +774,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
779
774
|
the human can see which of the two LLM calls is currently in progress. -->
|
|
780
775
|
<div
|
|
781
776
|
v-else-if="working"
|
|
782
|
-
class="mb-4 flex items-center gap-2 rounded-lg border border-
|
|
777
|
+
class="mb-4 flex items-center gap-2 rounded-lg border border-primary/60 bg-primary/10 p-4 text-sm text-primary"
|
|
783
778
|
>
|
|
784
779
|
<UIcon name="i-lucide-loader-circle" class="h-5 w-5 shrink-0 animate-spin" />
|
|
785
780
|
<span v-if="incorporating">
|
|
@@ -809,9 +804,9 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
809
804
|
>
|
|
810
805
|
{{ CLASS_LABELS[group] }}
|
|
811
806
|
</span>
|
|
812
|
-
<span class="h-px flex-1 bg-
|
|
807
|
+
<span class="h-px flex-1 bg-accented" />
|
|
813
808
|
</div>
|
|
814
|
-
<p class="mt-0.5 text-[11px] text-
|
|
809
|
+
<p class="mt-0.5 text-[11px] text-dimmed">{{ CLASS_HINTS[group] }}</p>
|
|
815
810
|
</div>
|
|
816
811
|
<div v-if="startsAttentionGroup(index)" class="flex items-center gap-2 pt-1">
|
|
817
812
|
<span
|
|
@@ -820,10 +815,10 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
820
815
|
>
|
|
821
816
|
{{ ATTENTION_LABELS[attention] }}
|
|
822
817
|
</span>
|
|
823
|
-
<span class="h-px flex-1 bg-
|
|
818
|
+
<span class="h-px flex-1 bg-elevated" />
|
|
824
819
|
</div>
|
|
825
820
|
<div
|
|
826
|
-
class="rounded-lg border border-
|
|
821
|
+
class="rounded-lg border border-default bg-default/60 p-3"
|
|
827
822
|
:class="{ 'opacity-60': item.status === 'dismissed' }"
|
|
828
823
|
data-testid="requirements-finding"
|
|
829
824
|
:data-finding-status="item.status"
|
|
@@ -832,11 +827,11 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
832
827
|
<div class="flex items-start gap-2">
|
|
833
828
|
<UIcon
|
|
834
829
|
:name="CATEGORY_ICON[item.category]"
|
|
835
|
-
class="mt-0.5 h-4 w-4 shrink-0 text-
|
|
830
|
+
class="mt-0.5 h-4 w-4 shrink-0 text-muted"
|
|
836
831
|
/>
|
|
837
832
|
<div class="min-w-0 flex-1">
|
|
838
833
|
<div class="flex flex-wrap items-center gap-1.5">
|
|
839
|
-
<span class="text-sm font-medium text-
|
|
834
|
+
<span class="text-sm font-medium text-highlighted">{{ item.title }}</span>
|
|
840
835
|
<UBadge size="xs" variant="subtle" :color="SEVERITY_COLOR[item.severity]">
|
|
841
836
|
{{ SEVERITY_LABELS[item.severity] }}
|
|
842
837
|
</UBadge>
|
|
@@ -868,7 +863,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
868
863
|
card around it takes the span (see the shell's `width` prop: the unit is
|
|
869
864
|
the paragraph, not the section). The badge row above and the mode buttons
|
|
870
865
|
and textarea below are what the full width is actually for. -->
|
|
871
|
-
<p class="mt-1 max-w-3xl whitespace-pre-line text-sm text-
|
|
866
|
+
<p class="mt-1 max-w-3xl whitespace-pre-line text-sm text-muted">
|
|
872
867
|
{{ item.detail }}
|
|
873
868
|
</p>
|
|
874
869
|
|
|
@@ -876,9 +871,9 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
876
871
|
ones the answer lives in the textarea below, seeded from the reply) -->
|
|
877
872
|
<div
|
|
878
873
|
v-if="item.reply && item.status !== 'open' && item.status !== 'answered'"
|
|
879
|
-
class="mt-2 max-w-3xl rounded-md border-s-2 border-
|
|
874
|
+
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"
|
|
880
875
|
>
|
|
881
|
-
<span class="text-[10px] uppercase tracking-wide text-
|
|
876
|
+
<span class="text-[10px] uppercase tracking-wide text-dimmed">
|
|
882
877
|
{{ t('requirements.answerLabel') }}
|
|
883
878
|
</span>
|
|
884
879
|
<p class="whitespace-pre-line">{{ item.reply }}</p>
|
|
@@ -906,7 +901,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
906
901
|
<UIcon
|
|
907
902
|
v-if="opt.mode === 'answer' && isUserAnswered(item)"
|
|
908
903
|
name="i-lucide-check"
|
|
909
|
-
class="h-3.5 w-3.5 text-
|
|
904
|
+
class="h-3.5 w-3.5 text-app-success-400"
|
|
910
905
|
/>
|
|
911
906
|
</UButton>
|
|
912
907
|
</div>
|
|
@@ -917,7 +912,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
917
912
|
answer; the human can keep it, edit it, or switch modes. -->
|
|
918
913
|
<div
|
|
919
914
|
v-if="autoDefaults.get(item.id)"
|
|
920
|
-
class="mt-2 flex flex-wrap items-center gap-1.5 text-xs text-
|
|
915
|
+
class="mt-2 flex flex-wrap items-center gap-1.5 text-xs text-primary"
|
|
921
916
|
>
|
|
922
917
|
<UIcon name="i-lucide-sparkles" class="h-3.5 w-3.5 shrink-0" />
|
|
923
918
|
<span>{{ t('requirements.recommendedDefault') }}</span>
|
|
@@ -969,7 +964,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
969
964
|
/>
|
|
970
965
|
<p
|
|
971
966
|
v-if="isUserAnswered(item)"
|
|
972
|
-
class="mt-1 flex items-center gap-1 text-[11px] text-
|
|
967
|
+
class="mt-1 flex items-center gap-1 text-[11px] text-app-success-400"
|
|
973
968
|
>
|
|
974
969
|
<UIcon name="i-lucide-check" class="h-3 w-3 shrink-0" />
|
|
975
970
|
{{ t('requirements.userAnswered') }}
|
|
@@ -981,7 +976,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
981
976
|
<template v-else-if="modeFor(item) === 'recommend'">
|
|
982
977
|
<div
|
|
983
978
|
v-if="pendingRecFor(item)"
|
|
984
|
-
class="mt-2 flex items-center gap-1.5 text-xs text-
|
|
979
|
+
class="mt-2 flex items-center gap-1.5 text-xs text-primary"
|
|
985
980
|
>
|
|
986
981
|
<UIcon name="i-lucide-loader-circle" class="h-3.5 w-3.5 animate-spin" />
|
|
987
982
|
{{ t('requirements.generatingSuggestion') }}
|
|
@@ -990,7 +985,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
990
985
|
<div
|
|
991
986
|
v-for="rec in [readyRecFor(item)!]"
|
|
992
987
|
:key="rec.id"
|
|
993
|
-
class="mt-2 rounded-lg border border-
|
|
988
|
+
class="mt-2 rounded-lg border border-primary/50 bg-primary/10 p-3"
|
|
994
989
|
>
|
|
995
990
|
<UBadge
|
|
996
991
|
v-if="rec.groundedInFragment"
|
|
@@ -1026,7 +1021,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
1026
1021
|
</UBadge>
|
|
1027
1022
|
<!-- The Writer's suggested answer — agent prose, so it takes the
|
|
1028
1023
|
measure like the finding's own question above it. -->
|
|
1029
|
-
<p class="mt-1 max-w-3xl whitespace-pre-line text-sm text-
|
|
1024
|
+
<p class="mt-1 max-w-3xl whitespace-pre-line text-sm text-toned">
|
|
1030
1025
|
{{ rec.recommendedText }}
|
|
1031
1026
|
</p>
|
|
1032
1027
|
<div class="mt-2 flex flex-wrap items-center gap-2">
|
|
@@ -1098,7 +1093,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
1098
1093
|
:placeholder="t('requirements.guidancePlaceholder')"
|
|
1099
1094
|
:disabled="frozen"
|
|
1100
1095
|
/>
|
|
1101
|
-
<p class="mt-1 flex items-center gap-1 text-[11px] text-
|
|
1096
|
+
<p class="mt-1 flex items-center gap-1 text-[11px] text-primary/80">
|
|
1102
1097
|
<UIcon name="i-lucide-wand-2" class="h-3 w-3 shrink-0" />
|
|
1103
1098
|
{{ t('requirements.guidanceHint') }}
|
|
1104
1099
|
</p>
|
|
@@ -1106,7 +1101,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
1106
1101
|
</template>
|
|
1107
1102
|
|
|
1108
1103
|
<!-- DISMISS: nothing to fill in — a short note explains the effect -->
|
|
1109
|
-
<p v-else class="mt-2 text-[11px] text-
|
|
1104
|
+
<p v-else class="mt-2 text-[11px] text-dimmed">
|
|
1110
1105
|
{{ t('requirements.dismissedHint') }}
|
|
1111
1106
|
</p>
|
|
1112
1107
|
</template>
|
|
@@ -1119,9 +1114,9 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
1119
1114
|
<!-- incorporated document: the standard-format requirements. The whole section
|
|
1120
1115
|
collapses as a unit (a long doc otherwise pushes the findings/recommendations
|
|
1121
1116
|
off-screen); the per-heading toggles below still work when it's expanded. -->
|
|
1122
|
-
<section v-if="outline" class="mt-6 border-t border-
|
|
1117
|
+
<section v-if="outline" class="mt-6 border-t border-default pt-5">
|
|
1123
1118
|
<button
|
|
1124
|
-
class="mb-3 flex w-full items-center gap-1.5 text-[11px] text-
|
|
1119
|
+
class="mb-3 flex w-full items-center gap-1.5 text-[11px] text-app-success-400"
|
|
1125
1120
|
@click="toggleDoc"
|
|
1126
1121
|
>
|
|
1127
1122
|
<UIcon
|
|
@@ -1151,18 +1146,18 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
1151
1146
|
>
|
|
1152
1147
|
<UIcon
|
|
1153
1148
|
name="i-lucide-chevron-right"
|
|
1154
|
-
class="h-3.5 w-3.5 shrink-0 text-
|
|
1149
|
+
class="h-3.5 w-3.5 shrink-0 text-dimmed transition-transform"
|
|
1155
1150
|
:class="collapsed[s.id] ? '' : 'rotate-90'"
|
|
1156
1151
|
/>
|
|
1157
1152
|
<span
|
|
1158
|
-
class="font-semibold text-
|
|
1153
|
+
class="font-semibold text-highlighted"
|
|
1159
1154
|
:class="s.depth <= 1 ? 'text-base' : s.depth === 2 ? 'text-sm' : 'text-xs'"
|
|
1160
1155
|
v-html="s.titleHtml"
|
|
1161
1156
|
/>
|
|
1162
1157
|
</button>
|
|
1163
1158
|
<div
|
|
1164
1159
|
v-show="!s.title || !collapsed[s.id]"
|
|
1165
|
-
class="reader-prose mt-1 ps-5.5 text-[13px] leading-relaxed text-
|
|
1160
|
+
class="reader-prose mt-1 ps-5.5 text-[13px] leading-relaxed text-toned"
|
|
1166
1161
|
v-html="s.bodyHtml"
|
|
1167
1162
|
/>
|
|
1168
1163
|
</div>
|
|
@@ -1176,29 +1171,27 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
1176
1171
|
tablet, UX-32). The informational stats collapse away below `lg` to keep the
|
|
1177
1172
|
bottom bar compact; the actions themselves always show. -->
|
|
1178
1173
|
<aside
|
|
1179
|
-
class="flex w-full shrink-0 flex-col border-t border-
|
|
1174
|
+
class="flex w-full shrink-0 flex-col border-t border-default lg:w-72 lg:border-s lg:border-t-0"
|
|
1180
1175
|
>
|
|
1181
1176
|
<div class="flex flex-col gap-4 px-4 py-5">
|
|
1182
|
-
<div v-if="review" class="hidden space-y-2 text-xs text-
|
|
1177
|
+
<div v-if="review" class="hidden space-y-2 text-xs text-muted lg:block">
|
|
1183
1178
|
<div class="flex items-center justify-between">
|
|
1184
1179
|
<span>{{ t('requirements.stats.findings') }}</span>
|
|
1185
|
-
<span class="text-
|
|
1180
|
+
<span class="text-toned">{{ review.items.length }}</span>
|
|
1186
1181
|
</div>
|
|
1187
1182
|
<div class="flex items-center justify-between">
|
|
1188
1183
|
<span>{{ t('requirements.stats.open') }}</span>
|
|
1189
|
-
<span class="text-
|
|
1184
|
+
<span class="text-toned">{{ openCount }}</span>
|
|
1190
1185
|
</div>
|
|
1191
1186
|
<div class="flex items-center justify-between">
|
|
1192
1187
|
<span>{{ t('requirements.stats.answered') }}</span>
|
|
1193
|
-
<span class="text-
|
|
1188
|
+
<span class="text-toned">{{ answeredCount }}</span>
|
|
1194
1189
|
</div>
|
|
1195
1190
|
<!-- awaited recommendations — kept here (always visible) so the human can see what
|
|
1196
1191
|
the Writer is still producing / what's waiting on them even while reading the
|
|
1197
1192
|
incorporated document or acting elsewhere in the window. -->
|
|
1198
1193
|
<template v-if="generatingRecommendations.length || readyRecommendations.length">
|
|
1199
|
-
<div
|
|
1200
|
-
class="flex items-center gap-1.5 border-t border-slate-800/60 pt-2 text-indigo-300"
|
|
1201
|
-
>
|
|
1194
|
+
<div class="flex items-center gap-1.5 border-t border-default/60 pt-2 text-primary">
|
|
1202
1195
|
<UIcon name="i-lucide-wand-2" class="h-3 w-3" />
|
|
1203
1196
|
<span class="font-medium">{{ t('requirements.stats.recommendations') }}</span>
|
|
1204
1197
|
</div>
|
|
@@ -1207,16 +1200,16 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
1207
1200
|
class="flex items-center justify-between"
|
|
1208
1201
|
>
|
|
1209
1202
|
<span>{{ t('requirements.stats.recsGenerating') }}</span>
|
|
1210
|
-
<span class="text-
|
|
1203
|
+
<span class="text-primary">{{ generatingRecommendations.length }}</span>
|
|
1211
1204
|
</div>
|
|
1212
1205
|
<div v-if="readyRecommendations.length" class="flex items-center justify-between">
|
|
1213
1206
|
<span>{{ t('requirements.stats.recsToReview') }}</span>
|
|
1214
|
-
<span class="text-
|
|
1207
|
+
<span class="text-primary">{{ readyRecommendations.length }}</span>
|
|
1215
1208
|
</div>
|
|
1216
1209
|
</template>
|
|
1217
1210
|
<div v-if="review.model" class="flex items-center justify-between">
|
|
1218
1211
|
<span>{{ t('requirements.stats.model') }}</span>
|
|
1219
|
-
<span class="truncate ps-2 text-
|
|
1212
|
+
<span class="truncate ps-2 text-dimmed">{{
|
|
1220
1213
|
models.labelForRef(review.model) ?? review.model
|
|
1221
1214
|
}}</span>
|
|
1222
1215
|
</div>
|
|
@@ -1230,7 +1223,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
1230
1223
|
on the cap decision and a fresh recommendation batch has no path to settle). -->
|
|
1231
1224
|
<div
|
|
1232
1225
|
v-if="review && pendingRecommendRequests.length > 0 && (status === 'ready' || merged)"
|
|
1233
|
-
class="border-t border-
|
|
1226
|
+
class="border-t border-default pt-4"
|
|
1234
1227
|
>
|
|
1235
1228
|
<UButton
|
|
1236
1229
|
color="primary"
|
|
@@ -1254,7 +1247,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
1254
1247
|
</div>
|
|
1255
1248
|
|
|
1256
1249
|
<!-- action: ready (answer → incorporate / proceed) -->
|
|
1257
|
-
<div v-if="review && status === 'ready'" class="space-y-2 border-t border-
|
|
1250
|
+
<div v-if="review && status === 'ready'" class="space-y-2 border-t border-default pt-4">
|
|
1258
1251
|
<UButton
|
|
1259
1252
|
v-if="canProceed"
|
|
1260
1253
|
color="primary"
|
|
@@ -1284,7 +1277,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
1284
1277
|
>
|
|
1285
1278
|
{{ t('requirements.actions.incorporateAnswers') }}
|
|
1286
1279
|
</UButton>
|
|
1287
|
-
<p class="text-[11px] leading-relaxed text-
|
|
1280
|
+
<p class="text-[11px] leading-relaxed text-dimmed">
|
|
1288
1281
|
<template v-if="canProceed">
|
|
1289
1282
|
{{ t('requirements.help.canProceed') }}
|
|
1290
1283
|
</template>
|
|
@@ -1296,7 +1289,7 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
1296
1289
|
</div>
|
|
1297
1290
|
|
|
1298
1291
|
<!-- action: merged (inspect → re-review / redo) -->
|
|
1299
|
-
<div v-if="review && merged" class="space-y-2 border-t border-
|
|
1292
|
+
<div v-if="review && merged" class="space-y-2 border-t border-default pt-4">
|
|
1300
1293
|
<UButton
|
|
1301
1294
|
color="primary"
|
|
1302
1295
|
size="sm"
|
|
@@ -1348,14 +1341,14 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
|
|
|
1348
1341
|
{{ t('requirements.actions.redoWithDirection') }}
|
|
1349
1342
|
</UButton>
|
|
1350
1343
|
</div>
|
|
1351
|
-
<p class="text-[11px] leading-relaxed text-
|
|
1344
|
+
<p class="text-[11px] leading-relaxed text-dimmed">
|
|
1352
1345
|
{{ t('requirements.help.merged') }}
|
|
1353
1346
|
</p>
|
|
1354
1347
|
</div>
|
|
1355
1348
|
|
|
1356
1349
|
<div
|
|
1357
1350
|
v-if="review && incorporated"
|
|
1358
|
-
class="border-t border-
|
|
1351
|
+
class="border-t border-default pt-4 text-[11px] leading-relaxed text-dimmed"
|
|
1359
1352
|
>
|
|
1360
1353
|
{{ t('requirements.settledFooter') }}
|
|
1361
1354
|
</div>
|
|
@@ -138,14 +138,14 @@ function choose(id: string) {
|
|
|
138
138
|
@focusout="onPanelFocusOut"
|
|
139
139
|
>
|
|
140
140
|
<!-- left: selectable options, NAME ONLY -->
|
|
141
|
-
<ul class="w-1/2 shrink-0 overflow-y-auto border-e border-
|
|
141
|
+
<ul class="w-1/2 shrink-0 overflow-y-auto border-e border-default p-1">
|
|
142
142
|
<li>
|
|
143
143
|
<button
|
|
144
144
|
type="button"
|
|
145
145
|
class="flex w-full items-center gap-2 rounded px-2 py-1.5 text-start text-sm"
|
|
146
146
|
:class="[
|
|
147
|
-
refused.has('') ? 'cursor-not-allowed opacity-50' : 'hover:bg-
|
|
148
|
-
modelValue ? 'text-
|
|
147
|
+
refused.has('') ? 'cursor-not-allowed opacity-50' : 'hover:bg-elevated/60',
|
|
148
|
+
modelValue ? 'text-toned' : 'text-app-100',
|
|
149
149
|
]"
|
|
150
150
|
:aria-disabled="refused.has('')"
|
|
151
151
|
:title="refusalText('')"
|
|
@@ -156,13 +156,13 @@ function choose(id: string) {
|
|
|
156
156
|
>
|
|
157
157
|
<UIcon
|
|
158
158
|
:name="refused.has('') ? 'i-lucide-lock' : 'i-lucide-rotate-ccw'"
|
|
159
|
-
class="h-4 w-4 shrink-0 text-
|
|
159
|
+
class="h-4 w-4 shrink-0 text-muted"
|
|
160
160
|
/>
|
|
161
161
|
<span class="flex-1 truncate">{{ noneLabel }}</span>
|
|
162
162
|
<UIcon
|
|
163
163
|
v-if="!modelValue"
|
|
164
164
|
name="i-lucide-check"
|
|
165
|
-
class="h-4 w-4 shrink-0 text-primary
|
|
165
|
+
class="h-4 w-4 shrink-0 text-primary"
|
|
166
166
|
/>
|
|
167
167
|
</button>
|
|
168
168
|
</li>
|
|
@@ -171,8 +171,8 @@ function choose(id: string) {
|
|
|
171
171
|
type="button"
|
|
172
172
|
class="flex w-full items-center gap-2 rounded px-2 py-1.5 text-start text-sm"
|
|
173
173
|
:class="[
|
|
174
|
-
refused.has(p.id) ? 'cursor-not-allowed opacity-50' : 'hover:bg-
|
|
175
|
-
modelValue === p.id ? 'text-
|
|
174
|
+
refused.has(p.id) ? 'cursor-not-allowed opacity-50' : 'hover:bg-elevated/60',
|
|
175
|
+
modelValue === p.id ? 'text-app-100' : 'text-toned',
|
|
176
176
|
]"
|
|
177
177
|
:aria-disabled="refused.has(p.id)"
|
|
178
178
|
:title="refusalText(p.id)"
|
|
@@ -183,13 +183,13 @@ function choose(id: string) {
|
|
|
183
183
|
>
|
|
184
184
|
<UIcon
|
|
185
185
|
:name="refused.has(p.id) ? 'i-lucide-lock' : 'i-lucide-git-merge'"
|
|
186
|
-
class="h-4 w-4 shrink-0 text-
|
|
186
|
+
class="h-4 w-4 shrink-0 text-muted"
|
|
187
187
|
/>
|
|
188
188
|
<span class="flex-1 truncate">{{ p.name }}</span>
|
|
189
189
|
<UIcon
|
|
190
190
|
v-if="modelValue === p.id"
|
|
191
191
|
name="i-lucide-check"
|
|
192
|
-
class="h-4 w-4 shrink-0 text-primary
|
|
192
|
+
class="h-4 w-4 shrink-0 text-primary"
|
|
193
193
|
/>
|
|
194
194
|
</button>
|
|
195
195
|
</li>
|
|
@@ -200,20 +200,17 @@ function choose(id: string) {
|
|
|
200
200
|
<template v-if="preview.policy">
|
|
201
201
|
<p
|
|
202
202
|
v-if="previewRefusal"
|
|
203
|
-
class="mb-2 text-[11px] leading-snug text-
|
|
203
|
+
class="mb-2 text-[11px] leading-snug text-app-warning-400"
|
|
204
204
|
data-testid="risk-policy-refusal"
|
|
205
205
|
>
|
|
206
206
|
{{ t(`riskPolicy.picker.refused.${previewRefusal}`) }}
|
|
207
207
|
</p>
|
|
208
|
-
<p
|
|
209
|
-
v-if="preview.viaWorkspaceDefault"
|
|
210
|
-
class="mb-2 text-[11px] leading-snug text-slate-500"
|
|
211
|
-
>
|
|
208
|
+
<p v-if="preview.viaWorkspaceDefault" class="mb-2 text-[11px] leading-snug text-dimmed">
|
|
212
209
|
{{ t('riskPolicy.picker.workspaceDefaultCaption') }}
|
|
213
210
|
</p>
|
|
214
211
|
<RiskPolicyPreview :policy="preview.policy" />
|
|
215
212
|
</template>
|
|
216
|
-
<div v-else class="text-[12px] leading-snug text-
|
|
213
|
+
<div v-else class="text-[12px] leading-snug text-dimmed">
|
|
217
214
|
{{ t('riskPolicy.picker.noneHint') }}
|
|
218
215
|
</div>
|
|
219
216
|
</div>
|
|
@@ -48,7 +48,7 @@ const ceilings = computed(() =>
|
|
|
48
48
|
<template>
|
|
49
49
|
<div class="space-y-3" data-testid="risk-policy-preview">
|
|
50
50
|
<div class="flex items-center gap-1.5">
|
|
51
|
-
<span class="text-sm font-semibold text-
|
|
51
|
+
<span class="text-sm font-semibold text-app-100">{{ policy.name }}</span>
|
|
52
52
|
<UBadge v-if="policy.isDefault" size="sm" variant="soft" color="neutral">
|
|
53
53
|
{{ t('riskPolicy.preview.defaultBadge') }}
|
|
54
54
|
</UBadge>
|
|
@@ -56,7 +56,7 @@ const ceilings = computed(() =>
|
|
|
56
56
|
|
|
57
57
|
<!-- the three ceilings, grouped under one heading that names what they are -->
|
|
58
58
|
<div v-if="policy.autoMergeEnabled">
|
|
59
|
-
<div class="mb-1 flex items-center gap-1 text-[10px] uppercase tracking-wide text-
|
|
59
|
+
<div class="mb-1 flex items-center gap-1 text-[10px] uppercase tracking-wide text-dimmed">
|
|
60
60
|
<UIcon name="i-lucide-git-merge" class="h-3 w-3" />
|
|
61
61
|
{{ t('riskPolicy.preview.autoMergeHeading') }}
|
|
62
62
|
</div>
|
|
@@ -64,51 +64,51 @@ const ceilings = computed(() =>
|
|
|
64
64
|
<div
|
|
65
65
|
v-for="c in ceilings"
|
|
66
66
|
:key="c.axis"
|
|
67
|
-
class="flex items-baseline justify-between gap-3 rounded bg-
|
|
67
|
+
class="flex items-baseline justify-between gap-3 rounded bg-elevated/70 px-1.5 py-0.5 text-[12px]"
|
|
68
68
|
>
|
|
69
|
-
<dt class="text-
|
|
70
|
-
<dd class="tabular-nums text-
|
|
69
|
+
<dt class="text-toned">{{ c.label }}</dt>
|
|
70
|
+
<dd class="tabular-nums text-app-100">
|
|
71
71
|
{{ t('riskPolicy.preview.ceiling', { value: n(c.max, { key: 'percent' }) }) }}
|
|
72
72
|
</dd>
|
|
73
73
|
</div>
|
|
74
74
|
</dl>
|
|
75
|
-
<p class="mt-1.5 text-[12px] leading-snug text-
|
|
75
|
+
<p class="mt-1.5 text-[12px] leading-snug text-muted">
|
|
76
76
|
{{ t('riskPolicy.preview.autoMergeExplainer') }}
|
|
77
77
|
</p>
|
|
78
78
|
</div>
|
|
79
79
|
<div v-else>
|
|
80
|
-
<div class="mb-1 flex items-center gap-1 text-[10px] uppercase tracking-wide text-
|
|
80
|
+
<div class="mb-1 flex items-center gap-1 text-[10px] uppercase tracking-wide text-dimmed">
|
|
81
81
|
<UIcon name="i-lucide-user-check" class="h-3 w-3" />
|
|
82
82
|
{{ t('riskPolicy.preview.manualHeading') }}
|
|
83
83
|
</div>
|
|
84
|
-
<p class="text-[12px] leading-snug text-
|
|
84
|
+
<p class="text-[12px] leading-snug text-muted">
|
|
85
85
|
{{ t('riskPolicy.preview.manualExplainer') }}
|
|
86
86
|
</p>
|
|
87
87
|
</div>
|
|
88
88
|
|
|
89
89
|
<!-- Who started the run changes what may land, on a policy that says so. -->
|
|
90
90
|
<div v-if="roleLayer.any" data-testid="risk-policy-preview-roles">
|
|
91
|
-
<div class="mb-1 flex items-center gap-1 text-[10px] uppercase tracking-wide text-
|
|
91
|
+
<div class="mb-1 flex items-center gap-1 text-[10px] uppercase tracking-wide text-dimmed">
|
|
92
92
|
<UIcon name="i-lucide-users" class="h-3 w-3" />
|
|
93
93
|
{{ t('riskPolicy.preview.roleHeading') }}
|
|
94
94
|
</div>
|
|
95
|
-
<p v-if="roleLayer.sandboxed" class="text-[12px] leading-snug text-
|
|
95
|
+
<p v-if="roleLayer.sandboxed" class="text-[12px] leading-snug text-muted">
|
|
96
96
|
{{ t('riskPolicy.preview.roleSandboxed', { roles: roleLayer.sandboxed }) }}
|
|
97
97
|
</p>
|
|
98
|
-
<p v-if="roleLayer.scoped" class="text-[12px] leading-snug text-
|
|
98
|
+
<p v-if="roleLayer.scoped" class="text-[12px] leading-snug text-muted">
|
|
99
99
|
{{ t('riskPolicy.preview.roleScoped', { roles: roleLayer.scoped }) }}
|
|
100
100
|
</p>
|
|
101
|
-
<p v-if="roleLayer.narrowed" class="text-[12px] leading-snug text-
|
|
101
|
+
<p v-if="roleLayer.narrowed" class="text-[12px] leading-snug text-muted">
|
|
102
102
|
{{ t('riskPolicy.preview.roleNarrowed', { roles: roleLayer.narrowed }) }}
|
|
103
103
|
</p>
|
|
104
104
|
</div>
|
|
105
105
|
|
|
106
106
|
<div>
|
|
107
|
-
<div class="mb-1 flex items-center gap-1 text-[10px] uppercase tracking-wide text-
|
|
107
|
+
<div class="mb-1 flex items-center gap-1 text-[10px] uppercase tracking-wide text-dimmed">
|
|
108
108
|
<UIcon name="i-lucide-wrench" class="h-3 w-3" />
|
|
109
109
|
{{ t('riskPolicy.preview.ciHeading') }}
|
|
110
110
|
</div>
|
|
111
|
-
<p class="text-[12px] leading-snug text-
|
|
111
|
+
<p class="text-[12px] leading-snug text-muted">
|
|
112
112
|
{{
|
|
113
113
|
t('riskPolicy.preview.ciAttempts', { count: policy.ciMaxAttempts }, policy.ciMaxAttempts)
|
|
114
114
|
}}
|