@cat-factory/app 0.302.2 → 0.303.1
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 +99 -14
- 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 +26 -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 +10 -9
|
@@ -423,7 +423,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
423
423
|
data-testid="pipeline-builder-palette"
|
|
424
424
|
>
|
|
425
425
|
<div class="mb-2 flex shrink-0 items-center justify-between gap-2">
|
|
426
|
-
<h3 class="text-xs font-semibold uppercase tracking-wide text-
|
|
426
|
+
<h3 class="text-xs font-semibold uppercase tracking-wide text-muted">
|
|
427
427
|
{{ t('pipeline.builder.agentPalette') }}
|
|
428
428
|
</h3>
|
|
429
429
|
<UButton
|
|
@@ -447,7 +447,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
447
447
|
data-testid="pipeline-builder-draft"
|
|
448
448
|
>
|
|
449
449
|
<div class="mb-2 flex items-center justify-between gap-2">
|
|
450
|
-
<h3 class="text-xs font-semibold uppercase tracking-wide text-
|
|
450
|
+
<h3 class="text-xs font-semibold uppercase tracking-wide text-muted">
|
|
451
451
|
{{ t('pipeline.builder.pipeline') }}
|
|
452
452
|
</h3>
|
|
453
453
|
<UButton
|
|
@@ -490,14 +490,14 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
490
490
|
class="gap-1"
|
|
491
491
|
>
|
|
492
492
|
{{ l }}
|
|
493
|
-
<button type="button" class="hover:text-
|
|
493
|
+
<button type="button" class="hover:text-app-error-400" @click="removeLabel(l)">
|
|
494
494
|
<UIcon name="i-lucide-x" class="h-3 w-3" />
|
|
495
495
|
</button>
|
|
496
496
|
</UBadge>
|
|
497
497
|
<input
|
|
498
498
|
v-model="newLabel"
|
|
499
499
|
:placeholder="t('pipeline.builder.labelPlaceholder')"
|
|
500
|
-
class="w-20 rounded border border-
|
|
500
|
+
class="w-20 rounded border border-muted bg-default px-1.5 py-0.5 text-[11px] text-default focus:w-28"
|
|
501
501
|
@keydown.enter.prevent="addLabel"
|
|
502
502
|
@blur="addLabel"
|
|
503
503
|
/>
|
|
@@ -508,7 +508,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
508
508
|
<p
|
|
509
509
|
v-for="warning in draftWarnings"
|
|
510
510
|
:key="warning.key"
|
|
511
|
-
class="mb-2 flex items-center gap-1.5 rounded-md border border-
|
|
511
|
+
class="mb-2 flex items-center gap-1.5 rounded-md border border-app-warning-800/50 bg-app-warning-950/30 px-2 py-1 text-[11px] text-app-warning-300"
|
|
512
512
|
:data-testid="warning.testId"
|
|
513
513
|
>
|
|
514
514
|
<UIcon name="i-lucide-alert-triangle" class="h-3.5 w-3.5 shrink-0" />
|
|
@@ -517,7 +517,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
517
517
|
|
|
518
518
|
<div
|
|
519
519
|
v-if="pipelines.draft.length === 0"
|
|
520
|
-
class="flex flex-1 items-center justify-center rounded-lg border border-dashed border-
|
|
520
|
+
class="flex flex-1 items-center justify-center rounded-lg border border-dashed border-muted p-4 text-center text-xs text-dimmed"
|
|
521
521
|
>
|
|
522
522
|
{{ t('pipeline.builder.emptyDraft') }}
|
|
523
523
|
</div>
|
|
@@ -526,19 +526,17 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
526
526
|
<li
|
|
527
527
|
v-for="(unit, vi) in pipelines.units"
|
|
528
528
|
:key="unit.index"
|
|
529
|
-
class="flex flex-col gap-2 rounded-lg border border-
|
|
529
|
+
class="flex flex-col gap-2 rounded-lg border border-muted bg-elevated/60 p-2"
|
|
530
530
|
:class="{ 'opacity-50': pipelines.draftEnabled[unit.index] === false }"
|
|
531
531
|
data-testid="pipeline-draft-step"
|
|
532
532
|
:data-agent-kind="unit.kind"
|
|
533
533
|
:data-gated="pipelines.draftGates[unit.index] === true"
|
|
534
534
|
>
|
|
535
535
|
<div class="flex items-center gap-1.5">
|
|
536
|
-
<span class="w-4 shrink-0 text-center text-[10px] text-
|
|
537
|
-
vi + 1
|
|
538
|
-
}}</span>
|
|
536
|
+
<span class="w-4 shrink-0 text-center text-[10px] text-dimmed">{{ vi + 1 }}</span>
|
|
539
537
|
<AgentKindIcon :kind="unit.kind" icon-class="h-4 w-4" />
|
|
540
538
|
<span
|
|
541
|
-
class="min-w-0 flex-1 truncate text-xs text-
|
|
539
|
+
class="min-w-0 flex-1 truncate text-xs text-app-100"
|
|
542
540
|
:class="{ 'line-through': pipelines.draftEnabled[unit.index] === false }"
|
|
543
541
|
:title="agentKindMeta(unit.kind).description"
|
|
544
542
|
>
|
|
@@ -787,10 +785,10 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
787
785
|
:disabled="!skillSelectItems.length"
|
|
788
786
|
@update:model-value="pipelines.setDraftSkillId(unit.index, $event)"
|
|
789
787
|
/>
|
|
790
|
-
<p v-if="!skillSelectItems.length" class="text-[10px] text-
|
|
788
|
+
<p v-if="!skillSelectItems.length" class="text-[10px] text-dimmed">
|
|
791
789
|
{{ t('pipeline.builder.skillNoneAvailable') }}
|
|
792
790
|
</p>
|
|
793
|
-
<p v-else-if="skillMissing(unit.index)" class="text-[10px] text-
|
|
791
|
+
<p v-else-if="skillMissing(unit.index)" class="text-[10px] text-app-warning-400">
|
|
794
792
|
{{ t('pipeline.builder.skillMissing') }}
|
|
795
793
|
</p>
|
|
796
794
|
</div>
|
|
@@ -803,7 +801,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
803
801
|
v-if="showVariantPicker(unit.index, unit.kind)"
|
|
804
802
|
class="ms-6 flex items-center gap-2"
|
|
805
803
|
>
|
|
806
|
-
<span class="text-[10px] text-
|
|
804
|
+
<span class="text-[10px] text-dimmed">
|
|
807
805
|
{{ t('pipeline.builder.variantLabel') }}
|
|
808
806
|
</span>
|
|
809
807
|
<USelect
|
|
@@ -844,7 +842,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
844
842
|
setting (itself an override of the deployment routing default), so it is
|
|
845
843
|
advanced-only until a value is pinned; empty inherits. -->
|
|
846
844
|
<div v-if="showOutputBudget(unit.index)" class="ms-6 flex items-center gap-2">
|
|
847
|
-
<span class="text-[10px] text-
|
|
845
|
+
<span class="text-[10px] text-dimmed">
|
|
848
846
|
{{ t('pipeline.outputBudget.stepLabel') }}
|
|
849
847
|
</span>
|
|
850
848
|
<OutputBudgetInput
|
|
@@ -861,15 +859,15 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
861
859
|
gated on the task estimate. -->
|
|
862
860
|
<div
|
|
863
861
|
v-if="unit.companionIndex !== null"
|
|
864
|
-
class="ms-6 space-y-2 rounded-md border border-fuchsia
|
|
862
|
+
class="ms-6 space-y-2 rounded-md border border-app-hue-fuchsia/40 bg-app-hue-fuchsia/10 p-2 text-xs"
|
|
865
863
|
>
|
|
866
864
|
<div class="flex items-center gap-1.5">
|
|
867
|
-
<UIcon name="i-lucide-corner-down-right" class="h-3.5 w-3.5 text-
|
|
865
|
+
<UIcon name="i-lucide-corner-down-right" class="h-3.5 w-3.5 text-dimmed" />
|
|
868
866
|
<AgentKindIcon
|
|
869
867
|
:kind="pipelines.draft[unit.companionIndex]!"
|
|
870
868
|
icon-class="h-4 w-4"
|
|
871
869
|
/>
|
|
872
|
-
<span class="min-w-0 flex-1 truncate text-
|
|
870
|
+
<span class="min-w-0 flex-1 truncate text-default">
|
|
873
871
|
{{ agentKindMeta(pipelines.draft[unit.companionIndex]!).label }}
|
|
874
872
|
</span>
|
|
875
873
|
<!-- A companion is an agent kind with a prompt of its own, and this row is its
|
|
@@ -921,7 +919,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
921
919
|
<!-- Consensus config (shown when the step is consensus-enabled). -->
|
|
922
920
|
<div
|
|
923
921
|
v-if="pipelines.draftConsensus[unit.index]?.enabled"
|
|
924
|
-
class="ms-6 space-y-2 rounded-md border border-
|
|
922
|
+
class="ms-6 space-y-2 rounded-md border border-app-success-800/40 bg-app-success-950/20 p-2 text-xs"
|
|
925
923
|
>
|
|
926
924
|
<!-- The workspace consensus-GROUP tier set: pick which reusable panels this
|
|
927
925
|
step may escalate to. Each group carries its own estimate bar; the engine
|
|
@@ -930,13 +928,13 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
930
928
|
editor below, so the step has exactly one source of truth for its panel. -->
|
|
931
929
|
<div
|
|
932
930
|
v-if="consensusGroups.hasGroups"
|
|
933
|
-
class="space-y-1 border-b border-
|
|
931
|
+
class="space-y-1 border-b border-default pb-2"
|
|
934
932
|
>
|
|
935
933
|
<div class="flex items-center gap-1.5">
|
|
936
|
-
<UIcon name="i-lucide-layers" class="h-3.5 w-3.5 text-
|
|
937
|
-
<span class="text-
|
|
934
|
+
<UIcon name="i-lucide-layers" class="h-3.5 w-3.5 text-app-success-400" />
|
|
935
|
+
<span class="text-toned">{{ t('pipeline.builder.consensusGroups') }}</span>
|
|
938
936
|
</div>
|
|
939
|
-
<p class="text-[11px] text-
|
|
937
|
+
<p class="text-[11px] text-dimmed">
|
|
940
938
|
{{ t('pipeline.builder.consensusGroupsHint') }}
|
|
941
939
|
</p>
|
|
942
940
|
<div class="flex flex-wrap gap-1">
|
|
@@ -947,28 +945,28 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
947
945
|
class="rounded border px-1.5 py-0.5 text-[11px]"
|
|
948
946
|
:class="
|
|
949
947
|
isGroupSelected(unit.index, group.id)
|
|
950
|
-
? 'border-
|
|
951
|
-
: 'border-
|
|
948
|
+
? 'border-app-success-600 bg-app-success-900/40 text-app-success-200'
|
|
949
|
+
: 'border-muted bg-default text-muted hover:text-default'
|
|
952
950
|
"
|
|
953
951
|
:title="group.description"
|
|
954
952
|
@click="pipelines.toggleDraftConsensusGroup(unit.index, group.id)"
|
|
955
953
|
>
|
|
956
954
|
{{ group.name }}
|
|
957
|
-
<span class="ms-1 text-
|
|
955
|
+
<span class="ms-1 text-dimmed">{{ groupBarLabel(group.id) }}</span>
|
|
958
956
|
</button>
|
|
959
957
|
</div>
|
|
960
958
|
</div>
|
|
961
959
|
|
|
962
|
-
<div v-if="usesGroups(unit.index)" class="text-[11px] text-
|
|
960
|
+
<div v-if="usesGroups(unit.index)" class="text-[11px] text-dimmed">
|
|
963
961
|
{{ t('pipeline.builder.consensusGroupsActive') }}
|
|
964
962
|
</div>
|
|
965
963
|
|
|
966
964
|
<template v-else>
|
|
967
965
|
<div class="flex items-center gap-2">
|
|
968
|
-
<label class="text-
|
|
966
|
+
<label class="text-muted">{{ t('pipeline.builder.strategy') }}</label>
|
|
969
967
|
<select
|
|
970
968
|
v-model="pipelines.draftConsensus[unit.index]!.strategy"
|
|
971
|
-
class="rounded border border-
|
|
969
|
+
class="rounded border border-muted bg-default px-1.5 py-0.5 text-app-100"
|
|
972
970
|
>
|
|
973
971
|
<option v-for="s in CONSENSUS_STRATEGIES" :key="s.value" :value="s.value">
|
|
974
972
|
{{ s.label }}
|
|
@@ -976,7 +974,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
976
974
|
</select>
|
|
977
975
|
<label
|
|
978
976
|
v-if="pipelines.draftConsensus[unit.index]!.strategy === 'debate'"
|
|
979
|
-
class="ms-2 text-
|
|
977
|
+
class="ms-2 text-muted"
|
|
980
978
|
>{{ t('pipeline.builder.rounds') }}</label
|
|
981
979
|
>
|
|
982
980
|
<input
|
|
@@ -986,7 +984,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
986
984
|
min="1"
|
|
987
985
|
max="5"
|
|
988
986
|
placeholder="2"
|
|
989
|
-
class="w-12 rounded border border-
|
|
987
|
+
class="w-12 rounded border border-muted bg-default px-1.5 py-0.5 text-app-100"
|
|
990
988
|
/>
|
|
991
989
|
</div>
|
|
992
990
|
|
|
@@ -1000,12 +998,12 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
1000
998
|
<input
|
|
1001
999
|
v-model="p.role"
|
|
1002
1000
|
:placeholder="t('pipeline.builder.rolePlaceholder')"
|
|
1003
|
-
class="w-28 rounded border border-
|
|
1001
|
+
class="w-28 rounded border border-muted bg-default px-1.5 py-0.5 text-app-100"
|
|
1004
1002
|
/>
|
|
1005
1003
|
<input
|
|
1006
1004
|
v-model="p.modelId"
|
|
1007
1005
|
:placeholder="t('pipeline.builder.modelIdPlaceholder')"
|
|
1008
|
-
class="flex-1 rounded border border-
|
|
1006
|
+
class="flex-1 rounded border border-muted bg-default px-1.5 py-0.5 text-toned"
|
|
1009
1007
|
/>
|
|
1010
1008
|
<UButton
|
|
1011
1009
|
icon="i-lucide-x"
|
|
@@ -1028,7 +1026,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
1028
1026
|
</div>
|
|
1029
1027
|
|
|
1030
1028
|
<!-- gating -->
|
|
1031
|
-
<div class="flex flex-wrap items-center gap-2 border-t border-
|
|
1029
|
+
<div class="flex flex-wrap items-center gap-2 border-t border-default pt-2">
|
|
1032
1030
|
<UButton
|
|
1033
1031
|
:icon="
|
|
1034
1032
|
pipelines.draftConsensus[unit.index]!.gating?.enabled
|
|
@@ -1064,11 +1062,11 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
1064
1062
|
isTesterKind(unit.kind) &&
|
|
1065
1063
|
pipelines.draftTesterQuality[unit.index]?.enabled !== false
|
|
1066
1064
|
"
|
|
1067
|
-
class="ms-6 space-y-2 rounded-md border border-
|
|
1065
|
+
class="ms-6 space-y-2 rounded-md border border-app-info-800/40 bg-app-info-950/20 p-2 text-xs"
|
|
1068
1066
|
>
|
|
1069
1067
|
<div class="flex items-center gap-1.5">
|
|
1070
|
-
<UIcon name="i-lucide-shield-check" class="h-3.5 w-3.5 text-
|
|
1071
|
-
<span class="min-w-0 flex-1 truncate text-
|
|
1068
|
+
<UIcon name="i-lucide-shield-check" class="h-3.5 w-3.5 text-app-info-400" />
|
|
1069
|
+
<span class="min-w-0 flex-1 truncate text-default">
|
|
1072
1070
|
{{ t('pipeline.builder.testerQualityLabel') }}
|
|
1073
1071
|
</span>
|
|
1074
1072
|
<UButton
|
|
@@ -1105,7 +1103,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
1105
1103
|
moved to the task card / inspector when the palettes were removed). -->
|
|
1106
1104
|
<div v-if="pipelines.pipelines.length" class="flex flex-col lg:min-h-0 lg:overflow-hidden">
|
|
1107
1105
|
<div class="mb-2 flex shrink-0 items-center justify-between gap-2">
|
|
1108
|
-
<h3 class="text-xs font-semibold uppercase tracking-wide text-
|
|
1106
|
+
<h3 class="text-xs font-semibold uppercase tracking-wide text-muted">
|
|
1109
1107
|
{{ t('pipeline.builder.savedPipelines') }}
|
|
1110
1108
|
</h3>
|
|
1111
1109
|
<UButton
|
|
@@ -1159,7 +1157,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
1159
1157
|
narrows and whose every change is saved. -->
|
|
1160
1158
|
<div
|
|
1161
1159
|
v-if="browseEveryPurpose || library.hiddenByPurpose"
|
|
1162
|
-
class="mb-2 flex shrink-0 flex-wrap items-center gap-x-2 px-1 text-[10px] text-
|
|
1160
|
+
class="mb-2 flex shrink-0 flex-wrap items-center gap-x-2 px-1 text-[10px] text-dimmed"
|
|
1163
1161
|
>
|
|
1164
1162
|
<span>
|
|
1165
1163
|
{{
|
|
@@ -1174,7 +1172,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
1174
1172
|
</span>
|
|
1175
1173
|
<button
|
|
1176
1174
|
type="button"
|
|
1177
|
-
class="underline underline-offset-2 hover:text-
|
|
1175
|
+
class="underline underline-offset-2 hover:text-toned"
|
|
1178
1176
|
data-testid="pipeline-library-purpose-toggle"
|
|
1179
1177
|
@click="browseEveryPurpose = !browseEveryPurpose"
|
|
1180
1178
|
>
|
|
@@ -1190,7 +1188,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
1190
1188
|
<li
|
|
1191
1189
|
v-for="p in visiblePipelines"
|
|
1192
1190
|
:key="p.id"
|
|
1193
|
-
class="group rounded-lg border border-
|
|
1191
|
+
class="group rounded-lg border border-muted bg-elevated/40"
|
|
1194
1192
|
:class="{ 'opacity-60': p.archived }"
|
|
1195
1193
|
>
|
|
1196
1194
|
<div class="flex items-center gap-2 px-2 py-1.5">
|
|
@@ -1203,9 +1201,9 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
1203
1201
|
:name="
|
|
1204
1202
|
expandedSaved.has(p.id) ? 'i-lucide-chevron-down' : 'i-lucide-chevron-right'
|
|
1205
1203
|
"
|
|
1206
|
-
class="h-3.5 w-3.5 shrink-0 text-
|
|
1204
|
+
class="h-3.5 w-3.5 shrink-0 text-dimmed"
|
|
1207
1205
|
/>
|
|
1208
|
-
<span class="min-w-0 flex-1 truncate text-xs text-
|
|
1206
|
+
<span class="min-w-0 flex-1 truncate text-xs text-default">{{ p.name }}</span>
|
|
1209
1207
|
<UBadge
|
|
1210
1208
|
v-for="l in p.labels ?? []"
|
|
1211
1209
|
:key="l"
|
|
@@ -1251,7 +1249,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
1251
1249
|
>
|
|
1252
1250
|
{{ t('pipeline.builder.scopeDefault.unattended') }}
|
|
1253
1251
|
</UBadge>
|
|
1254
|
-
<span class="shrink-0 text-[10px] text-
|
|
1252
|
+
<span class="shrink-0 text-[10px] text-dimmed">
|
|
1255
1253
|
{{
|
|
1256
1254
|
t(
|
|
1257
1255
|
'pipeline.builder.stepCount',
|
|
@@ -1347,7 +1345,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
1347
1345
|
<!-- Full ordered step list, revealed on click. -->
|
|
1348
1346
|
<ol
|
|
1349
1347
|
v-if="expandedSaved.has(p.id)"
|
|
1350
|
-
class="space-y-1 border-t border-
|
|
1348
|
+
class="space-y-1 border-t border-default px-2 py-2 ps-7"
|
|
1351
1349
|
>
|
|
1352
1350
|
<li
|
|
1353
1351
|
v-for="(k, i) in p.agentKinds"
|
|
@@ -1358,9 +1356,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
1358
1356
|
p.enabled?.[i] === false ? t('pipeline.builder.disabledStepTooltip') : undefined
|
|
1359
1357
|
"
|
|
1360
1358
|
>
|
|
1361
|
-
<span class="w-4 shrink-0 text-center text-[10px] text-
|
|
1362
|
-
i + 1
|
|
1363
|
-
}}</span>
|
|
1359
|
+
<span class="w-4 shrink-0 text-center text-[10px] text-dimmed">{{ i + 1 }}</span>
|
|
1364
1360
|
<AgentKindIcon :kind="k" show-label />
|
|
1365
1361
|
<!-- A step that does not run on every task says so HERE, in the library, because
|
|
1366
1362
|
this list is what a reader compares two pipelines by: a preset whose testers
|
|
@@ -1369,7 +1365,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
1369
1365
|
v-for="c in stepConditionsAt(p, i)"
|
|
1370
1366
|
:key="c"
|
|
1371
1367
|
:name="CONDITION_MARKERS[c].icon"
|
|
1372
|
-
class="h-3 w-3 shrink-0 text-
|
|
1368
|
+
class="h-3 w-3 shrink-0 text-app-info-400"
|
|
1373
1369
|
:title="t(CONDITION_MARKERS[c].key)"
|
|
1374
1370
|
/>
|
|
1375
1371
|
</li>
|
|
@@ -1404,9 +1400,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
1404
1400
|
<template #body>
|
|
1405
1401
|
<div class="space-y-3">
|
|
1406
1402
|
<div>
|
|
1407
|
-
<label
|
|
1408
|
-
class="mb-1 block text-[11px] font-semibold uppercase tracking-wide text-slate-400"
|
|
1409
|
-
>
|
|
1403
|
+
<label class="mb-1 block text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
1410
1404
|
{{ t('pipeline.builder.addAgentModal.name') }}
|
|
1411
1405
|
</label>
|
|
1412
1406
|
<UInput
|
|
@@ -1417,9 +1411,7 @@ const { toggleArchive, toggleDefault, edit, removePipeline, clone } = usePipelin
|
|
|
1417
1411
|
/>
|
|
1418
1412
|
</div>
|
|
1419
1413
|
<div>
|
|
1420
|
-
<label
|
|
1421
|
-
class="mb-1 block text-[11px] font-semibold uppercase tracking-wide text-slate-400"
|
|
1422
|
-
>
|
|
1414
|
+
<label class="mb-1 block text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
1423
1415
|
{{ t('pipeline.builder.addAgentModal.description') }}
|
|
1424
1416
|
</label>
|
|
1425
1417
|
<UTextarea
|
|
@@ -123,8 +123,8 @@ const reseedableCount = computed(
|
|
|
123
123
|
<template>
|
|
124
124
|
<UModal v-model:open="open" :title="t('pipeline.health.title')" :ui="{ content: 'max-w-2xl' }">
|
|
125
125
|
<template #body>
|
|
126
|
-
<div v-if="!hasIssues" class="py-6 text-center text-sm text-
|
|
127
|
-
<UIcon name="i-lucide-check-circle-2" class="mx-auto mb-2 h-8 w-8 text-
|
|
126
|
+
<div v-if="!hasIssues" class="py-6 text-center text-sm text-muted">
|
|
127
|
+
<UIcon name="i-lucide-check-circle-2" class="mx-auto mb-2 h-8 w-8 text-app-success-400" />
|
|
128
128
|
{{ t('pipeline.health.allValid') }}
|
|
129
129
|
</div>
|
|
130
130
|
|
|
@@ -132,20 +132,20 @@ const reseedableCount = computed(
|
|
|
132
132
|
<!-- New built-in pipelines the workspace can add. -->
|
|
133
133
|
<section v-if="newPipelines.length" class="space-y-2">
|
|
134
134
|
<div class="flex items-center gap-2">
|
|
135
|
-
<UIcon name="i-lucide-sparkles" class="h-4 w-4 text-
|
|
136
|
-
<h3 class="text-sm font-semibold text-
|
|
135
|
+
<UIcon name="i-lucide-sparkles" class="h-4 w-4 text-app-success-400" />
|
|
136
|
+
<h3 class="text-sm font-semibold text-default">
|
|
137
137
|
{{ t('pipeline.health.newHeading') }}
|
|
138
138
|
</h3>
|
|
139
139
|
</div>
|
|
140
|
-
<p class="text-[11px] text-
|
|
140
|
+
<p class="text-[11px] text-dimmed">{{ t('pipeline.health.newDescription') }}</p>
|
|
141
141
|
<ul class="space-y-2">
|
|
142
142
|
<li
|
|
143
143
|
v-for="p in newPipelines"
|
|
144
144
|
:key="p.id"
|
|
145
|
-
class="flex items-center justify-between gap-3 rounded-lg border border-
|
|
145
|
+
class="flex items-center justify-between gap-3 rounded-lg border border-default bg-default/40 p-3"
|
|
146
146
|
>
|
|
147
147
|
<div class="min-w-0">
|
|
148
|
-
<span class="truncate text-sm font-medium text-
|
|
148
|
+
<span class="truncate text-sm font-medium text-app-100 capitalize">{{
|
|
149
149
|
p.name
|
|
150
150
|
}}</span>
|
|
151
151
|
</div>
|
|
@@ -167,24 +167,24 @@ const reseedableCount = computed(
|
|
|
167
167
|
<!-- Invalid: unknown agent kinds or a broken shape. -->
|
|
168
168
|
<section v-if="invalid.length" class="space-y-2">
|
|
169
169
|
<div class="flex items-center gap-2">
|
|
170
|
-
<UIcon name="i-lucide-triangle-alert" class="h-4 w-4 text-
|
|
171
|
-
<h3 class="text-sm font-semibold text-
|
|
170
|
+
<UIcon name="i-lucide-triangle-alert" class="h-4 w-4 text-app-error-400" />
|
|
171
|
+
<h3 class="text-sm font-semibold text-default">
|
|
172
172
|
{{ t('pipeline.health.invalidHeading') }}
|
|
173
173
|
</h3>
|
|
174
174
|
</div>
|
|
175
|
-
<p class="text-[11px] text-
|
|
175
|
+
<p class="text-[11px] text-dimmed">
|
|
176
176
|
{{ t('pipeline.health.invalidDescription') }}
|
|
177
177
|
</p>
|
|
178
178
|
<ul class="space-y-2">
|
|
179
179
|
<li
|
|
180
180
|
v-for="h in invalid"
|
|
181
181
|
:key="h.pipeline.id"
|
|
182
|
-
class="rounded-lg border border-
|
|
182
|
+
class="rounded-lg border border-default bg-default/40 p-3"
|
|
183
183
|
>
|
|
184
184
|
<div class="flex items-start justify-between gap-3">
|
|
185
185
|
<div class="min-w-0">
|
|
186
186
|
<div class="flex items-center gap-2">
|
|
187
|
-
<span class="truncate text-sm font-medium text-
|
|
187
|
+
<span class="truncate text-sm font-medium text-app-100">
|
|
188
188
|
{{ h.pipeline.name }}
|
|
189
189
|
</span>
|
|
190
190
|
<UBadge v-if="h.pipeline.builtin" color="neutral" variant="subtle" size="xs">
|
|
@@ -196,7 +196,9 @@ const reseedableCount = computed(
|
|
|
196
196
|
v-for="(p, i) in h.problems"
|
|
197
197
|
:key="i"
|
|
198
198
|
class="text-[11px]"
|
|
199
|
-
:class="
|
|
199
|
+
:class="
|
|
200
|
+
p.type === 'outdated' ? 'text-app-warning-400/80' : 'text-app-error-400/90'
|
|
201
|
+
"
|
|
200
202
|
>
|
|
201
203
|
{{ p.message }}
|
|
202
204
|
</li>
|
|
@@ -234,23 +236,21 @@ const reseedableCount = computed(
|
|
|
234
236
|
<!-- Retired built-ins: withdrawn from the catalog, so the only action is removal. -->
|
|
235
237
|
<section v-if="retired.length" class="space-y-2">
|
|
236
238
|
<div class="flex items-center gap-2">
|
|
237
|
-
<UIcon name="i-lucide-archive-x" class="h-4 w-4 text-
|
|
238
|
-
<h3 class="text-sm font-semibold text-
|
|
239
|
+
<UIcon name="i-lucide-archive-x" class="h-4 w-4 text-muted" />
|
|
240
|
+
<h3 class="text-sm font-semibold text-default">
|
|
239
241
|
{{ t('pipeline.health.retiredHeading') }}
|
|
240
242
|
</h3>
|
|
241
243
|
</div>
|
|
242
|
-
<p class="text-[11px] text-
|
|
244
|
+
<p class="text-[11px] text-dimmed">{{ t('pipeline.health.retiredDescription') }}</p>
|
|
243
245
|
<ul class="space-y-2">
|
|
244
246
|
<li
|
|
245
247
|
v-for="r in retired"
|
|
246
248
|
:key="r.pipeline.id"
|
|
247
|
-
class="flex items-center justify-between gap-3 rounded-lg border border-
|
|
249
|
+
class="flex items-center justify-between gap-3 rounded-lg border border-default bg-default/40 p-3"
|
|
248
250
|
>
|
|
249
251
|
<div class="min-w-0">
|
|
250
|
-
<span class="truncate text-sm font-medium text-
|
|
251
|
-
|
|
252
|
-
}}</span>
|
|
253
|
-
<p class="text-[11px] text-slate-400/80">
|
|
252
|
+
<span class="truncate text-sm font-medium text-app-100">{{ r.pipeline.name }}</span>
|
|
253
|
+
<p class="text-[11px] text-muted/80">
|
|
254
254
|
{{
|
|
255
255
|
r.replacement
|
|
256
256
|
? t('pipeline.health.retiredReplacedBy', { name: r.replacement.name })
|
|
@@ -276,25 +276,23 @@ const reseedableCount = computed(
|
|
|
276
276
|
<!-- Outdated built-ins: a newer catalog version is available. -->
|
|
277
277
|
<section v-if="outdated.length" class="space-y-2">
|
|
278
278
|
<div class="flex items-center gap-2">
|
|
279
|
-
<UIcon name="i-lucide-arrow-up-circle" class="h-4 w-4 text-
|
|
280
|
-
<h3 class="text-sm font-semibold text-
|
|
279
|
+
<UIcon name="i-lucide-arrow-up-circle" class="h-4 w-4 text-app-warning-400" />
|
|
280
|
+
<h3 class="text-sm font-semibold text-default">
|
|
281
281
|
{{ t('pipeline.health.updatesHeading') }}
|
|
282
282
|
</h3>
|
|
283
283
|
</div>
|
|
284
|
-
<p class="text-[11px] text-
|
|
284
|
+
<p class="text-[11px] text-dimmed">
|
|
285
285
|
{{ t('pipeline.health.updatesDescription') }}
|
|
286
286
|
</p>
|
|
287
287
|
<ul class="space-y-2">
|
|
288
288
|
<li
|
|
289
289
|
v-for="h in outdated"
|
|
290
290
|
:key="h.pipeline.id"
|
|
291
|
-
class="flex items-center justify-between gap-3 rounded-lg border border-
|
|
291
|
+
class="flex items-center justify-between gap-3 rounded-lg border border-default bg-default/40 p-3"
|
|
292
292
|
>
|
|
293
293
|
<div class="min-w-0">
|
|
294
|
-
<span class="truncate text-sm font-medium text-
|
|
295
|
-
|
|
296
|
-
}}</span>
|
|
297
|
-
<p class="text-[11px] text-amber-400/80">{{ h.problems[0]?.message }}</p>
|
|
294
|
+
<span class="truncate text-sm font-medium text-app-100">{{ h.pipeline.name }}</span>
|
|
295
|
+
<p class="text-[11px] text-app-warning-400/80">{{ h.problems[0]?.message }}</p>
|
|
298
296
|
</div>
|
|
299
297
|
<UButton
|
|
300
298
|
size="xs"
|
|
@@ -92,40 +92,40 @@ function choose(id: string) {
|
|
|
92
92
|
@mouseleave="hoverId = undefined"
|
|
93
93
|
>
|
|
94
94
|
<!-- left: selectable options -->
|
|
95
|
-
<ul class="w-1/2 shrink-0 overflow-y-auto border-e border-
|
|
95
|
+
<ul class="w-1/2 shrink-0 overflow-y-auto border-e border-default p-1">
|
|
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-
|
|
100
|
-
:class="modelValue ? 'text-
|
|
99
|
+
class="flex w-full items-center gap-2 rounded px-2 py-1.5 text-start text-sm hover:bg-elevated/60"
|
|
100
|
+
:class="modelValue ? 'text-toned' : 'text-app-100'"
|
|
101
101
|
data-testid="pipeline-option-none"
|
|
102
102
|
@mouseenter="hoverId = ''"
|
|
103
103
|
@click="choose('')"
|
|
104
104
|
>
|
|
105
|
-
<UIcon name="i-lucide-rotate-ccw" class="h-4 w-4 shrink-0 text-
|
|
105
|
+
<UIcon name="i-lucide-rotate-ccw" class="h-4 w-4 shrink-0 text-muted" />
|
|
106
106
|
<span class="flex-1 truncate">{{ noneLabel }}</span>
|
|
107
107
|
<UIcon
|
|
108
108
|
v-if="!modelValue"
|
|
109
109
|
name="i-lucide-check"
|
|
110
|
-
class="h-4 w-4 shrink-0 text-primary
|
|
110
|
+
class="h-4 w-4 shrink-0 text-primary"
|
|
111
111
|
/>
|
|
112
112
|
</button>
|
|
113
113
|
</li>
|
|
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-
|
|
118
|
-
:class="modelValue === p.id ? 'text-
|
|
117
|
+
class="flex w-full items-center gap-2 rounded px-2 py-1.5 text-start text-sm hover:bg-elevated/60"
|
|
118
|
+
:class="modelValue === p.id ? 'text-app-100' : 'text-toned'"
|
|
119
119
|
:data-testid="`pipeline-option-${p.id}`"
|
|
120
120
|
@mouseenter="hoverId = p.id"
|
|
121
121
|
@click="choose(p.id)"
|
|
122
122
|
>
|
|
123
|
-
<UIcon name="i-lucide-workflow" class="h-4 w-4 shrink-0 text-
|
|
123
|
+
<UIcon name="i-lucide-workflow" class="h-4 w-4 shrink-0 text-muted" />
|
|
124
124
|
<span class="flex-1 truncate">{{ p.name }}</span>
|
|
125
125
|
<UIcon
|
|
126
126
|
v-if="modelValue === p.id"
|
|
127
127
|
name="i-lucide-check"
|
|
128
|
-
class="h-4 w-4 shrink-0 text-primary
|
|
128
|
+
class="h-4 w-4 shrink-0 text-primary"
|
|
129
129
|
/>
|
|
130
130
|
</button>
|
|
131
131
|
</li>
|
|
@@ -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-[12px] leading-snug text-
|
|
137
|
+
<div v-else class="text-[12px] leading-snug text-dimmed">{{ emptyHint }}</div>
|
|
138
138
|
</div>
|
|
139
139
|
</div>
|
|
140
140
|
</template>
|
|
@@ -34,17 +34,17 @@ function stepDescription(kind: string): string {
|
|
|
34
34
|
|
|
35
35
|
<template>
|
|
36
36
|
<div class="space-y-2" data-testid="pipeline-preview">
|
|
37
|
-
<div class="text-sm font-semibold text-
|
|
37
|
+
<div class="text-sm font-semibold text-app-100">{{ pipeline.name }}</div>
|
|
38
38
|
<p
|
|
39
39
|
v-if="pipeline.description"
|
|
40
|
-
class="text-[12px] leading-snug text-
|
|
40
|
+
class="text-[12px] leading-snug text-muted"
|
|
41
41
|
data-testid="pipeline-preview-description"
|
|
42
42
|
>
|
|
43
43
|
{{ pipeline.description }}
|
|
44
44
|
</p>
|
|
45
45
|
|
|
46
46
|
<div
|
|
47
|
-
class="flex flex-wrap items-center gap-x-3 gap-y-1 text-[10px] uppercase tracking-wide text-
|
|
47
|
+
class="flex flex-wrap items-center gap-x-3 gap-y-1 text-[10px] uppercase tracking-wide text-dimmed"
|
|
48
48
|
>
|
|
49
49
|
<span class="inline-flex items-center gap-1">
|
|
50
50
|
<UIcon name="i-lucide-workflow" class="h-3 w-3" />
|
|
@@ -52,13 +52,13 @@ function stepDescription(kind: string): string {
|
|
|
52
52
|
</span>
|
|
53
53
|
<!-- Gates are the reason a run stops for a human, so they earn a headline of their own
|
|
54
54
|
rather than only the per-step marker below. -->
|
|
55
|
-
<span v-if="gateCount" class="inline-flex items-center gap-1 text-
|
|
55
|
+
<span v-if="gateCount" class="inline-flex items-center gap-1 text-app-warning-500">
|
|
56
56
|
<UIcon name="i-lucide-shield-check" class="h-3 w-3" />
|
|
57
57
|
{{ t('pipeline.preview.gateCount', { count: gateCount }, gateCount) }}
|
|
58
58
|
</span>
|
|
59
59
|
<!-- Conditional steps change what a run of this pipeline actually does from task to task,
|
|
60
60
|
which is exactly what a preview read BEFORE picking has to say out loud. -->
|
|
61
|
-
<span v-if="conditionalCount" class="inline-flex items-center gap-1 text-
|
|
61
|
+
<span v-if="conditionalCount" class="inline-flex items-center gap-1 text-app-info-500">
|
|
62
62
|
<UIcon name="i-lucide-git-branch" class="h-3 w-3" />
|
|
63
63
|
{{ t('pipeline.preview.conditionalCount', { count: conditionalCount }, conditionalCount) }}
|
|
64
64
|
</span>
|
|
@@ -76,11 +76,11 @@ function stepDescription(kind: string): string {
|
|
|
76
76
|
>
|
|
77
77
|
<div class="flex flex-col items-center">
|
|
78
78
|
<span
|
|
79
|
-
class="flex h-4 w-4 shrink-0 items-center justify-center rounded-full bg-
|
|
79
|
+
class="flex h-4 w-4 shrink-0 items-center justify-center rounded-full bg-elevated font-mono text-[9px] tabular-nums text-muted"
|
|
80
80
|
>
|
|
81
81
|
{{ i + 1 }}
|
|
82
82
|
</span>
|
|
83
|
-
<span v-if="i < steps.length - 1" class="w-px flex-1 bg-
|
|
83
|
+
<span v-if="i < steps.length - 1" class="w-px flex-1 bg-elevated" />
|
|
84
84
|
</div>
|
|
85
85
|
<div class="min-w-0 flex-1 pb-2">
|
|
86
86
|
<div class="flex items-center gap-1">
|
|
@@ -88,20 +88,20 @@ function stepDescription(kind: string): string {
|
|
|
88
88
|
<UIcon
|
|
89
89
|
v-if="s.gated"
|
|
90
90
|
name="i-lucide-shield-check"
|
|
91
|
-
class="h-3 w-3 shrink-0 text-
|
|
91
|
+
class="h-3 w-3 shrink-0 text-app-warning-400"
|
|
92
92
|
:title="t('pipeline.preview.gated')"
|
|
93
93
|
/>
|
|
94
94
|
<UIcon
|
|
95
95
|
v-for="c in s.conditions"
|
|
96
96
|
:key="c"
|
|
97
97
|
:name="CONDITION_MARKERS[c].icon"
|
|
98
|
-
class="h-3 w-3 shrink-0 text-
|
|
98
|
+
class="h-3 w-3 shrink-0 text-app-info-400"
|
|
99
99
|
:title="t(CONDITION_MARKERS[c].key)"
|
|
100
100
|
/>
|
|
101
101
|
</div>
|
|
102
102
|
<!-- Clamped: the catalog prose runs long for some kinds, and <AgentKindIcon> already
|
|
103
103
|
carries the full text in its hover tooltip. -->
|
|
104
|
-
<p class="line-clamp-2 text-[11px] leading-snug text-
|
|
104
|
+
<p class="line-clamp-2 text-[11px] leading-snug text-dimmed">
|
|
105
105
|
{{ stepDescription(s.kind) }}
|
|
106
106
|
</p>
|
|
107
107
|
</div>
|