@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
|
@@ -264,7 +264,7 @@ async function remove(k: ApiKey) {
|
|
|
264
264
|
<template>
|
|
265
265
|
<div class="space-y-4">
|
|
266
266
|
<div>
|
|
267
|
-
<h4 class="text-xs font-semibold uppercase tracking-wide text-
|
|
267
|
+
<h4 class="text-xs font-semibold uppercase tracking-wide text-dimmed">
|
|
268
268
|
{{
|
|
269
269
|
category === 'proxy'
|
|
270
270
|
? t('providers.apiKeys.proxyHeading')
|
|
@@ -272,18 +272,18 @@ async function remove(k: ApiKey) {
|
|
|
272
272
|
}}
|
|
273
273
|
</h4>
|
|
274
274
|
<template v-if="category === 'proxy'">
|
|
275
|
-
<p v-if="isAccount" class="mt-1 text-sm text-
|
|
275
|
+
<p v-if="isAccount" class="mt-1 text-sm text-muted">
|
|
276
276
|
{{ t('providers.apiKeys.proxyAccountIntro') }}
|
|
277
277
|
</p>
|
|
278
|
-
<p v-else class="mt-1 text-sm text-
|
|
278
|
+
<p v-else class="mt-1 text-sm text-muted">
|
|
279
279
|
{{ t('providers.apiKeys.proxyIntro') }}
|
|
280
280
|
</p>
|
|
281
281
|
</template>
|
|
282
282
|
<template v-else>
|
|
283
|
-
<p v-if="isAccount" class="mt-1 text-sm text-
|
|
283
|
+
<p v-if="isAccount" class="mt-1 text-sm text-muted">
|
|
284
284
|
{{ t('providers.apiKeys.directAccountIntro') }}
|
|
285
285
|
</p>
|
|
286
|
-
<p v-else class="mt-1 text-sm text-
|
|
286
|
+
<p v-else class="mt-1 text-sm text-muted">
|
|
287
287
|
{{ t('providers.apiKeys.directIntro') }}
|
|
288
288
|
</p>
|
|
289
289
|
</template>
|
|
@@ -324,7 +324,7 @@ async function remove(k: ApiKey) {
|
|
|
324
324
|
|
|
325
325
|
<!-- where to get the key -->
|
|
326
326
|
<ol
|
|
327
|
-
class="list-decimal space-y-1.5 rounded-lg border border-
|
|
327
|
+
class="list-decimal space-y-1.5 rounded-lg border border-muted bg-default/60 p-4 ps-8 text-sm text-toned"
|
|
328
328
|
>
|
|
329
329
|
<li v-for="(step, i) in selected.steps" :key="i">{{ step }}</li>
|
|
330
330
|
<li>
|
|
@@ -332,7 +332,7 @@ async function remove(k: ApiKey) {
|
|
|
332
332
|
:href="selected.url"
|
|
333
333
|
target="_blank"
|
|
334
334
|
rel="noopener noreferrer"
|
|
335
|
-
class="text-primary
|
|
335
|
+
class="text-primary underline"
|
|
336
336
|
>
|
|
337
337
|
{{ t('providers.apiKeys.openKeys', { provider: selected.label }) }}
|
|
338
338
|
</a>
|
|
@@ -343,7 +343,7 @@ async function remove(k: ApiKey) {
|
|
|
343
343
|
the caching flavour, so long agentic runs stop re-billing the whole prompt. -->
|
|
344
344
|
<p
|
|
345
345
|
v-if="cachesPrompts(selected.value)"
|
|
346
|
-
class="flex items-center gap-1.5 text-[12px] text-
|
|
346
|
+
class="flex items-center gap-1.5 text-[12px] text-app-success-400/90"
|
|
347
347
|
>
|
|
348
348
|
<UIcon name="i-lucide-zap" class="h-3.5 w-3.5 shrink-0" />
|
|
349
349
|
{{ t('providers.apiKeys.cachingNote', { provider: selected.label }) }}
|
|
@@ -380,22 +380,22 @@ async function remove(k: ApiKey) {
|
|
|
380
380
|
|
|
381
381
|
<!-- connected keys for the selected scope -->
|
|
382
382
|
<div v-if="connected.length" class="space-y-2">
|
|
383
|
-
<h5 class="text-xs font-semibold uppercase tracking-wide text-
|
|
383
|
+
<h5 class="text-xs font-semibold uppercase tracking-wide text-dimmed">
|
|
384
384
|
{{ t('providers.apiKeys.connected', { count: connected.length }) }}
|
|
385
385
|
</h5>
|
|
386
386
|
<div
|
|
387
387
|
v-for="k in connected"
|
|
388
388
|
:key="k.id"
|
|
389
|
-
class="flex items-center justify-between rounded-md border border-
|
|
389
|
+
class="flex items-center justify-between rounded-md border border-muted bg-default/50 px-3 py-2 text-sm"
|
|
390
390
|
:class="{ 'opacity-55': !k.enabled }"
|
|
391
391
|
>
|
|
392
392
|
<div>
|
|
393
|
-
<span class="font-medium text-
|
|
394
|
-
<span class="ms-2 text-xs text-
|
|
393
|
+
<span class="font-medium text-default">{{ k.label }}</span>
|
|
394
|
+
<span class="ms-2 text-xs text-dimmed">{{ providerLabel(k.provider) }}</span>
|
|
395
395
|
<UBadge v-if="!k.enabled" color="neutral" variant="subtle" size="sm" class="ms-2">
|
|
396
396
|
{{ t('providers.apiKeys.disabledBadge') }}
|
|
397
397
|
</UBadge>
|
|
398
|
-
<div class="text-[11px] tabular-nums text-
|
|
398
|
+
<div class="text-[11px] tabular-nums text-dimmed">
|
|
399
399
|
{{
|
|
400
400
|
t(
|
|
401
401
|
'providers.apiKeys.usage',
|
|
@@ -93,7 +93,7 @@ function goConnect() {
|
|
|
93
93
|
<template #body>
|
|
94
94
|
<div class="space-y-4">
|
|
95
95
|
<template v-if="needsConnect">
|
|
96
|
-
<p class="text-sm text-
|
|
96
|
+
<p class="text-sm text-muted">
|
|
97
97
|
{{ t('providers.personalCredential.connectBody', { vendor: vendorLabel }) }}
|
|
98
98
|
</p>
|
|
99
99
|
<div class="flex justify-end gap-2">
|
|
@@ -115,7 +115,7 @@ function goConnect() {
|
|
|
115
115
|
</template>
|
|
116
116
|
|
|
117
117
|
<template v-else>
|
|
118
|
-
<p class="text-sm text-
|
|
118
|
+
<p class="text-sm text-muted">
|
|
119
119
|
{{ t('providers.personalCredential.passwordBody', { vendor: vendorLabel }) }}
|
|
120
120
|
</p>
|
|
121
121
|
<UFormField :label="t('providers.personalCredential.passwordField')">
|
|
@@ -208,10 +208,10 @@ async function disconnect(v: SubscriptionVendor) {
|
|
|
208
208
|
<template>
|
|
209
209
|
<div class="space-y-3">
|
|
210
210
|
<div>
|
|
211
|
-
<h4 class="text-xs font-semibold uppercase tracking-wide text-
|
|
211
|
+
<h4 class="text-xs font-semibold uppercase tracking-wide text-dimmed">
|
|
212
212
|
{{ t('personalSubscriptions.heading') }}
|
|
213
213
|
</h4>
|
|
214
|
-
<p class="mt-1 text-sm text-
|
|
214
|
+
<p class="mt-1 text-sm text-muted">{{ t('personalSubscriptions.intro') }}</p>
|
|
215
215
|
</div>
|
|
216
216
|
|
|
217
217
|
<ProvidersSignInRequiredNotice
|
|
@@ -223,12 +223,12 @@ async function disconnect(v: SubscriptionVendor) {
|
|
|
223
223
|
<div
|
|
224
224
|
v-for="sub in personal.subscriptions"
|
|
225
225
|
:key="sub.vendor"
|
|
226
|
-
class="flex items-center justify-between rounded-md border border-
|
|
226
|
+
class="flex items-center justify-between rounded-md border border-muted bg-default/50 px-3 py-2 text-sm"
|
|
227
227
|
>
|
|
228
228
|
<div>
|
|
229
|
-
<span class="font-medium text-
|
|
230
|
-
<span class="ms-2 text-xs text-
|
|
231
|
-
<div class="text-[11px] text-
|
|
229
|
+
<span class="font-medium text-default">{{ sub.label }}</span>
|
|
230
|
+
<span class="ms-2 text-xs text-dimmed">{{ vendorLabel(sub.vendor) }}</span>
|
|
231
|
+
<div class="text-[11px] text-dimmed">
|
|
232
232
|
<template v-if="sub.expiresAt">
|
|
233
233
|
{{ t('personalSubscriptions.expires', { date: d(new Date(sub.expiresAt), 'short') }) }}
|
|
234
234
|
</template>
|
|
@@ -244,7 +244,7 @@ async function disconnect(v: SubscriptionVendor) {
|
|
|
244
244
|
/>
|
|
245
245
|
</div>
|
|
246
246
|
|
|
247
|
-
<p v-for="(line, i) in renewals" :key="i" class="text-sm text-
|
|
247
|
+
<p v-for="(line, i) in renewals" :key="i" class="text-sm text-app-warning-400/90">{{ line }}</p>
|
|
248
248
|
|
|
249
249
|
<!-- vendor picker -->
|
|
250
250
|
<UFormField :label="t('personalSubscriptions.vendorField')">
|
|
@@ -258,7 +258,7 @@ async function disconnect(v: SubscriptionVendor) {
|
|
|
258
258
|
|
|
259
259
|
<!-- connect / replace form -->
|
|
260
260
|
<ol
|
|
261
|
-
class="list-decimal space-y-1.5 rounded-lg border border-
|
|
261
|
+
class="list-decimal space-y-1.5 rounded-lg border border-muted bg-default/60 p-4 ps-8 text-sm text-toned"
|
|
262
262
|
>
|
|
263
263
|
<li v-for="(step, i) in selectedMeta.steps" :key="i">{{ step }}</li>
|
|
264
264
|
</ol>
|
|
@@ -292,11 +292,11 @@ async function disconnect(v: SubscriptionVendor) {
|
|
|
292
292
|
</UFormField>
|
|
293
293
|
</div>
|
|
294
294
|
<div class="flex items-center justify-end gap-3">
|
|
295
|
-
<p v-if="savedNotice" class="flex items-center gap-1.5 text-sm text-
|
|
295
|
+
<p v-if="savedNotice" class="flex items-center gap-1.5 text-sm text-app-success-400">
|
|
296
296
|
<UIcon name="i-lucide-check" class="size-4" />
|
|
297
297
|
{{ savedNotice }}
|
|
298
298
|
</p>
|
|
299
|
-
<p v-else-if="disabledReason" class="text-sm text-
|
|
299
|
+
<p v-else-if="disabledReason" class="text-sm text-app-error-400">{{ disabledReason }}</p>
|
|
300
300
|
<UButton
|
|
301
301
|
:loading="busy"
|
|
302
302
|
:disabled="disabledReason !== null"
|
|
@@ -10,7 +10,7 @@ defineProps<{ message: string }>()
|
|
|
10
10
|
|
|
11
11
|
<template>
|
|
12
12
|
<div
|
|
13
|
-
class="flex items-start gap-2.5 rounded-lg border border-
|
|
13
|
+
class="flex items-start gap-2.5 rounded-lg border border-app-warning-500/40 bg-app-warning-500/10 p-3 text-sm text-app-warning-200"
|
|
14
14
|
role="alert"
|
|
15
15
|
>
|
|
16
16
|
<UIcon name="i-lucide-lock" class="mt-0.5 h-4 w-4 shrink-0" />
|
|
@@ -199,10 +199,10 @@ function vendorLabel(v: SubscriptionVendor): string {
|
|
|
199
199
|
`personal` tab — point them there before they read a pool form that can't
|
|
200
200
|
take their credential. -->
|
|
201
201
|
<div
|
|
202
|
-
class="flex items-center gap-3 rounded-lg border border-
|
|
202
|
+
class="flex items-center gap-3 rounded-lg border border-primary/30 bg-primary/10 px-3 py-2.5"
|
|
203
203
|
>
|
|
204
|
-
<UIcon name="i-lucide-user" class="h-5 w-5 shrink-0 text-
|
|
205
|
-
<p class="min-w-0 flex-1 text-[13px] text-
|
|
204
|
+
<UIcon name="i-lucide-user" class="h-5 w-5 shrink-0 text-primary" />
|
|
205
|
+
<p class="min-w-0 flex-1 text-[13px] text-toned">
|
|
206
206
|
{{ t('providers.vendorCredentials.personalCallout.text') }}
|
|
207
207
|
</p>
|
|
208
208
|
<UButton
|
|
@@ -216,7 +216,7 @@ function vendorLabel(v: SubscriptionVendor): string {
|
|
|
216
216
|
</UButton>
|
|
217
217
|
</div>
|
|
218
218
|
|
|
219
|
-
<p class="text-sm text-
|
|
219
|
+
<p class="text-sm text-muted">
|
|
220
220
|
{{ t('providers.vendorCredentials.poolIntro') }}
|
|
221
221
|
</p>
|
|
222
222
|
|
|
@@ -233,7 +233,7 @@ function vendorLabel(v: SubscriptionVendor): string {
|
|
|
233
233
|
|
|
234
234
|
<!-- guided steps -->
|
|
235
235
|
<ol
|
|
236
|
-
class="list-decimal space-y-1.5 rounded-lg border border-
|
|
236
|
+
class="list-decimal space-y-1.5 rounded-lg border border-muted bg-default/60 p-4 ps-8 text-sm text-toned"
|
|
237
237
|
>
|
|
238
238
|
<li v-for="(step, i) in steps" :key="i">{{ step }}</li>
|
|
239
239
|
</ol>
|
|
@@ -267,7 +267,7 @@ function vendorLabel(v: SubscriptionVendor): string {
|
|
|
267
267
|
|
|
268
268
|
<!-- connected pool -->
|
|
269
269
|
<div v-if="creds.credentials.length" class="space-y-2">
|
|
270
|
-
<h4 class="text-xs font-semibold uppercase tracking-wide text-
|
|
270
|
+
<h4 class="text-xs font-semibold uppercase tracking-wide text-dimmed">
|
|
271
271
|
{{
|
|
272
272
|
t('providers.vendorCredentials.connected', { count: creds.credentials.length })
|
|
273
273
|
}}
|
|
@@ -275,16 +275,16 @@ function vendorLabel(v: SubscriptionVendor): string {
|
|
|
275
275
|
<div
|
|
276
276
|
v-for="c in creds.credentials"
|
|
277
277
|
:key="c.id"
|
|
278
|
-
class="flex items-center justify-between rounded-md border border-
|
|
278
|
+
class="flex items-center justify-between rounded-md border border-muted bg-default/50 px-3 py-2 text-sm"
|
|
279
279
|
:class="{ 'opacity-55': !c.enabled }"
|
|
280
280
|
>
|
|
281
281
|
<div>
|
|
282
|
-
<span class="font-medium text-
|
|
283
|
-
<span class="ms-2 text-xs text-
|
|
282
|
+
<span class="font-medium text-default">{{ c.label }}</span>
|
|
283
|
+
<span class="ms-2 text-xs text-dimmed">{{ vendorLabel(c.vendor) }}</span>
|
|
284
284
|
<UBadge v-if="!c.enabled" color="neutral" variant="subtle" size="sm" class="ms-2">
|
|
285
285
|
{{ t('providers.vendorCredentials.disabledBadge') }}
|
|
286
286
|
</UBadge>
|
|
287
|
-
<div class="text-[11px] tabular-nums text-
|
|
287
|
+
<div class="text-[11px] tabular-nums text-dimmed">
|
|
288
288
|
{{
|
|
289
289
|
t(
|
|
290
290
|
'providers.vendorCredentials.usage',
|
|
@@ -113,9 +113,9 @@ function when(epochMs: number): string {
|
|
|
113
113
|
</script>
|
|
114
114
|
|
|
115
115
|
<template>
|
|
116
|
-
<div class="rounded-lg border border-
|
|
117
|
-
<div class="flex items-center justify-between border-b border-
|
|
118
|
-
<p class="text-[11px] font-semibold uppercase tracking-wide text-
|
|
116
|
+
<div class="rounded-lg border border-muted bg-default/50">
|
|
117
|
+
<div class="flex items-center justify-between border-b border-default px-3 py-2">
|
|
118
|
+
<p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
119
119
|
{{ t('provisioning.title') }}
|
|
120
120
|
</p>
|
|
121
121
|
<UButton
|
|
@@ -129,41 +129,41 @@ function when(epochMs: number): string {
|
|
|
129
129
|
</UButton>
|
|
130
130
|
</div>
|
|
131
131
|
|
|
132
|
-
<p v-if="state.error" class="px-3 py-2 text-[12px] text-
|
|
132
|
+
<p v-if="state.error" class="px-3 py-2 text-[12px] text-app-error-300">{{ state.error }}</p>
|
|
133
133
|
<p
|
|
134
134
|
v-else-if="!state.loading && state.entries.length === 0"
|
|
135
|
-
class="px-3 py-3 text-[12px] text-
|
|
135
|
+
class="px-3 py-3 text-[12px] text-dimmed"
|
|
136
136
|
>
|
|
137
137
|
{{ t('provisioning.empty') }}
|
|
138
138
|
</p>
|
|
139
139
|
|
|
140
|
-
<ul v-else class="max-h-80 divide-y divide-
|
|
140
|
+
<ul v-else class="max-h-80 divide-y divide-default overflow-auto">
|
|
141
141
|
<li v-for="entry in state.entries" :key="entry.id" class="px-3 py-2">
|
|
142
142
|
<div class="flex items-center gap-2 text-[12px]">
|
|
143
143
|
<UIcon
|
|
144
144
|
:name="entry.outcome === 'success' ? 'i-lucide-check-circle' : 'i-lucide-x-circle'"
|
|
145
145
|
class="h-3.5 w-3.5 shrink-0"
|
|
146
|
-
:class="entry.outcome === 'success' ? 'text-
|
|
146
|
+
:class="entry.outcome === 'success' ? 'text-app-success-400' : 'text-app-error-400'"
|
|
147
147
|
/>
|
|
148
|
-
<span class="font-medium text-
|
|
148
|
+
<span class="font-medium text-default">{{ OPERATION_LABEL[entry.operation] }}</span>
|
|
149
149
|
<span
|
|
150
150
|
class="rounded px-1.5 py-0.5 text-[10px] uppercase tracking-wide"
|
|
151
151
|
:class="
|
|
152
152
|
entry.outcome === 'success'
|
|
153
|
-
? 'bg-
|
|
154
|
-
: 'bg-
|
|
153
|
+
? 'bg-app-success-950/60 text-app-success-300'
|
|
154
|
+
: 'bg-app-error-950/60 text-app-error-300'
|
|
155
155
|
"
|
|
156
156
|
>{{ OUTCOME_LABEL[entry.outcome] }}</span
|
|
157
157
|
>
|
|
158
|
-
<span class="ms-auto text-[11px] text-
|
|
158
|
+
<span class="ms-auto text-[11px] text-dimmed">{{ when(entry.createdAt) }}</span>
|
|
159
159
|
</div>
|
|
160
|
-
<div v-if="entry.targetId" class="mt-0.5 text-[11px] text-
|
|
160
|
+
<div v-if="entry.targetId" class="mt-0.5 text-[11px] text-dimmed">
|
|
161
161
|
{{ entry.providerId ? `${entry.providerId} · ` : '' }}{{ entry.targetId }}
|
|
162
162
|
</div>
|
|
163
163
|
<!-- The verbatim provider/runtime error on a failed attempt. -->
|
|
164
164
|
<pre
|
|
165
165
|
v-if="entry.error"
|
|
166
|
-
class="mt-1 max-h-28 overflow-auto whitespace-pre-wrap rounded border border-
|
|
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-[11px] text-app-error-200/90"
|
|
167
167
|
>{{ entry.error }}</pre>
|
|
168
168
|
</li>
|
|
169
169
|
</ul>
|
|
@@ -82,31 +82,31 @@ const STATUS_META = computed<
|
|
|
82
82
|
label: t('ralph.status.passed'),
|
|
83
83
|
badge: 'success',
|
|
84
84
|
icon: 'i-lucide-circle-check',
|
|
85
|
-
text: 'text-
|
|
85
|
+
text: 'text-app-success-300',
|
|
86
86
|
},
|
|
87
87
|
stalled: {
|
|
88
88
|
label: t('ralph.status.stalled'),
|
|
89
89
|
badge: 'error',
|
|
90
90
|
icon: 'i-lucide-circle-slash',
|
|
91
|
-
text: 'text-
|
|
91
|
+
text: 'text-app-error-300',
|
|
92
92
|
},
|
|
93
93
|
'gave-up': {
|
|
94
94
|
label: t('ralph.status.gaveUp'),
|
|
95
95
|
badge: 'error',
|
|
96
96
|
icon: 'i-lucide-circle-x',
|
|
97
|
-
text: 'text-
|
|
97
|
+
text: 'text-app-error-300',
|
|
98
98
|
},
|
|
99
99
|
running: {
|
|
100
100
|
label: t('ralph.status.running'),
|
|
101
101
|
badge: 'warning',
|
|
102
102
|
icon: 'i-lucide-loader',
|
|
103
|
-
text: 'text-
|
|
103
|
+
text: 'text-app-warning-300',
|
|
104
104
|
},
|
|
105
105
|
failing: {
|
|
106
106
|
label: t('ralph.status.failing'),
|
|
107
107
|
badge: 'error',
|
|
108
108
|
icon: 'i-lucide-circle-x',
|
|
109
|
-
text: 'text-
|
|
109
|
+
text: 'text-app-error-300',
|
|
110
110
|
},
|
|
111
111
|
}))
|
|
112
112
|
</script>
|
|
@@ -115,7 +115,7 @@ const STATUS_META = computed<
|
|
|
115
115
|
<ResultWindowShell
|
|
116
116
|
:open="open"
|
|
117
117
|
:icon="meta.icon"
|
|
118
|
-
icon-class="bg-
|
|
118
|
+
icon-class="bg-app-secondary-500/15 text-app-secondary-300"
|
|
119
119
|
:title="headerTitle"
|
|
120
120
|
:subtitle="t('ralph.subtitle')"
|
|
121
121
|
:step-ref="{ instanceId, stepIndex }"
|
|
@@ -137,7 +137,7 @@ const STATUS_META = computed<
|
|
|
137
137
|
<div class="min-w-0 flex-1 overflow-y-auto px-5 py-4">
|
|
138
138
|
<div
|
|
139
139
|
v-if="!ralph"
|
|
140
|
-
class="flex h-full flex-col items-center justify-center gap-2 text-center text-
|
|
140
|
+
class="flex h-full flex-col items-center justify-center gap-2 text-center text-muted"
|
|
141
141
|
>
|
|
142
142
|
<UIcon :name="meta.icon" class="h-8 w-8 opacity-40" />
|
|
143
143
|
<p class="text-sm">{{ t('ralph.noActivity') }}</p>
|
|
@@ -145,27 +145,25 @@ const STATUS_META = computed<
|
|
|
145
145
|
|
|
146
146
|
<template v-else>
|
|
147
147
|
<!-- The completion criterion. -->
|
|
148
|
-
<h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-
|
|
148
|
+
<h3 class="mb-1.5 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
149
149
|
{{ t('ralph.validationCommand') }}
|
|
150
150
|
</h3>
|
|
151
|
-
<div class="relative rounded-md border border-
|
|
151
|
+
<div class="relative rounded-md border border-default bg-app-950/60 px-3 py-2">
|
|
152
152
|
<CopyButton :text="ralph.validationCommand" class="absolute end-1 top-1" />
|
|
153
|
-
<code class="block whitespace-pre-wrap pe-8 font-mono text-[12px] text-
|
|
153
|
+
<code class="block whitespace-pre-wrap pe-8 font-mono text-[12px] text-default">{{
|
|
154
154
|
ralph.validationCommand
|
|
155
155
|
}}</code>
|
|
156
156
|
</div>
|
|
157
157
|
|
|
158
158
|
<!-- The most recent validation output. -->
|
|
159
159
|
<template v-if="ralph.lastValidationTail">
|
|
160
|
-
<h3
|
|
161
|
-
class="mb-1.5 mt-4 text-[11px] font-semibold uppercase tracking-wide text-slate-500"
|
|
162
|
-
>
|
|
160
|
+
<h3 class="mb-1.5 mt-4 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
163
161
|
{{ t('ralph.lastOutput', { exit: ralph.lastExitCode ?? '?' }) }}
|
|
164
162
|
</h3>
|
|
165
|
-
<div class="relative rounded-md border border-
|
|
163
|
+
<div class="relative rounded-md border border-default bg-app-950/60 px-3 py-2">
|
|
166
164
|
<CopyButton :text="ralph.lastValidationTail" class="absolute end-1 top-1" />
|
|
167
165
|
<pre
|
|
168
|
-
class="whitespace-pre-wrap pe-8 font-mono text-[11px] leading-relaxed text-
|
|
166
|
+
class="whitespace-pre-wrap pe-8 font-mono text-[11px] leading-relaxed text-muted"
|
|
169
167
|
>{{ ralph.lastValidationTail }}</pre>
|
|
170
168
|
</div>
|
|
171
169
|
</template>
|
|
@@ -175,7 +173,7 @@ const STATUS_META = computed<
|
|
|
175
173
|
:href="prUrl"
|
|
176
174
|
target="_blank"
|
|
177
175
|
rel="noopener"
|
|
178
|
-
class="mt-3 inline-flex items-center gap-1 text-[12px] text-
|
|
176
|
+
class="mt-3 inline-flex items-center gap-1 text-[12px] text-app-info-300 hover:text-app-info-200 hover:underline"
|
|
179
177
|
>
|
|
180
178
|
{{ t('ralph.viewPr') }}
|
|
181
179
|
<UIcon name="i-lucide-external-link" class="h-3 w-3" />
|
|
@@ -185,7 +183,7 @@ const STATUS_META = computed<
|
|
|
185
183
|
the sidebar (e.g. "3 of 20") reads as an unexplained abandonment. -->
|
|
186
184
|
<p
|
|
187
185
|
v-if="status === 'stalled'"
|
|
188
|
-
class="mt-3 rounded-md border border-
|
|
186
|
+
class="mt-3 rounded-md border border-app-error-900/60 bg-app-error-950/30 px-3 py-2 text-[12px] leading-relaxed text-app-error-200"
|
|
189
187
|
data-testid="ralph-stalled-note"
|
|
190
188
|
>
|
|
191
189
|
{{ t('ralph.stalledNote') }}
|
|
@@ -193,14 +191,14 @@ const STATUS_META = computed<
|
|
|
193
191
|
|
|
194
192
|
<!-- Iteration history: what each pass produced and whether its validation passed. -->
|
|
195
193
|
<section v-if="attempts.length" class="mt-5">
|
|
196
|
-
<h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-
|
|
194
|
+
<h3 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
197
195
|
{{ t('ralph.iterationsHeading') }}
|
|
198
196
|
</h3>
|
|
199
197
|
<!-- The log is capped (it rides the run's detail blob); say so rather than letting a
|
|
200
198
|
long loop's partial history read as if those iterations never ran. -->
|
|
201
199
|
<p
|
|
202
200
|
v-if="droppedAttempts"
|
|
203
|
-
class="mb-2 text-[11px] text-
|
|
201
|
+
class="mb-2 text-[11px] text-dimmed"
|
|
204
202
|
data-testid="ralph-iterations-truncated"
|
|
205
203
|
>
|
|
206
204
|
{{ t('ralph.iterationsTruncated', { count: droppedAttempts }, droppedAttempts) }}
|
|
@@ -209,32 +207,32 @@ const STATUS_META = computed<
|
|
|
209
207
|
<li
|
|
210
208
|
v-for="a in attempts"
|
|
211
209
|
:key="a.attempt"
|
|
212
|
-
class="rounded-md border border-
|
|
210
|
+
class="rounded-md border border-default bg-app-950/40 px-3 py-2"
|
|
213
211
|
data-testid="ralph-iteration"
|
|
214
212
|
>
|
|
215
213
|
<div class="flex items-center gap-2">
|
|
216
214
|
<UIcon
|
|
217
215
|
:name="a.validationPassed ? 'i-lucide-circle-check' : 'i-lucide-circle-x'"
|
|
218
216
|
class="h-3.5 w-3.5"
|
|
219
|
-
:class="a.validationPassed ? 'text-
|
|
217
|
+
:class="a.validationPassed ? 'text-app-success-400' : 'text-app-error-400'"
|
|
220
218
|
/>
|
|
221
|
-
<span class="text-[12px] font-medium text-
|
|
219
|
+
<span class="text-[12px] font-medium text-default">
|
|
222
220
|
{{ t('ralph.iteration', { number: a.attempt }) }}
|
|
223
221
|
</span>
|
|
224
|
-
<span class="text-[11px] text-
|
|
222
|
+
<span class="text-[11px] text-dimmed">
|
|
225
223
|
{{
|
|
226
224
|
a.validationPassed
|
|
227
225
|
? t('ralph.iterationPassed')
|
|
228
226
|
: t('ralph.iterationFailed', { exit: a.exitCode ?? '?' })
|
|
229
227
|
}}
|
|
230
228
|
</span>
|
|
231
|
-
<span class="ms-auto text-[10px] text-
|
|
229
|
+
<span class="ms-auto text-[10px] text-app-600">{{
|
|
232
230
|
d(new Date(a.at), 'long')
|
|
233
231
|
}}</span>
|
|
234
232
|
</div>
|
|
235
233
|
<p
|
|
236
234
|
v-if="a.summary"
|
|
237
|
-
class="mt-1 whitespace-pre-wrap text-[12px] leading-relaxed text-
|
|
235
|
+
class="mt-1 whitespace-pre-wrap text-[12px] leading-relaxed text-muted"
|
|
238
236
|
>
|
|
239
237
|
{{ a.summary }}
|
|
240
238
|
</p>
|
|
@@ -245,10 +243,10 @@ const STATUS_META = computed<
|
|
|
245
243
|
</div>
|
|
246
244
|
|
|
247
245
|
<aside
|
|
248
|
-
class="hidden w-60 shrink-0 flex-col gap-4 border-s border-
|
|
246
|
+
class="hidden w-60 shrink-0 flex-col gap-4 border-s border-default bg-default/50 px-4 py-4 lg:flex"
|
|
249
247
|
>
|
|
250
248
|
<div v-if="ralph">
|
|
251
|
-
<h4 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-
|
|
249
|
+
<h4 class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
252
250
|
{{ t('ralph.sidebar.state') }}
|
|
253
251
|
</h4>
|
|
254
252
|
<div class="flex items-center gap-2 text-[13px]">
|
|
@@ -261,10 +259,10 @@ const STATUS_META = computed<
|
|
|
261
259
|
</div>
|
|
262
260
|
</div>
|
|
263
261
|
<div v-if="ralph">
|
|
264
|
-
<h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-
|
|
262
|
+
<h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-dimmed">
|
|
265
263
|
{{ t('ralph.sidebar.iterations') }}
|
|
266
264
|
</h4>
|
|
267
|
-
<p class="text-[12px] text-
|
|
265
|
+
<p class="text-[12px] text-toned" data-testid="ralph-iteration-count">
|
|
268
266
|
{{ t('ralph.sidebar.count', { attempts: ralph.attempts, max: ralph.maxIterations }) }}
|
|
269
267
|
</p>
|
|
270
268
|
</div>
|
|
@@ -277,7 +275,7 @@ const STATUS_META = computed<
|
|
|
277
275
|
:run-failed="instance?.status === 'failed'"
|
|
278
276
|
:failure-at="instance?.failure?.occurredAt"
|
|
279
277
|
/>
|
|
280
|
-
<p class="mt-auto text-[10px] leading-relaxed text-
|
|
278
|
+
<p class="mt-auto text-[10px] leading-relaxed text-app-600">
|
|
281
279
|
{{ t('ralph.sidebar.footer') }}
|
|
282
280
|
</p>
|
|
283
281
|
</aside>
|
|
@@ -76,7 +76,7 @@ const timezoneOptions = computed(() =>
|
|
|
76
76
|
class="w-24"
|
|
77
77
|
@update:model-value="patch({ intervalHours: Math.max(1, Number($event) || 1) })"
|
|
78
78
|
/>
|
|
79
|
-
<span class="text-xs text-
|
|
79
|
+
<span class="text-xs text-muted">{{ t('recurring.hours') }}</span>
|
|
80
80
|
</div>
|
|
81
81
|
</UFormField>
|
|
82
82
|
|
|
@@ -110,7 +110,7 @@ const timezoneOptions = computed(() =>
|
|
|
110
110
|
class="w-28"
|
|
111
111
|
@update:model-value="patch({ windowStartHour: Number($event) })"
|
|
112
112
|
/>
|
|
113
|
-
<span class="text-xs text-
|
|
113
|
+
<span class="text-xs text-muted">{{ t('recurring.to') }}</span>
|
|
114
114
|
<USelect
|
|
115
115
|
:model-value="modelValue.windowEndHour ?? 24 % 24"
|
|
116
116
|
:items="hours"
|