@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
@@ -15,16 +15,16 @@ const emit = defineEmits<{ 'update:modelValue': [value: T] }>()
15
15
 
16
16
  /** Colour a chip by what it selects, so the failing one reads as failing even unselected. */
17
17
  function toneClass(option: (typeof props.options)[number], active: boolean): string {
18
- if (active) return 'bg-slate-800 text-slate-100'
19
- if (option.count === 0) return 'text-slate-600 hover:text-slate-400'
20
- if (option.tone === 'error') return 'text-rose-400 hover:text-rose-300'
21
- if (option.tone === 'warning') return 'text-amber-400 hover:text-amber-300'
22
- return 'text-slate-400 hover:text-slate-200'
18
+ if (active) return 'bg-elevated text-app-100'
19
+ if (option.count === 0) return 'text-app-600 hover:text-muted'
20
+ if (option.tone === 'error') return 'text-app-error-400 hover:text-app-error-300'
21
+ if (option.tone === 'warning') return 'text-app-warning-400 hover:text-app-warning-300'
22
+ return 'text-muted hover:text-default'
23
23
  }
24
24
  </script>
25
25
 
26
26
  <template>
27
- <div class="flex rounded-lg border border-slate-800 p-0.5 text-[12px]">
27
+ <div class="flex rounded-lg border border-default p-0.5 text-[12px]">
28
28
  <button
29
29
  v-for="option in options"
30
30
  :key="option.value"
@@ -82,19 +82,19 @@ const earlierFailedToolCalls = computed(() =>
82
82
  </script>
83
83
 
84
84
  <template>
85
- <section class="rounded-xl border border-rose-900/60 bg-rose-950/20 p-4">
85
+ <section class="rounded-xl border border-app-error-900/60 bg-app-error-950/20 p-4">
86
86
  <div class="flex items-start gap-3">
87
- <UIcon name="i-lucide-siren" class="mt-0.5 h-5 w-5 shrink-0 text-rose-400" />
87
+ <UIcon name="i-lucide-siren" class="mt-0.5 h-5 w-5 shrink-0 text-app-error-400" />
88
88
  <div class="min-w-0 flex-1">
89
- <h2 class="text-[13px] font-semibold text-rose-200">
89
+ <h2 class="text-[13px] font-semibold text-app-error-200">
90
90
  {{ t('observability.failure.title') }}
91
91
  </h2>
92
92
 
93
93
  <!-- The run's own structured record. Absent on a run that is still going, or that
94
94
  failed without one; the evidence below stands on its own either way. -->
95
95
  <template v-if="evidence.failure">
96
- <p class="mt-1 text-[13px] text-slate-200">{{ evidence.failure.message }}</p>
97
- <div class="mt-1 flex flex-wrap gap-x-3 gap-y-0.5 text-[11px] text-slate-500">
96
+ <p class="mt-1 text-[13px] text-default">{{ evidence.failure.message }}</p>
97
+ <div class="mt-1 flex flex-wrap gap-x-3 gap-y-0.5 text-[11px] text-dimmed">
98
98
  <span>{{ t('observability.failure.kind', { kind: failureKindLabel }) }}</span>
99
99
  <span v-if="evidence.failure.stepIndex != null">
100
100
  {{ t('observability.failure.atStep', { index: evidence.failure.stepIndex + 1 }) }}
@@ -108,10 +108,10 @@ const earlierFailedToolCalls = computed(() =>
108
108
  <FailureDetail
109
109
  :detail="evidence.failure.detail"
110
110
  :message="evidence.failure.message"
111
- summary-class="text-[11px] text-slate-500 hover:text-slate-300"
112
- pre-class="bg-slate-950/60 text-[11px] text-slate-400"
111
+ summary-class="text-[11px] text-dimmed hover:text-toned"
112
+ pre-class="bg-app-950/60 text-[11px] text-muted"
113
113
  />
114
- <p v-if="evidence.failure.hint" class="mt-1.5 text-[12px] text-slate-300">
114
+ <p v-if="evidence.failure.hint" class="mt-1.5 text-[12px] text-toned">
115
115
  {{ evidence.failure.hint }}
116
116
  </p>
117
117
  </template>
@@ -124,7 +124,7 @@ const earlierFailedToolCalls = computed(() =>
124
124
  <button
125
125
  v-if="evidence.lastErroredCall"
126
126
  type="button"
127
- class="flex w-full items-start gap-3 rounded-lg border border-rose-900/50 bg-slate-950/50 px-3 py-2 text-start transition hover:bg-slate-900/70"
127
+ class="flex w-full items-start gap-3 rounded-lg border border-app-error-900/50 bg-app-950/50 px-3 py-2 text-start transition hover:bg-default/70"
128
128
  @click="emit('showCall', evidence.lastErroredCall.id)"
129
129
  >
130
130
  <UIcon
@@ -134,10 +134,10 @@ const earlierFailedToolCalls = computed(() =>
134
134
  />
135
135
  <div class="min-w-0 flex-1">
136
136
  <div class="flex flex-wrap items-baseline gap-x-2 text-[12px]">
137
- <span class="font-medium text-slate-200">
137
+ <span class="font-medium text-default">
138
138
  {{ t('observability.failure.lastErroredCall') }}
139
139
  </span>
140
- <span class="text-slate-500">
140
+ <span class="text-dimmed">
141
141
  {{ agentMeta(evidence.lastErroredCall.agentKind).label }} ·
142
142
  {{ evidence.lastErroredCall.provider }}:{{ evidence.lastErroredCall.model }}
143
143
  </span>
@@ -145,10 +145,13 @@ const earlierFailedToolCalls = computed(() =>
145
145
  {{ evidence.lastErroredCall.httpStatus ?? t('observability.call.error') }}
146
146
  </UBadge>
147
147
  </div>
148
- <p v-if="evidence.lastErroredCall.errorMessage" class="mt-0.5 text-[12px] text-rose-300">
148
+ <p
149
+ v-if="evidence.lastErroredCall.errorMessage"
150
+ class="mt-0.5 text-[12px] text-app-error-300"
151
+ >
149
152
  {{ evidence.lastErroredCall.errorMessage }}
150
153
  </p>
151
- <p v-if="evidence.erroredCallCount > 1" class="mt-0.5 text-[11px] text-slate-500">
154
+ <p v-if="evidence.erroredCallCount > 1" class="mt-0.5 text-[11px] text-dimmed">
152
155
  {{
153
156
  t(
154
157
  'observability.failure.moreErroredCalls',
@@ -158,20 +161,20 @@ const earlierFailedToolCalls = computed(() =>
158
161
  }}
159
162
  </p>
160
163
  </div>
161
- <UIcon name="i-lucide-chevron-right" class="mt-0.5 h-4 w-4 shrink-0 text-slate-600" />
164
+ <UIcon name="i-lucide-chevron-right" class="mt-0.5 h-4 w-4 shrink-0 text-app-600" />
162
165
  </button>
163
166
 
164
167
  <!-- Last TOOL call that failed: the row no rollup counts. -->
165
168
  <button
166
169
  v-if="evidence.lastFailedToolCall"
167
170
  type="button"
168
- class="flex w-full items-start gap-3 rounded-lg border border-rose-900/50 bg-slate-950/50 px-3 py-2 text-start transition hover:bg-slate-900/70"
171
+ class="flex w-full items-start gap-3 rounded-lg border border-app-error-900/50 bg-app-950/50 px-3 py-2 text-start transition hover:bg-default/70"
169
172
  @click="emit('showFailingTools')"
170
173
  >
171
- <UIcon name="i-lucide-wrench" class="mt-0.5 h-4 w-4 shrink-0 text-rose-400" />
174
+ <UIcon name="i-lucide-wrench" class="mt-0.5 h-4 w-4 shrink-0 text-app-error-400" />
172
175
  <div class="min-w-0 flex-1">
173
176
  <div class="flex flex-wrap items-baseline gap-x-2 text-[12px]">
174
- <span class="font-medium text-slate-200">
177
+ <span class="font-medium text-default">
175
178
  <!-- "One of the failing calls" when even the failures were bounded: the row is
176
179
  real either way, but calling it the LAST would be a claim about rows this
177
180
  read never saw. -->
@@ -181,23 +184,23 @@ const earlierFailedToolCalls = computed(() =>
181
184
  : t('observability.failure.lastFailedToolCall')
182
185
  }}
183
186
  </span>
184
- <span class="font-mono text-slate-300">{{ evidence.lastFailedToolCall.tool }}</span>
185
- <span class="text-slate-500">
187
+ <span class="font-mono text-toned">{{ evidence.lastFailedToolCall.tool }}</span>
188
+ <span class="text-dimmed">
186
189
  {{ agentMeta(evidence.lastFailedToolCall.agentKind).label }}
187
190
  </span>
188
191
  </div>
189
192
  <pre
190
193
  v-if="failedToolResult"
191
- class="mt-1 max-h-32 overflow-auto whitespace-pre-wrap text-[11px] leading-relaxed text-rose-300"
194
+ class="mt-1 max-h-32 overflow-auto whitespace-pre-wrap text-[11px] leading-relaxed text-app-error-300"
192
195
  >{{ failedToolResult }}</pre>
193
- <p v-else class="mt-0.5 text-[11px] italic text-slate-500">
196
+ <p v-else class="mt-0.5 text-[11px] italic text-dimmed">
194
197
  {{
195
198
  evidence.lastFailedToolCall.bodies === 'stored'
196
199
  ? t('observability.failure.toolReturnedNothing')
197
200
  : t('observability.failure.toolBodiesWithheld')
198
201
  }}
199
202
  </p>
200
- <p v-if="earlierFailedToolCalls" class="mt-0.5 text-[11px] text-slate-500">
203
+ <p v-if="earlierFailedToolCalls" class="mt-0.5 text-[11px] text-dimmed">
201
204
  {{
202
205
  t(
203
206
  'observability.failure.moreFailedToolCalls',
@@ -207,7 +210,7 @@ const earlierFailedToolCalls = computed(() =>
207
210
  }}
208
211
  </p>
209
212
  </div>
210
- <UIcon name="i-lucide-chevron-right" class="mt-0.5 h-4 w-4 shrink-0 text-slate-600" />
213
+ <UIcon name="i-lucide-chevron-right" class="mt-0.5 h-4 w-4 shrink-0 text-app-600" />
211
214
  </button>
212
215
 
213
216
  <!-- Nothing failing to point at. Which of the reasons it is decides what an operator should
@@ -220,8 +223,8 @@ const earlierFailedToolCalls = computed(() =>
220
223
  class="flex flex-wrap items-center justify-between gap-2 rounded-lg border border-dashed px-3 py-2 text-[12px]"
221
224
  :class="
222
225
  emptyReason === 'sink-unreachable'
223
- ? 'border-amber-900/60 text-amber-300'
224
- : 'border-slate-800 text-slate-400'
226
+ ? 'border-app-warning-900/60 text-app-warning-300'
227
+ : 'border-default text-muted'
225
228
  "
226
229
  >
227
230
  <span>{{ t(`observability.failure.noFailingCall.${emptyReason}`) }}</span>
@@ -57,31 +57,29 @@ const headroomTone = computed(() => headroomColor(headroom.value, m.value.trunca
57
57
  <template>
58
58
  <div
59
59
  v-if="m.calls > 0"
60
- class="rounded-lg border border-slate-800 bg-slate-900/40 p-2.5 text-[12px]"
61
- :class="
62
- clickable ? 'cursor-pointer transition hover:border-slate-700 hover:bg-slate-900/70' : ''
63
- "
60
+ class="rounded-lg border border-default bg-default/40 p-2.5 text-[12px]"
61
+ :class="clickable ? 'cursor-pointer transition hover:border-muted hover:bg-default/70' : ''"
64
62
  :role="clickable ? 'button' : undefined"
65
63
  @click="clickable ? $emit('inspect') : undefined"
66
64
  >
67
65
  <!-- header line: call count + tokens + warning/error badges -->
68
66
  <div class="flex items-center gap-2">
69
- <UIcon name="i-lucide-activity" class="h-3.5 w-3.5 shrink-0 text-slate-500" />
70
- <span class="text-slate-300">
67
+ <UIcon name="i-lucide-activity" class="h-3.5 w-3.5 shrink-0 text-dimmed" />
68
+ <span class="text-toned">
71
69
  {{ t('observability.metricsBar.calls', { count: m.calls }, m.calls) }}
72
70
  </span>
73
- <span class="text-slate-500">·</span>
71
+ <span class="text-dimmed">·</span>
74
72
  <span
75
- class="tabular-nums text-slate-400"
73
+ class="tabular-nums text-muted"
76
74
  :title="t('observability.metricsBar.inputCompletionTokens')"
77
75
  >
78
76
  {{ formatTokens(totalInput) }}↑ {{ formatTokens(m.completionTokens) }}↓
79
77
  </span>
80
78
  <template v-if="cost">
81
- <span class="text-slate-500">·</span>
79
+ <span class="text-dimmed">·</span>
82
80
  <span
83
81
  class="tabular-nums"
84
- :class="onSubscription ? 'text-slate-500' : 'text-slate-300'"
82
+ :class="onSubscription ? 'text-dimmed' : 'text-toned'"
85
83
  :title="
86
84
  onSubscription
87
85
  ? t('observability.metricsBar.subscriptionCostHint')
@@ -92,7 +90,7 @@ const headroomTone = computed(() => headroomColor(headroom.value, m.value.trunca
92
90
  </span>
93
91
  <span
94
92
  v-if="onSubscription"
95
- class="text-[10px] uppercase tracking-wide text-slate-500"
93
+ class="text-[10px] uppercase tracking-wide text-dimmed"
96
94
  :title="t('observability.metricsBar.subscriptionCostHint')"
97
95
  >
98
96
  {{ t('observability.metricsBar.subscription') }}
@@ -108,28 +106,28 @@ const headroomTone = computed(() => headroomColor(headroom.value, m.value.trunca
108
106
  <UIcon
109
107
  v-if="clickable"
110
108
  name="i-lucide-chevron-right"
111
- class="h-3.5 w-3.5 text-slate-600 rtl:-scale-x-100"
109
+ class="h-3.5 w-3.5 text-app-600 rtl:-scale-x-100"
112
110
  />
113
111
  </div>
114
112
  </div>
115
113
 
116
114
  <!-- input breakdown: the headline's three classes, priced an order of magnitude apart -->
117
115
  <div v-if="hasCache" class="mt-1.5 flex items-center gap-1.5 text-[11px] tabular-nums">
118
- <span class="text-slate-400" :title="t('observability.metricsBar.freshHint')">
116
+ <span class="text-muted" :title="t('observability.metricsBar.freshHint')">
119
117
  {{ t('observability.metricsBar.fresh', { tokens: formatTokens(m.promptTokens) }) }}
120
118
  </span>
121
- <span v-if="cacheRead > 0" class="text-slate-600">·</span>
119
+ <span v-if="cacheRead > 0" class="text-app-600">·</span>
122
120
  <span
123
121
  v-if="cacheRead > 0"
124
- class="text-emerald-400/80"
122
+ class="text-app-success-400/80"
125
123
  :title="t('observability.metricsBar.cacheReadHint')"
126
124
  >
127
125
  {{ t('observability.metricsBar.cacheRead', { tokens: formatTokens(cacheRead) }) }}
128
126
  </span>
129
- <span v-if="cacheWrite > 0" class="text-slate-600">·</span>
127
+ <span v-if="cacheWrite > 0" class="text-app-600">·</span>
130
128
  <span
131
129
  v-if="cacheWrite > 0"
132
- class="text-amber-400/80"
130
+ class="text-app-warning-400/80"
133
131
  :title="t('observability.metricsBar.cacheWriteHint')"
134
132
  >
135
133
  {{ t('observability.metricsBar.cacheWrite', { tokens: formatTokens(cacheWrite) }) }}
@@ -139,26 +137,26 @@ const headroomTone = computed(() => headroomColor(headroom.value, m.value.trunca
139
137
  <!-- output-limit headroom -->
140
138
  <div v-if="headroom !== null" class="mt-2">
141
139
  <div class="flex items-center justify-between text-[11px]">
142
- <span class="text-slate-500">{{ t('observability.metricsBar.outputLimit') }}</span>
140
+ <span class="text-dimmed">{{ t('observability.metricsBar.outputLimit') }}</span>
143
141
  <span class="tabular-nums" :class="headroomTone">
144
142
  {{ formatTokens(m.peakCompletionTokens) }} /
145
143
  {{ formatTokens(m.maxOutputTokens ?? 0) }} ({{ pct(headroom) }}%)
146
144
  </span>
147
145
  </div>
148
- <div class="mt-1 h-1 overflow-hidden rounded-full bg-slate-700/60">
146
+ <div class="mt-1 h-1 overflow-hidden rounded-full bg-accented/60">
149
147
  <div
150
148
  class="h-full rounded-full transition-all duration-500"
151
149
  :class="
152
150
  m.truncatedCalls > 0 || headroom >= 0.98
153
- ? 'bg-rose-400'
151
+ ? 'bg-app-error-400'
154
152
  : headroom >= 0.8
155
- ? 'bg-amber-400'
156
- : 'bg-emerald-400'
153
+ ? 'bg-app-warning-400'
154
+ : 'bg-app-success-400'
157
155
  "
158
156
  :style="{ width: `${Math.max(2, pct(headroom))}%` }"
159
157
  />
160
158
  </div>
161
- <p v-if="m.truncatedCalls > 0" class="mt-1 text-[11px] text-rose-400">
159
+ <p v-if="m.truncatedCalls > 0" class="mt-1 text-[11px] text-app-error-400">
162
160
  {{
163
161
  t(
164
162
  'observability.metricsBar.truncatedCalls',
@@ -172,19 +170,19 @@ const headroomTone = computed(() => headroomColor(headroom.value, m.value.trunca
172
170
  <!-- transport overhead vs model execution -->
173
171
  <div v-if="transport !== null" class="mt-2">
174
172
  <div class="flex items-center justify-between text-[11px]">
175
- <span class="text-slate-500">{{ t('observability.metricsBar.transportVsExecution') }}</span>
176
- <span class="tabular-nums text-slate-400">
173
+ <span class="text-dimmed">{{ t('observability.metricsBar.transportVsExecution') }}</span>
174
+ <span class="tabular-nums text-muted">
177
175
  {{ formatMs(m.overheadMs) }} / {{ formatMs(m.upstreamMs) }}
178
176
  </span>
179
177
  </div>
180
- <div class="mt-1 flex h-1 overflow-hidden rounded-full bg-slate-700/60">
178
+ <div class="mt-1 flex h-1 overflow-hidden rounded-full bg-accented/60">
181
179
  <div
182
- class="h-full bg-sky-400/80"
180
+ class="h-full bg-app-info-400/80"
183
181
  :style="{ width: `${pct(transport)}%` }"
184
182
  :title="t('observability.metricsBar.transportOverhead')"
185
183
  />
186
184
  <div
187
- class="h-full bg-indigo-400/80 flex-1"
185
+ class="h-full bg-primary/80 flex-1"
188
186
  :title="t('observability.metricsBar.modelExecution')"
189
187
  />
190
188
  </div>
@@ -31,12 +31,12 @@ function openObservability() {
31
31
  <template>
32
32
  <div v-if="instanceId || hasCalls">
33
33
  <div class="mb-1 flex items-center justify-between">
34
- <span class="text-[11px] font-semibold uppercase tracking-wide text-slate-500">
34
+ <span class="text-[11px] font-semibold uppercase tracking-wide text-dimmed">
35
35
  {{ t('observability.modelActivity') }}
36
36
  </span>
37
37
  <button
38
38
  v-if="instanceId"
39
- class="text-[11px] text-sky-400 hover:text-sky-300"
39
+ class="text-[11px] text-app-info-400 hover:text-app-info-300"
40
40
  @click="openObservability"
41
41
  >
42
42
  {{ t('observability.viewAllCalls') }}
@@ -142,10 +142,10 @@ function prettyArgs(raw: string): string {
142
142
  <div class="space-y-4">
143
143
  <div class="flex flex-wrap items-center justify-between gap-2">
144
144
  <div>
145
- <h2 class="text-[11px] uppercase tracking-wide text-slate-500">
145
+ <h2 class="text-[11px] uppercase tracking-wide text-dimmed">
146
146
  {{ t('observability.toolCalls.title') }}
147
147
  </h2>
148
- <p class="text-[11px] text-slate-600">{{ t('observability.toolCalls.subtitle') }}</p>
148
+ <p class="text-[11px] text-app-600">{{ t('observability.toolCalls.subtitle') }}</p>
149
149
  </div>
150
150
  <OutcomeFilterChips v-model="filter" :options="filterOptions" />
151
151
  </div>
@@ -154,14 +154,14 @@ function prettyArgs(raw: string): string {
154
154
  read still in flight behind them, and outrank one that failed. -->
155
155
  <p
156
156
  v-if="source.loading && !visible.length"
157
- class="flex items-center justify-center gap-2 py-8 text-center text-sm text-slate-500"
157
+ class="flex items-center justify-center gap-2 py-8 text-center text-sm text-dimmed"
158
158
  >
159
159
  <UIcon name="i-lucide-loader-circle" class="h-4 w-4 animate-spin" />
160
160
  {{ t('observability.toolCalls.loading') }}
161
161
  </p>
162
162
  <div
163
163
  v-else-if="source.error && !visible.length"
164
- 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"
164
+ 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"
165
165
  >
166
166
  {{ t('observability.toolCalls.error') }}
167
167
  <UButton
@@ -179,7 +179,7 @@ function prettyArgs(raw: string): string {
179
179
  never off an empty prefix that may simply not have loaded. -->
180
180
  <p
181
181
  v-else-if="!counts.all"
182
- class="rounded-lg border border-dashed border-slate-800 py-8 text-center text-sm text-slate-500"
182
+ class="rounded-lg border border-dashed border-default py-8 text-center text-sm text-dimmed"
183
183
  >
184
184
  {{ t('observability.toolCalls.none') }}
185
185
  </p>
@@ -187,7 +187,7 @@ function prettyArgs(raw: string): string {
187
187
  reassuring of the two: the operator asked for the failures and there are none. -->
188
188
  <p
189
189
  v-else-if="!visible.length"
190
- class="rounded-lg border border-dashed border-slate-800 py-8 text-center text-sm text-slate-500"
190
+ class="rounded-lg border border-dashed border-default py-8 text-center text-sm text-dimmed"
191
191
  >
192
192
  {{ t('observability.toolCalls.noneMatching') }}
193
193
  </p>
@@ -198,7 +198,7 @@ function prettyArgs(raw: string): string {
198
198
  implies has to explain itself here. -->
199
199
  <p
200
200
  v-if="boundedNotice"
201
- class="rounded-lg border border-dashed border-amber-900/50 px-3 py-2 text-[11px] text-amber-300/90"
201
+ class="rounded-lg border border-dashed border-app-warning-900/50 px-3 py-2 text-[11px] text-app-warning-300/90"
202
202
  >
203
203
  {{ boundedNotice }}
204
204
  </p>
@@ -207,16 +207,16 @@ function prettyArgs(raw: string): string {
207
207
  <li
208
208
  v-for="call in visible"
209
209
  :key="call.id"
210
- class="overflow-hidden rounded-xl border border-slate-800 bg-slate-900/40"
211
- :class="!call.ok ? 'border-rose-900/60' : ''"
210
+ class="overflow-hidden rounded-xl border border-default bg-default/40"
211
+ :class="!call.ok ? 'border-app-error-900/60' : ''"
212
212
  >
213
213
  <button
214
- class="flex w-full items-center gap-3 px-4 py-2.5 text-start transition hover:bg-slate-900/70"
214
+ class="flex w-full items-center gap-3 px-4 py-2.5 text-start transition hover:bg-default/70"
215
215
  @click="toggle(call)"
216
216
  >
217
217
  <UIcon
218
218
  name="i-lucide-chevron-right"
219
- class="h-4 w-4 shrink-0 text-slate-500 transition-transform"
219
+ class="h-4 w-4 shrink-0 text-dimmed transition-transform"
220
220
  :class="expanded[call.id] ? 'rotate-90' : ''"
221
221
  />
222
222
  <UIcon
@@ -225,60 +225,60 @@ function prettyArgs(raw: string): string {
225
225
  :style="{ color: agentMeta(call.agentKind).color }"
226
226
  :title="agentMeta(call.agentKind).label"
227
227
  />
228
- <span class="font-mono text-[13px] text-slate-200">{{ call.tool }}</span>
229
- <div class="ms-auto flex items-center gap-2.5 text-[11px] tabular-nums text-slate-400">
228
+ <span class="font-mono text-[13px] text-default">{{ call.tool }}</span>
229
+ <div class="ms-auto flex items-center gap-2.5 text-[11px] tabular-nums text-muted">
230
230
  <span :title="t('observability.toolCalls.durationHint')">
231
231
  {{ formatMs(Math.max(0, call.endedAt - call.startedAt)) }}
232
232
  </span>
233
233
  <UBadge v-if="!call.ok" color="error" variant="subtle" size="sm">
234
234
  {{ t('observability.toolCalls.failed') }}
235
235
  </UBadge>
236
- <span class="hidden text-slate-600 md:inline">{{ clock(call.startedAt) }}</span>
236
+ <span class="hidden text-app-600 md:inline">{{ clock(call.startedAt) }}</span>
237
237
  </div>
238
238
  </button>
239
239
 
240
- <div v-if="expanded[call.id]" class="border-t border-slate-800 px-4 py-3 space-y-3">
241
- <div class="flex flex-wrap gap-x-5 gap-y-1 text-[11px] text-slate-500">
240
+ <div v-if="expanded[call.id]" class="border-t border-default px-4 py-3 space-y-3">
241
+ <div class="flex flex-wrap gap-x-5 gap-y-1 text-[11px] text-dimmed">
242
242
  <span>{{ t('observability.toolCalls.dispatch', { jobId: call.jobId }) }}</span>
243
243
  <span>{{ t('observability.toolCalls.seq', { seq: call.seq }) }}</span>
244
244
  </div>
245
245
  <!-- `withheld` is not an empty body: nothing was captured, so an empty `args` here
246
246
  must not read as a tool that took none. -->
247
- <p v-if="call.bodies !== 'stored'" class="text-[12px] italic text-slate-500">
247
+ <p v-if="call.bodies !== 'stored'" class="text-[12px] italic text-dimmed">
248
248
  {{ t('observability.toolCalls.bodiesWithheld') }}
249
249
  </p>
250
250
  <template v-else>
251
251
  <div>
252
252
  <div
253
- class="mb-1 flex items-center gap-2 text-[11px] uppercase tracking-wide text-slate-500"
253
+ class="mb-1 flex items-center gap-2 text-[11px] uppercase tracking-wide text-dimmed"
254
254
  >
255
255
  <span>{{ t('observability.toolCalls.arguments') }}</span>
256
256
  <span
257
257
  v-if="call.argsDropped > 0"
258
- class="normal-case tracking-normal text-slate-600"
258
+ class="normal-case tracking-normal text-app-600"
259
259
  >
260
260
  {{ t('observability.toolCalls.dropped', { chars: call.argsDropped }) }}
261
261
  </span>
262
262
  </div>
263
263
  <pre
264
- class="max-h-60 overflow-auto rounded-lg bg-slate-950/70 p-3 text-[11px] leading-relaxed text-slate-300"
264
+ class="max-h-60 overflow-auto rounded-lg bg-app-950/70 p-3 text-[11px] leading-relaxed text-toned"
265
265
  >{{ call.args ? prettyArgs(call.args) : '—' }}</pre>
266
266
  </div>
267
267
  <div>
268
268
  <div
269
- class="mb-1 flex items-center gap-2 text-[11px] uppercase tracking-wide text-slate-500"
269
+ class="mb-1 flex items-center gap-2 text-[11px] uppercase tracking-wide text-dimmed"
270
270
  >
271
271
  <span>{{ t('observability.toolCalls.result') }}</span>
272
272
  <span
273
273
  v-if="call.resultDropped > 0"
274
- class="normal-case tracking-normal text-slate-600"
274
+ class="normal-case tracking-normal text-app-600"
275
275
  >
276
276
  {{ t('observability.toolCalls.dropped', { chars: call.resultDropped }) }}
277
277
  </span>
278
278
  </div>
279
279
  <pre
280
- class="max-h-60 overflow-auto rounded-lg bg-slate-950/70 p-3 text-[11px] leading-relaxed"
281
- :class="call.ok ? 'text-slate-300' : 'text-rose-300'"
280
+ class="max-h-60 overflow-auto rounded-lg bg-app-950/70 p-3 text-[11px] leading-relaxed"
281
+ :class="call.ok ? 'text-toned' : 'text-app-error-300'"
282
282
  >{{ call.result || '—' }}</pre>
283
283
  </div>
284
284
  </template>