@cat-factory/app 0.302.2 → 0.303.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/README.md +99 -14
  2. package/app/app.config.ts +19 -10
  3. package/app/assets/css/main.css +13 -13
  4. package/app/assets/css/prose.css +22 -22
  5. package/app/assets/css/tokens.css +298 -0
  6. package/app/components/assistant/AssistantModal.vue +22 -22
  7. package/app/components/auth/AuthGate.vue +1 -1
  8. package/app/components/auth/BackendMisconfiguredScreen.vue +10 -10
  9. package/app/components/auth/LoginScreen.vue +34 -36
  10. package/app/components/auth/ResetPasswordScreen.vue +12 -12
  11. package/app/components/auth/UserMenu.vue +4 -4
  12. package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +27 -25
  13. package/app/components/binaryOutput/BinaryOutputReport.vue +15 -15
  14. package/app/components/binaryOutput/StoredAssetView.vue +5 -5
  15. package/app/components/board/AddTaskModal.vue +17 -20
  16. package/app/components/board/AgentFailureCard.vue +11 -11
  17. package/app/components/board/AgentFailureHistory.vue +2 -2
  18. package/app/components/board/BoardCanvas.vue +6 -5
  19. package/app/components/board/CreateInitiativeModal.vue +8 -10
  20. package/app/components/board/DependencyConnectOverlay.vue +1 -1
  21. package/app/components/board/FailureHistoryList.vue +7 -7
  22. package/app/components/board/RecurringPipelineModal.vue +17 -17
  23. package/app/components/board/ReviewFrictionDialog.vue +6 -6
  24. package/app/components/board/StepExecutionHistory.vue +13 -13
  25. package/app/components/board/TaskDependencyEdges.vue +8 -8
  26. package/app/components/board/nodes/AgentChip.vue +10 -10
  27. package/app/components/board/nodes/BlockNode.vue +29 -29
  28. package/app/components/board/nodes/DecisionBadge.vue +2 -2
  29. package/app/components/board/nodes/EpicNode.vue +14 -10
  30. package/app/components/board/nodes/FrameSwimlanes.vue +7 -9
  31. package/app/components/board/nodes/InitiativeCard.vue +8 -8
  32. package/app/components/board/nodes/LaneGroup.vue +1 -1
  33. package/app/components/board/nodes/LaneTask.vue +2 -2
  34. package/app/components/board/nodes/ResizeGrips.vue +4 -4
  35. package/app/components/board/nodes/TaskCard.vue +18 -18
  36. package/app/components/board/nodes/TaskLane.vue +5 -5
  37. package/app/components/board/nodes/TaskPipelineMini.vue +18 -18
  38. package/app/components/bootstrap/AdoptionReviewModal.vue +29 -26
  39. package/app/components/bootstrap/BootstrapModal.vue +21 -23
  40. package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
  41. package/app/components/brainstorm/BrainstormWindow.vue +30 -33
  42. package/app/components/bugFishing/BugFishingWindow.vue +49 -49
  43. package/app/components/clarity/ClarityReviewWindow.vue +30 -30
  44. package/app/components/common/AsyncViewError.vue +5 -5
  45. package/app/components/common/ClarificationItem.vue +8 -13
  46. package/app/components/common/ConfirmDialog.vue +4 -2
  47. package/app/components/common/DescriptorFields.vue +1 -1
  48. package/app/components/common/EmptyState.vue +3 -3
  49. package/app/components/common/InterviewGateNotice.vue +7 -7
  50. package/app/components/common/KeyboardShortcutsHelp.vue +1 -1
  51. package/app/components/common/MarkdownProse.vue +14 -13
  52. package/app/components/consensus/ConsensusSessionWindow.vue +26 -26
  53. package/app/components/context/ContextAttachmentFields.vue +17 -17
  54. package/app/components/docs/DocInterviewWindow.vue +14 -14
  55. package/app/components/documents/ContextDocumentPicker.vue +17 -17
  56. package/app/components/documents/DocumentImportModal.vue +7 -7
  57. package/app/components/documents/DocumentSourceConnectModal.vue +3 -3
  58. package/app/components/documents/DocumentSyncState.vue +5 -5
  59. package/app/components/documents/DocumentTemplatesModal.vue +15 -15
  60. package/app/components/documents/RepoContextDocPicker.vue +5 -5
  61. package/app/components/documents/SpawnPreviewModal.vue +12 -12
  62. package/app/components/documents/StartFromDesignModal.vue +11 -11
  63. package/app/components/documents/TaskContextDocs.vue +5 -5
  64. package/app/components/environments/EnvSetupStepper.vue +6 -6
  65. package/app/components/environments/EnvironmentStatusPanel.vue +17 -17
  66. package/app/components/environments/steps/EnvPickStep.vue +3 -3
  67. package/app/components/environments/steps/EnvPreflightStep.vue +9 -9
  68. package/app/components/environments/steps/EnvReviewStep.vue +25 -22
  69. package/app/components/environments/steps/EnvSaveStep.vue +7 -5
  70. package/app/components/environments/steps/JourneyStepNav.vue +1 -1
  71. package/app/components/focus/BlockFocusView.vue +17 -19
  72. package/app/components/followUp/FollowUpWindow.vue +23 -23
  73. package/app/components/forkDecision/ForkDecisionWindow.vue +37 -39
  74. package/app/components/foundational/FoundationalContractSummary.vue +7 -7
  75. package/app/components/foundational/FoundationalServiceCatalogList.vue +11 -11
  76. package/app/components/foundational/FoundationalServiceManager.vue +1 -1
  77. package/app/components/foundational/FoundationalServiceRegistry.vue +13 -13
  78. package/app/components/foundational/FoundationalServiceSources.vue +13 -13
  79. package/app/components/foundational/FoundationalSuppressions.vue +7 -7
  80. package/app/components/foundational/ServiceCatalogConnection.vue +10 -10
  81. package/app/components/fragments/FragmentLibraryManager.vue +41 -44
  82. package/app/components/fragments/FragmentSelector.vue +13 -13
  83. package/app/components/fragments/GitHubDocUrlImport.vue +1 -1
  84. package/app/components/gates/GateFailingCheckList.vue +5 -5
  85. package/app/components/gates/GateResultView.vue +50 -47
  86. package/app/components/github/AddServiceFromRepoModal.vue +14 -14
  87. package/app/components/github/BranchProtectionPreflight.vue +13 -13
  88. package/app/components/github/GitHubConnect.vue +7 -7
  89. package/app/components/github/GitHubOnboarding.vue +7 -7
  90. package/app/components/github/GitHubPanel.vue +37 -40
  91. package/app/components/github/RepoTreeBrowser.vue +18 -18
  92. package/app/components/humanTest/HumanTestWindow.vue +30 -33
  93. package/app/components/initiative/InitiativePlanNotice.vue +5 -5
  94. package/app/components/initiative/InitiativePlanReview.vue +27 -29
  95. package/app/components/initiative/InitiativePlanningWindow.vue +10 -10
  96. package/app/components/initiative/InitiativeTrackerWindow.vue +71 -65
  97. package/app/components/inputGate/InputGateNotice.vue +2 -4
  98. package/app/components/judge/JudgeResultView.vue +30 -32
  99. package/app/components/kaizen/KaizenPanel.vue +40 -36
  100. package/app/components/kaizen/KaizenStepStatus.vue +21 -21
  101. package/app/components/layout/AccountAuditLog.vue +10 -10
  102. package/app/components/layout/AccountDeploymentSettings.vue +20 -20
  103. package/app/components/layout/AccountFailureKindRules.vue +13 -13
  104. package/app/components/layout/AccountFoundationalSettings.vue +1 -1
  105. package/app/components/layout/AccountFragmentSettings.vue +1 -1
  106. package/app/components/layout/AccountModelPolicySettings.vue +9 -9
  107. package/app/components/layout/AccountPlatformAlertSettings.vue +11 -11
  108. package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
  109. package/app/components/layout/AccountRunCredentialSettings.vue +5 -5
  110. package/app/components/layout/AccountSkillSettings.vue +1 -1
  111. package/app/components/layout/AccountTeamSettings.vue +23 -15
  112. package/app/components/layout/AiProvidersBanner.vue +11 -8
  113. package/app/components/layout/AppearanceSwitcher.vue +108 -0
  114. package/app/components/layout/BoardSwitcher.vue +8 -11
  115. package/app/components/layout/BoardToolbar.vue +3 -3
  116. package/app/components/layout/CommandBar.vue +7 -9
  117. package/app/components/layout/ConnectionStatusBanner.vue +2 -2
  118. package/app/components/layout/DefaultTestEnvBanner.vue +5 -5
  119. package/app/components/layout/GitHubPatBanner.vue +5 -5
  120. package/app/components/layout/GitHubPatPermissionsBanner.vue +16 -10
  121. package/app/components/layout/InfraSetupBanner.vue +6 -6
  122. package/app/components/layout/IntegrationsHub.vue +15 -15
  123. package/app/components/layout/LanguageSwitcher.vue +5 -5
  124. package/app/components/layout/ModelProvidersHub.vue +13 -16
  125. package/app/components/layout/NotificationsInbox.vue +10 -10
  126. package/app/components/layout/PersonalSetupModal.vue +8 -8
  127. package/app/components/layout/ProviderConfigBanner.vue +4 -4
  128. package/app/components/layout/RolePrompt.vue +7 -7
  129. package/app/components/layout/SideBar.vue +6 -4
  130. package/app/components/layout/SpendWarningBanner.vue +17 -14
  131. package/app/components/layout/TranslationWarningBanner.vue +4 -4
  132. package/app/components/layout/UiModeSwitcher.vue +13 -13
  133. package/app/components/layout/UiRoleSwitcher.vue +8 -8
  134. package/app/components/layout/WorkspaceMembersSettings.vue +15 -11
  135. package/app/components/media/ArtifactLightbox.vue +13 -13
  136. package/app/components/media/ImageCompare.vue +31 -24
  137. package/app/components/merge/MergeEffortChips.vue +2 -2
  138. package/app/components/notifications/NotificationSettingsPanel.vue +14 -12
  139. package/app/components/observability/OutcomeFilterChips.vue +6 -6
  140. package/app/components/observability/RunFailureSummary.vue +28 -25
  141. package/app/components/observability/StepMetricsBar.vue +26 -28
  142. package/app/components/observability/StepModelActivity.vue +2 -2
  143. package/app/components/observability/ToolCallList.vue +24 -24
  144. package/app/components/outcome/OutcomeSummaryWindow.vue +47 -47
  145. package/app/components/palettes/AgentPalette.vue +8 -8
  146. package/app/components/palettes/AgentTierSelect.vue +1 -1
  147. package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
  148. package/app/components/panels/AgentStepDetail.vue +52 -51
  149. package/app/components/panels/AttemptEntryHeader.vue +4 -6
  150. package/app/components/panels/DecisionModal.vue +7 -7
  151. package/app/components/panels/GenericStructuredResultView.vue +7 -7
  152. package/app/components/panels/InspectorPanel.vue +17 -17
  153. package/app/components/panels/MergerResultView.vue +19 -19
  154. package/app/components/panels/ObservabilityPanel.vue +115 -123
  155. package/app/components/panels/OperatorDashboardPanel.vue +89 -97
  156. package/app/components/panels/ReportsPanel.vue +69 -66
  157. package/app/components/panels/ReportsSpendBreakdown.vue +9 -9
  158. package/app/components/panels/ResultWindowShell.vue +38 -38
  159. package/app/components/panels/RunDetailLoadState.vue +2 -2
  160. package/app/components/panels/StepContainerStatus.vue +9 -9
  161. package/app/components/panels/StepDelegatedStatus.logic.spec.ts +135 -0
  162. package/app/components/panels/StepDelegatedStatus.logic.ts +160 -0
  163. package/app/components/panels/StepDelegatedStatus.vue +181 -0
  164. package/app/components/panels/StepEffortReport.vue +16 -15
  165. package/app/components/panels/StepFragmentAdherence.vue +14 -10
  166. package/app/components/panels/StepMetadataCard.vue +74 -45
  167. package/app/components/panels/StepReproductionReport.vue +25 -21
  168. package/app/components/panels/StepRunMeta.vue +20 -20
  169. package/app/components/panels/StepTestReport.logic.spec.ts +8 -3
  170. package/app/components/panels/StepTestReport.logic.ts +4 -4
  171. package/app/components/panels/StepTestReport.vue +28 -28
  172. package/app/components/panels/StepToolServers.vue +14 -11
  173. package/app/components/panels/StepValidationReport.vue +7 -7
  174. package/app/components/panels/inspector/ContainerSummary.vue +9 -9
  175. package/app/components/panels/inspector/DocReferenceRepos.vue +3 -3
  176. package/app/components/panels/inspector/EnvProbeReport.vue +24 -27
  177. package/app/components/panels/inspector/EpicChildren.vue +8 -12
  178. package/app/components/panels/inspector/FrontendBindingsResolved.vue +11 -11
  179. package/app/components/panels/inspector/FrontendConfig.vue +37 -41
  180. package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
  181. package/app/components/panels/inspector/InspectorSection.vue +6 -6
  182. package/app/components/panels/inspector/RecurringScheduleSettings.vue +16 -19
  183. package/app/components/panels/inspector/ServiceConnections.vue +2 -2
  184. package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
  185. package/app/components/panels/inspector/ServiceSelfTests.vue +21 -17
  186. package/app/components/panels/inspector/ServiceTestConfig.vue +51 -59
  187. package/app/components/panels/inspector/ServiceTestSecrets.vue +5 -5
  188. package/app/components/panels/inspector/ServiceTestingContext.vue +3 -3
  189. package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
  190. package/app/components/panels/inspector/TaskAgentConfig.vue +3 -3
  191. package/app/components/panels/inspector/TaskAprioriBranches.vue +8 -5
  192. package/app/components/panels/inspector/TaskDependencies.vue +1 -1
  193. package/app/components/panels/inspector/TaskEstimateBadge.vue +11 -11
  194. package/app/components/panels/inspector/TaskExecution.vue +17 -17
  195. package/app/components/panels/inspector/TaskReviewTarget.vue +2 -2
  196. package/app/components/panels/inspector/TaskRunSettings.vue +35 -37
  197. package/app/components/panels/inspector/TaskStructure.vue +3 -3
  198. package/app/components/pipeline/AgentKindIcon.vue +1 -1
  199. package/app/components/pipeline/AgentPromptEditor.vue +17 -17
  200. package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -56
  201. package/app/components/pipeline/EstimateThresholdFields.vue +4 -4
  202. package/app/components/pipeline/GateConfigFields.vue +13 -10
  203. package/app/components/pipeline/IterationCapPrompt.vue +4 -2
  204. package/app/components/pipeline/PipelineBuilder.vue +47 -55
  205. package/app/components/pipeline/PipelineHealthModal.vue +27 -29
  206. package/app/components/pipeline/PipelinePicker.vue +10 -10
  207. package/app/components/pipeline/PipelinePreview.vue +10 -10
  208. package/app/components/pipeline/PipelineProgress.vue +64 -67
  209. package/app/components/prReview/PrReviewPhaseBadge.vue +7 -7
  210. package/app/components/prReview/PrReviewWindow.vue +75 -77
  211. package/app/components/providers/AiPresetMismatchDialog.vue +5 -5
  212. package/app/components/providers/AiProviderOnboardingModal.vue +9 -9
  213. package/app/components/providers/ApiKeysSection.vue +13 -13
  214. package/app/components/providers/PersonalCredentialModal.vue +2 -2
  215. package/app/components/providers/PersonalSubscriptionSection.vue +10 -10
  216. package/app/components/providers/SignInRequiredNotice.vue +1 -1
  217. package/app/components/providers/VendorCredentialsModal.vue +10 -10
  218. package/app/components/provisioning/ProvisioningLogsDrawer.vue +13 -13
  219. package/app/components/ralph/RalphLoopResultView.vue +28 -30
  220. package/app/components/recurring/RecurrenceEditor.vue +2 -2
  221. package/app/components/requirements/RequirementsReviewWindow.vue +51 -58
  222. package/app/components/riskPolicy/RiskPolicyPicker.vue +12 -15
  223. package/app/components/riskPolicy/RiskPolicyPreview.vue +14 -14
  224. package/app/components/sandbox/SandboxPanel.vue +58 -59
  225. package/app/components/settings/AccountSettingsPanel.vue +1 -1
  226. package/app/components/settings/ApiTokensPanel.vue +10 -10
  227. package/app/components/settings/BudgetSettings.vue +18 -22
  228. package/app/components/settings/CapabilityCredentialsPanel.vue +15 -15
  229. package/app/components/settings/CloudflareHandlerSection.vue +20 -20
  230. package/app/components/settings/ComposeEnvironmentSetupSection.vue +13 -13
  231. package/app/components/settings/ConnectionTestVerdict.vue +3 -3
  232. package/app/components/settings/ConnectionWarnings.vue +1 -1
  233. package/app/components/settings/ConsensusGroupsSection.vue +27 -35
  234. package/app/components/settings/CustomManifestTypeEditor.vue +10 -10
  235. package/app/components/settings/DefaultProvisionTypeSection.vue +6 -6
  236. package/app/components/settings/InfraHandlersConfigurator.vue +24 -22
  237. package/app/components/settings/InfrastructureBackendPicker.vue +6 -6
  238. package/app/components/settings/InfrastructureWindow.vue +5 -5
  239. package/app/components/settings/IssueTrackerPanel.vue +29 -23
  240. package/app/components/settings/KubernetesEngineForm.vue +11 -11
  241. package/app/components/settings/KubernetesEnvironmentForm.vue +4 -4
  242. package/app/components/settings/LocalContainerPoolSettings.vue +6 -11
  243. package/app/components/settings/LocalModelEndpointsPanel.vue +20 -18
  244. package/app/components/settings/McpAuthorizeScreen.vue +13 -15
  245. package/app/components/settings/McpOAuthCallbackScreen.vue +16 -10
  246. package/app/components/settings/MergeClassRulesEditor.vue +6 -9
  247. package/app/components/settings/MergeRolePolicyEditor.vue +16 -16
  248. package/app/components/settings/ModelConfigurationPanel.vue +23 -30
  249. package/app/components/settings/ModelPresetHealthModal.vue +15 -13
  250. package/app/components/settings/ObservabilityConnectionPanel.vue +4 -4
  251. package/app/components/settings/OpenRouterCatalogPanel.vue +26 -19
  252. package/app/components/settings/PackageRegistriesPanel.vue +8 -8
  253. package/app/components/settings/ProviderConnectionTab.vue +8 -11
  254. package/app/components/settings/ProviderManifestEditor.vue +9 -9
  255. package/app/components/settings/ProviderPreferenceEditor.vue +8 -8
  256. package/app/components/settings/RiskPolicyCreateForm.vue +10 -10
  257. package/app/components/settings/RiskPolicyEditorRow.vue +14 -14
  258. package/app/components/settings/RiskPolicyHealthModal.vue +15 -13
  259. package/app/components/settings/RiskPolicyInheritedRow.vue +1 -1
  260. package/app/components/settings/RiskPolicyPanel.vue +10 -15
  261. package/app/components/settings/ServiceFragmentDefaultsPanel.vue +7 -7
  262. package/app/components/settings/SharedStacksPanel.vue +9 -12
  263. package/app/components/settings/TaskSourceCard.vue +4 -4
  264. package/app/components/settings/TaskTypeSuppressionsPanel.vue +6 -6
  265. package/app/components/settings/ToolServerChecklist.vue +36 -29
  266. package/app/components/settings/UsageSettings.vue +15 -15
  267. package/app/components/settings/UserSecretsSection.vue +9 -12
  268. package/app/components/settings/WorkspaceMetadataSettings.vue +5 -5
  269. package/app/components/settings/WorkspaceSettingsPanel.vue +47 -47
  270. package/app/components/skills/ReviewSkillQueue.vue +10 -10
  271. package/app/components/skills/SkillLibraryManager.vue +23 -20
  272. package/app/components/slack/SlackPanel.vue +13 -17
  273. package/app/components/spec/ServiceSpecWindow.vue +45 -42
  274. package/app/components/tasks/BugHuntModal.vue +24 -27
  275. package/app/components/tasks/ContextIssuePicker.vue +11 -11
  276. package/app/components/tasks/TaskContextIssues.vue +3 -3
  277. package/app/components/tasks/TaskImportModal.vue +7 -7
  278. package/app/components/tasks/TaskSourceConnectModal.vue +10 -8
  279. package/app/components/testing/TestReportWindow.vue +99 -82
  280. package/app/components/theme/ThemeImportModal.vue +115 -0
  281. package/app/components/tutorial/TutorialCatalogue.vue +9 -9
  282. package/app/components/tutorial/TutorialNudge.vue +5 -5
  283. package/app/components/tutorial/TutorialOverlay.vue +12 -12
  284. package/app/components/tutorial/TutorialPrompt.vue +6 -9
  285. package/app/components/vcs/GitLabConnect.vue +4 -4
  286. package/app/components/vcs/VcsConnectSurfaces.vue +2 -2
  287. package/app/components/visualConfirm/VisualConfirmationWindow.vue +36 -36
  288. package/app/composables/api/client.ts +6 -1
  289. package/app/composables/usePipelineErrorToast.ts +17 -0
  290. package/app/modular/agent-kinds.ts +24 -0
  291. package/app/pages/index.vue +5 -5
  292. package/app/plugins/theme.client.ts +125 -0
  293. package/app/spa-loading-template.html +52 -14
  294. package/app/stores/agents.ts +1 -1
  295. package/app/stores/theme.spec.ts +56 -0
  296. package/app/stores/theme.ts +87 -0
  297. package/app/types/domain.ts +19 -0
  298. package/app/types/execution.ts +4 -0
  299. package/app/utils/agentOutput.ts +1 -1
  300. package/app/utils/binaryOutput.ts +6 -6
  301. package/app/utils/bootstrapSteps.ts +14 -14
  302. package/app/utils/catalog.ts +87 -83
  303. package/app/utils/colorTint.ts +10 -0
  304. package/app/utils/failureKinds.ts +1 -0
  305. package/app/utils/observability.ts +3 -3
  306. package/app/utils/pipelineRender.ts +13 -17
  307. package/app/utils/swimlanes.ts +4 -4
  308. package/app/utils/theme/bootPalette.spec.ts +54 -0
  309. package/app/utils/theme/bootPalette.ts +108 -0
  310. package/app/utils/theme/builtins.spec.ts +38 -0
  311. package/app/utils/theme/builtins.ts +55 -0
  312. package/app/utils/theme/css.ts +162 -0
  313. package/app/utils/theme/doc.ts +353 -0
  314. package/app/utils/theme/link.ts +93 -0
  315. package/app/utils/theme/presets.ts +509 -0
  316. package/app/utils/theme/theme.spec.ts +224 -0
  317. package/i18n/locales/de.json +61 -4
  318. package/i18n/locales/en.json +70 -4
  319. package/i18n/locales/es.json +61 -4
  320. package/i18n/locales/fr.json +61 -4
  321. package/i18n/locales/he.json +61 -4
  322. package/i18n/locales/it.json +61 -4
  323. package/i18n/locales/ja.json +61 -4
  324. package/i18n/locales/pl.json +61 -4
  325. package/i18n/locales/tr.json +61 -4
  326. package/i18n/locales/uk.json +61 -4
  327. package/nuxt.config.ts +37 -11
  328. package/package.json +10 -9
@@ -222,9 +222,9 @@ const detailRows = computed(() =>
222
222
  const selectedRun = ref<SandboxRun | null>(null)
223
223
 
224
224
  function scoreColor(score: number): string {
225
- if (score >= 4) return 'text-emerald-400'
226
- if (score >= 3) return 'text-amber-400'
227
- return 'text-rose-400'
225
+ if (score >= 4) return 'text-app-success-400'
226
+ if (score >= 3) return 'text-app-warning-400'
227
+ return 'text-app-error-400'
228
228
  }
229
229
 
230
230
  // ---- prompt editor ---------------------------------------------------------
@@ -270,15 +270,15 @@ async function archive(prompt: SandboxPromptVersion) {
270
270
  >
271
271
  <template #body>
272
272
  <div v-if="store.loading" class="flex items-center justify-center py-12">
273
- <UIcon name="i-lucide-loader-circle" class="h-6 w-6 animate-spin text-slate-400" />
273
+ <UIcon name="i-lucide-loader-circle" class="h-6 w-6 animate-spin text-muted" />
274
274
  </div>
275
275
 
276
276
  <div
277
277
  v-else-if="!store.available"
278
- class="rounded-lg border border-slate-700 bg-slate-900/50 p-6 text-sm text-slate-300"
278
+ class="rounded-lg border border-muted bg-default/50 p-6 text-sm text-toned"
279
279
  >
280
- <p class="font-medium text-slate-200">{{ t('sandbox.unavailable.title') }}</p>
281
- <i18n-t keypath="sandbox.unavailable.body" tag="p" class="mt-1 text-slate-400">
280
+ <p class="font-medium text-default">{{ t('sandbox.unavailable.title') }}</p>
281
+ <i18n-t keypath="sandbox.unavailable.body" tag="p" class="mt-1 text-muted">
282
282
  <template #db><code>SANDBOX_DB</code></template>
283
283
  <template #schema><code>sandbox</code></template>
284
284
  </i18n-t>
@@ -286,10 +286,10 @@ async function archive(prompt: SandboxPromptVersion) {
286
286
 
287
287
  <div
288
288
  v-else-if="store.error"
289
- class="rounded-lg border border-rose-800 bg-rose-950/40 p-6 text-sm text-rose-200"
289
+ class="rounded-lg border border-app-error-800 bg-app-error-950/40 p-6 text-sm text-app-error-200"
290
290
  >
291
- <p class="font-medium text-rose-100">{{ t('sandbox.error.title') }}</p>
292
- <p class="mt-1 text-rose-300">{{ store.error }}</p>
291
+ <p class="font-medium text-app-error-100">{{ t('sandbox.error.title') }}</p>
292
+ <p class="mt-1 text-app-error-300">{{ store.error }}</p>
293
293
  <UButton class="mt-3" size="xs" color="neutral" variant="subtle" @click="store.load()">
294
294
  {{ t('common.retry') }}
295
295
  </UButton>
@@ -316,8 +316,8 @@ async function archive(prompt: SandboxPromptVersion) {
316
316
  <!-- ============================= EXPERIMENTS ============================= -->
317
317
  <div v-if="tab === 'experiments'" class="grid gap-4 lg:grid-cols-2">
318
318
  <!-- builder -->
319
- <div class="space-y-3 rounded-lg border border-slate-700 bg-slate-900/40 p-3">
320
- <p class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
319
+ <div class="space-y-3 rounded-lg border border-muted bg-default/40 p-3">
320
+ <p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
321
321
  {{ t('sandbox.builder.title') }}
322
322
  </p>
323
323
 
@@ -331,9 +331,9 @@ async function archive(prompt: SandboxPromptVersion) {
331
331
  <p
332
332
  v-for="excluded in unrunnableAgentKinds"
333
333
  :key="excluded.agentKind"
334
- class="mt-1 text-[11px] leading-snug text-slate-500"
334
+ class="mt-1 text-[11px] leading-snug text-dimmed"
335
335
  >
336
- <span class="font-medium text-slate-400">{{ excluded.label }}:</span>
336
+ <span class="font-medium text-muted">{{ excluded.label }}:</span>
337
337
  {{
338
338
  excluded.unsupportedReason
339
339
  ? UNSUPPORTED_REASON_LABEL[excluded.unsupportedReason]
@@ -343,14 +343,14 @@ async function archive(prompt: SandboxPromptVersion) {
343
343
  </UFormField>
344
344
 
345
345
  <div>
346
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
346
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
347
347
  {{ t('sandbox.builder.promptVersions') }}
348
348
  </span>
349
349
  <div class="max-h-28 space-y-1 overflow-auto pe-1">
350
350
  <label
351
351
  v-for="p in kindPrompts"
352
352
  :key="p.id"
353
- class="flex items-center gap-2 text-sm text-slate-300"
353
+ class="flex items-center gap-2 text-sm text-toned"
354
354
  >
355
355
  <UCheckbox
356
356
  :model-value="selectedPromptIds.includes(p.id)"
@@ -375,14 +375,14 @@ async function archive(prompt: SandboxPromptVersion) {
375
375
  </div>
376
376
 
377
377
  <div>
378
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
378
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
379
379
  {{ t('sandbox.builder.models') }}
380
380
  </span>
381
381
  <div class="max-h-28 space-y-1 overflow-auto pe-1">
382
382
  <label
383
383
  v-for="m in store.selectableModels"
384
384
  :key="m.id"
385
- class="flex items-center gap-2 text-sm text-slate-300"
385
+ class="flex items-center gap-2 text-sm text-toned"
386
386
  >
387
387
  <UCheckbox
388
388
  :model-value="selectedModelIds.includes(m.id)"
@@ -392,21 +392,21 @@ async function archive(prompt: SandboxPromptVersion) {
392
392
  />
393
393
  <span class="truncate">{{ m.label }}</span>
394
394
  </label>
395
- <p v-if="!store.selectableModels.length" class="text-xs text-slate-500">
395
+ <p v-if="!store.selectableModels.length" class="text-xs text-dimmed">
396
396
  {{ t('sandbox.builder.noModels') }}
397
397
  </p>
398
398
  </div>
399
399
  </div>
400
400
 
401
401
  <div>
402
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
402
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
403
403
  {{ t('sandbox.builder.fixtures') }}
404
404
  </span>
405
405
  <div class="max-h-28 space-y-1 overflow-auto pe-1">
406
406
  <label
407
407
  v-for="f in kindFixtures"
408
408
  :key="f.id"
409
- class="flex items-center gap-2 text-sm text-slate-300"
409
+ class="flex items-center gap-2 text-sm text-toned"
410
410
  >
411
411
  <UCheckbox
412
412
  :model-value="selectedFixtureIds.includes(f.id)"
@@ -416,7 +416,7 @@ async function archive(prompt: SandboxPromptVersion) {
416
416
  />
417
417
  <span class="truncate">{{ f.name }}</span>
418
418
  </label>
419
- <p v-if="!kindFixtures.length" class="text-xs text-slate-500">
419
+ <p v-if="!kindFixtures.length" class="text-xs text-dimmed">
420
420
  {{ t('sandbox.builder.noFixtures') }}
421
421
  </p>
422
422
  </div>
@@ -437,9 +437,9 @@ async function archive(prompt: SandboxPromptVersion) {
437
437
  </UFormField>
438
438
 
439
439
  <div class="flex items-center justify-between">
440
- <span class="text-xs text-slate-500">
440
+ <span class="text-xs text-dimmed">
441
441
  {{ t('sandbox.builder.cellCount', { count: cellCount }, cellCount) }}
442
- <span v-if="cellCount > store.maxCells" class="text-rose-400">
442
+ <span v-if="cellCount > store.maxCells" class="text-app-error-400">
443
443
  {{ t('sandbox.builder.maxCells', { max: store.maxCells }) }}
444
444
  </span>
445
445
  </span>
@@ -458,9 +458,9 @@ async function archive(prompt: SandboxPromptVersion) {
458
458
 
459
459
  <!-- history + results -->
460
460
  <div class="space-y-3">
461
- <div v-if="store.detail" class="rounded-lg border border-slate-700 bg-slate-900/40 p-3">
461
+ <div v-if="store.detail" class="rounded-lg border border-muted bg-default/40 p-3">
462
462
  <div class="mb-2 flex items-center justify-between">
463
- <p class="text-sm font-medium text-slate-200">
463
+ <p class="text-sm font-medium text-default">
464
464
  {{ store.detail.experiment.name }}
465
465
  </p>
466
466
  <UBadge variant="soft" size="xs">{{
@@ -469,7 +469,7 @@ async function archive(prompt: SandboxPromptVersion) {
469
469
  </div>
470
470
  <div class="overflow-auto">
471
471
  <table class="w-full text-start text-xs">
472
- <thead class="text-slate-500">
472
+ <thead class="text-dimmed">
473
473
  <tr>
474
474
  <th class="py-1 pe-2 font-medium">{{ t('sandbox.results.col.prompt') }}</th>
475
475
  <th class="py-1 pe-2 font-medium">{{ t('sandbox.results.col.model') }}</th>
@@ -482,14 +482,14 @@ async function archive(prompt: SandboxPromptVersion) {
482
482
  <tr
483
483
  v-for="{ run, grade, fixtureName } in detailRows"
484
484
  :key="run.id"
485
- class="cursor-pointer border-t border-slate-800 hover:bg-slate-800/40"
485
+ class="cursor-pointer border-t border-default hover:bg-elevated/40"
486
486
  @click="selectedRun = run"
487
487
  >
488
- <td class="py-1 pe-2 text-slate-300">{{ run.promptLabel }}</td>
489
- <td class="py-1 pe-2 font-mono text-[11px] text-slate-400">
488
+ <td class="py-1 pe-2 text-toned">{{ run.promptLabel }}</td>
489
+ <td class="py-1 pe-2 font-mono text-[11px] text-muted">
490
490
  {{ run.model }}
491
491
  </td>
492
- <td class="py-1 pe-2 text-slate-400">{{ fixtureName }}</td>
492
+ <td class="py-1 pe-2 text-muted">{{ fixtureName }}</td>
493
493
  <td class="py-1 pe-2">
494
494
  <span
495
495
  v-if="grade"
@@ -498,19 +498,21 @@ async function archive(prompt: SandboxPromptVersion) {
498
498
  >
499
499
  {{ grade.weightedTotal.toFixed(2) }}
500
500
  </span>
501
- <span v-else-if="run.status === 'failed'" class="text-rose-400">{{
501
+ <span v-else-if="run.status === 'failed'" class="text-app-error-400">{{
502
502
  t('sandbox.results.failed')
503
503
  }}</span>
504
- <span v-else class="text-slate-600">—</span>
504
+ <span v-else class="text-app-600">—</span>
505
505
  </td>
506
506
  <td class="py-1">
507
507
  <span
508
508
  v-if="grade?.objective"
509
- :class="grade.objective.pass ? 'text-emerald-400' : 'text-amber-400'"
509
+ :class="
510
+ grade.objective.pass ? 'text-app-success-400' : 'text-app-warning-400'
511
+ "
510
512
  >
511
513
  {{ grade.objective.caught }}/{{ grade.objective.total }}
512
514
  </span>
513
- <span v-else class="text-slate-600">—</span>
515
+ <span v-else class="text-app-600">—</span>
514
516
  </td>
515
517
  </tr>
516
518
  </tbody>
@@ -518,45 +520,45 @@ async function archive(prompt: SandboxPromptVersion) {
518
520
  </div>
519
521
 
520
522
  <!-- selected cell output -->
521
- <div v-if="selectedRun" class="mt-3 border-t border-slate-800 pt-2">
522
- <p class="mb-1 text-[11px] uppercase tracking-wide text-slate-500">
523
+ <div v-if="selectedRun" class="mt-3 border-t border-default pt-2">
524
+ <p class="mb-1 text-[11px] uppercase tracking-wide text-dimmed">
523
525
  {{ selectedRun.promptLabel }} · {{ selectedRun.model }}
524
526
  </p>
525
- <p v-if="selectedRun.error" class="text-xs text-rose-400">
527
+ <p v-if="selectedRun.error" class="text-xs text-app-error-400">
526
528
  {{ selectedRun.error }}
527
529
  </p>
528
530
  <pre
529
531
  v-if="selectedRun.outputText"
530
- class="max-h-48 overflow-auto whitespace-pre-wrap rounded bg-slate-950/60 p-2 text-[11px] text-slate-300"
532
+ class="max-h-48 overflow-auto whitespace-pre-wrap rounded bg-app-950/60 p-2 text-[11px] text-toned"
531
533
  >{{ selectedRun.outputText }}</pre>
532
534
  <div v-if="gradeByRun.get(selectedRun.id)" class="mt-2 space-y-0.5">
533
535
  <p
534
536
  v-for="d in gradeByRun.get(selectedRun.id)!.scores"
535
537
  :key="d.key"
536
- class="text-[11px] text-slate-400"
538
+ class="text-[11px] text-muted"
537
539
  >
538
540
  <span :class="scoreColor(d.score)" class="font-semibold">{{ d.score }}</span>
539
- <span class="ms-1 text-slate-300">{{ d.key }}</span>
540
- <span v-if="d.rationale" class="ms-1 text-slate-500">— {{ d.rationale }}</span>
541
+ <span class="ms-1 text-toned">{{ d.key }}</span>
542
+ <span v-if="d.rationale" class="ms-1 text-dimmed">— {{ d.rationale }}</span>
541
543
  </p>
542
544
  </div>
543
545
  </div>
544
546
  </div>
545
547
 
546
- <p class="text-[11px] uppercase tracking-wide text-slate-500">
548
+ <p class="text-[11px] uppercase tracking-wide text-dimmed">
547
549
  {{ t('sandbox.results.past') }}
548
550
  </p>
549
551
  <div class="max-h-56 space-y-1 overflow-auto">
550
552
  <button
551
553
  v-for="x in store.experiments"
552
554
  :key="x.id"
553
- class="flex w-full items-center justify-between rounded-md border border-slate-800 bg-slate-900/40 px-2 py-1.5 text-start text-sm hover:bg-slate-800/50"
555
+ class="flex w-full items-center justify-between rounded-md border border-default bg-default/40 px-2 py-1.5 text-start text-sm hover:bg-elevated/50"
554
556
  @click="store.openExperiment(x.id)"
555
557
  >
556
- <span class="truncate text-slate-300">{{ x.name }}</span>
558
+ <span class="truncate text-toned">{{ x.name }}</span>
557
559
  <UBadge variant="soft" size="xs">{{ EXPERIMENT_STATUS_LABEL[x.status] }}</UBadge>
558
560
  </button>
559
- <p v-if="!store.experiments.length" class="text-xs text-slate-500">
561
+ <p v-if="!store.experiments.length" class="text-xs text-dimmed">
560
562
  {{ t('sandbox.results.empty') }}
561
563
  </p>
562
564
  </div>
@@ -569,11 +571,11 @@ async function archive(prompt: SandboxPromptVersion) {
569
571
  <div
570
572
  v-for="p in store.prompts"
571
573
  :key="p.id"
572
- class="flex items-center justify-between rounded-md border border-slate-800 bg-slate-900/40 px-2.5 py-1.5 text-sm"
574
+ class="flex items-center justify-between rounded-md border border-default bg-default/40 px-2.5 py-1.5 text-sm"
573
575
  >
574
576
  <div class="min-w-0">
575
577
  <div class="flex items-center gap-2">
576
- <span class="truncate text-slate-200">{{ p.name }}</span>
578
+ <span class="truncate text-default">{{ p.name }}</span>
577
579
  <UBadge :color="PROMPT_ORIGIN_COLOR[p.origin]" variant="soft" size="xs">
578
580
  {{
579
581
  p.origin === 'baseline'
@@ -589,7 +591,7 @@ async function archive(prompt: SandboxPromptVersion) {
589
591
  }}
590
592
  </UBadge>
591
593
  </div>
592
- <span class="text-[11px] text-slate-500">{{ p.agentKind }}</span>
594
+ <span class="text-[11px] text-dimmed">{{ p.agentKind }}</span>
593
595
  </div>
594
596
  <div class="flex items-center gap-1">
595
597
  <UButton
@@ -629,11 +631,8 @@ async function archive(prompt: SandboxPromptVersion) {
629
631
  </div>
630
632
  </div>
631
633
 
632
- <div
633
- v-if="editing"
634
- class="space-y-2 rounded-lg border border-slate-700 bg-slate-900/40 p-3"
635
- >
636
- <p class="text-[11px] uppercase tracking-wide text-slate-500">
634
+ <div v-if="editing" class="space-y-2 rounded-lg border border-muted bg-default/40 p-3">
635
+ <p class="text-[11px] uppercase tracking-wide text-dimmed">
637
636
  {{
638
637
  editing.origin === 'baseline'
639
638
  ? t('sandbox.prompts.forkOf', { name: editing.name })
@@ -666,7 +665,7 @@ async function archive(prompt: SandboxPromptVersion) {
666
665
  </UButton>
667
666
  </div>
668
667
  </div>
669
- <p v-else class="self-start text-xs text-slate-500">
668
+ <p v-else class="self-start text-xs text-dimmed">
670
669
  {{ t('sandbox.prompts.hint') }}
671
670
  </p>
672
671
  </div>
@@ -676,10 +675,10 @@ async function archive(prompt: SandboxPromptVersion) {
676
675
  <div
677
676
  v-for="f in store.fixtures"
678
677
  :key="f.id"
679
- class="rounded-md border border-slate-800 bg-slate-900/40 px-2.5 py-2 text-sm"
678
+ class="rounded-md border border-default bg-default/40 px-2.5 py-2 text-sm"
680
679
  >
681
680
  <div class="flex items-center justify-between">
682
- <span class="text-slate-200">{{ f.name }}</span>
681
+ <span class="text-default">{{ f.name }}</span>
683
682
  <div class="flex items-center gap-1.5">
684
683
  <UBadge variant="soft" size="xs">{{ FIXTURE_KIND_LABEL[f.kind] }}</UBadge>
685
684
  <UBadge
@@ -691,7 +690,7 @@ async function archive(prompt: SandboxPromptVersion) {
691
690
  </UBadge>
692
691
  </div>
693
692
  </div>
694
- <p v-if="f.objective?.kind === 'findings'" class="mt-0.5 text-[11px] text-slate-500">
693
+ <p v-if="f.objective?.kind === 'findings'" class="mt-0.5 text-[11px] text-dimmed">
695
694
  {{
696
695
  t(
697
696
  'sandbox.fixtures.expectations',
@@ -701,7 +700,7 @@ async function archive(prompt: SandboxPromptVersion) {
701
700
  }}
702
701
  </p>
703
702
  </div>
704
- <p v-if="!store.fixtures.length" class="text-xs text-slate-500">
703
+ <p v-if="!store.fixtures.length" class="text-xs text-dimmed">
705
704
  {{ t('sandbox.fixtures.empty') }}
706
705
  </p>
707
706
  </div>
@@ -60,7 +60,7 @@ const tabs = computed(() => [
60
60
  <template>
61
61
  <UModal v-model:open="open" :title="t('settings.account.title')" :ui="{ content: 'max-w-3xl' }">
62
62
  <template #body>
63
- <p v-if="!accounts.activeAccountId" class="text-sm text-slate-400">
63
+ <p v-if="!accounts.activeAccountId" class="text-sm text-muted">
64
64
  {{ t('settings.account.noAccount') }}
65
65
  </p>
66
66
  <UTabs
@@ -189,7 +189,7 @@ async function revokeToken(key: PublicApiKey) {
189
189
  </template>
190
190
  <template #body>
191
191
  <div class="space-y-4" data-testid="api-tokens-panel">
192
- <p class="text-sm text-slate-400">
192
+ <p class="text-sm text-muted">
193
193
  {{ t('settings.apiTokens.intro') }}
194
194
  </p>
195
195
 
@@ -197,18 +197,18 @@ async function revokeToken(key: PublicApiKey) {
197
197
  key is never recoverable, so it must be copied now. -->
198
198
  <section
199
199
  v-if="newSecret"
200
- class="space-y-2 rounded-lg border border-primary-500/40 bg-primary-500/10 p-3"
200
+ class="space-y-2 rounded-lg border border-primary/40 bg-primary/10 p-3"
201
201
  data-testid="api-token-secret"
202
202
  >
203
- <div class="flex items-center gap-2 text-sm font-medium text-primary-200">
203
+ <div class="flex items-center gap-2 text-sm font-medium text-primary">
204
204
  <UIcon name="i-lucide-key-round" class="h-4 w-4 shrink-0" />
205
205
  <span>{{ t('settings.apiTokens.secret.heading') }}</span>
206
206
  </div>
207
- <p class="text-xs text-slate-300">{{ t('settings.apiTokens.secret.warning') }}</p>
207
+ <p class="text-xs text-toned">{{ t('settings.apiTokens.secret.warning') }}</p>
208
208
  <div
209
- class="flex items-center gap-2 rounded-md border border-slate-700 bg-slate-950/60 px-3 py-2"
209
+ class="flex items-center gap-2 rounded-md border border-muted bg-app-950/60 px-3 py-2"
210
210
  >
211
- <code class="min-w-0 flex-1 truncate font-mono text-xs text-slate-100">{{
211
+ <code class="min-w-0 flex-1 truncate font-mono text-xs text-app-100">{{
212
212
  newSecret
213
213
  }}</code>
214
214
  <CopyButton :text="newSecret" :label="t('settings.apiTokens.secret.copy')" size="sm" />
@@ -226,14 +226,14 @@ async function revokeToken(key: PublicApiKey) {
226
226
  </div>
227
227
  </section>
228
228
 
229
- <section v-if="store.keys.length" class="space-y-2 rounded-lg border border-slate-700 p-3">
229
+ <section v-if="store.keys.length" class="space-y-2 rounded-lg border border-muted p-3">
230
230
  <h3 class="text-sm font-semibold">
231
231
  {{ t('settings.apiTokens.list.heading') }}
232
232
  </h3>
233
233
  <div
234
234
  v-for="key in store.keys"
235
235
  :key="key.id"
236
- class="flex items-center justify-between gap-2 rounded-md border border-slate-800 px-3 py-2"
236
+ class="flex items-center justify-between gap-2 rounded-md border border-default px-3 py-2"
237
237
  >
238
238
  <div class="min-w-0 space-y-0.5">
239
239
  <div class="flex items-center gap-2">
@@ -259,7 +259,7 @@ async function revokeToken(key: PublicApiKey) {
259
259
  {{ boundLabel(key) }}
260
260
  </UBadge>
261
261
  </div>
262
- <div class="text-[11px] text-slate-500">
262
+ <div class="text-[11px] text-dimmed">
263
263
  {{
264
264
  t('settings.apiTokens.list.created', {
265
265
  date: d(new Date(key.createdAt), 'short'),
@@ -291,7 +291,7 @@ async function revokeToken(key: PublicApiKey) {
291
291
  </div>
292
292
  </section>
293
293
 
294
- <section class="space-y-3 rounded-lg border border-slate-700 p-3">
294
+ <section class="space-y-3 rounded-lg border border-muted p-3">
295
295
  <h3 class="text-sm font-semibold">
296
296
  {{ t('settings.apiTokens.add.heading') }}
297
297
  </h3>
@@ -122,18 +122,18 @@ function saveUser() {
122
122
 
123
123
  <template>
124
124
  <div class="space-y-8">
125
- <p class="text-[11px] text-slate-400">
125
+ <p class="text-[11px] text-muted">
126
126
  {{ t('settings.workspaceSettings.budget.body') }}
127
127
  </p>
128
128
 
129
129
  <!-- Workspace tier -->
130
130
  <section class="space-y-2">
131
- <h3 class="text-sm font-semibold text-slate-200">
131
+ <h3 class="text-sm font-semibold text-default">
132
132
  {{ t('settings.workspaceSettings.budget.workspace') }}
133
133
  </h3>
134
134
  <div class="grid grid-cols-2 gap-3">
135
135
  <label class="block">
136
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
136
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
137
137
  {{ t('settings.workspaceSettings.budget.monthlyLimit') }}
138
138
  </span>
139
139
  <UInput
@@ -145,7 +145,7 @@ function saveUser() {
145
145
  />
146
146
  </label>
147
147
  <label class="block">
148
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
148
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
149
149
  {{ t('settings.workspaceSettings.budget.currency') }}
150
150
  </span>
151
151
  <UInput
@@ -157,7 +157,7 @@ function saveUser() {
157
157
  />
158
158
  </label>
159
159
  </div>
160
- <div v-if="workspace.spend" class="text-[11px] text-slate-400">
160
+ <div v-if="workspace.spend" class="text-[11px] text-muted">
161
161
  {{
162
162
  t('settings.workspaceSettings.budget.spent', {
163
163
  spent: money(workspace.spend.costSpent, workspace.spend.currency),
@@ -180,14 +180,14 @@ function saveUser() {
180
180
 
181
181
  <!-- Account tier -->
182
182
  <section v-if="account" class="space-y-2">
183
- <h3 class="text-sm font-semibold text-slate-200">
183
+ <h3 class="text-sm font-semibold text-default">
184
184
  {{ t('settings.workspaceSettings.budget.account') }}
185
185
  </h3>
186
- <p class="text-[11px] text-slate-400">
186
+ <p class="text-[11px] text-muted">
187
187
  {{ t('settings.workspaceSettings.budget.accountBody') }}
188
188
  </p>
189
189
  <label class="block">
190
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
190
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
191
191
  {{ t('settings.workspaceSettings.budget.monthlyLimit') }}
192
192
  </span>
193
193
  <UInput
@@ -203,14 +203,12 @@ function saveUser() {
203
203
  <p
204
204
  v-if="accountCap != null"
205
205
  class="text-[11px]"
206
- :class="accountOverCap ? 'text-rose-400' : 'text-amber-400'"
206
+ :class="accountOverCap ? 'text-app-error-400' : 'text-app-warning-400'"
207
207
  >
208
208
  {{ t('settings.workspaceSettings.budget.hardCap', { amount: money(accountCap) }) }}
209
- <span class="text-slate-500"
210
- >({{ t('settings.workspaceSettings.budget.hardCapHint') }})</span
211
- >
209
+ <span class="text-dimmed">({{ t('settings.workspaceSettings.budget.hardCapHint') }})</span>
212
210
  </p>
213
- <div v-if="workspace.accountSpend" class="text-[11px] text-slate-400">
211
+ <div v-if="workspace.accountSpend" class="text-[11px] text-muted">
214
212
  {{
215
213
  t('settings.workspaceSettings.budget.spent', {
216
214
  spent: money(workspace.accountSpend.costSpent),
@@ -218,7 +216,7 @@ function saveUser() {
218
216
  })
219
217
  }}
220
218
  </div>
221
- <p v-if="!canEditAccount" class="text-[11px] text-slate-500">
219
+ <p v-if="!canEditAccount" class="text-[11px] text-dimmed">
222
220
  {{ t('settings.workspaceSettings.budget.adminOnly') }}
223
221
  </p>
224
222
  <div v-if="canEditAccount" class="flex justify-end">
@@ -237,14 +235,14 @@ function saveUser() {
237
235
 
238
236
  <!-- User tier -->
239
237
  <section class="space-y-2">
240
- <h3 class="text-sm font-semibold text-slate-200">
238
+ <h3 class="text-sm font-semibold text-default">
241
239
  {{ t('settings.workspaceSettings.budget.user') }}
242
240
  </h3>
243
- <p class="text-[11px] text-slate-400">
241
+ <p class="text-[11px] text-muted">
244
242
  {{ t('settings.workspaceSettings.budget.userBody') }}
245
243
  </p>
246
244
  <label class="block">
247
- <span class="mb-1 block text-[10px] uppercase tracking-wide text-slate-500">
245
+ <span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
248
246
  {{ t('settings.workspaceSettings.budget.monthlyLimit') }}
249
247
  </span>
250
248
  <UInput
@@ -259,14 +257,12 @@ function saveUser() {
259
257
  <p
260
258
  v-if="userCap != null"
261
259
  class="text-[11px]"
262
- :class="userOverCap ? 'text-rose-400' : 'text-amber-400'"
260
+ :class="userOverCap ? 'text-app-error-400' : 'text-app-warning-400'"
263
261
  >
264
262
  {{ t('settings.workspaceSettings.budget.hardCap', { amount: money(userCap) }) }}
265
- <span class="text-slate-500"
266
- >({{ t('settings.workspaceSettings.budget.hardCapHint') }})</span
267
- >
263
+ <span class="text-dimmed">({{ t('settings.workspaceSettings.budget.hardCapHint') }})</span>
268
264
  </p>
269
- <div v-if="workspace.userSpend" class="text-[11px] text-slate-400">
265
+ <div v-if="workspace.userSpend" class="text-[11px] text-muted">
270
266
  {{
271
267
  t('settings.workspaceSettings.budget.spent', {
272
268
  spent: money(workspace.userSpend.costSpent),
@@ -119,7 +119,7 @@ async function removeKey(key: string) {
119
119
  only thing on either surface that can say whether the value they typed works. -->
120
120
  <ToolServerChecklist />
121
121
 
122
- <p class="text-sm text-slate-400">
122
+ <p class="text-sm text-muted">
123
123
  {{ t('settings.capabilityCredentials.intro') }}
124
124
  </p>
125
125
 
@@ -140,7 +140,7 @@ async function removeKey(key: string) {
140
140
  <section
141
141
  v-for="entry in view?.declared ?? []"
142
142
  :key="entry.key"
143
- class="space-y-3 rounded-lg border border-slate-700 p-3"
143
+ class="space-y-3 rounded-lg border border-muted p-3"
144
144
  :data-testid="`capability-credential-${entry.key}`"
145
145
  >
146
146
  <div class="flex flex-wrap items-center gap-2">
@@ -165,15 +165,15 @@ async function removeKey(key: string) {
165
165
  <!-- Who wants the value, so an operator can tell what they are about to change. One key is
166
166
  routinely wanted by more than one capability (two integrations behind one vendor
167
167
  account), which is exactly when a rotation has consequences beyond the row it edits. -->
168
- <ul class="space-y-1 text-xs text-slate-400">
168
+ <ul class="space-y-1 text-xs text-muted">
169
169
  <li v-for="declarer in entry.declaredBy" :key="`${declarer.subject}:${declarer.id}`">
170
- <span class="text-slate-300">{{ declarer.label }}</span>
171
- <span class="text-slate-500"> · {{ SUBJECT_LABELS[declarer.subject] }}</span>
172
- <span v-if="declarer.usage" class="block text-slate-500">{{ declarer.usage }}</span>
170
+ <span class="text-toned">{{ declarer.label }}</span>
171
+ <span class="text-dimmed"> · {{ SUBJECT_LABELS[declarer.subject] }}</span>
172
+ <span v-if="declarer.usage" class="block text-dimmed">{{ declarer.usage }}</span>
173
173
  </li>
174
174
  </ul>
175
175
 
176
- <p v-if="entry.stored && entry.updatedAt" class="text-[11px] text-slate-500">
176
+ <p v-if="entry.stored && entry.updatedAt" class="text-[11px] text-dimmed">
177
177
  {{
178
178
  t('settings.capabilityCredentials.storedAt', {
179
179
  date: d(new Date(entry.updatedAt), 'short'),
@@ -191,13 +191,13 @@ async function removeKey(key: string) {
191
191
  usual one, but a facade that wired the store and dropped the flag lands here too, and
192
192
  blaming a custom resolver would make that wiring bug read as a deliberate configuration
193
193
  and send the operator to the one place that cannot explain it. -->
194
- <p v-else-if="view?.environmentFallback === true" class="text-[11px] text-slate-500">
194
+ <p v-else-if="view?.environmentFallback === true" class="text-[11px] text-dimmed">
195
195
  {{ t('settings.capabilityCredentials.notStoredWithFallback') }}
196
196
  </p>
197
- <p v-else-if="view?.environmentFallback === false" class="text-[11px] text-amber-400">
197
+ <p v-else-if="view?.environmentFallback === false" class="text-[11px] text-app-warning-400">
198
198
  {{ t('settings.capabilityCredentials.notStored') }}
199
199
  </p>
200
- <p v-else class="text-[11px] text-slate-500">
200
+ <p v-else class="text-[11px] text-dimmed">
201
201
  {{ t('settings.capabilityCredentials.notStoredUnknownFallback') }}
202
202
  </p>
203
203
 
@@ -241,7 +241,7 @@ async function removeKey(key: string) {
241
241
 
242
242
  <p
243
243
  v-if="view && !view.declared.length && !view.declarationsIncomplete"
244
- class="text-sm text-slate-500"
244
+ class="text-sm text-dimmed"
245
245
  >
246
246
  {{ t('settings.capabilityCredentials.noneDeclared') }}
247
247
  </p>
@@ -252,23 +252,23 @@ async function removeKey(key: string) {
252
252
  regressed". Withheld entirely while the declaration read is incomplete. -->
253
253
  <section
254
254
  v-if="view?.orphaned.length"
255
- class="space-y-2 rounded-lg border border-amber-900/60 p-3"
255
+ class="space-y-2 rounded-lg border border-app-warning-900/60 p-3"
256
256
  data-testid="capability-credentials-orphaned"
257
257
  >
258
258
  <h3 class="text-sm font-semibold">
259
259
  {{ t('settings.capabilityCredentials.orphaned.heading') }}
260
260
  </h3>
261
- <p class="text-xs text-slate-400">
261
+ <p class="text-xs text-muted">
262
262
  {{ t('settings.capabilityCredentials.orphaned.body') }}
263
263
  </p>
264
264
  <div
265
265
  v-for="orphan in view.orphaned"
266
266
  :key="orphan.key"
267
- class="flex items-center justify-between gap-2 rounded-md border border-slate-800 px-3 py-2"
267
+ class="flex items-center justify-between gap-2 rounded-md border border-default px-3 py-2"
268
268
  >
269
269
  <div class="min-w-0">
270
270
  <code class="font-mono text-sm">{{ orphan.key }}</code>
271
- <span class="block text-[11px] text-slate-500">
271
+ <span class="block text-[11px] text-dimmed">
272
272
  {{
273
273
  t('settings.capabilityCredentials.storedAt', {
274
274
  date: d(new Date(orphan.updatedAt), 'short'),