@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
|
@@ -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>
|
|
@@ -46,8 +46,8 @@ const entries = computed<Entry[]>(() =>
|
|
|
46
46
|
class="rounded-md border px-2.5 py-2"
|
|
47
47
|
:class="
|
|
48
48
|
entry.kind === 'success'
|
|
49
|
-
? 'border-
|
|
50
|
-
: 'border-
|
|
49
|
+
? 'border-app-success-900/60 bg-app-success-950/20'
|
|
50
|
+
: 'border-default/80 bg-app-950/50'
|
|
51
51
|
"
|
|
52
52
|
:data-testid="
|
|
53
53
|
entry.kind === 'success' ? 'step-history-success-entry' : 'step-history-failure-entry'
|
|
@@ -55,39 +55,39 @@ const entries = computed<Entry[]>(() =>
|
|
|
55
55
|
>
|
|
56
56
|
<!-- a superseded SUCCESSFUL attempt: its output, collapsible + copyable -->
|
|
57
57
|
<template v-if="entry.kind === 'success'">
|
|
58
|
-
<div class="flex items-center gap-1.5 text-[10px] text-
|
|
59
|
-
<UIcon name="i-lucide-check-circle-2" class="h-3 w-3 shrink-0 text-
|
|
58
|
+
<div class="flex items-center gap-1.5 text-[10px] text-dimmed">
|
|
59
|
+
<UIcon name="i-lucide-check-circle-2" class="h-3 w-3 shrink-0 text-app-success-400/70" />
|
|
60
60
|
<time>{{ d(new Date(entry.occurredAt), 'long') }}</time>
|
|
61
|
-
<span class="text-
|
|
61
|
+
<span class="text-app-success-400/80">{{ t('panels.stepDetail.attemptSucceeded') }}</span>
|
|
62
62
|
</div>
|
|
63
63
|
<div class="relative mt-1">
|
|
64
64
|
<CopyButton :text="entry.output.output" class="absolute end-1 top-1 z-10" />
|
|
65
65
|
<pre
|
|
66
|
-
class="max-h-40 overflow-auto whitespace-pre-wrap rounded bg-
|
|
66
|
+
class="max-h-40 overflow-auto whitespace-pre-wrap rounded bg-app-950/80 p-1.5 pe-9 text-[10px] leading-snug text-toned"
|
|
67
67
|
>{{ entry.output.output }}</pre>
|
|
68
68
|
</div>
|
|
69
|
-
<p v-if="entry.output.truncated" class="mt-1 text-[10px] text-
|
|
69
|
+
<p v-if="entry.output.truncated" class="mt-1 text-[10px] text-dimmed">
|
|
70
70
|
{{ t('panels.stepDetail.outputTruncated') }}
|
|
71
71
|
</p>
|
|
72
72
|
</template>
|
|
73
73
|
|
|
74
74
|
<!-- a FAILED attempt: mirrors FailureHistoryList's entry markup -->
|
|
75
75
|
<template v-else>
|
|
76
|
-
<div class="flex items-center gap-1.5 text-[10px] text-
|
|
77
|
-
<UIcon name="i-lucide-alert-triangle" class="h-3 w-3 shrink-0 text-
|
|
76
|
+
<div class="flex items-center gap-1.5 text-[10px] text-dimmed">
|
|
77
|
+
<UIcon name="i-lucide-alert-triangle" class="h-3 w-3 shrink-0 text-app-error-400/70" />
|
|
78
78
|
<time>{{ d(new Date(entry.occurredAt), 'long') }}</time>
|
|
79
79
|
</div>
|
|
80
|
-
<p class="mt-1 text-[11px] leading-snug text-
|
|
80
|
+
<p class="mt-1 text-[11px] leading-snug text-toned" :title="entry.failure.message">
|
|
81
81
|
{{ entry.failure.message }}
|
|
82
82
|
</p>
|
|
83
|
-
<p v-if="entry.failure.hint" class="mt-1 text-[10px] leading-snug text-
|
|
83
|
+
<p v-if="entry.failure.hint" class="mt-1 text-[10px] leading-snug text-dimmed">
|
|
84
84
|
{{ entry.failure.hint }}
|
|
85
85
|
</p>
|
|
86
86
|
<FailureDetail
|
|
87
87
|
:detail="entry.failure.detail"
|
|
88
88
|
:message="entry.failure.message"
|
|
89
|
-
summary-class="text-[10px] text-
|
|
90
|
-
pre-class="bg-
|
|
89
|
+
summary-class="text-[10px] text-dimmed hover:text-toned"
|
|
90
|
+
pre-class="bg-app-950/80 text-[10px] text-muted"
|
|
91
91
|
/>
|
|
92
92
|
</template>
|
|
93
93
|
</li>
|
|
@@ -193,7 +193,7 @@ watch([taskDeps, epicLinks, frontendLinks, connectionLinks], poke)
|
|
|
193
193
|
markerHeight="6"
|
|
194
194
|
orient="auto-start-reverse"
|
|
195
195
|
>
|
|
196
|
-
<path d="M0,0 L10,5 L0,10 z" fill="
|
|
196
|
+
<path d="M0,0 L10,5 L0,10 z" fill="var(--ui-warning)" />
|
|
197
197
|
</marker>
|
|
198
198
|
<marker
|
|
199
199
|
id="task-arrow-done"
|
|
@@ -204,7 +204,7 @@ watch([taskDeps, epicLinks, frontendLinks, connectionLinks], poke)
|
|
|
204
204
|
markerHeight="6"
|
|
205
205
|
orient="auto-start-reverse"
|
|
206
206
|
>
|
|
207
|
-
<path d="M0,0 L10,5 L0,10 z" fill="
|
|
207
|
+
<path d="M0,0 L10,5 L0,10 z" fill="var(--ui-text-muted)" />
|
|
208
208
|
</marker>
|
|
209
209
|
<marker
|
|
210
210
|
id="frontend-arrow"
|
|
@@ -215,7 +215,7 @@ watch([taskDeps, epicLinks, frontendLinks, connectionLinks], poke)
|
|
|
215
215
|
markerHeight="6"
|
|
216
216
|
orient="auto-start-reverse"
|
|
217
217
|
>
|
|
218
|
-
<path d="M0,0 L10,5 L0,10 z" fill="
|
|
218
|
+
<path d="M0,0 L10,5 L0,10 z" fill="var(--app-hue-cyan)" />
|
|
219
219
|
</marker>
|
|
220
220
|
<marker
|
|
221
221
|
id="service-connection-arrow"
|
|
@@ -226,7 +226,7 @@ watch([taskDeps, epicLinks, frontendLinks, connectionLinks], poke)
|
|
|
226
226
|
markerHeight="6"
|
|
227
227
|
orient="auto-start-reverse"
|
|
228
228
|
>
|
|
229
|
-
<path d="M0,0 L10,5 L0,10 z" fill="
|
|
229
|
+
<path d="M0,0 L10,5 L0,10 z" fill="var(--app-hue-emerald)" />
|
|
230
230
|
</marker>
|
|
231
231
|
</defs>
|
|
232
232
|
|
|
@@ -238,7 +238,7 @@ watch([taskDeps, epicLinks, frontendLinks, connectionLinks], poke)
|
|
|
238
238
|
:y1="s.y1"
|
|
239
239
|
:x2="s.x2"
|
|
240
240
|
:y2="s.y2"
|
|
241
|
-
stroke="
|
|
241
|
+
stroke="var(--app-hue-emerald)"
|
|
242
242
|
:stroke-width="1.5"
|
|
243
243
|
stroke-dasharray="3 4"
|
|
244
244
|
:stroke-opacity="0.55"
|
|
@@ -253,7 +253,7 @@ watch([taskDeps, epicLinks, frontendLinks, connectionLinks], poke)
|
|
|
253
253
|
:y1="s.y1"
|
|
254
254
|
:x2="s.x2"
|
|
255
255
|
:y2="s.y2"
|
|
256
|
-
stroke="
|
|
256
|
+
stroke="var(--app-hue-cyan)"
|
|
257
257
|
:stroke-width="1.5"
|
|
258
258
|
stroke-dasharray="1 4"
|
|
259
259
|
:stroke-opacity="0.6"
|
|
@@ -268,7 +268,7 @@ watch([taskDeps, epicLinks, frontendLinks, connectionLinks], poke)
|
|
|
268
268
|
:y1="s.y1"
|
|
269
269
|
:x2="s.x2"
|
|
270
270
|
:y2="s.y2"
|
|
271
|
-
stroke="
|
|
271
|
+
stroke="var(--app-hue-violet)"
|
|
272
272
|
:stroke-width="1.5"
|
|
273
273
|
stroke-dasharray="2 5"
|
|
274
274
|
:stroke-opacity="0.5"
|
|
@@ -281,7 +281,7 @@ watch([taskDeps, epicLinks, frontendLinks, connectionLinks], poke)
|
|
|
281
281
|
:y1="s.y1"
|
|
282
282
|
:x2="s.x2"
|
|
283
283
|
:y2="s.y2"
|
|
284
|
-
:stroke="s.done ? '
|
|
284
|
+
:stroke="s.done ? 'var(--ui-text-muted)' : 'var(--ui-warning)'"
|
|
285
285
|
:stroke-width="2"
|
|
286
286
|
:stroke-dasharray="s.done ? '0' : '5 4'"
|
|
287
287
|
:stroke-opacity="0.85"
|