@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
@@ -221,7 +221,7 @@ function manageKeys() {
221
221
  </template>
222
222
  <template #body>
223
223
  <div class="space-y-4">
224
- <p class="text-xs text-slate-400">
224
+ <p class="text-xs text-muted">
225
225
  <i18n-t keypath="settings.openRouterCatalog.intro" tag="span" scope="global">
226
226
  <template #models>
227
227
  <strong>{{ t('settings.openRouterCatalog.introModels') }}</strong>
@@ -232,12 +232,12 @@ function manageKeys() {
232
232
  <!-- Step 1: connect a key (inline) — hidden once a key is connected -->
233
233
  <div
234
234
  v-if="!keyConnected"
235
- class="space-y-3 rounded-lg border border-slate-700 bg-slate-900/60 p-4"
235
+ class="space-y-3 rounded-lg border border-muted bg-default/60 p-4"
236
236
  >
237
- <h4 class="text-xs font-semibold uppercase tracking-wide text-slate-500">
237
+ <h4 class="text-xs font-semibold uppercase tracking-wide text-dimmed">
238
238
  {{ t('settings.openRouterCatalog.connectHeading') }}
239
239
  </h4>
240
- <ol class="list-decimal space-y-1 ps-5 text-sm text-slate-300">
240
+ <ol class="list-decimal space-y-1 ps-5 text-sm text-toned">
241
241
  <li>
242
242
  <i18n-t keypath="settings.openRouterCatalog.step1" tag="span" scope="global">
243
243
  <template #link>
@@ -245,7 +245,7 @@ function manageKeys() {
245
245
  href="https://openrouter.ai/keys"
246
246
  target="_blank"
247
247
  rel="noopener noreferrer"
248
- class="text-primary-400 underline"
248
+ class="text-primary underline"
249
249
  >{{ t('settings.openRouterCatalog.step1Link') }}</a
250
250
  >
251
251
  </template>
@@ -299,10 +299,10 @@ function manageKeys() {
299
299
  <!-- Key connected status -->
300
300
  <div
301
301
  v-else
302
- class="flex items-center justify-between rounded-lg border border-slate-700 bg-slate-900/60 px-3 py-2 text-sm"
302
+ class="flex items-center justify-between rounded-lg border border-muted bg-default/60 px-3 py-2 text-sm"
303
303
  >
304
- <span class="flex items-center gap-2 text-slate-300">
305
- <UIcon name="i-lucide-check-circle" class="h-4 w-4 text-emerald-400" />
304
+ <span class="flex items-center gap-2 text-toned">
305
+ <UIcon name="i-lucide-check-circle" class="h-4 w-4 text-app-success-400" />
306
306
  {{ t('settings.openRouterCatalog.keyConnected') }}
307
307
  </span>
308
308
  <UButton color="neutral" variant="ghost" size="xs" @click="manageKeys()">
@@ -342,31 +342,35 @@ function manageKeys() {
342
342
  />
343
343
  </div>
344
344
 
345
- <p v-if="store.refreshError" class="text-xs text-rose-400">{{ store.refreshError }}</p>
345
+ <p v-if="store.refreshError" class="text-xs text-app-error-400">
346
+ {{ store.refreshError }}
347
+ </p>
346
348
 
347
349
  <div v-if="visible.length" class="max-h-96 space-y-1 overflow-y-auto pe-1">
348
350
  <label
349
351
  v-for="m in visible"
350
352
  :key="m.id"
351
- class="flex items-center gap-2 rounded-md border border-slate-800 bg-slate-900/40 px-2.5 py-1.5 text-sm"
353
+ class="flex items-center gap-2 rounded-md border border-default bg-default/40 px-2.5 py-1.5 text-sm"
352
354
  >
353
355
  <UCheckbox
354
356
  :model-value="selected.has(m.id)"
355
357
  @update:model-value="(v: boolean | 'indeterminate') => toggle(m.id, v === true)"
356
358
  />
357
359
  <span class="min-w-0 flex-1">
358
- <span class="block truncate text-slate-200">{{ m.name }}</span>
359
- <span class="block truncate font-mono text-[11px] text-slate-500">{{ m.id }}</span>
360
+ <span class="block truncate text-default">{{ m.name }}</span>
361
+ <span class="block truncate font-mono text-[11px] text-dimmed">{{ m.id }}</span>
360
362
  <!--
361
363
  A withdrawal date is the one fact about a model that fails SILENTLY: past it the
362
364
  route simply stops answering and the run falls through to whatever the picker
363
365
  offers next, so the moment to see it is while choosing.
364
366
  -->
365
- <span v-if="m.expirationDate" class="block truncate text-[11px] text-amber-400">{{
366
- t('settings.openRouterCatalog.retiresOn', { date: m.expirationDate })
367
- }}</span>
367
+ <span
368
+ v-if="m.expirationDate"
369
+ class="block truncate text-[11px] text-app-warning-400"
370
+ >{{ t('settings.openRouterCatalog.retiresOn', { date: m.expirationDate }) }}</span
371
+ >
368
372
  </span>
369
- <span class="shrink-0 text-end text-[11px] text-slate-500">
373
+ <span class="shrink-0 text-end text-[11px] text-dimmed">
370
374
  <span v-if="m.contextLength" class="block">{{
371
375
  contextLabel(m.contextLength)
372
376
  }}</span>
@@ -374,16 +378,16 @@ function manageKeys() {
374
378
  </span>
375
379
  </label>
376
380
  </div>
377
- <p v-else class="text-xs text-slate-500">
381
+ <p v-else class="text-xs text-dimmed">
378
382
  <i18n-t keypath="settings.openRouterCatalog.empty" tag="span" scope="global">
379
383
  <template #action>
380
- <span class="text-slate-300">{{ t('settings.openRouterCatalog.refresh') }}</span>
384
+ <span class="text-toned">{{ t('settings.openRouterCatalog.refresh') }}</span>
381
385
  </template>
382
386
  </i18n-t>
383
387
  </p>
384
388
 
385
389
  <div class="flex items-center justify-between">
386
- <span class="text-xs text-slate-500">{{
390
+ <span class="text-xs text-dimmed">{{
387
391
  t('settings.openRouterCatalog.enabledCount', { count: selectedCount }, selectedCount)
388
392
  }}</span>
389
393
  <UButton
@@ -99,23 +99,23 @@ async function removeEntry(entryId: string) {
99
99
 
100
100
  <template>
101
101
  <div class="space-y-4" data-testid="package-registries-panel">
102
- <p class="text-sm text-slate-400">
102
+ <p class="text-sm text-muted">
103
103
  {{ t('settings.packageRegistries.intro') }}
104
104
  </p>
105
105
 
106
- <section v-if="store.entries.length" class="space-y-2 rounded-lg border border-slate-700 p-3">
106
+ <section v-if="store.entries.length" class="space-y-2 rounded-lg border border-muted p-3">
107
107
  <h3 class="text-sm font-semibold">
108
108
  {{ t('settings.packageRegistries.list.heading') }}
109
109
  </h3>
110
110
  <div
111
111
  v-for="entry in store.entries"
112
112
  :key="entry.id"
113
- class="flex items-center justify-between gap-2 rounded-md border border-slate-800 px-3 py-2"
113
+ class="flex items-center justify-between gap-2 rounded-md border border-default px-3 py-2"
114
114
  >
115
115
  <div class="min-w-0 space-y-1">
116
116
  <div class="flex items-center gap-2">
117
117
  <span class="text-sm font-medium">{{ vendorLabel(entry.vendor) }}</span>
118
- <span class="text-[11px] text-slate-500">
118
+ <span class="text-[11px] text-dimmed">
119
119
  {{ t('settings.packageRegistries.list.tokenTail', { tail: entry.tokenTail }) }}
120
120
  </span>
121
121
  </div>
@@ -132,7 +132,7 @@ async function removeEntry(entryId: string) {
132
132
  <!-- An entry with no scopes authenticates its host without routing any scope to
133
133
  it (the deliberate mixed public/private setup) — say so, or the row reads as
134
134
  half-configured. -->
135
- <span v-if="!entry.scopes.length" class="text-[11px] text-slate-500">
135
+ <span v-if="!entry.scopes.length" class="text-[11px] text-dimmed">
136
136
  {{ t('settings.packageRegistries.list.noScopes') }}
137
137
  </span>
138
138
  </div>
@@ -150,7 +150,7 @@ async function removeEntry(entryId: string) {
150
150
  </div>
151
151
  </section>
152
152
 
153
- <section class="space-y-3 rounded-lg border border-slate-700 p-3">
153
+ <section class="space-y-3 rounded-lg border border-muted p-3">
154
154
  <h3 class="text-sm font-semibold">
155
155
  {{ t('settings.packageRegistries.add.heading') }}
156
156
  </h3>
@@ -164,7 +164,7 @@ async function removeEntry(entryId: string) {
164
164
  data-testid="package-registry-vendor"
165
165
  />
166
166
  </UFormField>
167
- <p class="text-[11px] text-slate-500">
167
+ <p class="text-[11px] text-dimmed">
168
168
  {{ t('settings.packageRegistries.add.host', { host: vendorHost }) }}
169
169
  </p>
170
170
 
@@ -197,7 +197,7 @@ async function removeEntry(entryId: string) {
197
197
  </div>
198
198
  <!-- Why leaving this empty is often the RIGHT answer — a scope mapping is all-or-nothing,
199
199
  so an org publishing some of its `@org` packages publicly breaks under one. -->
200
- <p class="text-[11px] text-slate-500">
200
+ <p class="text-[11px] text-dimmed">
201
201
  {{ t('settings.packageRegistries.add.scopesNote') }}
202
202
  </p>
203
203
 
@@ -353,7 +353,7 @@ function fieldHelp(key: string): string | undefined {
353
353
  <template>
354
354
  <div v-if="descriptor" class="space-y-4">
355
355
  <div class="flex items-start justify-between gap-3">
356
- <p class="text-xs text-slate-400">{{ blurb }}</p>
356
+ <p class="text-xs text-muted">{{ blurb }}</p>
357
357
  <UButton
358
358
  :icon="showLogs ? 'i-lucide-chevron-up' : 'i-lucide-scroll-text'"
359
359
  variant="ghost"
@@ -379,11 +379,11 @@ function fieldHelp(key: string): string | undefined {
379
379
  <!-- Saved connection summary -->
380
380
  <div
381
381
  v-if="connection"
382
- class="flex items-center justify-between rounded-md border border-slate-700 bg-slate-900/50 px-3 py-2 text-sm"
382
+ class="flex items-center justify-between rounded-md border border-muted bg-default/50 px-3 py-2 text-sm"
383
383
  >
384
384
  <div>
385
- <span class="font-medium text-slate-200">{{ connection.label }}</span>
386
- <div class="text-[11px] text-emerald-400">
385
+ <span class="font-medium text-default">{{ connection.label }}</span>
386
+ <div class="text-[11px] text-app-success-400">
387
387
  {{ t('settings.providerConnection.connectedAt', { baseUrl: connection.baseUrl }) }}
388
388
  </div>
389
389
  </div>
@@ -400,7 +400,7 @@ function fieldHelp(key: string): string | undefined {
400
400
  <!-- Mandatory-fields warning (mirrors the banner) -->
401
401
  <div
402
402
  v-if="descriptor.missingRequired.length"
403
- class="rounded-md border border-amber-500/40 bg-amber-950/40 px-3 py-2 text-xs text-amber-200"
403
+ class="rounded-md border border-app-warning-500/40 bg-app-warning-950/40 px-3 py-2 text-xs text-app-warning-200"
404
404
  >
405
405
  {{
406
406
  t('settings.providerConnection.missingConfig', {
@@ -425,18 +425,15 @@ function fieldHelp(key: string): string | undefined {
425
425
  />
426
426
 
427
427
  <!-- NATIVE provider: the friendly, descriptor-driven flat field form. -->
428
- <div
429
- v-else-if="isNative"
430
- class="rounded-lg border border-dashed border-slate-700 p-3 space-y-3"
431
- >
432
- <p class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
428
+ <div v-else-if="isNative" class="rounded-lg border border-dashed border-muted p-3 space-y-3">
429
+ <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
433
430
  {{
434
431
  connection
435
432
  ? t('settings.providerConnection.form.updateConfiguration')
436
433
  : t('settings.providerConnection.form.connect')
437
434
  }}
438
435
  </p>
439
- <p v-if="connection && hasSecretFields" class="text-[11px] text-amber-300/80">
436
+ <p v-if="connection && hasSecretFields" class="text-[11px] text-app-warning-300/80">
440
437
  {{
441
438
  t(
442
439
  'settings.providerConnection.form.reenterSecrets',
@@ -196,8 +196,8 @@ function onSave() {
196
196
  </script>
197
197
 
198
198
  <template>
199
- <div class="space-y-3 rounded-lg border border-dashed border-slate-700 p-3">
200
- <p class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
199
+ <div class="space-y-3 rounded-lg border border-dashed border-muted p-3">
200
+ <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
201
201
  {{ t('settings.providerConnection.manifestEditor.title') }}
202
202
  </p>
203
203
 
@@ -214,21 +214,21 @@ function onSave() {
214
214
  />
215
215
  </UFormField>
216
216
 
217
- <p v-if="!savedManifest && !jsonError && !schemaError" class="text-[11px] text-slate-500">
217
+ <p v-if="!savedManifest && !jsonError && !schemaError" class="text-[11px] text-dimmed">
218
218
  {{ t('settings.providerConnection.manifestEditor.starterHint') }}
219
219
  </p>
220
220
 
221
221
  <!-- Parse + shape errors, validated against the same contract the backend enforces. -->
222
222
  <p
223
223
  v-if="jsonError"
224
- class="rounded-md border border-rose-500/40 bg-rose-950/40 px-3 py-2 text-xs text-rose-200"
224
+ class="rounded-md border border-app-error-500/40 bg-app-error-950/40 px-3 py-2 text-xs text-app-error-200"
225
225
  data-testid="manifest-editor-error"
226
226
  >
227
227
  {{ t('settings.providerConnection.manifestEditor.invalidJson') }}
228
228
  </p>
229
229
  <p
230
230
  v-else-if="schemaError"
231
- class="rounded-md border border-amber-500/40 bg-amber-950/40 px-3 py-2 text-xs text-amber-200"
231
+ class="rounded-md border border-app-warning-500/40 bg-app-warning-950/40 px-3 py-2 text-xs text-app-warning-200"
232
232
  data-testid="manifest-editor-error"
233
233
  >
234
234
  {{ t('settings.providerConnection.manifestEditor.schemaError', { message: schemaError }) }}
@@ -236,16 +236,16 @@ function onSave() {
236
236
 
237
237
  <!-- Secret sub-form: one write-only input per secret key the manifest references. -->
238
238
  <div class="space-y-2">
239
- <p class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
239
+ <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
240
240
  {{ t('settings.providerConnection.manifestEditor.secretsLabel') }}
241
241
  </p>
242
- <p v-if="!secretKeys.length" class="text-[11px] text-slate-500">
242
+ <p v-if="!secretKeys.length" class="text-[11px] text-dimmed">
243
243
  {{ t('settings.providerConnection.manifestEditor.noSecrets') }}
244
244
  </p>
245
245
  <template v-else-if="connected">
246
246
  <p
247
247
  v-if="storedSecretKeys && storedSecretKeys.length"
248
- class="text-[11px] text-slate-400"
248
+ class="text-[11px] text-muted"
249
249
  data-testid="manifest-editor-stored"
250
250
  >
251
251
  {{
@@ -254,7 +254,7 @@ function onSave() {
254
254
  })
255
255
  }}
256
256
  </p>
257
- <p class="text-[11px] text-amber-300/80">
257
+ <p class="text-[11px] text-app-warning-300/80">
258
258
  {{ t('settings.providerConnection.manifestEditor.reenterSecrets') }}
259
259
  </p>
260
260
  </template>
@@ -90,7 +90,7 @@ function reset() {
90
90
  <template>
91
91
  <div>
92
92
  <div class="mb-1 flex items-start justify-between gap-3">
93
- <span class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
93
+ <span class="text-[11px] font-semibold uppercase tracking-wide text-muted">
94
94
  {{ t('settings.modelConfiguration.routeOrder.label') }}
95
95
  </span>
96
96
  <UButton
@@ -105,7 +105,7 @@ function reset() {
105
105
  {{ t('settings.modelConfiguration.routeOrder.reset') }}
106
106
  </UButton>
107
107
  </div>
108
- <p class="mb-2 text-[11px] leading-relaxed text-slate-500">
108
+ <p class="mb-2 text-[11px] leading-relaxed text-dimmed">
109
109
  {{
110
110
  isCustom
111
111
  ? t('settings.modelConfiguration.routeOrder.customHint')
@@ -118,7 +118,7 @@ function reset() {
118
118
  route a connected plan quietly overrules is the one thing this control must not do. -->
119
119
  <p
120
120
  v-if="subscriptionWins"
121
- class="mb-2 text-[11px] leading-relaxed text-amber-400/90"
121
+ class="mb-2 text-[11px] leading-relaxed text-app-warning-400/90"
122
122
  data-testid="preset-route-order-subscription-warning"
123
123
  >
124
124
  {{ t('settings.modelConfiguration.routeOrder.subscriptionOverrideHint') }}
@@ -128,13 +128,13 @@ function reset() {
128
128
  answering a different question than this order asks. -->
129
129
  <p
130
130
  v-if="badgesShowAnotherOrder"
131
- class="mb-2 text-[11px] leading-relaxed text-slate-500"
131
+ class="mb-2 text-[11px] leading-relaxed text-dimmed"
132
132
  data-testid="preset-route-order-badge-hint"
133
133
  >
134
134
  {{ t('settings.modelConfiguration.routeOrder.badgesUseDefaultPresetHint') }}
135
135
  </p>
136
136
  <ol
137
- class="divide-y divide-slate-800 rounded-xl border border-slate-800 bg-slate-900/50"
137
+ class="divide-y divide-default rounded-xl border border-default bg-default/50"
138
138
  data-testid="preset-route-order"
139
139
  >
140
140
  <li
@@ -144,13 +144,13 @@ function reset() {
144
144
  :data-testid="`preset-route-${flavor}`"
145
145
  >
146
146
  <span
147
- class="flex h-5 w-5 shrink-0 items-center justify-center rounded bg-slate-800 text-[10px] font-semibold text-slate-400"
147
+ class="flex h-5 w-5 shrink-0 items-center justify-center rounded bg-elevated text-[10px] font-semibold text-muted"
148
148
  >
149
149
  {{ index + 1 }}
150
150
  </span>
151
151
  <div class="min-w-0 flex-1">
152
- <p class="truncate text-sm text-slate-200">{{ t(ROUTE_LABELS[flavor]) }}</p>
153
- <p class="truncate text-[11px] text-slate-500">{{ t(ROUTE_HINTS[flavor]) }}</p>
152
+ <p class="truncate text-sm text-default">{{ t(ROUTE_LABELS[flavor]) }}</p>
153
+ <p class="truncate text-[11px] text-dimmed">{{ t(ROUTE_HINTS[flavor]) }}</p>
154
154
  </div>
155
155
  <div class="flex shrink-0 items-center gap-1">
156
156
  <UButton
@@ -55,13 +55,13 @@ function submit() {
55
55
  </script>
56
56
 
57
57
  <template>
58
- <div class="rounded-lg border border-dashed border-slate-700 p-3">
59
- <p class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-slate-400">
58
+ <div class="rounded-lg border border-dashed border-muted p-3">
59
+ <p class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-muted">
60
60
  {{ t('settings.riskPolicy.newPreset') }}
61
61
  </p>
62
62
  <div class="flex flex-wrap items-end gap-3">
63
63
  <label class="block min-w-40 flex-1">
64
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
64
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
65
65
  {{ t('settings.riskPolicy.create.name') }}
66
66
  </span>
67
67
  <UInput
@@ -72,7 +72,7 @@ function submit() {
72
72
  />
73
73
  </label>
74
74
  <label class="block w-20">
75
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
75
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
76
76
  {{ t('settings.riskPolicy.create.complexity') }}
77
77
  </span>
78
78
  <UInput
@@ -85,7 +85,7 @@ function submit() {
85
85
  />
86
86
  </label>
87
87
  <label class="block w-20">
88
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
88
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
89
89
  {{ t('settings.riskPolicy.create.risk') }}
90
90
  </span>
91
91
  <UInput
@@ -98,7 +98,7 @@ function submit() {
98
98
  />
99
99
  </label>
100
100
  <label class="block w-20">
101
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
101
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
102
102
  {{ t('settings.riskPolicy.create.impact') }}
103
103
  </span>
104
104
  <UInput
@@ -111,13 +111,13 @@ function submit() {
111
111
  />
112
112
  </label>
113
113
  <label class="block w-20">
114
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
114
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
115
115
  {{ t('settings.riskPolicy.create.ciFix') }}
116
116
  </span>
117
117
  <UInput v-model.number="draft.ciMaxAttempts" type="number" :min="0" :max="50" size="sm" />
118
118
  </label>
119
119
  <label class="block w-20">
120
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
120
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
121
121
  {{ t('settings.riskPolicy.create.reqIter') }}
122
122
  </span>
123
123
  <UInput
@@ -129,7 +129,7 @@ function submit() {
129
129
  />
130
130
  </label>
131
131
  <label class="block w-20">
132
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
132
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
133
133
  {{ t('settings.riskPolicy.create.companionRework') }}
134
134
  </span>
135
135
  <UInput
@@ -141,7 +141,7 @@ function submit() {
141
141
  />
142
142
  </label>
143
143
  <label class="block w-32">
144
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
144
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
145
145
  {{ t('settings.riskPolicy.create.autoPass') }}
146
146
  </span>
147
147
  <USelect
@@ -93,7 +93,7 @@ const deleteBlocked = computed(
93
93
 
94
94
  <template>
95
95
  <div
96
- class="rounded-lg border border-slate-700 bg-slate-800/40 p-3"
96
+ class="rounded-lg border border-muted bg-elevated/40 p-3"
97
97
  data-testid="risk-policy-row"
98
98
  :data-policy-id="policy.id"
99
99
  :data-policy-tier="policy.tier"
@@ -156,7 +156,7 @@ const deleteBlocked = computed(
156
156
 
157
157
  <div class="grid grid-cols-1 gap-3 sm:grid-cols-4">
158
158
  <label v-for="axis in RISK_POLICY_AXES" :key="axis" class="block">
159
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
159
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
160
160
  {{ t(CEILING_LABEL_KEYS[axis]) }}
161
161
  </span>
162
162
  <UInput
@@ -168,13 +168,13 @@ const deleteBlocked = computed(
168
168
  />
169
169
  </label>
170
170
  <label class="block">
171
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
171
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
172
172
  {{ t('settings.riskPolicy.field.ciMaxAttempts') }}
173
173
  </span>
174
174
  <UInput v-model.number="draft.ciMaxAttempts" type="number" :min="0" :max="50" size="sm" />
175
175
  </label>
176
176
  <label class="block">
177
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
177
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
178
178
  {{ t('settings.riskPolicy.field.maxRequirementIterations') }}
179
179
  </span>
180
180
  <UInput
@@ -186,7 +186,7 @@ const deleteBlocked = computed(
186
186
  />
187
187
  </label>
188
188
  <label class="block">
189
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
189
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
190
190
  {{ t('settings.riskPolicy.field.companionMaxReworks') }}
191
191
  </span>
192
192
  <UInput
@@ -198,7 +198,7 @@ const deleteBlocked = computed(
198
198
  />
199
199
  </label>
200
200
  <label class="block">
201
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
201
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
202
202
  {{ t('settings.riskPolicy.field.maxRequirementConcernAllowed') }}
203
203
  </span>
204
204
  <USelect
@@ -212,7 +212,7 @@ const deleteBlocked = computed(
212
212
 
213
213
  <!-- Per-change-class auto-merge rules, each shown beside that class's accumulated track
214
214
  record — the number that justifies widening the rule. -->
215
- <div class="mt-3 rounded-md border border-slate-800 bg-slate-900/40 p-3">
215
+ <div class="mt-3 rounded-md border border-default bg-default/40 p-3">
216
216
  <MergeClassRulesEditor
217
217
  v-model="draft.classRules"
218
218
  :auto-merge-enabled="draft.autoMergeEnabled"
@@ -223,7 +223,7 @@ const deleteBlocked = computed(
223
223
  <!-- The role layer over those rules: what a run may do depending on WHO started it, up to and
224
224
  including a full sandbox. Directly under the base rules it narrows, since a role rule is
225
225
  only readable against the rule it applies to. -->
226
- <div class="mt-3 rounded-md border border-slate-800 bg-slate-900/40 p-3">
226
+ <div class="mt-3 rounded-md border border-default bg-default/40 p-3">
227
227
  <MergeRolePolicyEditor
228
228
  v-model:class-rules-by-role="draft.classRulesByRole"
229
229
  v-model:dry-run-roles="draft.dryRunRoles"
@@ -236,7 +236,7 @@ const deleteBlocked = computed(
236
236
 
237
237
  <!-- Implementation-fork decision gate: propose materially different approaches before the
238
238
  Coder writes code (in `auto` tri-state, gated on the task estimate). -->
239
- <div class="mt-3 rounded-md border border-slate-800 bg-slate-900/40 p-3">
239
+ <div class="mt-3 rounded-md border border-default bg-default/40 p-3">
240
240
  <USwitch
241
241
  v-model="draft.forkEnabled"
242
242
  size="sm"
@@ -245,7 +245,7 @@ const deleteBlocked = computed(
245
245
  />
246
246
  <div v-if="draft.forkEnabled" class="mt-3 grid grid-cols-1 gap-3 sm:grid-cols-4">
247
247
  <label v-for="axis in RISK_POLICY_AXES" :key="axis" class="block">
248
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
248
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
249
249
  {{ t(FORK_FLOOR_LABEL_KEYS[axis]) }}
250
250
  </span>
251
251
  <UInput
@@ -257,7 +257,7 @@ const deleteBlocked = computed(
257
257
  />
258
258
  </label>
259
259
  <label class="block">
260
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
260
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
261
261
  {{ t('settings.riskPolicy.forkDecision.onMissingLabel') }}
262
262
  </span>
263
263
  <USelect v-model="draft.forkOnMissing" :items="onMissingOptions" size="sm" />
@@ -268,7 +268,7 @@ const deleteBlocked = computed(
268
268
  <!-- The autonomy posture: whether the parks the engine's own quality loops raise when they give
269
269
  up wait for a person, or are answered on the record so the run finishes. Never touches a
270
270
  gate the PIPELINE asked for. -->
271
- <div class="mt-3 rounded-md border border-slate-800 bg-slate-900/40 p-3">
271
+ <div class="mt-3 rounded-md border border-default bg-default/40 p-3">
272
272
  <USwitch
273
273
  v-model="draft.unattended"
274
274
  size="sm"
@@ -283,7 +283,7 @@ const deleteBlocked = computed(
283
283
  on an attended policy would be a control over a decision this policy never makes. It is
284
284
  not hidden as an "advanced override" — it is inert, which is a different thing. -->
285
285
  <label v-if="draft.unattended" class="mt-3 block">
286
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
286
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
287
287
  {{ t('settings.riskPolicy.autoAnswer.label') }}
288
288
  </span>
289
289
  <UInput
@@ -294,7 +294,7 @@ const deleteBlocked = computed(
294
294
  size="sm"
295
295
  data-testid="risk-policy-auto-answer-floor"
296
296
  />
297
- <span class="mt-1 block text-[11px] text-slate-500">
297
+ <span class="mt-1 block text-[11px] text-dimmed">
298
298
  {{ t('settings.riskPolicy.autoAnswer.hint') }}
299
299
  </span>
300
300
  </label>
@@ -50,8 +50,8 @@ const reseedableCount = computed(
50
50
  <template>
51
51
  <UModal v-model:open="open" :title="t('riskPolicy.health.title')" :ui="{ content: 'max-w-2xl' }">
52
52
  <template #body>
53
- <div v-if="!hasIssues" class="py-6 text-center text-sm text-slate-400">
54
- <UIcon name="i-lucide-check-circle-2" class="mx-auto mb-2 h-8 w-8 text-emerald-400" />
53
+ <div v-if="!hasIssues" class="py-6 text-center text-sm text-muted">
54
+ <UIcon name="i-lucide-check-circle-2" class="mx-auto mb-2 h-8 w-8 text-app-success-400" />
55
55
  {{ t('riskPolicy.health.allValid') }}
56
56
  </div>
57
57
 
@@ -59,20 +59,20 @@ const reseedableCount = computed(
59
59
  <!-- New built-in presets the workspace can add. -->
60
60
  <section v-if="newPresets.length" class="space-y-2">
61
61
  <div class="flex items-center gap-2">
62
- <UIcon name="i-lucide-sparkles" class="h-4 w-4 text-emerald-400" />
63
- <h3 class="text-sm font-semibold text-slate-200">
62
+ <UIcon name="i-lucide-sparkles" class="h-4 w-4 text-app-success-400" />
63
+ <h3 class="text-sm font-semibold text-default">
64
64
  {{ t('riskPolicy.health.newHeading') }}
65
65
  </h3>
66
66
  </div>
67
- <p class="text-[11px] text-slate-500">{{ t('riskPolicy.health.newDescription') }}</p>
67
+ <p class="text-[11px] text-dimmed">{{ t('riskPolicy.health.newDescription') }}</p>
68
68
  <ul class="space-y-2">
69
69
  <li
70
70
  v-for="i in newPresets"
71
71
  :key="i.id"
72
- class="flex items-center justify-between gap-3 rounded-lg border border-slate-800 bg-slate-900/40 p-3"
72
+ class="flex items-center justify-between gap-3 rounded-lg border border-default bg-default/40 p-3"
73
73
  >
74
74
  <div class="min-w-0">
75
- <span class="truncate text-sm font-medium text-slate-100 capitalize">{{
75
+ <span class="truncate text-sm font-medium text-app-100 capitalize">{{
76
76
  i.name
77
77
  }}</span>
78
78
  </div>
@@ -94,21 +94,23 @@ const reseedableCount = computed(
94
94
  <!-- Outdated built-ins: a newer catalog version is available. -->
95
95
  <section v-if="outdated.length" class="space-y-2">
96
96
  <div class="flex items-center gap-2">
97
- <UIcon name="i-lucide-arrow-up-circle" class="h-4 w-4 text-amber-400" />
98
- <h3 class="text-sm font-semibold text-slate-200">
97
+ <UIcon name="i-lucide-arrow-up-circle" class="h-4 w-4 text-app-warning-400" />
98
+ <h3 class="text-sm font-semibold text-default">
99
99
  {{ t('riskPolicy.health.updatesHeading') }}
100
100
  </h3>
101
101
  </div>
102
- <p class="text-[11px] text-slate-500">{{ t('riskPolicy.health.updatesDescription') }}</p>
102
+ <p class="text-[11px] text-dimmed">
103
+ {{ t('riskPolicy.health.updatesDescription') }}
104
+ </p>
103
105
  <ul class="space-y-2">
104
106
  <li
105
107
  v-for="i in outdated"
106
108
  :key="i.id"
107
- class="flex items-center justify-between gap-3 rounded-lg border border-slate-800 bg-slate-900/40 p-3"
109
+ class="flex items-center justify-between gap-3 rounded-lg border border-default bg-default/40 p-3"
108
110
  >
109
111
  <div class="min-w-0">
110
- <span class="truncate text-sm font-medium text-slate-100">{{ i.name }}</span>
111
- <p class="text-[11px] text-amber-400/80">
112
+ <span class="truncate text-sm font-medium text-app-100">{{ i.name }}</span>
113
+ <p class="text-[11px] text-app-warning-400/80">
112
114
  {{
113
115
  t('riskPolicy.health.versionAvailable', {
114
116
  from: i.fromVersion ?? 0,
@@ -23,7 +23,7 @@ const { t } = useI18n()
23
23
 
24
24
  <template>
25
25
  <div
26
- class="rounded-lg border border-slate-700/70 bg-slate-900/30 p-3"
26
+ class="rounded-lg border border-muted/70 bg-default/30 p-3"
27
27
  data-testid="risk-policy-inherited-row"
28
28
  :data-policy-id="policy.id"
29
29
  :data-policy-tier="policy.tier"