@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.
- package/README.md +16 -0
- package/app/app.config.ts +19 -10
- package/app/assets/css/main.css +13 -13
- package/app/assets/css/prose.css +22 -22
- package/app/assets/css/tokens.css +298 -0
- package/app/components/assistant/AssistantModal.vue +22 -22
- package/app/components/auth/AuthGate.vue +1 -1
- package/app/components/auth/BackendMisconfiguredScreen.vue +10 -10
- package/app/components/auth/LoginScreen.vue +34 -36
- package/app/components/auth/ResetPasswordScreen.vue +12 -12
- package/app/components/auth/UserMenu.vue +4 -4
- package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +27 -25
- package/app/components/binaryOutput/BinaryOutputReport.vue +15 -15
- package/app/components/binaryOutput/StoredAssetView.vue +5 -5
- package/app/components/board/AddTaskModal.vue +17 -20
- package/app/components/board/AgentFailureCard.vue +11 -11
- package/app/components/board/AgentFailureHistory.vue +2 -2
- package/app/components/board/BoardCanvas.vue +6 -5
- package/app/components/board/CreateInitiativeModal.vue +8 -10
- package/app/components/board/DependencyConnectOverlay.vue +1 -1
- package/app/components/board/FailureHistoryList.vue +7 -7
- package/app/components/board/RecurringPipelineModal.vue +17 -17
- package/app/components/board/ReviewFrictionDialog.vue +6 -6
- package/app/components/board/StepExecutionHistory.vue +13 -13
- package/app/components/board/TaskDependencyEdges.vue +8 -8
- package/app/components/board/nodes/AgentChip.vue +10 -10
- package/app/components/board/nodes/BlockNode.vue +29 -29
- package/app/components/board/nodes/DecisionBadge.vue +2 -2
- package/app/components/board/nodes/EpicNode.vue +14 -10
- package/app/components/board/nodes/FrameSwimlanes.vue +7 -9
- package/app/components/board/nodes/InitiativeCard.vue +8 -8
- package/app/components/board/nodes/LaneGroup.vue +1 -1
- package/app/components/board/nodes/LaneTask.vue +2 -2
- package/app/components/board/nodes/ResizeGrips.vue +4 -4
- package/app/components/board/nodes/TaskCard.vue +18 -18
- package/app/components/board/nodes/TaskLane.vue +5 -5
- package/app/components/board/nodes/TaskPipelineMini.vue +18 -18
- package/app/components/bootstrap/AdoptionReviewModal.vue +29 -26
- package/app/components/bootstrap/BootstrapModal.vue +21 -23
- package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
- package/app/components/brainstorm/BrainstormWindow.vue +30 -33
- package/app/components/bugFishing/BugFishingWindow.vue +49 -49
- package/app/components/clarity/ClarityReviewWindow.vue +30 -30
- package/app/components/common/AsyncViewError.vue +5 -5
- package/app/components/common/ClarificationItem.vue +8 -13
- package/app/components/common/ConfirmDialog.vue +4 -2
- package/app/components/common/DescriptorFields.vue +1 -1
- package/app/components/common/EmptyState.vue +3 -3
- package/app/components/common/InterviewGateNotice.vue +7 -7
- package/app/components/common/KeyboardShortcutsHelp.vue +1 -1
- package/app/components/common/MarkdownProse.vue +14 -13
- package/app/components/consensus/ConsensusSessionWindow.vue +26 -26
- package/app/components/context/ContextAttachmentFields.vue +17 -17
- package/app/components/docs/DocInterviewWindow.vue +14 -14
- package/app/components/documents/ContextDocumentPicker.vue +17 -17
- package/app/components/documents/DocumentImportModal.vue +7 -7
- package/app/components/documents/DocumentSourceConnectModal.vue +3 -3
- package/app/components/documents/DocumentSyncState.vue +5 -5
- package/app/components/documents/DocumentTemplatesModal.vue +15 -15
- package/app/components/documents/RepoContextDocPicker.vue +5 -5
- package/app/components/documents/SpawnPreviewModal.vue +12 -12
- package/app/components/documents/StartFromDesignModal.vue +11 -11
- package/app/components/documents/TaskContextDocs.vue +5 -5
- package/app/components/environments/EnvSetupStepper.vue +6 -6
- package/app/components/environments/EnvironmentStatusPanel.vue +17 -17
- package/app/components/environments/steps/EnvPickStep.vue +3 -3
- package/app/components/environments/steps/EnvPreflightStep.vue +9 -9
- package/app/components/environments/steps/EnvReviewStep.vue +25 -22
- package/app/components/environments/steps/EnvSaveStep.vue +7 -5
- package/app/components/environments/steps/JourneyStepNav.vue +1 -1
- package/app/components/focus/BlockFocusView.vue +17 -19
- package/app/components/followUp/FollowUpWindow.vue +23 -23
- package/app/components/forkDecision/ForkDecisionWindow.vue +37 -39
- package/app/components/foundational/FoundationalContractSummary.vue +7 -7
- package/app/components/foundational/FoundationalServiceCatalogList.vue +11 -11
- package/app/components/foundational/FoundationalServiceManager.vue +1 -1
- package/app/components/foundational/FoundationalServiceRegistry.vue +13 -13
- package/app/components/foundational/FoundationalServiceSources.vue +13 -13
- package/app/components/foundational/FoundationalSuppressions.vue +7 -7
- package/app/components/foundational/ServiceCatalogConnection.vue +10 -10
- package/app/components/fragments/FragmentLibraryManager.vue +41 -44
- package/app/components/fragments/FragmentSelector.vue +13 -13
- package/app/components/fragments/GitHubDocUrlImport.vue +1 -1
- package/app/components/gates/GateFailingCheckList.vue +5 -5
- package/app/components/gates/GateResultView.vue +50 -47
- package/app/components/github/AddServiceFromRepoModal.vue +14 -14
- package/app/components/github/BranchProtectionPreflight.vue +13 -13
- package/app/components/github/GitHubConnect.vue +7 -7
- package/app/components/github/GitHubOnboarding.vue +7 -7
- package/app/components/github/GitHubPanel.vue +37 -40
- package/app/components/github/RepoTreeBrowser.vue +18 -18
- package/app/components/humanTest/HumanTestWindow.vue +30 -33
- package/app/components/initiative/InitiativePlanNotice.vue +5 -5
- package/app/components/initiative/InitiativePlanReview.vue +27 -29
- package/app/components/initiative/InitiativePlanningWindow.vue +10 -10
- package/app/components/initiative/InitiativeTrackerWindow.vue +71 -65
- package/app/components/inputGate/InputGateNotice.vue +2 -4
- package/app/components/judge/JudgeResultView.vue +30 -32
- package/app/components/kaizen/KaizenPanel.vue +40 -36
- package/app/components/kaizen/KaizenStepStatus.vue +21 -21
- package/app/components/layout/AccountAuditLog.vue +10 -10
- package/app/components/layout/AccountDeploymentSettings.vue +20 -20
- package/app/components/layout/AccountFailureKindRules.vue +13 -13
- package/app/components/layout/AccountFoundationalSettings.vue +1 -1
- package/app/components/layout/AccountFragmentSettings.vue +1 -1
- package/app/components/layout/AccountModelPolicySettings.vue +9 -9
- package/app/components/layout/AccountPlatformAlertSettings.vue +11 -11
- package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
- package/app/components/layout/AccountRunCredentialSettings.vue +5 -5
- package/app/components/layout/AccountSkillSettings.vue +1 -1
- package/app/components/layout/AccountTeamSettings.vue +23 -15
- package/app/components/layout/AiProvidersBanner.vue +11 -8
- package/app/components/layout/AppearanceSwitcher.vue +108 -0
- package/app/components/layout/BoardSwitcher.vue +8 -11
- package/app/components/layout/BoardToolbar.vue +3 -3
- package/app/components/layout/CommandBar.vue +7 -9
- package/app/components/layout/ConnectionStatusBanner.vue +2 -2
- package/app/components/layout/DefaultTestEnvBanner.vue +5 -5
- package/app/components/layout/GitHubPatBanner.vue +5 -5
- package/app/components/layout/GitHubPatPermissionsBanner.vue +16 -10
- package/app/components/layout/InfraSetupBanner.vue +6 -6
- package/app/components/layout/IntegrationsHub.vue +15 -15
- package/app/components/layout/LanguageSwitcher.vue +5 -5
- package/app/components/layout/ModelProvidersHub.vue +13 -16
- package/app/components/layout/NotificationsInbox.vue +10 -10
- package/app/components/layout/PersonalSetupModal.vue +8 -8
- package/app/components/layout/ProviderConfigBanner.vue +4 -4
- package/app/components/layout/RolePrompt.vue +7 -7
- package/app/components/layout/SideBar.vue +6 -4
- package/app/components/layout/SpendWarningBanner.vue +17 -14
- package/app/components/layout/TranslationWarningBanner.vue +4 -4
- package/app/components/layout/UiModeSwitcher.vue +13 -13
- package/app/components/layout/UiRoleSwitcher.vue +8 -8
- package/app/components/layout/WorkspaceMembersSettings.vue +15 -11
- package/app/components/media/ArtifactLightbox.vue +13 -13
- package/app/components/media/ImageCompare.vue +31 -24
- package/app/components/merge/MergeEffortChips.vue +2 -2
- package/app/components/notifications/NotificationSettingsPanel.vue +14 -12
- package/app/components/observability/OutcomeFilterChips.vue +6 -6
- package/app/components/observability/RunFailureSummary.vue +28 -25
- package/app/components/observability/StepMetricsBar.vue +26 -28
- package/app/components/observability/StepModelActivity.vue +2 -2
- package/app/components/observability/ToolCallList.vue +24 -24
- package/app/components/outcome/OutcomeSummaryWindow.vue +47 -47
- package/app/components/palettes/AgentPalette.vue +8 -8
- package/app/components/palettes/AgentTierSelect.vue +1 -1
- package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
- package/app/components/panels/AgentStepDetail.vue +52 -51
- package/app/components/panels/AttemptEntryHeader.vue +4 -6
- package/app/components/panels/DecisionModal.vue +7 -7
- package/app/components/panels/GenericStructuredResultView.vue +7 -7
- package/app/components/panels/InspectorPanel.vue +17 -17
- package/app/components/panels/MergerResultView.vue +19 -19
- package/app/components/panels/ObservabilityPanel.vue +115 -123
- package/app/components/panels/OperatorDashboardPanel.vue +89 -97
- package/app/components/panels/ReportsPanel.vue +69 -66
- package/app/components/panels/ReportsSpendBreakdown.vue +9 -9
- package/app/components/panels/ResultWindowShell.vue +38 -38
- package/app/components/panels/RunDetailLoadState.vue +2 -2
- package/app/components/panels/StepContainerStatus.vue +9 -9
- package/app/components/panels/StepDelegatedStatus.logic.spec.ts +135 -0
- package/app/components/panels/StepDelegatedStatus.logic.ts +160 -0
- package/app/components/panels/StepDelegatedStatus.vue +181 -0
- package/app/components/panels/StepEffortReport.vue +16 -15
- package/app/components/panels/StepFragmentAdherence.vue +14 -10
- package/app/components/panels/StepMetadataCard.vue +74 -45
- package/app/components/panels/StepReproductionReport.vue +25 -21
- package/app/components/panels/StepRunMeta.vue +20 -20
- package/app/components/panels/StepTestReport.logic.spec.ts +8 -3
- package/app/components/panels/StepTestReport.logic.ts +4 -4
- package/app/components/panels/StepTestReport.vue +28 -28
- package/app/components/panels/StepToolServers.vue +14 -11
- package/app/components/panels/StepValidationReport.vue +7 -7
- package/app/components/panels/inspector/ContainerSummary.vue +9 -9
- package/app/components/panels/inspector/DocReferenceRepos.vue +3 -3
- package/app/components/panels/inspector/EnvProbeReport.vue +24 -27
- package/app/components/panels/inspector/EpicChildren.vue +8 -12
- package/app/components/panels/inspector/FrontendBindingsResolved.vue +11 -11
- package/app/components/panels/inspector/FrontendConfig.vue +37 -41
- package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
- package/app/components/panels/inspector/InspectorSection.vue +6 -6
- package/app/components/panels/inspector/RecurringScheduleSettings.vue +16 -19
- package/app/components/panels/inspector/ServiceConnections.vue +2 -2
- package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
- package/app/components/panels/inspector/ServiceSelfTests.vue +21 -17
- package/app/components/panels/inspector/ServiceTestConfig.vue +51 -59
- package/app/components/panels/inspector/ServiceTestSecrets.vue +5 -5
- package/app/components/panels/inspector/ServiceTestingContext.vue +3 -3
- package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
- package/app/components/panels/inspector/TaskAgentConfig.vue +3 -3
- package/app/components/panels/inspector/TaskAprioriBranches.vue +8 -5
- package/app/components/panels/inspector/TaskDependencies.vue +1 -1
- package/app/components/panels/inspector/TaskEstimateBadge.vue +11 -11
- package/app/components/panels/inspector/TaskExecution.vue +17 -17
- package/app/components/panels/inspector/TaskReviewTarget.vue +2 -2
- package/app/components/panels/inspector/TaskRunSettings.vue +35 -37
- package/app/components/panels/inspector/TaskStructure.vue +3 -3
- package/app/components/pipeline/AgentKindIcon.vue +1 -1
- package/app/components/pipeline/AgentPromptEditor.vue +17 -17
- package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -56
- package/app/components/pipeline/EstimateThresholdFields.vue +4 -4
- package/app/components/pipeline/GateConfigFields.vue +13 -10
- package/app/components/pipeline/IterationCapPrompt.vue +4 -2
- package/app/components/pipeline/PipelineBuilder.vue +47 -55
- package/app/components/pipeline/PipelineHealthModal.vue +27 -29
- package/app/components/pipeline/PipelinePicker.vue +10 -10
- package/app/components/pipeline/PipelinePreview.vue +10 -10
- package/app/components/pipeline/PipelineProgress.vue +64 -67
- package/app/components/prReview/PrReviewPhaseBadge.vue +7 -7
- package/app/components/prReview/PrReviewWindow.vue +75 -77
- package/app/components/providers/AiPresetMismatchDialog.vue +5 -5
- package/app/components/providers/AiProviderOnboardingModal.vue +9 -9
- package/app/components/providers/ApiKeysSection.vue +13 -13
- package/app/components/providers/PersonalCredentialModal.vue +2 -2
- package/app/components/providers/PersonalSubscriptionSection.vue +10 -10
- package/app/components/providers/SignInRequiredNotice.vue +1 -1
- package/app/components/providers/VendorCredentialsModal.vue +10 -10
- package/app/components/provisioning/ProvisioningLogsDrawer.vue +13 -13
- package/app/components/ralph/RalphLoopResultView.vue +28 -30
- package/app/components/recurring/RecurrenceEditor.vue +2 -2
- package/app/components/requirements/RequirementsReviewWindow.vue +51 -58
- package/app/components/riskPolicy/RiskPolicyPicker.vue +12 -15
- package/app/components/riskPolicy/RiskPolicyPreview.vue +14 -14
- package/app/components/sandbox/SandboxPanel.vue +58 -59
- package/app/components/settings/AccountSettingsPanel.vue +1 -1
- package/app/components/settings/ApiTokensPanel.vue +10 -10
- package/app/components/settings/BudgetSettings.vue +18 -22
- package/app/components/settings/CapabilityCredentialsPanel.vue +15 -15
- package/app/components/settings/CloudflareHandlerSection.vue +20 -20
- package/app/components/settings/ComposeEnvironmentSetupSection.vue +13 -13
- package/app/components/settings/ConnectionTestVerdict.vue +3 -3
- package/app/components/settings/ConnectionWarnings.vue +1 -1
- package/app/components/settings/ConsensusGroupsSection.vue +27 -35
- package/app/components/settings/CustomManifestTypeEditor.vue +10 -10
- package/app/components/settings/DefaultProvisionTypeSection.vue +6 -6
- package/app/components/settings/InfraHandlersConfigurator.vue +24 -22
- package/app/components/settings/InfrastructureBackendPicker.vue +6 -6
- package/app/components/settings/InfrastructureWindow.vue +5 -5
- package/app/components/settings/IssueTrackerPanel.vue +29 -23
- package/app/components/settings/KubernetesEngineForm.vue +11 -11
- package/app/components/settings/KubernetesEnvironmentForm.vue +4 -4
- package/app/components/settings/LocalContainerPoolSettings.vue +6 -11
- package/app/components/settings/LocalModelEndpointsPanel.vue +20 -18
- package/app/components/settings/McpAuthorizeScreen.vue +13 -15
- package/app/components/settings/McpOAuthCallbackScreen.vue +16 -10
- package/app/components/settings/MergeClassRulesEditor.vue +6 -9
- package/app/components/settings/MergeRolePolicyEditor.vue +16 -16
- package/app/components/settings/ModelConfigurationPanel.vue +23 -30
- package/app/components/settings/ModelPresetHealthModal.vue +15 -13
- package/app/components/settings/ObservabilityConnectionPanel.vue +4 -4
- package/app/components/settings/OpenRouterCatalogPanel.vue +23 -19
- package/app/components/settings/PackageRegistriesPanel.vue +8 -8
- package/app/components/settings/ProviderConnectionTab.vue +8 -11
- package/app/components/settings/ProviderManifestEditor.vue +9 -9
- package/app/components/settings/ProviderPreferenceEditor.vue +8 -8
- package/app/components/settings/RiskPolicyCreateForm.vue +10 -10
- package/app/components/settings/RiskPolicyEditorRow.vue +14 -14
- package/app/components/settings/RiskPolicyHealthModal.vue +15 -13
- package/app/components/settings/RiskPolicyInheritedRow.vue +1 -1
- package/app/components/settings/RiskPolicyPanel.vue +10 -15
- package/app/components/settings/ServiceFragmentDefaultsPanel.vue +7 -7
- package/app/components/settings/SharedStacksPanel.vue +9 -12
- package/app/components/settings/TaskSourceCard.vue +4 -4
- package/app/components/settings/TaskTypeSuppressionsPanel.vue +6 -6
- package/app/components/settings/ToolServerChecklist.vue +36 -29
- package/app/components/settings/UsageSettings.vue +15 -15
- package/app/components/settings/UserSecretsSection.vue +9 -12
- package/app/components/settings/WorkspaceMetadataSettings.vue +5 -5
- package/app/components/settings/WorkspaceSettingsPanel.vue +47 -47
- package/app/components/skills/ReviewSkillQueue.vue +10 -10
- package/app/components/skills/SkillLibraryManager.vue +23 -20
- package/app/components/slack/SlackPanel.vue +13 -17
- package/app/components/spec/ServiceSpecWindow.vue +45 -42
- package/app/components/tasks/BugHuntModal.vue +24 -27
- package/app/components/tasks/ContextIssuePicker.vue +11 -11
- package/app/components/tasks/TaskContextIssues.vue +3 -3
- package/app/components/tasks/TaskImportModal.vue +7 -7
- package/app/components/tasks/TaskSourceConnectModal.vue +10 -8
- package/app/components/testing/TestReportWindow.vue +99 -82
- package/app/components/theme/ThemeImportModal.vue +115 -0
- package/app/components/tutorial/TutorialCatalogue.vue +9 -9
- package/app/components/tutorial/TutorialNudge.vue +5 -5
- package/app/components/tutorial/TutorialOverlay.vue +12 -12
- package/app/components/tutorial/TutorialPrompt.vue +6 -9
- package/app/components/vcs/GitLabConnect.vue +4 -4
- package/app/components/vcs/VcsConnectSurfaces.vue +2 -2
- package/app/components/visualConfirm/VisualConfirmationWindow.vue +36 -36
- package/app/composables/api/client.ts +6 -1
- package/app/composables/usePipelineErrorToast.ts +17 -0
- package/app/modular/agent-kinds.ts +24 -0
- package/app/pages/index.vue +5 -5
- package/app/plugins/theme.client.ts +125 -0
- package/app/spa-loading-template.html +52 -14
- package/app/stores/agents.ts +1 -1
- package/app/stores/theme.spec.ts +56 -0
- package/app/stores/theme.ts +87 -0
- package/app/types/domain.ts +19 -0
- package/app/types/execution.ts +4 -0
- package/app/utils/agentOutput.ts +1 -1
- package/app/utils/binaryOutput.ts +6 -6
- package/app/utils/bootstrapSteps.ts +14 -14
- package/app/utils/catalog.ts +87 -83
- package/app/utils/colorTint.ts +10 -0
- package/app/utils/failureKinds.ts +1 -0
- package/app/utils/observability.ts +3 -3
- package/app/utils/pipelineRender.ts +13 -17
- package/app/utils/swimlanes.ts +4 -4
- package/app/utils/theme/bootPalette.spec.ts +54 -0
- package/app/utils/theme/bootPalette.ts +108 -0
- package/app/utils/theme/builtins.spec.ts +38 -0
- package/app/utils/theme/builtins.ts +55 -0
- package/app/utils/theme/css.ts +162 -0
- package/app/utils/theme/doc.ts +353 -0
- package/app/utils/theme/link.ts +93 -0
- package/app/utils/theme/presets.ts +509 -0
- package/app/utils/theme/theme.spec.ts +224 -0
- package/i18n/locales/de.json +61 -4
- package/i18n/locales/en.json +70 -4
- package/i18n/locales/es.json +61 -4
- package/i18n/locales/fr.json +61 -4
- package/i18n/locales/he.json +61 -4
- package/i18n/locales/it.json +61 -4
- package/i18n/locales/ja.json +61 -4
- package/i18n/locales/pl.json +61 -4
- package/i18n/locales/tr.json +61 -4
- package/i18n/locales/uk.json +61 -4
- package/nuxt.config.ts +37 -11
- package/package.json +9 -8
|
@@ -106,31 +106,33 @@ watch(
|
|
|
106
106
|
<Transition name="obs-fade">
|
|
107
107
|
<div
|
|
108
108
|
v-if="open"
|
|
109
|
-
class="fixed inset-0 z-[60] flex flex-col bg-
|
|
109
|
+
class="fixed inset-0 z-[60] flex flex-col bg-app-950/96 backdrop-blur-sm"
|
|
110
110
|
role="dialog"
|
|
111
111
|
aria-modal="true"
|
|
112
112
|
data-testid="operator-dashboard"
|
|
113
113
|
>
|
|
114
|
-
<header class="flex items-center gap-3 border-b border-
|
|
115
|
-
<div
|
|
116
|
-
|
|
114
|
+
<header class="flex items-center gap-3 border-b border-default px-6 py-4">
|
|
115
|
+
<div
|
|
116
|
+
class="flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-app-info-500/15"
|
|
117
|
+
>
|
|
118
|
+
<UIcon name="i-lucide-gauge" class="h-5 w-5 text-app-info-400" />
|
|
117
119
|
</div>
|
|
118
120
|
<div class="min-w-0">
|
|
119
|
-
<h1 class="truncate text-base font-semibold text-
|
|
121
|
+
<h1 class="truncate text-base font-semibold text-highlighted">
|
|
120
122
|
{{ t('platformObservability.title') }}
|
|
121
123
|
</h1>
|
|
122
|
-
<p v-if="accountName" class="truncate text-xs text-
|
|
124
|
+
<p v-if="accountName" class="truncate text-xs text-dimmed">{{ accountName }}</p>
|
|
123
125
|
</div>
|
|
124
126
|
<div class="ms-auto flex items-center gap-1.5">
|
|
125
|
-
<div class="me-1 flex rounded-lg border border-
|
|
127
|
+
<div class="me-1 flex rounded-lg border border-default p-0.5 text-[12px]">
|
|
126
128
|
<button
|
|
127
129
|
v-for="opt in WINDOWS"
|
|
128
130
|
:key="opt.value"
|
|
129
131
|
class="rounded-md px-2.5 py-1 transition"
|
|
130
132
|
:class="
|
|
131
133
|
platform.window === opt.value
|
|
132
|
-
? 'bg-
|
|
133
|
-
: 'text-
|
|
134
|
+
? 'bg-elevated text-app-100'
|
|
135
|
+
: 'text-muted hover:text-default'
|
|
134
136
|
"
|
|
135
137
|
:data-testid="`operator-window-${opt.value}`"
|
|
136
138
|
@click="setWindow(opt.value)"
|
|
@@ -139,7 +141,7 @@ watch(
|
|
|
139
141
|
</button>
|
|
140
142
|
</div>
|
|
141
143
|
<button
|
|
142
|
-
class="rounded-lg border border-
|
|
144
|
+
class="rounded-lg border border-default p-1.5 text-muted transition hover:text-default"
|
|
143
145
|
:title="t('platformObservability.refresh')"
|
|
144
146
|
:aria-label="t('platformObservability.refresh')"
|
|
145
147
|
data-testid="operator-refresh"
|
|
@@ -152,7 +154,7 @@ watch(
|
|
|
152
154
|
/>
|
|
153
155
|
</button>
|
|
154
156
|
<button
|
|
155
|
-
class="rounded-lg border border-
|
|
157
|
+
class="rounded-lg border border-default p-1.5 text-muted transition hover:text-default"
|
|
156
158
|
:title="t('platformObservability.close')"
|
|
157
159
|
:aria-label="t('platformObservability.close')"
|
|
158
160
|
data-testid="operator-close"
|
|
@@ -166,18 +168,18 @@ watch(
|
|
|
166
168
|
<div class="flex-1 overflow-y-auto px-6 py-5">
|
|
167
169
|
<div
|
|
168
170
|
v-if="error"
|
|
169
|
-
class="mx-auto max-w-2xl rounded-lg border border-
|
|
171
|
+
class="mx-auto max-w-2xl rounded-lg border border-app-error-800/60 bg-app-error-950/40 p-4 text-sm text-app-error-200"
|
|
170
172
|
>
|
|
171
173
|
<p>{{ error }}</p>
|
|
172
174
|
<button
|
|
173
|
-
class="mt-2 rounded-md border border-
|
|
175
|
+
class="mt-2 rounded-md border border-app-error-700 px-3 py-1 text-xs hover:bg-app-error-900/40"
|
|
174
176
|
@click="refresh"
|
|
175
177
|
>
|
|
176
178
|
{{ t('platformObservability.retry') }}
|
|
177
179
|
</button>
|
|
178
180
|
</div>
|
|
179
181
|
|
|
180
|
-
<div v-else-if="loading && !view" class="py-16 text-center text-sm text-
|
|
182
|
+
<div v-else-if="loading && !view" class="py-16 text-center text-sm text-muted">
|
|
181
183
|
{{ t('platformObservability.loading') }}
|
|
182
184
|
</div>
|
|
183
185
|
|
|
@@ -189,14 +191,14 @@ watch(
|
|
|
189
191
|
-->
|
|
190
192
|
<p
|
|
191
193
|
v-if="rollupState === 'none'"
|
|
192
|
-
class="rounded-lg border border-
|
|
194
|
+
class="rounded-lg border border-app-warning-800/60 bg-app-warning-950/30 px-3 py-2 text-xs text-app-warning-200"
|
|
193
195
|
data-testid="operator-rollup-missing"
|
|
194
196
|
>
|
|
195
197
|
{{ t('platformObservability.rollup.none') }}
|
|
196
198
|
</p>
|
|
197
199
|
<p
|
|
198
200
|
v-else-if="rollupState === 'stale'"
|
|
199
|
-
class="rounded-lg border border-
|
|
201
|
+
class="rounded-lg border border-app-warning-800/60 bg-app-warning-950/30 px-3 py-2 text-xs text-app-warning-200"
|
|
200
202
|
data-testid="operator-rollup-stale"
|
|
201
203
|
>
|
|
202
204
|
{{
|
|
@@ -207,7 +209,7 @@ watch(
|
|
|
207
209
|
</p>
|
|
208
210
|
<p
|
|
209
211
|
v-else-if="rollupState === 'current'"
|
|
210
|
-
class="text-xs text-
|
|
212
|
+
class="text-xs text-dimmed"
|
|
211
213
|
data-testid="operator-rollup-current"
|
|
212
214
|
>
|
|
213
215
|
{{
|
|
@@ -219,37 +221,37 @@ watch(
|
|
|
219
221
|
|
|
220
222
|
<!-- Outcome summary tiles -->
|
|
221
223
|
<section>
|
|
222
|
-
<h2 class="mb-2 text-xs font-semibold uppercase tracking-wide text-
|
|
224
|
+
<h2 class="mb-2 text-xs font-semibold uppercase tracking-wide text-dimmed">
|
|
223
225
|
{{ t('platformObservability.outcomes.title') }}
|
|
224
226
|
</h2>
|
|
225
227
|
<div class="grid grid-cols-2 gap-3 sm:grid-cols-4">
|
|
226
|
-
<div class="rounded-lg border border-
|
|
227
|
-
<p class="text-2xl font-semibold text-
|
|
228
|
+
<div class="rounded-lg border border-default bg-default/40 p-3">
|
|
229
|
+
<p class="text-2xl font-semibold text-highlighted">
|
|
228
230
|
{{ n(view.outcomes.total, 'decimal') }}
|
|
229
231
|
</p>
|
|
230
|
-
<p class="text-xs text-
|
|
232
|
+
<p class="text-xs text-dimmed">
|
|
231
233
|
{{ t('platformObservability.outcomes.total') }}
|
|
232
234
|
</p>
|
|
233
235
|
</div>
|
|
234
|
-
<div class="rounded-lg border border-
|
|
235
|
-
<p class="text-2xl font-semibold text-
|
|
236
|
+
<div class="rounded-lg border border-default bg-default/40 p-3">
|
|
237
|
+
<p class="text-2xl font-semibold text-app-success-400">
|
|
236
238
|
{{ n(view.outcomes.done, 'decimal') }}
|
|
237
239
|
</p>
|
|
238
|
-
<p class="text-xs text-
|
|
240
|
+
<p class="text-xs text-dimmed">
|
|
239
241
|
{{ t('platformObservability.outcomes.done') }}
|
|
240
242
|
</p>
|
|
241
243
|
</div>
|
|
242
|
-
<div class="rounded-lg border border-
|
|
243
|
-
<p class="text-2xl font-semibold text-
|
|
244
|
+
<div class="rounded-lg border border-default bg-default/40 p-3">
|
|
245
|
+
<p class="text-2xl font-semibold text-app-error-400">
|
|
244
246
|
{{ n(view.outcomes.failed, 'decimal') }}
|
|
245
247
|
</p>
|
|
246
|
-
<p class="text-xs text-
|
|
248
|
+
<p class="text-xs text-dimmed">
|
|
247
249
|
{{ t('platformObservability.outcomes.failed') }}
|
|
248
250
|
</p>
|
|
249
251
|
</div>
|
|
250
|
-
<div class="rounded-lg border border-
|
|
252
|
+
<div class="rounded-lg border border-default bg-default/40 p-3">
|
|
251
253
|
<p
|
|
252
|
-
class="text-2xl font-semibold text-
|
|
254
|
+
class="text-2xl font-semibold text-app-info-400"
|
|
253
255
|
data-testid="operator-success-rate"
|
|
254
256
|
>
|
|
255
257
|
{{
|
|
@@ -258,7 +260,7 @@ watch(
|
|
|
258
260
|
: n(view.outcomes.successRate, 'percent')
|
|
259
261
|
}}
|
|
260
262
|
</p>
|
|
261
|
-
<p class="text-xs text-
|
|
263
|
+
<p class="text-xs text-dimmed">
|
|
262
264
|
{{ t('platformObservability.outcomes.successRate') }}
|
|
263
265
|
</p>
|
|
264
266
|
</div>
|
|
@@ -267,14 +269,11 @@ watch(
|
|
|
267
269
|
|
|
268
270
|
<!-- Outcome trend sparkline -->
|
|
269
271
|
<section>
|
|
270
|
-
<h2 class="mb-2 text-xs font-semibold uppercase tracking-wide text-
|
|
272
|
+
<h2 class="mb-2 text-xs font-semibold uppercase tracking-wide text-dimmed">
|
|
271
273
|
{{ t('platformObservability.trend.title') }}
|
|
272
274
|
</h2>
|
|
273
|
-
<div class="rounded-lg border border-
|
|
274
|
-
<div
|
|
275
|
-
v-if="view.outcomes.total === 0"
|
|
276
|
-
class="py-6 text-center text-xs text-slate-500"
|
|
277
|
-
>
|
|
275
|
+
<div class="rounded-lg border border-default bg-default/40 p-4">
|
|
276
|
+
<div v-if="view.outcomes.total === 0" class="py-6 text-center text-xs text-dimmed">
|
|
278
277
|
{{ t('platformObservability.trend.empty') }}
|
|
279
278
|
</div>
|
|
280
279
|
<div v-else class="flex h-28 items-end gap-0.5" data-testid="operator-trend">
|
|
@@ -285,32 +284,32 @@ watch(
|
|
|
285
284
|
:title="trendTooltip(p)"
|
|
286
285
|
>
|
|
287
286
|
<div
|
|
288
|
-
class="w-full rounded-t-sm bg-
|
|
287
|
+
class="w-full rounded-t-sm bg-app-error-500/80"
|
|
289
288
|
:style="{ height: `${heightPct(p.failed, maxTrend)}%` }"
|
|
290
289
|
/>
|
|
291
290
|
<div
|
|
292
|
-
class="w-full bg-
|
|
291
|
+
class="w-full bg-app-500/60"
|
|
293
292
|
:style="{ height: `${heightPct(p.other, maxTrend)}%` }"
|
|
294
293
|
/>
|
|
295
294
|
<div
|
|
296
|
-
class="w-full rounded-b-sm bg-
|
|
295
|
+
class="w-full rounded-b-sm bg-app-success-500/80"
|
|
297
296
|
:style="{ height: `${heightPct(p.done, maxTrend)}%` }"
|
|
298
297
|
/>
|
|
299
298
|
</div>
|
|
300
299
|
</div>
|
|
301
|
-
<div class="mt-2 flex items-center gap-4 text-[11px] text-
|
|
300
|
+
<div class="mt-2 flex items-center gap-4 text-[11px] text-dimmed">
|
|
302
301
|
<span class="flex items-center gap-1"
|
|
303
|
-
><span class="h-2 w-2 rounded-sm bg-
|
|
302
|
+
><span class="h-2 w-2 rounded-sm bg-app-success-500/80" />{{
|
|
304
303
|
t('platformObservability.trend.done')
|
|
305
304
|
}}</span
|
|
306
305
|
>
|
|
307
306
|
<span class="flex items-center gap-1"
|
|
308
|
-
><span class="h-2 w-2 rounded-sm bg-
|
|
307
|
+
><span class="h-2 w-2 rounded-sm bg-app-error-500/80" />{{
|
|
309
308
|
t('platformObservability.trend.failed')
|
|
310
309
|
}}</span
|
|
311
310
|
>
|
|
312
311
|
<span class="flex items-center gap-1"
|
|
313
|
-
><span class="h-2 w-2 rounded-sm bg-
|
|
312
|
+
><span class="h-2 w-2 rounded-sm bg-app-500/60" />{{
|
|
314
313
|
t('platformObservability.trend.other')
|
|
315
314
|
}}</span
|
|
316
315
|
>
|
|
@@ -320,15 +319,15 @@ watch(
|
|
|
320
319
|
|
|
321
320
|
<!-- Gate / CI-fixer attempt statistics -->
|
|
322
321
|
<section>
|
|
323
|
-
<h2 class="mb-2 text-xs font-semibold uppercase tracking-wide text-
|
|
322
|
+
<h2 class="mb-2 text-xs font-semibold uppercase tracking-wide text-dimmed">
|
|
324
323
|
{{ t('platformObservability.gates.title') }}
|
|
325
324
|
</h2>
|
|
326
|
-
<div class="overflow-x-auto rounded-lg border border-
|
|
327
|
-
<p v-if="!view.gates.length" class="py-4 text-center text-xs text-
|
|
325
|
+
<div class="overflow-x-auto rounded-lg border border-default bg-default/40 p-4">
|
|
326
|
+
<p v-if="!view.gates.length" class="py-4 text-center text-xs text-dimmed">
|
|
328
327
|
{{ t('platformObservability.gates.empty') }}
|
|
329
328
|
</p>
|
|
330
329
|
<table v-else class="w-full text-left text-xs" data-testid="operator-gates">
|
|
331
|
-
<thead class="text-[11px] uppercase tracking-wide text-
|
|
330
|
+
<thead class="text-[11px] uppercase tracking-wide text-dimmed">
|
|
332
331
|
<tr>
|
|
333
332
|
<th class="pb-2 pe-3 font-medium">
|
|
334
333
|
{{ t('platformObservability.gates.gate') }}
|
|
@@ -350,40 +349,40 @@ watch(
|
|
|
350
349
|
</th>
|
|
351
350
|
</tr>
|
|
352
351
|
</thead>
|
|
353
|
-
<tbody class="text-
|
|
352
|
+
<tbody class="text-toned">
|
|
354
353
|
<tr
|
|
355
354
|
v-for="g in view.gates"
|
|
356
355
|
:key="g.gateKind"
|
|
357
|
-
class="border-t border-
|
|
356
|
+
class="border-t border-default/70"
|
|
358
357
|
>
|
|
359
358
|
<td class="py-2 pe-3">
|
|
360
|
-
<span class="font-medium text-
|
|
361
|
-
<span v-if="g.helperKind" class="ms-1.5 text-
|
|
359
|
+
<span class="font-medium text-default">{{ g.gateKind }}</span>
|
|
360
|
+
<span v-if="g.helperKind" class="ms-1.5 text-dimmed"
|
|
362
361
|
>→ {{ g.helperKind }}</span
|
|
363
362
|
>
|
|
364
363
|
</td>
|
|
365
364
|
<td class="py-2 pe-3 text-end tabular-nums">{{ g.gates }}</td>
|
|
366
365
|
<td class="py-2 pe-3 text-end tabular-nums">
|
|
367
|
-
<span class="text-
|
|
368
|
-
<span v-if="cleanRate(g) !== null" class="ms-1 text-
|
|
366
|
+
<span class="text-app-success-400">{{ g.cleanPasses }}</span>
|
|
367
|
+
<span v-if="cleanRate(g) !== null" class="ms-1 text-dimmed"
|
|
369
368
|
>({{ n(cleanRate(g) ?? 0, 'percent') }})</span
|
|
370
369
|
>
|
|
371
370
|
</td>
|
|
372
371
|
<td class="py-2 pe-3 text-end tabular-nums">{{ g.attempts }}</td>
|
|
373
372
|
<td class="py-2 pe-3 text-end tabular-nums">
|
|
374
|
-
<span :class="g.helperFailures > 0 ? 'text-
|
|
373
|
+
<span :class="g.helperFailures > 0 ? 'text-app-warning-400' : ''">{{
|
|
375
374
|
g.helperFailures
|
|
376
375
|
}}</span>
|
|
377
376
|
</td>
|
|
378
377
|
<td class="py-2 text-end tabular-nums">
|
|
379
|
-
<span :class="g.exhausted > 0 ? 'text-
|
|
378
|
+
<span :class="g.exhausted > 0 ? 'text-app-error-400' : ''">{{
|
|
380
379
|
g.exhausted
|
|
381
380
|
}}</span>
|
|
382
381
|
</td>
|
|
383
382
|
</tr>
|
|
384
383
|
</tbody>
|
|
385
384
|
</table>
|
|
386
|
-
<p class="mt-3 text-[11px] leading-relaxed text-
|
|
385
|
+
<p class="mt-3 text-[11px] leading-relaxed text-dimmed">
|
|
387
386
|
{{ t('platformObservability.gates.hint') }}
|
|
388
387
|
</p>
|
|
389
388
|
</div>
|
|
@@ -392,22 +391,22 @@ watch(
|
|
|
392
391
|
<div class="grid gap-6 md:grid-cols-2">
|
|
393
392
|
<!-- Failure taxonomy -->
|
|
394
393
|
<section>
|
|
395
|
-
<h2 class="mb-2 text-xs font-semibold uppercase tracking-wide text-
|
|
394
|
+
<h2 class="mb-2 text-xs font-semibold uppercase tracking-wide text-dimmed">
|
|
396
395
|
{{ t('platformObservability.failures.title') }}
|
|
397
396
|
</h2>
|
|
398
|
-
<div class="rounded-lg border border-
|
|
399
|
-
<div v-if="!view.failures.length" class="py-4 text-center text-xs text-
|
|
397
|
+
<div class="rounded-lg border border-default bg-default/40 p-4">
|
|
398
|
+
<div v-if="!view.failures.length" class="py-4 text-center text-xs text-dimmed">
|
|
400
399
|
{{ t('platformObservability.failures.empty') }}
|
|
401
400
|
</div>
|
|
402
401
|
<ul v-else class="flex flex-col gap-2" data-testid="operator-failures">
|
|
403
402
|
<li v-for="f in view.failures" :key="f.kind" class="text-xs">
|
|
404
403
|
<div class="mb-0.5 flex items-center justify-between">
|
|
405
|
-
<span class="text-
|
|
406
|
-
<span class="tabular-nums text-
|
|
404
|
+
<span class="text-toned">{{ failureLabel(f.kind) }}</span>
|
|
405
|
+
<span class="tabular-nums text-muted">{{ f.count }}</span>
|
|
407
406
|
</div>
|
|
408
|
-
<div class="h-1.5 rounded-full bg-
|
|
407
|
+
<div class="h-1.5 rounded-full bg-elevated">
|
|
409
408
|
<div
|
|
410
|
-
class="h-1.5 rounded-full bg-
|
|
409
|
+
class="h-1.5 rounded-full bg-app-error-500/70"
|
|
411
410
|
:style="{ width: `${barPct(f.count, maxFailure)}%` }"
|
|
412
411
|
/>
|
|
413
412
|
</div>
|
|
@@ -419,47 +418,49 @@ watch(
|
|
|
419
418
|
<!-- Live depth + durations -->
|
|
420
419
|
<section class="flex flex-col gap-4">
|
|
421
420
|
<div>
|
|
422
|
-
<h2 class="mb-2 text-xs font-semibold uppercase tracking-wide text-
|
|
421
|
+
<h2 class="mb-2 text-xs font-semibold uppercase tracking-wide text-dimmed">
|
|
423
422
|
{{ t('platformObservability.live.title') }}
|
|
424
423
|
</h2>
|
|
425
424
|
<div
|
|
426
|
-
class="grid grid-cols-4 gap-2 rounded-lg border border-
|
|
425
|
+
class="grid grid-cols-4 gap-2 rounded-lg border border-default bg-default/40 p-3 text-center"
|
|
427
426
|
data-testid="operator-live"
|
|
428
427
|
>
|
|
429
428
|
<div>
|
|
430
|
-
<p class="text-lg font-semibold text-
|
|
431
|
-
<p class="text-[11px] text-
|
|
429
|
+
<p class="text-lg font-semibold text-app-info-400">{{ view.live.running }}</p>
|
|
430
|
+
<p class="text-[11px] text-dimmed">
|
|
432
431
|
{{ t('platformObservability.outcomes.running') }}
|
|
433
432
|
</p>
|
|
434
433
|
</div>
|
|
435
434
|
<div>
|
|
436
|
-
<p class="text-lg font-semibold text-
|
|
437
|
-
|
|
435
|
+
<p class="text-lg font-semibold text-app-warning-400">
|
|
436
|
+
{{ view.live.blocked }}
|
|
437
|
+
</p>
|
|
438
|
+
<p class="text-[11px] text-dimmed">
|
|
438
439
|
{{ t('platformObservability.outcomes.blocked') }}
|
|
439
440
|
</p>
|
|
440
441
|
</div>
|
|
441
442
|
<div>
|
|
442
|
-
<p class="text-lg font-semibold text-
|
|
443
|
-
<p class="text-[11px] text-
|
|
443
|
+
<p class="text-lg font-semibold text-toned">{{ view.live.paused }}</p>
|
|
444
|
+
<p class="text-[11px] text-dimmed">
|
|
444
445
|
{{ t('platformObservability.outcomes.paused') }}
|
|
445
446
|
</p>
|
|
446
447
|
</div>
|
|
447
448
|
<div>
|
|
448
|
-
<p class="text-lg font-semibold text-
|
|
449
|
-
<p class="text-[11px] text-
|
|
449
|
+
<p class="text-lg font-semibold text-toned">{{ view.live.pending }}</p>
|
|
450
|
+
<p class="text-[11px] text-dimmed">
|
|
450
451
|
{{ t('platformObservability.outcomes.pending') }}
|
|
451
452
|
</p>
|
|
452
453
|
</div>
|
|
453
454
|
</div>
|
|
454
455
|
</div>
|
|
455
456
|
<div>
|
|
456
|
-
<h2 class="mb-2 text-xs font-semibold uppercase tracking-wide text-
|
|
457
|
+
<h2 class="mb-2 text-xs font-semibold uppercase tracking-wide text-dimmed">
|
|
457
458
|
{{ t('platformObservability.durations.title') }}
|
|
458
459
|
</h2>
|
|
459
|
-
<div class="rounded-lg border border-
|
|
460
|
+
<div class="rounded-lg border border-default bg-default/40 p-3 text-sm">
|
|
460
461
|
<div
|
|
461
462
|
v-if="view.durations.count === 0"
|
|
462
|
-
class="py-2 text-center text-xs text-
|
|
463
|
+
class="py-2 text-center text-xs text-dimmed"
|
|
463
464
|
>
|
|
464
465
|
{{ t('platformObservability.durations.empty') }}
|
|
465
466
|
</div>
|
|
@@ -469,59 +470,50 @@ watch(
|
|
|
469
470
|
data-testid="operator-durations"
|
|
470
471
|
>
|
|
471
472
|
<div>
|
|
472
|
-
<dt class="text-[11px] text-
|
|
473
|
+
<dt class="text-[11px] text-dimmed">
|
|
473
474
|
{{ t('platformObservability.durations.avg') }}
|
|
474
475
|
</dt>
|
|
475
|
-
<dd class="font-semibold text-
|
|
476
|
+
<dd class="font-semibold text-highlighted">
|
|
476
477
|
{{ view.durations.avgMs == null ? '—' : formatMs(view.durations.avgMs) }}
|
|
477
478
|
</dd>
|
|
478
479
|
</div>
|
|
479
480
|
<div>
|
|
480
|
-
<dt class="text-[11px] text-
|
|
481
|
+
<dt class="text-[11px] text-dimmed">
|
|
481
482
|
{{ t('platformObservability.durations.min') }}
|
|
482
483
|
</dt>
|
|
483
|
-
<dd class="font-semibold text-
|
|
484
|
+
<dd class="font-semibold text-toned">
|
|
484
485
|
{{ view.durations.minMs == null ? '—' : formatMs(view.durations.minMs) }}
|
|
485
486
|
</dd>
|
|
486
487
|
</div>
|
|
487
488
|
<div>
|
|
488
|
-
<dt class="text-[11px] text-
|
|
489
|
+
<dt class="text-[11px] text-dimmed">
|
|
489
490
|
{{ t('platformObservability.durations.max') }}
|
|
490
491
|
</dt>
|
|
491
|
-
<dd class="font-semibold text-
|
|
492
|
+
<dd class="font-semibold text-toned">
|
|
492
493
|
{{ view.durations.maxMs == null ? '—' : formatMs(view.durations.maxMs) }}
|
|
493
494
|
</dd>
|
|
494
495
|
</div>
|
|
495
496
|
<div>
|
|
496
|
-
<dt class="text-[11px] text-
|
|
497
|
+
<dt class="text-[11px] text-dimmed">
|
|
497
498
|
{{ t('platformObservability.durations.p50') }}
|
|
498
499
|
</dt>
|
|
499
|
-
<dd
|
|
500
|
-
class="font-semibold text-slate-300"
|
|
501
|
-
data-testid="operator-duration-p50"
|
|
502
|
-
>
|
|
500
|
+
<dd class="font-semibold text-toned" data-testid="operator-duration-p50">
|
|
503
501
|
{{ view.durations.p50Ms == null ? '—' : formatMs(view.durations.p50Ms) }}
|
|
504
502
|
</dd>
|
|
505
503
|
</div>
|
|
506
504
|
<div>
|
|
507
|
-
<dt class="text-[11px] text-
|
|
505
|
+
<dt class="text-[11px] text-dimmed">
|
|
508
506
|
{{ t('platformObservability.durations.p90') }}
|
|
509
507
|
</dt>
|
|
510
|
-
<dd
|
|
511
|
-
class="font-semibold text-slate-300"
|
|
512
|
-
data-testid="operator-duration-p90"
|
|
513
|
-
>
|
|
508
|
+
<dd class="font-semibold text-toned" data-testid="operator-duration-p90">
|
|
514
509
|
{{ view.durations.p90Ms == null ? '—' : formatMs(view.durations.p90Ms) }}
|
|
515
510
|
</dd>
|
|
516
511
|
</div>
|
|
517
512
|
<div>
|
|
518
|
-
<dt class="text-[11px] text-
|
|
513
|
+
<dt class="text-[11px] text-dimmed">
|
|
519
514
|
{{ t('platformObservability.durations.p99') }}
|
|
520
515
|
</dt>
|
|
521
|
-
<dd
|
|
522
|
-
class="font-semibold text-slate-300"
|
|
523
|
-
data-testid="operator-duration-p99"
|
|
524
|
-
>
|
|
516
|
+
<dd class="font-semibold text-toned" data-testid="operator-duration-p99">
|
|
525
517
|
{{ view.durations.p99Ms == null ? '—' : formatMs(view.durations.p99Ms) }}
|
|
526
518
|
</dd>
|
|
527
519
|
</div>
|