@cat-factory/app 0.308.0 → 0.310.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 +32 -2
- package/app/assets/css/main.css +22 -0
- package/app/assets/css/prose.css +4 -4
- package/app/assets/css/type.css +24 -0
- package/app/components/assistant/AssistantModal.vue +8 -6
- package/app/components/auth/BackendMisconfiguredScreen.vue +4 -3
- package/app/components/auth/LoginScreen.vue +40 -26
- package/app/components/auth/ResetPasswordScreen.vue +9 -4
- package/app/components/auth/UserMenu.vue +5 -4
- package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +48 -37
- package/app/components/binaryOutput/BinaryOutputReport.vue +10 -14
- package/app/components/binaryOutput/StoredAssetView.vue +13 -11
- package/app/components/board/AddTaskModal.vue +30 -27
- package/app/components/board/AgentFailureCard.vue +21 -18
- package/app/components/board/AgentFailureHistory.vue +18 -9
- package/app/components/board/CreateInitiativeModal.vue +7 -6
- package/app/components/board/FailureDetail.vue +22 -12
- package/app/components/board/FailureHistoryList.vue +5 -5
- package/app/components/board/RecurringPipelineModal.vue +12 -11
- package/app/components/board/ReviewFrictionDialog.vue +8 -6
- package/app/components/board/StepExecutionHistory.vue +8 -8
- package/app/components/board/nodes/AgentChip.vue +1 -1
- package/app/components/board/nodes/BlockNode.vue +25 -24
- package/app/components/board/nodes/DecisionBadge.vue +4 -3
- package/app/components/board/nodes/EpicNode.vue +4 -4
- package/app/components/board/nodes/FrameSwimlanes.vue +8 -10
- package/app/components/board/nodes/InitiativeCard.vue +4 -4
- package/app/components/board/nodes/LaneGroup.vue +3 -5
- package/app/components/board/nodes/TaskCard.vue +20 -15
- package/app/components/board/nodes/TaskLane.vue +3 -3
- package/app/components/board/nodes/TaskPipelineMini.vue +21 -18
- package/app/components/bootstrap/AdoptionReviewModal.vue +36 -26
- package/app/components/bootstrap/BootstrapModal.vue +14 -13
- package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
- package/app/components/brainstorm/BrainstormWindow.vue +13 -10
- package/app/components/bugFishing/BugFishingWindow.vue +81 -58
- package/app/components/clarity/ClarityReviewWindow.vue +13 -10
- package/app/components/common/AsyncViewError.vue +1 -1
- package/app/components/common/ClarificationItem.vue +6 -6
- package/app/components/common/CopyButton.vue +12 -11
- package/app/components/common/DescriptorFields.vue +1 -1
- package/app/components/common/EmptyState.vue +1 -1
- package/app/components/common/IconButton.vue +34 -9
- package/app/components/common/InterviewGateNotice.vue +4 -4
- package/app/components/common/MarkdownProse.vue +8 -2
- package/app/components/common/SectionLabel.vue +38 -0
- package/app/components/consensus/ConsensusSessionWindow.vue +10 -9
- package/app/components/context/ContextAttachmentFields.vue +32 -20
- package/app/components/docs/DocInterviewWindow.vue +10 -9
- package/app/components/documents/ContextDocumentPicker.vue +22 -21
- package/app/components/documents/DocumentImportModal.vue +7 -5
- package/app/components/documents/DocumentOriginLink.vue +12 -9
- package/app/components/documents/DocumentSourceConnectModal.vue +2 -2
- package/app/components/documents/DocumentSyncState.vue +4 -4
- package/app/components/documents/DocumentTemplatesModal.vue +5 -4
- package/app/components/documents/RepoContextDocPicker.vue +7 -9
- package/app/components/documents/StartFromDesignModal.vue +4 -4
- package/app/components/documents/TaskContextDocs.vue +1 -1
- package/app/components/environments/EnvSetupStepper.vue +3 -3
- package/app/components/environments/EnvironmentStatusPanel.vue +15 -13
- package/app/components/environments/steps/EnvPreflightStep.vue +8 -8
- package/app/components/environments/steps/EnvReviewStep.vue +23 -22
- package/app/components/environments/steps/EnvSaveStep.vue +5 -5
- package/app/components/focus/BlockFocusView.vue +11 -10
- package/app/components/followUp/FollowUpWindow.vue +18 -15
- package/app/components/forkDecision/ForkDecisionWindow.vue +85 -97
- package/app/components/foundational/FoundationalContractSummary.vue +2 -2
- package/app/components/foundational/FoundationalServiceCatalogList.vue +6 -5
- package/app/components/foundational/FoundationalServiceRegistry.vue +10 -9
- package/app/components/foundational/FoundationalServiceSources.vue +7 -6
- package/app/components/foundational/FoundationalSuppressions.vue +2 -2
- package/app/components/fragments/FragmentLibraryManager.vue +8 -7
- package/app/components/fragments/FragmentSelector.vue +22 -20
- package/app/components/gates/GateFailingCheckList.vue +7 -6
- package/app/components/gates/GateResultView.vue +55 -49
- package/app/components/github/AddServiceFromRepoModal.vue +16 -11
- package/app/components/github/BranchProtectionPreflight.vue +5 -5
- package/app/components/github/GitHubConnect.vue +5 -3
- package/app/components/github/GitHubOnboarding.vue +7 -2
- package/app/components/github/GitHubPanel.vue +23 -19
- package/app/components/github/RepoTreeBrowser.vue +16 -13
- package/app/components/humanTest/HumanTestWindow.vue +29 -24
- package/app/components/initiative/InitiativePlanNotice.vue +3 -3
- package/app/components/initiative/InitiativePlanReview.vue +46 -38
- package/app/components/initiative/InitiativePlanningWindow.vue +5 -5
- package/app/components/initiative/InitiativeTrackerWindow.vue +213 -165
- package/app/components/judge/JudgeResultView.vue +28 -27
- package/app/components/kaizen/KaizenPanel.vue +70 -56
- package/app/components/kaizen/KaizenStepStatus.vue +7 -6
- package/app/components/layout/AccountAuditLog.vue +1 -1
- package/app/components/layout/AccountDeploymentSettings.vue +10 -10
- 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 +7 -7
- package/app/components/layout/AccountPlatformAlertSettings.vue +8 -8
- package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
- package/app/components/layout/AccountRunCredentialSettings.vue +3 -3
- package/app/components/layout/AccountSkillSettings.vue +1 -1
- package/app/components/layout/AccountTeamSettings.vue +13 -9
- package/app/components/layout/AiProvidersBanner.vue +1 -1
- package/app/components/layout/AppearanceSwitcher.vue +5 -4
- package/app/components/layout/BoardSwitcher.vue +13 -10
- package/app/components/layout/BoardToolbar.vue +10 -5
- package/app/components/layout/CommandBar.vue +8 -5
- package/app/components/layout/DefaultTestEnvBanner.vue +6 -5
- package/app/components/layout/IntegrationsHub.vue +12 -9
- package/app/components/layout/LanguageSwitcher.vue +5 -4
- package/app/components/layout/ModelProvidersHub.vue +10 -7
- package/app/components/layout/NotificationsInbox.vue +47 -36
- package/app/components/layout/PersonalSetupModal.vue +9 -6
- package/app/components/layout/RolePrompt.vue +5 -4
- package/app/components/layout/SideBar.vue +7 -8
- package/app/components/layout/SpendWarningBanner.vue +3 -3
- package/app/components/layout/TranslationWarningBanner.vue +5 -4
- package/app/components/layout/UiModeSwitcher.vue +15 -12
- package/app/components/layout/UiRoleSwitcher.vue +10 -8
- package/app/components/layout/WorkspaceMembersSettings.vue +2 -2
- package/app/components/media/ArtifactLightbox.vue +74 -44
- package/app/components/media/ImageCompare.vue +80 -85
- package/app/components/merge/MergeEffortChips.vue +4 -6
- package/app/components/notifications/NotificationSettingsPanel.vue +6 -5
- package/app/components/observability/OutcomeFilterChips.vue +6 -5
- package/app/components/observability/RunFailureSummary.vue +22 -23
- package/app/components/observability/StepMetricsBar.vue +9 -8
- package/app/components/observability/StepModelActivity.vue +8 -5
- package/app/components/observability/ToolCallList.vue +19 -20
- package/app/components/outcome/OutcomeSummaryWindow.vue +48 -46
- package/app/components/palettes/AgentPalette.vue +21 -15
- package/app/components/palettes/AgentTierSelect.vue +1 -1
- package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
- package/app/components/panels/AgentStepDetail.vue +57 -49
- package/app/components/panels/AttemptEntryHeader.vue +2 -2
- package/app/components/panels/DecisionModal.vue +1 -1
- package/app/components/panels/GenericStructuredResultView.vue +6 -5
- package/app/components/panels/InspectorPanel.vue +15 -13
- package/app/components/panels/MergerResultView.vue +10 -9
- package/app/components/panels/ObservabilityPanel.vue +211 -186
- package/app/components/panels/OperatorDashboardPanel.vue +124 -115
- package/app/components/panels/ReportsPanel.vue +87 -83
- package/app/components/panels/ReportsSpendBreakdown.vue +2 -2
- package/app/components/panels/ResultWindowShell.vue +152 -137
- package/app/components/panels/RunDetailLoadState.vue +1 -1
- package/app/components/panels/StepContainerStatus.vue +17 -16
- package/app/components/panels/StepDelegatedStatus.vue +24 -21
- package/app/components/panels/StepEffortReport.vue +12 -17
- package/app/components/panels/StepFragmentAdherence.vue +9 -10
- package/app/components/panels/StepMetadataCard.vue +41 -43
- package/app/components/panels/StepReproductionReport.vue +18 -20
- package/app/components/panels/StepRestartControl.vue +3 -2
- package/app/components/panels/StepRunMeta.vue +27 -26
- package/app/components/panels/StepTestReport.vue +16 -15
- package/app/components/panels/StepToolServers.vue +7 -8
- package/app/components/panels/StepValidationReport.vue +5 -5
- package/app/components/panels/inspector/ContainerSummary.vue +4 -4
- package/app/components/panels/inspector/DocReferenceRepos.vue +5 -4
- package/app/components/panels/inspector/EnvProbeReport.vue +16 -13
- package/app/components/panels/inspector/EpicChildren.vue +12 -10
- package/app/components/panels/inspector/FrontendBindingsResolved.vue +5 -4
- package/app/components/panels/inspector/FrontendConfig.vue +29 -36
- package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
- package/app/components/panels/inspector/InspectorSection.vue +25 -17
- package/app/components/panels/inspector/RecurringScheduleSettings.vue +9 -8
- package/app/components/panels/inspector/ServiceConnections.vue +5 -4
- package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
- package/app/components/panels/inspector/ServiceSelfTests.vue +9 -13
- package/app/components/panels/inspector/ServiceTestConfig.vue +46 -49
- package/app/components/panels/inspector/ServiceTestSecrets.vue +3 -3
- package/app/components/panels/inspector/ServiceTestingContext.vue +2 -2
- package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
- package/app/components/panels/inspector/TaskAgentConfig.vue +2 -2
- package/app/components/panels/inspector/TaskAprioriBranches.vue +6 -5
- package/app/components/panels/inspector/TaskDependencies.vue +1 -1
- package/app/components/panels/inspector/TaskEstimateBadge.vue +3 -7
- package/app/components/panels/inspector/TaskExecution.vue +18 -16
- package/app/components/panels/inspector/TaskRunSettings.vue +45 -44
- package/app/components/panels/inspector/TaskStructure.vue +5 -4
- package/app/components/pipeline/AgentPromptEditor.vue +15 -14
- package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -52
- package/app/components/pipeline/EstimateThresholdFields.vue +14 -11
- package/app/components/pipeline/GateConfigFields.vue +19 -23
- package/app/components/pipeline/IterationCapPrompt.vue +1 -1
- package/app/components/pipeline/PipelineBuilder.vue +113 -99
- package/app/components/pipeline/PipelineHealthModal.vue +7 -7
- package/app/components/pipeline/PipelinePicker.vue +11 -9
- package/app/components/pipeline/PipelinePreview.vue +6 -7
- package/app/components/pipeline/PipelineProgress.vue +49 -45
- package/app/components/prReview/PrReviewWindow.vue +87 -65
- package/app/components/providers/AiPresetMismatchDialog.vue +4 -3
- package/app/components/providers/AiProviderOnboardingModal.vue +2 -2
- package/app/components/providers/ApiKeysSection.vue +11 -9
- package/app/components/providers/PersonalSubscriptionSection.vue +4 -3
- package/app/components/providers/VendorCredentialsModal.vue +5 -4
- package/app/components/provisioning/ProvisioningLogsDrawer.vue +10 -9
- package/app/components/ralph/RalphLoopResultView.vue +29 -29
- package/app/components/requirements/RequirementsReviewWindow.vue +22 -17
- package/app/components/riskPolicy/RiskPolicyPicker.vue +13 -11
- package/app/components/riskPolicy/RiskPolicyPreview.vue +16 -15
- package/app/components/sandbox/SandboxPanel.vue +93 -73
- package/app/components/settings/ApiTokensPanel.vue +1 -1
- package/app/components/settings/BudgetSettings.vue +18 -17
- package/app/components/settings/CapabilityCredentialsPanel.vue +5 -5
- package/app/components/settings/CloudflareHandlerSection.vue +44 -41
- package/app/components/settings/ComposeEnvironmentSetupSection.vue +14 -12
- package/app/components/settings/ConnectionTestVerdict.vue +1 -1
- package/app/components/settings/ConsensusGroupsSection.vue +58 -47
- package/app/components/settings/CustomManifestTypeEditor.vue +8 -7
- package/app/components/settings/DefaultProvisionTypeSection.vue +5 -5
- package/app/components/settings/InfraHandlersConfigurator.vue +26 -24
- package/app/components/settings/InfrastructureBackendPicker.vue +18 -18
- package/app/components/settings/IssueTrackerPanel.vue +30 -21
- package/app/components/settings/KubernetesEngineForm.vue +9 -8
- package/app/components/settings/KubernetesEnvironmentForm.vue +4 -3
- package/app/components/settings/LocalContainerPoolSettings.vue +2 -2
- package/app/components/settings/LocalModelEndpointsPanel.vue +13 -11
- package/app/components/settings/MergeClassRulesEditor.vue +6 -5
- package/app/components/settings/MergeRolePolicyEditor.vue +13 -12
- package/app/components/settings/ModelConfigurationPanel.vue +17 -19
- package/app/components/settings/ModelPresetHealthModal.vue +3 -3
- package/app/components/settings/ObservabilityConnectionPanel.vue +1 -1
- package/app/components/settings/OpenRouterCatalogPanel.vue +10 -8
- package/app/components/settings/PackageRegistriesPanel.vue +4 -4
- package/app/components/settings/ProviderConnectionTab.vue +5 -4
- package/app/components/settings/ProviderManifestEditor.vue +9 -8
- package/app/components/settings/ProviderPreferenceEditor.vue +13 -13
- package/app/components/settings/RiskPolicyCreateForm.vue +40 -26
- package/app/components/settings/RiskPolicyEditorRow.vue +21 -19
- package/app/components/settings/RiskPolicyHealthModal.vue +3 -3
- package/app/components/settings/RiskPolicyPanel.vue +11 -13
- package/app/components/settings/ServiceFragmentDefaultsPanel.vue +15 -12
- package/app/components/settings/SharedStacksPanel.vue +5 -5
- package/app/components/settings/TaskSourceCard.vue +2 -2
- package/app/components/settings/TaskTypeSuppressionsPanel.vue +4 -4
- package/app/components/settings/ToolServerChecklist.vue +22 -22
- package/app/components/settings/UsageSettings.vue +13 -13
- package/app/components/settings/UserSecretsSection.vue +4 -3
- package/app/components/settings/WorkspaceMetadataSettings.vue +6 -5
- package/app/components/settings/WorkspaceSettingsPanel.vue +72 -58
- package/app/components/skills/ReviewSkillQueue.vue +12 -10
- package/app/components/skills/SkillLibraryManager.vue +9 -8
- package/app/components/slack/SlackPanel.vue +17 -12
- package/app/components/spec/ServiceSpecWindow.vue +19 -19
- package/app/components/tasks/BugHuntModal.vue +1 -1
- package/app/components/tasks/ContextIssuePicker.vue +16 -15
- package/app/components/tasks/TaskContextIssues.vue +5 -4
- package/app/components/tasks/TaskImportModal.vue +3 -2
- package/app/components/tasks/TaskSourceConnectModal.vue +5 -5
- package/app/components/testing/TestReportWindow.vue +67 -60
- package/app/components/theme/ThemeImportModal.vue +2 -2
- package/app/components/tutorial/TutorialNudge.vue +3 -2
- package/app/components/tutorial/TutorialOverlay.vue +3 -2
- package/app/components/vcs/GitLabConnect.vue +1 -1
- package/app/components/visualConfirm/VisualConfirmationWindow.vue +79 -54
- package/app/utils/theme/builtins.ts +7 -1
- package/i18n/locales/de.json +7 -3
- package/i18n/locales/en.json +7 -3
- package/i18n/locales/es.json +7 -3
- package/i18n/locales/fr.json +7 -3
- package/i18n/locales/he.json +7 -3
- package/i18n/locales/it.json +7 -3
- package/i18n/locales/ja.json +7 -3
- package/i18n/locales/pl.json +7 -3
- package/i18n/locales/tr.json +7 -3
- package/i18n/locales/uk.json +7 -3
- package/package.json +1 -1
|
@@ -32,6 +32,7 @@ import {
|
|
|
32
32
|
unattributedObservations,
|
|
33
33
|
} from '~/components/panels/StepToolServers.logic'
|
|
34
34
|
import { agentKindMeta } from '~/utils/catalog'
|
|
35
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
35
36
|
|
|
36
37
|
const props = defineProps<{
|
|
37
38
|
toolServers: StepToolServers
|
|
@@ -109,17 +110,15 @@ const drops = computed(() =>
|
|
|
109
110
|
data-testid="step-tool-servers"
|
|
110
111
|
class="scroll-mt-4 rounded-xl border border-default bg-default/50 p-4"
|
|
111
112
|
>
|
|
112
|
-
<
|
|
113
|
-
class="mb-2 flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-muted"
|
|
114
|
-
>
|
|
113
|
+
<SectionLabel class="mb-2 flex items-center gap-1.5">
|
|
115
114
|
<UIcon name="i-lucide-plug" class="h-3.5 w-3.5" />
|
|
116
115
|
<span>{{ t('panels.stepDetail.toolServers.heading') }}</span>
|
|
117
|
-
</
|
|
116
|
+
</SectionLabel>
|
|
118
117
|
|
|
119
118
|
<p
|
|
120
119
|
v-if="dispatchedAs"
|
|
121
120
|
data-testid="step-tool-servers-dispatched-as"
|
|
122
|
-
class="mb-2 text-
|
|
121
|
+
class="mb-2 text-xs text-muted"
|
|
123
122
|
>
|
|
124
123
|
{{ t('panels.stepDetail.toolServers.dispatchedAs', { agent: dispatchedAs }) }}
|
|
125
124
|
</p>
|
|
@@ -130,7 +129,7 @@ const drops = computed(() =>
|
|
|
130
129
|
:key="server.id"
|
|
131
130
|
data-testid="step-tool-server-wired"
|
|
132
131
|
:data-observed-fault="server.isFault ? 'true' : undefined"
|
|
133
|
-
class="inline-flex items-center gap-1.5 rounded-full border px-2 py-0.5 text-
|
|
132
|
+
class="inline-flex items-center gap-1.5 rounded-full border px-2 py-0.5 text-xs"
|
|
134
133
|
:class="
|
|
135
134
|
server.isFault
|
|
136
135
|
? 'border-app-warning-500/30 bg-app-warning-500/10 text-app-warning-200'
|
|
@@ -171,7 +170,7 @@ const drops = computed(() =>
|
|
|
171
170
|
v-for="server in unattributed"
|
|
172
171
|
:key="server.id"
|
|
173
172
|
data-testid="step-tool-server-unattributed"
|
|
174
|
-
class="flex items-start gap-1.5 text-
|
|
173
|
+
class="flex items-start gap-1.5 text-xs text-muted"
|
|
175
174
|
>
|
|
176
175
|
<UIcon name="i-lucide-circle-help" class="mt-0.5 h-3.5 w-3.5 shrink-0" />
|
|
177
176
|
<span>{{
|
|
@@ -185,7 +184,7 @@ const drops = computed(() =>
|
|
|
185
184
|
v-for="server in drops"
|
|
186
185
|
:key="server.id"
|
|
187
186
|
data-testid="step-tool-server-unavailable"
|
|
188
|
-
class="flex items-start gap-1.5 text-
|
|
187
|
+
class="flex items-start gap-1.5 text-xs text-toned"
|
|
189
188
|
>
|
|
190
189
|
<UIcon
|
|
191
190
|
name="i-lucide-plug-zap"
|
|
@@ -15,7 +15,7 @@ const failed = computed(() => props.report.outcomes.filter((o) => !o.passed))
|
|
|
15
15
|
|
|
16
16
|
<template>
|
|
17
17
|
<div class="space-y-2" data-testid="step-validation-report">
|
|
18
|
-
<p class="text-
|
|
18
|
+
<p class="text-2xs text-muted">
|
|
19
19
|
{{
|
|
20
20
|
report.passed
|
|
21
21
|
? t('panels.stepDetail.validation.passedSummary', {
|
|
@@ -43,11 +43,11 @@ const failed = computed(() => props.report.outcomes.filter((o) => !o.passed))
|
|
|
43
43
|
class="h-3.5 w-3.5 shrink-0"
|
|
44
44
|
:class="outcome.passed ? 'text-app-success-400' : 'text-app-error-400'"
|
|
45
45
|
/>
|
|
46
|
-
<span class="text-
|
|
47
|
-
<span class="truncate font-mono text-
|
|
46
|
+
<span class="text-xs font-medium text-default">{{ outcome.label }}</span>
|
|
47
|
+
<span class="truncate font-mono text-2xs text-dimmed">{{ outcome.command }}</span>
|
|
48
48
|
<span
|
|
49
49
|
v-if="!outcome.passed"
|
|
50
|
-
class="ms-auto shrink-0 rounded bg-app-error-500/15 px-1.5 py-0.5 text-
|
|
50
|
+
class="ms-auto shrink-0 rounded-sm bg-app-error-500/15 px-1.5 py-0.5 text-2xs tabular-nums text-app-error-300"
|
|
51
51
|
>
|
|
52
52
|
{{
|
|
53
53
|
outcome.timedOut
|
|
@@ -58,7 +58,7 @@ const failed = computed(() => props.report.outcomes.filter((o) => !o.passed))
|
|
|
58
58
|
</div>
|
|
59
59
|
<pre
|
|
60
60
|
v-if="outcome.outputTail"
|
|
61
|
-
class="mt-1.5 max-h-48 overflow-auto whitespace-pre-wrap break-words rounded bg-app-950 p-2 font-mono text-
|
|
61
|
+
class="mt-1.5 max-h-48 overflow-auto whitespace-pre-wrap break-words rounded-sm bg-app-950 p-2 font-mono text-2xs text-muted"
|
|
62
62
|
data-testid="validation-output"
|
|
63
63
|
>{{ outcome.outputTail }}</pre>
|
|
64
64
|
</div>
|
|
@@ -41,7 +41,7 @@ function addTask() {
|
|
|
41
41
|
>
|
|
42
42
|
<UIcon name="i-lucide-package" class="h-3.5 w-3.5 text-app-secondary-400" />
|
|
43
43
|
<span class="truncate text-xs text-default">{{ m.title }}</span>
|
|
44
|
-
<span class="ms-auto text-
|
|
44
|
+
<span class="ms-auto text-3xs text-dimmed">{{
|
|
45
45
|
t(
|
|
46
46
|
'inspector.container.taskCount',
|
|
47
47
|
{ count: board.tasksOf(m.id).length },
|
|
@@ -76,11 +76,11 @@ function addTask() {
|
|
|
76
76
|
:style="{ backgroundColor: STATUS_META[task.status].color }"
|
|
77
77
|
/>
|
|
78
78
|
<span class="truncate text-xs text-default">{{ task.title }}</span>
|
|
79
|
-
<span class="ms-auto text-
|
|
79
|
+
<span class="ms-auto text-3xs text-dimmed">{{ STATUS_META[task.status].label }}</span>
|
|
80
80
|
</li>
|
|
81
81
|
</ul>
|
|
82
|
-
<div v-else class="text-
|
|
83
|
-
<p v-if="isFrame" class="text-
|
|
82
|
+
<div v-else class="text-2xs text-dimmed">{{ t('inspector.container.noTasks') }}</div>
|
|
83
|
+
<p v-if="isFrame" class="text-2xs text-dimmed">
|
|
84
84
|
{{ t('inspector.container.servicesHint') }}
|
|
85
85
|
</p>
|
|
86
86
|
</InspectorSection>
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
// search as the add-service picker (`useRepoSearch`), not a filter over the synced projection.
|
|
7
7
|
import type { Block, GitHubAvailableRepo, ReferenceRepo } from '~/types/domain'
|
|
8
8
|
import RepoSearchEmpty from '~/components/github/RepoSearchEmpty.vue'
|
|
9
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
9
10
|
|
|
10
11
|
const props = defineProps<{ block: Block }>()
|
|
11
12
|
|
|
@@ -83,9 +84,9 @@ function detach(repoId: number) {
|
|
|
83
84
|
<template>
|
|
84
85
|
<div data-testid="doc-reference-repos">
|
|
85
86
|
<div class="mb-1 flex items-center justify-between">
|
|
86
|
-
<
|
|
87
|
+
<SectionLabel as="span">
|
|
87
88
|
{{ t('inspector.referenceRepos.title') }}
|
|
88
|
-
</
|
|
89
|
+
</SectionLabel>
|
|
89
90
|
</div>
|
|
90
91
|
|
|
91
92
|
<!-- Attached reference repos: chips with a remove control. -->
|
|
@@ -133,11 +134,11 @@ function detach(repoId: number) {
|
|
|
133
134
|
/>
|
|
134
135
|
</template>
|
|
135
136
|
</UInputMenu>
|
|
136
|
-
<div v-else class="text-
|
|
137
|
+
<div v-else class="text-2xs text-dimmed">
|
|
137
138
|
{{ t('inspector.referenceRepos.connectFirst') }}
|
|
138
139
|
</div>
|
|
139
140
|
|
|
140
|
-
<div class="mt-1 text-
|
|
141
|
+
<div class="mt-1 text-2xs text-dimmed">
|
|
141
142
|
{{ t('inspector.referenceRepos.hint') }}
|
|
142
143
|
</div>
|
|
143
144
|
</div>
|
|
@@ -81,14 +81,17 @@ function outcomeClass(outcome: EnvironmentProbeReport['operations'][number]['out
|
|
|
81
81
|
</script>
|
|
82
82
|
|
|
83
83
|
<template>
|
|
84
|
-
<div
|
|
85
|
-
|
|
84
|
+
<div
|
|
85
|
+
class="space-y-2 rounded-sm border border-default bg-muted p-2"
|
|
86
|
+
data-testid="env-probe-report"
|
|
87
|
+
>
|
|
88
|
+
<p class="text-2xs font-medium" :class="verdictClass" data-testid="env-probe-verdict">
|
|
86
89
|
{{ verdictLabel }}
|
|
87
90
|
</p>
|
|
88
91
|
|
|
89
92
|
<!-- The tallies the PLATFORM computed from the agent's per-operation judgements, including
|
|
90
93
|
how many successes were behind authentication: the count the verdict turns on. -->
|
|
91
|
-
<p class="text-
|
|
94
|
+
<p class="text-2xs text-muted">
|
|
92
95
|
{{
|
|
93
96
|
t('inspector.testConfig.envProbe.counts', {
|
|
94
97
|
succeeded: report.succeeded,
|
|
@@ -101,19 +104,19 @@ function outcomeClass(outcome: EnvironmentProbeReport['operations'][number]['out
|
|
|
101
104
|
<!-- What the platform did not tell the agent: the actionable half of the report, so it comes
|
|
102
105
|
before the evidence. -->
|
|
103
106
|
<div v-if="report.missingContext.length" data-testid="env-probe-missing">
|
|
104
|
-
<p class="text-
|
|
107
|
+
<p class="text-2xs font-medium text-app-warning-300/90">
|
|
105
108
|
{{ t('inspector.testConfig.envProbe.missingContext') }}
|
|
106
109
|
</p>
|
|
107
|
-
<ul class="mt-0.5 list-disc space-y-0.5 pl-4 text-
|
|
110
|
+
<ul class="mt-0.5 list-disc space-y-0.5 pl-4 text-2xs text-toned">
|
|
108
111
|
<li v-for="(line, i) in report.missingContext" :key="i">{{ line }}</li>
|
|
109
112
|
</ul>
|
|
110
113
|
</div>
|
|
111
114
|
|
|
112
115
|
<div v-if="report.blockers.length" data-testid="env-probe-blockers">
|
|
113
|
-
<p class="text-
|
|
116
|
+
<p class="text-2xs font-medium text-app-error-300/90">
|
|
114
117
|
{{ t('inspector.testConfig.envProbe.blockers') }}
|
|
115
118
|
</p>
|
|
116
|
-
<ul class="mt-0.5 space-y-0.5 text-
|
|
119
|
+
<ul class="mt-0.5 space-y-0.5 text-2xs text-toned">
|
|
117
120
|
<li v-for="(blocker, i) in report.blockers" :key="i">
|
|
118
121
|
<span class="text-muted">{{ failureLabel(blocker.kind) }}:</span>
|
|
119
122
|
{{ blocker.detail }}
|
|
@@ -124,10 +127,10 @@ function outcomeClass(outcome: EnvironmentProbeReport['operations'][number]['out
|
|
|
124
127
|
<!-- The operations, as evidence for the verdict above. This is the "what was attempted" a dry
|
|
125
128
|
run exists to report: without it a verdict is an opinion. -->
|
|
126
129
|
<div v-if="report.operations.length" data-testid="env-probe-operations">
|
|
127
|
-
<p class="text-
|
|
130
|
+
<p class="text-2xs font-medium text-toned">
|
|
128
131
|
{{ t('inspector.testConfig.envProbe.operations') }}
|
|
129
132
|
</p>
|
|
130
|
-
<ul class="mt-0.5 space-y-1 text-
|
|
133
|
+
<ul class="mt-0.5 space-y-1 text-2xs">
|
|
131
134
|
<li v-for="(op, i) in report.operations" :key="i" class="flex items-start gap-1.5">
|
|
132
135
|
<UIcon
|
|
133
136
|
:name="outcomeIcon(op.outcome)"
|
|
@@ -151,12 +154,12 @@ function outcomeClass(outcome: EnvironmentProbeReport['operations'][number]['out
|
|
|
151
154
|
whole attempt. The two ways an operation fails to reach the list are rendered SEPARATELY
|
|
152
155
|
because they send a reader somewhere different: one says the agent reported more than is
|
|
153
156
|
shown, the other says its reply was malformed. -->
|
|
154
|
-
<p v-if="report.operationsOmitted" class="mt-1 text-
|
|
157
|
+
<p v-if="report.operationsOmitted" class="mt-1 text-2xs text-dimmed">
|
|
155
158
|
{{
|
|
156
159
|
t('inspector.testConfig.envProbe.operationsOmitted', { count: report.operationsOmitted })
|
|
157
160
|
}}
|
|
158
161
|
</p>
|
|
159
|
-
<p v-if="report.operationsUnreadable" class="mt-1 text-
|
|
162
|
+
<p v-if="report.operationsUnreadable" class="mt-1 text-2xs text-dimmed">
|
|
160
163
|
{{
|
|
161
164
|
t('inspector.testConfig.envProbe.operationsUnreadable', {
|
|
162
165
|
count: report.operationsUnreadable,
|
|
@@ -165,8 +168,8 @@ function outcomeClass(outcome: EnvironmentProbeReport['operations'][number]['out
|
|
|
165
168
|
</p>
|
|
166
169
|
</div>
|
|
167
170
|
|
|
168
|
-
<p v-if="report.summary" class="text-
|
|
169
|
-
<p v-if="report.model" class="text-
|
|
171
|
+
<p v-if="report.summary" class="text-2xs text-muted">{{ report.summary }}</p>
|
|
172
|
+
<p v-if="report.model" class="text-2xs text-app-600">
|
|
170
173
|
{{ t('inspector.testConfig.envProbe.model', { model: report.model }) }}
|
|
171
174
|
</p>
|
|
172
175
|
</div>
|
|
@@ -3,6 +3,7 @@ import { computed } from 'vue'
|
|
|
3
3
|
import type { Block } from '~/types/domain'
|
|
4
4
|
import { STATUS_META } from '~/utils/catalog'
|
|
5
5
|
import InspectorSection from '~/components/panels/inspector/InspectorSection.vue'
|
|
6
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
6
7
|
|
|
7
8
|
// The epic inspector body: the full tree of member tasks (which may live under different
|
|
8
9
|
// services/modules), grouped service → module → task. Each task row selects it. Membership
|
|
@@ -52,30 +53,31 @@ const groups = computed(() => {
|
|
|
52
53
|
default-open
|
|
53
54
|
>
|
|
54
55
|
<template #actions>
|
|
55
|
-
<span class="text-
|
|
56
|
+
<span class="text-2xs text-dimmed">{{
|
|
56
57
|
t('inspector.epicChildren.doneCount', { done, total: members.length })
|
|
57
58
|
}}</span>
|
|
58
59
|
</template>
|
|
59
60
|
|
|
60
|
-
<div v-if="members.length === 0" class="text-
|
|
61
|
+
<div v-if="members.length === 0" class="text-2xs text-dimmed">
|
|
61
62
|
{{ t('inspector.epicChildren.empty') }}
|
|
62
63
|
</div>
|
|
63
64
|
|
|
64
65
|
<div v-else class="space-y-2">
|
|
65
66
|
<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-
|
|
67
|
+
<div class="mb-1 flex items-center gap-1 text-2xs font-medium text-toned">
|
|
67
68
|
<UIcon name="i-lucide-box" class="h-3 w-3 text-dimmed" />
|
|
68
69
|
{{ group.service?.title ?? t('inspector.epicChildren.unassigned') }}
|
|
69
70
|
</div>
|
|
70
71
|
<div v-for="(mod, mi) in [...group.modules.values()]" :key="mi" class="ps-1">
|
|
71
|
-
<
|
|
72
|
+
<SectionLabel v-if="mod.module">
|
|
72
73
|
{{ mod.module.title }}
|
|
73
|
-
</
|
|
74
|
-
<
|
|
74
|
+
</SectionLabel>
|
|
75
|
+
<UButton
|
|
76
|
+
color="neutral"
|
|
77
|
+
variant="ghost"
|
|
75
78
|
v-for="task in mod.tasks"
|
|
76
79
|
:key="task.id"
|
|
77
|
-
|
|
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"
|
|
80
|
+
class="flex w-full items-center gap-1.5 rounded-sm px-1 py-0.5 text-start text-xs text-default hover:bg-elevated"
|
|
79
81
|
@click="ui.select(task.id)"
|
|
80
82
|
>
|
|
81
83
|
<span
|
|
@@ -83,10 +85,10 @@ const groups = computed(() => {
|
|
|
83
85
|
:style="{ backgroundColor: STATUS_META[task.status].color }"
|
|
84
86
|
/>
|
|
85
87
|
<span class="truncate">{{ task.title }}</span>
|
|
86
|
-
<span class="ms-auto shrink-0 text-
|
|
88
|
+
<span class="ms-auto shrink-0 text-3xs text-dimmed">
|
|
87
89
|
{{ STATUS_META[task.status].label }}
|
|
88
90
|
</span>
|
|
89
|
-
</
|
|
91
|
+
</UButton>
|
|
90
92
|
</div>
|
|
91
93
|
</div>
|
|
92
94
|
</div>
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
type FrontendConfig,
|
|
8
8
|
type ResolvedFrontendBinding,
|
|
9
9
|
} from '@cat-factory/contracts'
|
|
10
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
10
11
|
|
|
11
12
|
// The resolution of a frontend frame's backend bindings — each env var → a bound service's live
|
|
12
13
|
// ephemeral URL, or WireMock. Two modes, same view:
|
|
@@ -66,13 +67,13 @@ const rows = computed(() => {
|
|
|
66
67
|
|
|
67
68
|
<template>
|
|
68
69
|
<div v-if="rows.length || duplicates.length" class="space-y-1.5" data-testid="frontend-resolved">
|
|
69
|
-
<
|
|
70
|
+
<SectionLabel>
|
|
70
71
|
{{ t('inspector.frontendConfig.resolved.title') }}
|
|
71
|
-
</
|
|
72
|
+
</SectionLabel>
|
|
72
73
|
|
|
73
74
|
<p
|
|
74
75
|
v-if="duplicates.length"
|
|
75
|
-
class="text-
|
|
76
|
+
class="text-2xs leading-snug text-app-warning-300/80"
|
|
76
77
|
data-testid="frontend-resolved-duplicates"
|
|
77
78
|
>
|
|
78
79
|
{{ t('inspector.frontendConfig.resolved.duplicateWarning', { vars: duplicates.join(', ') }) }}
|
|
@@ -82,7 +83,7 @@ const rows = computed(() => {
|
|
|
82
83
|
<li
|
|
83
84
|
v-for="row in rows"
|
|
84
85
|
:key="row.envVar"
|
|
85
|
-
class="flex items-baseline gap-1.5 text-
|
|
86
|
+
class="flex items-baseline gap-1.5 text-2xs leading-snug"
|
|
86
87
|
data-testid="frontend-resolved-row"
|
|
87
88
|
>
|
|
88
89
|
<span
|
|
@@ -12,6 +12,7 @@ import type {
|
|
|
12
12
|
} from '~/types/domain'
|
|
13
13
|
import FrontendBindingsResolved from '~/components/panels/inspector/FrontendBindingsResolved.vue'
|
|
14
14
|
import InspectorSection from '~/components/panels/inspector/InspectorSection.vue'
|
|
15
|
+
import IconButton from '~/components/common/IconButton.vue'
|
|
15
16
|
import { apiErrorEnvelope } from '~/composables/api/errors'
|
|
16
17
|
|
|
17
18
|
// Frontend-frame (`type: 'frontend'`) configuration: how to build, serve, and mock this
|
|
@@ -229,11 +230,11 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
229
230
|
persisted until Apply. Only shown when the frame is linked to a repo. -->
|
|
230
231
|
<div
|
|
231
232
|
v-if="repoLink"
|
|
232
|
-
class="space-y-2 rounded border border-default bg-default/40 p-2"
|
|
233
|
+
class="space-y-2 rounded-sm border border-default bg-default/40 p-2"
|
|
233
234
|
data-testid="frontend-detect"
|
|
234
235
|
>
|
|
235
236
|
<div class="flex items-center justify-between gap-2">
|
|
236
|
-
<span class="text-
|
|
237
|
+
<span class="text-2xs text-muted">{{ t('inspector.frontendConfig.detect.title') }}</span>
|
|
237
238
|
<UButton
|
|
238
239
|
size="xs"
|
|
239
240
|
variant="soft"
|
|
@@ -246,16 +247,16 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
246
247
|
{{ t('inspector.frontendConfig.detect.button') }}
|
|
247
248
|
</UButton>
|
|
248
249
|
</div>
|
|
249
|
-
<p class="text-
|
|
250
|
+
<p class="text-2xs leading-snug text-dimmed">
|
|
250
251
|
{{ t('inspector.frontendConfig.detect.hint') }}
|
|
251
252
|
</p>
|
|
252
253
|
|
|
253
|
-
<p v-if="detectError" class="text-
|
|
254
|
+
<p v-if="detectError" class="text-2xs text-app-error-300/80">
|
|
254
255
|
{{ detectError }}
|
|
255
256
|
</p>
|
|
256
257
|
|
|
257
258
|
<template v-if="detectResult && !detecting">
|
|
258
|
-
<p v-if="!detectResult.detected" class="text-
|
|
259
|
+
<p v-if="!detectResult.detected" class="text-2xs text-app-warning-300/80">
|
|
259
260
|
{{ t('inspector.frontendConfig.detect.none') }}
|
|
260
261
|
</p>
|
|
261
262
|
|
|
@@ -263,7 +264,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
263
264
|
<li
|
|
264
265
|
v-for="(n, i) in detectResult.notes"
|
|
265
266
|
:key="i"
|
|
266
|
-
class="flex items-start gap-1.5 text-
|
|
267
|
+
class="flex items-start gap-1.5 text-2xs leading-snug text-dimmed"
|
|
267
268
|
>
|
|
268
269
|
<span
|
|
269
270
|
:class="
|
|
@@ -310,9 +311,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
310
311
|
<!-- Build: package manager + frontend directory + install command + build script + output dir -->
|
|
311
312
|
<InspectorSection v-model:open="showBuild" :title="t('inspector.frontendConfig.groups.build')">
|
|
312
313
|
<div class="space-y-1">
|
|
313
|
-
<span class="text-
|
|
314
|
-
t('inspector.frontendConfig.packageManager')
|
|
315
|
-
}}</span>
|
|
314
|
+
<span class="text-2xs text-muted">{{ t('inspector.frontendConfig.packageManager') }}</span>
|
|
316
315
|
<div class="flex flex-wrap gap-1">
|
|
317
316
|
<UButton
|
|
318
317
|
v-for="pm in PACKAGE_MANAGERS"
|
|
@@ -328,7 +327,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
328
327
|
</div>
|
|
329
328
|
|
|
330
329
|
<div class="space-y-1">
|
|
331
|
-
<label class="text-
|
|
330
|
+
<label class="text-2xs text-muted">{{ t('inspector.frontendConfig.directory') }}</label>
|
|
332
331
|
<UInput
|
|
333
332
|
:model-value="config.directory ?? ''"
|
|
334
333
|
size="xs"
|
|
@@ -340,13 +339,13 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
340
339
|
(e: KeyboardEvent) => saveText('directory', (e.target as HTMLInputElement).value)
|
|
341
340
|
"
|
|
342
341
|
/>
|
|
343
|
-
<p class="text-
|
|
342
|
+
<p class="text-2xs leading-snug text-dimmed">
|
|
344
343
|
{{ t('inspector.frontendConfig.directoryHint') }}
|
|
345
344
|
</p>
|
|
346
345
|
</div>
|
|
347
346
|
|
|
348
347
|
<div class="space-y-1">
|
|
349
|
-
<label class="text-
|
|
348
|
+
<label class="text-2xs text-muted">{{
|
|
350
349
|
t('inspector.frontendConfig.installCommand')
|
|
351
350
|
}}</label>
|
|
352
351
|
<UInput
|
|
@@ -366,9 +365,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
366
365
|
|
|
367
366
|
<div class="grid grid-cols-2 gap-2">
|
|
368
367
|
<div class="space-y-1">
|
|
369
|
-
<label class="text-
|
|
370
|
-
t('inspector.frontendConfig.buildScript')
|
|
371
|
-
}}</label>
|
|
368
|
+
<label class="text-2xs text-muted">{{ t('inspector.frontendConfig.buildScript') }}</label>
|
|
372
369
|
<UInput
|
|
373
370
|
:model-value="config.buildScript ?? ''"
|
|
374
371
|
size="xs"
|
|
@@ -382,9 +379,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
382
379
|
/>
|
|
383
380
|
</div>
|
|
384
381
|
<div class="space-y-1">
|
|
385
|
-
<label class="text-
|
|
386
|
-
t('inspector.frontendConfig.outputDir')
|
|
387
|
-
}}</label>
|
|
382
|
+
<label class="text-2xs text-muted">{{ t('inspector.frontendConfig.outputDir') }}</label>
|
|
388
383
|
<UInput
|
|
389
384
|
:model-value="config.outputDir ?? ''"
|
|
390
385
|
size="xs"
|
|
@@ -403,7 +398,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
403
398
|
<!-- Serve: mode (static vs command) + serve script (command mode) + port -->
|
|
404
399
|
<InspectorSection v-model:open="showServe" :title="t('inspector.frontendConfig.groups.serve')">
|
|
405
400
|
<div class="space-y-1">
|
|
406
|
-
<span class="text-
|
|
401
|
+
<span class="text-2xs text-muted">{{ t('inspector.frontendConfig.serveMode') }}</span>
|
|
407
402
|
<div class="flex flex-wrap gap-1">
|
|
408
403
|
<UButton
|
|
409
404
|
:color="serveMode === 'static' ? 'primary' : 'neutral'"
|
|
@@ -423,23 +418,21 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
423
418
|
</UButton>
|
|
424
419
|
</div>
|
|
425
420
|
<!-- Explain each mode, and disambiguate from the separate envInjection axis. -->
|
|
426
|
-
<p class="text-
|
|
421
|
+
<p class="text-2xs leading-snug text-dimmed">
|
|
427
422
|
<span class="text-muted">{{ t('inspector.frontendConfig.serveStatic') }}:</span>
|
|
428
423
|
{{ t('inspector.frontendConfig.serveStaticDesc') }}
|
|
429
424
|
</p>
|
|
430
|
-
<p class="text-
|
|
425
|
+
<p class="text-2xs leading-snug text-dimmed">
|
|
431
426
|
<span class="text-muted">{{ t('inspector.frontendConfig.serveCommand') }}:</span>
|
|
432
427
|
{{ t('inspector.frontendConfig.serveCommandDesc') }}
|
|
433
428
|
</p>
|
|
434
|
-
<p class="text-
|
|
429
|
+
<p class="text-2xs leading-snug text-dimmed/80">
|
|
435
430
|
{{ t('inspector.frontendConfig.serveEnvAxisNote') }}
|
|
436
431
|
</p>
|
|
437
432
|
</div>
|
|
438
433
|
|
|
439
434
|
<div v-if="serveMode === 'command'" class="space-y-1">
|
|
440
|
-
<label class="text-
|
|
441
|
-
t('inspector.frontendConfig.serveScript')
|
|
442
|
-
}}</label>
|
|
435
|
+
<label class="text-2xs text-muted">{{ t('inspector.frontendConfig.serveScript') }}</label>
|
|
443
436
|
<UInput
|
|
444
437
|
:model-value="config.serveScript ?? ''"
|
|
445
438
|
size="xs"
|
|
@@ -454,7 +447,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
454
447
|
</div>
|
|
455
448
|
|
|
456
449
|
<div class="space-y-1">
|
|
457
|
-
<label class="text-
|
|
450
|
+
<label class="text-2xs text-muted">{{ t('inspector.frontendConfig.servePort') }}</label>
|
|
458
451
|
<UInput
|
|
459
452
|
:model-value="config.servePort != null ? String(config.servePort) : ''"
|
|
460
453
|
type="number"
|
|
@@ -475,7 +468,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
475
468
|
:title="t('inspector.frontendConfig.groups.mocking')"
|
|
476
469
|
>
|
|
477
470
|
<div class="space-y-1">
|
|
478
|
-
<label class="text-
|
|
471
|
+
<label class="text-2xs text-muted">{{
|
|
479
472
|
t('inspector.frontendConfig.mockMappingsPath')
|
|
480
473
|
}}</label>
|
|
481
474
|
<UInput
|
|
@@ -491,7 +484,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
491
484
|
(e: KeyboardEvent) => saveText('mockMappingsPath', (e.target as HTMLInputElement).value)
|
|
492
485
|
"
|
|
493
486
|
/>
|
|
494
|
-
<p class="text-
|
|
487
|
+
<p class="text-2xs leading-snug text-dimmed">
|
|
495
488
|
{{ t('inspector.frontendConfig.mockMappingsHint') }}
|
|
496
489
|
</p>
|
|
497
490
|
</div>
|
|
@@ -521,7 +514,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
521
514
|
{{ t('inspector.frontendConfig.envRuntime') }}
|
|
522
515
|
</UButton>
|
|
523
516
|
</div>
|
|
524
|
-
<p class="text-
|
|
517
|
+
<p class="text-2xs leading-snug text-dimmed">
|
|
525
518
|
{{ t('inspector.frontendConfig.envInjectionHint') }}
|
|
526
519
|
</p>
|
|
527
520
|
</div>
|
|
@@ -564,17 +557,17 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
564
557
|
class="flex-1"
|
|
565
558
|
@update:model-value="(v: string) => setBindingSource(i, v)"
|
|
566
559
|
/>
|
|
567
|
-
<
|
|
560
|
+
<IconButton
|
|
568
561
|
size="xs"
|
|
569
562
|
variant="ghost"
|
|
570
563
|
color="neutral"
|
|
571
564
|
icon="i-lucide-x"
|
|
572
|
-
:
|
|
565
|
+
:label="t('inspector.frontendConfig.bindings.remove')"
|
|
573
566
|
@click="removeBinding(i)"
|
|
574
567
|
/>
|
|
575
568
|
</div>
|
|
576
569
|
</div>
|
|
577
|
-
<div v-else class="text-
|
|
570
|
+
<div v-else class="text-2xs text-dimmed">
|
|
578
571
|
{{ t('inspector.frontendConfig.bindings.empty') }}
|
|
579
572
|
</div>
|
|
580
573
|
|
|
@@ -603,7 +596,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
603
596
|
save({ previewEnabled: v === true ? true : undefined })
|
|
604
597
|
"
|
|
605
598
|
/>
|
|
606
|
-
<p class="mt-1 text-
|
|
599
|
+
<p class="mt-1 text-2xs leading-snug text-dimmed">
|
|
607
600
|
{{
|
|
608
601
|
previewSupported
|
|
609
602
|
? t('inspector.frontendConfig.previewHint')
|
|
@@ -615,7 +608,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
615
608
|
<div v-if="previewActive" class="mt-2 space-y-1.5" data-testid="preview-panel">
|
|
616
609
|
<div class="flex items-center gap-2">
|
|
617
610
|
<span
|
|
618
|
-
class="text-
|
|
611
|
+
class="text-2xs font-medium"
|
|
619
612
|
:class="{
|
|
620
613
|
'text-app-success-400': previewStatus === 'ready',
|
|
621
614
|
'text-app-warning-400': previewStatus === 'starting',
|
|
@@ -671,7 +664,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
671
664
|
|
|
672
665
|
<p
|
|
673
666
|
v-if="previewStatus === 'failed' && previewState?.error"
|
|
674
|
-
class="text-
|
|
667
|
+
class="text-2xs leading-snug text-app-error-400"
|
|
675
668
|
data-testid="preview-error"
|
|
676
669
|
>
|
|
677
670
|
{{ previewState.error }}
|
|
@@ -679,7 +672,7 @@ onUnmounted(() => preview.stopPolling(props.block.id))
|
|
|
679
672
|
|
|
680
673
|
<p
|
|
681
674
|
v-if="previewRequestError"
|
|
682
|
-
class="text-
|
|
675
|
+
class="text-2xs leading-snug text-app-error-400"
|
|
683
676
|
data-testid="preview-request-error"
|
|
684
677
|
>
|
|
685
678
|
{{ 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-
|
|
55
|
+
<span v-if="progress" class="text-2xs 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-
|
|
60
|
+
<p v-if="initiative?.goal" class="whitespace-pre-wrap text-xs 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-
|
|
168
|
+
<p class="text-2xs text-dimmed">
|
|
169
169
|
{{ t('initiative.inspector.hint') }}
|
|
170
170
|
</p>
|
|
171
171
|
</div>
|