@cat-factory/app 0.307.1 → 0.309.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 +21 -0
- 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 +3 -2
- package/app/components/auth/UserMenu.vue +1 -1
- package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +15 -15
- package/app/components/binaryOutput/BinaryOutputReport.vue +10 -14
- package/app/components/binaryOutput/StoredAssetView.vue +5 -5
- package/app/components/board/AddTaskModal.vue +16 -14
- package/app/components/board/AgentFailureCard.vue +9 -9
- package/app/components/board/AgentFailureHistory.vue +1 -1
- package/app/components/board/CreateInitiativeModal.vue +2 -2
- package/app/components/board/FailureDetail.vue +1 -1
- package/app/components/board/FailureHistoryList.vue +5 -5
- package/app/components/board/RecurringPipelineModal.vue +12 -11
- package/app/components/board/ReviewFrictionDialog.vue +4 -3
- package/app/components/board/StepExecutionHistory.vue +8 -8
- package/app/components/board/nodes/AgentChip.vue +1 -1
- package/app/components/board/nodes/BlockNode.vue +8 -9
- package/app/components/board/nodes/EpicNode.vue +4 -4
- package/app/components/board/nodes/FrameSwimlanes.vue +4 -7
- 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 +8 -8
- package/app/components/board/nodes/TaskLane.vue +3 -3
- package/app/components/board/nodes/TaskPipelineMini.vue +13 -12
- package/app/components/bootstrap/AdoptionReviewModal.vue +7 -6
- package/app/components/bootstrap/BootstrapModal.vue +11 -10
- package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
- package/app/components/brainstorm/BrainstormWindow.vue +8 -7
- package/app/components/bugFishing/BugFishingWindow.vue +37 -36
- package/app/components/clarity/ClarityReviewWindow.vue +8 -7
- package/app/components/common/AsyncViewError.vue +1 -1
- package/app/components/common/ClarificationItem.vue +6 -6
- package/app/components/common/DescriptorFields.vue +1 -1
- package/app/components/common/EmptyState.vue +1 -1
- 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 +9 -8
- package/app/components/docs/DocInterviewWindow.vue +10 -9
- package/app/components/documents/ContextDocumentPicker.vue +10 -12
- package/app/components/documents/DocumentImportModal.vue +3 -2
- package/app/components/documents/DocumentSourceConnectModal.vue +2 -2
- package/app/components/documents/DocumentSyncState.vue +1 -1
- package/app/components/documents/DocumentTemplatesModal.vue +5 -4
- package/app/components/documents/RepoContextDocPicker.vue +3 -6
- 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 +11 -10
- 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 +10 -10
- package/app/components/forkDecision/ForkDecisionWindow.vue +23 -26
- package/app/components/foundational/FoundationalContractSummary.vue +2 -2
- package/app/components/foundational/FoundationalServiceCatalogList.vue +3 -3
- package/app/components/foundational/FoundationalServiceRegistry.vue +3 -3
- package/app/components/foundational/FoundationalSuppressions.vue +2 -2
- package/app/components/fragments/FragmentLibraryManager.vue +3 -3
- package/app/components/fragments/FragmentSelector.vue +10 -11
- package/app/components/gates/GateFailingCheckList.vue +3 -3
- package/app/components/gates/GateResultView.vue +39 -38
- package/app/components/github/AddServiceFromRepoModal.vue +5 -4
- package/app/components/github/BranchProtectionPreflight.vue +5 -5
- package/app/components/github/GitHubConnect.vue +5 -3
- package/app/components/github/GitHubPanel.vue +14 -13
- package/app/components/github/RepoTreeBrowser.vue +1 -1
- package/app/components/humanTest/HumanTestWindow.vue +18 -17
- package/app/components/initiative/InitiativePlanNotice.vue +3 -3
- package/app/components/initiative/InitiativePlanReview.vue +19 -21
- package/app/components/initiative/InitiativePlanningWindow.vue +5 -5
- package/app/components/initiative/InitiativeTrackerWindow.vue +54 -53
- package/app/components/judge/JudgeResultView.vue +24 -25
- package/app/components/kaizen/KaizenPanel.vue +4 -4
- 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 +4 -0
- package/app/components/layout/AiProvidersBanner.vue +1 -1
- package/app/components/layout/AppearanceSwitcher.vue +1 -1
- package/app/components/layout/BoardSwitcher.vue +3 -2
- package/app/components/layout/BoardToolbar.vue +6 -2
- package/app/components/layout/CommandBar.vue +4 -2
- package/app/components/layout/DefaultTestEnvBanner.vue +2 -2
- package/app/components/layout/IntegrationsHub.vue +4 -3
- package/app/components/layout/LanguageSwitcher.vue +1 -1
- package/app/components/layout/ModelProvidersHub.vue +6 -4
- package/app/components/layout/NotificationsInbox.vue +8 -7
- package/app/components/layout/PersonalSetupModal.vue +5 -3
- package/app/components/layout/RolePrompt.vue +1 -1
- package/app/components/layout/SideBar.vue +3 -5
- package/app/components/layout/SpendWarningBanner.vue +3 -3
- package/app/components/layout/TranslationWarningBanner.vue +1 -1
- package/app/components/layout/UiModeSwitcher.vue +7 -6
- package/app/components/layout/UiRoleSwitcher.vue +2 -2
- package/app/components/media/ArtifactLightbox.vue +6 -6
- package/app/components/media/ImageCompare.vue +16 -16
- package/app/components/merge/MergeEffortChips.vue +4 -6
- package/app/components/notifications/NotificationSettingsPanel.vue +6 -5
- package/app/components/observability/OutcomeFilterChips.vue +1 -1
- package/app/components/observability/RunFailureSummary.vue +14 -17
- package/app/components/observability/StepMetricsBar.vue +9 -8
- package/app/components/observability/StepModelActivity.vue +4 -3
- package/app/components/observability/ToolCallList.vue +15 -18
- package/app/components/outcome/OutcomeSummaryWindow.vue +43 -42
- package/app/components/palettes/AgentPalette.vue +7 -5
- package/app/components/palettes/AgentTierSelect.vue +1 -1
- package/app/components/palettes/PipelinePurposeSelect.vue +2 -1
- package/app/components/panels/AgentStepDetail.vue +27 -30
- 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 +66 -76
- package/app/components/panels/OperatorDashboardPanel.vue +27 -26
- package/app/components/panels/ReportsPanel.vue +26 -25
- package/app/components/panels/ReportsSpendBreakdown.vue +2 -2
- package/app/components/panels/ResultWindowShell.vue +19 -18
- package/app/components/panels/RunDetailLoadState.vue +1 -1
- package/app/components/panels/StepContainerStatus.vue +8 -7
- package/app/components/panels/StepDelegatedStatus.vue +13 -12
- 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/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 +8 -7
- package/app/components/panels/inspector/FrontendBindingsResolved.vue +5 -4
- package/app/components/panels/inspector/FrontendConfig.vue +26 -34
- package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
- package/app/components/panels/inspector/InspectorSection.vue +7 -4
- package/app/components/panels/inspector/RecurringScheduleSettings.vue +9 -8
- 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 +9 -13
- package/app/components/panels/inspector/ServiceTestConfig.vue +41 -45
- 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 +13 -12
- package/app/components/panels/inspector/TaskRunSettings.vue +35 -38
- 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 +2 -2
- package/app/components/pipeline/GateConfigFields.vue +6 -6
- package/app/components/pipeline/IterationCapPrompt.vue +1 -1
- package/app/components/pipeline/PipelineBuilder.vue +28 -27
- package/app/components/pipeline/PipelineHealthModal.vue +7 -7
- package/app/components/pipeline/PipelinePicker.vue +3 -3
- package/app/components/pipeline/PipelinePreview.vue +6 -7
- package/app/components/pipeline/PipelineProgress.vue +23 -24
- package/app/components/prReview/PrReviewWindow.vue +42 -41
- package/app/components/providers/AiPresetMismatchDialog.vue +4 -3
- package/app/components/providers/AiProviderOnboardingModal.vue +2 -2
- package/app/components/providers/ApiKeysSection.vue +7 -6
- 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 +25 -26
- package/app/components/requirements/RequirementsReviewWindow.vue +13 -12
- package/app/components/riskPolicy/RiskPolicyPicker.vue +5 -5
- package/app/components/riskPolicy/RiskPolicyPreview.vue +16 -15
- package/app/components/sandbox/SandboxPanel.vue +21 -20
- 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 +16 -16
- package/app/components/settings/ComposeEnvironmentSetupSection.vue +14 -12
- package/app/components/settings/ConnectionTestVerdict.vue +1 -1
- package/app/components/settings/ConsensusGroupsSection.vue +21 -20
- package/app/components/settings/CustomManifestTypeEditor.vue +8 -7
- package/app/components/settings/DefaultProvisionTypeSection.vue +5 -5
- package/app/components/settings/InfraHandlersConfigurator.vue +14 -15
- package/app/components/settings/InfrastructureBackendPicker.vue +2 -2
- package/app/components/settings/IssueTrackerPanel.vue +9 -15
- 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 +10 -9
- package/app/components/settings/MergeClassRulesEditor.vue +6 -5
- package/app/components/settings/MergeRolePolicyEditor.vue +13 -12
- package/app/components/settings/ModelConfigurationPanel.vue +8 -11
- package/app/components/settings/ModelPresetHealthModal.vue +3 -3
- package/app/components/settings/ObservabilityConnectionPanel.vue +1 -1
- package/app/components/settings/OpenRouterCatalogPanel.vue +6 -5
- 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 +8 -7
- package/app/components/settings/RiskPolicyCreateForm.vue +40 -26
- package/app/components/settings/RiskPolicyEditorRow.vue +18 -17
- package/app/components/settings/RiskPolicyHealthModal.vue +3 -3
- package/app/components/settings/RiskPolicyPanel.vue +11 -13
- package/app/components/settings/ServiceFragmentDefaultsPanel.vue +5 -4
- 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 +8 -7
- package/app/components/skills/SkillLibraryManager.vue +2 -2
- package/app/components/slack/SlackPanel.vue +8 -7
- package/app/components/spec/ServiceSpecWindow.vue +15 -16
- package/app/components/tasks/BugHuntModal.vue +1 -1
- package/app/components/tasks/ContextIssuePicker.vue +4 -6
- package/app/components/tasks/TaskContextIssues.vue +1 -1
- package/app/components/tasks/TaskImportModal.vue +3 -2
- package/app/components/tasks/TaskSourceConnectModal.vue +5 -5
- package/app/components/testing/TestReportWindow.vue +54 -53
- 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 +23 -25
- package/app/composables/usePipelineErrorToast.ts +2 -0
- package/app/utils/catalog.ts +8 -0
- package/app/utils/theme/builtins.ts +7 -1
- package/i18n/locales/de.json +6 -3
- package/i18n/locales/en.json +6 -3
- package/i18n/locales/es.json +6 -3
- package/i18n/locales/fr.json +6 -3
- package/i18n/locales/he.json +6 -3
- package/i18n/locales/it.json +6 -3
- package/i18n/locales/ja.json +6 -3
- package/i18n/locales/pl.json +6 -3
- package/i18n/locales/tr.json +6 -3
- package/i18n/locales/uk.json +6 -3
- package/package.json +2 -2
|
@@ -137,7 +137,7 @@ const reseedableCount = computed(
|
|
|
137
137
|
{{ t('pipeline.health.newHeading') }}
|
|
138
138
|
</h3>
|
|
139
139
|
</div>
|
|
140
|
-
<p class="text-
|
|
140
|
+
<p class="text-2xs text-dimmed">{{ t('pipeline.health.newDescription') }}</p>
|
|
141
141
|
<ul class="space-y-2">
|
|
142
142
|
<li
|
|
143
143
|
v-for="p in newPipelines"
|
|
@@ -172,7 +172,7 @@ const reseedableCount = computed(
|
|
|
172
172
|
{{ t('pipeline.health.invalidHeading') }}
|
|
173
173
|
</h3>
|
|
174
174
|
</div>
|
|
175
|
-
<p class="text-
|
|
175
|
+
<p class="text-2xs text-dimmed">
|
|
176
176
|
{{ t('pipeline.health.invalidDescription') }}
|
|
177
177
|
</p>
|
|
178
178
|
<ul class="space-y-2">
|
|
@@ -195,7 +195,7 @@ const reseedableCount = computed(
|
|
|
195
195
|
<li
|
|
196
196
|
v-for="(p, i) in h.problems"
|
|
197
197
|
:key="i"
|
|
198
|
-
class="text-
|
|
198
|
+
class="text-2xs"
|
|
199
199
|
:class="
|
|
200
200
|
p.type === 'outdated' ? 'text-app-warning-400/80' : 'text-app-error-400/90'
|
|
201
201
|
"
|
|
@@ -241,7 +241,7 @@ const reseedableCount = computed(
|
|
|
241
241
|
{{ t('pipeline.health.retiredHeading') }}
|
|
242
242
|
</h3>
|
|
243
243
|
</div>
|
|
244
|
-
<p class="text-
|
|
244
|
+
<p class="text-2xs text-dimmed">{{ t('pipeline.health.retiredDescription') }}</p>
|
|
245
245
|
<ul class="space-y-2">
|
|
246
246
|
<li
|
|
247
247
|
v-for="r in retired"
|
|
@@ -250,7 +250,7 @@ const reseedableCount = computed(
|
|
|
250
250
|
>
|
|
251
251
|
<div class="min-w-0">
|
|
252
252
|
<span class="truncate text-sm font-medium text-app-100">{{ r.pipeline.name }}</span>
|
|
253
|
-
<p class="text-
|
|
253
|
+
<p class="text-2xs text-muted/80">
|
|
254
254
|
{{
|
|
255
255
|
r.replacement
|
|
256
256
|
? t('pipeline.health.retiredReplacedBy', { name: r.replacement.name })
|
|
@@ -281,7 +281,7 @@ const reseedableCount = computed(
|
|
|
281
281
|
{{ t('pipeline.health.updatesHeading') }}
|
|
282
282
|
</h3>
|
|
283
283
|
</div>
|
|
284
|
-
<p class="text-
|
|
284
|
+
<p class="text-2xs text-dimmed">
|
|
285
285
|
{{ t('pipeline.health.updatesDescription') }}
|
|
286
286
|
</p>
|
|
287
287
|
<ul class="space-y-2">
|
|
@@ -292,7 +292,7 @@ const reseedableCount = computed(
|
|
|
292
292
|
>
|
|
293
293
|
<div class="min-w-0">
|
|
294
294
|
<span class="truncate text-sm font-medium text-app-100">{{ h.pipeline.name }}</span>
|
|
295
|
-
<p class="text-
|
|
295
|
+
<p class="text-2xs text-app-warning-400/80">{{ h.problems[0]?.message }}</p>
|
|
296
296
|
</div>
|
|
297
297
|
<UButton
|
|
298
298
|
size="xs"
|
|
@@ -96,7 +96,7 @@ function choose(id: string) {
|
|
|
96
96
|
<li v-if="noneLabel !== undefined">
|
|
97
97
|
<button
|
|
98
98
|
type="button"
|
|
99
|
-
class="flex w-full items-center gap-2 rounded px-2 py-1.5 text-start text-sm hover:bg-elevated/60"
|
|
99
|
+
class="flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-start text-sm hover:bg-elevated/60"
|
|
100
100
|
:class="modelValue ? 'text-toned' : 'text-app-100'"
|
|
101
101
|
data-testid="pipeline-option-none"
|
|
102
102
|
@mouseenter="hoverId = ''"
|
|
@@ -114,7 +114,7 @@ function choose(id: string) {
|
|
|
114
114
|
<li v-for="p in options" :key="p.id">
|
|
115
115
|
<button
|
|
116
116
|
type="button"
|
|
117
|
-
class="flex w-full items-center gap-2 rounded px-2 py-1.5 text-start text-sm hover:bg-elevated/60"
|
|
117
|
+
class="flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-start text-sm hover:bg-elevated/60"
|
|
118
118
|
:class="modelValue === p.id ? 'text-app-100' : 'text-toned'"
|
|
119
119
|
:data-testid="`pipeline-option-${p.id}`"
|
|
120
120
|
@mouseenter="hoverId = p.id"
|
|
@@ -134,7 +134,7 @@ function choose(id: string) {
|
|
|
134
134
|
<!-- right: preview of the hovered (or selected) pipeline -->
|
|
135
135
|
<div class="w-1/2 overflow-y-auto p-3">
|
|
136
136
|
<PipelinePreview v-if="previewPipeline" :pipeline="previewPipeline" />
|
|
137
|
-
<div v-else class="text-
|
|
137
|
+
<div v-else class="text-xs leading-snug text-dimmed">{{ emptyHint }}</div>
|
|
138
138
|
</div>
|
|
139
139
|
</div>
|
|
140
140
|
</template>
|
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
pipelineGateCount,
|
|
19
19
|
} from '~/utils/pipeline'
|
|
20
20
|
import AgentKindIcon from '~/components/pipeline/AgentKindIcon.vue'
|
|
21
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
21
22
|
|
|
22
23
|
const props = defineProps<{ pipeline: Pipeline }>()
|
|
23
24
|
const { t } = useI18n()
|
|
@@ -37,15 +38,13 @@ function stepDescription(kind: string): string {
|
|
|
37
38
|
<div class="text-sm font-semibold text-app-100">{{ pipeline.name }}</div>
|
|
38
39
|
<p
|
|
39
40
|
v-if="pipeline.description"
|
|
40
|
-
class="text-
|
|
41
|
+
class="text-xs leading-snug text-muted"
|
|
41
42
|
data-testid="pipeline-preview-description"
|
|
42
43
|
>
|
|
43
44
|
{{ pipeline.description }}
|
|
44
45
|
</p>
|
|
45
46
|
|
|
46
|
-
<
|
|
47
|
-
class="flex flex-wrap items-center gap-x-3 gap-y-1 text-[10px] uppercase tracking-wide text-dimmed"
|
|
48
|
-
>
|
|
47
|
+
<SectionLabel class="flex flex-wrap items-center gap-x-3 gap-y-1">
|
|
49
48
|
<span class="inline-flex items-center gap-1">
|
|
50
49
|
<UIcon name="i-lucide-workflow" class="h-3 w-3" />
|
|
51
50
|
{{ t('pipeline.preview.stepCount', { count: steps.length }, steps.length) }}
|
|
@@ -62,7 +61,7 @@ function stepDescription(kind: string): string {
|
|
|
62
61
|
<UIcon name="i-lucide-git-branch" class="h-3 w-3" />
|
|
63
62
|
{{ t('pipeline.preview.conditionalCount', { count: conditionalCount }, conditionalCount) }}
|
|
64
63
|
</span>
|
|
65
|
-
</
|
|
64
|
+
</SectionLabel>
|
|
66
65
|
|
|
67
66
|
<!-- The ordered steps. The number column doubles as the flow connector (a rule drawn between
|
|
68
67
|
consecutive numbers), so the list reads as a sequence rather than an unordered set. -->
|
|
@@ -76,7 +75,7 @@ function stepDescription(kind: string): string {
|
|
|
76
75
|
>
|
|
77
76
|
<div class="flex flex-col items-center">
|
|
78
77
|
<span
|
|
79
|
-
class="flex h-4 w-4 shrink-0 items-center justify-center rounded-full bg-elevated font-mono text-
|
|
78
|
+
class="flex h-4 w-4 shrink-0 items-center justify-center rounded-full bg-elevated font-mono text-3xs tabular-nums text-muted"
|
|
80
79
|
>
|
|
81
80
|
{{ i + 1 }}
|
|
82
81
|
</span>
|
|
@@ -101,7 +100,7 @@ function stepDescription(kind: string): string {
|
|
|
101
100
|
</div>
|
|
102
101
|
<!-- Clamped: the catalog prose runs long for some kinds, and <AgentKindIcon> already
|
|
103
102
|
carries the full text in its hover tooltip. -->
|
|
104
|
-
<p class="line-clamp-2 text-
|
|
103
|
+
<p class="line-clamp-2 text-2xs leading-snug text-dimmed">
|
|
105
104
|
{{ stepDescription(s.kind) }}
|
|
106
105
|
</p>
|
|
107
106
|
</div>
|
|
@@ -20,6 +20,7 @@ import StepMetricsBar from '~/components/observability/StepMetricsBar.vue'
|
|
|
20
20
|
import PrReviewPhaseBadge from '~/components/prReview/PrReviewPhaseBadge.vue'
|
|
21
21
|
import { useNowTick, stepDurationLabel } from '~/composables/useStepTimer'
|
|
22
22
|
import type { BadgeColor } from '~/utils/badge'
|
|
23
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
23
24
|
|
|
24
25
|
const props = defineProps<{ instance: ExecutionInstance }>()
|
|
25
26
|
const emit = defineEmits<{
|
|
@@ -292,7 +293,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
292
293
|
<span
|
|
293
294
|
v-for="l in legend"
|
|
294
295
|
:key="l.state"
|
|
295
|
-
class="inline-flex items-center gap-1.5 text-
|
|
296
|
+
class="inline-flex items-center gap-1.5 text-2xs text-muted"
|
|
296
297
|
>
|
|
297
298
|
<span
|
|
298
299
|
class="h-2 w-2 rounded-full"
|
|
@@ -365,15 +366,13 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
365
366
|
</span>
|
|
366
367
|
<span
|
|
367
368
|
v-if="isCompanionKind(s.agentKind)"
|
|
368
|
-
class="shrink-0 rounded bg-accented/60 px-1 text-
|
|
369
|
+
class="shrink-0 rounded-sm bg-accented/60 px-1 text-3xs font-medium uppercase tracking-wide text-toned"
|
|
369
370
|
:title="t('pipeline.progress.companionTooltip')"
|
|
370
371
|
>
|
|
371
372
|
{{ t('pipeline.progress.companion') }}
|
|
372
373
|
</span>
|
|
373
374
|
</div>
|
|
374
|
-
<
|
|
375
|
-
class="flex items-center gap-1.5 text-[10px] uppercase tracking-wide text-dimmed"
|
|
376
|
-
>
|
|
375
|
+
<SectionLabel class="flex items-center gap-1.5">
|
|
377
376
|
<span>{{ t('pipeline.progress.stepOf', { current: i + 1, total }) }}</span>
|
|
378
377
|
<!-- live elapsed clock: a running step counts up (so no-subtask steps
|
|
379
378
|
don't read as hung), a finished step shows its total duration -->
|
|
@@ -385,10 +384,10 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
385
384
|
<UIcon name="i-lucide-clock" class="h-2.5 w-2.5 shrink-0" />
|
|
386
385
|
{{ stepElapsed(s) }}
|
|
387
386
|
</span>
|
|
388
|
-
</
|
|
387
|
+
</SectionLabel>
|
|
389
388
|
</div>
|
|
390
389
|
<span
|
|
391
|
-
class="ms-auto shrink-0 text-
|
|
390
|
+
class="ms-auto shrink-0 text-2xs font-medium"
|
|
392
391
|
:style="{ color: stepVisual(s).color }"
|
|
393
392
|
>
|
|
394
393
|
{{ stepVisual(s).label }}
|
|
@@ -458,7 +457,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
458
457
|
<!-- container cold-boot phase: shown while the container is spinning up. -->
|
|
459
458
|
<div
|
|
460
459
|
v-if="s.container?.status === 'starting' && !runFailed"
|
|
461
|
-
class="mt-2 flex items-center gap-1.5 text-
|
|
460
|
+
class="mt-2 flex items-center gap-1.5 text-2xs text-app-info-300"
|
|
462
461
|
>
|
|
463
462
|
<UIcon name="i-lucide-loader-circle" class="h-3.5 w-3.5 shrink-0 animate-spin" />
|
|
464
463
|
<span>{{ t('pipeline.progress.spinningUpContainer') }}</span>
|
|
@@ -468,7 +467,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
468
467
|
making calls) so the step isn't a blank "working" before subtasks appear. -->
|
|
469
468
|
<div
|
|
470
469
|
v-else-if="stepPhaseLabel(s) && !runFailed"
|
|
471
|
-
class="mt-2 flex items-center gap-1.5 text-
|
|
470
|
+
class="mt-2 flex items-center gap-1.5 text-2xs text-app-success-300"
|
|
472
471
|
>
|
|
473
472
|
<UIcon name="i-lucide-box" class="h-3.5 w-3.5 shrink-0" />
|
|
474
473
|
<span>{{ stepPhaseLabel(s) }}</span>
|
|
@@ -481,14 +480,14 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
481
480
|
v-if="prPhaseActive(s)"
|
|
482
481
|
:step="s"
|
|
483
482
|
:run-failed="runFailed"
|
|
484
|
-
class="mt-2 text-
|
|
483
|
+
class="mt-2 text-2xs"
|
|
485
484
|
/>
|
|
486
485
|
|
|
487
486
|
<!-- live subtask counts from the agent's todo list -->
|
|
488
487
|
<div v-if="s.subtasks && s.subtasks.total > 0" class="mt-2">
|
|
489
488
|
<div
|
|
490
489
|
v-if="!prPhaseActive(s)"
|
|
491
|
-
class="flex items-center justify-between text-
|
|
490
|
+
class="flex items-center justify-between text-3xs text-muted"
|
|
492
491
|
>
|
|
493
492
|
<span>
|
|
494
493
|
{{
|
|
@@ -515,7 +514,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
515
514
|
<li
|
|
516
515
|
v-for="(item, i) in s.subtasks.items"
|
|
517
516
|
:key="i"
|
|
518
|
-
class="flex items-start gap-1.5 text-
|
|
517
|
+
class="flex items-start gap-1.5 text-2xs"
|
|
519
518
|
:class="
|
|
520
519
|
item.status === 'completed'
|
|
521
520
|
? 'text-dimmed line-through'
|
|
@@ -537,7 +536,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
537
536
|
<!-- model used for this step -->
|
|
538
537
|
<p
|
|
539
538
|
v-if="s.model"
|
|
540
|
-
class="mt-2 flex items-center gap-1 truncate text-
|
|
539
|
+
class="mt-2 flex items-center gap-1 truncate text-3xs text-dimmed"
|
|
541
540
|
:title="s.model"
|
|
542
541
|
>
|
|
543
542
|
<UIcon name="i-lucide-cpu" class="h-3 w-3 shrink-0" />
|
|
@@ -557,7 +556,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
557
556
|
|
|
558
557
|
<!-- A one-line hint that the agent produced prose; the full output (and
|
|
559
558
|
all step metadata) lives in the step-detail overlay opened by click. -->
|
|
560
|
-
<p v-if="stepHasOutput(s)" class="mt-2 flex items-center gap-1 text-
|
|
559
|
+
<p v-if="stepHasOutput(s)" class="mt-2 flex items-center gap-1 text-2xs text-dimmed">
|
|
561
560
|
<UIcon name="i-lucide-book-open-text" class="h-3 w-3 shrink-0" />
|
|
562
561
|
{{ t('pipeline.progress.clickToRead') }}
|
|
563
562
|
</p>
|
|
@@ -567,7 +566,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
567
566
|
which reads as a tester that silently did its job. -->
|
|
568
567
|
<p
|
|
569
568
|
v-if="stepSkipReasonKey(s)"
|
|
570
|
-
class="mt-2 flex items-center gap-1 text-
|
|
569
|
+
class="mt-2 flex items-center gap-1 text-2xs text-dimmed"
|
|
571
570
|
data-testid="step-skip-reason"
|
|
572
571
|
>
|
|
573
572
|
<UIcon name="i-lucide-skip-forward" class="h-3 w-3 shrink-0" />
|
|
@@ -593,12 +592,12 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
593
592
|
]"
|
|
594
593
|
/>
|
|
595
594
|
</span>
|
|
596
|
-
<span class="min-w-0 flex-1 truncate text-
|
|
595
|
+
<span class="min-w-0 flex-1 truncate text-xs text-toned">
|
|
597
596
|
{{ agentKindMeta(companionByStep[i]!.kind).label }}
|
|
598
597
|
<span class="text-dimmed">{{ t('pipeline.progress.companionSuffix') }}</span>
|
|
599
598
|
</span>
|
|
600
599
|
<span
|
|
601
|
-
class="shrink-0 text-
|
|
600
|
+
class="shrink-0 text-2xs font-medium"
|
|
602
601
|
:class="COMPANION_STATE_META[companionByStep[i]!.state].text"
|
|
603
602
|
>
|
|
604
603
|
{{ COMPANION_STATE_META[companionByStep[i]!.state].label }}
|
|
@@ -624,12 +623,12 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
624
623
|
>
|
|
625
624
|
<UIcon :name="FOLLOW_UP_COMPANION_META.icon" class="h-3 w-3 text-app-hue-pink" />
|
|
626
625
|
</span>
|
|
627
|
-
<span class="min-w-0 flex-1 truncate text-
|
|
626
|
+
<span class="min-w-0 flex-1 truncate text-xs text-toned">
|
|
628
627
|
{{ FOLLOW_UP_COMPANION_META.label }}
|
|
629
628
|
<span class="text-dimmed">{{ t('pipeline.progress.companionSuffix') }}</span>
|
|
630
629
|
</span>
|
|
631
630
|
<span
|
|
632
|
-
class="shrink-0 text-
|
|
631
|
+
class="shrink-0 text-2xs font-medium"
|
|
633
632
|
:class="followUpPending(s) > 0 ? 'text-app-hue-pink' : 'text-muted'"
|
|
634
633
|
>
|
|
635
634
|
{{ followUpLabel(s) }}
|
|
@@ -663,7 +662,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
663
662
|
:class="forkPhase(s) === 'proposing' ? 'animate-spin' : ''"
|
|
664
663
|
/>
|
|
665
664
|
</span>
|
|
666
|
-
<span class="min-w-0 flex-1 truncate text-
|
|
665
|
+
<span class="min-w-0 flex-1 truncate text-xs text-toned">
|
|
667
666
|
{{
|
|
668
667
|
forkPhase(s) === 'proposing'
|
|
669
668
|
? t('pipeline.progress.forkDecision.proposing')
|
|
@@ -687,7 +686,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
687
686
|
>
|
|
688
687
|
<UIcon name="i-lucide-clipboard-check" class="h-3 w-3 text-primary" />
|
|
689
688
|
</span>
|
|
690
|
-
<span class="min-w-0 flex-1 truncate text-
|
|
689
|
+
<span class="min-w-0 flex-1 truncate text-xs text-toned">
|
|
691
690
|
{{ t('pipeline.progress.prReview.review') }}
|
|
692
691
|
</span>
|
|
693
692
|
</button>
|
|
@@ -712,7 +711,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
712
711
|
class="h-3 w-3 text-app-hue-cyan"
|
|
713
712
|
/>
|
|
714
713
|
</span>
|
|
715
|
-
<span class="min-w-0 flex-1 truncate text-
|
|
714
|
+
<span class="min-w-0 flex-1 truncate text-xs text-toned">
|
|
716
715
|
{{ t('pipeline.progress.binaryCandidates.choose') }}
|
|
717
716
|
</span>
|
|
718
717
|
</button>
|
|
@@ -721,7 +720,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
721
720
|
NOT a "Review & approve" gate (the human is summoned only if needed) -->
|
|
722
721
|
<div
|
|
723
722
|
v-if="reviewStageLabel(s.agentKind)"
|
|
724
|
-
class="mt-3 inline-flex items-center gap-1 text-
|
|
723
|
+
class="mt-3 inline-flex items-center gap-1 text-2xs text-primary"
|
|
725
724
|
>
|
|
726
725
|
<UIcon name="i-lucide-loader-circle" class="h-3 w-3 animate-spin" />
|
|
727
726
|
{{ reviewStageLabel(s.agentKind) }}
|
|
@@ -766,7 +765,7 @@ const ITEM_ICON: Record<string, string> = {
|
|
|
766
765
|
</div>
|
|
767
766
|
<p
|
|
768
767
|
v-else-if="s.decision?.chosen"
|
|
769
|
-
class="mt-2 flex items-center gap-1 truncate text-
|
|
768
|
+
class="mt-2 flex items-center gap-1 truncate text-2xs text-app-success-400"
|
|
770
769
|
:title="s.decision.chosen"
|
|
771
770
|
>
|
|
772
771
|
<UIcon name="i-lucide-check" class="h-3 w-3 shrink-0" />
|