@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
|
@@ -298,7 +298,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
298
298
|
<ResultWindowShell
|
|
299
299
|
:open="open"
|
|
300
300
|
icon="i-lucide-milestone"
|
|
301
|
-
icon-class="bg-
|
|
301
|
+
icon-class="bg-primary/15 text-primary"
|
|
302
302
|
:title="initiative?.title ?? block?.title ?? t('initiative.tracker.title')"
|
|
303
303
|
:subtitle="t('initiative.tracker.subtitle')"
|
|
304
304
|
width="full"
|
|
@@ -307,13 +307,13 @@ const { requestClose } = useUnsavedGuard({
|
|
|
307
307
|
>
|
|
308
308
|
<template #header-extras>
|
|
309
309
|
<div v-if="progress" class="flex items-center gap-2" data-testid="initiative-progress">
|
|
310
|
-
<div class="h-1.5 w-24 overflow-hidden rounded-full bg-
|
|
310
|
+
<div class="h-1.5 w-24 overflow-hidden rounded-full bg-elevated">
|
|
311
311
|
<div
|
|
312
|
-
class="h-full rounded-full bg-
|
|
312
|
+
class="h-full rounded-full bg-app-success-500 transition-[width] duration-500"
|
|
313
313
|
:style="{ width: `${progressPct}%` }"
|
|
314
314
|
/>
|
|
315
315
|
</div>
|
|
316
|
-
<span class="text-[11px] tabular-nums text-
|
|
316
|
+
<span class="text-[11px] tabular-nums text-muted">
|
|
317
317
|
{{ t('initiative.card.progress', { done: progress.settled, total: progress.total }) }}
|
|
318
318
|
</span>
|
|
319
319
|
</div>
|
|
@@ -363,7 +363,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
363
363
|
the scroller by the notice's own height. -->
|
|
364
364
|
<div
|
|
365
365
|
v-if="!initiative"
|
|
366
|
-
class="flex flex-col items-center justify-center gap-2 text-center text-
|
|
366
|
+
class="flex flex-col items-center justify-center gap-2 text-center text-muted"
|
|
367
367
|
:class="planApproval ? 'py-16' : 'h-full'"
|
|
368
368
|
>
|
|
369
369
|
<UIcon name="i-lucide-milestone" class="h-8 w-8 opacity-40" />
|
|
@@ -376,21 +376,24 @@ const { requestClose } = useUnsavedGuard({
|
|
|
376
376
|
then resume (continue) or cancel (stop) the initiative right here. -->
|
|
377
377
|
<section
|
|
378
378
|
v-if="pausedAtCheckpoint"
|
|
379
|
-
class="mb-4 rounded-lg border border-
|
|
379
|
+
class="mb-4 rounded-lg border border-app-warning-500/40 bg-app-warning-500/10 p-3.5"
|
|
380
380
|
data-testid="initiative-checkpoint-pause"
|
|
381
381
|
>
|
|
382
382
|
<div class="flex items-start gap-2.5">
|
|
383
|
-
<UIcon
|
|
383
|
+
<UIcon
|
|
384
|
+
name="i-lucide-pause-circle"
|
|
385
|
+
class="mt-0.5 h-4 w-4 shrink-0 text-app-warning-300"
|
|
386
|
+
/>
|
|
384
387
|
<div class="min-w-0 flex-1">
|
|
385
|
-
<h3 class="text-[13px] font-semibold text-
|
|
388
|
+
<h3 class="text-[13px] font-semibold text-app-warning-200">
|
|
386
389
|
{{ t('initiative.checkpoint.pausedTitle') }}
|
|
387
390
|
</h3>
|
|
388
|
-
<p class="mt-0.5 text-[12px] leading-relaxed text-
|
|
391
|
+
<p class="mt-0.5 text-[12px] leading-relaxed text-app-warning-100/80">
|
|
389
392
|
{{ t('initiative.checkpoint.pausedBody', { phase: checkpointPhase!.title }) }}
|
|
390
393
|
</p>
|
|
391
394
|
<div class="mt-2.5 flex flex-wrap gap-2">
|
|
392
395
|
<button
|
|
393
|
-
class="rounded bg-
|
|
396
|
+
class="rounded bg-primary/90 px-2.5 py-1 text-[11px] font-medium text-inverted hover:bg-primary disabled:opacity-50"
|
|
394
397
|
:disabled="initiatives.controlling"
|
|
395
398
|
data-testid="initiative-checkpoint-resume"
|
|
396
399
|
@click="checkpointControl('resume')"
|
|
@@ -398,7 +401,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
398
401
|
{{ t('initiative.inspector.resume') }}
|
|
399
402
|
</button>
|
|
400
403
|
<button
|
|
401
|
-
class="rounded border border-
|
|
404
|
+
class="rounded border border-app-error-500/50 px-2.5 py-1 text-[11px] font-medium text-app-error-300 hover:bg-app-error-500/10 disabled:opacity-50"
|
|
402
405
|
:disabled="initiatives.controlling"
|
|
403
406
|
data-testid="initiative-checkpoint-cancel"
|
|
404
407
|
@click="checkpointControl('cancel')"
|
|
@@ -415,34 +418,34 @@ const { requestClose } = useUnsavedGuard({
|
|
|
415
418
|
structure that reads better at the full span, but these are paragraphs and bullets
|
|
416
419
|
of agent-written text that would otherwise run the width of the display. -->
|
|
417
420
|
<section v-if="initiative.goal" class="mb-4">
|
|
418
|
-
<h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-
|
|
421
|
+
<h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
419
422
|
{{ t('initiative.tracker.goal') }}
|
|
420
423
|
</h3>
|
|
421
|
-
<p class="max-w-3xl whitespace-pre-wrap text-[13px] leading-relaxed text-
|
|
424
|
+
<p class="max-w-3xl whitespace-pre-wrap text-[13px] leading-relaxed text-toned">
|
|
422
425
|
{{ initiative.goal }}
|
|
423
426
|
</p>
|
|
424
427
|
</section>
|
|
425
428
|
<section v-if="initiative.constraints?.length" class="mb-4">
|
|
426
|
-
<h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-
|
|
429
|
+
<h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
427
430
|
{{ t('initiative.tracker.constraints') }}
|
|
428
431
|
</h3>
|
|
429
|
-
<ul class="max-w-3xl list-inside list-disc text-[13px] text-
|
|
432
|
+
<ul class="max-w-3xl list-inside list-disc text-[13px] text-toned">
|
|
430
433
|
<li v-for="(c, i) in initiative.constraints" :key="i">{{ c }}</li>
|
|
431
434
|
</ul>
|
|
432
435
|
</section>
|
|
433
436
|
<section v-if="initiative.nonGoals?.length" class="mb-4">
|
|
434
|
-
<h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-
|
|
437
|
+
<h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
435
438
|
{{ t('initiative.tracker.nonGoals') }}
|
|
436
439
|
</h3>
|
|
437
|
-
<ul class="max-w-3xl list-inside list-disc text-[13px] text-
|
|
440
|
+
<ul class="max-w-3xl list-inside list-disc text-[13px] text-toned">
|
|
438
441
|
<li v-for="(g, i) in initiative.nonGoals" :key="i">{{ g }}</li>
|
|
439
442
|
</ul>
|
|
440
443
|
</section>
|
|
441
444
|
<section v-if="initiative.analysisSummary" class="mb-4">
|
|
442
|
-
<h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-
|
|
445
|
+
<h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
443
446
|
{{ t('initiative.tracker.analysis') }}
|
|
444
447
|
</h3>
|
|
445
|
-
<p class="max-w-3xl whitespace-pre-wrap text-[13px] leading-relaxed text-
|
|
448
|
+
<p class="max-w-3xl whitespace-pre-wrap text-[13px] leading-relaxed text-toned">
|
|
446
449
|
{{ initiative.analysisSummary }}
|
|
447
450
|
</p>
|
|
448
451
|
</section>
|
|
@@ -450,14 +453,14 @@ const { requestClose } = useUnsavedGuard({
|
|
|
450
453
|
<!-- Awaiting planning -->
|
|
451
454
|
<div
|
|
452
455
|
v-if="phases.length === 0"
|
|
453
|
-
class="mb-4 rounded-lg border border-dashed border-
|
|
456
|
+
class="mb-4 rounded-lg border border-dashed border-muted p-4 text-center text-[12px] text-muted"
|
|
454
457
|
>
|
|
455
458
|
{{ t('initiative.tracker.noPlan') }}
|
|
456
459
|
</div>
|
|
457
460
|
|
|
458
461
|
<!-- Phases + items -->
|
|
459
462
|
<section v-for="phase in phases" :key="phase.id" class="mb-5">
|
|
460
|
-
<h3 class="mb-1 flex items-center gap-2 text-sm font-semibold text-
|
|
463
|
+
<h3 class="mb-1 flex items-center gap-2 text-sm font-semibold text-default">
|
|
461
464
|
<span>{{ t('initiative.tracker.phase', { title: phase.title }) }}</span>
|
|
462
465
|
<!-- Checkpoint annotation (D2): this phase pauses the initiative for human review
|
|
463
466
|
once its items settle. Cleared → already reviewed; the pending one → awaiting
|
|
@@ -485,11 +488,11 @@ const { requestClose } = useUnsavedGuard({
|
|
|
485
488
|
}}
|
|
486
489
|
</UBadge>
|
|
487
490
|
</h3>
|
|
488
|
-
<p v-if="phase.goal" class="mb-2 text-[12px] text-
|
|
489
|
-
<div class="overflow-x-auto rounded-lg border border-
|
|
491
|
+
<p v-if="phase.goal" class="mb-2 text-[12px] text-muted">{{ phase.goal }}</p>
|
|
492
|
+
<div class="overflow-x-auto rounded-lg border border-default">
|
|
490
493
|
<table class="w-full text-[12px]">
|
|
491
494
|
<thead>
|
|
492
|
-
<tr class="border-b border-
|
|
495
|
+
<tr class="border-b border-default text-left text-dimmed">
|
|
493
496
|
<th class="px-3 py-2 font-medium">{{ t('initiative.tracker.colItem') }}</th>
|
|
494
497
|
<th class="px-3 py-2 font-medium">{{ t('initiative.tracker.colStatus') }}</th>
|
|
495
498
|
<th class="px-3 py-2 font-medium">{{ t('initiative.tracker.colPr') }}</th>
|
|
@@ -499,18 +502,21 @@ const { requestClose } = useUnsavedGuard({
|
|
|
499
502
|
<tr
|
|
500
503
|
v-for="item in itemsOf(phase.id)"
|
|
501
504
|
:key="item.id"
|
|
502
|
-
class="border-b border-
|
|
505
|
+
class="border-b border-default/60 last:border-0"
|
|
503
506
|
>
|
|
504
507
|
<td class="px-3 py-2 align-top">
|
|
505
|
-
<div class="font-medium text-
|
|
506
|
-
<div v-if="item.dependsOn?.length" class="mt-0.5 text-[10px] text-
|
|
508
|
+
<div class="font-medium text-default">{{ item.title }}</div>
|
|
509
|
+
<div v-if="item.dependsOn?.length" class="mt-0.5 text-[10px] text-dimmed">
|
|
507
510
|
{{
|
|
508
511
|
t('initiative.tracker.dependsOn', {
|
|
509
512
|
items: item.dependsOn.join(', '),
|
|
510
513
|
})
|
|
511
514
|
}}
|
|
512
515
|
</div>
|
|
513
|
-
<div
|
|
516
|
+
<div
|
|
517
|
+
v-if="item.note"
|
|
518
|
+
class="mt-0.5 max-w-3xl text-[10px] text-app-warning-300/80"
|
|
519
|
+
>
|
|
514
520
|
{{ item.note }}
|
|
515
521
|
</div>
|
|
516
522
|
<div
|
|
@@ -519,7 +525,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
519
525
|
>
|
|
520
526
|
<button
|
|
521
527
|
v-if="item.status === 'blocked'"
|
|
522
|
-
class="rounded border border-
|
|
528
|
+
class="rounded border border-muted px-1.5 py-0.5 text-[10px] text-toned hover:bg-elevated disabled:opacity-50"
|
|
523
529
|
:disabled="initiatives.curating"
|
|
524
530
|
:data-testid="`initiative-item-retry-${item.id}`"
|
|
525
531
|
@click="itemAction(item, 'retry')"
|
|
@@ -527,7 +533,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
527
533
|
{{ t('initiative.curation.retry') }}
|
|
528
534
|
</button>
|
|
529
535
|
<button
|
|
530
|
-
class="rounded border border-
|
|
536
|
+
class="rounded border border-muted px-1.5 py-0.5 text-[10px] text-toned hover:bg-elevated disabled:opacity-50"
|
|
531
537
|
:disabled="initiatives.curating"
|
|
532
538
|
:data-testid="`initiative-item-skip-${item.id}`"
|
|
533
539
|
@click="itemAction(item, 'skip')"
|
|
@@ -551,11 +557,11 @@ const { requestClose } = useUnsavedGuard({
|
|
|
551
557
|
:href="item.pr.url"
|
|
552
558
|
target="_blank"
|
|
553
559
|
rel="noopener"
|
|
554
|
-
class="text-
|
|
560
|
+
class="text-app-info-400 hover:underline"
|
|
555
561
|
>
|
|
556
562
|
{{ item.pr.number ? `#${item.pr.number}` : t('initiative.tracker.prLink') }}
|
|
557
563
|
</a>
|
|
558
|
-
<span v-else class="text-
|
|
564
|
+
<span v-else class="text-app-600">—</span>
|
|
559
565
|
</td>
|
|
560
566
|
</tr>
|
|
561
567
|
</tbody>
|
|
@@ -566,19 +572,19 @@ const { requestClose } = useUnsavedGuard({
|
|
|
566
572
|
<!-- Execution policy -->
|
|
567
573
|
<section v-if="initiative.policy" class="mb-4">
|
|
568
574
|
<div class="mb-1 flex items-center gap-2">
|
|
569
|
-
<h3 class="text-[11px] font-semibold uppercase tracking-wide text-
|
|
575
|
+
<h3 class="text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
570
576
|
{{ t('initiative.tracker.policy') }}
|
|
571
577
|
</h3>
|
|
572
578
|
<button
|
|
573
579
|
v-if="editable && !editingPolicy"
|
|
574
|
-
class="rounded border border-
|
|
580
|
+
class="rounded border border-muted px-1.5 py-0.5 text-[10px] text-toned hover:bg-elevated"
|
|
575
581
|
data-testid="initiative-policy-edit"
|
|
576
582
|
@click="startEditPolicy"
|
|
577
583
|
>
|
|
578
584
|
{{ t('initiative.curation.edit') }}
|
|
579
585
|
</button>
|
|
580
586
|
</div>
|
|
581
|
-
<ul v-if="!editingPolicy" class="text-[12px] text-
|
|
587
|
+
<ul v-if="!editingPolicy" class="text-[12px] text-toned">
|
|
582
588
|
<li>
|
|
583
589
|
{{
|
|
584
590
|
t('initiative.tracker.maxConcurrent', {
|
|
@@ -587,39 +593,39 @@ const { requestClose } = useUnsavedGuard({
|
|
|
587
593
|
}}
|
|
588
594
|
</li>
|
|
589
595
|
<li v-for="(rule, i) in policyRules" :key="i">
|
|
590
|
-
<code class="text-
|
|
596
|
+
<code class="text-app-info-300">{{ rule.pipelineId }}</code>
|
|
591
597
|
· {{ ruleAxes(rule) }}
|
|
592
598
|
</li>
|
|
593
599
|
<li>
|
|
594
600
|
{{ t('initiative.tracker.defaultPipeline') }}
|
|
595
|
-
<code class="text-
|
|
601
|
+
<code class="text-app-info-300">{{ initiative.policy.defaultPipelineId }}</code>
|
|
596
602
|
</li>
|
|
597
603
|
</ul>
|
|
598
604
|
<!-- Edit form: the two scalar knobs; planner-authored rules are preserved. -->
|
|
599
|
-
<div v-else class="flex flex-col gap-2 rounded-lg border border-
|
|
600
|
-
<label class="flex items-center gap-2 text-[12px] text-
|
|
605
|
+
<div v-else class="flex flex-col gap-2 rounded-lg border border-default p-3">
|
|
606
|
+
<label class="flex items-center gap-2 text-[12px] text-toned">
|
|
601
607
|
<span class="w-40">{{ t('initiative.curation.maxConcurrentField') }}</span>
|
|
602
608
|
<input
|
|
603
609
|
v-model.number="policyForm.maxConcurrent"
|
|
604
610
|
type="number"
|
|
605
611
|
min="1"
|
|
606
612
|
max="20"
|
|
607
|
-
class="w-20 rounded border border-
|
|
613
|
+
class="w-20 rounded border border-muted bg-app-950 px-2 py-1 text-default"
|
|
608
614
|
data-testid="initiative-policy-max-concurrent"
|
|
609
615
|
/>
|
|
610
616
|
</label>
|
|
611
|
-
<label class="flex items-center gap-2 text-[12px] text-
|
|
617
|
+
<label class="flex items-center gap-2 text-[12px] text-toned">
|
|
612
618
|
<span class="w-40">{{ t('initiative.curation.defaultPipelineField') }}</span>
|
|
613
619
|
<input
|
|
614
620
|
v-model="policyForm.defaultPipelineId"
|
|
615
621
|
type="text"
|
|
616
|
-
class="flex-1 rounded border border-
|
|
622
|
+
class="flex-1 rounded border border-muted bg-app-950 px-2 py-1 font-mono text-[11px] text-default"
|
|
617
623
|
data-testid="initiative-policy-default-pipeline"
|
|
618
624
|
/>
|
|
619
625
|
</label>
|
|
620
626
|
<div class="flex gap-2">
|
|
621
627
|
<button
|
|
622
|
-
class="rounded bg-
|
|
628
|
+
class="rounded bg-primary/90 px-2 py-1 text-[11px] text-inverted hover:bg-primary disabled:opacity-50"
|
|
623
629
|
:disabled="initiatives.curating"
|
|
624
630
|
data-testid="initiative-policy-save"
|
|
625
631
|
@click="savePolicy"
|
|
@@ -627,7 +633,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
627
633
|
{{ t('initiative.curation.save') }}
|
|
628
634
|
</button>
|
|
629
635
|
<button
|
|
630
|
-
class="rounded border border-
|
|
636
|
+
class="rounded border border-muted px-2 py-1 text-[11px] text-toned hover:bg-elevated"
|
|
631
637
|
@click="editingPolicy = false"
|
|
632
638
|
>
|
|
633
639
|
{{ t('initiative.curation.cancel') }}
|
|
@@ -638,43 +644,43 @@ const { requestClose } = useUnsavedGuard({
|
|
|
638
644
|
|
|
639
645
|
<!-- Logs -->
|
|
640
646
|
<section v-if="initiative.decisions?.length" class="mb-4">
|
|
641
|
-
<h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-
|
|
647
|
+
<h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
642
648
|
{{ t('initiative.tracker.decisions') }}
|
|
643
649
|
</h3>
|
|
644
|
-
<ul class="list-inside list-disc text-[13px] text-
|
|
650
|
+
<ul class="list-inside list-disc text-[13px] text-toned">
|
|
645
651
|
<li v-for="d in initiative.decisions" :key="d.id">
|
|
646
652
|
<span class="font-medium">{{ d.title }}</span>
|
|
647
|
-
<span v-if="d.detail" class="text-
|
|
653
|
+
<span v-if="d.detail" class="text-muted"> — {{ d.detail }}</span>
|
|
648
654
|
</li>
|
|
649
655
|
</ul>
|
|
650
656
|
</section>
|
|
651
657
|
<section v-if="initiative.deviations?.length" class="mb-4">
|
|
652
|
-
<h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-
|
|
658
|
+
<h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
653
659
|
{{ t('initiative.tracker.deviations') }}
|
|
654
660
|
</h3>
|
|
655
|
-
<ul class="max-w-3xl list-inside list-disc text-[13px] text-
|
|
661
|
+
<ul class="max-w-3xl list-inside list-disc text-[13px] text-toned">
|
|
656
662
|
<li v-for="d in initiative.deviations" :key="d.id">
|
|
657
|
-
<code v-if="d.itemId" class="text-
|
|
663
|
+
<code v-if="d.itemId" class="text-muted">{{ d.itemId }}</code>
|
|
658
664
|
{{ d.description }}
|
|
659
|
-
<span v-if="d.resolution" class="text-
|
|
665
|
+
<span v-if="d.resolution" class="text-muted"> → {{ d.resolution }}</span>
|
|
660
666
|
</li>
|
|
661
667
|
</ul>
|
|
662
668
|
</section>
|
|
663
669
|
<section v-if="initiative.followUps?.length" class="mb-4">
|
|
664
|
-
<h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-
|
|
670
|
+
<h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
665
671
|
{{ t('initiative.tracker.followUps') }}
|
|
666
672
|
</h3>
|
|
667
|
-
<ul class="flex flex-col gap-2 text-[13px] text-
|
|
673
|
+
<ul class="flex flex-col gap-2 text-[13px] text-toned">
|
|
668
674
|
<li
|
|
669
675
|
v-for="f in initiative.followUps"
|
|
670
676
|
:key="f.id"
|
|
671
|
-
class="rounded-lg border border-
|
|
677
|
+
class="rounded-lg border border-default p-2.5"
|
|
672
678
|
:data-testid="`initiative-followup-${f.id}`"
|
|
673
679
|
>
|
|
674
680
|
<div class="flex items-start gap-2">
|
|
675
681
|
<div class="min-w-0 flex-1">
|
|
676
682
|
<span class="font-medium">{{ f.title }}</span>
|
|
677
|
-
<span v-if="f.detail" class="text-
|
|
683
|
+
<span v-if="f.detail" class="text-muted"> — {{ f.detail }}</span>
|
|
678
684
|
</div>
|
|
679
685
|
<UBadge
|
|
680
686
|
:color="INITIATIVE_FOLLOWUP_STATUS_CHIPS[f.status]"
|
|
@@ -688,10 +694,10 @@ const { requestClose } = useUnsavedGuard({
|
|
|
688
694
|
<div v-if="editable && f.status === 'open'" class="mt-2">
|
|
689
695
|
<div v-if="promotingId === f.id" class="flex flex-col gap-2">
|
|
690
696
|
<label class="flex items-center gap-2 text-[12px]">
|
|
691
|
-
<span class="text-
|
|
697
|
+
<span class="text-muted">{{ t('initiative.curation.phaseField') }}</span>
|
|
692
698
|
<select
|
|
693
699
|
v-model="promoteForm.phaseId"
|
|
694
|
-
class="flex-1 rounded border border-
|
|
700
|
+
class="flex-1 rounded border border-muted bg-app-950 px-2 py-1 text-default"
|
|
695
701
|
data-testid="initiative-promote-phase"
|
|
696
702
|
>
|
|
697
703
|
<option v-for="p in phases" :key="p.id" :value="p.id">
|
|
@@ -702,13 +708,13 @@ const { requestClose } = useUnsavedGuard({
|
|
|
702
708
|
<input
|
|
703
709
|
v-model="promoteForm.title"
|
|
704
710
|
type="text"
|
|
705
|
-
class="rounded border border-
|
|
711
|
+
class="rounded border border-muted bg-app-950 px-2 py-1 text-[12px] text-default"
|
|
706
712
|
:placeholder="t('initiative.curation.itemTitlePlaceholder')"
|
|
707
713
|
data-testid="initiative-promote-title"
|
|
708
714
|
/>
|
|
709
715
|
<div class="flex gap-2">
|
|
710
716
|
<button
|
|
711
|
-
class="rounded bg-
|
|
717
|
+
class="rounded bg-primary/90 px-2 py-1 text-[11px] text-inverted hover:bg-primary disabled:opacity-50"
|
|
712
718
|
:disabled="initiatives.curating || !promoteForm.phaseId"
|
|
713
719
|
data-testid="initiative-promote-submit"
|
|
714
720
|
@click="submitPromote(f)"
|
|
@@ -716,7 +722,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
716
722
|
{{ t('initiative.curation.promoteConfirm') }}
|
|
717
723
|
</button>
|
|
718
724
|
<button
|
|
719
|
-
class="rounded border border-
|
|
725
|
+
class="rounded border border-muted px-2 py-1 text-[11px] text-toned hover:bg-elevated"
|
|
720
726
|
@click="promotingId = null"
|
|
721
727
|
>
|
|
722
728
|
{{ t('initiative.curation.cancel') }}
|
|
@@ -725,14 +731,14 @@ const { requestClose } = useUnsavedGuard({
|
|
|
725
731
|
</div>
|
|
726
732
|
<div v-else class="flex gap-1.5">
|
|
727
733
|
<button
|
|
728
|
-
class="rounded border border-
|
|
734
|
+
class="rounded border border-muted px-1.5 py-0.5 text-[10px] text-toned hover:bg-elevated"
|
|
729
735
|
data-testid="initiative-followup-promote"
|
|
730
736
|
@click="startPromote(f)"
|
|
731
737
|
>
|
|
732
738
|
{{ t('initiative.curation.promote') }}
|
|
733
739
|
</button>
|
|
734
740
|
<button
|
|
735
|
-
class="rounded border border-
|
|
741
|
+
class="rounded border border-muted px-1.5 py-0.5 text-[10px] text-toned hover:bg-elevated disabled:opacity-50"
|
|
736
742
|
:disabled="initiatives.curating"
|
|
737
743
|
data-testid="initiative-followup-dismiss"
|
|
738
744
|
@click="dismissFollowUp(f)"
|
|
@@ -745,10 +751,10 @@ const { requestClose } = useUnsavedGuard({
|
|
|
745
751
|
</ul>
|
|
746
752
|
</section>
|
|
747
753
|
<section v-if="initiative.caveats?.length" class="mb-4">
|
|
748
|
-
<h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-
|
|
754
|
+
<h3 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
749
755
|
{{ t('initiative.tracker.caveats') }}
|
|
750
756
|
</h3>
|
|
751
|
-
<ul class="max-w-3xl list-inside list-disc text-[13px] text-
|
|
757
|
+
<ul class="max-w-3xl list-inside list-disc text-[13px] text-toned">
|
|
752
758
|
<li v-for="(c, i) in initiative.caveats" :key="i">{{ c }}</li>
|
|
753
759
|
</ul>
|
|
754
760
|
</section>
|
|
@@ -762,7 +768,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
762
768
|
<aside
|
|
763
769
|
v-if="runMeta"
|
|
764
770
|
data-testid="initiative-tracker-run-meta"
|
|
765
|
-
class="hidden w-60 shrink-0 flex-col gap-4 overflow-y-auto border-s border-
|
|
771
|
+
class="hidden w-60 shrink-0 flex-col gap-4 overflow-y-auto border-s border-default bg-default/50 px-4 py-4 lg:flex"
|
|
766
772
|
>
|
|
767
773
|
<StepRunMeta v-bind="runMeta" />
|
|
768
774
|
</aside>
|
|
@@ -126,9 +126,7 @@ async function resolve(choice: 'recheck' | 'proceed') {
|
|
|
126
126
|
<div
|
|
127
127
|
class="rounded-lg border p-3"
|
|
128
128
|
:class="
|
|
129
|
-
blocking
|
|
130
|
-
? 'border-amber-300 bg-amber-50 dark:border-amber-800 dark:bg-amber-950/40'
|
|
131
|
-
: 'border-default bg-elevated/40'
|
|
129
|
+
blocking ? 'border-app-warning-800 bg-app-warning-950/40' : 'border-default bg-elevated/40'
|
|
132
130
|
"
|
|
133
131
|
:data-tone="tone"
|
|
134
132
|
data-testid="input-gate-notice"
|
|
@@ -137,7 +135,7 @@ async function resolve(choice: 'recheck' | 'proceed') {
|
|
|
137
135
|
<UIcon
|
|
138
136
|
:name="blocking ? 'i-lucide-file-question' : 'i-lucide-info'"
|
|
139
137
|
class="mt-0.5 size-4 shrink-0"
|
|
140
|
-
:class="blocking ? 'text-
|
|
138
|
+
:class="blocking ? 'text-app-warning-400' : 'text-muted'"
|
|
141
139
|
/>
|
|
142
140
|
<div class="min-w-0 flex-1">
|
|
143
141
|
<p class="text-sm font-medium">{{ t(copy.title) }}</p>
|
|
@@ -84,10 +84,10 @@ const SEVERITY_LABELS = computed<Record<JudgeFinding['severity'], string>>(() =>
|
|
|
84
84
|
}))
|
|
85
85
|
|
|
86
86
|
const SEVERITY_CLASSES: Record<JudgeFinding['severity'], string> = {
|
|
87
|
-
low: 'border-
|
|
88
|
-
medium: 'border-
|
|
89
|
-
high: 'border-orange
|
|
90
|
-
critical: 'border-
|
|
87
|
+
low: 'border-muted text-toned',
|
|
88
|
+
medium: 'border-app-warning-500/40 text-app-warning-300',
|
|
89
|
+
high: 'border-app-hue-orange/40 text-app-hue-orange',
|
|
90
|
+
critical: 'border-app-error-500/40 text-app-error-300',
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
const DISPOSITION_LABELS = computed<
|
|
@@ -128,7 +128,7 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
|
|
|
128
128
|
<ResultWindowShell
|
|
129
129
|
:open="open"
|
|
130
130
|
:icon="meta.icon"
|
|
131
|
-
icon-class="bg-
|
|
131
|
+
icon-class="bg-app-warning-500/15 text-app-warning-300"
|
|
132
132
|
:title="headerTitle"
|
|
133
133
|
:subtitle="t('judge.subtitle')"
|
|
134
134
|
:step-ref="{ instanceId, stepIndex }"
|
|
@@ -150,7 +150,7 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
|
|
|
150
150
|
<div class="min-w-0 flex-1 overflow-y-auto px-5 py-4">
|
|
151
151
|
<div
|
|
152
152
|
v-if="!judge"
|
|
153
|
-
class="flex h-full flex-col items-center justify-center gap-2 text-center text-
|
|
153
|
+
class="flex h-full flex-col items-center justify-center gap-2 text-center text-muted"
|
|
154
154
|
>
|
|
155
155
|
<UIcon :name="meta.icon" class="h-8 w-8 opacity-40" />
|
|
156
156
|
<p class="text-sm">{{ t('judge.empty') }}</p>
|
|
@@ -159,26 +159,26 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
|
|
|
159
159
|
<template v-else>
|
|
160
160
|
<!-- The score against the task's threshold — the whole verdict in one line. -->
|
|
161
161
|
<div
|
|
162
|
-
class="flex flex-wrap items-center gap-x-3 gap-y-1 rounded-lg border border-
|
|
162
|
+
class="flex flex-wrap items-center gap-x-3 gap-y-1 rounded-lg border border-default bg-app-950/40 px-3 py-2.5"
|
|
163
163
|
data-testid="judge-score"
|
|
164
164
|
>
|
|
165
|
-
<span class="text-[13px] font-semibold text-
|
|
165
|
+
<span class="text-[13px] font-semibold text-app-100">
|
|
166
166
|
{{ score === null ? t('judge.notScored') : n(score, 'percent') }}
|
|
167
167
|
</span>
|
|
168
168
|
<span
|
|
169
169
|
v-if="threshold !== null"
|
|
170
|
-
class="text-[12px] text-
|
|
170
|
+
class="text-[12px] text-muted"
|
|
171
171
|
:title="t('judge.thresholdHint')"
|
|
172
172
|
>
|
|
173
173
|
{{ t('judge.threshold', { threshold: n(threshold, 'percent') }) }}
|
|
174
174
|
</span>
|
|
175
|
-
<span v-if="judge.disposition" class="text-[12px] text-
|
|
175
|
+
<span v-if="judge.disposition" class="text-[12px] text-muted">
|
|
176
176
|
· {{ DISPOSITION_LABELS[judge.disposition] }}
|
|
177
177
|
</span>
|
|
178
|
-
<span v-if="judge.rubricOverridden" class="text-[11px] text-
|
|
178
|
+
<span v-if="judge.rubricOverridden" class="text-[11px] text-app-secondary-300">
|
|
179
179
|
· {{ t('judge.rubricOverridden') }}
|
|
180
180
|
</span>
|
|
181
|
-
<span v-if="(judge.maxBounces ?? 0) > 0" class="text-[11px] text-
|
|
181
|
+
<span v-if="(judge.maxBounces ?? 0) > 0" class="text-[11px] text-dimmed">
|
|
182
182
|
·
|
|
183
183
|
{{ t('judge.reworkRounds', { spent: judge.bounces ?? 0, budget: judge.maxBounces }) }}
|
|
184
184
|
</span>
|
|
@@ -189,7 +189,7 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
|
|
|
189
189
|
name doesn't, and being overridden by the task's own choice is the normal outcome. -->
|
|
190
190
|
<p
|
|
191
191
|
v-if="judge.modelPin?.status === 'unavailable'"
|
|
192
|
-
class="mt-2 rounded-md border border-
|
|
192
|
+
class="mt-2 rounded-md border border-app-warning-500/30 bg-app-warning-500/5 px-3 py-2 text-[12px] leading-relaxed text-app-warning-200"
|
|
193
193
|
data-testid="judge-model-pin"
|
|
194
194
|
>
|
|
195
195
|
{{ t('judge.modelPinUnavailable', { model: judge.modelPin.requested }) }}
|
|
@@ -199,7 +199,7 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
|
|
|
199
199
|
like a clean pass. -->
|
|
200
200
|
<p
|
|
201
201
|
v-if="judge.note"
|
|
202
|
-
class="mt-2 rounded-md border border-
|
|
202
|
+
class="mt-2 rounded-md border border-default bg-app-950/40 px-3 py-2 text-[12px] leading-relaxed text-muted"
|
|
203
203
|
>
|
|
204
204
|
{{ judge.note }}
|
|
205
205
|
</p>
|
|
@@ -210,19 +210,19 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
|
|
|
210
210
|
<CopyButton :text="verdict.summary" class="absolute end-1 top-1" />
|
|
211
211
|
<MarkdownProse
|
|
212
212
|
:text="verdict.summary"
|
|
213
|
-
class="pe-8 text-[13px] leading-relaxed text-
|
|
213
|
+
class="pe-8 text-[13px] leading-relaxed text-default"
|
|
214
214
|
/>
|
|
215
215
|
</div>
|
|
216
216
|
|
|
217
217
|
<section v-if="findings.length" class="mt-4">
|
|
218
|
-
<h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-
|
|
218
|
+
<h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
219
219
|
{{ t('judge.findingsHeading') }}
|
|
220
220
|
</h3>
|
|
221
221
|
<ul class="flex flex-col gap-2">
|
|
222
222
|
<li
|
|
223
223
|
v-for="(finding, i) in findings"
|
|
224
224
|
:key="`${finding.title}-${i}`"
|
|
225
|
-
class="rounded-md border border-
|
|
225
|
+
class="rounded-md border border-default bg-app-950/40 px-3 py-2"
|
|
226
226
|
data-testid="judge-finding"
|
|
227
227
|
>
|
|
228
228
|
<div class="flex flex-wrap items-center gap-2">
|
|
@@ -232,15 +232,15 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
|
|
|
232
232
|
>
|
|
233
233
|
{{ SEVERITY_LABELS[finding.severity] }}
|
|
234
234
|
</span>
|
|
235
|
-
<span class="text-[13px] font-medium text-
|
|
236
|
-
<code v-if="finding.where" class="text-[11px] text-
|
|
235
|
+
<span class="text-[13px] font-medium text-app-100">{{ finding.title }}</span>
|
|
236
|
+
<code v-if="finding.where" class="text-[11px] text-dimmed">{{
|
|
237
237
|
finding.where
|
|
238
238
|
}}</code>
|
|
239
239
|
</div>
|
|
240
240
|
<MarkdownProse
|
|
241
241
|
v-if="finding.detail"
|
|
242
242
|
:text="finding.detail"
|
|
243
|
-
class="mt-1 text-[12px] leading-relaxed text-
|
|
243
|
+
class="mt-1 text-[12px] leading-relaxed text-muted"
|
|
244
244
|
/>
|
|
245
245
|
</li>
|
|
246
246
|
</ul>
|
|
@@ -248,10 +248,10 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
|
|
|
248
248
|
|
|
249
249
|
<!-- The decision. Only shown while the run is actually parked on this verdict. -->
|
|
250
250
|
<section v-if="awaiting" class="mt-5" data-testid="judge-decision">
|
|
251
|
-
<h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-
|
|
251
|
+
<h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
252
252
|
{{ t('judge.decisionHeading') }}
|
|
253
253
|
</h3>
|
|
254
|
-
<p class="mb-2 text-[11px] leading-relaxed text-
|
|
254
|
+
<p class="mb-2 text-[11px] leading-relaxed text-dimmed">
|
|
255
255
|
{{ t('judge.decisionDescription') }}
|
|
256
256
|
</p>
|
|
257
257
|
<textarea
|
|
@@ -259,9 +259,9 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
|
|
|
259
259
|
rows="3"
|
|
260
260
|
:disabled="busy"
|
|
261
261
|
:placeholder="t('judge.feedbackPlaceholder')"
|
|
262
|
-
class="w-full resize-y rounded-md border border-
|
|
262
|
+
class="w-full resize-y rounded-md border border-default bg-app-950/60 px-3 py-2 text-[13px] text-default placeholder:text-app-600 focus:border-app-warning-500/60 focus:outline-none focus-visible:ring-2 focus-visible:ring-app-warning-500/60"
|
|
263
263
|
/>
|
|
264
|
-
<p v-if="judgeStore.error" class="mt-2 text-[12px] text-
|
|
264
|
+
<p v-if="judgeStore.error" class="mt-2 text-[12px] text-app-error-300">
|
|
265
265
|
{{ judgeStore.error }}
|
|
266
266
|
</p>
|
|
267
267
|
<div class="mt-2 flex flex-wrap justify-end gap-2">
|
|
@@ -307,23 +307,21 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
|
|
|
307
307
|
|
|
308
308
|
<!-- The round history: a looping judge must not be a black box (the gate-attempt rule). -->
|
|
309
309
|
<section v-if="rounds.length > 1" class="mt-5">
|
|
310
|
-
<h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-
|
|
310
|
+
<h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
311
311
|
{{ t('judge.roundsHeading') }}
|
|
312
312
|
</h3>
|
|
313
313
|
<ul class="flex flex-col gap-1.5">
|
|
314
314
|
<li
|
|
315
315
|
v-for="round in rounds"
|
|
316
316
|
:key="round.round"
|
|
317
|
-
class="flex flex-wrap items-center gap-2 rounded-md border border-
|
|
317
|
+
class="flex flex-wrap items-center gap-2 rounded-md border border-default bg-app-950/40 px-3 py-1.5 text-[12px] text-toned"
|
|
318
318
|
data-testid="judge-round"
|
|
319
319
|
:data-round-disposition="round.disposition"
|
|
320
320
|
>
|
|
321
|
-
<span class="text-
|
|
322
|
-
<span class="font-medium text-
|
|
323
|
-
|
|
324
|
-
}}</
|
|
325
|
-
<span class="text-slate-400">{{ DISPOSITION_LABELS[round.disposition] }}</span>
|
|
326
|
-
<code v-if="round.model" class="text-[11px] text-slate-500">{{ round.model }}</code>
|
|
321
|
+
<span class="text-dimmed">{{ t('judge.round', { round: round.round }) }}</span>
|
|
322
|
+
<span class="font-medium text-app-100">{{ n(round.verdict.score, 'percent') }}</span>
|
|
323
|
+
<span class="text-muted">{{ DISPOSITION_LABELS[round.disposition] }}</span>
|
|
324
|
+
<code v-if="round.model" class="text-[11px] text-dimmed">{{ round.model }}</code>
|
|
327
325
|
</li>
|
|
328
326
|
</ul>
|
|
329
327
|
</section>
|