@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
|
@@ -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-
|
|
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-
|
|
509
|
-
<div
|
|
510
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
611
|
+
<dd class="mt-0.5 tabular-nums text-default">
|
|
618
612
|
{{ runCost ?? '—' }}
|
|
619
|
-
<span class="mt-0.5 block text-[11px] text-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
639
|
+
<span class="text-app-600"> · </span>
|
|
646
640
|
<span
|
|
647
|
-
class="text-
|
|
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-
|
|
652
|
+
<span class="text-app-600"> · </span>
|
|
659
653
|
<span
|
|
660
|
-
class="text-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
772
|
-
<td class="py-1.5 pe-3 text-
|
|
773
|
-
<span :class="p.phase ? '' : 'text-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
869
|
-
:class="!c.ok ? 'border-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
937
|
+
<span v-else class="text-app-600">{{
|
|
946
938
|
c.finishReason ?? t('observability.call.ok')
|
|
947
939
|
}}</span>
|
|
948
|
-
<span class="hidden text-
|
|
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-
|
|
953
|
-
<p v-if="c.errorMessage" class="text-[12px] text-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
1120
|
-
<span v-if="s.model" class="hidden truncate text-[11px] text-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
1152
|
+
class="mb-2 rounded-lg bg-app-950/70 p-3"
|
|
1161
1153
|
>
|
|
1162
|
-
<div class="mb-1 text-[11px] text-
|
|
1163
|
-
<pre
|
|
1164
|
-
|
|
1165
|
-
|
|
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-
|
|
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-
|
|
1167
|
+
class="mb-2 rounded-lg bg-app-950/70 p-3"
|
|
1176
1168
|
>
|
|
1177
|
-
<div class="mb-1 text-[11px] text-
|
|
1169
|
+
<div class="mb-1 text-[11px] text-muted">
|
|
1178
1170
|
{{ file.title }}
|
|
1179
|
-
<span class="text-
|
|
1171
|
+
<span class="text-app-600">· {{ file.path }}</span>
|
|
1180
1172
|
</div>
|
|
1181
|
-
<pre
|
|
1182
|
-
|
|
1183
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
1266
|
+
<span class="hidden text-app-600 md:inline">{{ clock(q.createdAt) }}</span>
|
|
1275
1267
|
</div>
|
|
1276
1268
|
</li>
|
|
1277
1269
|
</ul>
|