@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
@@ -501,30 +501,30 @@ function exportJson() {
501
501
  <Transition name="obs-fade">
502
502
  <div
503
503
  v-if="open"
504
- class="fixed inset-0 z-[60] flex flex-col bg-slate-950/96 backdrop-blur-sm"
504
+ class="fixed inset-0 z-[60] flex flex-col bg-app-950/96 backdrop-blur-sm"
505
505
  role="dialog"
506
506
  aria-modal="true"
507
507
  >
508
- <header class="flex items-center gap-3 border-b border-slate-800 px-6 py-4">
509
- <div class="flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-sky-500/15">
510
- <UIcon name="i-lucide-activity" class="h-5 w-5 text-sky-400" />
508
+ <header class="flex items-center gap-3 border-b border-default px-6 py-4">
509
+ <div
510
+ class="flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-app-info-500/15"
511
+ >
512
+ <UIcon name="i-lucide-activity" class="h-5 w-5 text-app-info-400" />
511
513
  </div>
512
514
  <div class="min-w-0">
513
- <h1 class="truncate text-base font-semibold text-white">
515
+ <h1 class="truncate text-base font-semibold text-highlighted">
514
516
  {{ t('observability.modelActivity') }}
515
517
  </h1>
516
- <p v-if="block" class="truncate text-xs text-slate-500">
518
+ <p v-if="block" class="truncate text-xs text-dimmed">
517
519
  {{ block.title }} · {{ runSubtitle }}
518
520
  </p>
519
521
  </div>
520
522
  <div class="ms-auto flex items-center gap-1.5">
521
- <div class="me-1 flex rounded-lg border border-slate-800 p-0.5 text-[12px]">
523
+ <div class="me-1 flex rounded-lg border border-default p-0.5 text-[12px]">
522
524
  <button
523
525
  class="rounded-md px-2.5 py-1 transition"
524
526
  :class="
525
- view === 'calls'
526
- ? 'bg-slate-800 text-slate-100'
527
- : 'text-slate-400 hover:text-slate-200'
527
+ view === 'calls' ? 'bg-elevated text-app-100' : 'text-muted hover:text-default'
528
528
  "
529
529
  @click="view = 'calls'"
530
530
  >
@@ -533,9 +533,7 @@ function exportJson() {
533
533
  <button
534
534
  class="rounded-md px-2.5 py-1 transition"
535
535
  :class="
536
- view === 'tools'
537
- ? 'bg-slate-800 text-slate-100'
538
- : 'text-slate-400 hover:text-slate-200'
536
+ view === 'tools' ? 'bg-elevated text-app-100' : 'text-muted hover:text-default'
539
537
  "
540
538
  @click="openToolsView()"
541
539
  >
@@ -544,9 +542,7 @@ function exportJson() {
544
542
  <button
545
543
  class="rounded-md px-2.5 py-1 transition"
546
544
  :class="
547
- view === 'context'
548
- ? 'bg-slate-800 text-slate-100'
549
- : 'text-slate-400 hover:text-slate-200'
545
+ view === 'context' ? 'bg-elevated text-app-100' : 'text-muted hover:text-default'
550
546
  "
551
547
  @click="view = 'context'"
552
548
  >
@@ -555,9 +551,7 @@ function exportJson() {
555
551
  <button
556
552
  class="rounded-md px-2.5 py-1 transition"
557
553
  :class="
558
- view === 'search'
559
- ? 'bg-slate-800 text-slate-100'
560
- : 'text-slate-400 hover:text-slate-200'
554
+ view === 'search' ? 'bg-elevated text-app-100' : 'text-muted hover:text-default'
561
555
  "
562
556
  @click="view = 'search'"
563
557
  >
@@ -602,30 +596,30 @@ function exportJson() {
602
596
  />
603
597
 
604
598
  <!-- run-level summary -->
605
- <section class="rounded-xl border border-slate-800 bg-slate-900/50 p-4">
599
+ <section class="rounded-xl border border-default bg-default/50 p-4">
606
600
  <dl class="grid grid-cols-2 gap-x-6 gap-y-3 text-[13px] sm:grid-cols-4">
607
601
  <div>
608
- <dt class="text-[11px] uppercase tracking-wide text-slate-500">
602
+ <dt class="text-[11px] uppercase tracking-wide text-dimmed">
609
603
  {{ t('observability.summary.calls') }}
610
604
  </dt>
611
- <dd class="mt-0.5 tabular-nums text-slate-200">{{ totals.calls }}</dd>
605
+ <dd class="mt-0.5 tabular-nums text-default">{{ totals.calls }}</dd>
612
606
  </div>
613
607
  <div v-if="showCost || !phaseRollup.available">
614
- <dt class="text-[11px] uppercase tracking-wide text-slate-500">
608
+ <dt class="text-[11px] uppercase tracking-wide text-dimmed">
615
609
  {{ t('observability.summary.cost') }}
616
610
  </dt>
617
- <dd class="mt-0.5 tabular-nums text-slate-200">
611
+ <dd class="mt-0.5 tabular-nums text-default">
618
612
  {{ runCost ?? '—' }}
619
- <span class="mt-0.5 block text-[11px] text-slate-500">
613
+ <span class="mt-0.5 block text-[11px] text-dimmed">
620
614
  {{ t(costNoteKey) }}
621
615
  </span>
622
616
  </dd>
623
617
  </div>
624
618
  <div>
625
- <dt class="text-[11px] uppercase tracking-wide text-slate-500">
619
+ <dt class="text-[11px] uppercase tracking-wide text-dimmed">
626
620
  {{ t('observability.summary.tokensInOut') }}
627
621
  </dt>
628
- <dd class="mt-0.5 tabular-nums text-slate-200">
622
+ <dd class="mt-0.5 tabular-nums text-default">
629
623
  <span :title="t('observability.summary.inputTokensHint')">
630
624
  {{ formatTokens(totals.inputTokens) }} /
631
625
  {{ formatTokens(totals.completionTokens) }}
@@ -634,7 +628,7 @@ function exportJson() {
634
628
  v-if="totals.cacheReadTokens > 0 || totals.cacheWriteTokens > 0"
635
629
  class="mt-0.5 block text-[11px]"
636
630
  >
637
- <span class="text-slate-400" :title="t('observability.summary.freshHint')">
631
+ <span class="text-muted" :title="t('observability.summary.freshHint')">
638
632
  {{
639
633
  t('observability.summary.fresh', {
640
634
  tokens: formatTokens(totals.promptTokens),
@@ -642,9 +636,9 @@ function exportJson() {
642
636
  }}
643
637
  </span>
644
638
  <template v-if="totals.cacheReadTokens > 0">
645
- <span class="text-slate-600"> · </span>
639
+ <span class="text-app-600"> · </span>
646
640
  <span
647
- class="text-emerald-400/80"
641
+ class="text-app-success-400/80"
648
642
  :title="t('observability.summary.cacheReadHint')"
649
643
  >
650
644
  {{
@@ -655,9 +649,9 @@ function exportJson() {
655
649
  </span>
656
650
  </template>
657
651
  <template v-if="totals.cacheWriteTokens > 0">
658
- <span class="text-slate-600"> · </span>
652
+ <span class="text-app-600"> · </span>
659
653
  <span
660
- class="text-amber-400/80"
654
+ class="text-app-warning-400/80"
661
655
  :title="t('observability.summary.cacheWriteHint')"
662
656
  >
663
657
  {{
@@ -671,21 +665,21 @@ function exportJson() {
671
665
  </dd>
672
666
  </div>
673
667
  <div>
674
- <dt class="text-[11px] uppercase tracking-wide text-slate-500">
668
+ <dt class="text-[11px] uppercase tracking-wide text-dimmed">
675
669
  {{ t('observability.summary.transportOverhead') }}
676
670
  </dt>
677
- <dd class="mt-0.5 tabular-nums text-slate-200">
671
+ <dd class="mt-0.5 tabular-nums text-default">
678
672
  <span v-if="totals.transportPct !== null">
679
673
  {{ totals.transportPct }}% · {{ formatMs(totals.overheadMs) }}
680
674
  </span>
681
- <span v-else class="text-slate-500">—</span>
675
+ <span v-else class="text-dimmed">—</span>
682
676
  </dd>
683
677
  </div>
684
678
  <div>
685
- <dt class="text-[11px] uppercase tracking-wide text-slate-500">
679
+ <dt class="text-[11px] uppercase tracking-wide text-dimmed">
686
680
  {{ t('observability.summary.modelExecution') }}
687
681
  </dt>
688
- <dd class="mt-0.5 tabular-nums text-slate-200">
682
+ <dd class="mt-0.5 tabular-nums text-default">
689
683
  {{ formatMs(totals.upstreamMs) }}
690
684
  </dd>
691
685
  </div>
@@ -721,25 +715,25 @@ function exportJson() {
721
715
  capped call list) -->
722
716
  <section
723
717
  v-if="phaseRows.length || !phaseRollup.available"
724
- class="rounded-xl border border-slate-800 bg-slate-900/50 p-4"
718
+ class="rounded-xl border border-default bg-default/50 p-4"
725
719
  >
726
720
  <div class="flex items-baseline gap-2">
727
- <h2 class="text-[11px] uppercase tracking-wide text-slate-500">
721
+ <h2 class="text-[11px] uppercase tracking-wide text-dimmed">
728
722
  {{ t('observability.phase.title') }}
729
723
  </h2>
730
- <span v-if="phaseRollup.available" class="text-[11px] text-slate-600">
724
+ <span v-if="phaseRollup.available" class="text-[11px] text-app-600">
731
725
  {{ t('observability.phase.subtitle') }}
732
726
  </span>
733
727
  </div>
734
728
  <!-- No rollup to fold: said in words, because an absent table and a run that spent
735
729
  nothing look identical, and the calls listed above prove it spent something. -->
736
- <p v-if="!phaseRollup.available" class="mt-2 text-[12px] text-slate-400">
730
+ <p v-if="!phaseRollup.available" class="mt-2 text-[12px] text-muted">
737
731
  {{ t('observability.phase.noRollup') }}
738
732
  </p>
739
733
  <div v-else class="mt-3 overflow-x-auto">
740
734
  <table class="w-full min-w-[32rem] text-[12px]">
741
735
  <thead>
742
- <tr class="text-[11px] uppercase tracking-wide text-slate-500">
736
+ <tr class="text-[11px] uppercase tracking-wide text-dimmed">
743
737
  <th class="py-1 pe-3 text-start font-normal">
744
738
  {{ t('observability.phase.columns.phase') }}
745
739
  </th>
@@ -768,12 +762,12 @@ function exportJson() {
768
762
  </tr>
769
763
  </thead>
770
764
  <tbody>
771
- <tr v-for="p in phaseRows" :key="p.phase" class="border-t border-slate-800/70">
772
- <td class="py-1.5 pe-3 text-slate-200">
773
- <span :class="p.phase ? '' : 'text-slate-400 italic'">
765
+ <tr v-for="p in phaseRows" :key="p.phase" class="border-t border-default/70">
766
+ <td class="py-1.5 pe-3 text-default">
767
+ <span :class="p.phase ? '' : 'text-muted italic'">
774
768
  {{ phaseLabel(p.phase) }}
775
769
  </span>
776
- <span v-if="!p.phase" class="ms-1.5 text-[11px] text-slate-600">
770
+ <span v-if="!p.phase" class="ms-1.5 text-[11px] text-app-600">
777
771
  {{ t('observability.phase.unattributedHint') }}
778
772
  </span>
779
773
  <UBadge
@@ -786,21 +780,21 @@ function exportJson() {
786
780
  {{ t('observability.metricsBar.errors', { count: p.errors }, p.errors) }}
787
781
  </UBadge>
788
782
  </td>
789
- <td class="py-1.5 px-3 text-end tabular-nums text-slate-300">
783
+ <td class="py-1.5 px-3 text-end tabular-nums text-toned">
790
784
  {{ p.calls }}
791
785
  </td>
792
- <td class="py-1.5 px-3 text-end tabular-nums text-slate-300">
786
+ <td class="py-1.5 px-3 text-end tabular-nums text-toned">
793
787
  {{ formatTokens(totalInputTokens(p)) }}↑
794
788
  {{ formatTokens(p.completionTokens) }}↓
795
789
  </td>
796
- <td v-if="showCost" class="py-1.5 px-3 text-end tabular-nums text-slate-300">
790
+ <td v-if="showCost" class="py-1.5 px-3 text-end tabular-nums text-toned">
797
791
  <!-- An em dash, not 0: this phase's model had no rate, and a zero here
798
792
  would read as a phase that cost nothing. -->
799
793
  {{ formatCost(p.costEstimate, costCurrency) ?? '—' }}
800
794
  </td>
801
- <td class="py-1.5 ps-3 text-end tabular-nums text-slate-300">
795
+ <td class="py-1.5 ps-3 text-end tabular-nums text-toned">
802
796
  {{ formatTokens(p.carryCostTokens) }}
803
- <span v-if="carryShare(p.carryCostTokens) !== null" class="text-slate-600">
797
+ <span v-if="carryShare(p.carryCostTokens) !== null" class="text-app-600">
804
798
  · {{ carryShare(p.carryCostTokens) }}%
805
799
  </span>
806
800
  </td>
@@ -813,14 +807,14 @@ function exportJson() {
813
807
  <!-- states -->
814
808
  <p
815
809
  v-if="loading && !calls.length"
816
- class="flex items-center gap-2 py-8 text-center text-sm text-slate-500 justify-center"
810
+ class="flex items-center gap-2 py-8 text-center text-sm text-dimmed justify-center"
817
811
  >
818
812
  <UIcon name="i-lucide-loader-circle" class="h-4 w-4 animate-spin" />
819
813
  {{ t('observability.loadingActivity') }}
820
814
  </p>
821
815
  <div
822
816
  v-else-if="error"
823
- class="flex flex-col items-center gap-3 rounded-lg border border-dashed border-rose-900/60 py-6 text-center text-sm text-rose-400"
817
+ class="flex flex-col items-center gap-3 rounded-lg border border-dashed border-app-error-900/60 py-6 text-center text-sm text-app-error-400"
824
818
  >
825
819
  {{ error }}
826
820
  <UButton
@@ -836,7 +830,7 @@ function exportJson() {
836
830
  </div>
837
831
  <p
838
832
  v-else-if="!calls.length"
839
- class="rounded-lg border border-dashed border-slate-800 py-8 text-center text-sm text-slate-500"
833
+ class="rounded-lg border border-dashed border-default py-8 text-center text-sm text-dimmed"
840
834
  >
841
835
  {{ t('observability.noCalls') }}
842
836
  </p>
@@ -844,7 +838,7 @@ function exportJson() {
844
838
  <!-- per-call list, narrowable by outcome -->
845
839
  <template v-else>
846
840
  <div class="flex flex-wrap items-center justify-between gap-2">
847
- <h2 class="text-[11px] uppercase tracking-wide text-slate-500">
841
+ <h2 class="text-[11px] uppercase tracking-wide text-dimmed">
848
842
  {{ t('observability.callsTitle') }}
849
843
  </h2>
850
844
  <OutcomeFilterChips v-model="callFilter" :options="callFilterOptions" />
@@ -855,7 +849,7 @@ function exportJson() {
855
849
  are none. -->
856
850
  <p
857
851
  v-if="!visibleCalls.length"
858
- class="rounded-lg border border-dashed border-slate-800 py-8 text-center text-sm text-slate-500"
852
+ class="rounded-lg border border-dashed border-default py-8 text-center text-sm text-dimmed"
859
853
  >
860
854
  {{ t('observability.noCallsMatching') }}
861
855
  </p>
@@ -865,16 +859,16 @@ function exportJson() {
865
859
  v-for="c in visibleCalls"
866
860
  :id="callRowId(c.id)"
867
861
  :key="c.id"
868
- class="overflow-hidden rounded-xl border border-slate-800 bg-slate-900/40"
869
- :class="!c.ok ? 'border-rose-900/60' : ''"
862
+ class="overflow-hidden rounded-xl border border-default bg-default/40"
863
+ :class="!c.ok ? 'border-app-error-900/60' : ''"
870
864
  >
871
865
  <button
872
- class="flex w-full items-center gap-3 px-4 py-2.5 text-start transition hover:bg-slate-900/70"
866
+ class="flex w-full items-center gap-3 px-4 py-2.5 text-start transition hover:bg-default/70"
873
867
  @click="toggle(c)"
874
868
  >
875
869
  <UIcon
876
870
  name="i-lucide-chevron-right"
877
- class="h-4 w-4 shrink-0 text-slate-500 transition-transform"
871
+ class="h-4 w-4 shrink-0 text-dimmed transition-transform"
878
872
  :class="expanded[c.id] ? 'rotate-90' : ''"
879
873
  />
880
874
  <UIcon
@@ -882,11 +876,9 @@ function exportJson() {
882
876
  class="h-4 w-4 shrink-0"
883
877
  :style="{ color: agentMeta(c.agentKind).color }"
884
878
  />
885
- <span class="text-[13px] text-slate-200">{{
886
- agentMeta(c.agentKind).label
887
- }}</span>
879
+ <span class="text-[13px] text-default">{{ agentMeta(c.agentKind).label }}</span>
888
880
  <span
889
- class="hidden truncate text-[11px] text-slate-500 sm:inline"
881
+ class="hidden truncate text-[11px] text-dimmed sm:inline"
890
882
  :title="c.model"
891
883
  >
892
884
  {{ c.provider }}:{{ c.model }}
@@ -894,12 +886,12 @@ function exportJson() {
894
886
  reads alike, and an upstream having a bad day cannot be told from the
895
887
  gateway having one. Absent for a direct vendor, where `provider`
896
888
  already names who served the call. -->
897
- <span v-if="c.upstreamProvider" class="text-slate-600">
889
+ <span v-if="c.upstreamProvider" class="text-app-600">
898
890
  {{ t('observability.call.viaUpstream', { upstream: c.upstreamProvider }) }}
899
891
  </span>
900
892
  </span>
901
893
  <div
902
- class="ms-auto flex items-center gap-2.5 text-[11px] tabular-nums text-slate-400"
894
+ class="ms-auto flex items-center gap-2.5 text-[11px] tabular-nums text-muted"
903
895
  >
904
896
  <span
905
897
  :title="
@@ -942,18 +934,18 @@ function exportJson() {
942
934
  >
943
935
  {{ c.finishReason }}
944
936
  </UBadge>
945
- <span v-else class="text-slate-600">{{
937
+ <span v-else class="text-app-600">{{
946
938
  c.finishReason ?? t('observability.call.ok')
947
939
  }}</span>
948
- <span class="hidden text-slate-600 md:inline">{{ clock(c.createdAt) }}</span>
940
+ <span class="hidden text-app-600 md:inline">{{ clock(c.createdAt) }}</span>
949
941
  </div>
950
942
  </button>
951
943
 
952
- <div v-if="expanded[c.id]" class="border-t border-slate-800 px-4 py-3 space-y-3">
953
- <p v-if="c.errorMessage" class="text-[12px] text-rose-400">
944
+ <div v-if="expanded[c.id]" class="border-t border-default px-4 py-3 space-y-3">
945
+ <p v-if="c.errorMessage" class="text-[12px] text-app-error-400">
954
946
  {{ c.errorMessage }}
955
947
  </p>
956
- <div class="flex flex-wrap gap-x-5 gap-y-1 text-[11px] text-slate-500">
948
+ <div class="flex flex-wrap gap-x-5 gap-y-1 text-[11px] text-dimmed">
957
949
  <span>{{ t('observability.call.messages', { count: c.messageCount }) }}</span>
958
950
  <span>{{ t('observability.call.tools', { count: c.toolCount }) }}</span>
959
951
  <span>{{
@@ -967,10 +959,10 @@ function exportJson() {
967
959
  <span v-if="c.cacheReadTokens > 0 || c.cacheWriteTokens > 0">{{
968
960
  t('observability.call.fresh', { tokens: c.promptTokens })
969
961
  }}</span>
970
- <span v-if="c.cacheReadTokens > 0" class="text-emerald-400">{{
962
+ <span v-if="c.cacheReadTokens > 0" class="text-app-success-400">{{
971
963
  t('observability.call.cacheRead', { tokens: c.cacheReadTokens })
972
964
  }}</span>
973
- <span v-if="c.cacheWriteTokens > 0" class="text-amber-400">{{
965
+ <span v-if="c.cacheWriteTokens > 0" class="text-app-warning-400">{{
974
966
  t('observability.call.cacheWrite', { tokens: c.cacheWriteTokens })
975
967
  }}</span>
976
968
  <span>{{
@@ -981,7 +973,7 @@ function exportJson() {
981
973
  is. `!= null` and not truthiness: a reported 0 is a free route saying
982
974
  so, which is a different fact from a producer that reports nothing and
983
975
  must not be hidden as if it were. -->
984
- <span v-if="c.reportedCostUsd != null" class="text-slate-400">
976
+ <span v-if="c.reportedCostUsd != null" class="text-muted">
985
977
  {{
986
978
  t('observability.call.reportedCost', {
987
979
  cost: formatCost(c.reportedCostUsd, 'USD'),
@@ -991,12 +983,12 @@ function exportJson() {
991
983
  </div>
992
984
  <div>
993
985
  <div
994
- class="mb-1 flex items-center gap-2 text-[11px] uppercase tracking-wide text-slate-500"
986
+ class="mb-1 flex items-center gap-2 text-[11px] uppercase tracking-wide text-dimmed"
995
987
  >
996
988
  <span>{{ t('observability.call.prompt') }}</span>
997
989
  <span
998
990
  v-if="c.promptPrefixCount > 0"
999
- class="normal-case tracking-normal text-slate-600"
991
+ class="normal-case tracking-normal text-app-600"
1000
992
  >
1001
993
  {{
1002
994
  t('observability.call.promptPrefixOmitted', {
@@ -1006,23 +998,23 @@ function exportJson() {
1006
998
  </span>
1007
999
  </div>
1008
1000
  <pre
1009
- class="max-h-72 overflow-auto rounded-lg bg-slate-950/70 p-3 text-[11px] leading-relaxed text-slate-300"
1001
+ class="max-h-72 overflow-auto rounded-lg bg-app-950/70 p-3 text-[11px] leading-relaxed text-toned"
1010
1002
  >{{ prettyPrompt(c.promptText) }}</pre>
1011
1003
  </div>
1012
1004
  <div>
1013
- <div class="mb-1 text-[11px] uppercase tracking-wide text-slate-500">
1005
+ <div class="mb-1 text-[11px] uppercase tracking-wide text-dimmed">
1014
1006
  {{ t('observability.call.response') }}
1015
1007
  </div>
1016
1008
  <pre
1017
- class="max-h-72 overflow-auto rounded-lg bg-slate-950/70 p-3 text-[11px] leading-relaxed text-slate-300"
1009
+ class="max-h-72 overflow-auto rounded-lg bg-app-950/70 p-3 text-[11px] leading-relaxed text-toned"
1018
1010
  >{{ c.responseText || '—' }}</pre>
1019
1011
  </div>
1020
1012
  <div v-if="c.reasoningText">
1021
- <div class="mb-1 text-[11px] uppercase tracking-wide text-slate-500">
1013
+ <div class="mb-1 text-[11px] uppercase tracking-wide text-dimmed">
1022
1014
  {{ t('observability.call.reasoning') }}
1023
1015
  </div>
1024
1016
  <pre
1025
- class="max-h-72 overflow-auto rounded-lg bg-slate-950/70 p-3 text-[11px] leading-relaxed text-slate-400"
1017
+ class="max-h-72 overflow-auto rounded-lg bg-app-950/70 p-3 text-[11px] leading-relaxed text-muted"
1026
1018
  >{{ c.reasoningText }}</pre>
1027
1019
  </div>
1028
1020
  </div>
@@ -1047,7 +1039,7 @@ function exportJson() {
1047
1039
  so the survey's absence would otherwise read as a phase that used no tools. -->
1048
1040
  <p
1049
1041
  v-if="bootstrap?.monorepo"
1050
- class="rounded-lg border border-dashed border-slate-800 px-3 py-2 text-[12px] text-slate-400"
1042
+ class="rounded-lg border border-dashed border-default px-3 py-2 text-[12px] text-muted"
1051
1043
  >
1052
1044
  {{ t('observability.toolCalls.surveyReadsElsewhere') }}
1053
1045
  </p>
@@ -1068,14 +1060,14 @@ function exportJson() {
1068
1060
  <div v-else-if="view === 'context'" class="mx-auto max-w-4xl space-y-5">
1069
1061
  <p
1070
1062
  v-if="contextLoading && !contextSnapshots.length"
1071
- class="flex items-center justify-center gap-2 py-8 text-center text-sm text-slate-500"
1063
+ class="flex items-center justify-center gap-2 py-8 text-center text-sm text-dimmed"
1072
1064
  >
1073
1065
  <UIcon name="i-lucide-loader-circle" class="h-4 w-4 animate-spin" />
1074
1066
  {{ t('observability.loadingContext') }}
1075
1067
  </p>
1076
1068
  <div
1077
1069
  v-else-if="contextError && !contextSnapshots.length"
1078
- class="flex flex-col items-center gap-3 rounded-lg border border-dashed border-rose-900/60 py-8 text-center text-sm text-rose-400"
1070
+ class="flex flex-col items-center gap-3 rounded-lg border border-dashed border-app-error-900/60 py-8 text-center text-sm text-app-error-400"
1079
1071
  >
1080
1072
  {{ t('observability.contextError') }}
1081
1073
  <UButton
@@ -1091,7 +1083,7 @@ function exportJson() {
1091
1083
  </div>
1092
1084
  <p
1093
1085
  v-else-if="!contextSnapshots.length"
1094
- class="rounded-lg border border-dashed border-slate-800 py-8 text-center text-sm text-slate-500"
1086
+ class="rounded-lg border border-dashed border-default py-8 text-center text-sm text-dimmed"
1095
1087
  >
1096
1088
  {{ t('observability.noContext') }}
1097
1089
  </p>
@@ -1100,15 +1092,15 @@ function exportJson() {
1100
1092
  <li
1101
1093
  v-for="s in contextSnapshots"
1102
1094
  :key="s.id"
1103
- class="overflow-hidden rounded-xl border border-slate-800 bg-slate-900/40"
1095
+ class="overflow-hidden rounded-xl border border-default bg-default/40"
1104
1096
  >
1105
1097
  <button
1106
- class="flex w-full items-center gap-3 px-4 py-2.5 text-start transition hover:bg-slate-900/70"
1098
+ class="flex w-full items-center gap-3 px-4 py-2.5 text-start transition hover:bg-default/70"
1107
1099
  @click="toggleCtx(s)"
1108
1100
  >
1109
1101
  <UIcon
1110
1102
  name="i-lucide-chevron-right"
1111
- class="h-4 w-4 shrink-0 text-slate-500 transition-transform"
1103
+ class="h-4 w-4 shrink-0 text-dimmed transition-transform"
1112
1104
  :class="expandedCtx[s.id] ? 'rotate-90' : ''"
1113
1105
  />
1114
1106
  <UIcon
@@ -1116,12 +1108,12 @@ function exportJson() {
1116
1108
  class="h-4 w-4 shrink-0"
1117
1109
  :style="{ color: agentMeta(s.agentKind).color }"
1118
1110
  />
1119
- <span class="text-[13px] text-slate-200">{{ agentMeta(s.agentKind).label }}</span>
1120
- <span v-if="s.model" class="hidden truncate text-[11px] text-slate-500 sm:inline">
1111
+ <span class="text-[13px] text-default">{{ agentMeta(s.agentKind).label }}</span>
1112
+ <span v-if="s.model" class="hidden truncate text-[11px] text-dimmed sm:inline">
1121
1113
  {{ s.model }}
1122
1114
  </span>
1123
1115
  <div
1124
- class="ms-auto flex items-center gap-2.5 text-[11px] tabular-nums text-slate-400"
1116
+ class="ms-auto flex items-center gap-2.5 text-[11px] tabular-nums text-muted"
1125
1117
  >
1126
1118
  <span :title="t('observability.context.injectedFiles')">{{
1127
1119
  t('observability.context.filesCount', { count: s.contextFiles.length })
@@ -1129,66 +1121,66 @@ function exportJson() {
1129
1121
  <span :title="t('observability.context.bestPracticeFragments')">{{
1130
1122
  t('observability.context.fragmentsCount', { count: s.fragments.length })
1131
1123
  }}</span>
1132
- <span class="hidden text-slate-600 md:inline">{{ clock(s.createdAt) }}</span>
1124
+ <span class="hidden text-app-600 md:inline">{{ clock(s.createdAt) }}</span>
1133
1125
  </div>
1134
1126
  </button>
1135
1127
 
1136
- <div v-if="expandedCtx[s.id]" class="border-t border-slate-800 px-4 py-3 space-y-3">
1128
+ <div v-if="expandedCtx[s.id]" class="border-t border-default px-4 py-3 space-y-3">
1137
1129
  <div>
1138
- <div class="mb-1 text-[11px] uppercase tracking-wide text-slate-500">
1130
+ <div class="mb-1 text-[11px] uppercase tracking-wide text-dimmed">
1139
1131
  {{ t('observability.context.systemPrompt') }}
1140
1132
  </div>
1141
1133
  <pre
1142
- class="max-h-72 overflow-auto rounded-lg bg-slate-950/70 p-3 text-[11px] leading-relaxed text-slate-300"
1134
+ class="max-h-72 overflow-auto rounded-lg bg-app-950/70 p-3 text-[11px] leading-relaxed text-toned"
1143
1135
  >{{ s.systemPrompt || '—' }}</pre>
1144
1136
  </div>
1145
1137
  <div>
1146
- <div class="mb-1 text-[11px] uppercase tracking-wide text-slate-500">
1138
+ <div class="mb-1 text-[11px] uppercase tracking-wide text-dimmed">
1147
1139
  {{ t('observability.context.userPrompt') }}
1148
1140
  </div>
1149
1141
  <pre
1150
- class="max-h-72 overflow-auto rounded-lg bg-slate-950/70 p-3 text-[11px] leading-relaxed text-slate-300"
1142
+ class="max-h-72 overflow-auto rounded-lg bg-app-950/70 p-3 text-[11px] leading-relaxed text-toned"
1151
1143
  >{{ s.userPrompt || '—' }}</pre>
1152
1144
  </div>
1153
1145
  <div v-if="s.fragments.length">
1154
- <div class="mb-1 text-[11px] uppercase tracking-wide text-slate-500">
1146
+ <div class="mb-1 text-[11px] uppercase tracking-wide text-dimmed">
1155
1147
  {{ t('observability.context.bestPracticeFragments') }}
1156
1148
  </div>
1157
1149
  <div
1158
1150
  v-for="f in s.fragments"
1159
1151
  :key="f.id"
1160
- class="mb-2 rounded-lg bg-slate-950/70 p-3"
1152
+ class="mb-2 rounded-lg bg-app-950/70 p-3"
1161
1153
  >
1162
- <div class="mb-1 text-[11px] text-slate-400">{{ f.id }}</div>
1163
- <pre
1164
- class="max-h-48 overflow-auto text-[11px] leading-relaxed text-slate-300"
1165
- >{{ f.body }}</pre>
1154
+ <div class="mb-1 text-[11px] text-muted">{{ f.id }}</div>
1155
+ <pre class="max-h-48 overflow-auto text-[11px] leading-relaxed text-toned">{{
1156
+ f.body
1157
+ }}</pre>
1166
1158
  </div>
1167
1159
  </div>
1168
1160
  <div v-if="s.contextFiles.length">
1169
- <div class="mb-1 text-[11px] uppercase tracking-wide text-slate-500">
1161
+ <div class="mb-1 text-[11px] uppercase tracking-wide text-dimmed">
1170
1162
  {{ t('observability.context.injectedFiles') }}
1171
1163
  </div>
1172
1164
  <div
1173
1165
  v-for="file in s.contextFiles"
1174
1166
  :key="file.path"
1175
- class="mb-2 rounded-lg bg-slate-950/70 p-3"
1167
+ class="mb-2 rounded-lg bg-app-950/70 p-3"
1176
1168
  >
1177
- <div class="mb-1 text-[11px] text-slate-400">
1169
+ <div class="mb-1 text-[11px] text-muted">
1178
1170
  {{ file.title }}
1179
- <span class="text-slate-600">· {{ file.path }}</span>
1171
+ <span class="text-app-600">· {{ file.path }}</span>
1180
1172
  </div>
1181
- <pre
1182
- class="max-h-72 overflow-auto text-[11px] leading-relaxed text-slate-300"
1183
- >{{ file.content }}</pre>
1173
+ <pre class="max-h-72 overflow-auto text-[11px] leading-relaxed text-toned">{{
1174
+ file.content
1175
+ }}</pre>
1184
1176
  </div>
1185
1177
  </div>
1186
1178
  <div>
1187
- <div class="mb-1 text-[11px] uppercase tracking-wide text-slate-500">
1179
+ <div class="mb-1 text-[11px] uppercase tracking-wide text-dimmed">
1188
1180
  {{ t('observability.context.details') }}
1189
1181
  </div>
1190
1182
  <pre
1191
- class="max-h-48 overflow-auto rounded-lg bg-slate-950/70 p-3 text-[11px] leading-relaxed text-slate-400"
1183
+ class="max-h-48 overflow-auto rounded-lg bg-app-950/70 p-3 text-[11px] leading-relaxed text-muted"
1192
1184
  >{{ prettyExtras(s.extras) }}</pre>
1193
1185
  </div>
1194
1186
  </div>
@@ -1200,14 +1192,14 @@ function exportJson() {
1200
1192
  <!-- Availability header: a static per-run fact (not telemetry-gated). -->
1201
1193
  <section
1202
1194
  v-if="searchAvailability"
1203
- class="flex flex-wrap items-center gap-x-3 gap-y-1 rounded-xl border border-slate-800 bg-slate-900/50 px-4 py-3 text-[13px]"
1195
+ class="flex flex-wrap items-center gap-x-3 gap-y-1 rounded-xl border border-default bg-default/50 px-4 py-3 text-[13px]"
1204
1196
  >
1205
- <span class="text-[11px] uppercase tracking-wide text-slate-500">
1197
+ <span class="text-[11px] uppercase tracking-wide text-dimmed">
1206
1198
  {{ t('observability.webSearch') }}
1207
1199
  </span>
1208
1200
  <span
1209
1201
  class="inline-flex items-center gap-1.5"
1210
- :class="searchAvailability.available ? 'text-emerald-300' : 'text-slate-400'"
1202
+ :class="searchAvailability.available ? 'text-app-success-300' : 'text-muted'"
1211
1203
  >
1212
1204
  <UIcon
1213
1205
  :name="searchAvailability.available ? 'i-lucide-globe' : 'i-lucide-globe-lock'"
@@ -1219,7 +1211,7 @@ function exportJson() {
1219
1211
  : t('observability.search.unavailable')
1220
1212
  }}
1221
1213
  </span>
1222
- <span v-if="searchAvailability.providers.length" class="text-slate-400 tabular-nums">
1214
+ <span v-if="searchAvailability.providers.length" class="text-muted tabular-nums">
1223
1215
  {{ t('observability.search.provider') }}:
1224
1216
  {{ searchAvailability.providers.map(providerLabel).join(', ') }}
1225
1217
  </span>
@@ -1227,27 +1219,27 @@ function exportJson() {
1227
1219
 
1228
1220
  <p
1229
1221
  v-if="searchLoading && !searchQueries.length"
1230
- class="flex items-center justify-center gap-2 py-8 text-center text-sm text-slate-500"
1222
+ class="flex items-center justify-center gap-2 py-8 text-center text-sm text-dimmed"
1231
1223
  >
1232
1224
  <UIcon name="i-lucide-loader-circle" class="h-4 w-4 animate-spin" />
1233
1225
  {{ t('observability.loadingSearch') }}
1234
1226
  </p>
1235
1227
  <p
1236
1228
  v-else-if="!searchQueries.length"
1237
- class="rounded-lg border border-dashed border-slate-800 py-8 text-center text-sm text-slate-500"
1229
+ class="rounded-lg border border-dashed border-default py-8 text-center text-sm text-dimmed"
1238
1230
  >
1239
1231
  {{ t('observability.noSearch') }}
1240
1232
  </p>
1241
1233
 
1242
1234
  <div v-else>
1243
- <div class="mb-2 text-[11px] uppercase tracking-wide text-slate-500">
1235
+ <div class="mb-2 text-[11px] uppercase tracking-wide text-dimmed">
1244
1236
  {{ t('observability.search.queriesTitle') }}
1245
1237
  </div>
1246
1238
  <ul class="space-y-2">
1247
1239
  <li
1248
1240
  v-for="q in searchQueries"
1249
1241
  :key="q.id"
1250
- class="flex items-center gap-3 rounded-xl border border-slate-800 bg-slate-900/40 px-4 py-2.5"
1242
+ class="flex items-center gap-3 rounded-xl border border-default bg-default/40 px-4 py-2.5"
1251
1243
  >
1252
1244
  <UIcon
1253
1245
  :name="agentMeta(q.agentKind).icon"
@@ -1255,11 +1247,11 @@ function exportJson() {
1255
1247
  :style="{ color: agentMeta(q.agentKind).color }"
1256
1248
  :title="agentMeta(q.agentKind).label"
1257
1249
  />
1258
- <span class="min-w-0 flex-1 truncate text-[13px] text-slate-200" :title="q.query">
1250
+ <span class="min-w-0 flex-1 truncate text-[13px] text-default" :title="q.query">
1259
1251
  {{ q.query }}
1260
1252
  </span>
1261
1253
  <div
1262
- class="flex shrink-0 items-center gap-2.5 text-[11px] tabular-nums text-slate-400"
1254
+ class="flex shrink-0 items-center gap-2.5 text-[11px] tabular-nums text-muted"
1263
1255
  >
1264
1256
  <span v-if="q.provider" class="hidden sm:inline">{{
1265
1257
  providerLabel(q.provider)
@@ -1271,7 +1263,7 @@ function exportJson() {
1271
1263
  q.resultCount,
1272
1264
  )
1273
1265
  }}</span>
1274
- <span class="hidden text-slate-600 md:inline">{{ clock(q.createdAt) }}</span>
1266
+ <span class="hidden text-app-600 md:inline">{{ clock(q.createdAt) }}</span>
1275
1267
  </div>
1276
1268
  </li>
1277
1269
  </ul>