@cat-factory/app 0.302.2 → 0.303.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/README.md +16 -0
  2. package/app/app.config.ts +19 -10
  3. package/app/assets/css/main.css +13 -13
  4. package/app/assets/css/prose.css +22 -22
  5. package/app/assets/css/tokens.css +298 -0
  6. package/app/components/assistant/AssistantModal.vue +22 -22
  7. package/app/components/auth/AuthGate.vue +1 -1
  8. package/app/components/auth/BackendMisconfiguredScreen.vue +10 -10
  9. package/app/components/auth/LoginScreen.vue +34 -36
  10. package/app/components/auth/ResetPasswordScreen.vue +12 -12
  11. package/app/components/auth/UserMenu.vue +4 -4
  12. package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +27 -25
  13. package/app/components/binaryOutput/BinaryOutputReport.vue +15 -15
  14. package/app/components/binaryOutput/StoredAssetView.vue +5 -5
  15. package/app/components/board/AddTaskModal.vue +17 -20
  16. package/app/components/board/AgentFailureCard.vue +11 -11
  17. package/app/components/board/AgentFailureHistory.vue +2 -2
  18. package/app/components/board/BoardCanvas.vue +6 -5
  19. package/app/components/board/CreateInitiativeModal.vue +8 -10
  20. package/app/components/board/DependencyConnectOverlay.vue +1 -1
  21. package/app/components/board/FailureHistoryList.vue +7 -7
  22. package/app/components/board/RecurringPipelineModal.vue +17 -17
  23. package/app/components/board/ReviewFrictionDialog.vue +6 -6
  24. package/app/components/board/StepExecutionHistory.vue +13 -13
  25. package/app/components/board/TaskDependencyEdges.vue +8 -8
  26. package/app/components/board/nodes/AgentChip.vue +10 -10
  27. package/app/components/board/nodes/BlockNode.vue +29 -29
  28. package/app/components/board/nodes/DecisionBadge.vue +2 -2
  29. package/app/components/board/nodes/EpicNode.vue +14 -10
  30. package/app/components/board/nodes/FrameSwimlanes.vue +7 -9
  31. package/app/components/board/nodes/InitiativeCard.vue +8 -8
  32. package/app/components/board/nodes/LaneGroup.vue +1 -1
  33. package/app/components/board/nodes/LaneTask.vue +2 -2
  34. package/app/components/board/nodes/ResizeGrips.vue +4 -4
  35. package/app/components/board/nodes/TaskCard.vue +18 -18
  36. package/app/components/board/nodes/TaskLane.vue +5 -5
  37. package/app/components/board/nodes/TaskPipelineMini.vue +18 -18
  38. package/app/components/bootstrap/AdoptionReviewModal.vue +29 -26
  39. package/app/components/bootstrap/BootstrapModal.vue +21 -23
  40. package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
  41. package/app/components/brainstorm/BrainstormWindow.vue +30 -33
  42. package/app/components/bugFishing/BugFishingWindow.vue +49 -49
  43. package/app/components/clarity/ClarityReviewWindow.vue +30 -30
  44. package/app/components/common/AsyncViewError.vue +5 -5
  45. package/app/components/common/ClarificationItem.vue +8 -13
  46. package/app/components/common/ConfirmDialog.vue +4 -2
  47. package/app/components/common/DescriptorFields.vue +1 -1
  48. package/app/components/common/EmptyState.vue +3 -3
  49. package/app/components/common/InterviewGateNotice.vue +7 -7
  50. package/app/components/common/KeyboardShortcutsHelp.vue +1 -1
  51. package/app/components/common/MarkdownProse.vue +14 -13
  52. package/app/components/consensus/ConsensusSessionWindow.vue +26 -26
  53. package/app/components/context/ContextAttachmentFields.vue +17 -17
  54. package/app/components/docs/DocInterviewWindow.vue +14 -14
  55. package/app/components/documents/ContextDocumentPicker.vue +17 -17
  56. package/app/components/documents/DocumentImportModal.vue +7 -7
  57. package/app/components/documents/DocumentSourceConnectModal.vue +3 -3
  58. package/app/components/documents/DocumentSyncState.vue +5 -5
  59. package/app/components/documents/DocumentTemplatesModal.vue +15 -15
  60. package/app/components/documents/RepoContextDocPicker.vue +5 -5
  61. package/app/components/documents/SpawnPreviewModal.vue +12 -12
  62. package/app/components/documents/StartFromDesignModal.vue +11 -11
  63. package/app/components/documents/TaskContextDocs.vue +5 -5
  64. package/app/components/environments/EnvSetupStepper.vue +6 -6
  65. package/app/components/environments/EnvironmentStatusPanel.vue +17 -17
  66. package/app/components/environments/steps/EnvPickStep.vue +3 -3
  67. package/app/components/environments/steps/EnvPreflightStep.vue +9 -9
  68. package/app/components/environments/steps/EnvReviewStep.vue +25 -22
  69. package/app/components/environments/steps/EnvSaveStep.vue +7 -5
  70. package/app/components/environments/steps/JourneyStepNav.vue +1 -1
  71. package/app/components/focus/BlockFocusView.vue +17 -19
  72. package/app/components/followUp/FollowUpWindow.vue +23 -23
  73. package/app/components/forkDecision/ForkDecisionWindow.vue +37 -39
  74. package/app/components/foundational/FoundationalContractSummary.vue +7 -7
  75. package/app/components/foundational/FoundationalServiceCatalogList.vue +11 -11
  76. package/app/components/foundational/FoundationalServiceManager.vue +1 -1
  77. package/app/components/foundational/FoundationalServiceRegistry.vue +13 -13
  78. package/app/components/foundational/FoundationalServiceSources.vue +13 -13
  79. package/app/components/foundational/FoundationalSuppressions.vue +7 -7
  80. package/app/components/foundational/ServiceCatalogConnection.vue +10 -10
  81. package/app/components/fragments/FragmentLibraryManager.vue +41 -44
  82. package/app/components/fragments/FragmentSelector.vue +13 -13
  83. package/app/components/fragments/GitHubDocUrlImport.vue +1 -1
  84. package/app/components/gates/GateFailingCheckList.vue +5 -5
  85. package/app/components/gates/GateResultView.vue +50 -47
  86. package/app/components/github/AddServiceFromRepoModal.vue +14 -14
  87. package/app/components/github/BranchProtectionPreflight.vue +13 -13
  88. package/app/components/github/GitHubConnect.vue +7 -7
  89. package/app/components/github/GitHubOnboarding.vue +7 -7
  90. package/app/components/github/GitHubPanel.vue +37 -40
  91. package/app/components/github/RepoTreeBrowser.vue +18 -18
  92. package/app/components/humanTest/HumanTestWindow.vue +30 -33
  93. package/app/components/initiative/InitiativePlanNotice.vue +5 -5
  94. package/app/components/initiative/InitiativePlanReview.vue +27 -29
  95. package/app/components/initiative/InitiativePlanningWindow.vue +10 -10
  96. package/app/components/initiative/InitiativeTrackerWindow.vue +71 -65
  97. package/app/components/inputGate/InputGateNotice.vue +2 -4
  98. package/app/components/judge/JudgeResultView.vue +30 -32
  99. package/app/components/kaizen/KaizenPanel.vue +40 -36
  100. package/app/components/kaizen/KaizenStepStatus.vue +21 -21
  101. package/app/components/layout/AccountAuditLog.vue +10 -10
  102. package/app/components/layout/AccountDeploymentSettings.vue +20 -20
  103. package/app/components/layout/AccountFailureKindRules.vue +13 -13
  104. package/app/components/layout/AccountFoundationalSettings.vue +1 -1
  105. package/app/components/layout/AccountFragmentSettings.vue +1 -1
  106. package/app/components/layout/AccountModelPolicySettings.vue +9 -9
  107. package/app/components/layout/AccountPlatformAlertSettings.vue +11 -11
  108. package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
  109. package/app/components/layout/AccountRunCredentialSettings.vue +5 -5
  110. package/app/components/layout/AccountSkillSettings.vue +1 -1
  111. package/app/components/layout/AccountTeamSettings.vue +23 -15
  112. package/app/components/layout/AiProvidersBanner.vue +11 -8
  113. package/app/components/layout/AppearanceSwitcher.vue +108 -0
  114. package/app/components/layout/BoardSwitcher.vue +8 -11
  115. package/app/components/layout/BoardToolbar.vue +3 -3
  116. package/app/components/layout/CommandBar.vue +7 -9
  117. package/app/components/layout/ConnectionStatusBanner.vue +2 -2
  118. package/app/components/layout/DefaultTestEnvBanner.vue +5 -5
  119. package/app/components/layout/GitHubPatBanner.vue +5 -5
  120. package/app/components/layout/GitHubPatPermissionsBanner.vue +16 -10
  121. package/app/components/layout/InfraSetupBanner.vue +6 -6
  122. package/app/components/layout/IntegrationsHub.vue +15 -15
  123. package/app/components/layout/LanguageSwitcher.vue +5 -5
  124. package/app/components/layout/ModelProvidersHub.vue +13 -16
  125. package/app/components/layout/NotificationsInbox.vue +10 -10
  126. package/app/components/layout/PersonalSetupModal.vue +8 -8
  127. package/app/components/layout/ProviderConfigBanner.vue +4 -4
  128. package/app/components/layout/RolePrompt.vue +7 -7
  129. package/app/components/layout/SideBar.vue +6 -4
  130. package/app/components/layout/SpendWarningBanner.vue +17 -14
  131. package/app/components/layout/TranslationWarningBanner.vue +4 -4
  132. package/app/components/layout/UiModeSwitcher.vue +13 -13
  133. package/app/components/layout/UiRoleSwitcher.vue +8 -8
  134. package/app/components/layout/WorkspaceMembersSettings.vue +15 -11
  135. package/app/components/media/ArtifactLightbox.vue +13 -13
  136. package/app/components/media/ImageCompare.vue +31 -24
  137. package/app/components/merge/MergeEffortChips.vue +2 -2
  138. package/app/components/notifications/NotificationSettingsPanel.vue +14 -12
  139. package/app/components/observability/OutcomeFilterChips.vue +6 -6
  140. package/app/components/observability/RunFailureSummary.vue +28 -25
  141. package/app/components/observability/StepMetricsBar.vue +26 -28
  142. package/app/components/observability/StepModelActivity.vue +2 -2
  143. package/app/components/observability/ToolCallList.vue +24 -24
  144. package/app/components/outcome/OutcomeSummaryWindow.vue +47 -47
  145. package/app/components/palettes/AgentPalette.vue +8 -8
  146. package/app/components/palettes/AgentTierSelect.vue +1 -1
  147. package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
  148. package/app/components/panels/AgentStepDetail.vue +52 -51
  149. package/app/components/panels/AttemptEntryHeader.vue +4 -6
  150. package/app/components/panels/DecisionModal.vue +7 -7
  151. package/app/components/panels/GenericStructuredResultView.vue +7 -7
  152. package/app/components/panels/InspectorPanel.vue +17 -17
  153. package/app/components/panels/MergerResultView.vue +19 -19
  154. package/app/components/panels/ObservabilityPanel.vue +115 -123
  155. package/app/components/panels/OperatorDashboardPanel.vue +89 -97
  156. package/app/components/panels/ReportsPanel.vue +69 -66
  157. package/app/components/panels/ReportsSpendBreakdown.vue +9 -9
  158. package/app/components/panels/ResultWindowShell.vue +38 -38
  159. package/app/components/panels/RunDetailLoadState.vue +2 -2
  160. package/app/components/panels/StepContainerStatus.vue +9 -9
  161. package/app/components/panels/StepDelegatedStatus.logic.spec.ts +135 -0
  162. package/app/components/panels/StepDelegatedStatus.logic.ts +160 -0
  163. package/app/components/panels/StepDelegatedStatus.vue +181 -0
  164. package/app/components/panels/StepEffortReport.vue +16 -15
  165. package/app/components/panels/StepFragmentAdherence.vue +14 -10
  166. package/app/components/panels/StepMetadataCard.vue +74 -45
  167. package/app/components/panels/StepReproductionReport.vue +25 -21
  168. package/app/components/panels/StepRunMeta.vue +20 -20
  169. package/app/components/panels/StepTestReport.logic.spec.ts +8 -3
  170. package/app/components/panels/StepTestReport.logic.ts +4 -4
  171. package/app/components/panels/StepTestReport.vue +28 -28
  172. package/app/components/panels/StepToolServers.vue +14 -11
  173. package/app/components/panels/StepValidationReport.vue +7 -7
  174. package/app/components/panels/inspector/ContainerSummary.vue +9 -9
  175. package/app/components/panels/inspector/DocReferenceRepos.vue +3 -3
  176. package/app/components/panels/inspector/EnvProbeReport.vue +24 -27
  177. package/app/components/panels/inspector/EpicChildren.vue +8 -12
  178. package/app/components/panels/inspector/FrontendBindingsResolved.vue +11 -11
  179. package/app/components/panels/inspector/FrontendConfig.vue +37 -41
  180. package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
  181. package/app/components/panels/inspector/InspectorSection.vue +6 -6
  182. package/app/components/panels/inspector/RecurringScheduleSettings.vue +16 -19
  183. package/app/components/panels/inspector/ServiceConnections.vue +2 -2
  184. package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
  185. package/app/components/panels/inspector/ServiceSelfTests.vue +21 -17
  186. package/app/components/panels/inspector/ServiceTestConfig.vue +51 -59
  187. package/app/components/panels/inspector/ServiceTestSecrets.vue +5 -5
  188. package/app/components/panels/inspector/ServiceTestingContext.vue +3 -3
  189. package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
  190. package/app/components/panels/inspector/TaskAgentConfig.vue +3 -3
  191. package/app/components/panels/inspector/TaskAprioriBranches.vue +8 -5
  192. package/app/components/panels/inspector/TaskDependencies.vue +1 -1
  193. package/app/components/panels/inspector/TaskEstimateBadge.vue +11 -11
  194. package/app/components/panels/inspector/TaskExecution.vue +17 -17
  195. package/app/components/panels/inspector/TaskReviewTarget.vue +2 -2
  196. package/app/components/panels/inspector/TaskRunSettings.vue +35 -37
  197. package/app/components/panels/inspector/TaskStructure.vue +3 -3
  198. package/app/components/pipeline/AgentKindIcon.vue +1 -1
  199. package/app/components/pipeline/AgentPromptEditor.vue +17 -17
  200. package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -56
  201. package/app/components/pipeline/EstimateThresholdFields.vue +4 -4
  202. package/app/components/pipeline/GateConfigFields.vue +13 -10
  203. package/app/components/pipeline/IterationCapPrompt.vue +4 -2
  204. package/app/components/pipeline/PipelineBuilder.vue +47 -55
  205. package/app/components/pipeline/PipelineHealthModal.vue +27 -29
  206. package/app/components/pipeline/PipelinePicker.vue +10 -10
  207. package/app/components/pipeline/PipelinePreview.vue +10 -10
  208. package/app/components/pipeline/PipelineProgress.vue +64 -67
  209. package/app/components/prReview/PrReviewPhaseBadge.vue +7 -7
  210. package/app/components/prReview/PrReviewWindow.vue +75 -77
  211. package/app/components/providers/AiPresetMismatchDialog.vue +5 -5
  212. package/app/components/providers/AiProviderOnboardingModal.vue +9 -9
  213. package/app/components/providers/ApiKeysSection.vue +13 -13
  214. package/app/components/providers/PersonalCredentialModal.vue +2 -2
  215. package/app/components/providers/PersonalSubscriptionSection.vue +10 -10
  216. package/app/components/providers/SignInRequiredNotice.vue +1 -1
  217. package/app/components/providers/VendorCredentialsModal.vue +10 -10
  218. package/app/components/provisioning/ProvisioningLogsDrawer.vue +13 -13
  219. package/app/components/ralph/RalphLoopResultView.vue +28 -30
  220. package/app/components/recurring/RecurrenceEditor.vue +2 -2
  221. package/app/components/requirements/RequirementsReviewWindow.vue +51 -58
  222. package/app/components/riskPolicy/RiskPolicyPicker.vue +12 -15
  223. package/app/components/riskPolicy/RiskPolicyPreview.vue +14 -14
  224. package/app/components/sandbox/SandboxPanel.vue +58 -59
  225. package/app/components/settings/AccountSettingsPanel.vue +1 -1
  226. package/app/components/settings/ApiTokensPanel.vue +10 -10
  227. package/app/components/settings/BudgetSettings.vue +18 -22
  228. package/app/components/settings/CapabilityCredentialsPanel.vue +15 -15
  229. package/app/components/settings/CloudflareHandlerSection.vue +20 -20
  230. package/app/components/settings/ComposeEnvironmentSetupSection.vue +13 -13
  231. package/app/components/settings/ConnectionTestVerdict.vue +3 -3
  232. package/app/components/settings/ConnectionWarnings.vue +1 -1
  233. package/app/components/settings/ConsensusGroupsSection.vue +27 -35
  234. package/app/components/settings/CustomManifestTypeEditor.vue +10 -10
  235. package/app/components/settings/DefaultProvisionTypeSection.vue +6 -6
  236. package/app/components/settings/InfraHandlersConfigurator.vue +24 -22
  237. package/app/components/settings/InfrastructureBackendPicker.vue +6 -6
  238. package/app/components/settings/InfrastructureWindow.vue +5 -5
  239. package/app/components/settings/IssueTrackerPanel.vue +29 -23
  240. package/app/components/settings/KubernetesEngineForm.vue +11 -11
  241. package/app/components/settings/KubernetesEnvironmentForm.vue +4 -4
  242. package/app/components/settings/LocalContainerPoolSettings.vue +6 -11
  243. package/app/components/settings/LocalModelEndpointsPanel.vue +20 -18
  244. package/app/components/settings/McpAuthorizeScreen.vue +13 -15
  245. package/app/components/settings/McpOAuthCallbackScreen.vue +16 -10
  246. package/app/components/settings/MergeClassRulesEditor.vue +6 -9
  247. package/app/components/settings/MergeRolePolicyEditor.vue +16 -16
  248. package/app/components/settings/ModelConfigurationPanel.vue +23 -30
  249. package/app/components/settings/ModelPresetHealthModal.vue +15 -13
  250. package/app/components/settings/ObservabilityConnectionPanel.vue +4 -4
  251. package/app/components/settings/OpenRouterCatalogPanel.vue +23 -19
  252. package/app/components/settings/PackageRegistriesPanel.vue +8 -8
  253. package/app/components/settings/ProviderConnectionTab.vue +8 -11
  254. package/app/components/settings/ProviderManifestEditor.vue +9 -9
  255. package/app/components/settings/ProviderPreferenceEditor.vue +8 -8
  256. package/app/components/settings/RiskPolicyCreateForm.vue +10 -10
  257. package/app/components/settings/RiskPolicyEditorRow.vue +14 -14
  258. package/app/components/settings/RiskPolicyHealthModal.vue +15 -13
  259. package/app/components/settings/RiskPolicyInheritedRow.vue +1 -1
  260. package/app/components/settings/RiskPolicyPanel.vue +10 -15
  261. package/app/components/settings/ServiceFragmentDefaultsPanel.vue +7 -7
  262. package/app/components/settings/SharedStacksPanel.vue +9 -12
  263. package/app/components/settings/TaskSourceCard.vue +4 -4
  264. package/app/components/settings/TaskTypeSuppressionsPanel.vue +6 -6
  265. package/app/components/settings/ToolServerChecklist.vue +36 -29
  266. package/app/components/settings/UsageSettings.vue +15 -15
  267. package/app/components/settings/UserSecretsSection.vue +9 -12
  268. package/app/components/settings/WorkspaceMetadataSettings.vue +5 -5
  269. package/app/components/settings/WorkspaceSettingsPanel.vue +47 -47
  270. package/app/components/skills/ReviewSkillQueue.vue +10 -10
  271. package/app/components/skills/SkillLibraryManager.vue +23 -20
  272. package/app/components/slack/SlackPanel.vue +13 -17
  273. package/app/components/spec/ServiceSpecWindow.vue +45 -42
  274. package/app/components/tasks/BugHuntModal.vue +24 -27
  275. package/app/components/tasks/ContextIssuePicker.vue +11 -11
  276. package/app/components/tasks/TaskContextIssues.vue +3 -3
  277. package/app/components/tasks/TaskImportModal.vue +7 -7
  278. package/app/components/tasks/TaskSourceConnectModal.vue +10 -8
  279. package/app/components/testing/TestReportWindow.vue +99 -82
  280. package/app/components/theme/ThemeImportModal.vue +115 -0
  281. package/app/components/tutorial/TutorialCatalogue.vue +9 -9
  282. package/app/components/tutorial/TutorialNudge.vue +5 -5
  283. package/app/components/tutorial/TutorialOverlay.vue +12 -12
  284. package/app/components/tutorial/TutorialPrompt.vue +6 -9
  285. package/app/components/vcs/GitLabConnect.vue +4 -4
  286. package/app/components/vcs/VcsConnectSurfaces.vue +2 -2
  287. package/app/components/visualConfirm/VisualConfirmationWindow.vue +36 -36
  288. package/app/composables/api/client.ts +6 -1
  289. package/app/composables/usePipelineErrorToast.ts +17 -0
  290. package/app/modular/agent-kinds.ts +24 -0
  291. package/app/pages/index.vue +5 -5
  292. package/app/plugins/theme.client.ts +125 -0
  293. package/app/spa-loading-template.html +52 -14
  294. package/app/stores/agents.ts +1 -1
  295. package/app/stores/theme.spec.ts +56 -0
  296. package/app/stores/theme.ts +87 -0
  297. package/app/types/domain.ts +19 -0
  298. package/app/types/execution.ts +4 -0
  299. package/app/utils/agentOutput.ts +1 -1
  300. package/app/utils/binaryOutput.ts +6 -6
  301. package/app/utils/bootstrapSteps.ts +14 -14
  302. package/app/utils/catalog.ts +87 -83
  303. package/app/utils/colorTint.ts +10 -0
  304. package/app/utils/failureKinds.ts +1 -0
  305. package/app/utils/observability.ts +3 -3
  306. package/app/utils/pipelineRender.ts +13 -17
  307. package/app/utils/swimlanes.ts +4 -4
  308. package/app/utils/theme/bootPalette.spec.ts +54 -0
  309. package/app/utils/theme/bootPalette.ts +108 -0
  310. package/app/utils/theme/builtins.spec.ts +38 -0
  311. package/app/utils/theme/builtins.ts +55 -0
  312. package/app/utils/theme/css.ts +162 -0
  313. package/app/utils/theme/doc.ts +353 -0
  314. package/app/utils/theme/link.ts +93 -0
  315. package/app/utils/theme/presets.ts +509 -0
  316. package/app/utils/theme/theme.spec.ts +224 -0
  317. package/i18n/locales/de.json +61 -4
  318. package/i18n/locales/en.json +70 -4
  319. package/i18n/locales/es.json +61 -4
  320. package/i18n/locales/fr.json +61 -4
  321. package/i18n/locales/he.json +61 -4
  322. package/i18n/locales/it.json +61 -4
  323. package/i18n/locales/ja.json +61 -4
  324. package/i18n/locales/pl.json +61 -4
  325. package/i18n/locales/tr.json +61 -4
  326. package/i18n/locales/uk.json +61 -4
  327. package/nuxt.config.ts +37 -11
  328. package/package.json +9 -8
@@ -194,9 +194,9 @@ const SPEC_JOIN_KEYS: Record<Exclude<OutcomeSpecJoin, 'joined'>, string> = {
194
194
  }
195
195
 
196
196
  const VERDICT_META: Record<RequirementVerdictStatus, { color: string; key: string }> = {
197
- met: { color: '#22c55e', key: 'outcome.requirements.verdict.met' },
198
- not_met: { color: '#ef4444', key: 'outcome.requirements.verdict.not_met' },
199
- not_covered: { color: '#64748b', key: 'outcome.requirements.verdict.not_covered' },
197
+ met: { color: 'var(--ui-success)', key: 'outcome.requirements.verdict.met' },
198
+ not_met: { color: 'var(--ui-error)', key: 'outcome.requirements.verdict.not_met' },
199
+ not_covered: { color: 'var(--ui-text-muted)', key: 'outcome.requirements.verdict.not_covered' },
200
200
  }
201
201
  const SEVERITY_KEYS: Record<TestConcernSeverity, string> = {
202
202
  low: 'outcome.tests.severity.low',
@@ -412,7 +412,7 @@ function openTestReport() {
412
412
  <ResultWindowShell
413
413
  :open="open"
414
414
  icon="i-lucide-clipboard-check"
415
- icon-class="bg-sky-500/15 text-sky-300"
415
+ icon-class="bg-app-info-500/15 text-app-info-300"
416
416
  :title="headerTitle"
417
417
  :subtitle="t('outcome.subtitle')"
418
418
  width="3xl"
@@ -458,16 +458,16 @@ function openTestReport() {
458
458
 
459
459
  <!-- What was asked, in the requester's own words. -->
460
460
  <section class="mb-5">
461
- <h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
461
+ <h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
462
462
  {{ t('outcome.ask.title') }}
463
463
  </h3>
464
464
  <MarkdownProse
465
465
  v-if="outcome.ask"
466
466
  :text="outcome.ask"
467
- class="text-[13px] leading-relaxed text-slate-300"
467
+ class="text-[13px] leading-relaxed text-toned"
468
468
  data-testid="outcome-ask"
469
469
  />
470
- <p v-else class="text-[13px] italic leading-relaxed text-slate-500">
470
+ <p v-else class="text-[13px] italic leading-relaxed text-dimmed">
471
471
  {{ t('outcome.ask.none') }}
472
472
  </p>
473
473
  </section>
@@ -477,25 +477,25 @@ function openTestReport() {
477
477
  agents actually read, and every section below is a statement about work done against
478
478
  it. A design that moved mid-run is the reading that changes all of them. -->
479
479
  <section class="mb-5" data-testid="outcome-sources">
480
- <h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
480
+ <h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
481
481
  {{ t('outcome.sources.title') }}
482
482
  </h3>
483
483
  <div v-if="outcome.sources.status === 'reported'" class="space-y-1">
484
484
  <div
485
485
  v-for="source in sourceRows"
486
486
  :key="`${source.origin}:${source.url || source.title}`"
487
- class="rounded-md border border-slate-800 bg-slate-900/60 px-2 py-1.5"
487
+ class="rounded-md border border-default bg-default/60 px-2 py-1.5"
488
488
  data-testid="outcome-source"
489
489
  >
490
490
  <DocumentOriginLink
491
491
  :url="source.url ?? ''"
492
- class="flex items-center gap-1.5 text-xs text-slate-300"
493
- hover-class="hover:text-white"
492
+ class="flex items-center gap-1.5 text-xs text-toned"
493
+ hover-class="hover:text-highlighted"
494
494
  >
495
- <UIcon :name="source.icon" class="h-3.5 w-3.5 shrink-0 text-indigo-400" />
495
+ <UIcon :name="source.icon" class="h-3.5 w-3.5 shrink-0 text-primary" />
496
496
  <span class="truncate">{{ source.title }}</span>
497
497
  </DocumentOriginLink>
498
- <p class="mt-0.5 text-[11px] text-slate-500" data-testid="outcome-source-revision">
498
+ <p class="mt-0.5 text-[11px] text-dimmed" data-testid="outcome-source-revision">
499
499
  {{ source.revision }}
500
500
  </p>
501
501
  <!-- Stated separately from the revision above: the last revision alone says the run
@@ -503,21 +503,21 @@ function openTestReport() {
503
503
  changed under it. -->
504
504
  <p
505
505
  v-if="source.movedDuringRun"
506
- class="mt-0.5 text-[11px] text-amber-300"
506
+ class="mt-0.5 text-[11px] text-app-warning-300"
507
507
  data-testid="outcome-source-moved"
508
508
  >
509
509
  {{ t('outcome.sources.moved') }}
510
510
  </p>
511
511
  </div>
512
512
  </div>
513
- <p v-else class="text-[13px] italic leading-relaxed text-slate-500">
513
+ <p v-else class="text-[13px] italic leading-relaxed text-dimmed">
514
514
  {{ t(SOURCES_GAP_KEYS[outcome.sources.gap]) }}
515
515
  </p>
516
516
  </section>
517
517
 
518
518
  <!-- Requirement coverage: which required behaviours were checked, and what was seen. -->
519
519
  <section class="mb-5" data-testid="outcome-requirements">
520
- <h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
520
+ <h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
521
521
  {{ t('outcome.requirements.title') }}
522
522
  </h3>
523
523
  <template v-if="outcome.requirements.status === 'reported'">
@@ -550,7 +550,7 @@ function openTestReport() {
550
550
  and do not cover rather than letting them read as the whole picture. -->
551
551
  <p
552
552
  v-if="specNote"
553
- class="mb-2 text-[11px] leading-relaxed text-amber-300/90"
553
+ class="mb-2 text-[11px] leading-relaxed text-app-warning-300/90"
554
554
  data-testid="outcome-spec-note"
555
555
  >
556
556
  {{ specNote }}
@@ -560,7 +560,7 @@ function openTestReport() {
560
560
  deciding which of the two numbers to distrust. -->
561
561
  <p
562
562
  v-if="unmatchedVerdicts > 0"
563
- class="mb-2 text-[11px] leading-relaxed text-amber-300/90"
563
+ class="mb-2 text-[11px] leading-relaxed text-app-warning-300/90"
564
564
  data-testid="outcome-unmatched-verdicts"
565
565
  >
566
566
  {{ t('outcome.requirements.unmatchedVerdicts', { count: unmatchedVerdicts }) }}
@@ -569,7 +569,7 @@ function openTestReport() {
569
569
  <li
570
570
  v-for="req in requirementRows"
571
571
  :key="req.id"
572
- class="flex items-start gap-2 rounded-md border border-slate-800 bg-slate-950/40 p-2"
572
+ class="flex items-start gap-2 rounded-md border border-default bg-app-950/40 p-2"
573
573
  data-testid="outcome-requirement"
574
574
  >
575
575
  <span
@@ -578,7 +578,7 @@ function openTestReport() {
578
578
  />
579
579
  <div class="min-w-0">
580
580
  <div class="flex flex-wrap items-center gap-1.5">
581
- <span class="text-[13px] text-slate-200">{{ req.title ?? req.id }}</span>
581
+ <span class="text-[13px] text-default">{{ req.title ?? req.id }}</span>
582
582
  <UBadge
583
583
  v-if="req.regression"
584
584
  color="error"
@@ -588,18 +588,18 @@ function openTestReport() {
588
588
  >
589
589
  {{ t('outcome.requirements.regressionTag') }}
590
590
  </UBadge>
591
- <span class="text-[10px] uppercase tracking-wide text-slate-500">
591
+ <span class="text-[10px] uppercase tracking-wide text-dimmed">
592
592
  {{ t(VERDICT_META[req.verdict].key) }}
593
593
  </span>
594
594
  </div>
595
- <p v-if="req.detail" class="mt-0.5 text-[12px] leading-relaxed text-slate-400">
595
+ <p v-if="req.detail" class="mt-0.5 text-[12px] leading-relaxed text-muted">
596
596
  {{ req.detail }}
597
597
  </p>
598
598
  </div>
599
599
  </li>
600
600
  </ul>
601
601
  </template>
602
- <p v-else class="text-[13px] italic leading-relaxed text-slate-500">
602
+ <p v-else class="text-[13px] italic leading-relaxed text-dimmed">
603
603
  {{ t(REQUIREMENTS_GAP_KEYS[outcome.requirements.gap]) }}
604
604
  </p>
605
605
  </section>
@@ -607,7 +607,7 @@ function openTestReport() {
607
607
  <!-- How it was tested: the tester's own verdict and prose, attributed as its account. -->
608
608
  <section class="mb-5" data-testid="outcome-tests">
609
609
  <div class="mb-1.5 flex flex-wrap items-center gap-2">
610
- <h3 class="text-[11px] font-semibold uppercase tracking-wide text-slate-500">
610
+ <h3 class="text-[11px] font-semibold uppercase tracking-wide text-dimmed">
611
611
  {{ t('outcome.tests.title') }}
612
612
  </h3>
613
613
  <UBadge
@@ -642,15 +642,15 @@ function openTestReport() {
642
642
  <template v-if="outcome.tests.status === 'reported'">
643
643
  <p
644
644
  v-if="outcome.tests.abortReason"
645
- class="mb-2 rounded-md border border-rose-900/70 bg-rose-500/10 p-2 text-[13px] leading-relaxed text-rose-200"
645
+ class="mb-2 rounded-md border border-app-error-900/70 bg-app-error-500/10 p-2 text-[13px] leading-relaxed text-app-error-200"
646
646
  data-testid="outcome-tests-abort"
647
647
  >
648
648
  {{ t('outcome.tests.abort', { reason: outcome.tests.abortReason }) }}
649
649
  </p>
650
- <p v-if="outcome.tests.summary" class="text-[13px] leading-relaxed text-slate-300">
650
+ <p v-if="outcome.tests.summary" class="text-[13px] leading-relaxed text-toned">
651
651
  {{ t('outcome.tests.summary', { summary: outcome.tests.summary }) }}
652
652
  </p>
653
- <p class="mt-1.5 text-[12px] text-slate-400">
653
+ <p class="mt-1.5 text-[12px] text-muted">
654
654
  {{
655
655
  t('outcome.tests.counts', {
656
656
  passed: outcome.tests.passed,
@@ -663,7 +663,7 @@ function openTestReport() {
663
663
  <li
664
664
  v-for="(concern, i) in outcome.tests.concerns"
665
665
  :key="i"
666
- class="flex items-start gap-2 text-[12px] text-slate-300"
666
+ class="flex items-start gap-2 text-[12px] text-toned"
667
667
  data-testid="outcome-concern"
668
668
  >
669
669
  <UBadge :color="SEVERITY_COLOR[concern.severity]" variant="subtle" size="sm">
@@ -673,18 +673,18 @@ function openTestReport() {
673
673
  </li>
674
674
  </ul>
675
675
  </template>
676
- <p v-else class="text-[13px] italic leading-relaxed text-slate-500">
676
+ <p v-else class="text-[13px] italic leading-relaxed text-dimmed">
677
677
  {{ t(TESTS_GAP_KEYS[outcome.tests.gap]) }}
678
678
  </p>
679
679
  </section>
680
680
 
681
681
  <!-- What it looks like: the captured views, and whether a human was asked about them. -->
682
682
  <section class="mb-5" data-testid="outcome-visuals">
683
- <h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
683
+ <h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
684
684
  {{ t('outcome.visuals.title') }}
685
685
  </h3>
686
686
  <template v-if="outcome.visuals.status === 'reported'">
687
- <p class="mb-2 text-[12px] leading-relaxed text-slate-400">
687
+ <p class="mb-2 text-[12px] leading-relaxed text-muted">
688
688
  {{
689
689
  outcome.visuals.source === 'visual_confirm'
690
690
  ? t('outcome.visuals.source.visual_confirm')
@@ -696,7 +696,7 @@ function openTestReport() {
696
696
  v-for="(view, position) in outcome.visuals.views"
697
697
  :key="`${position}:${view.view}`"
698
698
  type="button"
699
- class="group overflow-hidden rounded-md border border-slate-800 bg-slate-950/60 text-start transition hover:border-slate-600"
699
+ class="group overflow-hidden rounded-md border border-default bg-app-950/60 text-start transition hover:border-app-600"
700
700
  :disabled="!view.artifactId"
701
701
  data-testid="outcome-shot"
702
702
  @click="openShot(view, position)"
@@ -707,7 +707,7 @@ function openTestReport() {
707
707
  :alt="t('outcome.visuals.shotAlt', { view: view.view })"
708
708
  class="h-24 w-full object-cover object-top"
709
709
  />
710
- <div v-else class="flex h-24 w-full items-center justify-center text-slate-600">
710
+ <div v-else class="flex h-24 w-full items-center justify-center text-app-600">
711
711
  <UIcon
712
712
  :name="
713
713
  view.artifactId && blobs.statusFor(view.artifactId) === 'error'
@@ -718,13 +718,13 @@ function openTestReport() {
718
718
  />
719
719
  </div>
720
720
  <span
721
- class="flex items-center gap-1 truncate px-1.5 py-1 text-[11px] text-slate-300"
721
+ class="flex items-center gap-1 truncate px-1.5 py-1 text-[11px] text-toned"
722
722
  :title="view.view"
723
723
  >
724
724
  <UIcon
725
725
  v-if="view.referenceArtifactId"
726
726
  name="i-lucide-images"
727
- class="h-3 w-3 shrink-0 text-sky-300"
727
+ class="h-3 w-3 shrink-0 text-app-info-300"
728
728
  :title="t('outcome.visuals.hasReference')"
729
729
  />
730
730
  {{ view.view }}
@@ -733,12 +733,12 @@ function openTestReport() {
733
733
  </div>
734
734
  </template>
735
735
  <template v-else>
736
- <p class="text-[13px] italic leading-relaxed text-slate-500">
736
+ <p class="text-[13px] italic leading-relaxed text-dimmed">
737
737
  {{ t(VISUALS_GAP_KEYS[outcome.visuals.gap]) }}
738
738
  </p>
739
739
  <p
740
740
  v-if="outcome.visuals.detail"
741
- class="mt-1 text-[12px] leading-relaxed text-slate-500"
741
+ class="mt-1 text-[12px] leading-relaxed text-dimmed"
742
742
  data-testid="outcome-visuals-detail"
743
743
  >
744
744
  {{ outcome.visuals.detail }}
@@ -750,14 +750,14 @@ function openTestReport() {
750
750
  not read diffs starts from. Beside the captured views on purpose: the shots are what
751
751
  this run saw, this is the thing itself. -->
752
752
  <section class="mb-5" data-testid="outcome-environments">
753
- <h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
753
+ <h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
754
754
  {{ t('outcome.environments.title') }}
755
755
  </h3>
756
756
  <template v-if="outcome.environments.status === 'reported'">
757
757
  <div
758
758
  v-for="row in environmentRows"
759
759
  :key="row.key"
760
- class="mb-2 rounded-md border border-slate-800 bg-slate-950/40 px-2.5 py-2 last:mb-0"
760
+ class="mb-2 rounded-md border border-default bg-app-950/40 px-2.5 py-2 last:mb-0"
761
761
  data-testid="outcome-environment"
762
762
  :data-state="row.state"
763
763
  >
@@ -765,10 +765,10 @@ function openTestReport() {
765
765
  <UBadge :color="ENVIRONMENT_STATE_COLOR[row.state]" variant="subtle" size="sm">
766
766
  {{ t(ENVIRONMENT_STATE_KEYS[row.state]) }}
767
767
  </UBadge>
768
- <span v-if="row.service" class="truncate text-[12px] text-slate-300">
768
+ <span v-if="row.service" class="truncate text-[12px] text-toned">
769
769
  {{ row.service }}
770
770
  </span>
771
- <span class="text-[11px] text-slate-500">
771
+ <span class="text-[11px] text-dimmed">
772
772
  {{ t(ENVIRONMENT_ORIGIN_KEYS[row.origin]) }}
773
773
  </span>
774
774
  </div>
@@ -789,15 +789,15 @@ function openTestReport() {
789
789
  </UButton>
790
790
  <p
791
791
  v-else-if="row.url"
792
- class="mt-1.5 break-all text-[12px] text-slate-500"
792
+ class="mt-1.5 break-all text-[12px] text-dimmed"
793
793
  data-testid="outcome-environment-url"
794
794
  >
795
795
  {{ row.url }}
796
796
  </p>
797
- <p v-if="row.retained" class="mt-1 text-[11px] text-slate-400">
797
+ <p v-if="row.retained" class="mt-1 text-[11px] text-muted">
798
798
  {{ t('outcome.environments.retained') }}
799
799
  </p>
800
- <p v-if="row.expiresAt" class="mt-1 text-[11px] text-slate-500">
800
+ <p v-if="row.expiresAt" class="mt-1 text-[11px] text-dimmed">
801
801
  {{
802
802
  row.lapsed
803
803
  ? t('outcome.environments.expired', { date: d(new Date(row.expiresAt), 'long') })
@@ -810,7 +810,7 @@ function openTestReport() {
810
810
  otherwise holds "quota exceeded" reports a fault the environment does not have. -->
811
811
  <p
812
812
  v-if="row.detail"
813
- class="mt-1 break-words text-[12px] leading-relaxed text-slate-500"
813
+ class="mt-1 break-words text-[12px] leading-relaxed text-dimmed"
814
814
  data-testid="outcome-environment-detail"
815
815
  :data-detail-kind="row.detailKind"
816
816
  >
@@ -822,14 +822,14 @@ function openTestReport() {
822
822
  </p>
823
823
  </div>
824
824
  </template>
825
- <p v-else class="text-[13px] italic leading-relaxed text-slate-500">
825
+ <p v-else class="text-[13px] italic leading-relaxed text-dimmed">
826
826
  {{ t(ENVIRONMENTS_GAP_KEYS[outcome.environments.gap]) }}
827
827
  </p>
828
828
  </section>
829
829
 
830
830
  <!-- The machine checks, listed only where one actually recorded a verdict. -->
831
831
  <section v-if="checkRows.length" data-testid="outcome-checks">
832
- <h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-slate-500">
832
+ <h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
833
833
  {{ t('outcome.checks.title') }}
834
834
  </h3>
835
835
  <div class="flex flex-wrap items-center gap-1.5">
@@ -57,7 +57,7 @@ function toggle(id: string) {
57
57
 
58
58
  <template>
59
59
  <div class="space-y-2">
60
- <p class="px-1 text-[11px] text-slate-500">{{ t('palette.hint') }}</p>
60
+ <p class="px-1 text-[11px] text-dimmed">{{ t('palette.hint') }}</p>
61
61
  <!-- The two catalog dials, one above the other: what this pipeline is for, and how deep into
62
62
  the agent catalog to look. Both narrow the sections below, and each states its own count.
63
63
  Stacked rather than side by side because the palette column is a third of the slideover:
@@ -75,7 +75,7 @@ function toggle(id: string) {
75
75
  <section v-for="g in groups" :key="g.id">
76
76
  <button
77
77
  type="button"
78
- class="flex w-full items-center gap-1.5 rounded px-1 py-1 text-start text-[11px] font-semibold uppercase tracking-wide text-slate-400 transition hover:text-slate-200"
78
+ class="flex w-full items-center gap-1.5 rounded px-1 py-1 text-start text-[11px] font-semibold uppercase tracking-wide text-muted transition hover:text-default"
79
79
  @click="toggle(g.id)"
80
80
  >
81
81
  <UIcon
@@ -83,29 +83,29 @@ function toggle(id: string) {
83
83
  class="h-3.5 w-3.5 shrink-0"
84
84
  />
85
85
  <span>{{ g.label }}</span>
86
- <span class="ms-auto text-slate-600">{{ g.agents.length }}</span>
86
+ <span class="ms-auto text-app-600">{{ g.agents.length }}</span>
87
87
  </button>
88
88
  <div v-if="!isCollapsed(g.id)" class="mt-1 space-y-1.5">
89
89
  <button
90
90
  v-for="a in g.agents"
91
91
  :key="a.kind"
92
92
  type="button"
93
- class="flex w-full items-center gap-2.5 rounded-lg border border-slate-700 bg-slate-800/60 p-2 text-start transition hover:border-slate-500 hover:bg-slate-800"
93
+ class="flex w-full items-center gap-2.5 rounded-lg border border-muted bg-elevated/60 p-2 text-start transition hover:border-app-500 hover:bg-elevated"
94
94
  :title="a.description"
95
95
  :data-testid="`palette-agent-${a.kind}`"
96
96
  @click="$emit('add', a.kind)"
97
97
  >
98
98
  <div
99
99
  class="flex h-8 w-8 shrink-0 items-center justify-center rounded-lg"
100
- :style="{ backgroundColor: a.color + '22' }"
100
+ :style="{ backgroundColor: tint(a.color) }"
101
101
  >
102
102
  <UIcon :name="a.icon" class="h-4 w-4" :style="{ color: a.color }" />
103
103
  </div>
104
104
  <div class="min-w-0">
105
- <div class="text-xs font-semibold text-slate-100">{{ a.label }}</div>
106
- <div class="truncate text-[10px] text-slate-400">{{ a.description }}</div>
105
+ <div class="text-xs font-semibold text-app-100">{{ a.label }}</div>
106
+ <div class="truncate text-[10px] text-muted">{{ a.description }}</div>
107
107
  </div>
108
- <UIcon name="i-lucide-plus" class="ms-auto h-4 w-4 shrink-0 text-slate-500" />
108
+ <UIcon name="i-lucide-plus" class="ms-auto h-4 w-4 shrink-0 text-dimmed" />
109
109
  </button>
110
110
  </div>
111
111
  </section>
@@ -60,7 +60,7 @@ const items = computed(() => [
60
60
  </span>
61
61
  </UButton>
62
62
  </UDropdownMenu>
63
- <p v-if="props.hiddenCount" class="px-1 text-[10px] text-slate-500">
63
+ <p v-if="props.hiddenCount" class="px-1 text-[10px] text-dimmed">
64
64
  {{ t('agentTier.hidden', { count: props.hiddenCount }, props.hiddenCount) }}
65
65
  </p>
66
66
  </div>
@@ -71,7 +71,7 @@ const items = computed(() => [
71
71
  <span class="truncate"> {{ t('pipeline.builder.purposeLabel') }}: {{ current }} </span>
72
72
  </UButton>
73
73
  </UDropdownMenu>
74
- <p v-if="props.hiddenCount" class="px-1 text-[10px] text-slate-500">
74
+ <p v-if="props.hiddenCount" class="px-1 text-[10px] text-dimmed">
75
75
  {{ t('palette.purposeHidden', { count: props.hiddenCount }, props.hiddenCount) }}
76
76
  </p>
77
77
  </div>