@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
|
@@ -29,11 +29,11 @@ const VERDICT_KEYS: Record<EnvironmentProbeVerdict, string> = {
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
const VERDICT_CLASS: Record<EnvironmentProbeVerdict, string> = {
|
|
32
|
-
operable: 'text-
|
|
32
|
+
operable: 'text-app-success-300/90',
|
|
33
33
|
// Amber, not rose: the LIFECYCLE succeeded and the finding is partial. Colouring it as a
|
|
34
34
|
// failure would make it read as the run breaking rather than as the diagnostic working.
|
|
35
|
-
partially_operable: 'text-
|
|
36
|
-
inoperable: 'text-
|
|
35
|
+
partially_operable: 'text-app-warning-300/90',
|
|
36
|
+
inoperable: 'text-app-error-300/90',
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
/**
|
|
@@ -64,7 +64,7 @@ const verdictLabel = computed(() => {
|
|
|
64
64
|
return key && te(key) ? t(key) : props.report.verdict
|
|
65
65
|
})
|
|
66
66
|
|
|
67
|
-
const verdictClass = computed(() => VERDICT_CLASS[props.report.verdict] ?? 'text-
|
|
67
|
+
const verdictClass = computed(() => VERDICT_CLASS[props.report.verdict] ?? 'text-toned')
|
|
68
68
|
|
|
69
69
|
/** The icon per operation outcome. `not_attempted` is its own mark, never a failure's. */
|
|
70
70
|
function outcomeIcon(outcome: EnvironmentProbeReport['operations'][number]['outcome']): string {
|
|
@@ -74,24 +74,21 @@ function outcomeIcon(outcome: EnvironmentProbeReport['operations'][number]['outc
|
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
function outcomeClass(outcome: EnvironmentProbeReport['operations'][number]['outcome']): string {
|
|
77
|
-
if (outcome === 'succeeded') return 'text-
|
|
78
|
-
if (outcome === 'failed') return 'text-
|
|
79
|
-
return 'text-
|
|
77
|
+
if (outcome === 'succeeded') return 'text-app-success-400'
|
|
78
|
+
if (outcome === 'failed') return 'text-app-error-400'
|
|
79
|
+
return 'text-dimmed'
|
|
80
80
|
}
|
|
81
81
|
</script>
|
|
82
82
|
|
|
83
83
|
<template>
|
|
84
|
-
<div
|
|
85
|
-
class="space-y-2 rounded border border-white/5 bg-white/[0.02] p-2"
|
|
86
|
-
data-testid="env-probe-report"
|
|
87
|
-
>
|
|
84
|
+
<div class="space-y-2 rounded border border-default bg-muted p-2" data-testid="env-probe-report">
|
|
88
85
|
<p class="text-[11px] font-medium" :class="verdictClass" data-testid="env-probe-verdict">
|
|
89
86
|
{{ verdictLabel }}
|
|
90
87
|
</p>
|
|
91
88
|
|
|
92
89
|
<!-- The tallies the PLATFORM computed from the agent's per-operation judgements, including
|
|
93
90
|
how many successes were behind authentication: the count the verdict turns on. -->
|
|
94
|
-
<p class="text-[11px] text-
|
|
91
|
+
<p class="text-[11px] text-muted">
|
|
95
92
|
{{
|
|
96
93
|
t('inspector.testConfig.envProbe.counts', {
|
|
97
94
|
succeeded: report.succeeded,
|
|
@@ -104,21 +101,21 @@ function outcomeClass(outcome: EnvironmentProbeReport['operations'][number]['out
|
|
|
104
101
|
<!-- What the platform did not tell the agent: the actionable half of the report, so it comes
|
|
105
102
|
before the evidence. -->
|
|
106
103
|
<div v-if="report.missingContext.length" data-testid="env-probe-missing">
|
|
107
|
-
<p class="text-[11px] font-medium text-
|
|
104
|
+
<p class="text-[11px] font-medium text-app-warning-300/90">
|
|
108
105
|
{{ t('inspector.testConfig.envProbe.missingContext') }}
|
|
109
106
|
</p>
|
|
110
|
-
<ul class="mt-0.5 list-disc space-y-0.5 pl-4 text-[11px] text-
|
|
107
|
+
<ul class="mt-0.5 list-disc space-y-0.5 pl-4 text-[11px] text-toned">
|
|
111
108
|
<li v-for="(line, i) in report.missingContext" :key="i">{{ line }}</li>
|
|
112
109
|
</ul>
|
|
113
110
|
</div>
|
|
114
111
|
|
|
115
112
|
<div v-if="report.blockers.length" data-testid="env-probe-blockers">
|
|
116
|
-
<p class="text-[11px] font-medium text-
|
|
113
|
+
<p class="text-[11px] font-medium text-app-error-300/90">
|
|
117
114
|
{{ t('inspector.testConfig.envProbe.blockers') }}
|
|
118
115
|
</p>
|
|
119
|
-
<ul class="mt-0.5 space-y-0.5 text-[11px] text-
|
|
116
|
+
<ul class="mt-0.5 space-y-0.5 text-[11px] text-toned">
|
|
120
117
|
<li v-for="(blocker, i) in report.blockers" :key="i">
|
|
121
|
-
<span class="text-
|
|
118
|
+
<span class="text-muted">{{ failureLabel(blocker.kind) }}:</span>
|
|
122
119
|
{{ blocker.detail }}
|
|
123
120
|
</li>
|
|
124
121
|
</ul>
|
|
@@ -127,7 +124,7 @@ function outcomeClass(outcome: EnvironmentProbeReport['operations'][number]['out
|
|
|
127
124
|
<!-- The operations, as evidence for the verdict above. This is the "what was attempted" a dry
|
|
128
125
|
run exists to report: without it a verdict is an opinion. -->
|
|
129
126
|
<div v-if="report.operations.length" data-testid="env-probe-operations">
|
|
130
|
-
<p class="text-[11px] font-medium text-
|
|
127
|
+
<p class="text-[11px] font-medium text-toned">
|
|
131
128
|
{{ t('inspector.testConfig.envProbe.operations') }}
|
|
132
129
|
</p>
|
|
133
130
|
<ul class="mt-0.5 space-y-1 text-[11px]">
|
|
@@ -138,15 +135,15 @@ function outcomeClass(outcome: EnvironmentProbeReport['operations'][number]['out
|
|
|
138
135
|
:class="outcomeClass(op.outcome)"
|
|
139
136
|
/>
|
|
140
137
|
<span class="min-w-0">
|
|
141
|
-
<span class="text-
|
|
142
|
-
<span v-if="op.authenticated" class="ml-1 text-
|
|
138
|
+
<span class="text-default">{{ op.name }}</span>
|
|
139
|
+
<span v-if="op.authenticated" class="ml-1 text-dimmed">
|
|
143
140
|
{{ t('inspector.testConfig.envProbe.authenticated') }}
|
|
144
141
|
</span>
|
|
145
|
-
<span v-if="op.target" class="ml-1 font-mono text-
|
|
146
|
-
<span v-if="op.failure" class="block text-
|
|
142
|
+
<span v-if="op.target" class="ml-1 font-mono text-dimmed">{{ op.target }}</span>
|
|
143
|
+
<span v-if="op.failure" class="block text-app-error-300/70">
|
|
147
144
|
{{ failureLabel(op.failure) }}<template v-if="op.detail">: {{ op.detail }}</template>
|
|
148
145
|
</span>
|
|
149
|
-
<span v-else-if="op.detail" class="block text-
|
|
146
|
+
<span v-else-if="op.detail" class="block text-muted">{{ op.detail }}</span>
|
|
150
147
|
</span>
|
|
151
148
|
</li>
|
|
152
149
|
</ul>
|
|
@@ -154,12 +151,12 @@ function outcomeClass(outcome: EnvironmentProbeReport['operations'][number]['out
|
|
|
154
151
|
whole attempt. The two ways an operation fails to reach the list are rendered SEPARATELY
|
|
155
152
|
because they send a reader somewhere different: one says the agent reported more than is
|
|
156
153
|
shown, the other says its reply was malformed. -->
|
|
157
|
-
<p v-if="report.operationsOmitted" class="mt-1 text-[11px] text-
|
|
154
|
+
<p v-if="report.operationsOmitted" class="mt-1 text-[11px] text-dimmed">
|
|
158
155
|
{{
|
|
159
156
|
t('inspector.testConfig.envProbe.operationsOmitted', { count: report.operationsOmitted })
|
|
160
157
|
}}
|
|
161
158
|
</p>
|
|
162
|
-
<p v-if="report.operationsUnreadable" class="mt-1 text-[11px] text-
|
|
159
|
+
<p v-if="report.operationsUnreadable" class="mt-1 text-[11px] text-dimmed">
|
|
163
160
|
{{
|
|
164
161
|
t('inspector.testConfig.envProbe.operationsUnreadable', {
|
|
165
162
|
count: report.operationsUnreadable,
|
|
@@ -168,8 +165,8 @@ function outcomeClass(outcome: EnvironmentProbeReport['operations'][number]['out
|
|
|
168
165
|
</p>
|
|
169
166
|
</div>
|
|
170
167
|
|
|
171
|
-
<p v-if="report.summary" class="text-[11px] text-
|
|
172
|
-
<p v-if="report.model" class="text-[11px] text-
|
|
168
|
+
<p v-if="report.summary" class="text-[11px] text-muted">{{ report.summary }}</p>
|
|
169
|
+
<p v-if="report.model" class="text-[11px] text-app-600">
|
|
173
170
|
{{ t('inspector.testConfig.envProbe.model', { model: report.model }) }}
|
|
174
171
|
</p>
|
|
175
172
|
</div>
|
|
@@ -52,34 +52,30 @@ const groups = computed(() => {
|
|
|
52
52
|
default-open
|
|
53
53
|
>
|
|
54
54
|
<template #actions>
|
|
55
|
-
<span class="text-[11px] text-
|
|
55
|
+
<span class="text-[11px] text-dimmed">{{
|
|
56
56
|
t('inspector.epicChildren.doneCount', { done, total: members.length })
|
|
57
57
|
}}</span>
|
|
58
58
|
</template>
|
|
59
59
|
|
|
60
|
-
<div v-if="members.length === 0" class="text-[11px] text-
|
|
60
|
+
<div v-if="members.length === 0" class="text-[11px] text-dimmed">
|
|
61
61
|
{{ t('inspector.epicChildren.empty') }}
|
|
62
62
|
</div>
|
|
63
63
|
|
|
64
64
|
<div v-else class="space-y-2">
|
|
65
|
-
<div
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
class="rounded-md border border-slate-700/60 p-2"
|
|
69
|
-
>
|
|
70
|
-
<div class="mb-1 flex items-center gap-1 text-[11px] font-medium text-slate-300">
|
|
71
|
-
<UIcon name="i-lucide-box" class="h-3 w-3 text-slate-500" />
|
|
65
|
+
<div v-for="(group, gi) in groups" :key="gi" class="rounded-md border border-muted/60 p-2">
|
|
66
|
+
<div class="mb-1 flex items-center gap-1 text-[11px] font-medium text-toned">
|
|
67
|
+
<UIcon name="i-lucide-box" class="h-3 w-3 text-dimmed" />
|
|
72
68
|
{{ group.service?.title ?? t('inspector.epicChildren.unassigned') }}
|
|
73
69
|
</div>
|
|
74
70
|
<div v-for="(mod, mi) in [...group.modules.values()]" :key="mi" class="ps-1">
|
|
75
|
-
<div v-if="mod.module" class="text-[10px] uppercase tracking-wide text-
|
|
71
|
+
<div v-if="mod.module" class="text-[10px] uppercase tracking-wide text-dimmed">
|
|
76
72
|
{{ mod.module.title }}
|
|
77
73
|
</div>
|
|
78
74
|
<button
|
|
79
75
|
v-for="task in mod.tasks"
|
|
80
76
|
:key="task.id"
|
|
81
77
|
type="button"
|
|
82
|
-
class="flex w-full items-center gap-1.5 rounded px-1 py-0.5 text-start text-xs text-
|
|
78
|
+
class="flex w-full items-center gap-1.5 rounded px-1 py-0.5 text-start text-xs text-default hover:bg-elevated"
|
|
83
79
|
@click="ui.select(task.id)"
|
|
84
80
|
>
|
|
85
81
|
<span
|
|
@@ -87,7 +83,7 @@ const groups = computed(() => {
|
|
|
87
83
|
:style="{ backgroundColor: STATUS_META[task.status].color }"
|
|
88
84
|
/>
|
|
89
85
|
<span class="truncate">{{ task.title }}</span>
|
|
90
|
-
<span class="ms-auto shrink-0 text-[10px] text-
|
|
86
|
+
<span class="ms-auto shrink-0 text-[10px] text-dimmed">
|
|
91
87
|
{{ STATUS_META[task.status].label }}
|
|
92
88
|
</span>
|
|
93
89
|
</button>
|
|
@@ -66,13 +66,13 @@ const rows = computed(() => {
|
|
|
66
66
|
|
|
67
67
|
<template>
|
|
68
68
|
<div v-if="rows.length || duplicates.length" class="space-y-1.5" data-testid="frontend-resolved">
|
|
69
|
-
<div class="text-[11px] font-semibold uppercase tracking-wide text-
|
|
69
|
+
<div class="text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
70
70
|
{{ t('inspector.frontendConfig.resolved.title') }}
|
|
71
71
|
</div>
|
|
72
72
|
|
|
73
73
|
<p
|
|
74
74
|
v-if="duplicates.length"
|
|
75
|
-
class="text-[11px] leading-snug text-
|
|
75
|
+
class="text-[11px] leading-snug text-app-warning-300/80"
|
|
76
76
|
data-testid="frontend-resolved-duplicates"
|
|
77
77
|
>
|
|
78
78
|
{{ t('inspector.frontendConfig.resolved.duplicateWarning', { vars: duplicates.join(', ') }) }}
|
|
@@ -88,21 +88,21 @@ const rows = computed(() => {
|
|
|
88
88
|
<span
|
|
89
89
|
class="mt-1 h-1.5 w-1.5 shrink-0 rounded-full"
|
|
90
90
|
:class="{
|
|
91
|
-
'bg-
|
|
92
|
-
'bg-
|
|
93
|
-
'bg-
|
|
91
|
+
'bg-app-success-400': row.kind === 'live',
|
|
92
|
+
'bg-app-warning-400': row.kind === 'service-offline',
|
|
93
|
+
'bg-app-500': row.kind === 'mock',
|
|
94
94
|
}"
|
|
95
95
|
/>
|
|
96
|
-
<span class="font-mono text-
|
|
97
|
-
<span class="text-
|
|
96
|
+
<span class="font-mono text-toned">{{ row.envVar }}</span>
|
|
97
|
+
<span class="text-app-600">→</span>
|
|
98
98
|
<template v-if="row.kind === 'live'">
|
|
99
|
-
<span class="truncate font-mono text-
|
|
100
|
-
<span v-if="row.serviceTitle" class="text-
|
|
99
|
+
<span class="truncate font-mono text-app-success-300/90">{{ row.serviceUrl }}</span>
|
|
100
|
+
<span v-if="row.serviceTitle" class="text-dimmed">({{ row.serviceTitle }})</span>
|
|
101
101
|
</template>
|
|
102
|
-
<span v-else-if="row.kind === 'service-offline'" class="text-
|
|
102
|
+
<span v-else-if="row.kind === 'service-offline'" class="text-app-warning-300/80">
|
|
103
103
|
{{ t('inspector.frontendConfig.resolved.serviceOffline', { service: row.serviceTitle }) }}
|
|
104
104
|
</span>
|
|
105
|
-
<span v-else class="text-
|
|
105
|
+
<span v-else class="text-dimmed">
|
|
106
106
|
{{ t('inspector.frontendConfig.resolved.mock') }}
|
|
107
107
|
</span>
|
|
108
108
|
</li>
|
|
@@ -229,13 +229,11 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
229
229
|
persisted until Apply. Only shown when the frame is linked to a repo. -->
|
|
230
230
|
<div
|
|
231
231
|
v-if="repoLink"
|
|
232
|
-
class="space-y-2 rounded border border-
|
|
232
|
+
class="space-y-2 rounded border border-default bg-default/40 p-2"
|
|
233
233
|
data-testid="frontend-detect"
|
|
234
234
|
>
|
|
235
235
|
<div class="flex items-center justify-between gap-2">
|
|
236
|
-
<span class="text-[11px] text-
|
|
237
|
-
t('inspector.frontendConfig.detect.title')
|
|
238
|
-
}}</span>
|
|
236
|
+
<span class="text-[11px] text-muted">{{ t('inspector.frontendConfig.detect.title') }}</span>
|
|
239
237
|
<UButton
|
|
240
238
|
size="xs"
|
|
241
239
|
variant="soft"
|
|
@@ -248,16 +246,16 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
248
246
|
{{ t('inspector.frontendConfig.detect.button') }}
|
|
249
247
|
</UButton>
|
|
250
248
|
</div>
|
|
251
|
-
<p class="text-[11px] leading-snug text-
|
|
249
|
+
<p class="text-[11px] leading-snug text-dimmed">
|
|
252
250
|
{{ t('inspector.frontendConfig.detect.hint') }}
|
|
253
251
|
</p>
|
|
254
252
|
|
|
255
|
-
<p v-if="detectError" class="text-[11px] text-
|
|
253
|
+
<p v-if="detectError" class="text-[11px] text-app-error-300/80">
|
|
256
254
|
{{ detectError }}
|
|
257
255
|
</p>
|
|
258
256
|
|
|
259
257
|
<template v-if="detectResult && !detecting">
|
|
260
|
-
<p v-if="!detectResult.detected" class="text-[11px] text-
|
|
258
|
+
<p v-if="!detectResult.detected" class="text-[11px] text-app-warning-300/80">
|
|
261
259
|
{{ t('inspector.frontendConfig.detect.none') }}
|
|
262
260
|
</p>
|
|
263
261
|
|
|
@@ -265,9 +263,13 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
265
263
|
<li
|
|
266
264
|
v-for="(n, i) in detectResult.notes"
|
|
267
265
|
:key="i"
|
|
268
|
-
class="flex items-start gap-1.5 text-[11px] leading-snug text-
|
|
266
|
+
class="flex items-start gap-1.5 text-[11px] leading-snug text-dimmed"
|
|
269
267
|
>
|
|
270
|
-
<span
|
|
268
|
+
<span
|
|
269
|
+
:class="
|
|
270
|
+
n.confidence === 'high' ? 'text-app-success-400/70' : 'text-app-warning-400/70'
|
|
271
|
+
"
|
|
272
|
+
>
|
|
271
273
|
{{
|
|
272
274
|
n.confidence === 'high'
|
|
273
275
|
? t('inspector.frontendConfig.detect.confidenceHigh')
|
|
@@ -308,7 +310,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
308
310
|
<!-- Build: package manager + frontend directory + install command + build script + output dir -->
|
|
309
311
|
<InspectorSection v-model:open="showBuild" :title="t('inspector.frontendConfig.groups.build')">
|
|
310
312
|
<div class="space-y-1">
|
|
311
|
-
<span class="text-[11px] text-
|
|
313
|
+
<span class="text-[11px] text-muted">{{
|
|
312
314
|
t('inspector.frontendConfig.packageManager')
|
|
313
315
|
}}</span>
|
|
314
316
|
<div class="flex flex-wrap gap-1">
|
|
@@ -326,9 +328,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
326
328
|
</div>
|
|
327
329
|
|
|
328
330
|
<div class="space-y-1">
|
|
329
|
-
<label class="text-[11px] text-
|
|
330
|
-
t('inspector.frontendConfig.directory')
|
|
331
|
-
}}</label>
|
|
331
|
+
<label class="text-[11px] text-muted">{{ t('inspector.frontendConfig.directory') }}</label>
|
|
332
332
|
<UInput
|
|
333
333
|
:model-value="config.directory ?? ''"
|
|
334
334
|
size="xs"
|
|
@@ -340,13 +340,13 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
340
340
|
(e: KeyboardEvent) => saveText('directory', (e.target as HTMLInputElement).value)
|
|
341
341
|
"
|
|
342
342
|
/>
|
|
343
|
-
<p class="text-[11px] leading-snug text-
|
|
343
|
+
<p class="text-[11px] leading-snug text-dimmed">
|
|
344
344
|
{{ t('inspector.frontendConfig.directoryHint') }}
|
|
345
345
|
</p>
|
|
346
346
|
</div>
|
|
347
347
|
|
|
348
348
|
<div class="space-y-1">
|
|
349
|
-
<label class="text-[11px] text-
|
|
349
|
+
<label class="text-[11px] text-muted">{{
|
|
350
350
|
t('inspector.frontendConfig.installCommand')
|
|
351
351
|
}}</label>
|
|
352
352
|
<UInput
|
|
@@ -366,7 +366,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
366
366
|
|
|
367
367
|
<div class="grid grid-cols-2 gap-2">
|
|
368
368
|
<div class="space-y-1">
|
|
369
|
-
<label class="text-[11px] text-
|
|
369
|
+
<label class="text-[11px] text-muted">{{
|
|
370
370
|
t('inspector.frontendConfig.buildScript')
|
|
371
371
|
}}</label>
|
|
372
372
|
<UInput
|
|
@@ -382,7 +382,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
382
382
|
/>
|
|
383
383
|
</div>
|
|
384
384
|
<div class="space-y-1">
|
|
385
|
-
<label class="text-[11px] text-
|
|
385
|
+
<label class="text-[11px] text-muted">{{
|
|
386
386
|
t('inspector.frontendConfig.outputDir')
|
|
387
387
|
}}</label>
|
|
388
388
|
<UInput
|
|
@@ -403,9 +403,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
403
403
|
<!-- Serve: mode (static vs command) + serve script (command mode) + port -->
|
|
404
404
|
<InspectorSection v-model:open="showServe" :title="t('inspector.frontendConfig.groups.serve')">
|
|
405
405
|
<div class="space-y-1">
|
|
406
|
-
<span class="text-[11px] text-
|
|
407
|
-
t('inspector.frontendConfig.serveMode')
|
|
408
|
-
}}</span>
|
|
406
|
+
<span class="text-[11px] text-muted">{{ t('inspector.frontendConfig.serveMode') }}</span>
|
|
409
407
|
<div class="flex flex-wrap gap-1">
|
|
410
408
|
<UButton
|
|
411
409
|
:color="serveMode === 'static' ? 'primary' : 'neutral'"
|
|
@@ -425,21 +423,21 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
425
423
|
</UButton>
|
|
426
424
|
</div>
|
|
427
425
|
<!-- Explain each mode, and disambiguate from the separate envInjection axis. -->
|
|
428
|
-
<p class="text-[11px] leading-snug text-
|
|
429
|
-
<span class="text-
|
|
426
|
+
<p class="text-[11px] leading-snug text-dimmed">
|
|
427
|
+
<span class="text-muted">{{ t('inspector.frontendConfig.serveStatic') }}:</span>
|
|
430
428
|
{{ t('inspector.frontendConfig.serveStaticDesc') }}
|
|
431
429
|
</p>
|
|
432
|
-
<p class="text-[11px] leading-snug text-
|
|
433
|
-
<span class="text-
|
|
430
|
+
<p class="text-[11px] leading-snug text-dimmed">
|
|
431
|
+
<span class="text-muted">{{ t('inspector.frontendConfig.serveCommand') }}:</span>
|
|
434
432
|
{{ t('inspector.frontendConfig.serveCommandDesc') }}
|
|
435
433
|
</p>
|
|
436
|
-
<p class="text-[11px] leading-snug text-
|
|
434
|
+
<p class="text-[11px] leading-snug text-dimmed/80">
|
|
437
435
|
{{ t('inspector.frontendConfig.serveEnvAxisNote') }}
|
|
438
436
|
</p>
|
|
439
437
|
</div>
|
|
440
438
|
|
|
441
439
|
<div v-if="serveMode === 'command'" class="space-y-1">
|
|
442
|
-
<label class="text-[11px] text-
|
|
440
|
+
<label class="text-[11px] text-muted">{{
|
|
443
441
|
t('inspector.frontendConfig.serveScript')
|
|
444
442
|
}}</label>
|
|
445
443
|
<UInput
|
|
@@ -456,9 +454,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
456
454
|
</div>
|
|
457
455
|
|
|
458
456
|
<div class="space-y-1">
|
|
459
|
-
<label class="text-[11px] text-
|
|
460
|
-
t('inspector.frontendConfig.servePort')
|
|
461
|
-
}}</label>
|
|
457
|
+
<label class="text-[11px] text-muted">{{ t('inspector.frontendConfig.servePort') }}</label>
|
|
462
458
|
<UInput
|
|
463
459
|
:model-value="config.servePort != null ? String(config.servePort) : ''"
|
|
464
460
|
type="number"
|
|
@@ -479,7 +475,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
479
475
|
:title="t('inspector.frontendConfig.groups.mocking')"
|
|
480
476
|
>
|
|
481
477
|
<div class="space-y-1">
|
|
482
|
-
<label class="text-[11px] text-
|
|
478
|
+
<label class="text-[11px] text-muted">{{
|
|
483
479
|
t('inspector.frontendConfig.mockMappingsPath')
|
|
484
480
|
}}</label>
|
|
485
481
|
<UInput
|
|
@@ -495,7 +491,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
495
491
|
(e: KeyboardEvent) => saveText('mockMappingsPath', (e.target as HTMLInputElement).value)
|
|
496
492
|
"
|
|
497
493
|
/>
|
|
498
|
-
<p class="text-[11px] leading-snug text-
|
|
494
|
+
<p class="text-[11px] leading-snug text-dimmed">
|
|
499
495
|
{{ t('inspector.frontendConfig.mockMappingsHint') }}
|
|
500
496
|
</p>
|
|
501
497
|
</div>
|
|
@@ -525,7 +521,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
525
521
|
{{ t('inspector.frontendConfig.envRuntime') }}
|
|
526
522
|
</UButton>
|
|
527
523
|
</div>
|
|
528
|
-
<p class="text-[11px] leading-snug text-
|
|
524
|
+
<p class="text-[11px] leading-snug text-dimmed">
|
|
529
525
|
{{ t('inspector.frontendConfig.envInjectionHint') }}
|
|
530
526
|
</p>
|
|
531
527
|
</div>
|
|
@@ -578,14 +574,14 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
578
574
|
/>
|
|
579
575
|
</div>
|
|
580
576
|
</div>
|
|
581
|
-
<div v-else class="text-[11px] text-
|
|
577
|
+
<div v-else class="text-[11px] text-dimmed">
|
|
582
578
|
{{ t('inspector.frontendConfig.bindings.empty') }}
|
|
583
579
|
</div>
|
|
584
580
|
|
|
585
581
|
<!-- How the bindings resolve RIGHT NOW: each env var → a bound service's live ephemeral
|
|
586
582
|
URL, or WireMock — plus the duplicate-env-var warning. The same view a UI-test run
|
|
587
583
|
would resolve against (shared helpers), so what you see is what a run will drive. -->
|
|
588
|
-
<div class="border-t border-
|
|
584
|
+
<div class="border-t border-default/60 pt-2">
|
|
589
585
|
<FrontendBindingsResolved :config="config" />
|
|
590
586
|
</div>
|
|
591
587
|
</div>
|
|
@@ -607,7 +603,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
607
603
|
save({ previewEnabled: v === true ? true : undefined })
|
|
608
604
|
"
|
|
609
605
|
/>
|
|
610
|
-
<p class="mt-1 text-[11px] leading-snug text-
|
|
606
|
+
<p class="mt-1 text-[11px] leading-snug text-dimmed">
|
|
611
607
|
{{
|
|
612
608
|
previewSupported
|
|
613
609
|
? t('inspector.frontendConfig.previewHint')
|
|
@@ -621,10 +617,10 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
621
617
|
<span
|
|
622
618
|
class="text-[11px] font-medium"
|
|
623
619
|
:class="{
|
|
624
|
-
'text-
|
|
625
|
-
'text-
|
|
626
|
-
'text-
|
|
627
|
-
'text-
|
|
620
|
+
'text-app-success-400': previewStatus === 'ready',
|
|
621
|
+
'text-app-warning-400': previewStatus === 'starting',
|
|
622
|
+
'text-app-error-400': previewStatus === 'failed',
|
|
623
|
+
'text-muted': previewStatus === 'stopped',
|
|
628
624
|
}"
|
|
629
625
|
data-testid="preview-status"
|
|
630
626
|
>
|
|
@@ -675,7 +671,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
675
671
|
|
|
676
672
|
<p
|
|
677
673
|
v-if="previewStatus === 'failed' && previewState?.error"
|
|
678
|
-
class="text-[11px] leading-snug text-
|
|
674
|
+
class="text-[11px] leading-snug text-app-error-400"
|
|
679
675
|
data-testid="preview-error"
|
|
680
676
|
>
|
|
681
677
|
{{ previewState.error }}
|
|
@@ -683,7 +679,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
683
679
|
|
|
684
680
|
<p
|
|
685
681
|
v-if="previewRequestError"
|
|
686
|
-
class="text-[11px] leading-snug text-
|
|
682
|
+
class="text-[11px] leading-snug text-app-error-400"
|
|
687
683
|
data-testid="preview-request-error"
|
|
688
684
|
>
|
|
689
685
|
{{ previewRequestError }}
|
|
@@ -52,12 +52,12 @@ function control(action: 'pause' | 'resume' | 'cancel') {
|
|
|
52
52
|
<UBadge color="primary" variant="subtle" size="sm">
|
|
53
53
|
{{ t(INITIATIVE_STATUS_LABEL_KEYS[status]) }}
|
|
54
54
|
</UBadge>
|
|
55
|
-
<span v-if="progress" class="text-[11px] text-
|
|
55
|
+
<span v-if="progress" class="text-[11px] text-muted">
|
|
56
56
|
{{ t('initiative.card.progress', { done: progress.settled, total: progress.total }) }}
|
|
57
57
|
</span>
|
|
58
58
|
</div>
|
|
59
59
|
|
|
60
|
-
<p v-if="initiative?.goal" class="whitespace-pre-wrap text-[12px] text-
|
|
60
|
+
<p v-if="initiative?.goal" class="whitespace-pre-wrap text-[12px] text-toned">
|
|
61
61
|
{{ initiative.goal }}
|
|
62
62
|
</p>
|
|
63
63
|
|
|
@@ -165,7 +165,7 @@ function control(action: 'pause' | 'resume' | 'cancel') {
|
|
|
165
165
|
</UButton>
|
|
166
166
|
</div>
|
|
167
167
|
|
|
168
|
-
<p class="text-[11px] text-
|
|
168
|
+
<p class="text-[11px] text-dimmed">
|
|
169
169
|
{{ t('initiative.inspector.hint') }}
|
|
170
170
|
</p>
|
|
171
171
|
</div>
|
|
@@ -24,26 +24,26 @@ if (props.defaultOpen) open.value = true
|
|
|
24
24
|
</script>
|
|
25
25
|
|
|
26
26
|
<template>
|
|
27
|
-
<section class="border-t border-
|
|
27
|
+
<section class="border-t border-default pt-2" data-testid="inspector-section">
|
|
28
28
|
<div class="flex items-center gap-1.5">
|
|
29
29
|
<button
|
|
30
30
|
type="button"
|
|
31
|
-
class="flex min-w-0 flex-1 items-center gap-1.5 text-start text-[11px] font-semibold uppercase tracking-wide text-
|
|
31
|
+
class="flex min-w-0 flex-1 items-center gap-1.5 text-start text-[11px] font-semibold uppercase tracking-wide text-muted hover:text-default"
|
|
32
32
|
:aria-expanded="open"
|
|
33
33
|
data-testid="inspector-section-toggle"
|
|
34
34
|
@click="open = !open"
|
|
35
35
|
>
|
|
36
36
|
<UIcon
|
|
37
37
|
:name="open ? 'i-lucide-chevron-down' : 'i-lucide-chevron-right'"
|
|
38
|
-
class="h-3.5 w-3.5 shrink-0 text-
|
|
38
|
+
class="h-3.5 w-3.5 shrink-0 text-dimmed"
|
|
39
39
|
/>
|
|
40
40
|
<UIcon v-if="icon" :name="icon" class="h-3.5 w-3.5 shrink-0" />
|
|
41
41
|
<span class="truncate">{{ title }}</span>
|
|
42
|
-
<span v-if="count" class="font-normal normal-case text-
|
|
42
|
+
<span v-if="count" class="font-normal normal-case text-dimmed">({{ count }})</span>
|
|
43
43
|
<UIcon
|
|
44
44
|
v-if="warning"
|
|
45
45
|
name="i-lucide-triangle-alert"
|
|
46
|
-
class="h-3.5 w-3.5 shrink-0 text-
|
|
46
|
+
class="h-3.5 w-3.5 shrink-0 text-app-warning-400"
|
|
47
47
|
/>
|
|
48
48
|
</button>
|
|
49
49
|
<!-- An action ("+", attach, menu) mutates the body list, so expand (never collapse)
|
|
@@ -53,7 +53,7 @@ if (props.defaultOpen) open.value = true
|
|
|
53
53
|
</div>
|
|
54
54
|
</div>
|
|
55
55
|
<div v-if="open" class="mt-2 space-y-3">
|
|
56
|
-
<p v-if="hint" class="text-[11px] leading-snug text-
|
|
56
|
+
<p v-if="hint" class="text-[11px] leading-snug text-dimmed">{{ hint }}</p>
|
|
57
57
|
<slot />
|
|
58
58
|
</div>
|
|
59
59
|
</section>
|
|
@@ -103,10 +103,10 @@ async function runNow() {
|
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
const RUN_COLOR: Record<string, string> = {
|
|
106
|
-
running: 'text-
|
|
107
|
-
done: 'text-
|
|
108
|
-
failed: 'text-
|
|
109
|
-
skipped: 'text-
|
|
106
|
+
running: 'text-app-warning-400',
|
|
107
|
+
done: 'text-app-success-400',
|
|
108
|
+
failed: 'text-app-error-400',
|
|
109
|
+
skipped: 'text-dimmed',
|
|
110
110
|
}
|
|
111
111
|
const RUN_STATUS_KEYS: Record<string, string> = {
|
|
112
112
|
running: 'inspector.recurring.runStatus.running',
|
|
@@ -123,13 +123,10 @@ function fmtTime(ms: number) {
|
|
|
123
123
|
</script>
|
|
124
124
|
|
|
125
125
|
<template>
|
|
126
|
-
<div
|
|
127
|
-
v-if="schedule"
|
|
128
|
-
class="space-y-2 rounded-lg border border-indigo-900/50 bg-indigo-950/20 p-3"
|
|
129
|
-
>
|
|
126
|
+
<div v-if="schedule" class="space-y-2 rounded-lg border border-primary/50 bg-primary/10 p-3">
|
|
130
127
|
<div class="flex items-center justify-between">
|
|
131
128
|
<span
|
|
132
|
-
class="flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-
|
|
129
|
+
class="flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-primary"
|
|
133
130
|
>
|
|
134
131
|
<UIcon name="i-lucide-repeat" class="h-3.5 w-3.5" />
|
|
135
132
|
{{ t('inspector.recurring.title') }}
|
|
@@ -149,13 +146,13 @@ function fmtTime(ms: number) {
|
|
|
149
146
|
</UBadge>
|
|
150
147
|
</div>
|
|
151
148
|
|
|
152
|
-
<p class="text-[11px] text-
|
|
153
|
-
<span class="text-
|
|
149
|
+
<p class="text-[11px] text-muted">
|
|
150
|
+
<span class="text-toned">{{ pipelineName }}</span>
|
|
154
151
|
</p>
|
|
155
152
|
|
|
156
153
|
<!-- On-demand: no cadence, no pause/resume — it fires only when a person triggers it. -->
|
|
157
154
|
<template v-if="schedule.onDemand">
|
|
158
|
-
<p class="text-[11px] text-
|
|
155
|
+
<p class="text-[11px] text-dimmed">{{ t('inspector.recurring.onDemandHint') }}</p>
|
|
159
156
|
<div class="flex flex-wrap gap-1.5 pt-1">
|
|
160
157
|
<UButton size="xs" variant="soft" icon="i-lucide-play" :loading="busy" @click="runNow">
|
|
161
158
|
{{ t('inspector.recurring.runNow') }}
|
|
@@ -164,8 +161,8 @@ function fmtTime(ms: number) {
|
|
|
164
161
|
</template>
|
|
165
162
|
|
|
166
163
|
<template v-else-if="!editing">
|
|
167
|
-
<p class="text-[11px] text-
|
|
168
|
-
<p class="text-[11px] text-
|
|
164
|
+
<p class="text-[11px] text-muted">{{ describeCadence(schedule.recurrence) }}</p>
|
|
165
|
+
<p class="text-[11px] text-dimmed">
|
|
169
166
|
{{ t('inspector.recurring.nextRun', { time: fmtTime(schedule.nextRunAt) }) }}
|
|
170
167
|
</p>
|
|
171
168
|
<div class="flex flex-wrap gap-1.5 pt-1">
|
|
@@ -215,16 +212,16 @@ function fmtTime(ms: number) {
|
|
|
215
212
|
</template>
|
|
216
213
|
|
|
217
214
|
<!-- run history -->
|
|
218
|
-
<div v-if="runs.length" class="space-y-1 border-t border-
|
|
219
|
-
<span class="text-[10px] font-semibold uppercase tracking-wide text-
|
|
215
|
+
<div v-if="runs.length" class="space-y-1 border-t border-default pt-2">
|
|
216
|
+
<span class="text-[10px] font-semibold uppercase tracking-wide text-dimmed">
|
|
220
217
|
{{ t('inspector.recurring.recentRuns') }}
|
|
221
218
|
</span>
|
|
222
219
|
<div v-for="run in runs" :key="run.id" class="flex items-center gap-2 text-[11px]">
|
|
223
|
-
<span :class="RUN_COLOR[run.status] ?? 'text-
|
|
220
|
+
<span :class="RUN_COLOR[run.status] ?? 'text-muted'" class="w-14 shrink-0">
|
|
224
221
|
{{ runStatusLabel(run.status) }}
|
|
225
222
|
</span>
|
|
226
|
-
<span class="truncate text-
|
|
227
|
-
<span v-if="run.outcome" class="ms-auto truncate text-
|
|
223
|
+
<span class="truncate text-dimmed">{{ fmtTime(run.startedAt) }}</span>
|
|
224
|
+
<span v-if="run.outcome" class="ms-auto truncate text-dimmed">{{ run.outcome }}</span>
|
|
228
225
|
</div>
|
|
229
226
|
</div>
|
|
230
227
|
</div>
|
|
@@ -135,12 +135,12 @@ const usedBy = computed(() =>
|
|
|
135
135
|
/>
|
|
136
136
|
</div>
|
|
137
137
|
</div>
|
|
138
|
-
<div v-else class="text-[11px] text-
|
|
138
|
+
<div v-else class="text-[11px] text-dimmed">
|
|
139
139
|
{{ t('inspector.serviceConnections.empty') }}
|
|
140
140
|
</div>
|
|
141
141
|
|
|
142
142
|
<div v-if="usedBy.length" class="space-y-1" data-testid="service-connections-used-by">
|
|
143
|
-
<span class="text-[11px] text-
|
|
143
|
+
<span class="text-[11px] text-muted">{{ t('inspector.serviceConnections.usedBy') }}</span>
|
|
144
144
|
<div class="flex flex-wrap gap-1">
|
|
145
145
|
<UBadge v-for="f in usedBy" :key="f.id" size="sm" variant="soft" color="neutral">
|
|
146
146
|
{{ f.title || f.id }}
|