@cat-factory/app 0.302.1 → 0.303.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/README.md +16 -0
  2. package/app/app.config.ts +19 -10
  3. package/app/assets/css/main.css +13 -13
  4. package/app/assets/css/prose.css +22 -22
  5. package/app/assets/css/tokens.css +298 -0
  6. package/app/components/assistant/AssistantModal.vue +22 -22
  7. package/app/components/auth/AuthGate.vue +1 -1
  8. package/app/components/auth/BackendMisconfiguredScreen.vue +10 -10
  9. package/app/components/auth/LoginScreen.vue +34 -36
  10. package/app/components/auth/ResetPasswordScreen.vue +12 -12
  11. package/app/components/auth/UserMenu.vue +4 -4
  12. package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +27 -25
  13. package/app/components/binaryOutput/BinaryOutputReport.vue +15 -15
  14. package/app/components/binaryOutput/StoredAssetView.vue +5 -5
  15. package/app/components/board/AddTaskModal.vue +17 -20
  16. package/app/components/board/AgentFailureCard.vue +11 -11
  17. package/app/components/board/AgentFailureHistory.vue +2 -2
  18. package/app/components/board/BoardCanvas.vue +6 -5
  19. package/app/components/board/CreateInitiativeModal.vue +8 -10
  20. package/app/components/board/DependencyConnectOverlay.vue +1 -1
  21. package/app/components/board/FailureHistoryList.vue +7 -7
  22. package/app/components/board/RecurringPipelineModal.vue +17 -17
  23. package/app/components/board/ReviewFrictionDialog.vue +6 -6
  24. package/app/components/board/StepExecutionHistory.vue +13 -13
  25. package/app/components/board/TaskDependencyEdges.vue +8 -8
  26. package/app/components/board/nodes/AgentChip.vue +10 -10
  27. package/app/components/board/nodes/BlockNode.vue +29 -29
  28. package/app/components/board/nodes/DecisionBadge.vue +2 -2
  29. package/app/components/board/nodes/EpicNode.vue +14 -10
  30. package/app/components/board/nodes/FrameSwimlanes.vue +7 -9
  31. package/app/components/board/nodes/InitiativeCard.vue +8 -8
  32. package/app/components/board/nodes/LaneGroup.vue +1 -1
  33. package/app/components/board/nodes/LaneTask.vue +2 -2
  34. package/app/components/board/nodes/ResizeGrips.vue +4 -4
  35. package/app/components/board/nodes/TaskCard.vue +18 -18
  36. package/app/components/board/nodes/TaskLane.vue +5 -5
  37. package/app/components/board/nodes/TaskPipelineMini.vue +18 -18
  38. package/app/components/bootstrap/AdoptionReviewModal.vue +29 -26
  39. package/app/components/bootstrap/BootstrapModal.vue +21 -23
  40. package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
  41. package/app/components/brainstorm/BrainstormWindow.vue +30 -33
  42. package/app/components/bugFishing/BugFishingWindow.vue +49 -49
  43. package/app/components/clarity/ClarityReviewWindow.vue +30 -30
  44. package/app/components/common/AsyncViewError.vue +5 -5
  45. package/app/components/common/ClarificationItem.vue +8 -13
  46. package/app/components/common/ConfirmDialog.vue +4 -2
  47. package/app/components/common/DescriptorFields.vue +1 -1
  48. package/app/components/common/EmptyState.vue +3 -3
  49. package/app/components/common/InterviewGateNotice.vue +7 -7
  50. package/app/components/common/KeyboardShortcutsHelp.vue +1 -1
  51. package/app/components/common/MarkdownProse.vue +14 -13
  52. package/app/components/consensus/ConsensusSessionWindow.vue +26 -26
  53. package/app/components/context/ContextAttachmentFields.vue +17 -17
  54. package/app/components/docs/DocInterviewWindow.vue +14 -14
  55. package/app/components/documents/ContextDocumentPicker.vue +17 -17
  56. package/app/components/documents/DocumentImportModal.vue +7 -7
  57. package/app/components/documents/DocumentSourceConnectModal.vue +3 -3
  58. package/app/components/documents/DocumentSyncState.vue +5 -5
  59. package/app/components/documents/DocumentTemplatesModal.vue +15 -15
  60. package/app/components/documents/RepoContextDocPicker.vue +5 -5
  61. package/app/components/documents/SpawnPreviewModal.vue +12 -12
  62. package/app/components/documents/StartFromDesignModal.vue +11 -11
  63. package/app/components/documents/TaskContextDocs.vue +5 -5
  64. package/app/components/environments/EnvSetupStepper.vue +6 -6
  65. package/app/components/environments/EnvironmentStatusPanel.vue +17 -17
  66. package/app/components/environments/steps/EnvPickStep.vue +3 -3
  67. package/app/components/environments/steps/EnvPreflightStep.vue +9 -9
  68. package/app/components/environments/steps/EnvReviewStep.vue +25 -22
  69. package/app/components/environments/steps/EnvSaveStep.vue +7 -5
  70. package/app/components/environments/steps/JourneyStepNav.vue +1 -1
  71. package/app/components/focus/BlockFocusView.vue +17 -19
  72. package/app/components/followUp/FollowUpWindow.vue +23 -23
  73. package/app/components/forkDecision/ForkDecisionWindow.vue +37 -39
  74. package/app/components/foundational/FoundationalContractSummary.vue +7 -7
  75. package/app/components/foundational/FoundationalServiceCatalogList.vue +11 -11
  76. package/app/components/foundational/FoundationalServiceManager.vue +1 -1
  77. package/app/components/foundational/FoundationalServiceRegistry.vue +13 -13
  78. package/app/components/foundational/FoundationalServiceSources.vue +13 -13
  79. package/app/components/foundational/FoundationalSuppressions.vue +7 -7
  80. package/app/components/foundational/ServiceCatalogConnection.vue +10 -10
  81. package/app/components/fragments/FragmentLibraryManager.vue +41 -44
  82. package/app/components/fragments/FragmentSelector.vue +13 -13
  83. package/app/components/fragments/GitHubDocUrlImport.vue +1 -1
  84. package/app/components/gates/GateFailingCheckList.vue +5 -5
  85. package/app/components/gates/GateResultView.vue +50 -47
  86. package/app/components/github/AddServiceFromRepoModal.vue +14 -14
  87. package/app/components/github/BranchProtectionPreflight.vue +13 -13
  88. package/app/components/github/GitHubConnect.vue +7 -7
  89. package/app/components/github/GitHubOnboarding.vue +7 -7
  90. package/app/components/github/GitHubPanel.vue +37 -40
  91. package/app/components/github/RepoTreeBrowser.vue +18 -18
  92. package/app/components/humanTest/HumanTestWindow.vue +30 -33
  93. package/app/components/initiative/InitiativePlanNotice.vue +5 -5
  94. package/app/components/initiative/InitiativePlanReview.vue +27 -29
  95. package/app/components/initiative/InitiativePlanningWindow.vue +10 -10
  96. package/app/components/initiative/InitiativeTrackerWindow.vue +71 -65
  97. package/app/components/inputGate/InputGateNotice.vue +2 -4
  98. package/app/components/judge/JudgeResultView.vue +30 -32
  99. package/app/components/kaizen/KaizenPanel.vue +40 -36
  100. package/app/components/kaizen/KaizenStepStatus.vue +21 -21
  101. package/app/components/layout/AccountAuditLog.vue +10 -10
  102. package/app/components/layout/AccountDeploymentSettings.vue +20 -20
  103. package/app/components/layout/AccountFailureKindRules.vue +13 -13
  104. package/app/components/layout/AccountFoundationalSettings.vue +1 -1
  105. package/app/components/layout/AccountFragmentSettings.vue +1 -1
  106. package/app/components/layout/AccountModelPolicySettings.vue +9 -9
  107. package/app/components/layout/AccountPlatformAlertSettings.vue +11 -11
  108. package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
  109. package/app/components/layout/AccountRunCredentialSettings.vue +5 -5
  110. package/app/components/layout/AccountSkillSettings.vue +1 -1
  111. package/app/components/layout/AccountTeamSettings.vue +23 -15
  112. package/app/components/layout/AiProvidersBanner.vue +11 -8
  113. package/app/components/layout/AppearanceSwitcher.vue +108 -0
  114. package/app/components/layout/BoardSwitcher.vue +8 -11
  115. package/app/components/layout/BoardToolbar.vue +3 -3
  116. package/app/components/layout/CommandBar.vue +7 -9
  117. package/app/components/layout/ConnectionStatusBanner.vue +2 -2
  118. package/app/components/layout/DefaultTestEnvBanner.vue +5 -5
  119. package/app/components/layout/GitHubPatBanner.vue +5 -5
  120. package/app/components/layout/GitHubPatPermissionsBanner.vue +16 -10
  121. package/app/components/layout/InfraSetupBanner.vue +6 -6
  122. package/app/components/layout/IntegrationsHub.vue +15 -15
  123. package/app/components/layout/LanguageSwitcher.vue +5 -5
  124. package/app/components/layout/ModelProvidersHub.vue +13 -16
  125. package/app/components/layout/NotificationsInbox.vue +10 -10
  126. package/app/components/layout/PersonalSetupModal.vue +8 -8
  127. package/app/components/layout/ProviderConfigBanner.vue +4 -4
  128. package/app/components/layout/RolePrompt.vue +7 -7
  129. package/app/components/layout/SideBar.vue +6 -4
  130. package/app/components/layout/SpendWarningBanner.vue +17 -14
  131. package/app/components/layout/TranslationWarningBanner.vue +4 -4
  132. package/app/components/layout/UiModeSwitcher.vue +13 -13
  133. package/app/components/layout/UiRoleSwitcher.vue +8 -8
  134. package/app/components/layout/WorkspaceMembersSettings.vue +15 -11
  135. package/app/components/media/ArtifactLightbox.vue +13 -13
  136. package/app/components/media/ImageCompare.vue +31 -24
  137. package/app/components/merge/MergeEffortChips.vue +2 -2
  138. package/app/components/notifications/NotificationSettingsPanel.vue +14 -12
  139. package/app/components/observability/OutcomeFilterChips.vue +6 -6
  140. package/app/components/observability/RunFailureSummary.vue +28 -25
  141. package/app/components/observability/StepMetricsBar.vue +26 -28
  142. package/app/components/observability/StepModelActivity.vue +2 -2
  143. package/app/components/observability/ToolCallList.vue +24 -24
  144. package/app/components/outcome/OutcomeSummaryWindow.vue +47 -47
  145. package/app/components/palettes/AgentPalette.vue +8 -8
  146. package/app/components/palettes/AgentTierSelect.vue +1 -1
  147. package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
  148. package/app/components/panels/AgentStepDetail.vue +52 -51
  149. package/app/components/panels/AttemptEntryHeader.vue +4 -6
  150. package/app/components/panels/DecisionModal.vue +7 -7
  151. package/app/components/panels/GenericStructuredResultView.vue +7 -7
  152. package/app/components/panels/InspectorPanel.vue +17 -17
  153. package/app/components/panels/MergerResultView.vue +19 -19
  154. package/app/components/panels/ObservabilityPanel.vue +115 -123
  155. package/app/components/panels/OperatorDashboardPanel.vue +89 -97
  156. package/app/components/panels/ReportsPanel.vue +69 -66
  157. package/app/components/panels/ReportsSpendBreakdown.vue +9 -9
  158. package/app/components/panels/ResultWindowShell.vue +38 -38
  159. package/app/components/panels/RunDetailLoadState.vue +2 -2
  160. package/app/components/panels/StepContainerStatus.vue +9 -9
  161. package/app/components/panels/StepDelegatedStatus.logic.spec.ts +135 -0
  162. package/app/components/panels/StepDelegatedStatus.logic.ts +160 -0
  163. package/app/components/panels/StepDelegatedStatus.vue +181 -0
  164. package/app/components/panels/StepEffortReport.vue +16 -15
  165. package/app/components/panels/StepFragmentAdherence.vue +14 -10
  166. package/app/components/panels/StepMetadataCard.vue +74 -45
  167. package/app/components/panels/StepReproductionReport.vue +25 -21
  168. package/app/components/panels/StepRunMeta.vue +20 -20
  169. package/app/components/panels/StepTestReport.logic.spec.ts +8 -3
  170. package/app/components/panels/StepTestReport.logic.ts +4 -4
  171. package/app/components/panels/StepTestReport.vue +28 -28
  172. package/app/components/panels/StepToolServers.vue +14 -11
  173. package/app/components/panels/StepValidationReport.vue +7 -7
  174. package/app/components/panels/inspector/ContainerSummary.vue +9 -9
  175. package/app/components/panels/inspector/DocReferenceRepos.vue +3 -3
  176. package/app/components/panels/inspector/EnvProbeReport.vue +24 -27
  177. package/app/components/panels/inspector/EpicChildren.vue +8 -12
  178. package/app/components/panels/inspector/FrontendBindingsResolved.vue +11 -11
  179. package/app/components/panels/inspector/FrontendConfig.vue +37 -41
  180. package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
  181. package/app/components/panels/inspector/InspectorSection.vue +6 -6
  182. package/app/components/panels/inspector/RecurringScheduleSettings.vue +16 -19
  183. package/app/components/panels/inspector/ServiceConnections.vue +2 -2
  184. package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
  185. package/app/components/panels/inspector/ServiceSelfTests.vue +21 -17
  186. package/app/components/panels/inspector/ServiceTestConfig.vue +51 -59
  187. package/app/components/panels/inspector/ServiceTestSecrets.vue +5 -5
  188. package/app/components/panels/inspector/ServiceTestingContext.vue +3 -3
  189. package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
  190. package/app/components/panels/inspector/TaskAgentConfig.vue +3 -3
  191. package/app/components/panels/inspector/TaskAprioriBranches.vue +8 -5
  192. package/app/components/panels/inspector/TaskDependencies.vue +1 -1
  193. package/app/components/panels/inspector/TaskEstimateBadge.vue +11 -11
  194. package/app/components/panels/inspector/TaskExecution.vue +17 -17
  195. package/app/components/panels/inspector/TaskReviewTarget.vue +2 -2
  196. package/app/components/panels/inspector/TaskRunSettings.vue +35 -37
  197. package/app/components/panels/inspector/TaskStructure.vue +3 -3
  198. package/app/components/pipeline/AgentKindIcon.vue +1 -1
  199. package/app/components/pipeline/AgentPromptEditor.vue +17 -17
  200. package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -56
  201. package/app/components/pipeline/EstimateThresholdFields.vue +4 -4
  202. package/app/components/pipeline/GateConfigFields.vue +13 -10
  203. package/app/components/pipeline/IterationCapPrompt.vue +4 -2
  204. package/app/components/pipeline/PipelineBuilder.vue +47 -55
  205. package/app/components/pipeline/PipelineHealthModal.vue +27 -29
  206. package/app/components/pipeline/PipelinePicker.vue +10 -10
  207. package/app/components/pipeline/PipelinePreview.vue +10 -10
  208. package/app/components/pipeline/PipelineProgress.vue +64 -67
  209. package/app/components/prReview/PrReviewPhaseBadge.vue +7 -7
  210. package/app/components/prReview/PrReviewWindow.vue +75 -77
  211. package/app/components/providers/AiPresetMismatchDialog.vue +5 -5
  212. package/app/components/providers/AiProviderOnboardingModal.vue +9 -9
  213. package/app/components/providers/ApiKeysSection.vue +13 -13
  214. package/app/components/providers/PersonalCredentialModal.vue +2 -2
  215. package/app/components/providers/PersonalSubscriptionSection.vue +10 -10
  216. package/app/components/providers/SignInRequiredNotice.vue +1 -1
  217. package/app/components/providers/VendorCredentialsModal.vue +10 -10
  218. package/app/components/provisioning/ProvisioningLogsDrawer.vue +13 -13
  219. package/app/components/ralph/RalphLoopResultView.vue +28 -30
  220. package/app/components/recurring/RecurrenceEditor.vue +2 -2
  221. package/app/components/requirements/RequirementsReviewWindow.vue +51 -58
  222. package/app/components/riskPolicy/RiskPolicyPicker.vue +12 -15
  223. package/app/components/riskPolicy/RiskPolicyPreview.vue +14 -14
  224. package/app/components/sandbox/SandboxPanel.vue +58 -59
  225. package/app/components/settings/AccountSettingsPanel.vue +1 -1
  226. package/app/components/settings/ApiTokensPanel.vue +10 -10
  227. package/app/components/settings/BudgetSettings.vue +18 -22
  228. package/app/components/settings/CapabilityCredentialsPanel.vue +15 -15
  229. package/app/components/settings/CloudflareHandlerSection.vue +20 -20
  230. package/app/components/settings/ComposeEnvironmentSetupSection.vue +13 -13
  231. package/app/components/settings/ConnectionTestVerdict.vue +3 -3
  232. package/app/components/settings/ConnectionWarnings.vue +1 -1
  233. package/app/components/settings/ConsensusGroupsSection.vue +27 -35
  234. package/app/components/settings/CustomManifestTypeEditor.vue +10 -10
  235. package/app/components/settings/DefaultProvisionTypeSection.vue +6 -6
  236. package/app/components/settings/InfraHandlersConfigurator.vue +24 -22
  237. package/app/components/settings/InfrastructureBackendPicker.vue +6 -6
  238. package/app/components/settings/InfrastructureWindow.vue +5 -5
  239. package/app/components/settings/IssueTrackerPanel.vue +29 -23
  240. package/app/components/settings/KubernetesEngineForm.vue +11 -11
  241. package/app/components/settings/KubernetesEnvironmentForm.vue +4 -4
  242. package/app/components/settings/LocalContainerPoolSettings.vue +6 -11
  243. package/app/components/settings/LocalModelEndpointsPanel.vue +20 -18
  244. package/app/components/settings/McpAuthorizeScreen.vue +13 -15
  245. package/app/components/settings/McpOAuthCallbackScreen.vue +16 -10
  246. package/app/components/settings/MergeClassRulesEditor.vue +6 -9
  247. package/app/components/settings/MergeRolePolicyEditor.vue +16 -16
  248. package/app/components/settings/ModelConfigurationPanel.vue +23 -30
  249. package/app/components/settings/ModelPresetHealthModal.vue +15 -13
  250. package/app/components/settings/ObservabilityConnectionPanel.vue +4 -4
  251. package/app/components/settings/OpenRouterCatalogPanel.vue +23 -19
  252. package/app/components/settings/PackageRegistriesPanel.vue +8 -8
  253. package/app/components/settings/ProviderConnectionTab.vue +8 -11
  254. package/app/components/settings/ProviderManifestEditor.vue +9 -9
  255. package/app/components/settings/ProviderPreferenceEditor.vue +8 -8
  256. package/app/components/settings/RiskPolicyCreateForm.vue +10 -10
  257. package/app/components/settings/RiskPolicyEditorRow.vue +14 -14
  258. package/app/components/settings/RiskPolicyHealthModal.vue +15 -13
  259. package/app/components/settings/RiskPolicyInheritedRow.vue +1 -1
  260. package/app/components/settings/RiskPolicyPanel.vue +10 -15
  261. package/app/components/settings/ServiceFragmentDefaultsPanel.vue +7 -7
  262. package/app/components/settings/SharedStacksPanel.vue +9 -12
  263. package/app/components/settings/TaskSourceCard.vue +4 -4
  264. package/app/components/settings/TaskTypeSuppressionsPanel.vue +6 -6
  265. package/app/components/settings/ToolServerChecklist.vue +36 -29
  266. package/app/components/settings/UsageSettings.vue +15 -15
  267. package/app/components/settings/UserSecretsSection.vue +9 -12
  268. package/app/components/settings/WorkspaceMetadataSettings.vue +5 -5
  269. package/app/components/settings/WorkspaceSettingsPanel.vue +47 -47
  270. package/app/components/skills/ReviewSkillQueue.vue +10 -10
  271. package/app/components/skills/SkillLibraryManager.vue +23 -20
  272. package/app/components/slack/SlackPanel.vue +13 -17
  273. package/app/components/spec/ServiceSpecWindow.vue +45 -42
  274. package/app/components/tasks/BugHuntModal.vue +24 -27
  275. package/app/components/tasks/ContextIssuePicker.vue +11 -11
  276. package/app/components/tasks/TaskContextIssues.vue +3 -3
  277. package/app/components/tasks/TaskImportModal.vue +7 -7
  278. package/app/components/tasks/TaskSourceConnectModal.vue +10 -8
  279. package/app/components/testing/TestReportWindow.vue +99 -82
  280. package/app/components/theme/ThemeImportModal.vue +115 -0
  281. package/app/components/tutorial/TutorialCatalogue.vue +9 -9
  282. package/app/components/tutorial/TutorialNudge.vue +5 -5
  283. package/app/components/tutorial/TutorialOverlay.vue +12 -12
  284. package/app/components/tutorial/TutorialPrompt.vue +6 -9
  285. package/app/components/vcs/GitLabConnect.vue +4 -4
  286. package/app/components/vcs/VcsConnectSurfaces.vue +2 -2
  287. package/app/components/visualConfirm/VisualConfirmationWindow.vue +36 -36
  288. package/app/composables/api/client.ts +6 -1
  289. package/app/composables/usePipelineErrorToast.ts +17 -0
  290. package/app/modular/agent-kinds.ts +24 -0
  291. package/app/pages/index.vue +5 -5
  292. package/app/plugins/theme.client.ts +125 -0
  293. package/app/spa-loading-template.html +52 -14
  294. package/app/stores/agents.ts +1 -1
  295. package/app/stores/theme.spec.ts +56 -0
  296. package/app/stores/theme.ts +87 -0
  297. package/app/types/domain.ts +19 -0
  298. package/app/types/execution.ts +4 -0
  299. package/app/utils/agentOutput.ts +1 -1
  300. package/app/utils/binaryOutput.ts +6 -6
  301. package/app/utils/bootstrapSteps.ts +14 -14
  302. package/app/utils/catalog.ts +87 -83
  303. package/app/utils/colorTint.ts +10 -0
  304. package/app/utils/failureKinds.ts +1 -0
  305. package/app/utils/observability.ts +3 -3
  306. package/app/utils/pipelineRender.ts +13 -17
  307. package/app/utils/swimlanes.ts +4 -4
  308. package/app/utils/theme/bootPalette.spec.ts +54 -0
  309. package/app/utils/theme/bootPalette.ts +108 -0
  310. package/app/utils/theme/builtins.spec.ts +38 -0
  311. package/app/utils/theme/builtins.ts +55 -0
  312. package/app/utils/theme/css.ts +162 -0
  313. package/app/utils/theme/doc.ts +353 -0
  314. package/app/utils/theme/link.ts +93 -0
  315. package/app/utils/theme/presets.ts +509 -0
  316. package/app/utils/theme/theme.spec.ts +224 -0
  317. package/i18n/locales/de.json +61 -4
  318. package/i18n/locales/en.json +70 -4
  319. package/i18n/locales/es.json +61 -4
  320. package/i18n/locales/fr.json +61 -4
  321. package/i18n/locales/he.json +61 -4
  322. package/i18n/locales/it.json +61 -4
  323. package/i18n/locales/ja.json +61 -4
  324. package/i18n/locales/pl.json +61 -4
  325. package/i18n/locales/tr.json +61 -4
  326. package/i18n/locales/uk.json +61 -4
  327. package/nuxt.config.ts +37 -11
  328. package/package.json +10 -9
@@ -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: '#64748b',
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: '#6366f1',
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: '#f59e0b',
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: '#22c55e',
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-slate-800 bg-slate-900/60 p-4">
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-slate-300">
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-white">{{ completedCount }}</span>
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-slate-500">
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-slate-200">{{
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-slate-400"
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-emerald-500/60' : 'bg-slate-700'"
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-slate-950"
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-indigo-500/70 bg-slate-900 shadow-lg shadow-indigo-500/10'
336
- : 'border-slate-800 bg-slate-900/50',
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 + '22' }"
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-white">
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-slate-700/60 px-1 text-[9px] font-medium uppercase tracking-wide text-slate-300"
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-slate-500"
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-slate-400"
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-slate-500 transition-colors group-hover:text-indigo-300"
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-sky-300"
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-emerald-300"
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-slate-400"
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-indigo-300">
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-slate-700/60">
505
+ <div class="mt-1 h-1 overflow-hidden rounded-full bg-accented/60">
506
506
  <div
507
- class="h-full rounded-full bg-indigo-400 transition-all duration-500"
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-slate-500 line-through'
521
+ ? 'text-dimmed line-through'
522
522
  : item.status === 'in_progress'
523
- ? 'text-slate-100'
524
- : 'text-slate-400'
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-slate-500"
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-slate-500"
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-slate-700/70 bg-slate-900/40 px-2.5 py-1.5"
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-slate-300">
596
+ <span class="min-w-0 flex-1 truncate text-[12px] text-toned">
600
597
  {{ agentKindMeta(companionByStep[i]!.kind).label }}
601
- <span class="text-slate-500">{{ t('pipeline.progress.companionSuffix') }}</span>
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-400/60"
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-500/50 bg-pink-500/10 followup-blink'
621
- : 'border-slate-700/70 bg-slate-900/40'
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-500/40 bg-pink-500/15"
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-300" />
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-slate-300">
627
+ <span class="min-w-0 flex-1 truncate text-[12px] text-toned">
631
628
  {{ FOLLOW_UP_COMPANION_META.label }}
632
- <span class="text-slate-500">{{ t('pipeline.progress.companionSuffix') }}</span>
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-300' : 'text-slate-400'"
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-violet-400/60"
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-violet-500/50 bg-violet-500/10 followup-blink'
653
- : 'border-slate-700/70 bg-slate-900/40'
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-violet-500/40 bg-violet-500/15"
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-violet-300"
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-slate-300">
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-indigo-500/50 bg-indigo-500/10 px-2.5 py-1.5 text-start transition followup-blink hover:border-indigo-400/60"
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-indigo-500/40 bg-indigo-500/15"
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-indigo-300" />
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-slate-300">
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-500/50 bg-cyan-500/10 px-2.5 py-1.5 text-start transition followup-blink hover:border-cyan-400/60"
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-500/40 bg-cyan-500/15"
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-300"
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-slate-300">
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-indigo-300"
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-emerald-400"
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 indigo halo around the rail node of the actively-working step. */
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 rgba(99, 102, 241, 0.5);
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 rgba(99, 102, 241, 0);
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 rgba(244, 114, 182, 0.5);
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 rgba(244, 114, 182, 0);
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-indigo-300' },
27
- reviewing: { icon: 'i-lucide-loader-circle', spin: true, class: 'text-indigo-300' },
28
- awaiting: { icon: 'i-lucide-clipboard-check', spin: false, class: 'text-amber-300' },
29
- challenging: { icon: 'i-lucide-gavel', spin: true, class: 'text-indigo-300' },
30
- fixing: { icon: 'i-lucide-wrench', spin: true, class: 'text-indigo-300' },
31
- posting: { icon: 'i-lucide-send', spin: true, class: 'text-indigo-300' },
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-rose-400' : PHASE_META[phase.kind].class"
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"