@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
|
@@ -140,22 +140,22 @@ const STATE_META = computed<Record<AgentState, { label: string; color: string; i
|
|
|
140
140
|
() => ({
|
|
141
141
|
pending: {
|
|
142
142
|
label: t('pipeline.progress.state.pending'),
|
|
143
|
-
color: '
|
|
143
|
+
color: 'var(--ui-text-muted)',
|
|
144
144
|
icon: 'i-lucide-circle-dashed',
|
|
145
145
|
},
|
|
146
146
|
working: {
|
|
147
147
|
label: t('pipeline.progress.state.working'),
|
|
148
|
-
color: '
|
|
148
|
+
color: 'var(--ui-primary)',
|
|
149
149
|
icon: 'i-lucide-loader',
|
|
150
150
|
},
|
|
151
151
|
waiting_decision: {
|
|
152
152
|
label: t('pipeline.progress.state.waiting_decision'),
|
|
153
|
-
color: '
|
|
153
|
+
color: 'var(--ui-warning)',
|
|
154
154
|
icon: 'i-lucide-circle-help',
|
|
155
155
|
},
|
|
156
156
|
done: {
|
|
157
157
|
label: t('pipeline.progress.state.done'),
|
|
158
|
-
color: '
|
|
158
|
+
color: 'var(--ui-success)',
|
|
159
159
|
icon: 'i-lucide-circle-check',
|
|
160
160
|
},
|
|
161
161
|
}),
|
|
@@ -267,21 +267,21 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
267
267
|
<template>
|
|
268
268
|
<div class="flex flex-col gap-5">
|
|
269
269
|
<!-- summary -->
|
|
270
|
-
<div class="rounded-xl border border-
|
|
270
|
+
<div class="rounded-xl border border-default bg-default/60 p-4">
|
|
271
271
|
<div class="flex flex-wrap items-center gap-3">
|
|
272
272
|
<UBadge :color="statusMeta.chip" variant="subtle">{{ statusMeta.label }}</UBadge>
|
|
273
|
-
<span class="text-sm text-
|
|
273
|
+
<span class="text-sm text-toned">
|
|
274
274
|
<i18n-t keypath="pipeline.progress.agentsComplete" tag="span" scope="global">
|
|
275
275
|
<template #completed>
|
|
276
|
-
<span class="font-semibold text-
|
|
276
|
+
<span class="font-semibold text-highlighted">{{ completedCount }}</span>
|
|
277
277
|
</template>
|
|
278
278
|
<template #total>{{ total }}</template>
|
|
279
279
|
</i18n-t>
|
|
280
280
|
</span>
|
|
281
|
-
<span v-if="currentAgent && instance.status === 'running'" class="text-xs text-
|
|
281
|
+
<span v-if="currentAgent && instance.status === 'running'" class="text-xs text-dimmed">
|
|
282
282
|
· {{ t('pipeline.progress.currently', { agent: currentAgent }) }}
|
|
283
283
|
</span>
|
|
284
|
-
<span class="ms-auto font-mono text-sm tabular-nums text-
|
|
284
|
+
<span class="ms-auto font-mono text-sm tabular-nums text-default">{{
|
|
285
285
|
t('pipeline.progress.percent', { value: overallPct })
|
|
286
286
|
}}</span>
|
|
287
287
|
</div>
|
|
@@ -292,7 +292,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
292
292
|
<span
|
|
293
293
|
v-for="l in legend"
|
|
294
294
|
:key="l.state"
|
|
295
|
-
class="inline-flex items-center gap-1.5 text-[11px] text-
|
|
295
|
+
class="inline-flex items-center gap-1.5 text-[11px] text-muted"
|
|
296
296
|
>
|
|
297
297
|
<span
|
|
298
298
|
class="h-2 w-2 rounded-full"
|
|
@@ -310,12 +310,12 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
310
310
|
<span
|
|
311
311
|
v-if="i < steps.length - 1"
|
|
312
312
|
class="absolute top-9 bottom-0 start-[17px] w-0.5 -translate-x-1/2"
|
|
313
|
-
:class="connectorDone(i) ? 'bg-
|
|
313
|
+
:class="connectorDone(i) ? 'bg-app-success-500/60' : 'bg-accented'"
|
|
314
314
|
/>
|
|
315
315
|
|
|
316
316
|
<!-- rail node -->
|
|
317
317
|
<span
|
|
318
|
-
class="relative z-10 flex h-9 w-9 shrink-0 items-center justify-center rounded-full border-2 bg-
|
|
318
|
+
class="relative z-10 flex h-9 w-9 shrink-0 items-center justify-center rounded-full border-2 bg-app-950"
|
|
319
319
|
:class="liveWorking(s) ? 'step-active' : ''"
|
|
320
320
|
:style="{ borderColor: stepVisual(s).color }"
|
|
321
321
|
>
|
|
@@ -332,8 +332,8 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
332
332
|
class="flex-1 rounded-xl border p-4 transition"
|
|
333
333
|
:class="[
|
|
334
334
|
i === instance.currentStep && instance.status !== 'done'
|
|
335
|
-
? 'border-
|
|
336
|
-
: 'border-
|
|
335
|
+
? 'border-primary/70 bg-default shadow-lg shadow-primary/10'
|
|
336
|
+
: 'border-default bg-default/50',
|
|
337
337
|
s.state === 'pending' ? 'opacity-60' : '',
|
|
338
338
|
]"
|
|
339
339
|
>
|
|
@@ -350,7 +350,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
350
350
|
>
|
|
351
351
|
<div
|
|
352
352
|
class="flex h-8 w-8 items-center justify-center rounded-lg"
|
|
353
|
-
:style="{ backgroundColor: agentKindMeta(s.agentKind).color
|
|
353
|
+
:style="{ backgroundColor: tint(agentKindMeta(s.agentKind).color) }"
|
|
354
354
|
>
|
|
355
355
|
<UIcon
|
|
356
356
|
:name="agentKindMeta(s.agentKind).icon"
|
|
@@ -360,26 +360,26 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
360
360
|
</div>
|
|
361
361
|
<div class="min-w-0">
|
|
362
362
|
<div class="flex items-center gap-1.5">
|
|
363
|
-
<span class="truncate text-sm font-semibold text-
|
|
363
|
+
<span class="truncate text-sm font-semibold text-highlighted">
|
|
364
364
|
{{ agentKindMeta(s.agentKind).label }}
|
|
365
365
|
</span>
|
|
366
366
|
<span
|
|
367
367
|
v-if="isCompanionKind(s.agentKind)"
|
|
368
|
-
class="shrink-0 rounded bg-
|
|
368
|
+
class="shrink-0 rounded bg-accented/60 px-1 text-[9px] font-medium uppercase tracking-wide text-toned"
|
|
369
369
|
:title="t('pipeline.progress.companionTooltip')"
|
|
370
370
|
>
|
|
371
371
|
{{ t('pipeline.progress.companion') }}
|
|
372
372
|
</span>
|
|
373
373
|
</div>
|
|
374
374
|
<div
|
|
375
|
-
class="flex items-center gap-1.5 text-[10px] uppercase tracking-wide text-
|
|
375
|
+
class="flex items-center gap-1.5 text-[10px] uppercase tracking-wide text-dimmed"
|
|
376
376
|
>
|
|
377
377
|
<span>{{ t('pipeline.progress.stepOf', { current: i + 1, total }) }}</span>
|
|
378
378
|
<!-- live elapsed clock: a running step counts up (so no-subtask steps
|
|
379
379
|
don't read as hung), a finished step shows its total duration -->
|
|
380
380
|
<span
|
|
381
381
|
v-if="stepElapsed(s)"
|
|
382
|
-
class="inline-flex items-center gap-0.5 font-mono normal-case tabular-nums text-
|
|
382
|
+
class="inline-flex items-center gap-0.5 font-mono normal-case tabular-nums text-muted"
|
|
383
383
|
:title="t('pipeline.progress.elapsedTooltip')"
|
|
384
384
|
>
|
|
385
385
|
<UIcon name="i-lucide-clock" class="h-2.5 w-2.5 shrink-0" />
|
|
@@ -443,7 +443,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
443
443
|
|
|
444
444
|
<UIcon
|
|
445
445
|
:name="stepHasOutput(s) ? 'i-lucide-book-open-text' : 'i-lucide-info'"
|
|
446
|
-
class="h-4 w-4 shrink-0 text-
|
|
446
|
+
class="h-4 w-4 shrink-0 text-dimmed transition-colors group-hover:text-primary"
|
|
447
447
|
/>
|
|
448
448
|
</div>
|
|
449
449
|
|
|
@@ -458,7 +458,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
458
458
|
<!-- container cold-boot phase: shown while the container is spinning up. -->
|
|
459
459
|
<div
|
|
460
460
|
v-if="s.container?.status === 'starting' && !runFailed"
|
|
461
|
-
class="mt-2 flex items-center gap-1.5 text-[11px] text-
|
|
461
|
+
class="mt-2 flex items-center gap-1.5 text-[11px] text-app-info-300"
|
|
462
462
|
>
|
|
463
463
|
<UIcon name="i-lucide-loader-circle" class="h-3.5 w-3.5 shrink-0 animate-spin" />
|
|
464
464
|
<span>{{ t('pipeline.progress.spinningUpContainer') }}</span>
|
|
@@ -468,7 +468,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
468
468
|
making calls) so the step isn't a blank "working" before subtasks appear. -->
|
|
469
469
|
<div
|
|
470
470
|
v-else-if="stepPhaseLabel(s) && !runFailed"
|
|
471
|
-
class="mt-2 flex items-center gap-1.5 text-[11px] text-
|
|
471
|
+
class="mt-2 flex items-center gap-1.5 text-[11px] text-app-success-300"
|
|
472
472
|
>
|
|
473
473
|
<UIcon name="i-lucide-box" class="h-3.5 w-3.5 shrink-0" />
|
|
474
474
|
<span>{{ stepPhaseLabel(s) }}</span>
|
|
@@ -488,7 +488,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
488
488
|
<div v-if="s.subtasks && s.subtasks.total > 0" class="mt-2">
|
|
489
489
|
<div
|
|
490
490
|
v-if="!prPhaseActive(s)"
|
|
491
|
-
class="flex items-center justify-between text-[10px] text-
|
|
491
|
+
class="flex items-center justify-between text-[10px] text-muted"
|
|
492
492
|
>
|
|
493
493
|
<span>
|
|
494
494
|
{{
|
|
@@ -497,14 +497,14 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
497
497
|
total: s.subtasks.total,
|
|
498
498
|
})
|
|
499
499
|
}}
|
|
500
|
-
<span v-if="s.subtasks.inProgress > 0" class="text-
|
|
500
|
+
<span v-if="s.subtasks.inProgress > 0" class="text-primary">
|
|
501
501
|
{{ t('pipeline.progress.subtasksInProgress', { count: s.subtasks.inProgress }) }}
|
|
502
502
|
</span>
|
|
503
503
|
</span>
|
|
504
504
|
</div>
|
|
505
|
-
<div class="mt-1 h-1 overflow-hidden rounded-full bg-
|
|
505
|
+
<div class="mt-1 h-1 overflow-hidden rounded-full bg-accented/60">
|
|
506
506
|
<div
|
|
507
|
-
class="h-full rounded-full bg-
|
|
507
|
+
class="h-full rounded-full bg-primary transition-all duration-500"
|
|
508
508
|
:style="{ width: `${(s.subtasks.completed / s.subtasks.total) * 100}%` }"
|
|
509
509
|
/>
|
|
510
510
|
</div>
|
|
@@ -518,10 +518,10 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
518
518
|
class="flex items-start gap-1.5 text-[11px]"
|
|
519
519
|
:class="
|
|
520
520
|
item.status === 'completed'
|
|
521
|
-
? 'text-
|
|
521
|
+
? 'text-dimmed line-through'
|
|
522
522
|
: item.status === 'in_progress'
|
|
523
|
-
? 'text-
|
|
524
|
-
: 'text-
|
|
523
|
+
? 'text-app-100'
|
|
524
|
+
: 'text-muted'
|
|
525
525
|
"
|
|
526
526
|
>
|
|
527
527
|
<UIcon
|
|
@@ -537,7 +537,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
537
537
|
<!-- model used for this step -->
|
|
538
538
|
<p
|
|
539
539
|
v-if="s.model"
|
|
540
|
-
class="mt-2 flex items-center gap-1 truncate text-[10px] text-
|
|
540
|
+
class="mt-2 flex items-center gap-1 truncate text-[10px] text-dimmed"
|
|
541
541
|
:title="s.model"
|
|
542
542
|
>
|
|
543
543
|
<UIcon name="i-lucide-cpu" class="h-3 w-3 shrink-0" />
|
|
@@ -557,10 +557,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
557
557
|
|
|
558
558
|
<!-- A one-line hint that the agent produced prose; the full output (and
|
|
559
559
|
all step metadata) lives in the step-detail overlay opened by click. -->
|
|
560
|
-
<p
|
|
561
|
-
v-if="stepHasOutput(s)"
|
|
562
|
-
class="mt-2 flex items-center gap-1 text-[11px] text-slate-500"
|
|
563
|
-
>
|
|
560
|
+
<p v-if="stepHasOutput(s)" class="mt-2 flex items-center gap-1 text-[11px] text-dimmed">
|
|
564
561
|
<UIcon name="i-lucide-book-open-text" class="h-3 w-3 shrink-0" />
|
|
565
562
|
{{ t('pipeline.progress.clickToRead') }}
|
|
566
563
|
</p>
|
|
@@ -570,7 +567,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
570
567
|
which reads as a tester that silently did its job. -->
|
|
571
568
|
<p
|
|
572
569
|
v-if="stepSkipReasonKey(s)"
|
|
573
|
-
class="mt-2 flex items-center gap-1 text-[11px] text-
|
|
570
|
+
class="mt-2 flex items-center gap-1 text-[11px] text-dimmed"
|
|
574
571
|
data-testid="step-skip-reason"
|
|
575
572
|
>
|
|
576
573
|
<UIcon name="i-lucide-skip-forward" class="h-3 w-3 shrink-0" />
|
|
@@ -581,7 +578,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
581
578
|
sub-node marked possible / running / completed / skipped. -->
|
|
582
579
|
<div
|
|
583
580
|
v-if="companionByStep[i]"
|
|
584
|
-
class="mt-3 flex items-center gap-2 rounded-lg border border-dashed border-
|
|
581
|
+
class="mt-3 flex items-center gap-2 rounded-lg border border-dashed border-muted/70 bg-default/40 px-2.5 py-1.5"
|
|
585
582
|
>
|
|
586
583
|
<span
|
|
587
584
|
class="flex h-6 w-6 shrink-0 items-center justify-center rounded-md border"
|
|
@@ -596,9 +593,9 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
596
593
|
]"
|
|
597
594
|
/>
|
|
598
595
|
</span>
|
|
599
|
-
<span class="min-w-0 flex-1 truncate text-[12px] text-
|
|
596
|
+
<span class="min-w-0 flex-1 truncate text-[12px] text-toned">
|
|
600
597
|
{{ agentKindMeta(companionByStep[i]!.kind).label }}
|
|
601
|
-
<span class="text-
|
|
598
|
+
<span class="text-dimmed">{{ t('pipeline.progress.companionSuffix') }}</span>
|
|
602
599
|
</span>
|
|
603
600
|
<span
|
|
604
601
|
class="shrink-0 text-[11px] font-medium"
|
|
@@ -614,26 +611,26 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
614
611
|
<button
|
|
615
612
|
v-if="s.followUps?.enabled"
|
|
616
613
|
type="button"
|
|
617
|
-
class="mt-3 flex w-full items-center gap-2 rounded-lg border border-dashed px-2.5 py-1.5 text-start transition hover:border-pink
|
|
614
|
+
class="mt-3 flex w-full items-center gap-2 rounded-lg border border-dashed px-2.5 py-1.5 text-start transition hover:border-app-hue-pink/60"
|
|
618
615
|
:class="
|
|
619
616
|
followUpPending(s) > 0
|
|
620
|
-
? 'border-pink
|
|
621
|
-
: 'border-
|
|
617
|
+
? 'border-app-hue-pink/50 bg-app-hue-pink/10 followup-blink'
|
|
618
|
+
: 'border-muted/70 bg-default/40'
|
|
622
619
|
"
|
|
623
620
|
@click="ui.openFollowUps(instance.id, i)"
|
|
624
621
|
>
|
|
625
622
|
<span
|
|
626
|
-
class="flex h-6 w-6 shrink-0 items-center justify-center rounded-md border border-pink
|
|
623
|
+
class="flex h-6 w-6 shrink-0 items-center justify-center rounded-md border border-app-hue-pink/40 bg-app-hue-pink/15"
|
|
627
624
|
>
|
|
628
|
-
<UIcon :name="FOLLOW_UP_COMPANION_META.icon" class="h-3 w-3 text-pink
|
|
625
|
+
<UIcon :name="FOLLOW_UP_COMPANION_META.icon" class="h-3 w-3 text-app-hue-pink" />
|
|
629
626
|
</span>
|
|
630
|
-
<span class="min-w-0 flex-1 truncate text-[12px] text-
|
|
627
|
+
<span class="min-w-0 flex-1 truncate text-[12px] text-toned">
|
|
631
628
|
{{ FOLLOW_UP_COMPANION_META.label }}
|
|
632
|
-
<span class="text-
|
|
629
|
+
<span class="text-dimmed">{{ t('pipeline.progress.companionSuffix') }}</span>
|
|
633
630
|
</span>
|
|
634
631
|
<span
|
|
635
632
|
class="shrink-0 text-[11px] font-medium"
|
|
636
|
-
:class="followUpPending(s) > 0 ? 'text-pink
|
|
633
|
+
:class="followUpPending(s) > 0 ? 'text-app-hue-pink' : 'text-muted'"
|
|
637
634
|
>
|
|
638
635
|
{{ followUpLabel(s) }}
|
|
639
636
|
</span>
|
|
@@ -646,27 +643,27 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
646
643
|
type="button"
|
|
647
644
|
data-testid="fork-decision-open"
|
|
648
645
|
:data-fork-phase="forkPhase(s)"
|
|
649
|
-
class="mt-3 flex w-full items-center gap-2 rounded-lg border border-dashed px-2.5 py-1.5 text-start transition hover:border-
|
|
646
|
+
class="mt-3 flex w-full items-center gap-2 rounded-lg border border-dashed px-2.5 py-1.5 text-start transition hover:border-app-secondary-400/60"
|
|
650
647
|
:class="
|
|
651
648
|
forkPhase(s) === 'awaiting_choice'
|
|
652
|
-
? 'border-
|
|
653
|
-
: 'border-
|
|
649
|
+
? 'border-app-secondary-500/50 bg-app-secondary-500/10 followup-blink'
|
|
650
|
+
: 'border-muted/70 bg-default/40'
|
|
654
651
|
"
|
|
655
652
|
:disabled="forkPhase(s) === 'proposing'"
|
|
656
653
|
@click="ui.openForkDecision(instance.id, i)"
|
|
657
654
|
>
|
|
658
655
|
<span
|
|
659
|
-
class="flex h-6 w-6 shrink-0 items-center justify-center rounded-md border border-
|
|
656
|
+
class="flex h-6 w-6 shrink-0 items-center justify-center rounded-md border border-app-secondary-500/40 bg-app-secondary-500/15"
|
|
660
657
|
>
|
|
661
658
|
<UIcon
|
|
662
659
|
:name="
|
|
663
660
|
forkPhase(s) === 'proposing' ? 'i-lucide-loader-circle' : FORK_DECISION_META.icon
|
|
664
661
|
"
|
|
665
|
-
class="h-3 w-3 text-
|
|
662
|
+
class="h-3 w-3 text-app-secondary-300"
|
|
666
663
|
:class="forkPhase(s) === 'proposing' ? 'animate-spin' : ''"
|
|
667
664
|
/>
|
|
668
665
|
</span>
|
|
669
|
-
<span class="min-w-0 flex-1 truncate text-[12px] text-
|
|
666
|
+
<span class="min-w-0 flex-1 truncate text-[12px] text-toned">
|
|
670
667
|
{{
|
|
671
668
|
forkPhase(s) === 'proposing'
|
|
672
669
|
? t('pipeline.progress.forkDecision.proposing')
|
|
@@ -682,15 +679,15 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
682
679
|
v-if="prReviewAwaiting(s)"
|
|
683
680
|
type="button"
|
|
684
681
|
data-testid="pr-review-open"
|
|
685
|
-
class="mt-3 flex w-full items-center gap-2 rounded-lg border border-dashed border-
|
|
682
|
+
class="mt-3 flex w-full items-center gap-2 rounded-lg border border-dashed border-primary/50 bg-primary/10 px-2.5 py-1.5 text-start transition followup-blink hover:border-primary/60"
|
|
686
683
|
@click="ui.openPrReview(instance.id, i)"
|
|
687
684
|
>
|
|
688
685
|
<span
|
|
689
|
-
class="flex h-6 w-6 shrink-0 items-center justify-center rounded-md border border-
|
|
686
|
+
class="flex h-6 w-6 shrink-0 items-center justify-center rounded-md border border-primary/40 bg-primary/15"
|
|
690
687
|
>
|
|
691
|
-
<UIcon name="i-lucide-clipboard-check" class="h-3 w-3 text-
|
|
688
|
+
<UIcon name="i-lucide-clipboard-check" class="h-3 w-3 text-primary" />
|
|
692
689
|
</span>
|
|
693
|
-
<span class="min-w-0 flex-1 truncate text-[12px] text-
|
|
690
|
+
<span class="min-w-0 flex-1 truncate text-[12px] text-toned">
|
|
694
691
|
{{ t('pipeline.progress.prReview.review') }}
|
|
695
692
|
</span>
|
|
696
693
|
</button>
|
|
@@ -704,18 +701,18 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
704
701
|
v-if="candidatesAwaiting(s)"
|
|
705
702
|
type="button"
|
|
706
703
|
data-testid="binary-candidates-open"
|
|
707
|
-
class="mt-3 flex w-full items-center gap-2 rounded-lg border border-dashed border-cyan
|
|
704
|
+
class="mt-3 flex w-full items-center gap-2 rounded-lg border border-dashed border-app-hue-cyan/50 bg-app-hue-cyan/10 px-2.5 py-1.5 text-start transition followup-blink hover:border-app-hue-cyan/60"
|
|
708
705
|
@click="ui.openBinaryCandidates(instance.id, i)"
|
|
709
706
|
>
|
|
710
707
|
<span
|
|
711
|
-
class="flex h-6 w-6 shrink-0 items-center justify-center rounded-md border border-cyan
|
|
708
|
+
class="flex h-6 w-6 shrink-0 items-center justify-center rounded-md border border-app-hue-cyan/40 bg-app-hue-cyan/15"
|
|
712
709
|
>
|
|
713
710
|
<UIcon
|
|
714
711
|
:name="REDIRECT_PARK_PRESENTATION['binary-candidates'].icon"
|
|
715
|
-
class="h-3 w-3 text-cyan
|
|
712
|
+
class="h-3 w-3 text-app-hue-cyan"
|
|
716
713
|
/>
|
|
717
714
|
</span>
|
|
718
|
-
<span class="min-w-0 flex-1 truncate text-[12px] text-
|
|
715
|
+
<span class="min-w-0 flex-1 truncate text-[12px] text-toned">
|
|
719
716
|
{{ t('pipeline.progress.binaryCandidates.choose') }}
|
|
720
717
|
</span>
|
|
721
718
|
</button>
|
|
@@ -724,7 +721,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
724
721
|
NOT a "Review & approve" gate (the human is summoned only if needed) -->
|
|
725
722
|
<div
|
|
726
723
|
v-if="reviewStageLabel(s.agentKind)"
|
|
727
|
-
class="mt-3 inline-flex items-center gap-1 text-[11px] text-
|
|
724
|
+
class="mt-3 inline-flex items-center gap-1 text-[11px] text-primary"
|
|
728
725
|
>
|
|
729
726
|
<UIcon name="i-lucide-loader-circle" class="h-3 w-3 animate-spin" />
|
|
730
727
|
{{ reviewStageLabel(s.agentKind) }}
|
|
@@ -769,7 +766,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
769
766
|
</div>
|
|
770
767
|
<p
|
|
771
768
|
v-else-if="s.decision?.chosen"
|
|
772
|
-
class="mt-2 flex items-center gap-1 truncate text-[11px] text-
|
|
769
|
+
class="mt-2 flex items-center gap-1 truncate text-[11px] text-app-success-400"
|
|
773
770
|
:title="s.decision.chosen"
|
|
774
771
|
>
|
|
775
772
|
<UIcon name="i-lucide-check" class="h-3 w-3 shrink-0" />
|
|
@@ -782,14 +779,14 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
782
779
|
</template>
|
|
783
780
|
|
|
784
781
|
<style scoped>
|
|
785
|
-
/* Soft
|
|
782
|
+
/* Soft primary halo around the rail node of the actively-working step. */
|
|
786
783
|
@keyframes step-pulse {
|
|
787
784
|
0%,
|
|
788
785
|
100% {
|
|
789
|
-
box-shadow: 0 0 0 0
|
|
786
|
+
box-shadow: 0 0 0 0 color-mix(in srgb, var(--ui-primary) 50%, transparent);
|
|
790
787
|
}
|
|
791
788
|
50% {
|
|
792
|
-
box-shadow: 0 0 0 6px
|
|
789
|
+
box-shadow: 0 0 0 6px transparent;
|
|
793
790
|
}
|
|
794
791
|
}
|
|
795
792
|
.step-active {
|
|
@@ -800,10 +797,10 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
800
797
|
@keyframes followup-blink {
|
|
801
798
|
0%,
|
|
802
799
|
100% {
|
|
803
|
-
box-shadow: 0 0 0 0
|
|
800
|
+
box-shadow: 0 0 0 0 color-mix(in srgb, var(--app-hue-pink) 50%, transparent);
|
|
804
801
|
}
|
|
805
802
|
50% {
|
|
806
|
-
box-shadow: 0 0 0 5px
|
|
803
|
+
box-shadow: 0 0 0 5px transparent;
|
|
807
804
|
}
|
|
808
805
|
}
|
|
809
806
|
.followup-blink {
|
|
@@ -23,12 +23,12 @@ const phase = computed(() => prReviewPhase(props.step.prReview, props.step.subta
|
|
|
23
23
|
// working (suppressed on a failed run). `awaiting` is the parked "findings ready" state — a
|
|
24
24
|
// steady amber prompt, not a spinner.
|
|
25
25
|
const PHASE_META: Record<PrReviewPhaseKind, { icon: string; spin: boolean; class: string }> = {
|
|
26
|
-
planning: { icon: 'i-lucide-loader-circle', spin: true, class: 'text-
|
|
27
|
-
reviewing: { icon: 'i-lucide-loader-circle', spin: true, class: 'text-
|
|
28
|
-
awaiting: { icon: 'i-lucide-clipboard-check', spin: false, class: 'text-
|
|
29
|
-
challenging: { icon: 'i-lucide-gavel', spin: true, class: 'text-
|
|
30
|
-
fixing: { icon: 'i-lucide-wrench', spin: true, class: 'text-
|
|
31
|
-
posting: { icon: 'i-lucide-send', spin: true, class: 'text-
|
|
26
|
+
planning: { icon: 'i-lucide-loader-circle', spin: true, class: 'text-primary' },
|
|
27
|
+
reviewing: { icon: 'i-lucide-loader-circle', spin: true, class: 'text-primary' },
|
|
28
|
+
awaiting: { icon: 'i-lucide-clipboard-check', spin: false, class: 'text-app-warning-300' },
|
|
29
|
+
challenging: { icon: 'i-lucide-gavel', spin: true, class: 'text-primary' },
|
|
30
|
+
fixing: { icon: 'i-lucide-wrench', spin: true, class: 'text-primary' },
|
|
31
|
+
posting: { icon: 'i-lucide-send', spin: true, class: 'text-primary' },
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
// Phase → i18n key. Exhaustive Record over the phase-kind union, so adding a kind without a
|
|
@@ -62,7 +62,7 @@ const spinning = computed(
|
|
|
62
62
|
v-if="phase && label"
|
|
63
63
|
data-testid="pr-review-phase"
|
|
64
64
|
class="inline-flex items-center gap-1"
|
|
65
|
-
:class="runFailed ? 'text-
|
|
65
|
+
:class="runFailed ? 'text-app-error-400' : PHASE_META[phase.kind].class"
|
|
66
66
|
>
|
|
67
67
|
<UIcon
|
|
68
68
|
:name="runFailed ? 'i-lucide-circle-x' : PHASE_META[phase.kind].icon"
|