@cat-factory/app 0.302.2 → 0.303.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/README.md +99 -14
  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 +26 -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
@@ -113,8 +113,8 @@ const canLeaveReview = computed(
113
113
  <!-- detection status -->
114
114
  <div class="flex items-center justify-between gap-2">
115
115
  <div class="min-w-0">
116
- <p class="text-sm font-medium text-slate-200">{{ store.targetFrame?.title }}</p>
117
- <p class="text-[11px] text-slate-500">{{ t('environmentWizard.review.detectHint') }}</p>
116
+ <p class="text-sm font-medium text-default">{{ store.targetFrame?.title }}</p>
117
+ <p class="text-[11px] text-dimmed">{{ t('environmentWizard.review.detectHint') }}</p>
118
118
  </div>
119
119
  <UButton
120
120
  size="xs"
@@ -130,12 +130,12 @@ const canLeaveReview = computed(
130
130
  </UButton>
131
131
  </div>
132
132
 
133
- <p v-if="!store.hasRepo" class="text-[12px] text-amber-300/80">
133
+ <p v-if="!store.hasRepo" class="text-[12px] text-app-warning-300/80">
134
134
  {{ t('environmentWizard.review.noRepo') }}
135
135
  </p>
136
136
  <p
137
137
  v-else-if="store.detectError"
138
- class="text-[12px] text-rose-300/80"
138
+ class="text-[12px] text-app-error-300/80"
139
139
  data-testid="env-setup-detect-error"
140
140
  >
141
141
  {{ t('environmentWizard.review.detectError') }}
@@ -145,15 +145,11 @@ const canLeaveReview = computed(
145
145
  <!-- deep analysis (opt-in; elevated to a prominent nudge when the repo ships its own CLI) -->
146
146
  <div
147
147
  class="rounded-md border p-3"
148
- :class="
149
- repoCliHint
150
- ? 'border-primary-700/60 bg-primary-950/30'
151
- : 'border-slate-800 bg-slate-900/40'
152
- "
148
+ :class="repoCliHint ? 'border-primary/60 bg-primary/10' : 'border-default bg-default/40'"
153
149
  >
154
150
  <p
155
151
  v-if="repoCliHint"
156
- class="mb-2 flex items-start gap-1.5 text-[11px] text-primary-300"
152
+ class="mb-2 flex items-start gap-1.5 text-[11px] text-primary"
157
153
  data-testid="env-setup-cli-nudge"
158
154
  >
159
155
  <UIcon name="i-lucide-lightbulb" class="mt-0.5 h-3.5 w-3.5 shrink-0" />
@@ -161,10 +157,10 @@ const canLeaveReview = computed(
161
157
  </p>
162
158
  <div class="flex items-center justify-between gap-2">
163
159
  <div class="min-w-0">
164
- <p class="text-[12px] font-medium text-slate-300">
160
+ <p class="text-[12px] font-medium text-toned">
165
161
  {{ t('environmentWizard.analysis.title') }}
166
162
  </p>
167
- <p class="text-[11px] text-slate-500">{{ t('environmentWizard.analysis.hint') }}</p>
163
+ <p class="text-[11px] text-dimmed">{{ t('environmentWizard.analysis.hint') }}</p>
168
164
  </div>
169
165
  <UButton
170
166
  size="xs"
@@ -181,12 +177,15 @@ const canLeaveReview = computed(
181
177
  </div>
182
178
  <p
183
179
  v-if="!store.canAnalyze"
184
- class="mt-2 text-[11px] text-slate-500"
180
+ class="mt-2 text-[11px] text-dimmed"
185
181
  data-testid="env-setup-analysis-unavailable"
186
182
  >
187
183
  {{ t('environmentWizard.analysis.unavailable') }}
188
184
  </p>
189
- <p v-else-if="store.analysisStatus === 'failed'" class="mt-2 text-[11px] text-rose-300/80">
185
+ <p
186
+ v-else-if="store.analysisStatus === 'failed'"
187
+ class="mt-2 text-[11px] text-app-error-300/80"
188
+ >
190
189
  {{ t('environmentWizard.analysis.failed') }}
191
190
  </p>
192
191
  <div
@@ -194,7 +193,7 @@ const canLeaveReview = computed(
194
193
  class="mt-2 space-y-2"
195
194
  data-testid="env-setup-analysis-ready"
196
195
  >
197
- <p v-if="store.merged?.summary" class="text-[11px] leading-snug text-slate-400">
196
+ <p v-if="store.merged?.summary" class="text-[11px] leading-snug text-muted">
198
197
  {{ store.merged.summary }}
199
198
  </p>
200
199
  <UButton
@@ -212,7 +211,7 @@ const canLeaveReview = computed(
212
211
 
213
212
  <!-- per-field provenance -->
214
213
  <div v-if="store.merged?.fields.length" class="space-y-1.5">
215
- <p class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
214
+ <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
216
215
  {{ t('environmentWizard.review.provenanceTitle') }}
217
216
  </p>
218
217
  <div class="flex flex-wrap gap-1.5">
@@ -262,7 +261,7 @@ const canLeaveReview = computed(
262
261
 
263
262
  <!-- compose file layering -->
264
263
  <div v-if="composeFileCandidates.length" class="space-y-1.5">
265
- <p class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
264
+ <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
266
265
  {{ t('environmentWizard.review.composeFiles') }}
267
266
  </p>
268
267
  <div class="flex flex-wrap gap-1.5">
@@ -283,7 +282,7 @@ const canLeaveReview = computed(
283
282
 
284
283
  <!-- compose profiles -->
285
284
  <div v-if="profileCandidates.length" class="space-y-1.5">
286
- <p class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
285
+ <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
287
286
  {{ t('environmentWizard.review.profiles') }}
288
287
  </p>
289
288
  <div class="flex flex-wrap gap-1.5">
@@ -304,16 +303,16 @@ const canLeaveReview = computed(
304
303
 
305
304
  <!-- seed dumps -->
306
305
  <div v-if="seedDumpCandidates.length" class="space-y-1.5">
307
- <p class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
306
+ <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
308
307
  {{ t('environmentWizard.review.seedDumps') }}
309
308
  </p>
310
309
  <div class="space-y-1">
311
310
  <div
312
311
  v-for="c in seedDumpCandidates"
313
312
  :key="c.path"
314
- class="flex items-center justify-between gap-2 rounded border border-slate-800 bg-slate-900/40 px-2 py-1"
313
+ class="flex items-center justify-between gap-2 rounded border border-default bg-default/40 px-2 py-1"
315
314
  >
316
- <span class="truncate text-[11px] text-slate-300">{{ c.path }}</span>
315
+ <span class="truncate text-[11px] text-toned">{{ c.path }}</span>
317
316
  <UButton
318
317
  size="xs"
319
318
  :color="seedAdded(c.path) ? 'success' : 'neutral'"
@@ -352,7 +351,11 @@ const canLeaveReview = computed(
352
351
  class="w-full font-mono text-[11px]"
353
352
  data-testid="env-setup-raw-text"
354
353
  />
355
- <p v-if="rawError" class="text-[11px] text-rose-300/80" data-testid="env-setup-raw-error">
354
+ <p
355
+ v-if="rawError"
356
+ class="text-[11px] text-app-error-300/80"
357
+ data-testid="env-setup-raw-error"
358
+ >
356
359
  {{ rawError }}
357
360
  </p>
358
361
  <div class="flex justify-end">
@@ -31,7 +31,7 @@ useEnvironmentWizardTarget(() => props.input.frameId)
31
31
  <UInput v-model="store.handlerLabel" class="w-full" data-testid="env-setup-handler-label" />
32
32
  </UFormField>
33
33
 
34
- <div class="rounded-md border border-slate-800 bg-slate-900/40 p-3 text-[12px] text-slate-300">
34
+ <div class="rounded-md border border-default bg-default/40 p-3 text-[12px] text-toned">
35
35
  <p>
36
36
  {{
37
37
  t('environmentWizard.save.summary', {
@@ -44,7 +44,7 @@ useEnvironmentWizardTarget(() => props.input.frameId)
44
44
 
45
45
  <p
46
46
  v-if="store.saveError"
47
- class="text-[12px] text-rose-300/80"
47
+ class="text-[12px] text-app-error-300/80"
48
48
  data-testid="env-setup-save-error"
49
49
  >
50
50
  {{ store.saveError }}
@@ -66,7 +66,7 @@ useEnvironmentWizardTarget(() => props.input.frameId)
66
66
  <!-- saved: confirmation + optional trial provision -->
67
67
  <template v-else>
68
68
  <div
69
- class="flex items-center gap-2 rounded-md border border-emerald-800/50 bg-emerald-950/30 p-2 text-[12px] text-emerald-200"
69
+ class="flex items-center gap-2 rounded-md border border-app-success-800/50 bg-app-success-950/30 p-2 text-[12px] text-app-success-200"
70
70
  data-testid="env-setup-saved"
71
71
  >
72
72
  <UIcon name="i-lucide-check-circle" class="h-4 w-4" />
@@ -74,7 +74,7 @@ useEnvironmentWizardTarget(() => props.input.frameId)
74
74
  </div>
75
75
 
76
76
  <div class="flex items-center justify-between gap-2">
77
- <p class="text-[11px] text-slate-500">{{ t('environmentWizard.trial.hint') }}</p>
77
+ <p class="text-[11px] text-dimmed">{{ t('environmentWizard.trial.hint') }}</p>
78
78
  <UButton
79
79
  size="xs"
80
80
  variant="soft"
@@ -88,7 +88,9 @@ useEnvironmentWizardTarget(() => props.input.frameId)
88
88
  {{ t('environmentWizard.trial.run') }}
89
89
  </UButton>
90
90
  </div>
91
- <p v-if="store.trialError" class="text-[11px] text-rose-300/80">{{ store.trialError }}</p>
91
+ <p v-if="store.trialError" class="text-[11px] text-app-error-300/80">
92
+ {{ store.trialError }}
93
+ </p>
92
94
  <ProvisioningLogsDrawer v-if="store.trialStarted" subsystem="environment" />
93
95
  </template>
94
96
 
@@ -14,7 +14,7 @@ const { t } = useI18n()
14
14
  </script>
15
15
 
16
16
  <template>
17
- <div class="flex items-center justify-between border-t border-slate-800 pt-3">
17
+ <div class="flex items-center justify-between border-t border-default pt-3">
18
18
  <UButton
19
19
  color="neutral"
20
20
  variant="ghost"
@@ -95,14 +95,14 @@ function openApprovalFor(approvalId: string) {
95
95
  leave animation survives this component being unmounted by its v-if gate. -->
96
96
  <div
97
97
  v-if="block && statusMeta && typeMeta"
98
- class="absolute inset-0 z-30 flex flex-col bg-slate-950/95 backdrop-blur"
98
+ class="absolute inset-0 z-30 flex flex-col bg-app-950/95 backdrop-blur"
99
99
  role="dialog"
100
100
  aria-modal="true"
101
101
  data-testid="block-focus-view"
102
102
  :data-focus-block="block.id"
103
103
  >
104
104
  <!-- header / breadcrumb -->
105
- <header class="flex items-center gap-3 border-b border-slate-800 px-6 py-4">
105
+ <header class="flex items-center gap-3 border-b border-default px-6 py-4">
106
106
  <UButton
107
107
  icon="i-lucide-arrow-left"
108
108
  :ui="{ leadingIcon: 'rtl:-scale-x-100', trailingIcon: 'rtl:-scale-x-100' }"
@@ -113,16 +113,16 @@ function openApprovalFor(approvalId: string) {
113
113
  >
114
114
  {{ t('focus.board') }}
115
115
  </UButton>
116
- <UIcon name="i-lucide-chevron-right" class="h-4 w-4 text-slate-600 rtl:-scale-x-100" />
116
+ <UIcon name="i-lucide-chevron-right" class="h-4 w-4 text-app-600 rtl:-scale-x-100" />
117
117
  <div
118
118
  class="flex h-9 w-9 items-center justify-center rounded-lg"
119
- :style="{ backgroundColor: typeMeta.accent + '22' }"
119
+ :style="{ backgroundColor: tint(typeMeta.accent) }"
120
120
  >
121
121
  <UIcon :name="typeMeta.icon" class="h-5 w-5" :style="{ color: typeMeta.accent }" />
122
122
  </div>
123
123
  <div>
124
- <h1 class="text-lg font-semibold text-white">{{ block.title }}</h1>
125
- <div class="text-xs text-slate-500">
124
+ <h1 class="text-lg font-semibold text-highlighted">{{ block.title }}</h1>
125
+ <div class="text-xs text-dimmed">
126
126
  {{ t('focus.typeSubtitle', { type: typeMeta.label }) }}
127
127
  </div>
128
128
  </div>
@@ -199,11 +199,11 @@ function openApprovalFor(approvalId: string) {
199
199
  <div class="grid flex-1 grid-cols-[1fr_300px] gap-6 overflow-hidden p-6">
200
200
  <!-- main: pipeline flow -->
201
201
  <section
202
- class="flex flex-col overflow-auto rounded-2xl border border-slate-800 bg-slate-900/60 p-6"
202
+ class="flex flex-col overflow-auto rounded-2xl border border-default bg-default/60 p-6"
203
203
  >
204
204
  <div class="mb-4 flex items-center gap-2">
205
- <UIcon name="i-lucide-workflow" class="h-4 w-4 text-slate-500" />
206
- <h2 class="text-sm font-semibold uppercase tracking-wide text-slate-400">
205
+ <UIcon name="i-lucide-workflow" class="h-4 w-4 text-dimmed" />
206
+ <h2 class="text-sm font-semibold uppercase tracking-wide text-muted">
207
207
  {{ instance ? instance.pipelineName : t('focus.noPipelineRunning') }}
208
208
  </h2>
209
209
  </div>
@@ -217,33 +217,31 @@ function openApprovalFor(approvalId: string) {
217
217
 
218
218
  <div
219
219
  v-else
220
- class="flex flex-1 items-center justify-center rounded-xl border border-dashed border-slate-700 text-sm text-slate-500"
220
+ class="flex flex-1 items-center justify-center rounded-xl border border-dashed border-muted text-sm text-dimmed"
221
221
  >
222
222
  {{ t('focus.emptyPipelineHint') }}
223
223
  </div>
224
224
  </section>
225
225
 
226
226
  <!-- side: details -->
227
- <aside
228
- class="space-y-4 overflow-auto rounded-2xl border border-slate-800 bg-slate-900/60 p-5"
229
- >
227
+ <aside class="space-y-4 overflow-auto rounded-2xl border border-default bg-default/60 p-5">
230
228
  <div>
231
- <div class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-400">
229
+ <div class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-muted">
232
230
  {{ t('focus.description') }}
233
231
  </div>
234
- <p class="text-sm text-slate-300">{{ block.description }}</p>
232
+ <p class="text-sm text-toned">{{ block.description }}</p>
235
233
  </div>
236
234
  <div v-if="instance">
237
- <div class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-400">
235
+ <div class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-muted">
238
236
  {{ t('focus.overallProgress') }}
239
237
  </div>
240
238
  <UProgress :model-value="Math.round(block.progress * 100)" />
241
- <div class="mt-1 text-[11px] text-slate-400">
239
+ <div class="mt-1 text-[11px] text-muted">
242
240
  {{ n(block.progress, 'percent') }}
243
241
  </div>
244
242
  </div>
245
243
  <div>
246
- <div class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-400">
244
+ <div class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-muted">
247
245
  {{ t('focus.dependencies') }}
248
246
  </div>
249
247
  <div v-if="deps.length" class="flex flex-wrap gap-1">
@@ -251,7 +249,7 @@ function openApprovalFor(approvalId: string) {
251
249
  {{ d.title }}
252
250
  </UBadge>
253
251
  </div>
254
- <div v-else class="text-[11px] text-slate-500">{{ t('focus.noDependencies') }}</div>
252
+ <div v-else class="text-[11px] text-dimmed">{{ t('focus.noDependencies') }}</div>
255
253
  </div>
256
254
  </aside>
257
255
  </div>
@@ -120,12 +120,12 @@ const STATUS_META: Record<
120
120
  FollowUpItem['status'],
121
121
  { badge: 'neutral' | 'info' | 'success' | 'warning'; text: string }
122
122
  > = {
123
- pending: { badge: 'warning', text: 'text-amber-300' },
124
- filed: { badge: 'success', text: 'text-emerald-300' },
125
- queued: { badge: 'info', text: 'text-sky-300' },
126
- answered: { badge: 'info', text: 'text-sky-300' },
127
- closed: { badge: 'neutral', text: 'text-slate-300' },
128
- dismissed: { badge: 'neutral', text: 'text-slate-400' },
123
+ pending: { badge: 'warning', text: 'text-app-warning-300' },
124
+ filed: { badge: 'success', text: 'text-app-success-300' },
125
+ queued: { badge: 'info', text: 'text-app-info-300' },
126
+ answered: { badge: 'info', text: 'text-app-info-300' },
127
+ closed: { badge: 'neutral', text: 'text-toned' },
128
+ dismissed: { badge: 'neutral', text: 'text-muted' },
129
129
  }
130
130
 
131
131
  /** Whether a decided item carries a recorded reply to show ('answered' or 'closed'). */
@@ -138,7 +138,7 @@ function hasRecordedAnswer(item: FollowUpItem): boolean {
138
138
  <ResultWindowShell
139
139
  :open="open"
140
140
  :icon="FOLLOW_UP_COMPANION_META.icon"
141
- icon-class="bg-pink-500/15 text-pink-300"
141
+ icon-class="bg-app-hue-pink/15 text-app-hue-pink"
142
142
  :title="headerTitle"
143
143
  :subtitle="t('followUp.subtitle')"
144
144
  width="3xl"
@@ -158,11 +158,11 @@ function hasRecordedAnswer(item: FollowUpItem): boolean {
158
158
  <!-- Empty -->
159
159
  <div
160
160
  v-if="items.length === 0"
161
- class="flex h-full flex-col items-center justify-center gap-2 py-10 text-center text-slate-400"
161
+ class="flex h-full flex-col items-center justify-center gap-2 py-10 text-center text-muted"
162
162
  >
163
163
  <UIcon :name="FOLLOW_UP_COMPANION_META.icon" class="h-8 w-8 opacity-40" />
164
164
  <p class="text-sm">{{ t('followUp.empty.title') }}</p>
165
- <p class="max-w-sm text-[11px] text-slate-500">
165
+ <p class="max-w-sm text-[11px] text-dimmed">
166
166
  {{ t('followUp.empty.hint') }}
167
167
  </p>
168
168
  </div>
@@ -170,7 +170,7 @@ function hasRecordedAnswer(item: FollowUpItem): boolean {
170
170
  <div v-else class="space-y-3">
171
171
  <p
172
172
  v-if="followUps.error"
173
- class="rounded-md bg-rose-500/10 px-3 py-2 text-[12px] text-rose-300"
173
+ class="rounded-md bg-app-error-500/10 px-3 py-2 text-[12px] text-app-error-300"
174
174
  >
175
175
  {{ followUps.error }}
176
176
  </p>
@@ -178,29 +178,29 @@ function hasRecordedAnswer(item: FollowUpItem): boolean {
178
178
  <article
179
179
  v-for="item in items"
180
180
  :key="item.id"
181
- class="rounded-xl border border-slate-800 bg-slate-900/60 px-4 py-3"
182
- :class="item.status === 'pending' ? 'border-amber-500/40' : ''"
181
+ class="rounded-xl border border-default bg-default/60 px-4 py-3"
182
+ :class="item.status === 'pending' ? 'border-app-warning-500/40' : ''"
183
183
  >
184
184
  <div class="flex items-start gap-2">
185
185
  <UIcon
186
186
  :name="item.kind === 'question' ? 'i-lucide-circle-help' : 'i-lucide-compass'"
187
187
  class="mt-0.5 h-4 w-4 shrink-0"
188
- :class="item.kind === 'question' ? 'text-sky-300' : 'text-pink-300'"
188
+ :class="item.kind === 'question' ? 'text-app-info-300' : 'text-app-hue-pink'"
189
189
  />
190
190
  <div class="min-w-0 flex-1">
191
191
  <div class="flex items-center gap-2">
192
- <h3 class="min-w-0 flex-1 truncate text-[13px] font-medium text-slate-100">
192
+ <h3 class="min-w-0 flex-1 truncate text-[13px] font-medium text-app-100">
193
193
  {{ item.title }}
194
194
  </h3>
195
195
  <UBadge :color="STATUS_META[item.status].badge" variant="subtle" size="sm">
196
196
  {{ t(STATUS_LABEL_KEYS[item.status]) }}
197
197
  </UBadge>
198
198
  </div>
199
- <p v-if="item.detail" class="mt-1 whitespace-pre-wrap text-[12px] text-slate-300">
199
+ <p v-if="item.detail" class="mt-1 whitespace-pre-wrap text-[12px] text-toned">
200
200
  {{ item.detail }}
201
201
  </p>
202
- <p v-if="item.suggestedAction" class="mt-1 text-[11px] text-slate-400">
203
- <span class="text-slate-500">{{ t('followUp.suggested') }}</span>
202
+ <p v-if="item.suggestedAction" class="mt-1 text-[11px] text-muted">
203
+ <span class="text-dimmed">{{ t('followUp.suggested') }}</span>
204
204
  {{ item.suggestedAction }}
205
205
  </p>
206
206
  <p v-if="item.status === 'filed' && item.ticketUrl" class="mt-1 text-[11px]">
@@ -208,13 +208,13 @@ function hasRecordedAnswer(item: FollowUpItem): boolean {
208
208
  :href="item.ticketUrl"
209
209
  target="_blank"
210
210
  rel="noopener"
211
- class="text-emerald-300 hover:underline"
211
+ class="text-app-success-300 hover:underline"
212
212
  >
213
213
  {{ item.ticketExternalId ?? t('followUp.viewIssue') }}
214
214
  </a>
215
215
  </p>
216
- <p v-if="hasRecordedAnswer(item)" class="mt-1 text-[11px] text-slate-300">
217
- <span class="text-slate-500">
216
+ <p v-if="hasRecordedAnswer(item)" class="mt-1 text-[11px] text-toned">
217
+ <span class="text-dimmed">
218
218
  {{
219
219
  item.status === 'closed' ? t('followUp.yourRuling') : t('followUp.yourAnswer')
220
220
  }}
@@ -223,7 +223,7 @@ function hasRecordedAnswer(item: FollowUpItem): boolean {
223
223
  </p>
224
224
  <!-- A decision that was made and then thrown away when the budget ran out. It must
225
225
  not read like one the Coder acted on. -->
226
- <p v-if="item.sendBackDropped" class="mt-1 text-[11px] text-amber-300">
226
+ <p v-if="item.sendBackDropped" class="mt-1 text-[11px] text-app-warning-300">
227
227
  {{ t('followUp.sendBackDropped') }}
228
228
  </p>
229
229
 
@@ -235,7 +235,7 @@ function hasRecordedAnswer(item: FollowUpItem): boolean {
235
235
  v-model="drafts[item.id]"
236
236
  rows="2"
237
237
  :placeholder="t('followUp.answerPlaceholder')"
238
- class="w-full resize-y rounded-md border border-slate-700 bg-slate-950/60 px-2.5 py-1.5 text-[12px] text-slate-100 placeholder:text-slate-600 focus:border-sky-500 focus:outline-none focus-visible:ring-2 focus-visible:ring-sky-500/60"
238
+ class="w-full resize-y rounded-md border border-muted bg-app-950/60 px-2.5 py-1.5 text-[12px] text-app-100 placeholder:text-app-600 focus:border-app-info-500 focus:outline-none focus-visible:ring-2 focus-visible:ring-app-info-500/60"
239
239
  />
240
240
  <!-- Wraps, like the follow-up row below: three buttons whose labels are two
241
241
  words each in English are one long line in most of the other locales, and
@@ -323,7 +323,7 @@ function hasRecordedAnswer(item: FollowUpItem): boolean {
323
323
  </div>
324
324
 
325
325
  <footer
326
- class="flex items-center justify-between border-t border-slate-800 px-5 py-2.5 text-[11px] text-slate-400"
326
+ class="flex items-center justify-between border-t border-default px-5 py-2.5 text-[11px] text-muted"
327
327
  >
328
328
  <span>
329
329
  {{