@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.
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 +9 -8
@@ -423,7 +423,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
423
423
  data-testid="pipeline-builder-palette"
424
424
  >
425
425
  <div class="mb-2 flex shrink-0 items-center justify-between gap-2">
426
- <h3 class="text-xs font-semibold uppercase tracking-wide text-slate-400">
426
+ <h3 class="text-xs font-semibold uppercase tracking-wide text-muted">
427
427
  {{ t('pipeline.builder.agentPalette') }}
428
428
  </h3>
429
429
  <UButton
@@ -447,7 +447,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
447
447
  data-testid="pipeline-builder-draft"
448
448
  >
449
449
  <div class="mb-2 flex items-center justify-between gap-2">
450
- <h3 class="text-xs font-semibold uppercase tracking-wide text-slate-400">
450
+ <h3 class="text-xs font-semibold uppercase tracking-wide text-muted">
451
451
  {{ t('pipeline.builder.pipeline') }}
452
452
  </h3>
453
453
  <UButton
@@ -490,14 +490,14 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
490
490
  class="gap-1"
491
491
  >
492
492
  {{ l }}
493
- <button type="button" class="hover:text-rose-400" @click="removeLabel(l)">
493
+ <button type="button" class="hover:text-app-error-400" @click="removeLabel(l)">
494
494
  <UIcon name="i-lucide-x" class="h-3 w-3" />
495
495
  </button>
496
496
  </UBadge>
497
497
  <input
498
498
  v-model="newLabel"
499
499
  :placeholder="t('pipeline.builder.labelPlaceholder')"
500
- class="w-20 rounded border border-slate-700 bg-slate-900 px-1.5 py-0.5 text-[11px] text-slate-200 focus:w-28"
500
+ class="w-20 rounded border border-muted bg-default px-1.5 py-0.5 text-[11px] text-default focus:w-28"
501
501
  @keydown.enter.prevent="addLabel"
502
502
  @blur="addLabel"
503
503
  />
@@ -508,7 +508,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
508
508
  <p
509
509
  v-for="warning in draftWarnings"
510
510
  :key="warning.key"
511
- class="mb-2 flex items-center gap-1.5 rounded-md border border-amber-800/50 bg-amber-950/30 px-2 py-1 text-[11px] text-amber-300"
511
+ class="mb-2 flex items-center gap-1.5 rounded-md border border-app-warning-800/50 bg-app-warning-950/30 px-2 py-1 text-[11px] text-app-warning-300"
512
512
  :data-testid="warning.testId"
513
513
  >
514
514
  <UIcon name="i-lucide-alert-triangle" class="h-3.5 w-3.5 shrink-0" />
@@ -517,7 +517,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
517
517
 
518
518
  <div
519
519
  v-if="pipelines.draft.length === 0"
520
- class="flex flex-1 items-center justify-center rounded-lg border border-dashed border-slate-700 p-4 text-center text-xs text-slate-500"
520
+ class="flex flex-1 items-center justify-center rounded-lg border border-dashed border-muted p-4 text-center text-xs text-dimmed"
521
521
  >
522
522
  {{ t('pipeline.builder.emptyDraft') }}
523
523
  </div>
@@ -526,19 +526,17 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
526
526
  <li
527
527
  v-for="(unit, vi) in pipelines.units"
528
528
  :key="unit.index"
529
- class="flex flex-col gap-2 rounded-lg border border-slate-700 bg-slate-800/60 p-2"
529
+ class="flex flex-col gap-2 rounded-lg border border-muted bg-elevated/60 p-2"
530
530
  :class="{ 'opacity-50': pipelines.draftEnabled[unit.index] === false }"
531
531
  data-testid="pipeline-draft-step"
532
532
  :data-agent-kind="unit.kind"
533
533
  :data-gated="pipelines.draftGates[unit.index] === true"
534
534
  >
535
535
  <div class="flex items-center gap-1.5">
536
- <span class="w-4 shrink-0 text-center text-[10px] text-slate-500">{{
537
- vi + 1
538
- }}</span>
536
+ <span class="w-4 shrink-0 text-center text-[10px] text-dimmed">{{ vi + 1 }}</span>
539
537
  <AgentKindIcon :kind="unit.kind" icon-class="h-4 w-4" />
540
538
  <span
541
- class="min-w-0 flex-1 truncate text-xs text-slate-100"
539
+ class="min-w-0 flex-1 truncate text-xs text-app-100"
542
540
  :class="{ 'line-through': pipelines.draftEnabled[unit.index] === false }"
543
541
  :title="agentKindMeta(unit.kind).description"
544
542
  >
@@ -787,10 +785,10 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
787
785
  :disabled="!skillSelectItems.length"
788
786
  @update:model-value="pipelines.setDraftSkillId(unit.index, $event)"
789
787
  />
790
- <p v-if="!skillSelectItems.length" class="text-[10px] text-slate-500">
788
+ <p v-if="!skillSelectItems.length" class="text-[10px] text-dimmed">
791
789
  {{ t('pipeline.builder.skillNoneAvailable') }}
792
790
  </p>
793
- <p v-else-if="skillMissing(unit.index)" class="text-[10px] text-amber-400">
791
+ <p v-else-if="skillMissing(unit.index)" class="text-[10px] text-app-warning-400">
794
792
  {{ t('pipeline.builder.skillMissing') }}
795
793
  </p>
796
794
  </div>
@@ -803,7 +801,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
803
801
  v-if="showVariantPicker(unit.index, unit.kind)"
804
802
  class="ms-6 flex items-center gap-2"
805
803
  >
806
- <span class="text-[10px] text-slate-500">
804
+ <span class="text-[10px] text-dimmed">
807
805
  {{ t('pipeline.builder.variantLabel') }}
808
806
  </span>
809
807
  <USelect
@@ -844,7 +842,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
844
842
  setting (itself an override of the deployment routing default), so it is
845
843
  advanced-only until a value is pinned; empty inherits. -->
846
844
  <div v-if="showOutputBudget(unit.index)" class="ms-6 flex items-center gap-2">
847
- <span class="text-[10px] text-slate-500">
845
+ <span class="text-[10px] text-dimmed">
848
846
  {{ t('pipeline.outputBudget.stepLabel') }}
849
847
  </span>
850
848
  <OutputBudgetInput
@@ -861,15 +859,15 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
861
859
  gated on the task estimate. -->
862
860
  <div
863
861
  v-if="unit.companionIndex !== null"
864
- class="ms-6 space-y-2 rounded-md border border-fuchsia-800/40 bg-fuchsia-950/20 p-2 text-xs"
862
+ class="ms-6 space-y-2 rounded-md border border-app-hue-fuchsia/40 bg-app-hue-fuchsia/10 p-2 text-xs"
865
863
  >
866
864
  <div class="flex items-center gap-1.5">
867
- <UIcon name="i-lucide-corner-down-right" class="h-3.5 w-3.5 text-slate-500" />
865
+ <UIcon name="i-lucide-corner-down-right" class="h-3.5 w-3.5 text-dimmed" />
868
866
  <AgentKindIcon
869
867
  :kind="pipelines.draft[unit.companionIndex]!"
870
868
  icon-class="h-4 w-4"
871
869
  />
872
- <span class="min-w-0 flex-1 truncate text-slate-200">
870
+ <span class="min-w-0 flex-1 truncate text-default">
873
871
  {{ agentKindMeta(pipelines.draft[unit.companionIndex]!).label }}
874
872
  </span>
875
873
  <!-- A companion is an agent kind with a prompt of its own, and this row is its
@@ -921,7 +919,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
921
919
  <!-- Consensus config (shown when the step is consensus-enabled). -->
922
920
  <div
923
921
  v-if="pipelines.draftConsensus[unit.index]?.enabled"
924
- class="ms-6 space-y-2 rounded-md border border-emerald-800/40 bg-emerald-950/20 p-2 text-xs"
922
+ class="ms-6 space-y-2 rounded-md border border-app-success-800/40 bg-app-success-950/20 p-2 text-xs"
925
923
  >
926
924
  <!-- The workspace consensus-GROUP tier set: pick which reusable panels this
927
925
  step may escalate to. Each group carries its own estimate bar; the engine
@@ -930,13 +928,13 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
930
928
  editor below, so the step has exactly one source of truth for its panel. -->
931
929
  <div
932
930
  v-if="consensusGroups.hasGroups"
933
- class="space-y-1 border-b border-slate-800 pb-2"
931
+ class="space-y-1 border-b border-default pb-2"
934
932
  >
935
933
  <div class="flex items-center gap-1.5">
936
- <UIcon name="i-lucide-layers" class="h-3.5 w-3.5 text-emerald-400" />
937
- <span class="text-slate-300">{{ t('pipeline.builder.consensusGroups') }}</span>
934
+ <UIcon name="i-lucide-layers" class="h-3.5 w-3.5 text-app-success-400" />
935
+ <span class="text-toned">{{ t('pipeline.builder.consensusGroups') }}</span>
938
936
  </div>
939
- <p class="text-[11px] text-slate-500">
937
+ <p class="text-[11px] text-dimmed">
940
938
  {{ t('pipeline.builder.consensusGroupsHint') }}
941
939
  </p>
942
940
  <div class="flex flex-wrap gap-1">
@@ -947,28 +945,28 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
947
945
  class="rounded border px-1.5 py-0.5 text-[11px]"
948
946
  :class="
949
947
  isGroupSelected(unit.index, group.id)
950
- ? 'border-emerald-600 bg-emerald-900/40 text-emerald-200'
951
- : 'border-slate-700 bg-slate-900 text-slate-400 hover:text-slate-200'
948
+ ? 'border-app-success-600 bg-app-success-900/40 text-app-success-200'
949
+ : 'border-muted bg-default text-muted hover:text-default'
952
950
  "
953
951
  :title="group.description"
954
952
  @click="pipelines.toggleDraftConsensusGroup(unit.index, group.id)"
955
953
  >
956
954
  {{ group.name }}
957
- <span class="ms-1 text-slate-500">{{ groupBarLabel(group.id) }}</span>
955
+ <span class="ms-1 text-dimmed">{{ groupBarLabel(group.id) }}</span>
958
956
  </button>
959
957
  </div>
960
958
  </div>
961
959
 
962
- <div v-if="usesGroups(unit.index)" class="text-[11px] text-slate-500">
960
+ <div v-if="usesGroups(unit.index)" class="text-[11px] text-dimmed">
963
961
  {{ t('pipeline.builder.consensusGroupsActive') }}
964
962
  </div>
965
963
 
966
964
  <template v-else>
967
965
  <div class="flex items-center gap-2">
968
- <label class="text-slate-400">{{ t('pipeline.builder.strategy') }}</label>
966
+ <label class="text-muted">{{ t('pipeline.builder.strategy') }}</label>
969
967
  <select
970
968
  v-model="pipelines.draftConsensus[unit.index]!.strategy"
971
- class="rounded border border-slate-700 bg-slate-900 px-1.5 py-0.5 text-slate-100"
969
+ class="rounded border border-muted bg-default px-1.5 py-0.5 text-app-100"
972
970
  >
973
971
  <option v-for="s in CONSENSUS_STRATEGIES" :key="s.value" :value="s.value">
974
972
  {{ s.label }}
@@ -976,7 +974,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
976
974
  </select>
977
975
  <label
978
976
  v-if="pipelines.draftConsensus[unit.index]!.strategy === 'debate'"
979
- class="ms-2 text-slate-400"
977
+ class="ms-2 text-muted"
980
978
  >{{ t('pipeline.builder.rounds') }}</label
981
979
  >
982
980
  <input
@@ -986,7 +984,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
986
984
  min="1"
987
985
  max="5"
988
986
  placeholder="2"
989
- class="w-12 rounded border border-slate-700 bg-slate-900 px-1.5 py-0.5 text-slate-100"
987
+ class="w-12 rounded border border-muted bg-default px-1.5 py-0.5 text-app-100"
990
988
  />
991
989
  </div>
992
990
 
@@ -1000,12 +998,12 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
1000
998
  <input
1001
999
  v-model="p.role"
1002
1000
  :placeholder="t('pipeline.builder.rolePlaceholder')"
1003
- class="w-28 rounded border border-slate-700 bg-slate-900 px-1.5 py-0.5 text-slate-100"
1001
+ class="w-28 rounded border border-muted bg-default px-1.5 py-0.5 text-app-100"
1004
1002
  />
1005
1003
  <input
1006
1004
  v-model="p.modelId"
1007
1005
  :placeholder="t('pipeline.builder.modelIdPlaceholder')"
1008
- class="flex-1 rounded border border-slate-700 bg-slate-900 px-1.5 py-0.5 text-slate-300"
1006
+ class="flex-1 rounded border border-muted bg-default px-1.5 py-0.5 text-toned"
1009
1007
  />
1010
1008
  <UButton
1011
1009
  icon="i-lucide-x"
@@ -1028,7 +1026,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
1028
1026
  </div>
1029
1027
 
1030
1028
  <!-- gating -->
1031
- <div class="flex flex-wrap items-center gap-2 border-t border-slate-800 pt-2">
1029
+ <div class="flex flex-wrap items-center gap-2 border-t border-default pt-2">
1032
1030
  <UButton
1033
1031
  :icon="
1034
1032
  pipelines.draftConsensus[unit.index]!.gating?.enabled
@@ -1064,11 +1062,11 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
1064
1062
  isTesterKind(unit.kind) &&
1065
1063
  pipelines.draftTesterQuality[unit.index]?.enabled !== false
1066
1064
  "
1067
- class="ms-6 space-y-2 rounded-md border border-sky-800/40 bg-sky-950/20 p-2 text-xs"
1065
+ class="ms-6 space-y-2 rounded-md border border-app-info-800/40 bg-app-info-950/20 p-2 text-xs"
1068
1066
  >
1069
1067
  <div class="flex items-center gap-1.5">
1070
- <UIcon name="i-lucide-shield-check" class="h-3.5 w-3.5 text-sky-400" />
1071
- <span class="min-w-0 flex-1 truncate text-slate-200">
1068
+ <UIcon name="i-lucide-shield-check" class="h-3.5 w-3.5 text-app-info-400" />
1069
+ <span class="min-w-0 flex-1 truncate text-default">
1072
1070
  {{ t('pipeline.builder.testerQualityLabel') }}
1073
1071
  </span>
1074
1072
  <UButton
@@ -1105,7 +1103,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
1105
1103
  moved to the task card / inspector when the palettes were removed). -->
1106
1104
  <div v-if="pipelines.pipelines.length" class="flex flex-col lg:min-h-0 lg:overflow-hidden">
1107
1105
  <div class="mb-2 flex shrink-0 items-center justify-between gap-2">
1108
- <h3 class="text-xs font-semibold uppercase tracking-wide text-slate-400">
1106
+ <h3 class="text-xs font-semibold uppercase tracking-wide text-muted">
1109
1107
  {{ t('pipeline.builder.savedPipelines') }}
1110
1108
  </h3>
1111
1109
  <UButton
@@ -1159,7 +1157,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
1159
1157
  narrows and whose every change is saved. -->
1160
1158
  <div
1161
1159
  v-if="browseEveryPurpose || library.hiddenByPurpose"
1162
- class="mb-2 flex shrink-0 flex-wrap items-center gap-x-2 px-1 text-[10px] text-slate-500"
1160
+ class="mb-2 flex shrink-0 flex-wrap items-center gap-x-2 px-1 text-[10px] text-dimmed"
1163
1161
  >
1164
1162
  <span>
1165
1163
  {{
@@ -1174,7 +1172,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
1174
1172
  </span>
1175
1173
  <button
1176
1174
  type="button"
1177
- class="underline underline-offset-2 hover:text-slate-300"
1175
+ class="underline underline-offset-2 hover:text-toned"
1178
1176
  data-testid="pipeline-library-purpose-toggle"
1179
1177
  @click="browseEveryPurpose = !browseEveryPurpose"
1180
1178
  >
@@ -1190,7 +1188,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
1190
1188
  <li
1191
1189
  v-for="p in visiblePipelines"
1192
1190
  :key="p.id"
1193
- class="group rounded-lg border border-slate-700 bg-slate-800/40"
1191
+ class="group rounded-lg border border-muted bg-elevated/40"
1194
1192
  :class="{ 'opacity-60': p.archived }"
1195
1193
  >
1196
1194
  <div class="flex items-center gap-2 px-2 py-1.5">
@@ -1203,9 +1201,9 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
1203
1201
  :name="
1204
1202
  expandedSaved.has(p.id) ? 'i-lucide-chevron-down' : 'i-lucide-chevron-right'
1205
1203
  "
1206
- class="h-3.5 w-3.5 shrink-0 text-slate-500"
1204
+ class="h-3.5 w-3.5 shrink-0 text-dimmed"
1207
1205
  />
1208
- <span class="min-w-0 flex-1 truncate text-xs text-slate-200">{{ p.name }}</span>
1206
+ <span class="min-w-0 flex-1 truncate text-xs text-default">{{ p.name }}</span>
1209
1207
  <UBadge
1210
1208
  v-for="l in p.labels ?? []"
1211
1209
  :key="l"
@@ -1251,7 +1249,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
1251
1249
  >
1252
1250
  {{ t('pipeline.builder.scopeDefault.unattended') }}
1253
1251
  </UBadge>
1254
- <span class="shrink-0 text-[10px] text-slate-500">
1252
+ <span class="shrink-0 text-[10px] text-dimmed">
1255
1253
  {{
1256
1254
  t(
1257
1255
  'pipeline.builder.stepCount',
@@ -1347,7 +1345,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
1347
1345
  <!-- Full ordered step list, revealed on click. -->
1348
1346
  <ol
1349
1347
  v-if="expandedSaved.has(p.id)"
1350
- class="space-y-1 border-t border-slate-800 px-2 py-2 ps-7"
1348
+ class="space-y-1 border-t border-default px-2 py-2 ps-7"
1351
1349
  >
1352
1350
  <li
1353
1351
  v-for="(k, i) in p.agentKinds"
@@ -1358,9 +1356,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
1358
1356
  p.enabled?.[i] === false ? t('pipeline.builder.disabledStepTooltip') : undefined
1359
1357
  "
1360
1358
  >
1361
- <span class="w-4 shrink-0 text-center text-[10px] text-slate-500">{{
1362
- i + 1
1363
- }}</span>
1359
+ <span class="w-4 shrink-0 text-center text-[10px] text-dimmed">{{ i + 1 }}</span>
1364
1360
  <AgentKindIcon :kind="k" show-label />
1365
1361
  <!-- A step that does not run on every task says so HERE, in the library, because
1366
1362
  this list is what a reader compares two pipelines by: a preset whose testers
@@ -1369,7 +1365,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
1369
1365
  v-for="c in stepConditionsAt(p, i)"
1370
1366
  :key="c"
1371
1367
  :name="CONDITION_MARKERS[c].icon"
1372
- class="h-3 w-3 shrink-0 text-sky-400"
1368
+ class="h-3 w-3 shrink-0 text-app-info-400"
1373
1369
  :title="t(CONDITION_MARKERS[c].key)"
1374
1370
  />
1375
1371
  </li>
@@ -1404,9 +1400,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
1404
1400
  <template #body>
1405
1401
  <div class="space-y-3">
1406
1402
  <div>
1407
- <label
1408
- class="mb-1 block text-[11px] font-semibold uppercase tracking-wide text-slate-400"
1409
- >
1403
+ <label class="mb-1 block text-[11px] font-semibold uppercase tracking-wide text-muted">
1410
1404
  {{ t('pipeline.builder.addAgentModal.name') }}
1411
1405
  </label>
1412
1406
  <UInput
@@ -1417,9 +1411,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
1417
1411
  />
1418
1412
  </div>
1419
1413
  <div>
1420
- <label
1421
- class="mb-1 block text-[11px] font-semibold uppercase tracking-wide text-slate-400"
1422
- >
1414
+ <label class="mb-1 block text-[11px] font-semibold uppercase tracking-wide text-muted">
1423
1415
  {{ t('pipeline.builder.addAgentModal.description') }}
1424
1416
  </label>
1425
1417
  <UTextarea
@@ -123,8 +123,8 @@ const reseedableCount = computed(
123
123
  <template>
124
124
  <UModal v-model:open="open" :title="t('pipeline.health.title')" :ui="{ content: 'max-w-2xl' }">
125
125
  <template #body>
126
- <div v-if="!hasIssues" class="py-6 text-center text-sm text-slate-400">
127
- <UIcon name="i-lucide-check-circle-2" class="mx-auto mb-2 h-8 w-8 text-emerald-400" />
126
+ <div v-if="!hasIssues" class="py-6 text-center text-sm text-muted">
127
+ <UIcon name="i-lucide-check-circle-2" class="mx-auto mb-2 h-8 w-8 text-app-success-400" />
128
128
  {{ t('pipeline.health.allValid') }}
129
129
  </div>
130
130
 
@@ -132,20 +132,20 @@ const reseedableCount = computed(
132
132
  <!-- New built-in pipelines the workspace can add. -->
133
133
  <section v-if="newPipelines.length" class="space-y-2">
134
134
  <div class="flex items-center gap-2">
135
- <UIcon name="i-lucide-sparkles" class="h-4 w-4 text-emerald-400" />
136
- <h3 class="text-sm font-semibold text-slate-200">
135
+ <UIcon name="i-lucide-sparkles" class="h-4 w-4 text-app-success-400" />
136
+ <h3 class="text-sm font-semibold text-default">
137
137
  {{ t('pipeline.health.newHeading') }}
138
138
  </h3>
139
139
  </div>
140
- <p class="text-[11px] text-slate-500">{{ t('pipeline.health.newDescription') }}</p>
140
+ <p class="text-[11px] text-dimmed">{{ t('pipeline.health.newDescription') }}</p>
141
141
  <ul class="space-y-2">
142
142
  <li
143
143
  v-for="p in newPipelines"
144
144
  :key="p.id"
145
- class="flex items-center justify-between gap-3 rounded-lg border border-slate-800 bg-slate-900/40 p-3"
145
+ class="flex items-center justify-between gap-3 rounded-lg border border-default bg-default/40 p-3"
146
146
  >
147
147
  <div class="min-w-0">
148
- <span class="truncate text-sm font-medium text-slate-100 capitalize">{{
148
+ <span class="truncate text-sm font-medium text-app-100 capitalize">{{
149
149
  p.name
150
150
  }}</span>
151
151
  </div>
@@ -167,24 +167,24 @@ const reseedableCount = computed(
167
167
  <!-- Invalid: unknown agent kinds or a broken shape. -->
168
168
  <section v-if="invalid.length" class="space-y-2">
169
169
  <div class="flex items-center gap-2">
170
- <UIcon name="i-lucide-triangle-alert" class="h-4 w-4 text-rose-400" />
171
- <h3 class="text-sm font-semibold text-slate-200">
170
+ <UIcon name="i-lucide-triangle-alert" class="h-4 w-4 text-app-error-400" />
171
+ <h3 class="text-sm font-semibold text-default">
172
172
  {{ t('pipeline.health.invalidHeading') }}
173
173
  </h3>
174
174
  </div>
175
- <p class="text-[11px] text-slate-500">
175
+ <p class="text-[11px] text-dimmed">
176
176
  {{ t('pipeline.health.invalidDescription') }}
177
177
  </p>
178
178
  <ul class="space-y-2">
179
179
  <li
180
180
  v-for="h in invalid"
181
181
  :key="h.pipeline.id"
182
- class="rounded-lg border border-slate-800 bg-slate-900/40 p-3"
182
+ class="rounded-lg border border-default bg-default/40 p-3"
183
183
  >
184
184
  <div class="flex items-start justify-between gap-3">
185
185
  <div class="min-w-0">
186
186
  <div class="flex items-center gap-2">
187
- <span class="truncate text-sm font-medium text-slate-100">
187
+ <span class="truncate text-sm font-medium text-app-100">
188
188
  {{ h.pipeline.name }}
189
189
  </span>
190
190
  <UBadge v-if="h.pipeline.builtin" color="neutral" variant="subtle" size="xs">
@@ -196,7 +196,9 @@ const reseedableCount = computed(
196
196
  v-for="(p, i) in h.problems"
197
197
  :key="i"
198
198
  class="text-[11px]"
199
- :class="p.type === 'outdated' ? 'text-amber-400/80' : 'text-rose-400/90'"
199
+ :class="
200
+ p.type === 'outdated' ? 'text-app-warning-400/80' : 'text-app-error-400/90'
201
+ "
200
202
  >
201
203
  {{ p.message }}
202
204
  </li>
@@ -234,23 +236,21 @@ const reseedableCount = computed(
234
236
  <!-- Retired built-ins: withdrawn from the catalog, so the only action is removal. -->
235
237
  <section v-if="retired.length" class="space-y-2">
236
238
  <div class="flex items-center gap-2">
237
- <UIcon name="i-lucide-archive-x" class="h-4 w-4 text-slate-400" />
238
- <h3 class="text-sm font-semibold text-slate-200">
239
+ <UIcon name="i-lucide-archive-x" class="h-4 w-4 text-muted" />
240
+ <h3 class="text-sm font-semibold text-default">
239
241
  {{ t('pipeline.health.retiredHeading') }}
240
242
  </h3>
241
243
  </div>
242
- <p class="text-[11px] text-slate-500">{{ t('pipeline.health.retiredDescription') }}</p>
244
+ <p class="text-[11px] text-dimmed">{{ t('pipeline.health.retiredDescription') }}</p>
243
245
  <ul class="space-y-2">
244
246
  <li
245
247
  v-for="r in retired"
246
248
  :key="r.pipeline.id"
247
- class="flex items-center justify-between gap-3 rounded-lg border border-slate-800 bg-slate-900/40 p-3"
249
+ class="flex items-center justify-between gap-3 rounded-lg border border-default bg-default/40 p-3"
248
250
  >
249
251
  <div class="min-w-0">
250
- <span class="truncate text-sm font-medium text-slate-100">{{
251
- r.pipeline.name
252
- }}</span>
253
- <p class="text-[11px] text-slate-400/80">
252
+ <span class="truncate text-sm font-medium text-app-100">{{ r.pipeline.name }}</span>
253
+ <p class="text-[11px] text-muted/80">
254
254
  {{
255
255
  r.replacement
256
256
  ? t('pipeline.health.retiredReplacedBy', { name: r.replacement.name })
@@ -276,25 +276,23 @@ const reseedableCount = computed(
276
276
  <!-- Outdated built-ins: a newer catalog version is available. -->
277
277
  <section v-if="outdated.length" class="space-y-2">
278
278
  <div class="flex items-center gap-2">
279
- <UIcon name="i-lucide-arrow-up-circle" class="h-4 w-4 text-amber-400" />
280
- <h3 class="text-sm font-semibold text-slate-200">
279
+ <UIcon name="i-lucide-arrow-up-circle" class="h-4 w-4 text-app-warning-400" />
280
+ <h3 class="text-sm font-semibold text-default">
281
281
  {{ t('pipeline.health.updatesHeading') }}
282
282
  </h3>
283
283
  </div>
284
- <p class="text-[11px] text-slate-500">
284
+ <p class="text-[11px] text-dimmed">
285
285
  {{ t('pipeline.health.updatesDescription') }}
286
286
  </p>
287
287
  <ul class="space-y-2">
288
288
  <li
289
289
  v-for="h in outdated"
290
290
  :key="h.pipeline.id"
291
- class="flex items-center justify-between gap-3 rounded-lg border border-slate-800 bg-slate-900/40 p-3"
291
+ class="flex items-center justify-between gap-3 rounded-lg border border-default bg-default/40 p-3"
292
292
  >
293
293
  <div class="min-w-0">
294
- <span class="truncate text-sm font-medium text-slate-100">{{
295
- h.pipeline.name
296
- }}</span>
297
- <p class="text-[11px] text-amber-400/80">{{ h.problems[0]?.message }}</p>
294
+ <span class="truncate text-sm font-medium text-app-100">{{ h.pipeline.name }}</span>
295
+ <p class="text-[11px] text-app-warning-400/80">{{ h.problems[0]?.message }}</p>
298
296
  </div>
299
297
  <UButton
300
298
  size="xs"
@@ -92,40 +92,40 @@ function choose(id: string) {
92
92
  @mouseleave="hoverId = undefined"
93
93
  >
94
94
  <!-- left: selectable options -->
95
- <ul class="w-1/2 shrink-0 overflow-y-auto border-e border-slate-800 p-1">
95
+ <ul class="w-1/2 shrink-0 overflow-y-auto border-e border-default p-1">
96
96
  <li v-if="noneLabel !== undefined">
97
97
  <button
98
98
  type="button"
99
- class="flex w-full items-center gap-2 rounded px-2 py-1.5 text-start text-sm hover:bg-slate-800/60"
100
- :class="modelValue ? 'text-slate-300' : 'text-slate-100'"
99
+ class="flex w-full items-center gap-2 rounded px-2 py-1.5 text-start text-sm hover:bg-elevated/60"
100
+ :class="modelValue ? 'text-toned' : 'text-app-100'"
101
101
  data-testid="pipeline-option-none"
102
102
  @mouseenter="hoverId = ''"
103
103
  @click="choose('')"
104
104
  >
105
- <UIcon name="i-lucide-rotate-ccw" class="h-4 w-4 shrink-0 text-slate-400" />
105
+ <UIcon name="i-lucide-rotate-ccw" class="h-4 w-4 shrink-0 text-muted" />
106
106
  <span class="flex-1 truncate">{{ noneLabel }}</span>
107
107
  <UIcon
108
108
  v-if="!modelValue"
109
109
  name="i-lucide-check"
110
- class="h-4 w-4 shrink-0 text-primary-400"
110
+ class="h-4 w-4 shrink-0 text-primary"
111
111
  />
112
112
  </button>
113
113
  </li>
114
114
  <li v-for="p in options" :key="p.id">
115
115
  <button
116
116
  type="button"
117
- class="flex w-full items-center gap-2 rounded px-2 py-1.5 text-start text-sm hover:bg-slate-800/60"
118
- :class="modelValue === p.id ? 'text-slate-100' : 'text-slate-300'"
117
+ class="flex w-full items-center gap-2 rounded px-2 py-1.5 text-start text-sm hover:bg-elevated/60"
118
+ :class="modelValue === p.id ? 'text-app-100' : 'text-toned'"
119
119
  :data-testid="`pipeline-option-${p.id}`"
120
120
  @mouseenter="hoverId = p.id"
121
121
  @click="choose(p.id)"
122
122
  >
123
- <UIcon name="i-lucide-workflow" class="h-4 w-4 shrink-0 text-slate-400" />
123
+ <UIcon name="i-lucide-workflow" class="h-4 w-4 shrink-0 text-muted" />
124
124
  <span class="flex-1 truncate">{{ p.name }}</span>
125
125
  <UIcon
126
126
  v-if="modelValue === p.id"
127
127
  name="i-lucide-check"
128
- class="h-4 w-4 shrink-0 text-primary-400"
128
+ class="h-4 w-4 shrink-0 text-primary"
129
129
  />
130
130
  </button>
131
131
  </li>
@@ -134,7 +134,7 @@ function choose(id: string) {
134
134
  <!-- right: preview of the hovered (or selected) pipeline -->
135
135
  <div class="w-1/2 overflow-y-auto p-3">
136
136
  <PipelinePreview v-if="previewPipeline" :pipeline="previewPipeline" />
137
- <div v-else class="text-[12px] leading-snug text-slate-500">{{ emptyHint }}</div>
137
+ <div v-else class="text-[12px] leading-snug text-dimmed">{{ emptyHint }}</div>
138
138
  </div>
139
139
  </div>
140
140
  </template>
@@ -34,17 +34,17 @@ function stepDescription(kind: string): string {
34
34
 
35
35
  <template>
36
36
  <div class="space-y-2" data-testid="pipeline-preview">
37
- <div class="text-sm font-semibold text-slate-100">{{ pipeline.name }}</div>
37
+ <div class="text-sm font-semibold text-app-100">{{ pipeline.name }}</div>
38
38
  <p
39
39
  v-if="pipeline.description"
40
- class="text-[12px] leading-snug text-slate-400"
40
+ class="text-[12px] leading-snug text-muted"
41
41
  data-testid="pipeline-preview-description"
42
42
  >
43
43
  {{ pipeline.description }}
44
44
  </p>
45
45
 
46
46
  <div
47
- class="flex flex-wrap items-center gap-x-3 gap-y-1 text-[10px] uppercase tracking-wide text-slate-500"
47
+ class="flex flex-wrap items-center gap-x-3 gap-y-1 text-[10px] uppercase tracking-wide text-dimmed"
48
48
  >
49
49
  <span class="inline-flex items-center gap-1">
50
50
  <UIcon name="i-lucide-workflow" class="h-3 w-3" />
@@ -52,13 +52,13 @@ function stepDescription(kind: string): string {
52
52
  </span>
53
53
  <!-- Gates are the reason a run stops for a human, so they earn a headline of their own
54
54
  rather than only the per-step marker below. -->
55
- <span v-if="gateCount" class="inline-flex items-center gap-1 text-amber-500">
55
+ <span v-if="gateCount" class="inline-flex items-center gap-1 text-app-warning-500">
56
56
  <UIcon name="i-lucide-shield-check" class="h-3 w-3" />
57
57
  {{ t('pipeline.preview.gateCount', { count: gateCount }, gateCount) }}
58
58
  </span>
59
59
  <!-- Conditional steps change what a run of this pipeline actually does from task to task,
60
60
  which is exactly what a preview read BEFORE picking has to say out loud. -->
61
- <span v-if="conditionalCount" class="inline-flex items-center gap-1 text-sky-500">
61
+ <span v-if="conditionalCount" class="inline-flex items-center gap-1 text-app-info-500">
62
62
  <UIcon name="i-lucide-git-branch" class="h-3 w-3" />
63
63
  {{ t('pipeline.preview.conditionalCount', { count: conditionalCount }, conditionalCount) }}
64
64
  </span>
@@ -76,11 +76,11 @@ function stepDescription(kind: string): string {
76
76
  >
77
77
  <div class="flex flex-col items-center">
78
78
  <span
79
- class="flex h-4 w-4 shrink-0 items-center justify-center rounded-full bg-slate-800 font-mono text-[9px] tabular-nums text-slate-400"
79
+ class="flex h-4 w-4 shrink-0 items-center justify-center rounded-full bg-elevated font-mono text-[9px] tabular-nums text-muted"
80
80
  >
81
81
  {{ i + 1 }}
82
82
  </span>
83
- <span v-if="i < steps.length - 1" class="w-px flex-1 bg-slate-800" />
83
+ <span v-if="i < steps.length - 1" class="w-px flex-1 bg-elevated" />
84
84
  </div>
85
85
  <div class="min-w-0 flex-1 pb-2">
86
86
  <div class="flex items-center gap-1">
@@ -88,20 +88,20 @@ function stepDescription(kind: string): string {
88
88
  <UIcon
89
89
  v-if="s.gated"
90
90
  name="i-lucide-shield-check"
91
- class="h-3 w-3 shrink-0 text-amber-400"
91
+ class="h-3 w-3 shrink-0 text-app-warning-400"
92
92
  :title="t('pipeline.preview.gated')"
93
93
  />
94
94
  <UIcon
95
95
  v-for="c in s.conditions"
96
96
  :key="c"
97
97
  :name="CONDITION_MARKERS[c].icon"
98
- class="h-3 w-3 shrink-0 text-sky-400"
98
+ class="h-3 w-3 shrink-0 text-app-info-400"
99
99
  :title="t(CONDITION_MARKERS[c].key)"
100
100
  />
101
101
  </div>
102
102
  <!-- Clamped: the catalog prose runs long for some kinds, and <AgentKindIcon> already
103
103
  carries the full text in its hover tooltip. -->
104
- <p class="line-clamp-2 text-[11px] leading-snug text-slate-500">
104
+ <p class="line-clamp-2 text-[11px] leading-snug text-dimmed">
105
105
  {{ stepDescription(s.kind) }}
106
106
  </p>
107
107
  </div>