@cat-factory/app 0.302.1 → 0.303.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/README.md +16 -0
  2. package/app/app.config.ts +19 -10
  3. package/app/assets/css/main.css +13 -13
  4. package/app/assets/css/prose.css +22 -22
  5. package/app/assets/css/tokens.css +298 -0
  6. package/app/components/assistant/AssistantModal.vue +22 -22
  7. package/app/components/auth/AuthGate.vue +1 -1
  8. package/app/components/auth/BackendMisconfiguredScreen.vue +10 -10
  9. package/app/components/auth/LoginScreen.vue +34 -36
  10. package/app/components/auth/ResetPasswordScreen.vue +12 -12
  11. package/app/components/auth/UserMenu.vue +4 -4
  12. package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +27 -25
  13. package/app/components/binaryOutput/BinaryOutputReport.vue +15 -15
  14. package/app/components/binaryOutput/StoredAssetView.vue +5 -5
  15. package/app/components/board/AddTaskModal.vue +17 -20
  16. package/app/components/board/AgentFailureCard.vue +11 -11
  17. package/app/components/board/AgentFailureHistory.vue +2 -2
  18. package/app/components/board/BoardCanvas.vue +6 -5
  19. package/app/components/board/CreateInitiativeModal.vue +8 -10
  20. package/app/components/board/DependencyConnectOverlay.vue +1 -1
  21. package/app/components/board/FailureHistoryList.vue +7 -7
  22. package/app/components/board/RecurringPipelineModal.vue +17 -17
  23. package/app/components/board/ReviewFrictionDialog.vue +6 -6
  24. package/app/components/board/StepExecutionHistory.vue +13 -13
  25. package/app/components/board/TaskDependencyEdges.vue +8 -8
  26. package/app/components/board/nodes/AgentChip.vue +10 -10
  27. package/app/components/board/nodes/BlockNode.vue +29 -29
  28. package/app/components/board/nodes/DecisionBadge.vue +2 -2
  29. package/app/components/board/nodes/EpicNode.vue +14 -10
  30. package/app/components/board/nodes/FrameSwimlanes.vue +7 -9
  31. package/app/components/board/nodes/InitiativeCard.vue +8 -8
  32. package/app/components/board/nodes/LaneGroup.vue +1 -1
  33. package/app/components/board/nodes/LaneTask.vue +2 -2
  34. package/app/components/board/nodes/ResizeGrips.vue +4 -4
  35. package/app/components/board/nodes/TaskCard.vue +18 -18
  36. package/app/components/board/nodes/TaskLane.vue +5 -5
  37. package/app/components/board/nodes/TaskPipelineMini.vue +18 -18
  38. package/app/components/bootstrap/AdoptionReviewModal.vue +29 -26
  39. package/app/components/bootstrap/BootstrapModal.vue +21 -23
  40. package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
  41. package/app/components/brainstorm/BrainstormWindow.vue +30 -33
  42. package/app/components/bugFishing/BugFishingWindow.vue +49 -49
  43. package/app/components/clarity/ClarityReviewWindow.vue +30 -30
  44. package/app/components/common/AsyncViewError.vue +5 -5
  45. package/app/components/common/ClarificationItem.vue +8 -13
  46. package/app/components/common/ConfirmDialog.vue +4 -2
  47. package/app/components/common/DescriptorFields.vue +1 -1
  48. package/app/components/common/EmptyState.vue +3 -3
  49. package/app/components/common/InterviewGateNotice.vue +7 -7
  50. package/app/components/common/KeyboardShortcutsHelp.vue +1 -1
  51. package/app/components/common/MarkdownProse.vue +14 -13
  52. package/app/components/consensus/ConsensusSessionWindow.vue +26 -26
  53. package/app/components/context/ContextAttachmentFields.vue +17 -17
  54. package/app/components/docs/DocInterviewWindow.vue +14 -14
  55. package/app/components/documents/ContextDocumentPicker.vue +17 -17
  56. package/app/components/documents/DocumentImportModal.vue +7 -7
  57. package/app/components/documents/DocumentSourceConnectModal.vue +3 -3
  58. package/app/components/documents/DocumentSyncState.vue +5 -5
  59. package/app/components/documents/DocumentTemplatesModal.vue +15 -15
  60. package/app/components/documents/RepoContextDocPicker.vue +5 -5
  61. package/app/components/documents/SpawnPreviewModal.vue +12 -12
  62. package/app/components/documents/StartFromDesignModal.vue +11 -11
  63. package/app/components/documents/TaskContextDocs.vue +5 -5
  64. package/app/components/environments/EnvSetupStepper.vue +6 -6
  65. package/app/components/environments/EnvironmentStatusPanel.vue +17 -17
  66. package/app/components/environments/steps/EnvPickStep.vue +3 -3
  67. package/app/components/environments/steps/EnvPreflightStep.vue +9 -9
  68. package/app/components/environments/steps/EnvReviewStep.vue +25 -22
  69. package/app/components/environments/steps/EnvSaveStep.vue +7 -5
  70. package/app/components/environments/steps/JourneyStepNav.vue +1 -1
  71. package/app/components/focus/BlockFocusView.vue +17 -19
  72. package/app/components/followUp/FollowUpWindow.vue +23 -23
  73. package/app/components/forkDecision/ForkDecisionWindow.vue +37 -39
  74. package/app/components/foundational/FoundationalContractSummary.vue +7 -7
  75. package/app/components/foundational/FoundationalServiceCatalogList.vue +11 -11
  76. package/app/components/foundational/FoundationalServiceManager.vue +1 -1
  77. package/app/components/foundational/FoundationalServiceRegistry.vue +13 -13
  78. package/app/components/foundational/FoundationalServiceSources.vue +13 -13
  79. package/app/components/foundational/FoundationalSuppressions.vue +7 -7
  80. package/app/components/foundational/ServiceCatalogConnection.vue +10 -10
  81. package/app/components/fragments/FragmentLibraryManager.vue +41 -44
  82. package/app/components/fragments/FragmentSelector.vue +13 -13
  83. package/app/components/fragments/GitHubDocUrlImport.vue +1 -1
  84. package/app/components/gates/GateFailingCheckList.vue +5 -5
  85. package/app/components/gates/GateResultView.vue +50 -47
  86. package/app/components/github/AddServiceFromRepoModal.vue +14 -14
  87. package/app/components/github/BranchProtectionPreflight.vue +13 -13
  88. package/app/components/github/GitHubConnect.vue +7 -7
  89. package/app/components/github/GitHubOnboarding.vue +7 -7
  90. package/app/components/github/GitHubPanel.vue +37 -40
  91. package/app/components/github/RepoTreeBrowser.vue +18 -18
  92. package/app/components/humanTest/HumanTestWindow.vue +30 -33
  93. package/app/components/initiative/InitiativePlanNotice.vue +5 -5
  94. package/app/components/initiative/InitiativePlanReview.vue +27 -29
  95. package/app/components/initiative/InitiativePlanningWindow.vue +10 -10
  96. package/app/components/initiative/InitiativeTrackerWindow.vue +71 -65
  97. package/app/components/inputGate/InputGateNotice.vue +2 -4
  98. package/app/components/judge/JudgeResultView.vue +30 -32
  99. package/app/components/kaizen/KaizenPanel.vue +40 -36
  100. package/app/components/kaizen/KaizenStepStatus.vue +21 -21
  101. package/app/components/layout/AccountAuditLog.vue +10 -10
  102. package/app/components/layout/AccountDeploymentSettings.vue +20 -20
  103. package/app/components/layout/AccountFailureKindRules.vue +13 -13
  104. package/app/components/layout/AccountFoundationalSettings.vue +1 -1
  105. package/app/components/layout/AccountFragmentSettings.vue +1 -1
  106. package/app/components/layout/AccountModelPolicySettings.vue +9 -9
  107. package/app/components/layout/AccountPlatformAlertSettings.vue +11 -11
  108. package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
  109. package/app/components/layout/AccountRunCredentialSettings.vue +5 -5
  110. package/app/components/layout/AccountSkillSettings.vue +1 -1
  111. package/app/components/layout/AccountTeamSettings.vue +23 -15
  112. package/app/components/layout/AiProvidersBanner.vue +11 -8
  113. package/app/components/layout/AppearanceSwitcher.vue +108 -0
  114. package/app/components/layout/BoardSwitcher.vue +8 -11
  115. package/app/components/layout/BoardToolbar.vue +3 -3
  116. package/app/components/layout/CommandBar.vue +7 -9
  117. package/app/components/layout/ConnectionStatusBanner.vue +2 -2
  118. package/app/components/layout/DefaultTestEnvBanner.vue +5 -5
  119. package/app/components/layout/GitHubPatBanner.vue +5 -5
  120. package/app/components/layout/GitHubPatPermissionsBanner.vue +16 -10
  121. package/app/components/layout/InfraSetupBanner.vue +6 -6
  122. package/app/components/layout/IntegrationsHub.vue +15 -15
  123. package/app/components/layout/LanguageSwitcher.vue +5 -5
  124. package/app/components/layout/ModelProvidersHub.vue +13 -16
  125. package/app/components/layout/NotificationsInbox.vue +10 -10
  126. package/app/components/layout/PersonalSetupModal.vue +8 -8
  127. package/app/components/layout/ProviderConfigBanner.vue +4 -4
  128. package/app/components/layout/RolePrompt.vue +7 -7
  129. package/app/components/layout/SideBar.vue +6 -4
  130. package/app/components/layout/SpendWarningBanner.vue +17 -14
  131. package/app/components/layout/TranslationWarningBanner.vue +4 -4
  132. package/app/components/layout/UiModeSwitcher.vue +13 -13
  133. package/app/components/layout/UiRoleSwitcher.vue +8 -8
  134. package/app/components/layout/WorkspaceMembersSettings.vue +15 -11
  135. package/app/components/media/ArtifactLightbox.vue +13 -13
  136. package/app/components/media/ImageCompare.vue +31 -24
  137. package/app/components/merge/MergeEffortChips.vue +2 -2
  138. package/app/components/notifications/NotificationSettingsPanel.vue +14 -12
  139. package/app/components/observability/OutcomeFilterChips.vue +6 -6
  140. package/app/components/observability/RunFailureSummary.vue +28 -25
  141. package/app/components/observability/StepMetricsBar.vue +26 -28
  142. package/app/components/observability/StepModelActivity.vue +2 -2
  143. package/app/components/observability/ToolCallList.vue +24 -24
  144. package/app/components/outcome/OutcomeSummaryWindow.vue +47 -47
  145. package/app/components/palettes/AgentPalette.vue +8 -8
  146. package/app/components/palettes/AgentTierSelect.vue +1 -1
  147. package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
  148. package/app/components/panels/AgentStepDetail.vue +52 -51
  149. package/app/components/panels/AttemptEntryHeader.vue +4 -6
  150. package/app/components/panels/DecisionModal.vue +7 -7
  151. package/app/components/panels/GenericStructuredResultView.vue +7 -7
  152. package/app/components/panels/InspectorPanel.vue +17 -17
  153. package/app/components/panels/MergerResultView.vue +19 -19
  154. package/app/components/panels/ObservabilityPanel.vue +115 -123
  155. package/app/components/panels/OperatorDashboardPanel.vue +89 -97
  156. package/app/components/panels/ReportsPanel.vue +69 -66
  157. package/app/components/panels/ReportsSpendBreakdown.vue +9 -9
  158. package/app/components/panels/ResultWindowShell.vue +38 -38
  159. package/app/components/panels/RunDetailLoadState.vue +2 -2
  160. package/app/components/panels/StepContainerStatus.vue +9 -9
  161. package/app/components/panels/StepDelegatedStatus.logic.spec.ts +135 -0
  162. package/app/components/panels/StepDelegatedStatus.logic.ts +160 -0
  163. package/app/components/panels/StepDelegatedStatus.vue +181 -0
  164. package/app/components/panels/StepEffortReport.vue +16 -15
  165. package/app/components/panels/StepFragmentAdherence.vue +14 -10
  166. package/app/components/panels/StepMetadataCard.vue +74 -45
  167. package/app/components/panels/StepReproductionReport.vue +25 -21
  168. package/app/components/panels/StepRunMeta.vue +20 -20
  169. package/app/components/panels/StepTestReport.logic.spec.ts +8 -3
  170. package/app/components/panels/StepTestReport.logic.ts +4 -4
  171. package/app/components/panels/StepTestReport.vue +28 -28
  172. package/app/components/panels/StepToolServers.vue +14 -11
  173. package/app/components/panels/StepValidationReport.vue +7 -7
  174. package/app/components/panels/inspector/ContainerSummary.vue +9 -9
  175. package/app/components/panels/inspector/DocReferenceRepos.vue +3 -3
  176. package/app/components/panels/inspector/EnvProbeReport.vue +24 -27
  177. package/app/components/panels/inspector/EpicChildren.vue +8 -12
  178. package/app/components/panels/inspector/FrontendBindingsResolved.vue +11 -11
  179. package/app/components/panels/inspector/FrontendConfig.vue +37 -41
  180. package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
  181. package/app/components/panels/inspector/InspectorSection.vue +6 -6
  182. package/app/components/panels/inspector/RecurringScheduleSettings.vue +16 -19
  183. package/app/components/panels/inspector/ServiceConnections.vue +2 -2
  184. package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
  185. package/app/components/panels/inspector/ServiceSelfTests.vue +21 -17
  186. package/app/components/panels/inspector/ServiceTestConfig.vue +51 -59
  187. package/app/components/panels/inspector/ServiceTestSecrets.vue +5 -5
  188. package/app/components/panels/inspector/ServiceTestingContext.vue +3 -3
  189. package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
  190. package/app/components/panels/inspector/TaskAgentConfig.vue +3 -3
  191. package/app/components/panels/inspector/TaskAprioriBranches.vue +8 -5
  192. package/app/components/panels/inspector/TaskDependencies.vue +1 -1
  193. package/app/components/panels/inspector/TaskEstimateBadge.vue +11 -11
  194. package/app/components/panels/inspector/TaskExecution.vue +17 -17
  195. package/app/components/panels/inspector/TaskReviewTarget.vue +2 -2
  196. package/app/components/panels/inspector/TaskRunSettings.vue +35 -37
  197. package/app/components/panels/inspector/TaskStructure.vue +3 -3
  198. package/app/components/pipeline/AgentKindIcon.vue +1 -1
  199. package/app/components/pipeline/AgentPromptEditor.vue +17 -17
  200. package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -56
  201. package/app/components/pipeline/EstimateThresholdFields.vue +4 -4
  202. package/app/components/pipeline/GateConfigFields.vue +13 -10
  203. package/app/components/pipeline/IterationCapPrompt.vue +4 -2
  204. package/app/components/pipeline/PipelineBuilder.vue +47 -55
  205. package/app/components/pipeline/PipelineHealthModal.vue +27 -29
  206. package/app/components/pipeline/PipelinePicker.vue +10 -10
  207. package/app/components/pipeline/PipelinePreview.vue +10 -10
  208. package/app/components/pipeline/PipelineProgress.vue +64 -67
  209. package/app/components/prReview/PrReviewPhaseBadge.vue +7 -7
  210. package/app/components/prReview/PrReviewWindow.vue +75 -77
  211. package/app/components/providers/AiPresetMismatchDialog.vue +5 -5
  212. package/app/components/providers/AiProviderOnboardingModal.vue +9 -9
  213. package/app/components/providers/ApiKeysSection.vue +13 -13
  214. package/app/components/providers/PersonalCredentialModal.vue +2 -2
  215. package/app/components/providers/PersonalSubscriptionSection.vue +10 -10
  216. package/app/components/providers/SignInRequiredNotice.vue +1 -1
  217. package/app/components/providers/VendorCredentialsModal.vue +10 -10
  218. package/app/components/provisioning/ProvisioningLogsDrawer.vue +13 -13
  219. package/app/components/ralph/RalphLoopResultView.vue +28 -30
  220. package/app/components/recurring/RecurrenceEditor.vue +2 -2
  221. package/app/components/requirements/RequirementsReviewWindow.vue +51 -58
  222. package/app/components/riskPolicy/RiskPolicyPicker.vue +12 -15
  223. package/app/components/riskPolicy/RiskPolicyPreview.vue +14 -14
  224. package/app/components/sandbox/SandboxPanel.vue +58 -59
  225. package/app/components/settings/AccountSettingsPanel.vue +1 -1
  226. package/app/components/settings/ApiTokensPanel.vue +10 -10
  227. package/app/components/settings/BudgetSettings.vue +18 -22
  228. package/app/components/settings/CapabilityCredentialsPanel.vue +15 -15
  229. package/app/components/settings/CloudflareHandlerSection.vue +20 -20
  230. package/app/components/settings/ComposeEnvironmentSetupSection.vue +13 -13
  231. package/app/components/settings/ConnectionTestVerdict.vue +3 -3
  232. package/app/components/settings/ConnectionWarnings.vue +1 -1
  233. package/app/components/settings/ConsensusGroupsSection.vue +27 -35
  234. package/app/components/settings/CustomManifestTypeEditor.vue +10 -10
  235. package/app/components/settings/DefaultProvisionTypeSection.vue +6 -6
  236. package/app/components/settings/InfraHandlersConfigurator.vue +24 -22
  237. package/app/components/settings/InfrastructureBackendPicker.vue +6 -6
  238. package/app/components/settings/InfrastructureWindow.vue +5 -5
  239. package/app/components/settings/IssueTrackerPanel.vue +29 -23
  240. package/app/components/settings/KubernetesEngineForm.vue +11 -11
  241. package/app/components/settings/KubernetesEnvironmentForm.vue +4 -4
  242. package/app/components/settings/LocalContainerPoolSettings.vue +6 -11
  243. package/app/components/settings/LocalModelEndpointsPanel.vue +20 -18
  244. package/app/components/settings/McpAuthorizeScreen.vue +13 -15
  245. package/app/components/settings/McpOAuthCallbackScreen.vue +16 -10
  246. package/app/components/settings/MergeClassRulesEditor.vue +6 -9
  247. package/app/components/settings/MergeRolePolicyEditor.vue +16 -16
  248. package/app/components/settings/ModelConfigurationPanel.vue +23 -30
  249. package/app/components/settings/ModelPresetHealthModal.vue +15 -13
  250. package/app/components/settings/ObservabilityConnectionPanel.vue +4 -4
  251. package/app/components/settings/OpenRouterCatalogPanel.vue +23 -19
  252. package/app/components/settings/PackageRegistriesPanel.vue +8 -8
  253. package/app/components/settings/ProviderConnectionTab.vue +8 -11
  254. package/app/components/settings/ProviderManifestEditor.vue +9 -9
  255. package/app/components/settings/ProviderPreferenceEditor.vue +8 -8
  256. package/app/components/settings/RiskPolicyCreateForm.vue +10 -10
  257. package/app/components/settings/RiskPolicyEditorRow.vue +14 -14
  258. package/app/components/settings/RiskPolicyHealthModal.vue +15 -13
  259. package/app/components/settings/RiskPolicyInheritedRow.vue +1 -1
  260. package/app/components/settings/RiskPolicyPanel.vue +10 -15
  261. package/app/components/settings/ServiceFragmentDefaultsPanel.vue +7 -7
  262. package/app/components/settings/SharedStacksPanel.vue +9 -12
  263. package/app/components/settings/TaskSourceCard.vue +4 -4
  264. package/app/components/settings/TaskTypeSuppressionsPanel.vue +6 -6
  265. package/app/components/settings/ToolServerChecklist.vue +36 -29
  266. package/app/components/settings/UsageSettings.vue +15 -15
  267. package/app/components/settings/UserSecretsSection.vue +9 -12
  268. package/app/components/settings/WorkspaceMetadataSettings.vue +5 -5
  269. package/app/components/settings/WorkspaceSettingsPanel.vue +47 -47
  270. package/app/components/skills/ReviewSkillQueue.vue +10 -10
  271. package/app/components/skills/SkillLibraryManager.vue +23 -20
  272. package/app/components/slack/SlackPanel.vue +13 -17
  273. package/app/components/spec/ServiceSpecWindow.vue +45 -42
  274. package/app/components/tasks/BugHuntModal.vue +24 -27
  275. package/app/components/tasks/ContextIssuePicker.vue +11 -11
  276. package/app/components/tasks/TaskContextIssues.vue +3 -3
  277. package/app/components/tasks/TaskImportModal.vue +7 -7
  278. package/app/components/tasks/TaskSourceConnectModal.vue +10 -8
  279. package/app/components/testing/TestReportWindow.vue +99 -82
  280. package/app/components/theme/ThemeImportModal.vue +115 -0
  281. package/app/components/tutorial/TutorialCatalogue.vue +9 -9
  282. package/app/components/tutorial/TutorialNudge.vue +5 -5
  283. package/app/components/tutorial/TutorialOverlay.vue +12 -12
  284. package/app/components/tutorial/TutorialPrompt.vue +6 -9
  285. package/app/components/vcs/GitLabConnect.vue +4 -4
  286. package/app/components/vcs/VcsConnectSurfaces.vue +2 -2
  287. package/app/components/visualConfirm/VisualConfirmationWindow.vue +36 -36
  288. package/app/composables/api/client.ts +6 -1
  289. package/app/composables/usePipelineErrorToast.ts +17 -0
  290. package/app/modular/agent-kinds.ts +24 -0
  291. package/app/pages/index.vue +5 -5
  292. package/app/plugins/theme.client.ts +125 -0
  293. package/app/spa-loading-template.html +52 -14
  294. package/app/stores/agents.ts +1 -1
  295. package/app/stores/theme.spec.ts +56 -0
  296. package/app/stores/theme.ts +87 -0
  297. package/app/types/domain.ts +19 -0
  298. package/app/types/execution.ts +4 -0
  299. package/app/utils/agentOutput.ts +1 -1
  300. package/app/utils/binaryOutput.ts +6 -6
  301. package/app/utils/bootstrapSteps.ts +14 -14
  302. package/app/utils/catalog.ts +87 -83
  303. package/app/utils/colorTint.ts +10 -0
  304. package/app/utils/failureKinds.ts +1 -0
  305. package/app/utils/observability.ts +3 -3
  306. package/app/utils/pipelineRender.ts +13 -17
  307. package/app/utils/swimlanes.ts +4 -4
  308. package/app/utils/theme/bootPalette.spec.ts +54 -0
  309. package/app/utils/theme/bootPalette.ts +108 -0
  310. package/app/utils/theme/builtins.spec.ts +38 -0
  311. package/app/utils/theme/builtins.ts +55 -0
  312. package/app/utils/theme/css.ts +162 -0
  313. package/app/utils/theme/doc.ts +353 -0
  314. package/app/utils/theme/link.ts +93 -0
  315. package/app/utils/theme/presets.ts +509 -0
  316. package/app/utils/theme/theme.spec.ts +224 -0
  317. package/i18n/locales/de.json +61 -4
  318. package/i18n/locales/en.json +70 -4
  319. package/i18n/locales/es.json +61 -4
  320. package/i18n/locales/fr.json +61 -4
  321. package/i18n/locales/he.json +61 -4
  322. package/i18n/locales/it.json +61 -4
  323. package/i18n/locales/ja.json +61 -4
  324. package/i18n/locales/pl.json +61 -4
  325. package/i18n/locales/tr.json +61 -4
  326. package/i18n/locales/uk.json +61 -4
  327. package/nuxt.config.ts +37 -11
  328. package/package.json +10 -9
@@ -170,24 +170,19 @@ function unhide(presetId: string) {
170
170
 
171
171
  <template>
172
172
  <div class="space-y-4" data-testid="risk-policy-panel">
173
- <i18n-t
174
- keypath="settings.riskPolicy.intro"
175
- tag="p"
176
- class="text-xs text-slate-400"
177
- scope="global"
178
- >
173
+ <i18n-t keypath="settings.riskPolicy.intro" tag="p" class="text-xs text-muted" scope="global">
179
174
  <template #merger>
180
- <span class="text-slate-300">{{ t('settings.riskPolicy.mergerAgent') }}</span>
175
+ <span class="text-toned">{{ t('settings.riskPolicy.mergerAgent') }}</span>
181
176
  </template>
182
177
  </i18n-t>
183
178
 
184
179
  <!-- Inherited FIRST: they are the org's posture, and a board reading its own list wants to see
185
180
  what it is working from before what it has changed. -->
186
181
  <section v-if="inherited.length > 0" class="space-y-2">
187
- <p class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
182
+ <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
188
183
  {{ t('settings.riskPolicy.inherited.heading') }}
189
184
  </p>
190
- <p class="text-[11px] text-slate-500">{{ t('settings.riskPolicy.inherited.hint') }}</p>
185
+ <p class="text-[11px] text-dimmed">{{ t('settings.riskPolicy.inherited.hint') }}</p>
191
186
  <RiskPolicyInheritedRow
192
187
  v-for="policy in inherited"
193
188
  :key="policy.id"
@@ -201,7 +196,7 @@ function unhide(presetId: string) {
201
196
  <section class="space-y-4">
202
197
  <p
203
198
  v-if="inherited.length > 0"
204
- class="text-[11px] font-semibold uppercase tracking-wide text-slate-400"
199
+ class="text-[11px] font-semibold uppercase tracking-wide text-muted"
205
200
  >
206
201
  {{ t('settings.riskPolicy.own.heading') }}
207
202
  </p>
@@ -222,21 +217,21 @@ function unhide(presetId: string) {
222
217
  whether it still shadows an account policy: one whose policy the account has since withdrawn
223
218
  withholds nothing, and reading it as a live opt-out would misstate what the board is doing. -->
224
219
  <section v-if="store.suppressions.length > 0 || suppressionsFailed" class="space-y-2">
225
- <p class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
220
+ <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
226
221
  {{ t('settings.riskPolicy.hidden.heading') }}
227
222
  </p>
228
- <p v-if="suppressionsFailed" class="text-[11px] text-amber-400">
223
+ <p v-if="suppressionsFailed" class="text-[11px] text-app-warning-400">
229
224
  {{ t('settings.riskPolicy.hidden.loadFailed') }}
230
225
  </p>
231
226
  <div
232
227
  v-for="entry in store.suppressions"
233
228
  :key="entry.id"
234
- class="flex items-center gap-2 rounded-md border border-slate-800 bg-slate-900/40 px-3 py-2"
229
+ class="flex items-center gap-2 rounded-md border border-default bg-default/40 px-3 py-2"
235
230
  data-testid="risk-policy-hidden-row"
236
231
  :data-policy-id="entry.id"
237
232
  >
238
- <span class="flex-1 truncate text-[12px] text-slate-300">{{ entry.name }}</span>
239
- <span v-if="!entry.inherited" class="text-[11px] text-slate-500">
233
+ <span class="flex-1 truncate text-[12px] text-toned">{{ entry.name }}</span>
234
+ <span v-if="!entry.inherited" class="text-[11px] text-dimmed">
240
235
  {{ t('settings.riskPolicy.hidden.withdrawn') }}
241
236
  </span>
242
237
  <UButton
@@ -54,12 +54,12 @@ function remove(id: string) {
54
54
 
55
55
  <template>
56
56
  <div class="space-y-4">
57
- <p class="text-xs text-slate-400">
57
+ <p class="text-xs text-muted">
58
58
  {{ t('settings.serviceFragmentDefaults.intro') }}
59
59
  </p>
60
60
 
61
61
  <div class="flex items-center justify-between">
62
- <span class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
62
+ <span class="text-[11px] font-semibold uppercase tracking-wide text-muted">
63
63
  {{ t('settings.serviceFragmentDefaults.defaultFragments') }}
64
64
  </span>
65
65
  <UDropdownMenu v-if="menu.length" :items="menu" :ui="{ content: 'max-h-72 overflow-y-auto' }">
@@ -90,24 +90,24 @@ function remove(id: string) {
90
90
  {{ f.title }}<UIcon name="i-lucide-x" class="ms-0.5 h-3 w-3" />
91
91
  </UBadge>
92
92
  </div>
93
- <p v-else class="text-[11px] text-slate-500">
93
+ <p v-else class="text-[11px] text-dimmed">
94
94
  {{ t('settings.serviceFragmentDefaults.empty') }}
95
95
  </p>
96
96
 
97
- <div class="flex flex-wrap gap-x-4 gap-y-1 border-t border-slate-800 pt-3 text-[11px]">
98
- <span class="text-slate-500">
97
+ <div class="flex flex-wrap gap-x-4 gap-y-1 border-t border-default pt-3 text-[11px]">
98
+ <span class="text-dimmed">
99
99
  {{ t('settings.serviceFragmentDefaults.footer.question') }}
100
100
  </span>
101
101
  <button
102
102
  type="button"
103
- class="font-medium text-primary-400 hover:underline"
103
+ class="font-medium text-primary hover:underline"
104
104
  @click="ui.openFragmentLibrary()"
105
105
  >
106
106
  {{ t('settings.serviceFragmentDefaults.footer.manageBoard') }}
107
107
  </button>
108
108
  <button
109
109
  type="button"
110
- class="font-medium text-primary-400 hover:underline"
110
+ class="font-medium text-primary hover:underline"
111
111
  @click="ui.openAccountSettings('fragments')"
112
112
  >
113
113
  {{ t('settings.serviceFragmentDefaults.footer.manageAccount') }}
@@ -270,14 +270,14 @@ async function remove(stack: SharedStack) {
270
270
 
271
271
  <template>
272
272
  <div class="space-y-4" data-testid="shared-stacks-panel">
273
- <p class="text-sm text-slate-400">{{ t('settings.sharedStacks.intro') }}</p>
273
+ <p class="text-sm text-muted">{{ t('settings.sharedStacks.intro') }}</p>
274
274
 
275
- <section v-if="stacks.length" class="space-y-2 rounded-lg border border-slate-700 p-3">
275
+ <section v-if="stacks.length" class="space-y-2 rounded-lg border border-muted p-3">
276
276
  <h3 class="text-sm font-semibold">{{ t('settings.sharedStacks.list.heading') }}</h3>
277
277
  <div
278
278
  v-for="stack in stacks"
279
279
  :key="stack.id"
280
- class="space-y-2 rounded-md border border-slate-800 px-3 py-2"
280
+ class="space-y-2 rounded-md border border-default px-3 py-2"
281
281
  :data-testid="`shared-stack-${stack.id}`"
282
282
  >
283
283
  <div class="flex items-center justify-between gap-2">
@@ -288,7 +288,7 @@ async function remove(stack: SharedStack) {
288
288
  {{ statusLabel(stack.status) }}
289
289
  </UBadge>
290
290
  </div>
291
- <p class="truncate text-[11px] text-slate-500">{{ stack.cloneUrl }}</p>
291
+ <p class="truncate text-[11px] text-dimmed">{{ stack.cloneUrl }}</p>
292
292
  <div v-if="stack.managedNetworks.length" class="flex flex-wrap gap-1">
293
293
  <UBadge
294
294
  v-for="net in stack.managedNetworks"
@@ -347,14 +347,11 @@ async function remove(stack: SharedStack) {
347
347
  />
348
348
  </div>
349
349
  </div>
350
- <p v-if="stack.lastError" class="text-[11px] text-rose-400">{{ stack.lastError }}</p>
350
+ <p v-if="stack.lastError" class="text-[11px] text-app-error-400">{{ stack.lastError }}</p>
351
351
  </div>
352
352
  </section>
353
353
 
354
- <section
355
- class="space-y-3 rounded-lg border border-slate-700 p-3"
356
- data-testid="shared-stack-form"
357
- >
354
+ <section class="space-y-3 rounded-lg border border-muted p-3" data-testid="shared-stack-form">
358
355
  <h3 class="text-sm font-semibold">
359
356
  {{
360
357
  t(editingId ? 'settings.sharedStacks.edit.heading' : 'settings.sharedStacks.add.heading')
@@ -410,12 +407,12 @@ async function remove(stack: SharedStack) {
410
407
  >
411
408
  {{ t('settings.sharedStacks.detect.button') }}
412
409
  </UButton>
413
- <span class="text-[11px] text-slate-500">{{ t('settings.sharedStacks.detect.hint') }}</span>
410
+ <span class="text-[11px] text-dimmed">{{ t('settings.sharedStacks.detect.hint') }}</span>
414
411
  </div>
415
412
 
416
413
  <p
417
414
  v-if="detectedEnvFiles.length"
418
- class="text-[11px] text-slate-500"
415
+ class="text-[11px] text-dimmed"
419
416
  data-testid="shared-stack-env-files"
420
417
  >
421
418
  {{ t('settings.sharedStacks.detect.envFiles') }}
@@ -431,7 +428,7 @@ async function remove(stack: SharedStack) {
431
428
  <li
432
429
  v-for="(label, index) in layerLabels"
433
430
  :key="index"
434
- class="font-mono text-[11px] text-slate-500"
431
+ class="font-mono text-[11px] text-dimmed"
435
432
  >
436
433
  {{ label }}
437
434
  </li>
@@ -89,13 +89,13 @@ const STATUS_UI: Record<
89
89
  </script>
90
90
 
91
91
  <template>
92
- <div class="rounded-lg border border-slate-800 bg-slate-800/40 px-3 py-2.5">
92
+ <div class="rounded-lg border border-default bg-elevated/40 px-3 py-2.5">
93
93
  <div class="flex items-center justify-between gap-2">
94
94
  <div class="flex min-w-0 items-center gap-2.5">
95
- <UIcon :name="state.icon" class="h-5 w-5 shrink-0 text-slate-300" />
95
+ <UIcon :name="state.icon" class="h-5 w-5 shrink-0 text-toned" />
96
96
  <div class="min-w-0">
97
- <div class="text-sm font-medium text-slate-200">{{ state.label }}</div>
98
- <div class="text-[11px] text-slate-500">{{ subtitle }}</div>
97
+ <div class="text-sm font-medium text-default">{{ state.label }}</div>
98
+ <div class="text-[11px] text-dimmed">{{ subtitle }}</div>
99
99
  </div>
100
100
  </div>
101
101
  <div class="flex shrink-0 items-center gap-2">
@@ -61,28 +61,28 @@ async function toggle(row: TaskTypeSuppression, offered: boolean) {
61
61
 
62
62
  <template>
63
63
  <div class="space-y-4">
64
- <p class="text-xs text-slate-400">
64
+ <p class="text-xs text-muted">
65
65
  {{ t('settings.taskTypeSuppressions.intro') }}
66
66
  </p>
67
67
 
68
- <p v-if="loading" class="text-[11px] text-slate-500">
68
+ <p v-if="loading" class="text-[11px] text-dimmed">
69
69
  {{ t('settings.taskTypeSuppressions.loading') }}
70
70
  </p>
71
- <p v-else-if="!rows.length" class="text-[11px] text-slate-500">
71
+ <p v-else-if="!rows.length" class="text-[11px] text-dimmed">
72
72
  {{ t('settings.taskTypeSuppressions.empty') }}
73
73
  </p>
74
74
  <ul v-else class="space-y-2" data-testid="task-type-suppressions">
75
75
  <li
76
76
  v-for="row in rows"
77
77
  :key="row.taskType.taskType"
78
- class="flex items-start justify-between gap-3 rounded border border-slate-800 px-3 py-2"
78
+ class="flex items-start justify-between gap-3 rounded border border-default px-3 py-2"
79
79
  data-testid="task-type-suppression"
80
80
  :data-task-type="row.taskType.taskType"
81
81
  >
82
82
  <div class="min-w-0">
83
83
  <div class="flex items-center gap-1.5">
84
84
  <UIcon :name="row.taskType.presentation.icon" class="h-3.5 w-3.5 shrink-0" />
85
- <span class="truncate text-xs font-medium text-slate-200">
85
+ <span class="truncate text-xs font-medium text-default">
86
86
  {{ row.taskType.presentation.label }}
87
87
  </span>
88
88
  <UBadge
@@ -94,7 +94,7 @@ async function toggle(row: TaskTypeSuppression, offered: boolean) {
94
94
  {{ row.taskType.presentation.category }}
95
95
  </UBadge>
96
96
  </div>
97
- <p class="mt-0.5 text-[11px] text-slate-500">
97
+ <p class="mt-0.5 text-[11px] text-dimmed">
98
98
  {{ row.taskType.presentation.description }}
99
99
  </p>
100
100
  </div>
@@ -111,59 +111,63 @@ async function runProbe(id: string) {
111
111
  <template>
112
112
  <section v-if="servers.length" class="space-y-3" data-testid="tool-servers-section">
113
113
  <div>
114
- <h3 class="text-sm font-semibold text-slate-200">
114
+ <h3 class="text-sm font-semibold text-default">
115
115
  {{ t('settings.toolServers.heading') }}
116
116
  </h3>
117
- <p class="text-xs text-slate-400">{{ t('settings.toolServers.intro') }}</p>
117
+ <p class="text-xs text-muted">{{ t('settings.toolServers.intro') }}</p>
118
118
  </div>
119
119
 
120
120
  <article
121
121
  v-for="server in servers"
122
122
  :key="server.id"
123
- class="space-y-2 rounded-lg border border-slate-700 p-3"
123
+ class="space-y-2 rounded-lg border border-muted p-3"
124
124
  :data-testid="`tool-server-${server.id}`"
125
125
  >
126
126
  <div class="flex flex-wrap items-center gap-2">
127
- <span class="text-sm font-medium text-slate-200">{{ server.label }}</span>
127
+ <span class="text-sm font-medium text-default">{{ server.label }}</span>
128
128
  <UBadge color="neutral" variant="soft" size="sm">
129
129
  {{ TRANSPORT_LABELS[server.transport] }}
130
130
  </UBadge>
131
- <code class="font-mono text-[11px] text-slate-500">{{ server.id }}</code>
131
+ <code class="font-mono text-[11px] text-dimmed">{{ server.id }}</code>
132
132
  </div>
133
133
 
134
- <p class="truncate font-mono text-[11px] text-slate-500" :title="server.target">
134
+ <p class="truncate font-mono text-[11px] text-dimmed" :title="server.target">
135
135
  {{ server.target }}
136
136
  </p>
137
- <p v-if="server.guidance" class="text-xs text-slate-400">{{ server.guidance }}</p>
137
+ <p v-if="server.guidance" class="text-xs text-muted">{{ server.guidance }}</p>
138
138
 
139
139
  <!-- Which agents get it. An EMPTY list is a registration attached to nothing: it never reaches
140
140
  a dispatch, so the credentials it asks for are keys an operator fills in for no run. Said
141
141
  out loud, because no other surface in the platform can see that state. -->
142
- <p v-if="server.declaredBy.length" class="text-[11px] text-slate-400">
142
+ <p v-if="server.declaredBy.length" class="text-[11px] text-muted">
143
143
  {{ t('settings.toolServers.declaredBy', { kinds: server.declaredBy.join(', ') }) }}
144
144
  </p>
145
- <p v-else class="text-[11px] text-amber-400" :data-testid="`tool-server-orphan-${server.id}`">
145
+ <p
146
+ v-else
147
+ class="text-[11px] text-app-warning-400"
148
+ :data-testid="`tool-server-orphan-${server.id}`"
149
+ >
146
150
  {{ t('settings.toolServers.declaredByNone') }}
147
151
  </p>
148
152
 
149
153
  <!-- Which harnesses could serve it. EMPTY means the declaration can never run anywhere (an
150
154
  `http` server narrowed to Codex, whose MCP client is stdio-only): it is never dropped FOR
151
155
  A REASON on any run, so no prompt and no log line ever mentions it. -->
152
- <p v-if="server.servableHarnesses.length" class="text-[11px] text-slate-400">
156
+ <p v-if="server.servableHarnesses.length" class="text-[11px] text-muted">
153
157
  {{
154
158
  t('settings.toolServers.servableHarnesses', {
155
159
  harnesses: server.servableHarnesses.join(', '),
156
160
  })
157
161
  }}
158
162
  </p>
159
- <p v-else class="text-[11px] text-amber-400">
163
+ <p v-else class="text-[11px] text-app-warning-400">
160
164
  {{ t('settings.toolServers.servableHarnessesNone') }}
161
165
  </p>
162
166
 
163
- <p v-if="server.allowedTools?.length" class="text-[11px] text-slate-400">
167
+ <p v-if="server.allowedTools?.length" class="text-[11px] text-muted">
164
168
  {{ t('settings.toolServers.allowedTools', { tools: server.allowedTools.join(', ') }) }}
165
169
  </p>
166
- <p v-if="server.credentials.length" class="text-[11px] text-slate-400">
170
+ <p v-if="server.credentials.length" class="text-[11px] text-muted">
167
171
  {{
168
172
  t('settings.toolServers.credentials', {
169
173
  keys: server.credentials.map((c) => c.key).join(', '),
@@ -177,7 +181,7 @@ async function runProbe(id: string) {
177
181
  producing tokens is exactly the state that reads as working and is not. -->
178
182
  <div
179
183
  v-if="server.oauth"
180
- class="space-y-1 rounded-md border border-slate-800 bg-slate-900/40 p-2"
184
+ class="space-y-1 rounded-md border border-default bg-default/40 p-2"
181
185
  :data-testid="`tool-server-oauth-${server.id}`"
182
186
  >
183
187
  <div class="flex flex-wrap items-center gap-2">
@@ -195,25 +199,25 @@ async function runProbe(id: string) {
195
199
  : t('settings.toolServers.oauth.machineGrant')
196
200
  }}
197
201
  </UBadge>
198
- <span v-if="server.oauth.connectedBy" class="text-[11px] text-slate-400">
202
+ <span v-if="server.oauth.connectedBy" class="text-[11px] text-muted">
199
203
  {{ t('settings.toolServers.oauth.connectedBy', { user: server.oauth.connectedBy }) }}
200
204
  </span>
201
205
  </div>
202
206
 
203
- <p v-if="server.oauth.scopes?.length" class="text-[11px] text-slate-400">
207
+ <p v-if="server.oauth.scopes?.length" class="text-[11px] text-muted">
204
208
  {{ t('settings.toolServers.oauth.scopes', { scopes: server.oauth.scopes.join(', ') }) }}
205
209
  </p>
206
210
  <!-- A grant with no refresh token works until its access token expires and then needs
207
211
  granting again by hand. Said BEFORE it happens, which is the only time it is useful. -->
208
212
  <p
209
213
  v-if="server.oauth.connected && server.oauth.refreshable === false"
210
- class="text-[11px] text-amber-400"
214
+ class="text-[11px] text-app-warning-400"
211
215
  >
212
216
  {{ t('settings.toolServers.oauth.notRefreshable') }}
213
217
  </p>
214
218
  <p
215
219
  v-if="server.oauth.lastError"
216
- class="text-[11px] text-red-400"
220
+ class="text-[11px] text-app-error-400"
217
221
  :data-testid="`tool-server-oauth-error-${server.id}`"
218
222
  >
219
223
  {{ t('settings.toolServers.oauth.lastError', { detail: server.oauth.lastError }) }}
@@ -268,7 +272,7 @@ async function runProbe(id: string) {
268
272
  verify it from a run, or change the declaration. -->
269
273
  <p
270
274
  v-else-if="server.notProbeableReason"
271
- class="text-[11px] text-slate-500"
275
+ class="text-[11px] text-dimmed"
272
276
  :data-testid="`tool-server-unprobeable-${server.id}`"
273
277
  >
274
278
  {{ NOT_PROBEABLE_LABELS[server.notProbeableReason] }}
@@ -277,7 +281,7 @@ async function runProbe(id: string) {
277
281
 
278
282
  <div
279
283
  v-if="resultFor(server.id)"
280
- class="space-y-1 rounded-md border border-slate-800 bg-slate-900/40 p-2"
284
+ class="space-y-1 rounded-md border border-default bg-default/40 p-2"
281
285
  :data-testid="`tool-server-result-${server.id}`"
282
286
  >
283
287
  <div class="flex flex-wrap items-center gap-2">
@@ -289,12 +293,12 @@ async function runProbe(id: string) {
289
293
  >
290
294
  {{ STATUS_LABELS[resultFor(server.id)!.status] }}
291
295
  </UBadge>
292
- <span v-if="resultFor(server.id)!.httpStatus" class="text-[11px] text-slate-400">
296
+ <span v-if="resultFor(server.id)!.httpStatus" class="text-[11px] text-muted">
293
297
  {{ t('settings.toolServers.httpStatus', { status: resultFor(server.id)!.httpStatus }) }}
294
298
  </span>
295
299
  </div>
296
300
 
297
- <p v-if="resultFor(server.id)!.status === 'ok'" class="text-[11px] text-slate-300">
301
+ <p v-if="resultFor(server.id)!.status === 'ok'" class="text-[11px] text-toned">
298
302
  {{
299
303
  t('settings.toolServers.okDetail', {
300
304
  name: resultFor(server.id)!.serverName || server.id,
@@ -306,7 +310,7 @@ async function runProbe(id: string) {
306
310
  </p>
307
311
  <!-- A count off a truncated read is a FLOOR, not a total, and the difference decides whether
308
312
  the allowedTools verdict below means anything. -->
309
- <p v-if="resultFor(server.id)!.toolsComplete === false" class="text-[11px] text-slate-500">
313
+ <p v-if="resultFor(server.id)!.toolsComplete === false" class="text-[11px] text-dimmed">
310
314
  {{ t('settings.toolServers.toolsIncomplete') }}
311
315
  </p>
312
316
 
@@ -315,7 +319,7 @@ async function runProbe(id: string) {
315
319
  advertising the tool. Withheld entirely when the tool list was a prefix. -->
316
320
  <p
317
321
  v-if="resultFor(server.id)!.allowedTools?.unmatched?.length"
318
- class="text-[11px] text-amber-400"
322
+ class="text-[11px] text-app-warning-400"
319
323
  :data-testid="`tool-server-unmatched-${server.id}`"
320
324
  >
321
325
  {{
@@ -326,14 +330,14 @@ async function runProbe(id: string) {
326
330
  </p>
327
331
  <p
328
332
  v-else-if="resultFor(server.id)!.allowedTools?.checked === false"
329
- class="text-[11px] text-slate-500"
333
+ class="text-[11px] text-dimmed"
330
334
  >
331
335
  {{ t('settings.toolServers.allowedToolsUnchecked') }}
332
336
  </p>
333
337
 
334
338
  <p
335
339
  v-if="resultFor(server.id)!.unresolvedCredentials?.length"
336
- class="text-[11px] text-amber-400"
340
+ class="text-[11px] text-app-warning-400"
337
341
  >
338
342
  {{
339
343
  t('settings.toolServers.unresolvedCredentials', {
@@ -341,7 +345,10 @@ async function runProbe(id: string) {
341
345
  })
342
346
  }}
343
347
  </p>
344
- <p v-if="resultFor(server.id)!.refusedCredentials?.length" class="text-[11px] text-red-400">
348
+ <p
349
+ v-if="resultFor(server.id)!.refusedCredentials?.length"
350
+ class="text-[11px] text-app-error-400"
351
+ >
345
352
  {{
346
353
  t('settings.toolServers.refusedCredentials', {
347
354
  keys: resultFor(server.id)!.refusedCredentials!.join(', '),
@@ -350,7 +357,7 @@ async function runProbe(id: string) {
350
357
  </p>
351
358
  <p
352
359
  v-if="resultFor(server.id)!.unusableCredentials?.length"
353
- class="text-[11px] text-red-400"
360
+ class="text-[11px] text-app-error-400"
354
361
  >
355
362
  {{
356
363
  t('settings.toolServers.unusableCredentials', {
@@ -377,7 +384,7 @@ async function runProbe(id: string) {
377
384
  </UButton>
378
385
  <pre
379
386
  v-if="expanded[server.id]"
380
- class="overflow-x-auto rounded bg-slate-950 p-2 font-mono text-[10px] text-slate-400"
387
+ class="overflow-x-auto rounded bg-app-950 p-2 font-mono text-[10px] text-muted"
381
388
  >{{ resultFor(server.id)!.error }}</pre>
382
389
  </template>
383
390
  </div>
@@ -38,26 +38,26 @@ const hasAny = computed(() => usage.rows.length > 0)
38
38
 
39
39
  <template>
40
40
  <div class="space-y-6">
41
- <p class="text-[11px] text-slate-400">
41
+ <p class="text-[11px] text-muted">
42
42
  {{ t('settings.usage.body') }}
43
43
  </p>
44
44
 
45
- <p v-if="usage.report" class="text-[11px] text-slate-500">
45
+ <p v-if="usage.report" class="text-[11px] text-dimmed">
46
46
  {{ t('settings.usage.period', { date: d(new Date(usage.report.periodStart), 'short') }) }}
47
47
  </p>
48
48
 
49
- <p v-if="usage.loading" class="text-[11px] text-slate-500">{{ t('common.loading') }}</p>
50
- <p v-else-if="usage.error" class="text-[11px] text-rose-400">{{ usage.error }}</p>
51
- <p v-else-if="!hasAny" class="text-[11px] text-slate-500">{{ t('settings.usage.empty') }}</p>
49
+ <p v-if="usage.loading" class="text-[11px] text-dimmed">{{ t('common.loading') }}</p>
50
+ <p v-else-if="usage.error" class="text-[11px] text-app-error-400">{{ usage.error }}</p>
51
+ <p v-else-if="!hasAny" class="text-[11px] text-dimmed">{{ t('settings.usage.empty') }}</p>
52
52
 
53
53
  <template v-else>
54
54
  <!-- Subscriptions (flat-rate quota harnesses) -->
55
55
  <section v-if="usage.subscription.length" class="space-y-3">
56
56
  <div class="flex items-baseline justify-between">
57
- <h3 class="text-sm font-semibold text-slate-200">
57
+ <h3 class="text-sm font-semibold text-default">
58
58
  {{ t('settings.usage.subscription') }}
59
59
  </h3>
60
- <span class="text-[11px] text-slate-400">
60
+ <span class="text-[11px] text-muted">
61
61
  {{
62
62
  t('settings.usage.tokens', {
63
63
  input: formatTokens(usage.subscriptionTotal.inputTokens),
@@ -66,7 +66,7 @@ const hasAny = computed(() => usage.rows.length > 0)
66
66
  }}
67
67
  </span>
68
68
  </div>
69
- <p class="text-[10px] text-slate-500">{{ t('settings.usage.illustrative') }}</p>
69
+ <p class="text-[10px] text-dimmed">{{ t('settings.usage.illustrative') }}</p>
70
70
  <div
71
71
  v-for="row in usage.subscription"
72
72
  :key="`sub-${row.vendor}-${row.provider}-${row.model}`"
@@ -74,13 +74,13 @@ const hasAny = computed(() => usage.rows.length > 0)
74
74
  :data-testid="'usage-row-subscription'"
75
75
  >
76
76
  <div class="flex items-center justify-between gap-2 text-[11px]">
77
- <span class="min-w-0 truncate font-medium text-slate-300">{{ row.model }}</span>
78
- <span class="shrink-0 rounded bg-slate-700/60 px-1.5 py-0.5 text-[10px] text-slate-300">
77
+ <span class="min-w-0 truncate font-medium text-toned">{{ row.model }}</span>
78
+ <span class="shrink-0 rounded bg-accented/60 px-1.5 py-0.5 text-[10px] text-toned">
79
79
  {{ row.vendor ?? row.provider }}
80
80
  </span>
81
81
  </div>
82
82
  <UProgress :model-value="pctOf(row, usage.subscription)" size="xs" color="primary" />
83
- <div class="flex justify-between text-[10px] text-slate-500">
83
+ <div class="flex justify-between text-[10px] text-dimmed">
84
84
  <span>
85
85
  {{
86
86
  t('settings.usage.tokens', {
@@ -98,10 +98,10 @@ const hasAny = computed(() => usage.rows.length > 0)
98
98
  <!-- Metered API / proxy calls (real spend) -->
99
99
  <section v-if="usage.metered.length" class="space-y-3">
100
100
  <div class="flex items-baseline justify-between">
101
- <h3 class="text-sm font-semibold text-slate-200">
101
+ <h3 class="text-sm font-semibold text-default">
102
102
  {{ t('settings.usage.metered') }}
103
103
  </h3>
104
- <span class="text-[11px] text-slate-400">
104
+ <span class="text-[11px] text-muted">
105
105
  {{
106
106
  t('settings.usage.tokens', {
107
107
  input: formatTokens(usage.meteredTotal.inputTokens),
@@ -118,12 +118,12 @@ const hasAny = computed(() => usage.rows.length > 0)
118
118
  :data-testid="'usage-row-metered'"
119
119
  >
120
120
  <div class="flex items-center justify-between gap-2 text-[11px]">
121
- <span class="min-w-0 truncate font-medium text-slate-300">
121
+ <span class="min-w-0 truncate font-medium text-toned">
122
122
  {{ row.provider }}:{{ row.model }}
123
123
  </span>
124
124
  </div>
125
125
  <UProgress :model-value="pctOf(row, usage.metered)" size="xs" color="neutral" />
126
- <div class="flex justify-between text-[10px] text-slate-500">
126
+ <div class="flex justify-between text-[10px] text-dimmed">
127
127
  <span>
128
128
  {{
129
129
  t('settings.usage.tokens', {
@@ -153,24 +153,24 @@ async function remove() {
153
153
  </template>
154
154
  <template #body>
155
155
  <div class="space-y-4">
156
- <p class="text-xs text-slate-400">
156
+ <p class="text-xs text-muted">
157
157
  <i18n-t keypath="settings.userSecrets.intro" tag="span" scope="global">
158
158
  <template #you>
159
159
  <strong>{{ t('settings.userSecrets.introYou') }}</strong>
160
160
  </template>
161
161
  <template #scope>
162
- <span class="text-slate-300">{{ t('settings.userSecrets.introScope') }}</span>
162
+ <span class="text-toned">{{ t('settings.userSecrets.introScope') }}</span>
163
163
  </template>
164
164
  </i18n-t>
165
165
  </p>
166
166
 
167
167
  <div
168
168
  v-if="status"
169
- class="flex items-center justify-between rounded-md border border-slate-700 bg-slate-900/50 px-3 py-2 text-sm"
169
+ class="flex items-center justify-between rounded-md border border-muted bg-default/50 px-3 py-2 text-sm"
170
170
  >
171
171
  <div>
172
- <span class="font-medium text-slate-200">{{ status.label }}</span>
173
- <div class="text-[11px] text-emerald-400">
172
+ <span class="font-medium text-default">{{ status.label }}</span>
173
+ <div class="text-[11px] text-app-success-400">
174
174
  {{ t('settings.userSecrets.connectedStored') }}
175
175
  </div>
176
176
  </div>
@@ -184,11 +184,8 @@ async function remove() {
184
184
  />
185
185
  </div>
186
186
 
187
- <div
188
- v-if="descriptor"
189
- class="rounded-lg border border-dashed border-slate-700 p-3 space-y-3"
190
- >
191
- <p class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
187
+ <div v-if="descriptor" class="rounded-lg border border-dashed border-muted p-3 space-y-3">
188
+ <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
192
189
  {{
193
190
  status ? t('settings.userSecrets.replaceToken') : t('settings.userSecrets.addToken')
194
191
  }}
@@ -228,10 +225,10 @@ async function remove() {
228
225
  >
229
226
  {{ t('settings.userSecrets.testConnection') }}
230
227
  </UButton>
231
- <span v-if="testResult && testResult.ok" class="text-xs text-emerald-400">
228
+ <span v-if="testResult && testResult.ok" class="text-xs text-app-success-400">
232
229
  {{ testResult.message ?? t('settings.userSecrets.tokenValid') }}
233
230
  </span>
234
- <span v-else-if="testResult" class="text-xs text-rose-400">
231
+ <span v-else-if="testResult" class="text-xs text-app-error-400">
235
232
  {{ testResult.message ?? t('settings.userSecrets.tokenRejected') }}
236
233
  </span>
237
234
  </div>
@@ -90,15 +90,15 @@ function selectItems(field: WorkspaceMetadataFieldDefinition) {
90
90
  <template>
91
91
  <div class="space-y-6" data-testid="workspace-metadata-settings">
92
92
  <section class="space-y-2">
93
- <h3 class="text-sm font-semibold text-slate-200">
93
+ <h3 class="text-sm font-semibold text-default">
94
94
  {{ t('settings.workspaceSettings.metadata.heading') }}
95
95
  </h3>
96
- <p class="text-[11px] text-slate-400">
96
+ <p class="text-[11px] text-muted">
97
97
  {{ t('settings.workspaceSettings.metadata.body') }}
98
98
  </p>
99
99
  </section>
100
100
 
101
- <p v-if="fields.length === 0" class="text-[11px] text-slate-500">
101
+ <p v-if="fields.length === 0" class="text-[11px] text-dimmed">
102
102
  {{ t('settings.workspaceSettings.metadata.empty') }}
103
103
  </p>
104
104
 
@@ -106,7 +106,7 @@ function selectItems(field: WorkspaceMetadataFieldDefinition) {
106
106
  <div class="space-y-4">
107
107
  <label v-for="field in fields" :key="field.key" class="block">
108
108
  <!-- Field labels are deployment DATA, rendered verbatim (see the module docs). -->
109
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
109
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
110
110
  {{ field.label }}
111
111
  </span>
112
112
  <USelect
@@ -124,7 +124,7 @@ function selectItems(field: WorkspaceMetadataFieldDefinition) {
124
124
  size="sm"
125
125
  :data-testid="`workspace-metadata-${field.key}`"
126
126
  />
127
- <span v-if="field.description" class="mt-1 block text-[11px] text-slate-500">
127
+ <span v-if="field.description" class="mt-1 block text-[11px] text-dimmed">
128
128
  {{ field.description }}
129
129
  </span>
130
130
  </label>