@cat-factory/app 0.308.0 → 0.309.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -0
- package/app/assets/css/main.css +22 -0
- package/app/assets/css/prose.css +4 -4
- package/app/assets/css/type.css +24 -0
- package/app/components/assistant/AssistantModal.vue +3 -2
- package/app/components/auth/UserMenu.vue +1 -1
- package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +15 -15
- package/app/components/binaryOutput/BinaryOutputReport.vue +10 -14
- package/app/components/binaryOutput/StoredAssetView.vue +5 -5
- package/app/components/board/AddTaskModal.vue +16 -14
- package/app/components/board/AgentFailureCard.vue +9 -9
- package/app/components/board/AgentFailureHistory.vue +1 -1
- package/app/components/board/CreateInitiativeModal.vue +2 -2
- package/app/components/board/FailureDetail.vue +1 -1
- package/app/components/board/FailureHistoryList.vue +5 -5
- package/app/components/board/RecurringPipelineModal.vue +12 -11
- package/app/components/board/ReviewFrictionDialog.vue +4 -3
- package/app/components/board/StepExecutionHistory.vue +8 -8
- package/app/components/board/nodes/AgentChip.vue +1 -1
- package/app/components/board/nodes/BlockNode.vue +8 -9
- package/app/components/board/nodes/EpicNode.vue +4 -4
- package/app/components/board/nodes/FrameSwimlanes.vue +4 -7
- package/app/components/board/nodes/InitiativeCard.vue +4 -4
- package/app/components/board/nodes/LaneGroup.vue +3 -5
- package/app/components/board/nodes/TaskCard.vue +8 -8
- package/app/components/board/nodes/TaskLane.vue +3 -3
- package/app/components/board/nodes/TaskPipelineMini.vue +13 -12
- package/app/components/bootstrap/AdoptionReviewModal.vue +7 -6
- package/app/components/bootstrap/BootstrapModal.vue +11 -10
- package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
- package/app/components/brainstorm/BrainstormWindow.vue +8 -7
- package/app/components/bugFishing/BugFishingWindow.vue +37 -36
- package/app/components/clarity/ClarityReviewWindow.vue +8 -7
- package/app/components/common/AsyncViewError.vue +1 -1
- package/app/components/common/ClarificationItem.vue +6 -6
- package/app/components/common/DescriptorFields.vue +1 -1
- package/app/components/common/EmptyState.vue +1 -1
- package/app/components/common/InterviewGateNotice.vue +4 -4
- package/app/components/common/MarkdownProse.vue +8 -2
- package/app/components/common/SectionLabel.vue +38 -0
- package/app/components/consensus/ConsensusSessionWindow.vue +10 -9
- package/app/components/context/ContextAttachmentFields.vue +9 -8
- package/app/components/docs/DocInterviewWindow.vue +10 -9
- package/app/components/documents/ContextDocumentPicker.vue +10 -12
- package/app/components/documents/DocumentImportModal.vue +3 -2
- package/app/components/documents/DocumentSourceConnectModal.vue +2 -2
- package/app/components/documents/DocumentSyncState.vue +1 -1
- package/app/components/documents/DocumentTemplatesModal.vue +5 -4
- package/app/components/documents/RepoContextDocPicker.vue +3 -6
- package/app/components/documents/StartFromDesignModal.vue +4 -4
- package/app/components/documents/TaskContextDocs.vue +1 -1
- package/app/components/environments/EnvSetupStepper.vue +3 -3
- package/app/components/environments/EnvironmentStatusPanel.vue +11 -10
- package/app/components/environments/steps/EnvPreflightStep.vue +8 -8
- package/app/components/environments/steps/EnvReviewStep.vue +23 -22
- package/app/components/environments/steps/EnvSaveStep.vue +5 -5
- package/app/components/focus/BlockFocusView.vue +11 -10
- package/app/components/followUp/FollowUpWindow.vue +10 -10
- package/app/components/forkDecision/ForkDecisionWindow.vue +23 -26
- package/app/components/foundational/FoundationalContractSummary.vue +2 -2
- package/app/components/foundational/FoundationalServiceCatalogList.vue +3 -3
- package/app/components/foundational/FoundationalServiceRegistry.vue +3 -3
- package/app/components/foundational/FoundationalSuppressions.vue +2 -2
- package/app/components/fragments/FragmentLibraryManager.vue +3 -3
- package/app/components/fragments/FragmentSelector.vue +10 -11
- package/app/components/gates/GateFailingCheckList.vue +3 -3
- package/app/components/gates/GateResultView.vue +39 -38
- package/app/components/github/AddServiceFromRepoModal.vue +5 -4
- package/app/components/github/BranchProtectionPreflight.vue +5 -5
- package/app/components/github/GitHubConnect.vue +5 -3
- package/app/components/github/GitHubPanel.vue +14 -13
- package/app/components/github/RepoTreeBrowser.vue +1 -1
- package/app/components/humanTest/HumanTestWindow.vue +18 -17
- package/app/components/initiative/InitiativePlanNotice.vue +3 -3
- package/app/components/initiative/InitiativePlanReview.vue +19 -21
- package/app/components/initiative/InitiativePlanningWindow.vue +5 -5
- package/app/components/initiative/InitiativeTrackerWindow.vue +54 -53
- package/app/components/judge/JudgeResultView.vue +24 -25
- package/app/components/kaizen/KaizenPanel.vue +4 -4
- package/app/components/kaizen/KaizenStepStatus.vue +7 -6
- package/app/components/layout/AccountAuditLog.vue +1 -1
- package/app/components/layout/AccountDeploymentSettings.vue +10 -10
- package/app/components/layout/AccountFailureKindRules.vue +13 -13
- package/app/components/layout/AccountFoundationalSettings.vue +1 -1
- package/app/components/layout/AccountFragmentSettings.vue +1 -1
- package/app/components/layout/AccountModelPolicySettings.vue +7 -7
- package/app/components/layout/AccountPlatformAlertSettings.vue +8 -8
- package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
- package/app/components/layout/AccountRunCredentialSettings.vue +3 -3
- package/app/components/layout/AccountSkillSettings.vue +1 -1
- package/app/components/layout/AccountTeamSettings.vue +4 -0
- package/app/components/layout/AiProvidersBanner.vue +1 -1
- package/app/components/layout/AppearanceSwitcher.vue +1 -1
- package/app/components/layout/BoardSwitcher.vue +3 -2
- package/app/components/layout/BoardToolbar.vue +6 -2
- package/app/components/layout/CommandBar.vue +4 -2
- package/app/components/layout/DefaultTestEnvBanner.vue +2 -2
- package/app/components/layout/IntegrationsHub.vue +4 -3
- package/app/components/layout/LanguageSwitcher.vue +1 -1
- package/app/components/layout/ModelProvidersHub.vue +6 -4
- package/app/components/layout/NotificationsInbox.vue +8 -7
- package/app/components/layout/PersonalSetupModal.vue +5 -3
- package/app/components/layout/RolePrompt.vue +1 -1
- package/app/components/layout/SideBar.vue +3 -5
- package/app/components/layout/SpendWarningBanner.vue +3 -3
- package/app/components/layout/TranslationWarningBanner.vue +1 -1
- package/app/components/layout/UiModeSwitcher.vue +7 -6
- package/app/components/layout/UiRoleSwitcher.vue +2 -2
- package/app/components/media/ArtifactLightbox.vue +6 -6
- package/app/components/media/ImageCompare.vue +16 -16
- package/app/components/merge/MergeEffortChips.vue +4 -6
- package/app/components/notifications/NotificationSettingsPanel.vue +6 -5
- package/app/components/observability/OutcomeFilterChips.vue +1 -1
- package/app/components/observability/RunFailureSummary.vue +14 -17
- package/app/components/observability/StepMetricsBar.vue +9 -8
- package/app/components/observability/StepModelActivity.vue +4 -3
- package/app/components/observability/ToolCallList.vue +15 -18
- package/app/components/outcome/OutcomeSummaryWindow.vue +43 -42
- package/app/components/palettes/AgentPalette.vue +7 -5
- package/app/components/palettes/AgentTierSelect.vue +1 -1
- package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
- package/app/components/panels/AgentStepDetail.vue +27 -30
- package/app/components/panels/AttemptEntryHeader.vue +2 -2
- package/app/components/panels/DecisionModal.vue +1 -1
- package/app/components/panels/GenericStructuredResultView.vue +6 -5
- package/app/components/panels/InspectorPanel.vue +15 -13
- package/app/components/panels/MergerResultView.vue +10 -9
- package/app/components/panels/ObservabilityPanel.vue +66 -76
- package/app/components/panels/OperatorDashboardPanel.vue +27 -26
- package/app/components/panels/ReportsPanel.vue +26 -25
- package/app/components/panels/ReportsSpendBreakdown.vue +2 -2
- package/app/components/panels/ResultWindowShell.vue +19 -18
- package/app/components/panels/RunDetailLoadState.vue +1 -1
- package/app/components/panels/StepContainerStatus.vue +8 -7
- package/app/components/panels/StepDelegatedStatus.vue +13 -12
- package/app/components/panels/StepEffortReport.vue +12 -17
- package/app/components/panels/StepFragmentAdherence.vue +9 -10
- package/app/components/panels/StepMetadataCard.vue +41 -43
- package/app/components/panels/StepReproductionReport.vue +18 -20
- package/app/components/panels/StepRunMeta.vue +27 -26
- package/app/components/panels/StepTestReport.vue +16 -15
- package/app/components/panels/StepToolServers.vue +7 -8
- package/app/components/panels/StepValidationReport.vue +5 -5
- package/app/components/panels/inspector/ContainerSummary.vue +4 -4
- package/app/components/panels/inspector/DocReferenceRepos.vue +5 -4
- package/app/components/panels/inspector/EnvProbeReport.vue +16 -13
- package/app/components/panels/inspector/EpicChildren.vue +8 -7
- package/app/components/panels/inspector/FrontendBindingsResolved.vue +5 -4
- package/app/components/panels/inspector/FrontendConfig.vue +26 -34
- package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
- package/app/components/panels/inspector/InspectorSection.vue +7 -4
- package/app/components/panels/inspector/RecurringScheduleSettings.vue +9 -8
- package/app/components/panels/inspector/ServiceConnections.vue +2 -2
- package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
- package/app/components/panels/inspector/ServiceSelfTests.vue +9 -13
- package/app/components/panels/inspector/ServiceTestConfig.vue +41 -45
- package/app/components/panels/inspector/ServiceTestSecrets.vue +3 -3
- package/app/components/panels/inspector/ServiceTestingContext.vue +2 -2
- package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
- package/app/components/panels/inspector/TaskAgentConfig.vue +2 -2
- package/app/components/panels/inspector/TaskAprioriBranches.vue +6 -5
- package/app/components/panels/inspector/TaskDependencies.vue +1 -1
- package/app/components/panels/inspector/TaskEstimateBadge.vue +3 -7
- package/app/components/panels/inspector/TaskExecution.vue +13 -12
- package/app/components/panels/inspector/TaskRunSettings.vue +35 -38
- package/app/components/panels/inspector/TaskStructure.vue +5 -4
- package/app/components/pipeline/AgentPromptEditor.vue +15 -14
- package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -52
- package/app/components/pipeline/EstimateThresholdFields.vue +2 -2
- package/app/components/pipeline/GateConfigFields.vue +6 -6
- package/app/components/pipeline/IterationCapPrompt.vue +1 -1
- package/app/components/pipeline/PipelineBuilder.vue +28 -27
- package/app/components/pipeline/PipelineHealthModal.vue +7 -7
- package/app/components/pipeline/PipelinePicker.vue +3 -3
- package/app/components/pipeline/PipelinePreview.vue +6 -7
- package/app/components/pipeline/PipelineProgress.vue +23 -24
- package/app/components/prReview/PrReviewWindow.vue +42 -41
- package/app/components/providers/AiPresetMismatchDialog.vue +4 -3
- package/app/components/providers/AiProviderOnboardingModal.vue +2 -2
- package/app/components/providers/ApiKeysSection.vue +7 -6
- package/app/components/providers/PersonalSubscriptionSection.vue +4 -3
- package/app/components/providers/VendorCredentialsModal.vue +5 -4
- package/app/components/provisioning/ProvisioningLogsDrawer.vue +10 -9
- package/app/components/ralph/RalphLoopResultView.vue +25 -26
- package/app/components/requirements/RequirementsReviewWindow.vue +13 -12
- package/app/components/riskPolicy/RiskPolicyPicker.vue +5 -5
- package/app/components/riskPolicy/RiskPolicyPreview.vue +16 -15
- package/app/components/sandbox/SandboxPanel.vue +21 -20
- package/app/components/settings/ApiTokensPanel.vue +1 -1
- package/app/components/settings/BudgetSettings.vue +18 -17
- package/app/components/settings/CapabilityCredentialsPanel.vue +5 -5
- package/app/components/settings/CloudflareHandlerSection.vue +16 -16
- package/app/components/settings/ComposeEnvironmentSetupSection.vue +14 -12
- package/app/components/settings/ConnectionTestVerdict.vue +1 -1
- package/app/components/settings/ConsensusGroupsSection.vue +21 -20
- package/app/components/settings/CustomManifestTypeEditor.vue +8 -7
- package/app/components/settings/DefaultProvisionTypeSection.vue +5 -5
- package/app/components/settings/InfraHandlersConfigurator.vue +14 -15
- package/app/components/settings/InfrastructureBackendPicker.vue +2 -2
- package/app/components/settings/IssueTrackerPanel.vue +9 -15
- package/app/components/settings/KubernetesEngineForm.vue +9 -8
- package/app/components/settings/KubernetesEnvironmentForm.vue +4 -3
- package/app/components/settings/LocalContainerPoolSettings.vue +2 -2
- package/app/components/settings/LocalModelEndpointsPanel.vue +10 -9
- package/app/components/settings/MergeClassRulesEditor.vue +6 -5
- package/app/components/settings/MergeRolePolicyEditor.vue +13 -12
- package/app/components/settings/ModelConfigurationPanel.vue +8 -11
- package/app/components/settings/ModelPresetHealthModal.vue +3 -3
- package/app/components/settings/ObservabilityConnectionPanel.vue +1 -1
- package/app/components/settings/OpenRouterCatalogPanel.vue +6 -5
- package/app/components/settings/PackageRegistriesPanel.vue +4 -4
- package/app/components/settings/ProviderConnectionTab.vue +5 -4
- package/app/components/settings/ProviderManifestEditor.vue +9 -8
- package/app/components/settings/ProviderPreferenceEditor.vue +8 -7
- package/app/components/settings/RiskPolicyCreateForm.vue +40 -26
- package/app/components/settings/RiskPolicyEditorRow.vue +18 -17
- package/app/components/settings/RiskPolicyHealthModal.vue +3 -3
- package/app/components/settings/RiskPolicyPanel.vue +11 -13
- package/app/components/settings/ServiceFragmentDefaultsPanel.vue +5 -4
- package/app/components/settings/SharedStacksPanel.vue +5 -5
- package/app/components/settings/TaskSourceCard.vue +2 -2
- package/app/components/settings/TaskTypeSuppressionsPanel.vue +4 -4
- package/app/components/settings/ToolServerChecklist.vue +22 -22
- package/app/components/settings/UsageSettings.vue +13 -13
- package/app/components/settings/UserSecretsSection.vue +4 -3
- package/app/components/settings/WorkspaceMetadataSettings.vue +6 -5
- package/app/components/settings/WorkspaceSettingsPanel.vue +72 -58
- package/app/components/skills/ReviewSkillQueue.vue +8 -7
- package/app/components/skills/SkillLibraryManager.vue +2 -2
- package/app/components/slack/SlackPanel.vue +8 -7
- package/app/components/spec/ServiceSpecWindow.vue +15 -16
- package/app/components/tasks/BugHuntModal.vue +1 -1
- package/app/components/tasks/ContextIssuePicker.vue +4 -6
- package/app/components/tasks/TaskContextIssues.vue +1 -1
- package/app/components/tasks/TaskImportModal.vue +3 -2
- package/app/components/tasks/TaskSourceConnectModal.vue +5 -5
- package/app/components/testing/TestReportWindow.vue +54 -53
- package/app/components/tutorial/TutorialNudge.vue +3 -2
- package/app/components/tutorial/TutorialOverlay.vue +3 -2
- package/app/components/vcs/GitLabConnect.vue +1 -1
- package/app/components/visualConfirm/VisualConfirmationWindow.vue +23 -25
- package/app/utils/theme/builtins.ts +7 -1
- package/package.json +1 -1
|
@@ -30,6 +30,7 @@ import ResultWindowShell from '~/components/panels/ResultWindowShell.vue'
|
|
|
30
30
|
import StepRunMeta from '~/components/panels/StepRunMeta.vue'
|
|
31
31
|
import StepFragmentAdherence from '~/components/panels/StepFragmentAdherence.vue'
|
|
32
32
|
import MarkdownProse from '~/components/common/MarkdownProse.vue'
|
|
33
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
33
34
|
|
|
34
35
|
const execution = useExecutionStore()
|
|
35
36
|
const board = useBoardStore()
|
|
@@ -295,7 +296,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
295
296
|
:href="state.prUrl"
|
|
296
297
|
target="_blank"
|
|
297
298
|
rel="noopener"
|
|
298
|
-
class="rounded-md px-2 py-1 text-
|
|
299
|
+
class="rounded-md px-2 py-1 text-2xs text-primary hover:bg-elevated"
|
|
299
300
|
>
|
|
300
301
|
{{ t('prReview.openPr') }}
|
|
301
302
|
</a>
|
|
@@ -320,7 +321,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
320
321
|
>
|
|
321
322
|
<UIcon name="i-lucide-loader-circle" class="h-8 w-8 animate-spin opacity-60" />
|
|
322
323
|
<p class="text-sm text-default">{{ t('prReview.reviewing.planning.title') }}</p>
|
|
323
|
-
<p class="max-w-sm text-
|
|
324
|
+
<p class="max-w-sm text-2xs text-dimmed">
|
|
324
325
|
{{ t('prReview.reviewing.planning.hint') }}
|
|
325
326
|
</p>
|
|
326
327
|
</div>
|
|
@@ -334,11 +335,11 @@ const { requestClose } = useUnsavedGuard({
|
|
|
334
335
|
/>
|
|
335
336
|
<span>{{ t('prReview.reviewing.reviewingChunks.title') }}</span>
|
|
336
337
|
</div>
|
|
337
|
-
<p class="mb-3 text-
|
|
338
|
+
<p class="mb-3 text-2xs text-dimmed">
|
|
338
339
|
{{ t('prReview.reviewing.reviewingChunks.hint') }}
|
|
339
340
|
</p>
|
|
340
341
|
|
|
341
|
-
<div class="flex items-center justify-between text-
|
|
342
|
+
<div class="flex items-center justify-between text-2xs text-muted">
|
|
342
343
|
<span data-testid="pr-review-chunk-count">
|
|
343
344
|
{{
|
|
344
345
|
t('prReview.reviewing.chunks', {
|
|
@@ -372,7 +373,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
372
373
|
"
|
|
373
374
|
>
|
|
374
375
|
<p
|
|
375
|
-
class="mb-1 text-
|
|
376
|
+
class="mb-1 text-3xs font-semibold uppercase tracking-wide"
|
|
376
377
|
:class="activeChunks.length ? 'text-primary' : 'text-dimmed'"
|
|
377
378
|
>
|
|
378
379
|
{{ t('prReview.reviewing.activeHeading') }}
|
|
@@ -381,7 +382,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
381
382
|
<li
|
|
382
383
|
v-for="(label, i) in activeChunks"
|
|
383
384
|
:key="i"
|
|
384
|
-
class="flex items-start gap-1.5 text-
|
|
385
|
+
class="flex items-start gap-1.5 text-xs text-app-100"
|
|
385
386
|
>
|
|
386
387
|
<UIcon
|
|
387
388
|
name="i-lucide-loader-circle"
|
|
@@ -390,22 +391,22 @@ const { requestClose } = useUnsavedGuard({
|
|
|
390
391
|
<span class="min-w-0">{{ label }}</span>
|
|
391
392
|
</li>
|
|
392
393
|
</ul>
|
|
393
|
-
<p v-else data-testid="pr-review-active-idle" class="text-
|
|
394
|
+
<p v-else data-testid="pr-review-active-idle" class="text-xs text-muted">
|
|
394
395
|
{{ t('prReview.reviewing.activeIdle') }}
|
|
395
396
|
</p>
|
|
396
397
|
</div>
|
|
397
398
|
|
|
398
399
|
<!-- Every chunk with its explicit status (Reviewed / Reviewing… / Queued). -->
|
|
399
400
|
<template v-if="subtasks!.items?.length">
|
|
400
|
-
<p class="mb-1.5 mt-3
|
|
401
|
+
<SectionLabel as="p" class="mb-1.5 mt-3">
|
|
401
402
|
{{ t('prReview.reviewing.chunksHeading') }}
|
|
402
|
-
</
|
|
403
|
+
</SectionLabel>
|
|
403
404
|
<ul class="space-y-1.5" data-testid="pr-review-chunks">
|
|
404
405
|
<li
|
|
405
406
|
v-for="(item, i) in subtasks!.items"
|
|
406
407
|
:key="i"
|
|
407
408
|
data-testid="pr-review-chunk"
|
|
408
|
-
class="flex items-center gap-1.5 text-
|
|
409
|
+
class="flex items-center gap-1.5 text-xs"
|
|
409
410
|
:class="
|
|
410
411
|
item.status === 'completed'
|
|
411
412
|
? 'text-dimmed'
|
|
@@ -427,7 +428,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
427
428
|
</span>
|
|
428
429
|
<span
|
|
429
430
|
data-testid="pr-review-chunk-status"
|
|
430
|
-
class="shrink-0 rounded px-1.5 py-0.5 text-
|
|
431
|
+
class="shrink-0 rounded-sm px-1.5 py-0.5 text-3xs font-medium uppercase"
|
|
431
432
|
:class="CHUNK_STATUS_CLASS[item.status]"
|
|
432
433
|
>
|
|
433
434
|
{{ chunkStatusLabel(item.status) }}
|
|
@@ -446,12 +447,12 @@ const { requestClose } = useUnsavedGuard({
|
|
|
446
447
|
<p
|
|
447
448
|
v-if="prReview.error"
|
|
448
449
|
data-testid="pr-review-resume-error"
|
|
449
|
-
class="mb-2 rounded-md bg-app-error-500/10 px-3 py-2 text-
|
|
450
|
+
class="mb-2 rounded-md bg-app-error-500/10 px-3 py-2 text-xs text-app-error-300"
|
|
450
451
|
>
|
|
451
452
|
{{ prReview.error }}
|
|
452
453
|
</p>
|
|
453
454
|
<div class="flex items-start justify-between gap-3">
|
|
454
|
-
<p class="min-w-0 text-
|
|
455
|
+
<p class="min-w-0 text-2xs text-dimmed">{{ t('prReview.resume.hint') }}</p>
|
|
455
456
|
<UButton
|
|
456
457
|
data-testid="pr-review-resume"
|
|
457
458
|
size="xs"
|
|
@@ -479,7 +480,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
479
480
|
<p class="text-sm">
|
|
480
481
|
{{ status === 'fixing' ? t('prReview.fixing.title') : t('prReview.posting.title') }}
|
|
481
482
|
</p>
|
|
482
|
-
<p class="max-w-sm text-
|
|
483
|
+
<p class="max-w-sm text-2xs text-dimmed">
|
|
483
484
|
{{ status === 'fixing' ? t('prReview.fixing.hint') : t('prReview.posting.hint') }}
|
|
484
485
|
</p>
|
|
485
486
|
</div>
|
|
@@ -487,7 +488,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
487
488
|
<template v-else>
|
|
488
489
|
<p
|
|
489
490
|
v-if="prReview.error"
|
|
490
|
-
class="mb-3 rounded-md bg-app-error-500/10 px-3 py-2 text-
|
|
491
|
+
class="mb-3 rounded-md bg-app-error-500/10 px-3 py-2 text-xs text-app-error-300"
|
|
491
492
|
>
|
|
492
493
|
{{ prReview.error }}
|
|
493
494
|
</p>
|
|
@@ -498,7 +499,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
498
499
|
<div
|
|
499
500
|
v-if="postReport"
|
|
500
501
|
data-testid="pr-review-post-report"
|
|
501
|
-
class="mb-3 rounded-lg border px-3 py-2 text-
|
|
502
|
+
class="mb-3 rounded-lg border px-3 py-2 text-xs"
|
|
502
503
|
:class="
|
|
503
504
|
postReport.failures.length > 0 || postReport.bodyPosted === false
|
|
504
505
|
? 'border-app-warning-500/40 bg-app-warning-500/10 text-app-warning-200'
|
|
@@ -547,7 +548,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
547
548
|
shell's `width` prop) — this window is `full`-width. -->
|
|
548
549
|
<div
|
|
549
550
|
v-if="state?.summary"
|
|
550
|
-
class="mb-3 max-w-3xl rounded-md bg-elevated/50 px-3 py-2 text-
|
|
551
|
+
class="mb-3 max-w-3xl rounded-md bg-elevated/50 px-3 py-2 text-xs text-toned"
|
|
551
552
|
>
|
|
552
553
|
<span class="mb-1 block text-dimmed">{{ t('prReview.summaryLabel') }}</span>
|
|
553
554
|
<MarkdownProse :text="state.summary" />
|
|
@@ -564,7 +565,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
564
565
|
<!-- A clean PR / resolved review with no findings. -->
|
|
565
566
|
<div
|
|
566
567
|
v-if="findings.length === 0"
|
|
567
|
-
class="rounded-xl border border-default bg-default/60 px-4 py-6 text-center text-
|
|
568
|
+
class="rounded-xl border border-default bg-default/60 px-4 py-6 text-center text-sm text-toned"
|
|
568
569
|
>
|
|
569
570
|
{{ t('prReview.noFindings') }}
|
|
570
571
|
</div>
|
|
@@ -574,14 +575,14 @@ const { requestClose } = useUnsavedGuard({
|
|
|
574
575
|
<div
|
|
575
576
|
v-if="challenging"
|
|
576
577
|
data-testid="pr-review-challenging"
|
|
577
|
-
class="mb-3 flex items-center gap-2 rounded-md border border-primary/40 bg-primary/10 px-3 py-2 text-
|
|
578
|
+
class="mb-3 flex items-center gap-2 rounded-md border border-primary/40 bg-primary/10 px-3 py-2 text-xs text-primary"
|
|
578
579
|
>
|
|
579
580
|
<UIcon name="i-lucide-loader-circle" class="h-4 w-4 shrink-0 animate-spin" />
|
|
580
581
|
<span>{{ t('prReview.challenge.investigatingBanner') }}</span>
|
|
581
582
|
</div>
|
|
582
583
|
|
|
583
584
|
<!-- Selection toolbar -->
|
|
584
|
-
<div v-if="awaiting" class="mb-2 flex items-center gap-3 text-
|
|
585
|
+
<div v-if="awaiting" class="mb-2 flex items-center gap-3 text-2xs text-muted">
|
|
585
586
|
<span data-testid="pr-review-selected-count">
|
|
586
587
|
{{ t('prReview.selectedCount', { count: activeSelectedIds.length }) }}
|
|
587
588
|
</span>
|
|
@@ -595,10 +596,10 @@ const { requestClose } = useUnsavedGuard({
|
|
|
595
596
|
|
|
596
597
|
<!-- Findings grouped by slice -->
|
|
597
598
|
<section v-for="g in groups" :key="g.id" class="mb-4">
|
|
598
|
-
<h3 class="mb-1.5
|
|
599
|
+
<SectionLabel as="h3" class="mb-1.5">
|
|
599
600
|
{{ g.title }}
|
|
600
|
-
</
|
|
601
|
-
<p v-if="g.rationale" class="mb-1.5 max-w-3xl text-
|
|
601
|
+
</SectionLabel>
|
|
602
|
+
<p v-if="g.rationale" class="mb-1.5 max-w-3xl text-2xs text-dimmed">
|
|
602
603
|
{{ g.rationale }}
|
|
603
604
|
</p>
|
|
604
605
|
<article
|
|
@@ -626,18 +627,18 @@ const { requestClose } = useUnsavedGuard({
|
|
|
626
627
|
<div class="min-w-0 flex-1">
|
|
627
628
|
<div class="flex flex-wrap items-center gap-1.5">
|
|
628
629
|
<span
|
|
629
|
-
class="rounded px-1.5 py-0.5 text-
|
|
630
|
+
class="rounded-sm px-1.5 py-0.5 text-3xs font-semibold uppercase ring-1"
|
|
630
631
|
:class="SEVERITY_CLASS[f.severity]"
|
|
631
632
|
>
|
|
632
633
|
{{ t(`prReview.severity.${f.severity}`) }}
|
|
633
634
|
</span>
|
|
634
|
-
<span class="rounded bg-elevated px-1.5 py-0.5 text-
|
|
635
|
+
<span class="rounded-sm bg-elevated px-1.5 py-0.5 text-3xs text-toned">
|
|
635
636
|
{{ t(`prReview.category.${f.category}`) }}
|
|
636
637
|
</span>
|
|
637
638
|
<span
|
|
638
639
|
v-if="postedIds.has(f.id)"
|
|
639
640
|
data-testid="pr-review-finding-posted"
|
|
640
|
-
class="rounded bg-app-success-500/15 px-1.5 py-0.5 text-
|
|
641
|
+
class="rounded-sm bg-app-success-500/15 px-1.5 py-0.5 text-3xs font-semibold uppercase text-app-success-300 ring-1 ring-app-success-500/30"
|
|
641
642
|
>
|
|
642
643
|
{{ t('prReview.postReport.postedBadge') }}
|
|
643
644
|
</span>
|
|
@@ -645,47 +646,47 @@ const { requestClose } = useUnsavedGuard({
|
|
|
645
646
|
<span
|
|
646
647
|
v-if="isRetracted(f)"
|
|
647
648
|
data-testid="pr-review-finding-retracted"
|
|
648
|
-
class="rounded bg-app-error-500/15 px-1.5 py-0.5 text-
|
|
649
|
+
class="rounded-sm bg-app-error-500/15 px-1.5 py-0.5 text-3xs font-semibold uppercase text-app-error-300 ring-1 ring-app-error-500/30"
|
|
649
650
|
>
|
|
650
651
|
{{ t('prReview.challenge.retractedBadge') }}
|
|
651
652
|
</span>
|
|
652
653
|
<span
|
|
653
654
|
v-else-if="isAmended(f)"
|
|
654
655
|
data-testid="pr-review-finding-amended"
|
|
655
|
-
class="rounded bg-app-info-500/15 px-1.5 py-0.5 text-
|
|
656
|
+
class="rounded-sm bg-app-info-500/15 px-1.5 py-0.5 text-3xs font-semibold uppercase text-app-info-300 ring-1 ring-app-info-500/30"
|
|
656
657
|
>
|
|
657
658
|
{{ t('prReview.challenge.strengthenedBadge') }}
|
|
658
659
|
</span>
|
|
659
660
|
<span
|
|
660
661
|
v-else-if="isUpheld(f)"
|
|
661
662
|
data-testid="pr-review-finding-upheld"
|
|
662
|
-
class="rounded bg-app-success-500/15 px-1.5 py-0.5 text-
|
|
663
|
+
class="rounded-sm bg-app-success-500/15 px-1.5 py-0.5 text-3xs font-semibold uppercase text-app-success-300 ring-1 ring-app-success-500/30"
|
|
663
664
|
>
|
|
664
665
|
{{ t('prReview.challenge.upheldBadge') }}
|
|
665
666
|
</span>
|
|
666
667
|
<span
|
|
667
668
|
v-else-if="isChallengeFailed(f)"
|
|
668
669
|
data-testid="pr-review-finding-challenge-failed"
|
|
669
|
-
class="rounded bg-app-warning-500/15 px-1.5 py-0.5 text-
|
|
670
|
+
class="rounded-sm bg-app-warning-500/15 px-1.5 py-0.5 text-3xs font-semibold uppercase text-app-warning-300 ring-1 ring-app-warning-500/30"
|
|
670
671
|
>
|
|
671
672
|
{{ t('prReview.challenge.failedBadge') }}
|
|
672
673
|
</span>
|
|
673
674
|
<span
|
|
674
675
|
v-else-if="isInvestigating(f)"
|
|
675
676
|
data-testid="pr-review-finding-investigating"
|
|
676
|
-
class="flex items-center gap-1 rounded bg-primary/15 px-1.5 py-0.5 text-
|
|
677
|
+
class="flex items-center gap-1 rounded-sm bg-primary/15 px-1.5 py-0.5 text-3xs font-semibold uppercase text-primary ring-1 ring-primary/30"
|
|
677
678
|
>
|
|
678
679
|
<UIcon name="i-lucide-loader-circle" class="h-3 w-3 animate-spin" />
|
|
679
680
|
{{ t('prReview.challenge.investigatingBadge') }}
|
|
680
681
|
</span>
|
|
681
682
|
<h4
|
|
682
|
-
class="min-w-0 flex-1 text-
|
|
683
|
+
class="min-w-0 flex-1 text-sm font-medium text-app-100"
|
|
683
684
|
:class="isRetracted(f) ? 'line-through' : ''"
|
|
684
685
|
>
|
|
685
686
|
{{ f.title }}
|
|
686
687
|
</h4>
|
|
687
688
|
</div>
|
|
688
|
-
<p class="mt-0.5 text-
|
|
689
|
+
<p class="mt-0.5 text-2xs text-dimmed">
|
|
689
690
|
{{ f.path
|
|
690
691
|
}}<template v-if="f.line != null">
|
|
691
692
|
· {{ t('prReview.line', { line: f.line }) }}</template
|
|
@@ -701,7 +702,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
701
702
|
<MarkdownProse
|
|
702
703
|
v-if="f.detail"
|
|
703
704
|
:text="f.detail"
|
|
704
|
-
class="mt-1 max-w-3xl text-
|
|
705
|
+
class="mt-1 max-w-3xl text-xs text-toned"
|
|
705
706
|
:class="isRetracted(f) ? 'line-through' : ''"
|
|
706
707
|
/>
|
|
707
708
|
<!-- The suggested fix is a VALUE a human copies (a patch line, a command, a
|
|
@@ -711,7 +712,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
711
712
|
failure summary is left alone. -->
|
|
712
713
|
<p
|
|
713
714
|
v-if="f.suggestedFix"
|
|
714
|
-
class="mt-1 max-w-3xl whitespace-pre-wrap rounded-md bg-elevated/50 px-2 py-1 text-
|
|
715
|
+
class="mt-1 max-w-3xl whitespace-pre-wrap rounded-md bg-elevated/50 px-2 py-1 text-2xs text-toned"
|
|
715
716
|
>
|
|
716
717
|
<span class="text-dimmed">{{ t('prReview.suggestedFix') }}</span>
|
|
717
718
|
{{ f.suggestedFix }}
|
|
@@ -722,7 +723,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
722
723
|
<div
|
|
723
724
|
v-if="f.challenge?.justification"
|
|
724
725
|
data-testid="pr-review-finding-justification"
|
|
725
|
-
class="mt-1.5 max-w-3xl rounded-md px-2 py-1 text-
|
|
726
|
+
class="mt-1.5 max-w-3xl rounded-md px-2 py-1 text-2xs"
|
|
726
727
|
:class="
|
|
727
728
|
isRetracted(f)
|
|
728
729
|
? 'bg-app-error-500/10 text-app-error-200'
|
|
@@ -745,7 +746,7 @@ const { requestClose } = useUnsavedGuard({
|
|
|
745
746
|
<!-- Per-finding actions: Challenge + Dismiss (only while awaiting a selection). -->
|
|
746
747
|
<div
|
|
747
748
|
v-if="awaiting && !isInvestigating(f)"
|
|
748
|
-
class="mt-1.5 flex items-center gap-3 text-
|
|
749
|
+
class="mt-1.5 flex items-center gap-3 text-2xs"
|
|
749
750
|
>
|
|
750
751
|
<button
|
|
751
752
|
v-if="!isRetracted(f)"
|
|
@@ -783,21 +784,21 @@ const { requestClose } = useUnsavedGuard({
|
|
|
783
784
|
data-testid="pr-review-challenge-input"
|
|
784
785
|
rows="2"
|
|
785
786
|
:placeholder="t('prReview.challenge.placeholder')"
|
|
786
|
-
class="w-full resize-y rounded border border-muted bg-app-950/60 px-2 py-1 text-
|
|
787
|
+
class="w-full resize-y rounded-sm border border-muted bg-app-950/60 px-2 py-1 text-xs text-default outline-none focus:border-primary"
|
|
787
788
|
/>
|
|
788
|
-
<p class="mt-1 text-
|
|
789
|
+
<p class="mt-1 text-3xs text-dimmed">
|
|
789
790
|
{{ t('prReview.challenge.hint') }}
|
|
790
791
|
</p>
|
|
791
792
|
<div class="mt-1.5 flex justify-end gap-2">
|
|
792
793
|
<button
|
|
793
|
-
class="rounded px-2 py-1 text-
|
|
794
|
+
class="rounded-sm px-2 py-1 text-2xs text-muted hover:text-default"
|
|
794
795
|
@click="cancelChallenge"
|
|
795
796
|
>
|
|
796
797
|
{{ t('common.cancel') }}
|
|
797
798
|
</button>
|
|
798
799
|
<button
|
|
799
800
|
data-testid="pr-review-challenge-submit"
|
|
800
|
-
class="rounded bg-primary/80 px-2 py-1 text-
|
|
801
|
+
class="rounded-sm bg-primary/80 px-2 py-1 text-2xs font-medium text-inverted hover:bg-primary/90 disabled:opacity-50"
|
|
801
802
|
:disabled="!canResolve"
|
|
802
803
|
@click="submitChallenge(f.id)"
|
|
803
804
|
>
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
// auto-opens once per session (driven from pages/index.vue) and clears once the preset is
|
|
8
8
|
// fixed (or all its models become available).
|
|
9
9
|
import { computed } from 'vue'
|
|
10
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
10
11
|
|
|
11
12
|
const { t } = useI18n()
|
|
12
13
|
const ui = useUiStore()
|
|
@@ -54,9 +55,9 @@ function go(action: () => void) {
|
|
|
54
55
|
</i18n-t>
|
|
55
56
|
|
|
56
57
|
<div class="rounded-lg border border-muted bg-default/50 p-3">
|
|
57
|
-
<p class="mb-1.5
|
|
58
|
+
<SectionLabel as="p" class="mb-1.5">
|
|
58
59
|
{{ t('providers.presetMismatch.unavailable') }}
|
|
59
|
-
</
|
|
60
|
+
</SectionLabel>
|
|
60
61
|
<div class="flex flex-wrap gap-1.5">
|
|
61
62
|
<UBadge
|
|
62
63
|
v-for="label in unavailableLabels"
|
|
@@ -70,7 +71,7 @@ function go(action: () => void) {
|
|
|
70
71
|
</div>
|
|
71
72
|
</div>
|
|
72
73
|
|
|
73
|
-
<p class="text-
|
|
74
|
+
<p class="text-sm text-muted">
|
|
74
75
|
{{ t('providers.presetMismatch.advice') }}
|
|
75
76
|
</p>
|
|
76
77
|
|
|
@@ -104,7 +104,7 @@ const routes = computed<Route[]>(() => [
|
|
|
104
104
|
{{ r.badge }}
|
|
105
105
|
</UBadge>
|
|
106
106
|
</div>
|
|
107
|
-
<p class="mt-0.5 text-
|
|
107
|
+
<p class="mt-0.5 text-sm leading-relaxed text-muted">{{ r.body }}</p>
|
|
108
108
|
</div>
|
|
109
109
|
<UButton
|
|
110
110
|
size="sm"
|
|
@@ -118,7 +118,7 @@ const routes = computed<Route[]>(() => [
|
|
|
118
118
|
</div>
|
|
119
119
|
</div>
|
|
120
120
|
|
|
121
|
-
<p class="text-
|
|
121
|
+
<p class="text-2xs leading-relaxed text-dimmed">
|
|
122
122
|
{{ t('providers.onboarding.operatorNote') }}
|
|
123
123
|
</p>
|
|
124
124
|
</div>
|
|
@@ -19,6 +19,7 @@ import { computed, ref, watch } from 'vue'
|
|
|
19
19
|
import { providerCachesPrompts } from '@cat-factory/contracts'
|
|
20
20
|
import type { ApiKey, ApiKeyProvider } from '~/types/domain'
|
|
21
21
|
import SecretInput from '~/components/common/SecretInput.vue'
|
|
22
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
22
23
|
|
|
23
24
|
const props = withDefaults(defineProps<{ accountId?: string; category?: 'direct' | 'proxy' }>(), {
|
|
24
25
|
category: 'direct',
|
|
@@ -264,13 +265,13 @@ async function remove(k: ApiKey) {
|
|
|
264
265
|
<template>
|
|
265
266
|
<div class="space-y-4">
|
|
266
267
|
<div>
|
|
267
|
-
<
|
|
268
|
+
<SectionLabel as="h4">
|
|
268
269
|
{{
|
|
269
270
|
category === 'proxy'
|
|
270
271
|
? t('providers.apiKeys.proxyHeading')
|
|
271
272
|
: t('providers.apiKeys.directHeading')
|
|
272
273
|
}}
|
|
273
|
-
</
|
|
274
|
+
</SectionLabel>
|
|
274
275
|
<template v-if="category === 'proxy'">
|
|
275
276
|
<p v-if="isAccount" class="mt-1 text-sm text-muted">
|
|
276
277
|
{{ t('providers.apiKeys.proxyAccountIntro') }}
|
|
@@ -343,7 +344,7 @@ async function remove(k: ApiKey) {
|
|
|
343
344
|
the caching flavour, so long agentic runs stop re-billing the whole prompt. -->
|
|
344
345
|
<p
|
|
345
346
|
v-if="cachesPrompts(selected.value)"
|
|
346
|
-
class="flex items-center gap-1.5 text-
|
|
347
|
+
class="flex items-center gap-1.5 text-xs text-app-success-400/90"
|
|
347
348
|
>
|
|
348
349
|
<UIcon name="i-lucide-zap" class="h-3.5 w-3.5 shrink-0" />
|
|
349
350
|
{{ t('providers.apiKeys.cachingNote', { provider: selected.label }) }}
|
|
@@ -380,9 +381,9 @@ async function remove(k: ApiKey) {
|
|
|
380
381
|
|
|
381
382
|
<!-- connected keys for the selected scope -->
|
|
382
383
|
<div v-if="connected.length" class="space-y-2">
|
|
383
|
-
<
|
|
384
|
+
<SectionLabel as="h5">
|
|
384
385
|
{{ t('providers.apiKeys.connected', { count: connected.length }) }}
|
|
385
|
-
</
|
|
386
|
+
</SectionLabel>
|
|
386
387
|
<div
|
|
387
388
|
v-for="k in connected"
|
|
388
389
|
:key="k.id"
|
|
@@ -395,7 +396,7 @@ async function remove(k: ApiKey) {
|
|
|
395
396
|
<UBadge v-if="!k.enabled" color="neutral" variant="subtle" size="sm" class="ms-2">
|
|
396
397
|
{{ t('providers.apiKeys.disabledBadge') }}
|
|
397
398
|
</UBadge>
|
|
398
|
-
<div class="text-
|
|
399
|
+
<div class="text-2xs tabular-nums text-dimmed">
|
|
399
400
|
{{
|
|
400
401
|
t(
|
|
401
402
|
'providers.apiKeys.usage',
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'
|
|
8
8
|
import type { SubscriptionVendor } from '~/types/domain'
|
|
9
9
|
import SecretInput from '~/components/common/SecretInput.vue'
|
|
10
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
10
11
|
|
|
11
12
|
const personal = usePersonalSubscriptionsStore()
|
|
12
13
|
const auth = useAuthStore()
|
|
@@ -208,9 +209,9 @@ async function disconnect(v: SubscriptionVendor) {
|
|
|
208
209
|
<template>
|
|
209
210
|
<div class="space-y-3">
|
|
210
211
|
<div>
|
|
211
|
-
<
|
|
212
|
+
<SectionLabel as="h4">
|
|
212
213
|
{{ t('personalSubscriptions.heading') }}
|
|
213
|
-
</
|
|
214
|
+
</SectionLabel>
|
|
214
215
|
<p class="mt-1 text-sm text-muted">{{ t('personalSubscriptions.intro') }}</p>
|
|
215
216
|
</div>
|
|
216
217
|
|
|
@@ -228,7 +229,7 @@ async function disconnect(v: SubscriptionVendor) {
|
|
|
228
229
|
<div>
|
|
229
230
|
<span class="font-medium text-default">{{ sub.label }}</span>
|
|
230
231
|
<span class="ms-2 text-xs text-dimmed">{{ vendorLabel(sub.vendor) }}</span>
|
|
231
|
-
<div class="text-
|
|
232
|
+
<div class="text-2xs text-dimmed">
|
|
232
233
|
<template v-if="sub.expiresAt">
|
|
233
234
|
{{ t('personalSubscriptions.expires', { date: d(new Date(sub.expiresAt), 'short') }) }}
|
|
234
235
|
</template>
|
|
@@ -9,6 +9,7 @@ import { computed, ref, watch } from 'vue'
|
|
|
9
9
|
import type { SubscriptionVendor } from '~/types/domain'
|
|
10
10
|
import IntegrationBackTitle from '~/components/layout/IntegrationBackTitle.vue'
|
|
11
11
|
import SecretInput from '~/components/common/SecretInput.vue'
|
|
12
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
12
13
|
|
|
13
14
|
const { t, n } = useI18n()
|
|
14
15
|
const ui = useUiStore()
|
|
@@ -202,7 +203,7 @@ function vendorLabel(v: SubscriptionVendor): string {
|
|
|
202
203
|
class="flex items-center gap-3 rounded-lg border border-primary/30 bg-primary/10 px-3 py-2.5"
|
|
203
204
|
>
|
|
204
205
|
<UIcon name="i-lucide-user" class="h-5 w-5 shrink-0 text-primary" />
|
|
205
|
-
<p class="min-w-0 flex-1 text-
|
|
206
|
+
<p class="min-w-0 flex-1 text-sm text-toned">
|
|
206
207
|
{{ t('providers.vendorCredentials.personalCallout.text') }}
|
|
207
208
|
</p>
|
|
208
209
|
<UButton
|
|
@@ -267,11 +268,11 @@ function vendorLabel(v: SubscriptionVendor): string {
|
|
|
267
268
|
|
|
268
269
|
<!-- connected pool -->
|
|
269
270
|
<div v-if="creds.credentials.length" class="space-y-2">
|
|
270
|
-
<
|
|
271
|
+
<SectionLabel as="h4">
|
|
271
272
|
{{
|
|
272
273
|
t('providers.vendorCredentials.connected', { count: creds.credentials.length })
|
|
273
274
|
}}
|
|
274
|
-
</
|
|
275
|
+
</SectionLabel>
|
|
275
276
|
<div
|
|
276
277
|
v-for="c in creds.credentials"
|
|
277
278
|
:key="c.id"
|
|
@@ -284,7 +285,7 @@ function vendorLabel(v: SubscriptionVendor): string {
|
|
|
284
285
|
<UBadge v-if="!c.enabled" color="neutral" variant="subtle" size="sm" class="ms-2">
|
|
285
286
|
{{ t('providers.vendorCredentials.disabledBadge') }}
|
|
286
287
|
</UBadge>
|
|
287
|
-
<div class="text-
|
|
288
|
+
<div class="text-2xs tabular-nums text-dimmed">
|
|
288
289
|
{{
|
|
289
290
|
t(
|
|
290
291
|
'providers.vendorCredentials.usage',
|
|
@@ -22,6 +22,7 @@ import type {
|
|
|
22
22
|
ProvisioningOutcome,
|
|
23
23
|
ProvisioningSubsystem,
|
|
24
24
|
} from '~/types/provisioningLogs'
|
|
25
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
25
26
|
|
|
26
27
|
const props = defineProps<{
|
|
27
28
|
subsystem?: ProvisioningSubsystem
|
|
@@ -115,9 +116,9 @@ function when(epochMs: number): string {
|
|
|
115
116
|
<template>
|
|
116
117
|
<div class="rounded-lg border border-muted bg-default/50">
|
|
117
118
|
<div class="flex items-center justify-between border-b border-default px-3 py-2">
|
|
118
|
-
<
|
|
119
|
+
<SectionLabel as="p">
|
|
119
120
|
{{ t('provisioning.title') }}
|
|
120
|
-
</
|
|
121
|
+
</SectionLabel>
|
|
121
122
|
<UButton
|
|
122
123
|
icon="i-lucide-rotate-ccw"
|
|
123
124
|
variant="ghost"
|
|
@@ -129,17 +130,17 @@ function when(epochMs: number): string {
|
|
|
129
130
|
</UButton>
|
|
130
131
|
</div>
|
|
131
132
|
|
|
132
|
-
<p v-if="state.error" class="px-3 py-2 text-
|
|
133
|
+
<p v-if="state.error" class="px-3 py-2 text-xs text-app-error-300">{{ state.error }}</p>
|
|
133
134
|
<p
|
|
134
135
|
v-else-if="!state.loading && state.entries.length === 0"
|
|
135
|
-
class="px-3 py-3 text-
|
|
136
|
+
class="px-3 py-3 text-xs text-dimmed"
|
|
136
137
|
>
|
|
137
138
|
{{ t('provisioning.empty') }}
|
|
138
139
|
</p>
|
|
139
140
|
|
|
140
141
|
<ul v-else class="max-h-80 divide-y divide-default overflow-auto">
|
|
141
142
|
<li v-for="entry in state.entries" :key="entry.id" class="px-3 py-2">
|
|
142
|
-
<div class="flex items-center gap-2 text-
|
|
143
|
+
<div class="flex items-center gap-2 text-xs">
|
|
143
144
|
<UIcon
|
|
144
145
|
:name="entry.outcome === 'success' ? 'i-lucide-check-circle' : 'i-lucide-x-circle'"
|
|
145
146
|
class="h-3.5 w-3.5 shrink-0"
|
|
@@ -147,7 +148,7 @@ function when(epochMs: number): string {
|
|
|
147
148
|
/>
|
|
148
149
|
<span class="font-medium text-default">{{ OPERATION_LABEL[entry.operation] }}</span>
|
|
149
150
|
<span
|
|
150
|
-
class="rounded px-1.5 py-0.5 text-
|
|
151
|
+
class="rounded-sm px-1.5 py-0.5 text-3xs uppercase tracking-wide"
|
|
151
152
|
:class="
|
|
152
153
|
entry.outcome === 'success'
|
|
153
154
|
? 'bg-app-success-950/60 text-app-success-300'
|
|
@@ -155,15 +156,15 @@ function when(epochMs: number): string {
|
|
|
155
156
|
"
|
|
156
157
|
>{{ OUTCOME_LABEL[entry.outcome] }}</span
|
|
157
158
|
>
|
|
158
|
-
<span class="ms-auto text-
|
|
159
|
+
<span class="ms-auto text-2xs text-dimmed">{{ when(entry.createdAt) }}</span>
|
|
159
160
|
</div>
|
|
160
|
-
<div v-if="entry.targetId" class="mt-0.5 text-
|
|
161
|
+
<div v-if="entry.targetId" class="mt-0.5 text-2xs text-dimmed">
|
|
161
162
|
{{ entry.providerId ? `${entry.providerId} · ` : '' }}{{ entry.targetId }}
|
|
162
163
|
</div>
|
|
163
164
|
<!-- The verbatim provider/runtime error on a failed attempt. -->
|
|
164
165
|
<pre
|
|
165
166
|
v-if="entry.error"
|
|
166
|
-
class="mt-1 max-h-28 overflow-auto whitespace-pre-wrap rounded border border-app-error-900/50 bg-app-error-950/30 p-1.5 text-
|
|
167
|
+
class="mt-1 max-h-28 overflow-auto whitespace-pre-wrap rounded-sm border border-app-error-900/50 bg-app-error-950/30 p-1.5 text-2xs text-app-error-200/90"
|
|
167
168
|
>{{ entry.error }}</pre>
|
|
168
169
|
</li>
|
|
169
170
|
</ul>
|