@cat-factory/app 0.302.2 → 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 +9 -8
|
@@ -51,18 +51,18 @@ function phaseLabel(outcome: ReproductionPhaseOutcome): string {
|
|
|
51
51
|
class="space-y-2"
|
|
52
52
|
data-testid="step-reproduction-report"
|
|
53
53
|
:class="
|
|
54
|
-
variant === 'card' ? 'scroll-mt-4 rounded-xl border border-
|
|
54
|
+
variant === 'card' ? 'scroll-mt-4 rounded-xl border border-default bg-default/50 p-4' : ''
|
|
55
55
|
"
|
|
56
56
|
>
|
|
57
57
|
<div
|
|
58
58
|
v-if="variant === 'card'"
|
|
59
|
-
class="flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-
|
|
59
|
+
class="flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-muted"
|
|
60
60
|
>
|
|
61
61
|
<UIcon :name="presentation.icon" class="h-3.5 w-3.5" />
|
|
62
62
|
<span>{{ t('panels.stepDetail.reproduction.heading') }}</span>
|
|
63
63
|
</div>
|
|
64
64
|
|
|
65
|
-
<p class="text-[11px] text-
|
|
65
|
+
<p class="text-[11px] text-muted" data-testid="reproduction-verdict">
|
|
66
66
|
{{ t(presentation.verdict) }}
|
|
67
67
|
</p>
|
|
68
68
|
|
|
@@ -70,27 +70,31 @@ function phaseLabel(outcome: ReproductionPhaseOutcome): string {
|
|
|
70
70
|
trees can tell a test that misses the defect from a resumed run whose pre-fix tree already
|
|
71
71
|
carried this step's own interrupted work, so re-deriving a cause from the exit codes here
|
|
72
72
|
is exactly the inference that gets it wrong. -->
|
|
73
|
-
<p
|
|
73
|
+
<p
|
|
74
|
+
v-if="report.note"
|
|
75
|
+
class="text-[11px] text-app-warning-300"
|
|
76
|
+
data-testid="reproduction-observation"
|
|
77
|
+
>
|
|
74
78
|
{{ report.note }}
|
|
75
79
|
</p>
|
|
76
80
|
|
|
77
81
|
<!-- A structural infeasibility declaration: the reason, and what the agent verified instead.
|
|
78
82
|
This is what keeps "could not be reproduced" from looking like "nobody tried". -->
|
|
79
83
|
<template v-if="report.status === 'declared_infeasible'">
|
|
80
|
-
<div v-if="report.reason" class="rounded-md border border-
|
|
81
|
-
<p class="text-[11px] font-semibold uppercase tracking-wide text-
|
|
84
|
+
<div v-if="report.reason" class="rounded-md border border-default bg-app-950/40 p-2">
|
|
85
|
+
<p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
82
86
|
{{ t('panels.stepDetail.reproduction.reason') }}
|
|
83
87
|
</p>
|
|
84
|
-
<p class="mt-1 whitespace-pre-wrap text-[12px] text-
|
|
88
|
+
<p class="mt-1 whitespace-pre-wrap text-[12px] text-toned">{{ report.reason }}</p>
|
|
85
89
|
</div>
|
|
86
90
|
<div
|
|
87
91
|
v-if="report.alternativeVerification"
|
|
88
|
-
class="rounded-md border border-
|
|
92
|
+
class="rounded-md border border-default bg-app-950/40 p-2"
|
|
89
93
|
>
|
|
90
|
-
<p class="text-[11px] font-semibold uppercase tracking-wide text-
|
|
94
|
+
<p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
91
95
|
{{ t('panels.stepDetail.reproduction.alternative') }}
|
|
92
96
|
</p>
|
|
93
|
-
<p class="mt-1 whitespace-pre-wrap text-[12px] text-
|
|
97
|
+
<p class="mt-1 whitespace-pre-wrap text-[12px] text-toned">
|
|
94
98
|
{{ report.alternativeVerification }}
|
|
95
99
|
</p>
|
|
96
100
|
</div>
|
|
@@ -98,17 +102,17 @@ function phaseLabel(outcome: ReproductionPhaseOutcome): string {
|
|
|
98
102
|
|
|
99
103
|
<template v-else>
|
|
100
104
|
<div v-if="report.command" class="flex items-baseline gap-2">
|
|
101
|
-
<span class="shrink-0 text-[11px] text-
|
|
105
|
+
<span class="shrink-0 text-[11px] text-dimmed">{{
|
|
102
106
|
t('panels.stepDetail.reproduction.command')
|
|
103
107
|
}}</span>
|
|
104
|
-
<span class="truncate font-mono text-[11px] text-
|
|
108
|
+
<span class="truncate font-mono text-[11px] text-toned">{{ report.command }}</span>
|
|
105
109
|
</div>
|
|
106
110
|
|
|
107
111
|
<!-- A dropped path can leave the pre-fix tree without the reproduction, which greens it and
|
|
108
112
|
reads as "the test does not capture the defect". Stated, never implied. -->
|
|
109
113
|
<p
|
|
110
114
|
v-if="report.omittedTestPaths"
|
|
111
|
-
class="text-[11px] text-
|
|
115
|
+
class="text-[11px] text-app-warning-300"
|
|
112
116
|
data-testid="reproduction-omitted-paths"
|
|
113
117
|
>
|
|
114
118
|
{{
|
|
@@ -123,7 +127,7 @@ function phaseLabel(outcome: ReproductionPhaseOutcome): string {
|
|
|
123
127
|
<div
|
|
124
128
|
v-for="phase in phases"
|
|
125
129
|
:key="phase.key"
|
|
126
|
-
class="rounded-md border border-
|
|
130
|
+
class="rounded-md border border-default bg-app-950/40 p-2"
|
|
127
131
|
data-testid="reproduction-phase"
|
|
128
132
|
>
|
|
129
133
|
<div class="flex items-center gap-2">
|
|
@@ -133,15 +137,15 @@ function phaseLabel(outcome: ReproductionPhaseOutcome): string {
|
|
|
133
137
|
:class="
|
|
134
138
|
phase.outcome
|
|
135
139
|
? phase.outcome.passed
|
|
136
|
-
? 'text-
|
|
137
|
-
: 'text-
|
|
138
|
-
: 'text-
|
|
140
|
+
? 'text-app-success-400'
|
|
141
|
+
: 'text-app-error-400'
|
|
142
|
+
: 'text-app-600'
|
|
139
143
|
"
|
|
140
144
|
/>
|
|
141
|
-
<span class="text-[12px] font-medium text-
|
|
145
|
+
<span class="text-[12px] font-medium text-default">
|
|
142
146
|
{{ t(phase.label) }}
|
|
143
147
|
</span>
|
|
144
|
-
<span class="ms-auto shrink-0 text-[11px] tabular-nums text-
|
|
148
|
+
<span class="ms-auto shrink-0 text-[11px] tabular-nums text-muted">
|
|
145
149
|
{{
|
|
146
150
|
phase.outcome ? phaseLabel(phase.outcome) : t('panels.stepDetail.reproduction.notRun')
|
|
147
151
|
}}
|
|
@@ -149,12 +153,12 @@ function phaseLabel(outcome: ReproductionPhaseOutcome): string {
|
|
|
149
153
|
</div>
|
|
150
154
|
<pre
|
|
151
155
|
v-if="phase.outcome?.outputTail"
|
|
152
|
-
class="mt-1.5 max-h-48 overflow-auto whitespace-pre-wrap break-words rounded bg-
|
|
156
|
+
class="mt-1.5 max-h-48 overflow-auto whitespace-pre-wrap break-words rounded bg-app-950 p-2 font-mono text-[11px] text-muted"
|
|
153
157
|
data-testid="reproduction-output"
|
|
154
158
|
>{{ phase.outcome.outputTail }}</pre>
|
|
155
159
|
</div>
|
|
156
160
|
|
|
157
|
-
<p class="text-[11px] text-
|
|
161
|
+
<p class="text-[11px] text-dimmed">
|
|
158
162
|
{{
|
|
159
163
|
t('panels.stepDetail.reproduction.attempts', {
|
|
160
164
|
attempts: report.attempts,
|
|
@@ -57,26 +57,26 @@ async function copyRunId() {
|
|
|
57
57
|
<template>
|
|
58
58
|
<div class="flex flex-col gap-4">
|
|
59
59
|
<div v-if="stepNumber && totalSteps">
|
|
60
|
-
<h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-
|
|
60
|
+
<h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
61
61
|
{{ t('panels.stepMeta.step') }}
|
|
62
62
|
</h4>
|
|
63
|
-
<p class="text-[12px] text-
|
|
63
|
+
<p class="text-[12px] text-toned">
|
|
64
64
|
{{ t('panels.stepMeta.stepOf', { number: stepNumber, total: totalSteps }) }}
|
|
65
65
|
</p>
|
|
66
66
|
</div>
|
|
67
67
|
|
|
68
68
|
<div v-if="durationLabel">
|
|
69
|
-
<h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-
|
|
69
|
+
<h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
70
70
|
{{ t('panels.stepMeta.duration') }}
|
|
71
71
|
</h4>
|
|
72
|
-
<p class="flex items-center gap-1.5 text-[12px] tabular-nums text-
|
|
72
|
+
<p class="flex items-center gap-1.5 text-[12px] tabular-nums text-toned">
|
|
73
73
|
<UIcon
|
|
74
74
|
v-if="isRunning"
|
|
75
75
|
name="i-lucide-loader-circle"
|
|
76
|
-
class="h-3 w-3 animate-spin text-
|
|
76
|
+
class="h-3 w-3 animate-spin text-primary"
|
|
77
77
|
/>
|
|
78
78
|
{{ durationLabel }}
|
|
79
|
-
<span v-if="isRunning" class="text-[11px] text-
|
|
79
|
+
<span v-if="isRunning" class="text-[11px] text-dimmed">{{
|
|
80
80
|
t('panels.stepMeta.elapsed')
|
|
81
81
|
}}</span>
|
|
82
82
|
</p>
|
|
@@ -86,54 +86,54 @@ async function copyRunId() {
|
|
|
86
86
|
the elapsed clock above — a long, quiet phase keeps this small while elapsed climbs, so a
|
|
87
87
|
genuinely-active-but-quiet run reads apart from a wedged one. Only while actively running. -->
|
|
88
88
|
<div v-if="isRunning && activityAgoLabel" data-testid="step-activity">
|
|
89
|
-
<h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-
|
|
89
|
+
<h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
90
90
|
{{ t('panels.stepMeta.activity') }}
|
|
91
91
|
</h4>
|
|
92
|
-
<p class="flex items-center gap-1.5 text-[12px] tabular-nums text-
|
|
93
|
-
<span class="h-1.5 w-1.5 rounded-full bg-
|
|
92
|
+
<p class="flex items-center gap-1.5 text-[12px] tabular-nums text-toned">
|
|
93
|
+
<span class="h-1.5 w-1.5 rounded-full bg-app-success-400" />
|
|
94
94
|
{{ t('panels.stepMeta.activityAgo', { duration: activityAgoLabel }) }}
|
|
95
95
|
</p>
|
|
96
96
|
</div>
|
|
97
97
|
|
|
98
98
|
<div v-if="formatClock(step.startedAt)">
|
|
99
|
-
<h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-
|
|
99
|
+
<h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
100
100
|
{{ t('panels.stepMeta.started') }}
|
|
101
101
|
</h4>
|
|
102
|
-
<p class="text-[12px] text-
|
|
102
|
+
<p class="text-[12px] text-toned">{{ formatClock(step.startedAt) }}</p>
|
|
103
103
|
</div>
|
|
104
104
|
|
|
105
105
|
<div v-if="formatClock(step.finishedAt)">
|
|
106
|
-
<h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-
|
|
106
|
+
<h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
107
107
|
{{ t('panels.stepMeta.finished') }}
|
|
108
108
|
</h4>
|
|
109
|
-
<p class="text-[12px] text-
|
|
109
|
+
<p class="text-[12px] text-toned">{{ formatClock(step.finishedAt) }}</p>
|
|
110
110
|
</div>
|
|
111
111
|
|
|
112
112
|
<div v-if="step.model">
|
|
113
|
-
<h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-
|
|
113
|
+
<h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
114
114
|
{{ t('panels.stepMeta.model') }}
|
|
115
115
|
</h4>
|
|
116
|
-
<p class="break-all text-[12px] text-
|
|
116
|
+
<p class="break-all text-[12px] text-toned" :title="step.model">
|
|
117
117
|
{{ modelLabel ?? step.model }}
|
|
118
118
|
</p>
|
|
119
119
|
</div>
|
|
120
120
|
|
|
121
121
|
<div v-if="promptVariant">
|
|
122
|
-
<h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-
|
|
122
|
+
<h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
123
123
|
{{ t('panels.stepMeta.promptVariant') }}
|
|
124
124
|
</h4>
|
|
125
|
-
<p class="break-all text-[12px] text-
|
|
126
|
-
<p v-if="promptVariant.note" class="mt-0.5 text-[11px] text-
|
|
125
|
+
<p class="break-all text-[12px] text-toned">{{ promptVariant.label }}</p>
|
|
126
|
+
<p v-if="promptVariant.note" class="mt-0.5 text-[11px] text-app-warning-400/80">
|
|
127
127
|
{{ promptVariant.note }}
|
|
128
128
|
</p>
|
|
129
129
|
</div>
|
|
130
130
|
|
|
131
131
|
<div v-if="runId">
|
|
132
|
-
<h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-
|
|
132
|
+
<h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
133
133
|
{{ t('panels.stepMeta.run') }}
|
|
134
134
|
</h4>
|
|
135
135
|
<p
|
|
136
|
-
class="cursor-pointer break-all font-mono text-[12px] text-
|
|
136
|
+
class="cursor-pointer break-all font-mono text-[12px] text-muted hover:text-default"
|
|
137
137
|
:title="t('panels.stepMeta.clickToCopy', { id: runId })"
|
|
138
138
|
@click="copyRunId"
|
|
139
139
|
>
|
|
@@ -15,11 +15,16 @@ const LABELS: Record<RequirementVerdictStatus, string> = {
|
|
|
15
15
|
|
|
16
16
|
describe('resolveVerdictMeta', () => {
|
|
17
17
|
it('resolves each known status to its own label and colour', () => {
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
// A verdict is a status, so its dot takes the semantic alias: it recolours with the theme
|
|
19
|
+
// and stays distinct from the category hues an agent kind wears.
|
|
20
|
+
expect(resolveVerdictMeta('met', LABELS)).toEqual({ label: 'Met', color: 'var(--ui-success)' })
|
|
21
|
+
expect(resolveVerdictMeta('not_met', LABELS)).toEqual({
|
|
22
|
+
label: 'Not met',
|
|
23
|
+
color: 'var(--ui-error)',
|
|
24
|
+
})
|
|
20
25
|
expect(resolveVerdictMeta('not_covered', LABELS)).toEqual({
|
|
21
26
|
label: 'Not checked',
|
|
22
|
-
color: '
|
|
27
|
+
color: 'var(--ui-text-muted)',
|
|
23
28
|
})
|
|
24
29
|
})
|
|
25
30
|
|
|
@@ -20,13 +20,13 @@ export interface VerdictMeta {
|
|
|
20
20
|
* exists to prevent. Amber is the same "attention, but not a failure" tone the panel's severity
|
|
21
21
|
* scale already uses for `medium`.
|
|
22
22
|
*/
|
|
23
|
-
export const UNKNOWN_VERDICT_COLOR = '
|
|
23
|
+
export const UNKNOWN_VERDICT_COLOR = 'var(--ui-warning)'
|
|
24
24
|
|
|
25
25
|
/** Dot colour per known verdict. Exhaustive over the closed union (drift guard tier 2). */
|
|
26
26
|
export const VERDICT_COLORS: Record<RequirementVerdictStatus, string> = {
|
|
27
|
-
met: '
|
|
28
|
-
not_met: '
|
|
29
|
-
not_covered: '
|
|
27
|
+
met: 'var(--ui-success)',
|
|
28
|
+
not_met: 'var(--ui-error)',
|
|
29
|
+
not_covered: 'var(--ui-text-muted)',
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
/**
|
|
@@ -14,15 +14,15 @@ defineProps<{
|
|
|
14
14
|
const { t } = useI18n()
|
|
15
15
|
|
|
16
16
|
const SEVERITY_COLOR: Record<string, string> = {
|
|
17
|
-
low: '
|
|
18
|
-
medium: '
|
|
19
|
-
high: '
|
|
20
|
-
critical: '
|
|
17
|
+
low: 'var(--ui-text-muted)',
|
|
18
|
+
medium: 'var(--ui-warning)',
|
|
19
|
+
high: 'var(--app-hue-orange)',
|
|
20
|
+
critical: 'var(--ui-error)',
|
|
21
21
|
}
|
|
22
22
|
const OUTCOME_COLOR: Record<string, string> = {
|
|
23
|
-
passed: '
|
|
24
|
-
failed: '
|
|
25
|
-
skipped: '
|
|
23
|
+
passed: 'var(--ui-success)',
|
|
24
|
+
failed: 'var(--ui-error)',
|
|
25
|
+
skipped: 'var(--ui-text-muted)',
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
// Per-spec-requirement verdict labels, keyed by the requirement id the service's in-repo `spec/`
|
|
@@ -44,8 +44,8 @@ function verdictMeta(status: RequirementVerdictStatus): VerdictMeta {
|
|
|
44
44
|
<template>
|
|
45
45
|
<section class="mt-4 scroll-mt-4">
|
|
46
46
|
<div class="mb-2 flex items-center gap-1.5 text-[11px]">
|
|
47
|
-
<UIcon name="i-lucide-flask-conical" class="h-3.5 w-3.5 text-
|
|
48
|
-
<span class="font-semibold uppercase tracking-wide text-
|
|
47
|
+
<UIcon name="i-lucide-flask-conical" class="h-3.5 w-3.5 text-muted" />
|
|
48
|
+
<span class="font-semibold uppercase tracking-wide text-muted">
|
|
49
49
|
{{ t('panels.testReport.title') }}
|
|
50
50
|
</span>
|
|
51
51
|
<UBadge :color="report.greenlight ? 'success' : 'warning'" variant="subtle" size="sm">
|
|
@@ -53,7 +53,7 @@ function verdictMeta(status: RequirementVerdictStatus): VerdictMeta {
|
|
|
53
53
|
report.greenlight ? t('panels.testReport.greenlit') : t('panels.testReport.needsFixes')
|
|
54
54
|
}}
|
|
55
55
|
</UBadge>
|
|
56
|
-
<span v-if="phase && phase.attempts > 0" class="text-[11px] text-
|
|
56
|
+
<span v-if="phase && phase.attempts > 0" class="text-[11px] text-dimmed">
|
|
57
57
|
{{ t('panels.testReport.fixAttempts', { count: phase.attempts, max: phase.maxAttempts })
|
|
58
58
|
}}<span v-if="phase.phase === 'fixing'"> {{ t('panels.testReport.fixing') }}</span>
|
|
59
59
|
</span>
|
|
@@ -61,25 +61,25 @@ function verdictMeta(status: RequirementVerdictStatus): VerdictMeta {
|
|
|
61
61
|
<MarkdownProse
|
|
62
62
|
v-if="report.summary"
|
|
63
63
|
:text="report.summary"
|
|
64
|
-
class="mb-3 text-[13px] leading-relaxed text-
|
|
64
|
+
class="mb-3 text-[13px] leading-relaxed text-toned"
|
|
65
65
|
/>
|
|
66
66
|
|
|
67
67
|
<div v-if="report.tested.length" class="mb-3">
|
|
68
|
-
<div class="mb-1 text-[11px] text-
|
|
69
|
-
<ul class="space-y-0.5 text-[12px] text-
|
|
68
|
+
<div class="mb-1 text-[11px] text-dimmed">{{ t('panels.testReport.tested') }}</div>
|
|
69
|
+
<ul class="space-y-0.5 text-[12px] text-toned">
|
|
70
70
|
<li v-for="(item, i) in report.tested" :key="i">• {{ item }}</li>
|
|
71
71
|
</ul>
|
|
72
72
|
</div>
|
|
73
73
|
|
|
74
74
|
<div v-if="report.outcomes.length" class="mb-3 space-y-1">
|
|
75
|
-
<div class="text-[11px] text-
|
|
75
|
+
<div class="text-[11px] text-dimmed">{{ t('panels.testReport.outcomes') }}</div>
|
|
76
76
|
<div v-for="(o, i) in report.outcomes" :key="i" class="flex items-start gap-2 text-[12px]">
|
|
77
77
|
<span
|
|
78
78
|
class="mt-1 h-2 w-2 shrink-0 rounded-full"
|
|
79
|
-
:style="{ backgroundColor: OUTCOME_COLOR[o.status] ?? '
|
|
79
|
+
:style="{ backgroundColor: OUTCOME_COLOR[o.status] ?? 'var(--ui-text-muted)' }"
|
|
80
80
|
/>
|
|
81
|
-
<span class="text-
|
|
82
|
-
>{{ o.name }}<span v-if="o.detail" class="text-
|
|
81
|
+
<span class="text-toned"
|
|
82
|
+
>{{ o.name }}<span v-if="o.detail" class="text-dimmed"> — {{ o.detail }}</span></span
|
|
83
83
|
>
|
|
84
84
|
</div>
|
|
85
85
|
</div>
|
|
@@ -91,7 +91,7 @@ function verdictMeta(status: RequirementVerdictStatus): VerdictMeta {
|
|
|
91
91
|
class="mb-3 space-y-1"
|
|
92
92
|
data-testid="test-report-requirement-verdicts"
|
|
93
93
|
>
|
|
94
|
-
<div class="text-[11px] text-
|
|
94
|
+
<div class="text-[11px] text-dimmed">
|
|
95
95
|
{{ t('panels.testReport.requirementVerdicts.title') }}
|
|
96
96
|
</div>
|
|
97
97
|
<div
|
|
@@ -103,30 +103,30 @@ function verdictMeta(status: RequirementVerdictStatus): VerdictMeta {
|
|
|
103
103
|
class="mt-1 h-2 w-2 shrink-0 rounded-full"
|
|
104
104
|
:style="{ backgroundColor: verdictMeta(verdict.status).color }"
|
|
105
105
|
/>
|
|
106
|
-
<span class="text-
|
|
107
|
-
<span class="font-mono text-[11px] text-
|
|
108
|
-
<span class="text-
|
|
109
|
-
<span v-if="verdict.detail" class="text-
|
|
106
|
+
<span class="text-toned">
|
|
107
|
+
<span class="font-mono text-[11px] text-muted">{{ verdict.requirementId }}</span>
|
|
108
|
+
<span class="text-dimmed"> — {{ verdictMeta(verdict.status).label }}</span>
|
|
109
|
+
<span v-if="verdict.detail" class="text-dimmed"> · {{ verdict.detail }}</span>
|
|
110
110
|
</span>
|
|
111
111
|
</div>
|
|
112
112
|
</div>
|
|
113
113
|
|
|
114
114
|
<div v-if="report.concerns.length" class="space-y-1">
|
|
115
|
-
<div class="text-[11px] text-
|
|
115
|
+
<div class="text-[11px] text-dimmed">{{ t('panels.testReport.concerns') }}</div>
|
|
116
116
|
<div
|
|
117
117
|
v-for="(c, i) in report.concerns"
|
|
118
118
|
:key="i"
|
|
119
|
-
class="rounded border border-
|
|
119
|
+
class="rounded border border-muted/60 p-2 text-[12px]"
|
|
120
120
|
>
|
|
121
121
|
<div class="flex items-center gap-1.5">
|
|
122
122
|
<span
|
|
123
|
-
class="rounded px-1 text-[10px] font-semibold uppercase text-
|
|
124
|
-
:style="{ backgroundColor: SEVERITY_COLOR[c.severity] ?? '
|
|
123
|
+
class="rounded px-1 text-[10px] font-semibold uppercase text-highlighted"
|
|
124
|
+
:style="{ backgroundColor: SEVERITY_COLOR[c.severity] ?? 'var(--ui-text-muted)' }"
|
|
125
125
|
>{{ c.severity }}</span
|
|
126
126
|
>
|
|
127
|
-
<span class="font-medium text-
|
|
127
|
+
<span class="font-medium text-default">{{ c.title }}</span>
|
|
128
128
|
</div>
|
|
129
|
-
<MarkdownProse v-if="c.detail" :text="c.detail" class="mt-1 text-
|
|
129
|
+
<MarkdownProse v-if="c.detail" :text="c.detail" class="mt-1 text-muted" />
|
|
130
130
|
</div>
|
|
131
131
|
</div>
|
|
132
132
|
</section>
|
|
@@ -107,10 +107,10 @@ const drops = computed(() =>
|
|
|
107
107
|
<section
|
|
108
108
|
v-if="hasAny"
|
|
109
109
|
data-testid="step-tool-servers"
|
|
110
|
-
class="scroll-mt-4 rounded-xl border border-
|
|
110
|
+
class="scroll-mt-4 rounded-xl border border-default bg-default/50 p-4"
|
|
111
111
|
>
|
|
112
112
|
<div
|
|
113
|
-
class="mb-2 flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-
|
|
113
|
+
class="mb-2 flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-muted"
|
|
114
114
|
>
|
|
115
115
|
<UIcon name="i-lucide-plug" class="h-3.5 w-3.5" />
|
|
116
116
|
<span>{{ t('panels.stepDetail.toolServers.heading') }}</span>
|
|
@@ -119,7 +119,7 @@ const drops = computed(() =>
|
|
|
119
119
|
<p
|
|
120
120
|
v-if="dispatchedAs"
|
|
121
121
|
data-testid="step-tool-servers-dispatched-as"
|
|
122
|
-
class="mb-2 text-[12px] text-
|
|
122
|
+
class="mb-2 text-[12px] text-muted"
|
|
123
123
|
>
|
|
124
124
|
{{ t('panels.stepDetail.toolServers.dispatchedAs', { agent: dispatchedAs }) }}
|
|
125
125
|
</p>
|
|
@@ -133,8 +133,8 @@ const drops = computed(() =>
|
|
|
133
133
|
class="inline-flex items-center gap-1.5 rounded-full border px-2 py-0.5 text-[12px]"
|
|
134
134
|
:class="
|
|
135
135
|
server.isFault
|
|
136
|
-
? 'border-
|
|
137
|
-
: 'border-
|
|
136
|
+
? 'border-app-warning-500/30 bg-app-warning-500/10 text-app-warning-200'
|
|
137
|
+
: 'border-app-success-500/30 bg-app-success-500/10 text-app-success-200'
|
|
138
138
|
"
|
|
139
139
|
:title="
|
|
140
140
|
server.tools?.length
|
|
@@ -171,7 +171,7 @@ const drops = computed(() =>
|
|
|
171
171
|
v-for="server in unattributed"
|
|
172
172
|
:key="server.id"
|
|
173
173
|
data-testid="step-tool-server-unattributed"
|
|
174
|
-
class="flex items-start gap-1.5 text-[12px] text-
|
|
174
|
+
class="flex items-start gap-1.5 text-[12px] text-muted"
|
|
175
175
|
>
|
|
176
176
|
<UIcon name="i-lucide-circle-help" class="mt-0.5 h-3.5 w-3.5 shrink-0" />
|
|
177
177
|
<span>{{
|
|
@@ -185,12 +185,15 @@ const drops = computed(() =>
|
|
|
185
185
|
v-for="server in drops"
|
|
186
186
|
:key="server.id"
|
|
187
187
|
data-testid="step-tool-server-unavailable"
|
|
188
|
-
class="flex items-start gap-1.5 text-[12px] text-
|
|
188
|
+
class="flex items-start gap-1.5 text-[12px] text-toned"
|
|
189
189
|
>
|
|
190
|
-
<UIcon
|
|
190
|
+
<UIcon
|
|
191
|
+
name="i-lucide-plug-zap"
|
|
192
|
+
class="mt-0.5 h-3.5 w-3.5 shrink-0 text-app-warning-400/80"
|
|
193
|
+
/>
|
|
191
194
|
<span>
|
|
192
|
-
<span class="font-medium text-
|
|
193
|
-
<span class="text-
|
|
195
|
+
<span class="font-medium text-default">{{ server.label || server.id }}</span>
|
|
196
|
+
<span class="text-muted"> {{ server.reasonText }}</span>
|
|
194
197
|
<!--
|
|
195
198
|
Absent for a reason this build no longer recognises: it knows the code was recorded and
|
|
196
199
|
not what it meant, so there is no surface it can honestly send an operator to.
|
|
@@ -198,7 +201,7 @@ const drops = computed(() =>
|
|
|
198
201
|
<span
|
|
199
202
|
v-if="server.remedy"
|
|
200
203
|
data-testid="step-tool-server-remedy"
|
|
201
|
-
class="mt-0.5 block text-
|
|
204
|
+
class="mt-0.5 block text-dimmed"
|
|
202
205
|
>{{ server.remedy }}</span
|
|
203
206
|
>
|
|
204
207
|
</span>
|
|
@@ -15,7 +15,7 @@ const failed = computed(() => props.report.outcomes.filter((o) => !o.passed))
|
|
|
15
15
|
|
|
16
16
|
<template>
|
|
17
17
|
<div class="space-y-2" data-testid="step-validation-report">
|
|
18
|
-
<p class="text-[11px] text-
|
|
18
|
+
<p class="text-[11px] text-muted">
|
|
19
19
|
{{
|
|
20
20
|
report.passed
|
|
21
21
|
? t('panels.stepDetail.validation.passedSummary', {
|
|
@@ -34,20 +34,20 @@ const failed = computed(() => props.report.outcomes.filter((o) => !o.passed))
|
|
|
34
34
|
<div
|
|
35
35
|
v-for="outcome in report.outcomes"
|
|
36
36
|
:key="outcome.label"
|
|
37
|
-
class="rounded-md border border-
|
|
37
|
+
class="rounded-md border border-default bg-app-950/40 p-2"
|
|
38
38
|
data-testid="validation-outcome"
|
|
39
39
|
>
|
|
40
40
|
<div class="flex items-center gap-2">
|
|
41
41
|
<UIcon
|
|
42
42
|
:name="outcome.passed ? 'i-lucide-check' : 'i-lucide-x'"
|
|
43
43
|
class="h-3.5 w-3.5 shrink-0"
|
|
44
|
-
:class="outcome.passed ? 'text-
|
|
44
|
+
:class="outcome.passed ? 'text-app-success-400' : 'text-app-error-400'"
|
|
45
45
|
/>
|
|
46
|
-
<span class="text-[12px] font-medium text-
|
|
47
|
-
<span class="truncate font-mono text-[11px] text-
|
|
46
|
+
<span class="text-[12px] font-medium text-default">{{ outcome.label }}</span>
|
|
47
|
+
<span class="truncate font-mono text-[11px] text-dimmed">{{ outcome.command }}</span>
|
|
48
48
|
<span
|
|
49
49
|
v-if="!outcome.passed"
|
|
50
|
-
class="ms-auto shrink-0 rounded bg-
|
|
50
|
+
class="ms-auto shrink-0 rounded bg-app-error-500/15 px-1.5 py-0.5 text-[11px] tabular-nums text-app-error-300"
|
|
51
51
|
>
|
|
52
52
|
{{
|
|
53
53
|
outcome.timedOut
|
|
@@ -58,7 +58,7 @@ const failed = computed(() => props.report.outcomes.filter((o) => !o.passed))
|
|
|
58
58
|
</div>
|
|
59
59
|
<pre
|
|
60
60
|
v-if="outcome.outputTail"
|
|
61
|
-
class="mt-1.5 max-h-48 overflow-auto whitespace-pre-wrap break-words rounded bg-
|
|
61
|
+
class="mt-1.5 max-h-48 overflow-auto whitespace-pre-wrap break-words rounded bg-app-950 p-2 font-mono text-[11px] text-muted"
|
|
62
62
|
data-testid="validation-output"
|
|
63
63
|
>{{ outcome.outputTail }}</pre>
|
|
64
64
|
</div>
|
|
@@ -36,12 +36,12 @@ function addTask() {
|
|
|
36
36
|
<li
|
|
37
37
|
v-for="m in modules"
|
|
38
38
|
:key="m.id"
|
|
39
|
-
class="flex cursor-pointer items-center gap-2 rounded-md px-2 py-1 hover:bg-
|
|
39
|
+
class="flex cursor-pointer items-center gap-2 rounded-md px-2 py-1 hover:bg-elevated/60"
|
|
40
40
|
@click="ui.select(m.id)"
|
|
41
41
|
>
|
|
42
|
-
<UIcon name="i-lucide-package" class="h-3.5 w-3.5 text-
|
|
43
|
-
<span class="truncate text-xs text-
|
|
44
|
-
<span class="ms-auto text-[10px] text-
|
|
42
|
+
<UIcon name="i-lucide-package" class="h-3.5 w-3.5 text-app-secondary-400" />
|
|
43
|
+
<span class="truncate text-xs text-default">{{ m.title }}</span>
|
|
44
|
+
<span class="ms-auto text-[10px] text-dimmed">{{
|
|
45
45
|
t(
|
|
46
46
|
'inspector.container.taskCount',
|
|
47
47
|
{ count: board.tasksOf(m.id).length },
|
|
@@ -68,19 +68,19 @@ function addTask() {
|
|
|
68
68
|
<li
|
|
69
69
|
v-for="task in tasks"
|
|
70
70
|
:key="task.id"
|
|
71
|
-
class="flex cursor-pointer items-center gap-2 rounded-md px-2 py-1 hover:bg-
|
|
71
|
+
class="flex cursor-pointer items-center gap-2 rounded-md px-2 py-1 hover:bg-elevated/60"
|
|
72
72
|
@click="ui.select(task.id)"
|
|
73
73
|
>
|
|
74
74
|
<span
|
|
75
75
|
class="h-2 w-2 shrink-0 rounded-full"
|
|
76
76
|
:style="{ backgroundColor: STATUS_META[task.status].color }"
|
|
77
77
|
/>
|
|
78
|
-
<span class="truncate text-xs text-
|
|
79
|
-
<span class="ms-auto text-[10px] text-
|
|
78
|
+
<span class="truncate text-xs text-default">{{ task.title }}</span>
|
|
79
|
+
<span class="ms-auto text-[10px] text-dimmed">{{ STATUS_META[task.status].label }}</span>
|
|
80
80
|
</li>
|
|
81
81
|
</ul>
|
|
82
|
-
<div v-else class="text-[11px] text-
|
|
83
|
-
<p v-if="isFrame" class="text-[11px] text-
|
|
82
|
+
<div v-else class="text-[11px] text-dimmed">{{ t('inspector.container.noTasks') }}</div>
|
|
83
|
+
<p v-if="isFrame" class="text-[11px] text-dimmed">
|
|
84
84
|
{{ t('inspector.container.servicesHint') }}
|
|
85
85
|
</p>
|
|
86
86
|
</InspectorSection>
|
|
@@ -83,7 +83,7 @@ function detach(repoId: number) {
|
|
|
83
83
|
<template>
|
|
84
84
|
<div data-testid="doc-reference-repos">
|
|
85
85
|
<div class="mb-1 flex items-center justify-between">
|
|
86
|
-
<span class="text-[11px] font-semibold uppercase tracking-wide text-
|
|
86
|
+
<span class="text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
87
87
|
{{ t('inspector.referenceRepos.title') }}
|
|
88
88
|
</span>
|
|
89
89
|
</div>
|
|
@@ -133,11 +133,11 @@ function detach(repoId: number) {
|
|
|
133
133
|
/>
|
|
134
134
|
</template>
|
|
135
135
|
</UInputMenu>
|
|
136
|
-
<div v-else class="text-[11px] text-
|
|
136
|
+
<div v-else class="text-[11px] text-dimmed">
|
|
137
137
|
{{ t('inspector.referenceRepos.connectFirst') }}
|
|
138
138
|
</div>
|
|
139
139
|
|
|
140
|
-
<div class="mt-1 text-[11px] text-
|
|
140
|
+
<div class="mt-1 text-[11px] text-dimmed">
|
|
141
141
|
{{ t('inspector.referenceRepos.hint') }}
|
|
142
142
|
</div>
|
|
143
143
|
</div>
|