@cat-factory/app 0.302.1 → 0.303.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -0
- package/app/app.config.ts +19 -10
- package/app/assets/css/main.css +13 -13
- package/app/assets/css/prose.css +22 -22
- package/app/assets/css/tokens.css +298 -0
- package/app/components/assistant/AssistantModal.vue +22 -22
- package/app/components/auth/AuthGate.vue +1 -1
- package/app/components/auth/BackendMisconfiguredScreen.vue +10 -10
- package/app/components/auth/LoginScreen.vue +34 -36
- package/app/components/auth/ResetPasswordScreen.vue +12 -12
- package/app/components/auth/UserMenu.vue +4 -4
- package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +27 -25
- package/app/components/binaryOutput/BinaryOutputReport.vue +15 -15
- package/app/components/binaryOutput/StoredAssetView.vue +5 -5
- package/app/components/board/AddTaskModal.vue +17 -20
- package/app/components/board/AgentFailureCard.vue +11 -11
- package/app/components/board/AgentFailureHistory.vue +2 -2
- package/app/components/board/BoardCanvas.vue +6 -5
- package/app/components/board/CreateInitiativeModal.vue +8 -10
- package/app/components/board/DependencyConnectOverlay.vue +1 -1
- package/app/components/board/FailureHistoryList.vue +7 -7
- package/app/components/board/RecurringPipelineModal.vue +17 -17
- package/app/components/board/ReviewFrictionDialog.vue +6 -6
- package/app/components/board/StepExecutionHistory.vue +13 -13
- package/app/components/board/TaskDependencyEdges.vue +8 -8
- package/app/components/board/nodes/AgentChip.vue +10 -10
- package/app/components/board/nodes/BlockNode.vue +29 -29
- package/app/components/board/nodes/DecisionBadge.vue +2 -2
- package/app/components/board/nodes/EpicNode.vue +14 -10
- package/app/components/board/nodes/FrameSwimlanes.vue +7 -9
- package/app/components/board/nodes/InitiativeCard.vue +8 -8
- package/app/components/board/nodes/LaneGroup.vue +1 -1
- package/app/components/board/nodes/LaneTask.vue +2 -2
- package/app/components/board/nodes/ResizeGrips.vue +4 -4
- package/app/components/board/nodes/TaskCard.vue +18 -18
- package/app/components/board/nodes/TaskLane.vue +5 -5
- package/app/components/board/nodes/TaskPipelineMini.vue +18 -18
- package/app/components/bootstrap/AdoptionReviewModal.vue +29 -26
- package/app/components/bootstrap/BootstrapModal.vue +21 -23
- package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
- package/app/components/brainstorm/BrainstormWindow.vue +30 -33
- package/app/components/bugFishing/BugFishingWindow.vue +49 -49
- package/app/components/clarity/ClarityReviewWindow.vue +30 -30
- package/app/components/common/AsyncViewError.vue +5 -5
- package/app/components/common/ClarificationItem.vue +8 -13
- package/app/components/common/ConfirmDialog.vue +4 -2
- package/app/components/common/DescriptorFields.vue +1 -1
- package/app/components/common/EmptyState.vue +3 -3
- package/app/components/common/InterviewGateNotice.vue +7 -7
- package/app/components/common/KeyboardShortcutsHelp.vue +1 -1
- package/app/components/common/MarkdownProse.vue +14 -13
- package/app/components/consensus/ConsensusSessionWindow.vue +26 -26
- package/app/components/context/ContextAttachmentFields.vue +17 -17
- package/app/components/docs/DocInterviewWindow.vue +14 -14
- package/app/components/documents/ContextDocumentPicker.vue +17 -17
- package/app/components/documents/DocumentImportModal.vue +7 -7
- package/app/components/documents/DocumentSourceConnectModal.vue +3 -3
- package/app/components/documents/DocumentSyncState.vue +5 -5
- package/app/components/documents/DocumentTemplatesModal.vue +15 -15
- package/app/components/documents/RepoContextDocPicker.vue +5 -5
- package/app/components/documents/SpawnPreviewModal.vue +12 -12
- package/app/components/documents/StartFromDesignModal.vue +11 -11
- package/app/components/documents/TaskContextDocs.vue +5 -5
- package/app/components/environments/EnvSetupStepper.vue +6 -6
- package/app/components/environments/EnvironmentStatusPanel.vue +17 -17
- package/app/components/environments/steps/EnvPickStep.vue +3 -3
- package/app/components/environments/steps/EnvPreflightStep.vue +9 -9
- package/app/components/environments/steps/EnvReviewStep.vue +25 -22
- package/app/components/environments/steps/EnvSaveStep.vue +7 -5
- package/app/components/environments/steps/JourneyStepNav.vue +1 -1
- package/app/components/focus/BlockFocusView.vue +17 -19
- package/app/components/followUp/FollowUpWindow.vue +23 -23
- package/app/components/forkDecision/ForkDecisionWindow.vue +37 -39
- package/app/components/foundational/FoundationalContractSummary.vue +7 -7
- package/app/components/foundational/FoundationalServiceCatalogList.vue +11 -11
- package/app/components/foundational/FoundationalServiceManager.vue +1 -1
- package/app/components/foundational/FoundationalServiceRegistry.vue +13 -13
- package/app/components/foundational/FoundationalServiceSources.vue +13 -13
- package/app/components/foundational/FoundationalSuppressions.vue +7 -7
- package/app/components/foundational/ServiceCatalogConnection.vue +10 -10
- package/app/components/fragments/FragmentLibraryManager.vue +41 -44
- package/app/components/fragments/FragmentSelector.vue +13 -13
- package/app/components/fragments/GitHubDocUrlImport.vue +1 -1
- package/app/components/gates/GateFailingCheckList.vue +5 -5
- package/app/components/gates/GateResultView.vue +50 -47
- package/app/components/github/AddServiceFromRepoModal.vue +14 -14
- package/app/components/github/BranchProtectionPreflight.vue +13 -13
- package/app/components/github/GitHubConnect.vue +7 -7
- package/app/components/github/GitHubOnboarding.vue +7 -7
- package/app/components/github/GitHubPanel.vue +37 -40
- package/app/components/github/RepoTreeBrowser.vue +18 -18
- package/app/components/humanTest/HumanTestWindow.vue +30 -33
- package/app/components/initiative/InitiativePlanNotice.vue +5 -5
- package/app/components/initiative/InitiativePlanReview.vue +27 -29
- package/app/components/initiative/InitiativePlanningWindow.vue +10 -10
- package/app/components/initiative/InitiativeTrackerWindow.vue +71 -65
- package/app/components/inputGate/InputGateNotice.vue +2 -4
- package/app/components/judge/JudgeResultView.vue +30 -32
- package/app/components/kaizen/KaizenPanel.vue +40 -36
- package/app/components/kaizen/KaizenStepStatus.vue +21 -21
- package/app/components/layout/AccountAuditLog.vue +10 -10
- package/app/components/layout/AccountDeploymentSettings.vue +20 -20
- package/app/components/layout/AccountFailureKindRules.vue +13 -13
- package/app/components/layout/AccountFoundationalSettings.vue +1 -1
- package/app/components/layout/AccountFragmentSettings.vue +1 -1
- package/app/components/layout/AccountModelPolicySettings.vue +9 -9
- package/app/components/layout/AccountPlatformAlertSettings.vue +11 -11
- package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
- package/app/components/layout/AccountRunCredentialSettings.vue +5 -5
- package/app/components/layout/AccountSkillSettings.vue +1 -1
- package/app/components/layout/AccountTeamSettings.vue +23 -15
- package/app/components/layout/AiProvidersBanner.vue +11 -8
- package/app/components/layout/AppearanceSwitcher.vue +108 -0
- package/app/components/layout/BoardSwitcher.vue +8 -11
- package/app/components/layout/BoardToolbar.vue +3 -3
- package/app/components/layout/CommandBar.vue +7 -9
- package/app/components/layout/ConnectionStatusBanner.vue +2 -2
- package/app/components/layout/DefaultTestEnvBanner.vue +5 -5
- package/app/components/layout/GitHubPatBanner.vue +5 -5
- package/app/components/layout/GitHubPatPermissionsBanner.vue +16 -10
- package/app/components/layout/InfraSetupBanner.vue +6 -6
- package/app/components/layout/IntegrationsHub.vue +15 -15
- package/app/components/layout/LanguageSwitcher.vue +5 -5
- package/app/components/layout/ModelProvidersHub.vue +13 -16
- package/app/components/layout/NotificationsInbox.vue +10 -10
- package/app/components/layout/PersonalSetupModal.vue +8 -8
- package/app/components/layout/ProviderConfigBanner.vue +4 -4
- package/app/components/layout/RolePrompt.vue +7 -7
- package/app/components/layout/SideBar.vue +6 -4
- package/app/components/layout/SpendWarningBanner.vue +17 -14
- package/app/components/layout/TranslationWarningBanner.vue +4 -4
- package/app/components/layout/UiModeSwitcher.vue +13 -13
- package/app/components/layout/UiRoleSwitcher.vue +8 -8
- package/app/components/layout/WorkspaceMembersSettings.vue +15 -11
- package/app/components/media/ArtifactLightbox.vue +13 -13
- package/app/components/media/ImageCompare.vue +31 -24
- package/app/components/merge/MergeEffortChips.vue +2 -2
- package/app/components/notifications/NotificationSettingsPanel.vue +14 -12
- package/app/components/observability/OutcomeFilterChips.vue +6 -6
- package/app/components/observability/RunFailureSummary.vue +28 -25
- package/app/components/observability/StepMetricsBar.vue +26 -28
- package/app/components/observability/StepModelActivity.vue +2 -2
- package/app/components/observability/ToolCallList.vue +24 -24
- package/app/components/outcome/OutcomeSummaryWindow.vue +47 -47
- package/app/components/palettes/AgentPalette.vue +8 -8
- package/app/components/palettes/AgentTierSelect.vue +1 -1
- package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
- package/app/components/panels/AgentStepDetail.vue +52 -51
- package/app/components/panels/AttemptEntryHeader.vue +4 -6
- package/app/components/panels/DecisionModal.vue +7 -7
- package/app/components/panels/GenericStructuredResultView.vue +7 -7
- package/app/components/panels/InspectorPanel.vue +17 -17
- package/app/components/panels/MergerResultView.vue +19 -19
- package/app/components/panels/ObservabilityPanel.vue +115 -123
- package/app/components/panels/OperatorDashboardPanel.vue +89 -97
- package/app/components/panels/ReportsPanel.vue +69 -66
- package/app/components/panels/ReportsSpendBreakdown.vue +9 -9
- package/app/components/panels/ResultWindowShell.vue +38 -38
- package/app/components/panels/RunDetailLoadState.vue +2 -2
- package/app/components/panels/StepContainerStatus.vue +9 -9
- package/app/components/panels/StepDelegatedStatus.logic.spec.ts +135 -0
- package/app/components/panels/StepDelegatedStatus.logic.ts +160 -0
- package/app/components/panels/StepDelegatedStatus.vue +181 -0
- package/app/components/panels/StepEffortReport.vue +16 -15
- package/app/components/panels/StepFragmentAdherence.vue +14 -10
- package/app/components/panels/StepMetadataCard.vue +74 -45
- package/app/components/panels/StepReproductionReport.vue +25 -21
- package/app/components/panels/StepRunMeta.vue +20 -20
- package/app/components/panels/StepTestReport.logic.spec.ts +8 -3
- package/app/components/panels/StepTestReport.logic.ts +4 -4
- package/app/components/panels/StepTestReport.vue +28 -28
- package/app/components/panels/StepToolServers.vue +14 -11
- package/app/components/panels/StepValidationReport.vue +7 -7
- package/app/components/panels/inspector/ContainerSummary.vue +9 -9
- package/app/components/panels/inspector/DocReferenceRepos.vue +3 -3
- package/app/components/panels/inspector/EnvProbeReport.vue +24 -27
- package/app/components/panels/inspector/EpicChildren.vue +8 -12
- package/app/components/panels/inspector/FrontendBindingsResolved.vue +11 -11
- package/app/components/panels/inspector/FrontendConfig.vue +37 -41
- package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
- package/app/components/panels/inspector/InspectorSection.vue +6 -6
- package/app/components/panels/inspector/RecurringScheduleSettings.vue +16 -19
- package/app/components/panels/inspector/ServiceConnections.vue +2 -2
- package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
- package/app/components/panels/inspector/ServiceSelfTests.vue +21 -17
- package/app/components/panels/inspector/ServiceTestConfig.vue +51 -59
- package/app/components/panels/inspector/ServiceTestSecrets.vue +5 -5
- package/app/components/panels/inspector/ServiceTestingContext.vue +3 -3
- package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
- package/app/components/panels/inspector/TaskAgentConfig.vue +3 -3
- package/app/components/panels/inspector/TaskAprioriBranches.vue +8 -5
- package/app/components/panels/inspector/TaskDependencies.vue +1 -1
- package/app/components/panels/inspector/TaskEstimateBadge.vue +11 -11
- package/app/components/panels/inspector/TaskExecution.vue +17 -17
- package/app/components/panels/inspector/TaskReviewTarget.vue +2 -2
- package/app/components/panels/inspector/TaskRunSettings.vue +35 -37
- package/app/components/panels/inspector/TaskStructure.vue +3 -3
- package/app/components/pipeline/AgentKindIcon.vue +1 -1
- package/app/components/pipeline/AgentPromptEditor.vue +17 -17
- package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -56
- package/app/components/pipeline/EstimateThresholdFields.vue +4 -4
- package/app/components/pipeline/GateConfigFields.vue +13 -10
- package/app/components/pipeline/IterationCapPrompt.vue +4 -2
- package/app/components/pipeline/PipelineBuilder.vue +47 -55
- package/app/components/pipeline/PipelineHealthModal.vue +27 -29
- package/app/components/pipeline/PipelinePicker.vue +10 -10
- package/app/components/pipeline/PipelinePreview.vue +10 -10
- package/app/components/pipeline/PipelineProgress.vue +64 -67
- package/app/components/prReview/PrReviewPhaseBadge.vue +7 -7
- package/app/components/prReview/PrReviewWindow.vue +75 -77
- package/app/components/providers/AiPresetMismatchDialog.vue +5 -5
- package/app/components/providers/AiProviderOnboardingModal.vue +9 -9
- package/app/components/providers/ApiKeysSection.vue +13 -13
- package/app/components/providers/PersonalCredentialModal.vue +2 -2
- package/app/components/providers/PersonalSubscriptionSection.vue +10 -10
- package/app/components/providers/SignInRequiredNotice.vue +1 -1
- package/app/components/providers/VendorCredentialsModal.vue +10 -10
- package/app/components/provisioning/ProvisioningLogsDrawer.vue +13 -13
- package/app/components/ralph/RalphLoopResultView.vue +28 -30
- package/app/components/recurring/RecurrenceEditor.vue +2 -2
- package/app/components/requirements/RequirementsReviewWindow.vue +51 -58
- package/app/components/riskPolicy/RiskPolicyPicker.vue +12 -15
- package/app/components/riskPolicy/RiskPolicyPreview.vue +14 -14
- package/app/components/sandbox/SandboxPanel.vue +58 -59
- package/app/components/settings/AccountSettingsPanel.vue +1 -1
- package/app/components/settings/ApiTokensPanel.vue +10 -10
- package/app/components/settings/BudgetSettings.vue +18 -22
- package/app/components/settings/CapabilityCredentialsPanel.vue +15 -15
- package/app/components/settings/CloudflareHandlerSection.vue +20 -20
- package/app/components/settings/ComposeEnvironmentSetupSection.vue +13 -13
- package/app/components/settings/ConnectionTestVerdict.vue +3 -3
- package/app/components/settings/ConnectionWarnings.vue +1 -1
- package/app/components/settings/ConsensusGroupsSection.vue +27 -35
- package/app/components/settings/CustomManifestTypeEditor.vue +10 -10
- package/app/components/settings/DefaultProvisionTypeSection.vue +6 -6
- package/app/components/settings/InfraHandlersConfigurator.vue +24 -22
- package/app/components/settings/InfrastructureBackendPicker.vue +6 -6
- package/app/components/settings/InfrastructureWindow.vue +5 -5
- package/app/components/settings/IssueTrackerPanel.vue +29 -23
- package/app/components/settings/KubernetesEngineForm.vue +11 -11
- package/app/components/settings/KubernetesEnvironmentForm.vue +4 -4
- package/app/components/settings/LocalContainerPoolSettings.vue +6 -11
- package/app/components/settings/LocalModelEndpointsPanel.vue +20 -18
- package/app/components/settings/McpAuthorizeScreen.vue +13 -15
- package/app/components/settings/McpOAuthCallbackScreen.vue +16 -10
- package/app/components/settings/MergeClassRulesEditor.vue +6 -9
- package/app/components/settings/MergeRolePolicyEditor.vue +16 -16
- package/app/components/settings/ModelConfigurationPanel.vue +23 -30
- package/app/components/settings/ModelPresetHealthModal.vue +15 -13
- package/app/components/settings/ObservabilityConnectionPanel.vue +4 -4
- package/app/components/settings/OpenRouterCatalogPanel.vue +23 -19
- package/app/components/settings/PackageRegistriesPanel.vue +8 -8
- package/app/components/settings/ProviderConnectionTab.vue +8 -11
- package/app/components/settings/ProviderManifestEditor.vue +9 -9
- package/app/components/settings/ProviderPreferenceEditor.vue +8 -8
- package/app/components/settings/RiskPolicyCreateForm.vue +10 -10
- package/app/components/settings/RiskPolicyEditorRow.vue +14 -14
- package/app/components/settings/RiskPolicyHealthModal.vue +15 -13
- package/app/components/settings/RiskPolicyInheritedRow.vue +1 -1
- package/app/components/settings/RiskPolicyPanel.vue +10 -15
- package/app/components/settings/ServiceFragmentDefaultsPanel.vue +7 -7
- package/app/components/settings/SharedStacksPanel.vue +9 -12
- package/app/components/settings/TaskSourceCard.vue +4 -4
- package/app/components/settings/TaskTypeSuppressionsPanel.vue +6 -6
- package/app/components/settings/ToolServerChecklist.vue +36 -29
- package/app/components/settings/UsageSettings.vue +15 -15
- package/app/components/settings/UserSecretsSection.vue +9 -12
- package/app/components/settings/WorkspaceMetadataSettings.vue +5 -5
- package/app/components/settings/WorkspaceSettingsPanel.vue +47 -47
- package/app/components/skills/ReviewSkillQueue.vue +10 -10
- package/app/components/skills/SkillLibraryManager.vue +23 -20
- package/app/components/slack/SlackPanel.vue +13 -17
- package/app/components/spec/ServiceSpecWindow.vue +45 -42
- package/app/components/tasks/BugHuntModal.vue +24 -27
- package/app/components/tasks/ContextIssuePicker.vue +11 -11
- package/app/components/tasks/TaskContextIssues.vue +3 -3
- package/app/components/tasks/TaskImportModal.vue +7 -7
- package/app/components/tasks/TaskSourceConnectModal.vue +10 -8
- package/app/components/testing/TestReportWindow.vue +99 -82
- package/app/components/theme/ThemeImportModal.vue +115 -0
- package/app/components/tutorial/TutorialCatalogue.vue +9 -9
- package/app/components/tutorial/TutorialNudge.vue +5 -5
- package/app/components/tutorial/TutorialOverlay.vue +12 -12
- package/app/components/tutorial/TutorialPrompt.vue +6 -9
- package/app/components/vcs/GitLabConnect.vue +4 -4
- package/app/components/vcs/VcsConnectSurfaces.vue +2 -2
- package/app/components/visualConfirm/VisualConfirmationWindow.vue +36 -36
- package/app/composables/api/client.ts +6 -1
- package/app/composables/usePipelineErrorToast.ts +17 -0
- package/app/modular/agent-kinds.ts +24 -0
- package/app/pages/index.vue +5 -5
- package/app/plugins/theme.client.ts +125 -0
- package/app/spa-loading-template.html +52 -14
- package/app/stores/agents.ts +1 -1
- package/app/stores/theme.spec.ts +56 -0
- package/app/stores/theme.ts +87 -0
- package/app/types/domain.ts +19 -0
- package/app/types/execution.ts +4 -0
- package/app/utils/agentOutput.ts +1 -1
- package/app/utils/binaryOutput.ts +6 -6
- package/app/utils/bootstrapSteps.ts +14 -14
- package/app/utils/catalog.ts +87 -83
- package/app/utils/colorTint.ts +10 -0
- package/app/utils/failureKinds.ts +1 -0
- package/app/utils/observability.ts +3 -3
- package/app/utils/pipelineRender.ts +13 -17
- package/app/utils/swimlanes.ts +4 -4
- package/app/utils/theme/bootPalette.spec.ts +54 -0
- package/app/utils/theme/bootPalette.ts +108 -0
- package/app/utils/theme/builtins.spec.ts +38 -0
- package/app/utils/theme/builtins.ts +55 -0
- package/app/utils/theme/css.ts +162 -0
- package/app/utils/theme/doc.ts +353 -0
- package/app/utils/theme/link.ts +93 -0
- package/app/utils/theme/presets.ts +509 -0
- package/app/utils/theme/theme.spec.ts +224 -0
- package/i18n/locales/de.json +61 -4
- package/i18n/locales/en.json +70 -4
- package/i18n/locales/es.json +61 -4
- package/i18n/locales/fr.json +61 -4
- package/i18n/locales/he.json +61 -4
- package/i18n/locales/it.json +61 -4
- package/i18n/locales/ja.json +61 -4
- package/i18n/locales/pl.json +61 -4
- package/i18n/locales/tr.json +61 -4
- package/i18n/locales/uk.json +61 -4
- package/nuxt.config.ts +37 -11
- package/package.json +10 -9
|
@@ -55,13 +55,13 @@ const state = computed(() => {
|
|
|
55
55
|
v-if="view"
|
|
56
56
|
class="space-y-3"
|
|
57
57
|
:class="
|
|
58
|
-
variant === 'card' ? 'scroll-mt-4 rounded-xl border border-
|
|
58
|
+
variant === 'card' ? 'scroll-mt-4 rounded-xl border border-default bg-default/50 p-4' : ''
|
|
59
59
|
"
|
|
60
60
|
data-testid="binary-output-report"
|
|
61
61
|
>
|
|
62
62
|
<div
|
|
63
63
|
v-if="variant === 'card'"
|
|
64
|
-
class="flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-
|
|
64
|
+
class="flex items-center gap-1.5 text-[11px] font-semibold uppercase tracking-wide text-muted"
|
|
65
65
|
>
|
|
66
66
|
<UIcon name="i-lucide-image" class="h-3.5 w-3.5" />
|
|
67
67
|
<span>{{ t('binaryOutput.heading') }}</span>
|
|
@@ -72,7 +72,7 @@ const state = computed(() => {
|
|
|
72
72
|
question the artifacts below cannot answer. An AUTOMATIC keep says so: nobody looked. -->
|
|
73
73
|
<p
|
|
74
74
|
v-if="candidates && candidates.state.candidates.length > 0"
|
|
75
|
-
class="text-[12px] leading-relaxed text-
|
|
75
|
+
class="text-[12px] leading-relaxed text-toned"
|
|
76
76
|
data-testid="binary-output-candidate-decision"
|
|
77
77
|
>
|
|
78
78
|
{{
|
|
@@ -107,28 +107,28 @@ const state = computed(() => {
|
|
|
107
107
|
records a declaration against a step that never held one), and rendering a blank
|
|
108
108
|
would read as a missing value rather than an absent comparison. -->
|
|
109
109
|
<dl class="grid grid-cols-[auto_1fr] gap-x-3 gap-y-1 text-[11px]">
|
|
110
|
-
<dt class="text-
|
|
110
|
+
<dt class="text-dimmed">{{ t('binaryOutput.target') }}</dt>
|
|
111
111
|
<dd
|
|
112
112
|
v-if="view.target"
|
|
113
|
-
class="min-w-0 font-mono text-
|
|
113
|
+
class="min-w-0 font-mono text-toned"
|
|
114
114
|
data-testid="binary-output-target"
|
|
115
115
|
>
|
|
116
116
|
{{ view.target }}
|
|
117
117
|
</dd>
|
|
118
|
-
<dd v-else class="min-w-0 text-
|
|
118
|
+
<dd v-else class="min-w-0 text-muted" data-testid="binary-output-target">
|
|
119
119
|
{{ t('binaryOutput.targetNone') }}
|
|
120
120
|
</dd>
|
|
121
121
|
<template v-if="view.contextServices.length">
|
|
122
|
-
<dt class="text-
|
|
123
|
-
<dd class="min-w-0 font-mono text-
|
|
122
|
+
<dt class="text-dimmed">{{ t('binaryOutput.contextServices') }}</dt>
|
|
123
|
+
<dd class="min-w-0 font-mono text-muted">{{ view.contextServices.join(', ') }}</dd>
|
|
124
124
|
</template>
|
|
125
125
|
<!-- The formats the step REQUIRED, beside where they were meant to go. Rendered whenever
|
|
126
126
|
the step stated any, including on a run that delivered them: the requirement is what
|
|
127
127
|
makes the content types below it readable, and a reader checking whether a mesh will
|
|
128
128
|
load needs to see what was asked for even when nothing went wrong. -->
|
|
129
129
|
<template v-if="view.mediaTypes.length">
|
|
130
|
-
<dt class="text-
|
|
131
|
-
<dd class="min-w-0 font-mono text-
|
|
130
|
+
<dt class="text-dimmed">{{ t('binaryOutput.mediaTypes') }}</dt>
|
|
131
|
+
<dd class="min-w-0 font-mono text-muted" data-testid="binary-output-media-types">
|
|
132
132
|
{{ view.mediaTypes.join(', ') }}
|
|
133
133
|
</dd>
|
|
134
134
|
</template>
|
|
@@ -147,7 +147,7 @@ const state = computed(() => {
|
|
|
147
147
|
<li
|
|
148
148
|
v-for="(row, i) in view.rows"
|
|
149
149
|
:key="`${row.service}:${row.location}:${i}`"
|
|
150
|
-
class="relative rounded-md border border-
|
|
150
|
+
class="relative rounded-md border border-default bg-app-950/40 px-2.5 py-2"
|
|
151
151
|
data-testid="binary-output-artifact"
|
|
152
152
|
>
|
|
153
153
|
<CopyButton :text="row.location" class="absolute end-1 top-1" />
|
|
@@ -158,10 +158,10 @@ const state = computed(() => {
|
|
|
158
158
|
:label="row.entity ?? row.description"
|
|
159
159
|
class="mb-2 pe-8"
|
|
160
160
|
/>
|
|
161
|
-
<code class="block break-all pe-8 font-mono text-[11px] text-
|
|
161
|
+
<code class="block break-all pe-8 font-mono text-[11px] text-default">{{
|
|
162
162
|
row.location
|
|
163
163
|
}}</code>
|
|
164
|
-
<div class="mt-1 flex flex-wrap items-center gap-x-2 gap-y-1 text-[10px] text-
|
|
164
|
+
<div class="mt-1 flex flex-wrap items-center gap-x-2 gap-y-1 text-[10px] text-dimmed">
|
|
165
165
|
<span class="font-mono">{{ row.service }}</span>
|
|
166
166
|
<!-- The join the report cannot make on its own, and the question a human opens this
|
|
167
167
|
for: did it go where the step pointed it? -->
|
|
@@ -225,7 +225,7 @@ const state = computed(() => {
|
|
|
225
225
|
{{ t('binaryOutput.missizedBadge') }}
|
|
226
226
|
</UBadge>
|
|
227
227
|
</div>
|
|
228
|
-
<p v-if="row.description" class="mt-1 text-[11px] leading-relaxed text-
|
|
228
|
+
<p v-if="row.description" class="mt-1 text-[11px] leading-relaxed text-muted">
|
|
229
229
|
{{ row.description }}
|
|
230
230
|
</p>
|
|
231
231
|
</li>
|
|
@@ -234,7 +234,7 @@ const state = computed(() => {
|
|
|
234
234
|
<!-- Every qualification the report counted, each naming its own number. Never folded into
|
|
235
235
|
one "some entries were dropped": the fix for an unknown service id is not the fix for
|
|
236
236
|
a malformed entry, and neither is the fix for a list that stops short of the tail. -->
|
|
237
|
-
<ul class="space-y-1 text-[11px] text-
|
|
237
|
+
<ul class="space-y-1 text-[11px] text-app-warning-400">
|
|
238
238
|
<!-- The step's OWN target went missing from the catalog, and an id the AGENT invented,
|
|
239
239
|
are two different failures with two different fixes (re-register it, versus correct
|
|
240
240
|
the declaration). `binaryOutputView` returns them as DISJOINT fields precisely so
|
|
@@ -89,7 +89,7 @@ const filename = computed(() => {
|
|
|
89
89
|
frame. -->
|
|
90
90
|
<p
|
|
91
91
|
v-else-if="!isImage && url"
|
|
92
|
-
class="flex items-center gap-1.5 rounded bg-
|
|
92
|
+
class="flex items-center gap-1.5 rounded bg-elevated/60 px-2 py-1.5 text-[11px] text-toned"
|
|
93
93
|
data-testid="stored-asset-file"
|
|
94
94
|
>
|
|
95
95
|
<UIcon name="i-lucide-file" class="h-3.5 w-3.5 shrink-0" />
|
|
@@ -97,7 +97,7 @@ const filename = computed(() => {
|
|
|
97
97
|
</p>
|
|
98
98
|
<p
|
|
99
99
|
v-else-if="status === 'error'"
|
|
100
|
-
class="flex items-center gap-1.5 text-[11px] text-
|
|
100
|
+
class="flex items-center gap-1.5 text-[11px] text-app-warning-300"
|
|
101
101
|
data-testid="stored-asset-error"
|
|
102
102
|
>
|
|
103
103
|
<span>{{ t('binaryOutput.asset.loadFailed') }}</span>
|
|
@@ -105,7 +105,7 @@ const filename = computed(() => {
|
|
|
105
105
|
{{ t('binaryOutput.asset.retry') }}
|
|
106
106
|
</UButton>
|
|
107
107
|
</p>
|
|
108
|
-
<p v-else class="text-[11px] text-
|
|
108
|
+
<p v-else class="text-[11px] text-dimmed" data-testid="stored-asset-loading">
|
|
109
109
|
{{ t('binaryOutput.asset.loading') }}
|
|
110
110
|
</p>
|
|
111
111
|
|
|
@@ -116,7 +116,7 @@ const filename = computed(() => {
|
|
|
116
116
|
:href="url"
|
|
117
117
|
target="_blank"
|
|
118
118
|
rel="noopener"
|
|
119
|
-
class="text-
|
|
119
|
+
class="text-app-info-300 hover:underline"
|
|
120
120
|
data-testid="stored-asset-open"
|
|
121
121
|
@click.stop
|
|
122
122
|
>{{ t('binaryOutput.asset.open') }}</a
|
|
@@ -124,7 +124,7 @@ const filename = computed(() => {
|
|
|
124
124
|
<a
|
|
125
125
|
:href="url"
|
|
126
126
|
:download="filename"
|
|
127
|
-
class="text-
|
|
127
|
+
class="text-app-info-300 hover:underline"
|
|
128
128
|
data-testid="stored-asset-download"
|
|
129
129
|
@click.stop
|
|
130
130
|
>{{ t('binaryOutput.asset.download') }}</a
|
|
@@ -916,10 +916,10 @@ function openReviewFrictionDialog(conflict: NonNullable<ReturnType<typeof parseC
|
|
|
916
916
|
<UModal v-model:open="modalOpen" :title="t('board.addTask.title')">
|
|
917
917
|
<template #body>
|
|
918
918
|
<div class="space-y-4" data-testid="add-task-modal">
|
|
919
|
-
<p v-if="container" class="text-xs text-
|
|
919
|
+
<p v-if="container" class="text-xs text-muted">
|
|
920
920
|
<i18n-t keypath="board.addTask.newTaskIn" tag="span" scope="global">
|
|
921
921
|
<template #container>
|
|
922
|
-
<span class="font-medium text-
|
|
922
|
+
<span class="font-medium text-default">{{ container.title }}</span>
|
|
923
923
|
</template>
|
|
924
924
|
</i18n-t>
|
|
925
925
|
</p>
|
|
@@ -940,7 +940,7 @@ function openReviewFrictionDialog(conflict: NonNullable<ReturnType<typeof parseC
|
|
|
940
940
|
>
|
|
941
941
|
<p
|
|
942
942
|
v-if="row.caption"
|
|
943
|
-
class="mb-1 px-1 text-[11px] font-semibold uppercase tracking-wide text-
|
|
943
|
+
class="mb-1 px-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed"
|
|
944
944
|
data-testid="task-type-category"
|
|
945
945
|
>
|
|
946
946
|
{{ row.caption }}
|
|
@@ -981,10 +981,7 @@ function openReviewFrictionDialog(conflict: NonNullable<ReturnType<typeof parseC
|
|
|
981
981
|
</UFormField>
|
|
982
982
|
|
|
983
983
|
<!-- Recurring tasks are configured as a schedule on the service frame. -->
|
|
984
|
-
<div
|
|
985
|
-
v-if="isRecurring"
|
|
986
|
-
class="rounded-lg border border-slate-800 p-3 text-[11px] text-slate-400"
|
|
987
|
-
>
|
|
984
|
+
<div v-if="isRecurring" class="rounded-lg border border-default p-3 text-[11px] text-muted">
|
|
988
985
|
<template v-if="recurringFrameId">
|
|
989
986
|
{{ t('board.addTask.recurringWithFrame') }}
|
|
990
987
|
</template>
|
|
@@ -1023,10 +1020,10 @@ function openReviewFrictionDialog(conflict: NonNullable<ReturnType<typeof parseC
|
|
|
1023
1020
|
autoresize
|
|
1024
1021
|
readonly
|
|
1025
1022
|
class="w-full"
|
|
1026
|
-
:ui="{ base: 'cursor-default text-
|
|
1023
|
+
:ui="{ base: 'cursor-default text-toned' }"
|
|
1027
1024
|
/>
|
|
1028
1025
|
</UFormField>
|
|
1029
|
-
<p v-if="resolvingIssueBodies" class="text-[11px] text-
|
|
1026
|
+
<p v-if="resolvingIssueBodies" class="text-[11px] text-dimmed">
|
|
1030
1027
|
{{ t('board.addTask.loadingIssue') }}
|
|
1031
1028
|
</p>
|
|
1032
1029
|
|
|
@@ -1054,10 +1051,10 @@ function openReviewFrictionDialog(conflict: NonNullable<ReturnType<typeof parseC
|
|
|
1054
1051
|
|
|
1055
1052
|
<UCheckbox v-if="uiMode.isAdvanced" v-model="technical" name="technical">
|
|
1056
1053
|
<template #label>
|
|
1057
|
-
<span class="text-sm text-
|
|
1054
|
+
<span class="text-sm text-default">{{ t('board.addTask.technical') }}</span>
|
|
1058
1055
|
</template>
|
|
1059
1056
|
<template #description>
|
|
1060
|
-
<span class="text-[11px] text-
|
|
1057
|
+
<span class="text-[11px] text-dimmed">
|
|
1061
1058
|
{{ t('board.addTask.technicalHint') }}
|
|
1062
1059
|
</span>
|
|
1063
1060
|
</template>
|
|
@@ -1109,22 +1106,22 @@ function openReviewFrictionDialog(conflict: NonNullable<ReturnType<typeof parseC
|
|
|
1109
1106
|
<label
|
|
1110
1107
|
v-for="phase in BUG_FISHING_PHASES"
|
|
1111
1108
|
:key="phase.id"
|
|
1112
|
-
class="flex items-start gap-2 rounded-md px-1.5 py-1 text-[12px] hover:bg-
|
|
1109
|
+
class="flex items-start gap-2 rounded-md px-1.5 py-1 text-[12px] hover:bg-elevated/40"
|
|
1113
1110
|
>
|
|
1114
1111
|
<input
|
|
1115
1112
|
v-model="fishingPhaseIds"
|
|
1116
1113
|
type="checkbox"
|
|
1117
1114
|
:value="phase.id"
|
|
1118
|
-
class="mt-0.5 accent-
|
|
1115
|
+
class="mt-0.5 accent-app-info-500"
|
|
1119
1116
|
:data-testid="`add-task-fishing-angle-${phase.id}`"
|
|
1120
1117
|
/>
|
|
1121
1118
|
<span class="min-w-0">
|
|
1122
|
-
<span class="block text-
|
|
1123
|
-
<span class="block text-[11px] text-
|
|
1119
|
+
<span class="block text-default">{{ phase.title }}</span>
|
|
1120
|
+
<span class="block text-[11px] text-dimmed">{{ phase.goal }}</span>
|
|
1124
1121
|
</span>
|
|
1125
1122
|
</label>
|
|
1126
1123
|
</div>
|
|
1127
|
-
<p v-if="fishingPhaseIds.length === 0" class="mt-1.5 text-[11px] text-
|
|
1124
|
+
<p v-if="fishingPhaseIds.length === 0" class="mt-1.5 text-[11px] text-dimmed">
|
|
1128
1125
|
{{ t('board.addTask.bugFishingFields.angles.allSelected') }}
|
|
1129
1126
|
</p>
|
|
1130
1127
|
</UFormField>
|
|
@@ -1388,11 +1385,11 @@ function openReviewFrictionDialog(conflict: NonNullable<ReturnType<typeof parseC
|
|
|
1388
1385
|
</div>
|
|
1389
1386
|
|
|
1390
1387
|
<div v-if="configDescriptors.length" class="space-y-3">
|
|
1391
|
-
<span class="text-[11px] font-semibold uppercase tracking-wide text-
|
|
1388
|
+
<span class="text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
1392
1389
|
{{ t('board.addTask.agentConfiguration') }}
|
|
1393
1390
|
</span>
|
|
1394
1391
|
<div v-for="d in configDescriptors" :key="d.id" class="space-y-1">
|
|
1395
|
-
<div class="text-[11px] text-
|
|
1392
|
+
<div class="text-[11px] text-muted">{{ d.label }}</div>
|
|
1396
1393
|
<div v-if="d.type === 'select'" class="flex flex-wrap gap-1">
|
|
1397
1394
|
<UButton
|
|
1398
1395
|
v-for="opt in d.options"
|
|
@@ -1414,7 +1411,7 @@ function openReviewFrictionDialog(conflict: NonNullable<ReturnType<typeof parseC
|
|
|
1414
1411
|
:data-testid="`agent-config-${d.id}`"
|
|
1415
1412
|
@update:model-value="(v: string | number) => setConfig(d.id, String(v))"
|
|
1416
1413
|
/>
|
|
1417
|
-
<p class="text-[11px] leading-snug text-
|
|
1414
|
+
<p class="text-[11px] leading-snug text-dimmed">{{ d.description }}</p>
|
|
1418
1415
|
</div>
|
|
1419
1416
|
</div>
|
|
1420
1417
|
|
|
@@ -1443,7 +1440,7 @@ function openReviewFrictionDialog(conflict: NonNullable<ReturnType<typeof parseC
|
|
|
1443
1440
|
:issues-hint="t('board.addTask.noIssuesHint')"
|
|
1444
1441
|
/>
|
|
1445
1442
|
|
|
1446
|
-
<p class="text-[11px] text-
|
|
1443
|
+
<p class="text-[11px] text-dimmed">
|
|
1447
1444
|
{{ t('board.addTask.plannedHint') }}
|
|
1448
1445
|
</p>
|
|
1449
1446
|
</template>
|
|
@@ -133,7 +133,7 @@ async function retry() {
|
|
|
133
133
|
|
|
134
134
|
<template>
|
|
135
135
|
<div
|
|
136
|
-
class="nodrag rounded-lg border border-
|
|
136
|
+
class="nodrag rounded-lg border border-app-error-900/60 bg-app-error-950/40"
|
|
137
137
|
:class="compact ? 'px-3 py-2' : 'px-3 py-2.5'"
|
|
138
138
|
data-testid="agent-failure-banner"
|
|
139
139
|
:data-run-kind="run.kind"
|
|
@@ -141,15 +141,15 @@ async function retry() {
|
|
|
141
141
|
<div class="flex items-center gap-1.5" :class="compact ? 'text-[11px]' : 'text-xs'">
|
|
142
142
|
<UIcon
|
|
143
143
|
name="i-lucide-alert-triangle"
|
|
144
|
-
class="shrink-0 text-
|
|
144
|
+
class="shrink-0 text-app-error-400"
|
|
145
145
|
:class="compact ? 'h-3.5 w-3.5' : 'h-4 w-4'"
|
|
146
146
|
/>
|
|
147
|
-
<span class="text-
|
|
147
|
+
<span class="text-app-error-300">{{ title }}</span>
|
|
148
148
|
</div>
|
|
149
149
|
|
|
150
150
|
<p
|
|
151
151
|
v-if="failure?.message"
|
|
152
|
-
class="mt-1 leading-snug text-
|
|
152
|
+
class="mt-1 leading-snug text-app-error-300/90"
|
|
153
153
|
:class="compact ? 'line-clamp-2 text-[10px]' : 'text-[11px]'"
|
|
154
154
|
:title="failure.message"
|
|
155
155
|
>
|
|
@@ -158,7 +158,7 @@ async function retry() {
|
|
|
158
158
|
|
|
159
159
|
<p
|
|
160
160
|
v-if="failure?.hint"
|
|
161
|
-
class="mt-1 leading-snug text-
|
|
161
|
+
class="mt-1 leading-snug text-app-error-400/70"
|
|
162
162
|
:class="compact ? 'text-[10px]' : 'text-[11px]'"
|
|
163
163
|
>
|
|
164
164
|
{{ failure.hint }}
|
|
@@ -168,7 +168,7 @@ async function retry() {
|
|
|
168
168
|
name the concrete .env fix rather than only pointing at the (unhelpful-here) tab. -->
|
|
169
169
|
<p
|
|
170
170
|
v-if="showEnvironmentLocalHint && !compact"
|
|
171
|
-
class="mt-1 text-[11px] leading-snug text-
|
|
171
|
+
class="mt-1 text-[11px] leading-snug text-app-error-400/70"
|
|
172
172
|
data-testid="agent-failure-environment-local-hint"
|
|
173
173
|
>
|
|
174
174
|
{{
|
|
@@ -192,14 +192,14 @@ async function retry() {
|
|
|
192
192
|
v-if="!compact && failure"
|
|
193
193
|
:detail="failure.detail"
|
|
194
194
|
:message="failure.message"
|
|
195
|
-
summary-class="text-[10px] text-
|
|
196
|
-
pre-class="bg-
|
|
195
|
+
summary-class="text-[10px] text-app-error-400/60 hover:text-app-error-300"
|
|
196
|
+
pre-class="bg-app-error-950/60 text-[10px] text-app-error-200/80"
|
|
197
197
|
/>
|
|
198
198
|
|
|
199
199
|
<div class="mt-2 flex flex-wrap items-center gap-2">
|
|
200
200
|
<button
|
|
201
201
|
type="button"
|
|
202
|
-
class="nodrag flex items-center gap-1 rounded-md bg-
|
|
202
|
+
class="nodrag flex items-center gap-1 rounded-md bg-app-error-900/40 text-app-error-200 hover:bg-app-error-900/70 disabled:opacity-60"
|
|
203
203
|
:class="compact ? 'px-2 py-0.5 text-[10px]' : 'px-2 py-1 text-[11px]'"
|
|
204
204
|
:disabled="retrying || !access.canExecuteRuns.value"
|
|
205
205
|
:title="access.canExecuteRuns.value ? undefined : t('access.noRunExecute')"
|
|
@@ -216,7 +216,7 @@ async function retry() {
|
|
|
216
216
|
<button
|
|
217
217
|
v-if="run.kind === 'bootstrap'"
|
|
218
218
|
type="button"
|
|
219
|
-
class="nodrag flex items-center gap-1 rounded-md bg-
|
|
219
|
+
class="nodrag flex items-center gap-1 rounded-md bg-app-error-900/20 text-app-error-300 hover:bg-app-error-900/50"
|
|
220
220
|
:class="compact ? 'px-2 py-0.5 text-[10px]' : 'px-2 py-1 text-[11px]'"
|
|
221
221
|
data-testid="agent-failure-inspect"
|
|
222
222
|
@click.stop="inspectRun"
|
|
@@ -233,7 +233,7 @@ async function retry() {
|
|
|
233
233
|
<button
|
|
234
234
|
v-if="isEnvironmentFailure"
|
|
235
235
|
type="button"
|
|
236
|
-
class="nodrag flex items-center gap-1 rounded-md bg-
|
|
236
|
+
class="nodrag flex items-center gap-1 rounded-md bg-app-error-900/20 text-app-error-300 hover:bg-app-error-900/50"
|
|
237
237
|
:class="compact ? 'px-2 py-0.5 text-[10px]' : 'px-2 py-1 text-[11px]'"
|
|
238
238
|
data-testid="agent-failure-configure-environment"
|
|
239
239
|
@click.stop="openFailureSetup"
|
|
@@ -15,11 +15,11 @@ const { t } = useI18n()
|
|
|
15
15
|
<template>
|
|
16
16
|
<details
|
|
17
17
|
v-if="failures.length"
|
|
18
|
-
class="nodrag rounded-lg border border-
|
|
18
|
+
class="nodrag rounded-lg border border-muted/60 bg-default/40 px-3 py-2"
|
|
19
19
|
data-testid="agent-failure-history"
|
|
20
20
|
>
|
|
21
21
|
<summary
|
|
22
|
-
class="flex cursor-pointer items-center gap-1.5 text-[11px] text-
|
|
22
|
+
class="flex cursor-pointer items-center gap-1.5 text-[11px] text-muted hover:text-default"
|
|
23
23
|
>
|
|
24
24
|
<UIcon name="i-lucide-history" class="h-3.5 w-3.5 shrink-0" />
|
|
25
25
|
{{ t('board.failure.history.previousErrors', { count: failures.length }, failures.length) }}
|
|
@@ -141,7 +141,8 @@ function onPaneClick() {
|
|
|
141
141
|
@pane-click="onPaneClick"
|
|
142
142
|
@contextmenu.prevent
|
|
143
143
|
>
|
|
144
|
-
|
|
144
|
+
<!-- The dot grid rides the border token: `neutral-800` in dark (the shade it always was), `200` in light. -->
|
|
145
|
+
<Background pattern-color="var(--ui-border)" :gap="22" :size="1.4" />
|
|
145
146
|
<!-- No minimap: it's a precise-pointer affordance (too small to hit on touch,
|
|
146
147
|
eats scarce width on narrow windows) that earned its keep on neither
|
|
147
148
|
desktop nor mobile. The toolbar's zoom-in/out + fit-view controls are the
|
|
@@ -163,10 +164,10 @@ function onPaneClick() {
|
|
|
163
164
|
v-if="board.frames.length === 0"
|
|
164
165
|
class="pointer-events-none absolute inset-0 flex flex-col items-center justify-center gap-4 text-center"
|
|
165
166
|
>
|
|
166
|
-
<UIcon name="i-lucide-layout-dashboard" class="h-10 w-10 text-
|
|
167
|
+
<UIcon name="i-lucide-layout-dashboard" class="h-10 w-10 text-app-600" />
|
|
167
168
|
<div>
|
|
168
|
-
<h2 class="text-base font-semibold text-
|
|
169
|
-
<p class="mt-1 max-w-sm text-sm text-
|
|
169
|
+
<h2 class="text-base font-semibold text-toned">{{ t('board.canvas.emptyTitle') }}</h2>
|
|
170
|
+
<p class="mt-1 max-w-sm text-sm text-dimmed">
|
|
170
171
|
{{ t('board.canvas.emptyBody') }}
|
|
171
172
|
</p>
|
|
172
173
|
</div>
|
|
@@ -195,7 +196,7 @@ function onPaneClick() {
|
|
|
195
196
|
</UButton>
|
|
196
197
|
</div>
|
|
197
198
|
<!-- A read-only viewer sees the empty state but no create affordances. -->
|
|
198
|
-
<p v-else class="max-w-sm text-xs text-
|
|
199
|
+
<p v-else class="max-w-sm text-xs text-app-600">{{ t('access.noBoardWrite') }}</p>
|
|
199
200
|
</div>
|
|
200
201
|
|
|
201
202
|
<!-- task dependency arrows, overlaid in screen space -->
|
|
@@ -180,10 +180,10 @@ async function create() {
|
|
|
180
180
|
<UModal v-model:open="open" :title="t('initiative.create.title')">
|
|
181
181
|
<template #body>
|
|
182
182
|
<div class="space-y-4" data-testid="create-initiative-modal">
|
|
183
|
-
<p v-if="frame" class="text-xs text-
|
|
183
|
+
<p v-if="frame" class="text-xs text-muted">
|
|
184
184
|
<i18n-t keypath="initiative.create.inFrame" tag="span" scope="global">
|
|
185
185
|
<template #frame>
|
|
186
|
-
<span class="font-medium text-
|
|
186
|
+
<span class="font-medium text-default">{{ frame.title }}</span>
|
|
187
187
|
</template>
|
|
188
188
|
</i18n-t>
|
|
189
189
|
</p>
|
|
@@ -191,9 +191,7 @@ async function create() {
|
|
|
191
191
|
<!-- Preset picker: only when a deployment registered presets beyond the built-in generic
|
|
192
192
|
one, so a single-preset install keeps today's plain form. -->
|
|
193
193
|
<div v-if="presets.length > 1" class="space-y-1.5">
|
|
194
|
-
<span class="text-xs font-medium text-
|
|
195
|
-
t('initiative.create.preset')
|
|
196
|
-
}}</span>
|
|
194
|
+
<span class="text-xs font-medium text-toned">{{ t('initiative.create.preset') }}</span>
|
|
197
195
|
<div class="grid gap-2" data-testid="initiative-preset-picker">
|
|
198
196
|
<button
|
|
199
197
|
v-for="p in presets"
|
|
@@ -204,8 +202,8 @@ async function create() {
|
|
|
204
202
|
class="flex items-start gap-3 rounded-md border px-3 py-2 text-left transition"
|
|
205
203
|
:class="
|
|
206
204
|
p.id === selectedPresetId
|
|
207
|
-
? 'border-primary
|
|
208
|
-
: 'border-
|
|
205
|
+
? 'border-primary bg-primary/10'
|
|
206
|
+
: 'border-muted hover:border-app-600'
|
|
209
207
|
"
|
|
210
208
|
@click="selectPreset(p.id)"
|
|
211
209
|
>
|
|
@@ -215,10 +213,10 @@ async function create() {
|
|
|
215
213
|
:style="{ color: p.presentation.color }"
|
|
216
214
|
/>
|
|
217
215
|
<span class="min-w-0">
|
|
218
|
-
<span class="block text-sm font-medium text-
|
|
216
|
+
<span class="block text-sm font-medium text-default">
|
|
219
217
|
{{ p.presentation.label }}
|
|
220
218
|
</span>
|
|
221
|
-
<span class="block text-[11px] text-
|
|
219
|
+
<span class="block text-[11px] text-muted">
|
|
222
220
|
{{ p.presentation.description }}
|
|
223
221
|
</span>
|
|
224
222
|
</span>
|
|
@@ -266,7 +264,7 @@ async function create() {
|
|
|
266
264
|
:issues-hint="t('initiative.create.contextIssuesHint')"
|
|
267
265
|
/>
|
|
268
266
|
|
|
269
|
-
<p class="text-[11px] text-
|
|
267
|
+
<p class="text-[11px] text-dimmed">
|
|
270
268
|
{{ t('initiative.create.hint') }}
|
|
271
269
|
</p>
|
|
272
270
|
</div>
|
|
@@ -20,27 +20,27 @@ const ordered = computed(() => [...props.failures].reverse())
|
|
|
20
20
|
<li
|
|
21
21
|
v-for="failure in ordered"
|
|
22
22
|
:key="failure.occurredAt"
|
|
23
|
-
class="rounded-md border border-
|
|
23
|
+
class="rounded-md border border-default/80 bg-app-950/50 px-2.5 py-2"
|
|
24
24
|
data-testid="agent-failure-history-entry"
|
|
25
25
|
>
|
|
26
|
-
<div class="flex items-center gap-1.5 text-[10px] text-
|
|
27
|
-
<UIcon name="i-lucide-alert-triangle" class="h-3 w-3 shrink-0 text-
|
|
26
|
+
<div class="flex items-center gap-1.5 text-[10px] text-dimmed">
|
|
27
|
+
<UIcon name="i-lucide-alert-triangle" class="h-3 w-3 shrink-0 text-app-error-400/70" />
|
|
28
28
|
<time>{{ d(new Date(failure.occurredAt), 'long') }}</time>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
|
-
<p class="mt-1 text-[11px] leading-snug text-
|
|
31
|
+
<p class="mt-1 text-[11px] leading-snug text-toned" :title="failure.message">
|
|
32
32
|
{{ failure.message }}
|
|
33
33
|
</p>
|
|
34
34
|
|
|
35
|
-
<p v-if="failure.hint" class="mt-1 text-[10px] leading-snug text-
|
|
35
|
+
<p v-if="failure.hint" class="mt-1 text-[10px] leading-snug text-dimmed">
|
|
36
36
|
{{ failure.hint }}
|
|
37
37
|
</p>
|
|
38
38
|
|
|
39
39
|
<FailureDetail
|
|
40
40
|
:detail="failure.detail"
|
|
41
41
|
:message="failure.message"
|
|
42
|
-
summary-class="text-[10px] text-
|
|
43
|
-
pre-class="bg-
|
|
42
|
+
summary-class="text-[10px] text-dimmed hover:text-toned"
|
|
43
|
+
pre-class="bg-app-950/80 text-[10px] text-muted"
|
|
44
44
|
/>
|
|
45
45
|
</li>
|
|
46
46
|
</ol>
|
|
@@ -410,10 +410,10 @@ async function add() {
|
|
|
410
410
|
<UModal v-model:open="modalOpen" :title="t('board.recurring.title')">
|
|
411
411
|
<template #body>
|
|
412
412
|
<div class="space-y-4">
|
|
413
|
-
<p v-if="frame" class="text-xs text-
|
|
413
|
+
<p v-if="frame" class="text-xs text-muted">
|
|
414
414
|
<i18n-t keypath="board.recurring.on" tag="span" scope="global">
|
|
415
415
|
<template #frame>
|
|
416
|
-
<span class="font-medium text-
|
|
416
|
+
<span class="font-medium text-default">{{ frame.title }}</span>
|
|
417
417
|
</template>
|
|
418
418
|
</i18n-t>
|
|
419
419
|
</p>
|
|
@@ -449,11 +449,11 @@ async function add() {
|
|
|
449
449
|
/>
|
|
450
450
|
</UFormField>
|
|
451
451
|
|
|
452
|
-
<div class="flex items-start gap-2 rounded-lg border border-
|
|
452
|
+
<div class="flex items-start gap-2 rounded-lg border border-default p-3">
|
|
453
453
|
<USwitch v-model="onDemand" :disabled="onDemandLocked" size="sm" class="mt-0.5" />
|
|
454
454
|
<div class="space-y-0.5">
|
|
455
|
-
<p class="text-xs font-medium text-
|
|
456
|
-
<p class="text-[11px] text-
|
|
455
|
+
<p class="text-xs font-medium text-default">{{ t('board.recurring.onDemand') }}</p>
|
|
456
|
+
<p class="text-[11px] text-dimmed">
|
|
457
457
|
{{
|
|
458
458
|
onDemandLocked
|
|
459
459
|
? t('board.recurring.onDemandLockedHint')
|
|
@@ -465,11 +465,11 @@ async function add() {
|
|
|
465
465
|
|
|
466
466
|
<RecurringRecurrenceEditor v-if="!onDemand" v-model="recurrence" />
|
|
467
467
|
|
|
468
|
-
<div v-if="filesTicket" class="space-y-3 rounded-lg border border-
|
|
469
|
-
<p class="text-[11px] font-semibold uppercase tracking-wide text-
|
|
468
|
+
<div v-if="filesTicket" class="space-y-3 rounded-lg border border-default p-3">
|
|
469
|
+
<p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
470
470
|
{{ t('board.recurring.issueTracker') }}
|
|
471
471
|
</p>
|
|
472
|
-
<p class="text-[11px] text-
|
|
472
|
+
<p class="text-[11px] text-dimmed">
|
|
473
473
|
{{ t('board.recurring.issueTrackerHint') }}
|
|
474
474
|
</p>
|
|
475
475
|
<div class="flex gap-1">
|
|
@@ -538,25 +538,25 @@ async function add() {
|
|
|
538
538
|
@update:model-value="setTrackerTrigger"
|
|
539
539
|
/>
|
|
540
540
|
<div>
|
|
541
|
-
<p class="text-xs font-medium text-
|
|
541
|
+
<p class="text-xs font-medium text-default">
|
|
542
542
|
{{ t('board.recurring.trackerTrigger') }}
|
|
543
543
|
</p>
|
|
544
|
-
<p class="text-[11px] text-
|
|
544
|
+
<p class="text-[11px] text-dimmed">
|
|
545
545
|
{{ t('board.recurring.trackerTriggerHint') }}
|
|
546
546
|
</p>
|
|
547
547
|
</div>
|
|
548
548
|
</div>
|
|
549
549
|
|
|
550
|
-
<div v-if="showIntake" class="space-y-3 rounded-lg border border-
|
|
551
|
-
<p class="text-[11px] font-semibold uppercase tracking-wide text-
|
|
550
|
+
<div v-if="showIntake" class="space-y-3 rounded-lg border border-default p-3">
|
|
551
|
+
<p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
552
552
|
{{ t('board.recurring.intake') }}
|
|
553
553
|
</p>
|
|
554
|
-
<p class="text-[11px] text-
|
|
554
|
+
<p class="text-[11px] text-dimmed">
|
|
555
555
|
{{ t('board.recurring.intakeHint') }}
|
|
556
556
|
</p>
|
|
557
557
|
<!-- Two different remedies: connect something, versus connect something ELSE. A source
|
|
558
558
|
that is connected but cannot run a scheduled search is not an absent connection. -->
|
|
559
|
-
<p v-if="intakeSources.length === 0" class="text-[11px] text-
|
|
559
|
+
<p v-if="intakeSources.length === 0" class="text-[11px] text-app-warning-500">
|
|
560
560
|
{{
|
|
561
561
|
tasks.anyOffered
|
|
562
562
|
? t('board.recurring.intakeNoIntakeSources')
|
|
@@ -626,7 +626,7 @@ async function add() {
|
|
|
626
626
|
</UFormField>
|
|
627
627
|
|
|
628
628
|
<template v-if="intakeSource">
|
|
629
|
-
<p class="text-[11px] text-
|
|
629
|
+
<p class="text-[11px] text-dimmed">
|
|
630
630
|
{{
|
|
631
631
|
intakeDispatch === 'per-ticket'
|
|
632
632
|
? t('board.recurring.intakeDispatchPerTicketHint')
|
|
@@ -659,7 +659,7 @@ async function add() {
|
|
|
659
659
|
still holding a value would read as a filter that is on. Stated here because a
|
|
660
660
|
schedule fires unattended — the only other evidence of the gap is a bugfix run
|
|
661
661
|
started on a docs chore. -->
|
|
662
|
-
<p v-else class="text-xs text-
|
|
662
|
+
<p v-else class="text-xs text-app-warning-400">
|
|
663
663
|
{{
|
|
664
664
|
t('board.recurring.intakeIssueTypeUnsupported', {
|
|
665
665
|
tracker: intakeSourceLabel,
|
|
@@ -677,7 +677,7 @@ async function add() {
|
|
|
677
677
|
</template>
|
|
678
678
|
</div>
|
|
679
679
|
|
|
680
|
-
<p class="text-[11px] text-
|
|
680
|
+
<p class="text-[11px] text-dimmed">
|
|
681
681
|
{{ t('board.recurring.footerHint') }}
|
|
682
682
|
</p>
|
|
683
683
|
</div>
|
|
@@ -81,24 +81,24 @@ function createAnyway() {
|
|
|
81
81
|
>
|
|
82
82
|
<template #body>
|
|
83
83
|
<div v-if="ctx" class="space-y-5">
|
|
84
|
-
<p class="text-sm text-
|
|
84
|
+
<p class="text-sm text-toned">{{ body }}</p>
|
|
85
85
|
|
|
86
|
-
<div class="rounded-lg border border-
|
|
87
|
-
<p class="mb-1.5 px-1 text-[11px] font-semibold uppercase tracking-wide text-
|
|
86
|
+
<div class="rounded-lg border border-muted bg-default/50 p-2">
|
|
87
|
+
<p class="mb-1.5 px-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
88
88
|
{{ t('errors.reviewFriction.waitingHeading') }}
|
|
89
89
|
</p>
|
|
90
90
|
<ul class="space-y-1">
|
|
91
91
|
<li v-for="item in ctx.debt" :key="item.blockId">
|
|
92
92
|
<button
|
|
93
93
|
type="button"
|
|
94
|
-
class="flex w-full items-center justify-between gap-3 rounded-md px-2 py-1.5 text-left text-sm hover:bg-
|
|
94
|
+
class="flex w-full items-center justify-between gap-3 rounded-md px-2 py-1.5 text-left text-sm hover:bg-elevated/60 disabled:opacity-50"
|
|
95
95
|
:disabled="pending"
|
|
96
96
|
@click="goToBlock(item.blockId)"
|
|
97
97
|
>
|
|
98
|
-
<span class="truncate text-
|
|
98
|
+
<span class="truncate text-default">
|
|
99
99
|
{{ item.title || t('errors.reviewFriction.untitled') }}
|
|
100
100
|
</span>
|
|
101
|
-
<span class="shrink-0 text-[12px] text-
|
|
101
|
+
<span class="shrink-0 text-[12px] text-dimmed">
|
|
102
102
|
{{ t('errors.reviewFriction.waiting', { minutes: item.waitingMinutes }) }}
|
|
103
103
|
</span>
|
|
104
104
|
</button>
|