@cat-factory/app 0.302.2 → 0.303.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +99 -14
- package/app/app.config.ts +19 -10
- package/app/assets/css/main.css +13 -13
- package/app/assets/css/prose.css +22 -22
- package/app/assets/css/tokens.css +298 -0
- package/app/components/assistant/AssistantModal.vue +22 -22
- package/app/components/auth/AuthGate.vue +1 -1
- package/app/components/auth/BackendMisconfiguredScreen.vue +10 -10
- package/app/components/auth/LoginScreen.vue +34 -36
- package/app/components/auth/ResetPasswordScreen.vue +12 -12
- package/app/components/auth/UserMenu.vue +4 -4
- package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +27 -25
- package/app/components/binaryOutput/BinaryOutputReport.vue +15 -15
- package/app/components/binaryOutput/StoredAssetView.vue +5 -5
- package/app/components/board/AddTaskModal.vue +17 -20
- package/app/components/board/AgentFailureCard.vue +11 -11
- package/app/components/board/AgentFailureHistory.vue +2 -2
- package/app/components/board/BoardCanvas.vue +6 -5
- package/app/components/board/CreateInitiativeModal.vue +8 -10
- package/app/components/board/DependencyConnectOverlay.vue +1 -1
- package/app/components/board/FailureHistoryList.vue +7 -7
- package/app/components/board/RecurringPipelineModal.vue +17 -17
- package/app/components/board/ReviewFrictionDialog.vue +6 -6
- package/app/components/board/StepExecutionHistory.vue +13 -13
- package/app/components/board/TaskDependencyEdges.vue +8 -8
- package/app/components/board/nodes/AgentChip.vue +10 -10
- package/app/components/board/nodes/BlockNode.vue +29 -29
- package/app/components/board/nodes/DecisionBadge.vue +2 -2
- package/app/components/board/nodes/EpicNode.vue +14 -10
- package/app/components/board/nodes/FrameSwimlanes.vue +7 -9
- package/app/components/board/nodes/InitiativeCard.vue +8 -8
- package/app/components/board/nodes/LaneGroup.vue +1 -1
- package/app/components/board/nodes/LaneTask.vue +2 -2
- package/app/components/board/nodes/ResizeGrips.vue +4 -4
- package/app/components/board/nodes/TaskCard.vue +18 -18
- package/app/components/board/nodes/TaskLane.vue +5 -5
- package/app/components/board/nodes/TaskPipelineMini.vue +18 -18
- package/app/components/bootstrap/AdoptionReviewModal.vue +29 -26
- package/app/components/bootstrap/BootstrapModal.vue +21 -23
- package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
- package/app/components/brainstorm/BrainstormWindow.vue +30 -33
- package/app/components/bugFishing/BugFishingWindow.vue +49 -49
- package/app/components/clarity/ClarityReviewWindow.vue +30 -30
- package/app/components/common/AsyncViewError.vue +5 -5
- package/app/components/common/ClarificationItem.vue +8 -13
- package/app/components/common/ConfirmDialog.vue +4 -2
- package/app/components/common/DescriptorFields.vue +1 -1
- package/app/components/common/EmptyState.vue +3 -3
- package/app/components/common/InterviewGateNotice.vue +7 -7
- package/app/components/common/KeyboardShortcutsHelp.vue +1 -1
- package/app/components/common/MarkdownProse.vue +14 -13
- package/app/components/consensus/ConsensusSessionWindow.vue +26 -26
- package/app/components/context/ContextAttachmentFields.vue +17 -17
- package/app/components/docs/DocInterviewWindow.vue +14 -14
- package/app/components/documents/ContextDocumentPicker.vue +17 -17
- package/app/components/documents/DocumentImportModal.vue +7 -7
- package/app/components/documents/DocumentSourceConnectModal.vue +3 -3
- package/app/components/documents/DocumentSyncState.vue +5 -5
- package/app/components/documents/DocumentTemplatesModal.vue +15 -15
- package/app/components/documents/RepoContextDocPicker.vue +5 -5
- package/app/components/documents/SpawnPreviewModal.vue +12 -12
- package/app/components/documents/StartFromDesignModal.vue +11 -11
- package/app/components/documents/TaskContextDocs.vue +5 -5
- package/app/components/environments/EnvSetupStepper.vue +6 -6
- package/app/components/environments/EnvironmentStatusPanel.vue +17 -17
- package/app/components/environments/steps/EnvPickStep.vue +3 -3
- package/app/components/environments/steps/EnvPreflightStep.vue +9 -9
- package/app/components/environments/steps/EnvReviewStep.vue +25 -22
- package/app/components/environments/steps/EnvSaveStep.vue +7 -5
- package/app/components/environments/steps/JourneyStepNav.vue +1 -1
- package/app/components/focus/BlockFocusView.vue +17 -19
- package/app/components/followUp/FollowUpWindow.vue +23 -23
- package/app/components/forkDecision/ForkDecisionWindow.vue +37 -39
- package/app/components/foundational/FoundationalContractSummary.vue +7 -7
- package/app/components/foundational/FoundationalServiceCatalogList.vue +11 -11
- package/app/components/foundational/FoundationalServiceManager.vue +1 -1
- package/app/components/foundational/FoundationalServiceRegistry.vue +13 -13
- package/app/components/foundational/FoundationalServiceSources.vue +13 -13
- package/app/components/foundational/FoundationalSuppressions.vue +7 -7
- package/app/components/foundational/ServiceCatalogConnection.vue +10 -10
- package/app/components/fragments/FragmentLibraryManager.vue +41 -44
- package/app/components/fragments/FragmentSelector.vue +13 -13
- package/app/components/fragments/GitHubDocUrlImport.vue +1 -1
- package/app/components/gates/GateFailingCheckList.vue +5 -5
- package/app/components/gates/GateResultView.vue +50 -47
- package/app/components/github/AddServiceFromRepoModal.vue +14 -14
- package/app/components/github/BranchProtectionPreflight.vue +13 -13
- package/app/components/github/GitHubConnect.vue +7 -7
- package/app/components/github/GitHubOnboarding.vue +7 -7
- package/app/components/github/GitHubPanel.vue +37 -40
- package/app/components/github/RepoTreeBrowser.vue +18 -18
- package/app/components/humanTest/HumanTestWindow.vue +30 -33
- package/app/components/initiative/InitiativePlanNotice.vue +5 -5
- package/app/components/initiative/InitiativePlanReview.vue +27 -29
- package/app/components/initiative/InitiativePlanningWindow.vue +10 -10
- package/app/components/initiative/InitiativeTrackerWindow.vue +71 -65
- package/app/components/inputGate/InputGateNotice.vue +2 -4
- package/app/components/judge/JudgeResultView.vue +30 -32
- package/app/components/kaizen/KaizenPanel.vue +40 -36
- package/app/components/kaizen/KaizenStepStatus.vue +21 -21
- package/app/components/layout/AccountAuditLog.vue +10 -10
- package/app/components/layout/AccountDeploymentSettings.vue +20 -20
- package/app/components/layout/AccountFailureKindRules.vue +13 -13
- package/app/components/layout/AccountFoundationalSettings.vue +1 -1
- package/app/components/layout/AccountFragmentSettings.vue +1 -1
- package/app/components/layout/AccountModelPolicySettings.vue +9 -9
- package/app/components/layout/AccountPlatformAlertSettings.vue +11 -11
- package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
- package/app/components/layout/AccountRunCredentialSettings.vue +5 -5
- package/app/components/layout/AccountSkillSettings.vue +1 -1
- package/app/components/layout/AccountTeamSettings.vue +23 -15
- package/app/components/layout/AiProvidersBanner.vue +11 -8
- package/app/components/layout/AppearanceSwitcher.vue +108 -0
- package/app/components/layout/BoardSwitcher.vue +8 -11
- package/app/components/layout/BoardToolbar.vue +3 -3
- package/app/components/layout/CommandBar.vue +7 -9
- package/app/components/layout/ConnectionStatusBanner.vue +2 -2
- package/app/components/layout/DefaultTestEnvBanner.vue +5 -5
- package/app/components/layout/GitHubPatBanner.vue +5 -5
- package/app/components/layout/GitHubPatPermissionsBanner.vue +16 -10
- package/app/components/layout/InfraSetupBanner.vue +6 -6
- package/app/components/layout/IntegrationsHub.vue +15 -15
- package/app/components/layout/LanguageSwitcher.vue +5 -5
- package/app/components/layout/ModelProvidersHub.vue +13 -16
- package/app/components/layout/NotificationsInbox.vue +10 -10
- package/app/components/layout/PersonalSetupModal.vue +8 -8
- package/app/components/layout/ProviderConfigBanner.vue +4 -4
- package/app/components/layout/RolePrompt.vue +7 -7
- package/app/components/layout/SideBar.vue +6 -4
- package/app/components/layout/SpendWarningBanner.vue +17 -14
- package/app/components/layout/TranslationWarningBanner.vue +4 -4
- package/app/components/layout/UiModeSwitcher.vue +13 -13
- package/app/components/layout/UiRoleSwitcher.vue +8 -8
- package/app/components/layout/WorkspaceMembersSettings.vue +15 -11
- package/app/components/media/ArtifactLightbox.vue +13 -13
- package/app/components/media/ImageCompare.vue +31 -24
- package/app/components/merge/MergeEffortChips.vue +2 -2
- package/app/components/notifications/NotificationSettingsPanel.vue +14 -12
- package/app/components/observability/OutcomeFilterChips.vue +6 -6
- package/app/components/observability/RunFailureSummary.vue +28 -25
- package/app/components/observability/StepMetricsBar.vue +26 -28
- package/app/components/observability/StepModelActivity.vue +2 -2
- package/app/components/observability/ToolCallList.vue +24 -24
- package/app/components/outcome/OutcomeSummaryWindow.vue +47 -47
- package/app/components/palettes/AgentPalette.vue +8 -8
- package/app/components/palettes/AgentTierSelect.vue +1 -1
- package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
- package/app/components/panels/AgentStepDetail.vue +52 -51
- package/app/components/panels/AttemptEntryHeader.vue +4 -6
- package/app/components/panels/DecisionModal.vue +7 -7
- package/app/components/panels/GenericStructuredResultView.vue +7 -7
- package/app/components/panels/InspectorPanel.vue +17 -17
- package/app/components/panels/MergerResultView.vue +19 -19
- package/app/components/panels/ObservabilityPanel.vue +115 -123
- package/app/components/panels/OperatorDashboardPanel.vue +89 -97
- package/app/components/panels/ReportsPanel.vue +69 -66
- package/app/components/panels/ReportsSpendBreakdown.vue +9 -9
- package/app/components/panels/ResultWindowShell.vue +38 -38
- package/app/components/panels/RunDetailLoadState.vue +2 -2
- package/app/components/panels/StepContainerStatus.vue +9 -9
- package/app/components/panels/StepDelegatedStatus.logic.spec.ts +135 -0
- package/app/components/panels/StepDelegatedStatus.logic.ts +160 -0
- package/app/components/panels/StepDelegatedStatus.vue +181 -0
- package/app/components/panels/StepEffortReport.vue +16 -15
- package/app/components/panels/StepFragmentAdherence.vue +14 -10
- package/app/components/panels/StepMetadataCard.vue +74 -45
- package/app/components/panels/StepReproductionReport.vue +25 -21
- package/app/components/panels/StepRunMeta.vue +20 -20
- package/app/components/panels/StepTestReport.logic.spec.ts +8 -3
- package/app/components/panels/StepTestReport.logic.ts +4 -4
- package/app/components/panels/StepTestReport.vue +28 -28
- package/app/components/panels/StepToolServers.vue +14 -11
- package/app/components/panels/StepValidationReport.vue +7 -7
- package/app/components/panels/inspector/ContainerSummary.vue +9 -9
- package/app/components/panels/inspector/DocReferenceRepos.vue +3 -3
- package/app/components/panels/inspector/EnvProbeReport.vue +24 -27
- package/app/components/panels/inspector/EpicChildren.vue +8 -12
- package/app/components/panels/inspector/FrontendBindingsResolved.vue +11 -11
- package/app/components/panels/inspector/FrontendConfig.vue +37 -41
- package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
- package/app/components/panels/inspector/InspectorSection.vue +6 -6
- package/app/components/panels/inspector/RecurringScheduleSettings.vue +16 -19
- package/app/components/panels/inspector/ServiceConnections.vue +2 -2
- package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
- package/app/components/panels/inspector/ServiceSelfTests.vue +21 -17
- package/app/components/panels/inspector/ServiceTestConfig.vue +51 -59
- package/app/components/panels/inspector/ServiceTestSecrets.vue +5 -5
- package/app/components/panels/inspector/ServiceTestingContext.vue +3 -3
- package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
- package/app/components/panels/inspector/TaskAgentConfig.vue +3 -3
- package/app/components/panels/inspector/TaskAprioriBranches.vue +8 -5
- package/app/components/panels/inspector/TaskDependencies.vue +1 -1
- package/app/components/panels/inspector/TaskEstimateBadge.vue +11 -11
- package/app/components/panels/inspector/TaskExecution.vue +17 -17
- package/app/components/panels/inspector/TaskReviewTarget.vue +2 -2
- package/app/components/panels/inspector/TaskRunSettings.vue +35 -37
- package/app/components/panels/inspector/TaskStructure.vue +3 -3
- package/app/components/pipeline/AgentKindIcon.vue +1 -1
- package/app/components/pipeline/AgentPromptEditor.vue +17 -17
- package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -56
- package/app/components/pipeline/EstimateThresholdFields.vue +4 -4
- package/app/components/pipeline/GateConfigFields.vue +13 -10
- package/app/components/pipeline/IterationCapPrompt.vue +4 -2
- package/app/components/pipeline/PipelineBuilder.vue +47 -55
- package/app/components/pipeline/PipelineHealthModal.vue +27 -29
- package/app/components/pipeline/PipelinePicker.vue +10 -10
- package/app/components/pipeline/PipelinePreview.vue +10 -10
- package/app/components/pipeline/PipelineProgress.vue +64 -67
- package/app/components/prReview/PrReviewPhaseBadge.vue +7 -7
- package/app/components/prReview/PrReviewWindow.vue +75 -77
- package/app/components/providers/AiPresetMismatchDialog.vue +5 -5
- package/app/components/providers/AiProviderOnboardingModal.vue +9 -9
- package/app/components/providers/ApiKeysSection.vue +13 -13
- package/app/components/providers/PersonalCredentialModal.vue +2 -2
- package/app/components/providers/PersonalSubscriptionSection.vue +10 -10
- package/app/components/providers/SignInRequiredNotice.vue +1 -1
- package/app/components/providers/VendorCredentialsModal.vue +10 -10
- package/app/components/provisioning/ProvisioningLogsDrawer.vue +13 -13
- package/app/components/ralph/RalphLoopResultView.vue +28 -30
- package/app/components/recurring/RecurrenceEditor.vue +2 -2
- package/app/components/requirements/RequirementsReviewWindow.vue +51 -58
- package/app/components/riskPolicy/RiskPolicyPicker.vue +12 -15
- package/app/components/riskPolicy/RiskPolicyPreview.vue +14 -14
- package/app/components/sandbox/SandboxPanel.vue +58 -59
- package/app/components/settings/AccountSettingsPanel.vue +1 -1
- package/app/components/settings/ApiTokensPanel.vue +10 -10
- package/app/components/settings/BudgetSettings.vue +18 -22
- package/app/components/settings/CapabilityCredentialsPanel.vue +15 -15
- package/app/components/settings/CloudflareHandlerSection.vue +20 -20
- package/app/components/settings/ComposeEnvironmentSetupSection.vue +13 -13
- package/app/components/settings/ConnectionTestVerdict.vue +3 -3
- package/app/components/settings/ConnectionWarnings.vue +1 -1
- package/app/components/settings/ConsensusGroupsSection.vue +27 -35
- package/app/components/settings/CustomManifestTypeEditor.vue +10 -10
- package/app/components/settings/DefaultProvisionTypeSection.vue +6 -6
- package/app/components/settings/InfraHandlersConfigurator.vue +24 -22
- package/app/components/settings/InfrastructureBackendPicker.vue +6 -6
- package/app/components/settings/InfrastructureWindow.vue +5 -5
- package/app/components/settings/IssueTrackerPanel.vue +29 -23
- package/app/components/settings/KubernetesEngineForm.vue +11 -11
- package/app/components/settings/KubernetesEnvironmentForm.vue +4 -4
- package/app/components/settings/LocalContainerPoolSettings.vue +6 -11
- package/app/components/settings/LocalModelEndpointsPanel.vue +20 -18
- package/app/components/settings/McpAuthorizeScreen.vue +13 -15
- package/app/components/settings/McpOAuthCallbackScreen.vue +16 -10
- package/app/components/settings/MergeClassRulesEditor.vue +6 -9
- package/app/components/settings/MergeRolePolicyEditor.vue +16 -16
- package/app/components/settings/ModelConfigurationPanel.vue +23 -30
- package/app/components/settings/ModelPresetHealthModal.vue +15 -13
- package/app/components/settings/ObservabilityConnectionPanel.vue +4 -4
- package/app/components/settings/OpenRouterCatalogPanel.vue +26 -19
- package/app/components/settings/PackageRegistriesPanel.vue +8 -8
- package/app/components/settings/ProviderConnectionTab.vue +8 -11
- package/app/components/settings/ProviderManifestEditor.vue +9 -9
- package/app/components/settings/ProviderPreferenceEditor.vue +8 -8
- package/app/components/settings/RiskPolicyCreateForm.vue +10 -10
- package/app/components/settings/RiskPolicyEditorRow.vue +14 -14
- package/app/components/settings/RiskPolicyHealthModal.vue +15 -13
- package/app/components/settings/RiskPolicyInheritedRow.vue +1 -1
- package/app/components/settings/RiskPolicyPanel.vue +10 -15
- package/app/components/settings/ServiceFragmentDefaultsPanel.vue +7 -7
- package/app/components/settings/SharedStacksPanel.vue +9 -12
- package/app/components/settings/TaskSourceCard.vue +4 -4
- package/app/components/settings/TaskTypeSuppressionsPanel.vue +6 -6
- package/app/components/settings/ToolServerChecklist.vue +36 -29
- package/app/components/settings/UsageSettings.vue +15 -15
- package/app/components/settings/UserSecretsSection.vue +9 -12
- package/app/components/settings/WorkspaceMetadataSettings.vue +5 -5
- package/app/components/settings/WorkspaceSettingsPanel.vue +47 -47
- package/app/components/skills/ReviewSkillQueue.vue +10 -10
- package/app/components/skills/SkillLibraryManager.vue +23 -20
- package/app/components/slack/SlackPanel.vue +13 -17
- package/app/components/spec/ServiceSpecWindow.vue +45 -42
- package/app/components/tasks/BugHuntModal.vue +24 -27
- package/app/components/tasks/ContextIssuePicker.vue +11 -11
- package/app/components/tasks/TaskContextIssues.vue +3 -3
- package/app/components/tasks/TaskImportModal.vue +7 -7
- package/app/components/tasks/TaskSourceConnectModal.vue +10 -8
- package/app/components/testing/TestReportWindow.vue +99 -82
- package/app/components/theme/ThemeImportModal.vue +115 -0
- package/app/components/tutorial/TutorialCatalogue.vue +9 -9
- package/app/components/tutorial/TutorialNudge.vue +5 -5
- package/app/components/tutorial/TutorialOverlay.vue +12 -12
- package/app/components/tutorial/TutorialPrompt.vue +6 -9
- package/app/components/vcs/GitLabConnect.vue +4 -4
- package/app/components/vcs/VcsConnectSurfaces.vue +2 -2
- package/app/components/visualConfirm/VisualConfirmationWindow.vue +36 -36
- package/app/composables/api/client.ts +6 -1
- package/app/composables/usePipelineErrorToast.ts +17 -0
- package/app/modular/agent-kinds.ts +24 -0
- package/app/pages/index.vue +5 -5
- package/app/plugins/theme.client.ts +125 -0
- package/app/spa-loading-template.html +52 -14
- package/app/stores/agents.ts +1 -1
- package/app/stores/theme.spec.ts +56 -0
- package/app/stores/theme.ts +87 -0
- package/app/types/domain.ts +19 -0
- package/app/types/execution.ts +4 -0
- package/app/utils/agentOutput.ts +1 -1
- package/app/utils/binaryOutput.ts +6 -6
- package/app/utils/bootstrapSteps.ts +14 -14
- package/app/utils/catalog.ts +87 -83
- package/app/utils/colorTint.ts +10 -0
- package/app/utils/failureKinds.ts +1 -0
- package/app/utils/observability.ts +3 -3
- package/app/utils/pipelineRender.ts +13 -17
- package/app/utils/swimlanes.ts +4 -4
- package/app/utils/theme/bootPalette.spec.ts +54 -0
- package/app/utils/theme/bootPalette.ts +108 -0
- package/app/utils/theme/builtins.spec.ts +38 -0
- package/app/utils/theme/builtins.ts +55 -0
- package/app/utils/theme/css.ts +162 -0
- package/app/utils/theme/doc.ts +353 -0
- package/app/utils/theme/link.ts +93 -0
- package/app/utils/theme/presets.ts +509 -0
- package/app/utils/theme/theme.spec.ts +224 -0
- package/i18n/locales/de.json +61 -4
- package/i18n/locales/en.json +70 -4
- package/i18n/locales/es.json +61 -4
- package/i18n/locales/fr.json +61 -4
- package/i18n/locales/he.json +61 -4
- package/i18n/locales/it.json +61 -4
- package/i18n/locales/ja.json +61 -4
- package/i18n/locales/pl.json +61 -4
- package/i18n/locales/tr.json +61 -4
- package/i18n/locales/uk.json +61 -4
- package/nuxt.config.ts +37 -11
- package/package.json +10 -9
|
@@ -35,12 +35,12 @@ function when(ms: number): string {
|
|
|
35
35
|
return d(new Date(ms), 'long')
|
|
36
36
|
}
|
|
37
37
|
function gradeTone(g: KaizenGrading): string {
|
|
38
|
-
if (g.status === 'failed') return 'text-
|
|
39
|
-
if (g.grade == null) return 'text-
|
|
40
|
-
if (g.grade >= 5) return 'text-
|
|
41
|
-
if (g.grade >= 4) return 'text-lime
|
|
42
|
-
if (g.grade === 3) return 'text-
|
|
43
|
-
return 'text-
|
|
38
|
+
if (g.status === 'failed') return 'text-dimmed'
|
|
39
|
+
if (g.grade == null) return 'text-muted'
|
|
40
|
+
if (g.grade >= 5) return 'text-app-success-400'
|
|
41
|
+
if (g.grade >= 4) return 'text-app-hue-lime'
|
|
42
|
+
if (g.grade === 3) return 'text-app-warning-400'
|
|
43
|
+
return 'text-app-error-400'
|
|
44
44
|
}
|
|
45
45
|
function statusLabel(g: KaizenGrading): string {
|
|
46
46
|
if (g.status === 'scheduled') return t('kaizen.status.scheduled')
|
|
@@ -55,17 +55,21 @@ function statusLabel(g: KaizenGrading): string {
|
|
|
55
55
|
<Transition name="kz-fade">
|
|
56
56
|
<div
|
|
57
57
|
v-if="open"
|
|
58
|
-
class="fixed inset-0 z-[60] flex flex-col bg-
|
|
58
|
+
class="fixed inset-0 z-[60] flex flex-col bg-app-950/96 backdrop-blur-sm"
|
|
59
59
|
role="dialog"
|
|
60
60
|
aria-modal="true"
|
|
61
61
|
>
|
|
62
|
-
<header class="flex items-center gap-3 border-b border-
|
|
63
|
-
<div
|
|
64
|
-
|
|
62
|
+
<header class="flex items-center gap-3 border-b border-default px-6 py-4">
|
|
63
|
+
<div
|
|
64
|
+
class="flex h-9 w-9 shrink-0 items-center justify-center rounded-lg bg-app-hue-teal/15"
|
|
65
|
+
>
|
|
66
|
+
<UIcon name="i-lucide-sparkles" class="h-5 w-5 text-app-hue-teal" />
|
|
65
67
|
</div>
|
|
66
68
|
<div class="min-w-0">
|
|
67
|
-
<h1 class="truncate text-base font-semibold text-
|
|
68
|
-
|
|
69
|
+
<h1 class="truncate text-base font-semibold text-highlighted">
|
|
70
|
+
{{ t('kaizen.title') }}
|
|
71
|
+
</h1>
|
|
72
|
+
<p class="truncate text-xs text-dimmed">
|
|
69
73
|
{{ t('kaizen.subtitle') }}
|
|
70
74
|
</p>
|
|
71
75
|
</div>
|
|
@@ -88,7 +92,7 @@ function statusLabel(g: KaizenGrading): string {
|
|
|
88
92
|
|
|
89
93
|
<div
|
|
90
94
|
v-if="kaizen.available === false"
|
|
91
|
-
class="flex flex-1 items-center justify-center text-sm text-
|
|
95
|
+
class="flex flex-1 items-center justify-center text-sm text-dimmed"
|
|
92
96
|
>
|
|
93
97
|
{{ t('kaizen.notConfigured') }}
|
|
94
98
|
</div>
|
|
@@ -96,21 +100,21 @@ function statusLabel(g: KaizenGrading): string {
|
|
|
96
100
|
<div v-else class="grid flex-1 grid-cols-1 gap-6 overflow-auto p-6 lg:grid-cols-3">
|
|
97
101
|
<!-- Verified combos -->
|
|
98
102
|
<section class="lg:col-span-1">
|
|
99
|
-
<h2 class="mb-2 flex items-center gap-2 text-sm font-semibold text-
|
|
100
|
-
<UIcon name="i-lucide-badge-check" class="h-4 w-4 text-
|
|
103
|
+
<h2 class="mb-2 flex items-center gap-2 text-sm font-semibold text-default">
|
|
104
|
+
<UIcon name="i-lucide-badge-check" class="h-4 w-4 text-app-success-400" />
|
|
101
105
|
{{ t('kaizen.verifiedCombos.title') }}
|
|
102
|
-
<span class="text-xs font-normal text-
|
|
106
|
+
<span class="text-xs font-normal text-dimmed">{{
|
|
103
107
|
t('kaizen.verifiedCombos.count', { count: kaizen.verifiedCount })
|
|
104
108
|
}}</span>
|
|
105
109
|
</h2>
|
|
106
|
-
<p class="mb-3 text-[11px] text-
|
|
110
|
+
<p class="mb-3 text-[11px] text-dimmed">
|
|
107
111
|
{{ t('kaizen.verifiedCombos.hint') }}
|
|
108
112
|
</p>
|
|
109
113
|
<ul class="space-y-2">
|
|
110
114
|
<li
|
|
111
115
|
v-for="c in kaizen.verified"
|
|
112
116
|
:key="c.comboKey"
|
|
113
|
-
class="rounded-lg border border-
|
|
117
|
+
class="rounded-lg border border-default bg-default/40 p-2.5"
|
|
114
118
|
>
|
|
115
119
|
<div class="flex items-center gap-2">
|
|
116
120
|
<UIcon
|
|
@@ -118,19 +122,19 @@ function statusLabel(g: KaizenGrading): string {
|
|
|
118
122
|
class="h-3.5 w-3.5 shrink-0"
|
|
119
123
|
:style="{ color: meta(c.agentKind).color }"
|
|
120
124
|
/>
|
|
121
|
-
<span class="text-xs font-medium text-
|
|
125
|
+
<span class="text-xs font-medium text-default">{{
|
|
122
126
|
meta(c.agentKind).label
|
|
123
127
|
}}</span>
|
|
124
128
|
<UIcon
|
|
125
129
|
v-if="c.verified"
|
|
126
130
|
name="i-lucide-badge-check"
|
|
127
|
-
class="ms-auto h-3.5 w-3.5 text-
|
|
131
|
+
class="ms-auto h-3.5 w-3.5 text-app-success-400"
|
|
128
132
|
/>
|
|
129
|
-
<span v-else class="ms-auto text-[11px] text-
|
|
133
|
+
<span v-else class="ms-auto text-[11px] text-dimmed">
|
|
130
134
|
{{ t('kaizen.verifiedCombos.progress', { count: c.consecutiveHighGrades }) }}
|
|
131
135
|
</span>
|
|
132
136
|
</div>
|
|
133
|
-
<div class="mt-1 truncate text-[11px] text-
|
|
137
|
+
<div class="mt-1 truncate text-[11px] text-dimmed" :title="c.model">
|
|
134
138
|
{{
|
|
135
139
|
t('kaizen.verifiedCombos.modelPrompt', {
|
|
136
140
|
model: c.model,
|
|
@@ -139,7 +143,7 @@ function statusLabel(g: KaizenGrading): string {
|
|
|
139
143
|
}}
|
|
140
144
|
</div>
|
|
141
145
|
</li>
|
|
142
|
-
<li v-if="kaizen.verified.length === 0" class="text-xs text-
|
|
146
|
+
<li v-if="kaizen.verified.length === 0" class="text-xs text-app-600">
|
|
143
147
|
{{ t('kaizen.verifiedCombos.empty') }}
|
|
144
148
|
</li>
|
|
145
149
|
</ul>
|
|
@@ -147,13 +151,13 @@ function statusLabel(g: KaizenGrading): string {
|
|
|
147
151
|
|
|
148
152
|
<!-- Grading history -->
|
|
149
153
|
<section class="lg:col-span-2">
|
|
150
|
-
<h2 class="mb-2 flex items-center gap-2 text-sm font-semibold text-
|
|
151
|
-
<UIcon name="i-lucide-history" class="h-4 w-4 text-teal
|
|
154
|
+
<h2 class="mb-2 flex items-center gap-2 text-sm font-semibold text-default">
|
|
155
|
+
<UIcon name="i-lucide-history" class="h-4 w-4 text-app-hue-teal" />
|
|
152
156
|
{{ t('kaizen.history.title') }}
|
|
153
157
|
</h2>
|
|
154
|
-
<div class="overflow-hidden rounded-lg border border-
|
|
158
|
+
<div class="overflow-hidden rounded-lg border border-default">
|
|
155
159
|
<table class="w-full text-start text-xs">
|
|
156
|
-
<thead class="bg-
|
|
160
|
+
<thead class="bg-default/60 text-[11px] uppercase tracking-wide text-dimmed">
|
|
157
161
|
<tr>
|
|
158
162
|
<th class="px-3 py-2 font-medium">{{ t('kaizen.history.col.when') }}</th>
|
|
159
163
|
<th class="px-3 py-2 font-medium">{{ t('kaizen.history.col.agent') }}</th>
|
|
@@ -164,9 +168,9 @@ function statusLabel(g: KaizenGrading): string {
|
|
|
164
168
|
</th>
|
|
165
169
|
</tr>
|
|
166
170
|
</thead>
|
|
167
|
-
<tbody class="divide-y divide-
|
|
171
|
+
<tbody class="divide-y divide-default/70">
|
|
168
172
|
<tr v-for="g in kaizen.history" :key="g.id" class="align-top">
|
|
169
|
-
<td class="whitespace-nowrap px-3 py-2 text-
|
|
173
|
+
<td class="whitespace-nowrap px-3 py-2 text-dimmed">
|
|
170
174
|
{{ when(g.createdAt) }}
|
|
171
175
|
</td>
|
|
172
176
|
<td class="px-3 py-2">
|
|
@@ -176,28 +180,28 @@ function statusLabel(g: KaizenGrading): string {
|
|
|
176
180
|
class="h-3.5 w-3.5"
|
|
177
181
|
:style="{ color: meta(g.agentKind).color }"
|
|
178
182
|
/>
|
|
179
|
-
<span class="text-
|
|
180
|
-
<span class="text-
|
|
183
|
+
<span class="text-default">{{ meta(g.agentKind).label }}</span>
|
|
184
|
+
<span class="text-app-600">{{
|
|
181
185
|
t('kaizen.promptVersion', { version: g.promptVersion })
|
|
182
186
|
}}</span>
|
|
183
187
|
</span>
|
|
184
188
|
</td>
|
|
185
|
-
<td class="max-w-[12rem] truncate px-3 py-2 text-
|
|
189
|
+
<td class="max-w-[12rem] truncate px-3 py-2 text-muted" :title="g.model">
|
|
186
190
|
{{ g.model }}
|
|
187
191
|
</td>
|
|
188
192
|
<td class="whitespace-nowrap px-3 py-2 font-semibold" :class="gradeTone(g)">
|
|
189
193
|
{{ statusLabel(g) }}
|
|
190
194
|
</td>
|
|
191
|
-
<td class="px-3 py-2 text-
|
|
195
|
+
<td class="px-3 py-2 text-muted">
|
|
192
196
|
<ul v-if="g.recommendations.length" class="list-disc space-y-0.5 ps-4">
|
|
193
197
|
<li v-for="(r, i) in g.recommendations" :key="i">{{ r }}</li>
|
|
194
198
|
</ul>
|
|
195
|
-
<span v-else-if="g.status === 'complete'" class="text-
|
|
196
|
-
<span v-else-if="g.error" class="text-
|
|
199
|
+
<span v-else-if="g.status === 'complete'" class="text-app-600">—</span>
|
|
200
|
+
<span v-else-if="g.error" class="text-app-error-400/80">{{ g.error }}</span>
|
|
197
201
|
</td>
|
|
198
202
|
</tr>
|
|
199
203
|
<tr v-if="kaizen.history.length === 0">
|
|
200
|
-
<td colspan="5" class="px-3 py-6 text-center text-
|
|
204
|
+
<td colspan="5" class="px-3 py-6 text-center text-app-600">
|
|
201
205
|
{{ t('kaizen.history.empty') }}
|
|
202
206
|
</td>
|
|
203
207
|
</tr>
|
|
@@ -34,31 +34,31 @@ watch(
|
|
|
34
34
|
|
|
35
35
|
const tone = computed(() => {
|
|
36
36
|
const g = grading.value
|
|
37
|
-
if (!g || g.grade == null) return 'text-
|
|
38
|
-
if (g.grade >= 5) return 'text-
|
|
39
|
-
if (g.grade >= 4) return 'text-lime
|
|
40
|
-
if (g.grade === 3) return 'text-
|
|
41
|
-
return 'text-
|
|
37
|
+
if (!g || g.grade == null) return 'text-muted'
|
|
38
|
+
if (g.grade >= 5) return 'text-app-success-400'
|
|
39
|
+
if (g.grade >= 4) return 'text-app-hue-lime'
|
|
40
|
+
if (g.grade === 3) return 'text-app-warning-400'
|
|
41
|
+
return 'text-app-error-400'
|
|
42
42
|
})
|
|
43
43
|
</script>
|
|
44
44
|
|
|
45
45
|
<template>
|
|
46
|
-
<section v-if="grading" class="rounded-xl border border-
|
|
46
|
+
<section v-if="grading" class="rounded-xl border border-default bg-default/50 p-4">
|
|
47
47
|
<div class="flex items-center gap-2">
|
|
48
|
-
<UIcon name="i-lucide-sparkles" class="h-4 w-4 text-teal
|
|
49
|
-
<h3 class="text-sm font-semibold text-
|
|
48
|
+
<UIcon name="i-lucide-sparkles" class="h-4 w-4 text-app-hue-teal" />
|
|
49
|
+
<h3 class="text-sm font-semibold text-default">{{ t('kaizen.grading.title') }}</h3>
|
|
50
50
|
<span class="ms-auto flex items-center gap-1.5 text-xs">
|
|
51
51
|
<template v-if="grading.status === 'scheduled'">
|
|
52
|
-
<UIcon name="i-lucide-clock" class="h-3.5 w-3.5 text-
|
|
53
|
-
<span class="text-
|
|
52
|
+
<UIcon name="i-lucide-clock" class="h-3.5 w-3.5 text-dimmed" />
|
|
53
|
+
<span class="text-muted">{{ t('kaizen.status.scheduled') }}</span>
|
|
54
54
|
</template>
|
|
55
55
|
<template v-else-if="grading.status === 'running'">
|
|
56
|
-
<UIcon name="i-lucide-loader-circle" class="h-3.5 w-3.5 animate-spin text-teal
|
|
57
|
-
<span class="text-teal
|
|
56
|
+
<UIcon name="i-lucide-loader-circle" class="h-3.5 w-3.5 animate-spin text-app-hue-teal" />
|
|
57
|
+
<span class="text-app-hue-teal">{{ t('kaizen.status.grading') }}</span>
|
|
58
58
|
</template>
|
|
59
59
|
<template v-else-if="grading.status === 'failed'">
|
|
60
|
-
<UIcon name="i-lucide-circle-alert" class="h-3.5 w-3.5 text-
|
|
61
|
-
<span class="text-
|
|
60
|
+
<UIcon name="i-lucide-circle-alert" class="h-3.5 w-3.5 text-app-error-400" />
|
|
61
|
+
<span class="text-app-error-400">{{ t('kaizen.status.failed') }}</span>
|
|
62
62
|
</template>
|
|
63
63
|
<template v-else>
|
|
64
64
|
<span class="font-semibold" :class="tone">{{
|
|
@@ -68,29 +68,29 @@ const tone = computed(() => {
|
|
|
68
68
|
</span>
|
|
69
69
|
</div>
|
|
70
70
|
|
|
71
|
-
<p v-if="grading.status === 'scheduled'" class="mt-2 text-[11px] text-
|
|
71
|
+
<p v-if="grading.status === 'scheduled'" class="mt-2 text-[11px] text-dimmed">
|
|
72
72
|
{{ t('kaizen.scheduledHint') }}
|
|
73
73
|
</p>
|
|
74
74
|
|
|
75
75
|
<template v-else-if="grading.status === 'complete'">
|
|
76
|
-
<p v-if="grading.summary" class="mt-2 text-xs text-
|
|
76
|
+
<p v-if="grading.summary" class="mt-2 text-xs text-toned">{{ grading.summary }}</p>
|
|
77
77
|
<div v-if="grading.recommendations.length" class="mt-2">
|
|
78
|
-
<p class="text-[11px] font-medium uppercase tracking-wide text-
|
|
78
|
+
<p class="text-[11px] font-medium uppercase tracking-wide text-dimmed">
|
|
79
79
|
{{ t('kaizen.recommendations') }}
|
|
80
80
|
</p>
|
|
81
|
-
<ul class="mt-1 list-disc space-y-0.5 ps-4 text-xs text-
|
|
81
|
+
<ul class="mt-1 list-disc space-y-0.5 ps-4 text-xs text-toned">
|
|
82
82
|
<li v-for="(r, i) in grading.recommendations" :key="i">{{ r }}</li>
|
|
83
83
|
</ul>
|
|
84
84
|
</div>
|
|
85
|
-
<p v-else class="mt-2 text-[11px] text-
|
|
85
|
+
<p v-else class="mt-2 text-[11px] text-app-success-400/80">
|
|
86
86
|
{{ t('kaizen.noImprovements') }}
|
|
87
87
|
</p>
|
|
88
|
-
<p v-if="grading.graderModel" class="mt-2 text-[10px] text-
|
|
88
|
+
<p v-if="grading.graderModel" class="mt-2 text-[10px] text-app-600">
|
|
89
89
|
{{ t('kaizen.gradedBy', { model: grading.graderModel }) }}
|
|
90
90
|
</p>
|
|
91
91
|
</template>
|
|
92
92
|
|
|
93
|
-
<p v-else-if="grading.status === 'failed'" class="mt-2 text-[11px] text-
|
|
93
|
+
<p v-else-if="grading.status === 'failed'" class="mt-2 text-[11px] text-app-error-400/80">
|
|
94
94
|
{{ grading.error ?? t('kaizen.failedFallback') }}
|
|
95
95
|
</p>
|
|
96
96
|
</section>
|
|
@@ -85,11 +85,11 @@ function timestamp(at: number): string {
|
|
|
85
85
|
</script>
|
|
86
86
|
|
|
87
87
|
<template>
|
|
88
|
-
<section class="rounded-md border border-
|
|
88
|
+
<section class="rounded-md border border-default bg-elevated/40 p-4">
|
|
89
89
|
<div class="mb-3 flex items-start justify-between gap-3">
|
|
90
90
|
<div>
|
|
91
|
-
<h3 class="font-semibold text-
|
|
92
|
-
<p class="mt-1 text-
|
|
91
|
+
<h3 class="font-semibold text-highlighted">{{ t('layout.auditLog.title') }}</h3>
|
|
92
|
+
<p class="mt-1 text-muted">{{ t('layout.auditLog.description') }}</p>
|
|
93
93
|
</div>
|
|
94
94
|
<UButton
|
|
95
95
|
size="xs"
|
|
@@ -104,12 +104,12 @@ function timestamp(at: number): string {
|
|
|
104
104
|
</div>
|
|
105
105
|
|
|
106
106
|
<!-- A failed load is NOT an empty log; it says so and offers the retry. -->
|
|
107
|
-
<p v-if="loadError" class="text-
|
|
107
|
+
<p v-if="loadError" class="text-app-error-400" data-testid="audit-log-error">
|
|
108
108
|
{{ t('layout.auditLog.errors.load') }}
|
|
109
|
-
<span class="text-
|
|
109
|
+
<span class="text-muted">{{ loadError }}</span>
|
|
110
110
|
</p>
|
|
111
111
|
|
|
112
|
-
<p v-else-if="events.length === 0 && !loading" class="text-
|
|
112
|
+
<p v-else-if="events.length === 0 && !loading" class="text-muted">
|
|
113
113
|
{{ t('layout.auditLog.empty') }}
|
|
114
114
|
</p>
|
|
115
115
|
|
|
@@ -117,13 +117,13 @@ function timestamp(at: number): string {
|
|
|
117
117
|
<li
|
|
118
118
|
v-for="event in events"
|
|
119
119
|
:key="event.id"
|
|
120
|
-
class="rounded border border-
|
|
120
|
+
class="rounded border border-default bg-default/40 px-3 py-2"
|
|
121
121
|
>
|
|
122
122
|
<div class="flex flex-wrap items-baseline gap-x-2">
|
|
123
|
-
<span class="font-medium text-
|
|
124
|
-
<span class="text-
|
|
123
|
+
<span class="font-medium text-highlighted">{{ actor(event) }}</span>
|
|
124
|
+
<span class="text-toned">{{ describe(event) }}</span>
|
|
125
125
|
</div>
|
|
126
|
-
<div class="mt-1 text-xs text-
|
|
126
|
+
<div class="mt-1 text-xs text-dimmed">{{ timestamp(event.at) }}</div>
|
|
127
127
|
</li>
|
|
128
128
|
</ol>
|
|
129
129
|
|
|
@@ -434,8 +434,8 @@ async function clearWeb() {
|
|
|
434
434
|
<template>
|
|
435
435
|
<div v-if="store.available !== false" class="space-y-6">
|
|
436
436
|
<div>
|
|
437
|
-
<h3 class="mb-1 font-semibold text-
|
|
438
|
-
<p class="text-[11px] text-
|
|
437
|
+
<h3 class="mb-1 font-semibold text-highlighted">{{ t('layout.accountDeployment.title') }}</h3>
|
|
438
|
+
<p class="text-[11px] text-muted">
|
|
439
439
|
{{ t('layout.accountDeployment.intro') }}
|
|
440
440
|
</p>
|
|
441
441
|
</div>
|
|
@@ -443,7 +443,7 @@ async function clearWeb() {
|
|
|
443
443
|
<!-- Slack app OAuth -->
|
|
444
444
|
<section class="space-y-2">
|
|
445
445
|
<div class="flex items-center gap-2">
|
|
446
|
-
<h4 class="text-sm font-semibold text-
|
|
446
|
+
<h4 class="text-sm font-semibold text-default">
|
|
447
447
|
{{ t('layout.accountDeployment.slack.title') }}
|
|
448
448
|
</h4>
|
|
449
449
|
<UBadge
|
|
@@ -458,7 +458,7 @@ async function clearWeb() {
|
|
|
458
458
|
}}
|
|
459
459
|
</UBadge>
|
|
460
460
|
</div>
|
|
461
|
-
<p class="text-[11px] text-
|
|
461
|
+
<p class="text-[11px] text-muted">
|
|
462
462
|
{{ t('layout.accountDeployment.slack.description') }}
|
|
463
463
|
</p>
|
|
464
464
|
<div class="grid grid-cols-1 gap-2 sm:grid-cols-3">
|
|
@@ -502,9 +502,9 @@ async function clearWeb() {
|
|
|
502
502
|
</section>
|
|
503
503
|
|
|
504
504
|
<!-- Linear app OAuth -->
|
|
505
|
-
<section class="space-y-2 border-t border-
|
|
505
|
+
<section class="space-y-2 border-t border-default pt-6">
|
|
506
506
|
<div class="flex items-center gap-2">
|
|
507
|
-
<h4 class="text-sm font-semibold text-
|
|
507
|
+
<h4 class="text-sm font-semibold text-default">
|
|
508
508
|
{{ t('layout.accountDeployment.linear.title') }}
|
|
509
509
|
</h4>
|
|
510
510
|
<UBadge
|
|
@@ -519,7 +519,7 @@ async function clearWeb() {
|
|
|
519
519
|
}}
|
|
520
520
|
</UBadge>
|
|
521
521
|
</div>
|
|
522
|
-
<p class="text-[11px] text-
|
|
522
|
+
<p class="text-[11px] text-muted">
|
|
523
523
|
{{ t('layout.accountDeployment.linear.description') }}
|
|
524
524
|
</p>
|
|
525
525
|
<div class="grid grid-cols-1 gap-2 sm:grid-cols-3">
|
|
@@ -563,9 +563,9 @@ async function clearWeb() {
|
|
|
563
563
|
</section>
|
|
564
564
|
|
|
565
565
|
<!-- Figma app OAuth (the document source's designer-doable connect) -->
|
|
566
|
-
<section class="space-y-2 border-t border-
|
|
566
|
+
<section class="space-y-2 border-t border-default pt-6">
|
|
567
567
|
<div class="flex items-center gap-2">
|
|
568
|
-
<h4 class="text-sm font-semibold text-
|
|
568
|
+
<h4 class="text-sm font-semibold text-default">
|
|
569
569
|
{{ t('layout.accountDeployment.figma.title') }}
|
|
570
570
|
</h4>
|
|
571
571
|
<UBadge
|
|
@@ -580,7 +580,7 @@ async function clearWeb() {
|
|
|
580
580
|
}}
|
|
581
581
|
</UBadge>
|
|
582
582
|
</div>
|
|
583
|
-
<p class="text-[11px] text-
|
|
583
|
+
<p class="text-[11px] text-muted">
|
|
584
584
|
{{ t('layout.accountDeployment.figma.description') }}
|
|
585
585
|
</p>
|
|
586
586
|
<div class="grid grid-cols-1 gap-2 sm:grid-cols-3">
|
|
@@ -624,9 +624,9 @@ async function clearWeb() {
|
|
|
624
624
|
</section>
|
|
625
625
|
|
|
626
626
|
<!-- Web search keys -->
|
|
627
|
-
<section class="space-y-2 border-t border-
|
|
627
|
+
<section class="space-y-2 border-t border-default pt-6">
|
|
628
628
|
<div class="flex items-center gap-2">
|
|
629
|
-
<h4 class="text-sm font-semibold text-
|
|
629
|
+
<h4 class="text-sm font-semibold text-default">
|
|
630
630
|
{{ t('layout.accountDeployment.web.title') }}
|
|
631
631
|
</h4>
|
|
632
632
|
<UBadge :color="summary?.webSearch ? 'success' : 'neutral'" variant="subtle" size="xs">
|
|
@@ -637,7 +637,7 @@ async function clearWeb() {
|
|
|
637
637
|
}}
|
|
638
638
|
</UBadge>
|
|
639
639
|
</div>
|
|
640
|
-
<p class="text-[11px] text-
|
|
640
|
+
<p class="text-[11px] text-muted">
|
|
641
641
|
{{ t('layout.accountDeployment.web.description') }}
|
|
642
642
|
</p>
|
|
643
643
|
<div class="grid grid-cols-1 gap-2 sm:grid-cols-3">
|
|
@@ -685,10 +685,10 @@ async function clearWeb() {
|
|
|
685
685
|
v-if="storageCapability"
|
|
686
686
|
id="content-storage"
|
|
687
687
|
ref="storageSection"
|
|
688
|
-
class="space-y-2 border-t border-
|
|
688
|
+
class="space-y-2 border-t border-default pt-6"
|
|
689
689
|
>
|
|
690
690
|
<div class="flex items-center gap-2">
|
|
691
|
-
<h4 class="text-sm font-semibold text-
|
|
691
|
+
<h4 class="text-sm font-semibold text-default">
|
|
692
692
|
{{ t('layout.accountDeployment.contentStorage.title') }}
|
|
693
693
|
</h4>
|
|
694
694
|
<UBadge
|
|
@@ -706,16 +706,16 @@ async function clearWeb() {
|
|
|
706
706
|
}}
|
|
707
707
|
</UBadge>
|
|
708
708
|
</div>
|
|
709
|
-
<p class="text-[11px] text-
|
|
709
|
+
<p class="text-[11px] text-muted">
|
|
710
710
|
{{ t('layout.accountDeployment.contentStorage.description') }}
|
|
711
711
|
</p>
|
|
712
712
|
<div class="grid grid-cols-1 gap-2 sm:grid-cols-2">
|
|
713
713
|
<USelect v-model="csBackend" :items="backendItems" value-key="value" size="sm" />
|
|
714
714
|
</div>
|
|
715
|
-
<p v-if="selectedCustomStore?.summary" class="text-[11px] text-
|
|
715
|
+
<p v-if="selectedCustomStore?.summary" class="text-[11px] text-muted">
|
|
716
716
|
{{ selectedCustomStore.summary }}
|
|
717
717
|
</p>
|
|
718
|
-
<p v-if="unregisteredStoreId" class="text-[11px] text-
|
|
718
|
+
<p v-if="unregisteredStoreId" class="text-[11px] text-app-warning-400">
|
|
719
719
|
{{
|
|
720
720
|
t('layout.accountDeployment.contentStorage.unregisteredStoreWarning', {
|
|
721
721
|
store: unregisteredStoreId,
|
|
@@ -762,7 +762,7 @@ async function clearWeb() {
|
|
|
762
762
|
size="sm"
|
|
763
763
|
/>
|
|
764
764
|
<div class="flex items-center gap-2">
|
|
765
|
-
<span class="text-[11px] text-
|
|
765
|
+
<span class="text-[11px] text-muted">
|
|
766
766
|
{{ t('layout.accountDeployment.contentStorage.accessKeys') }}
|
|
767
767
|
</span>
|
|
768
768
|
<UBadge
|
|
@@ -789,7 +789,7 @@ async function clearWeb() {
|
|
|
789
789
|
size="sm"
|
|
790
790
|
/>
|
|
791
791
|
</div>
|
|
792
|
-
<p class="text-[11px] text-
|
|
792
|
+
<p class="text-[11px] text-muted">
|
|
793
793
|
{{ t('layout.accountDeployment.contentStorage.keysHint') }}
|
|
794
794
|
</p>
|
|
795
795
|
</template>
|
|
@@ -144,10 +144,10 @@ const faults = computed(() => failureKindRuleFaults(rules.value))
|
|
|
144
144
|
|
|
145
145
|
<template>
|
|
146
146
|
<div class="space-y-2" data-testid="platform-alert-failure-kinds">
|
|
147
|
-
<label class="text-[11px] font-medium text-
|
|
147
|
+
<label class="text-[11px] font-medium text-toned">
|
|
148
148
|
{{ t('settings.platformAlerts.failureKinds.label') }}
|
|
149
149
|
</label>
|
|
150
|
-
<p class="text-[11px] text-
|
|
150
|
+
<p class="text-[11px] text-muted">
|
|
151
151
|
{{ t('settings.platformAlerts.failureKinds.description') }}
|
|
152
152
|
</p>
|
|
153
153
|
|
|
@@ -159,7 +159,7 @@ const faults = computed(() => failureKindRuleFaults(rules.value))
|
|
|
159
159
|
data-testid="platform-alert-failure-kinds-override"
|
|
160
160
|
@update:model-value="setOverriding(!!$event)"
|
|
161
161
|
/>
|
|
162
|
-
<p class="ps-6 text-[11px] text-
|
|
162
|
+
<p class="ps-6 text-[11px] text-muted">
|
|
163
163
|
{{ t('settings.platformAlerts.failureKinds.overrideHint') }}
|
|
164
164
|
</p>
|
|
165
165
|
</div>
|
|
@@ -167,7 +167,7 @@ const faults = computed(() => failureKindRuleFaults(rules.value))
|
|
|
167
167
|
<template v-if="overriding">
|
|
168
168
|
<p
|
|
169
169
|
v-if="rules.length === 0"
|
|
170
|
-
class="text-[11px] text-
|
|
170
|
+
class="text-[11px] text-dimmed"
|
|
171
171
|
data-testid="platform-alert-failure-kinds-empty"
|
|
172
172
|
>
|
|
173
173
|
{{ t('settings.platformAlerts.failureKinds.empty') }}
|
|
@@ -180,7 +180,7 @@ const faults = computed(() => failureKindRuleFaults(rules.value))
|
|
|
180
180
|
:data-testid="`platform-alert-failure-kind-row-${index}`"
|
|
181
181
|
>
|
|
182
182
|
<div class="space-y-1">
|
|
183
|
-
<label class="block text-[11px] text-
|
|
183
|
+
<label class="block text-[11px] text-toned">
|
|
184
184
|
{{ t('settings.platformAlerts.failureKinds.kindLabel') }}
|
|
185
185
|
</label>
|
|
186
186
|
<USelect
|
|
@@ -193,7 +193,7 @@ const faults = computed(() => failureKindRuleFaults(rules.value))
|
|
|
193
193
|
/>
|
|
194
194
|
</div>
|
|
195
195
|
<div class="space-y-1">
|
|
196
|
-
<label class="block text-[11px] text-
|
|
196
|
+
<label class="block text-[11px] text-toned">
|
|
197
197
|
{{ t('settings.platformAlerts.failureKinds.shareLabel') }}
|
|
198
198
|
</label>
|
|
199
199
|
<UInput
|
|
@@ -204,12 +204,12 @@ const faults = computed(() => failureKindRuleFaults(rules.value))
|
|
|
204
204
|
:data-testid="`platform-alert-failure-share-${index}`"
|
|
205
205
|
@update:model-value="setShare(index, String($event))"
|
|
206
206
|
/>
|
|
207
|
-
<p v-if="index === 0" class="text-[11px] text-
|
|
207
|
+
<p v-if="index === 0" class="text-[11px] text-dimmed">
|
|
208
208
|
{{ t('settings.platformAlerts.failureKinds.shareHint') }}
|
|
209
209
|
</p>
|
|
210
210
|
</div>
|
|
211
211
|
<div class="space-y-1">
|
|
212
|
-
<label class="block text-[11px] text-
|
|
212
|
+
<label class="block text-[11px] text-toned">
|
|
213
213
|
{{ t('settings.platformAlerts.failureKinds.minCountLabel') }}
|
|
214
214
|
</label>
|
|
215
215
|
<UInput
|
|
@@ -235,7 +235,7 @@ const faults = computed(() => failureKindRuleFaults(rules.value))
|
|
|
235
235
|
|
|
236
236
|
<p
|
|
237
237
|
v-if="faults.tooMany"
|
|
238
|
-
class="text-[11px] text-
|
|
238
|
+
class="text-[11px] text-app-warning-300"
|
|
239
239
|
data-testid="platform-alert-failure-kinds-too-many"
|
|
240
240
|
>
|
|
241
241
|
{{
|
|
@@ -244,14 +244,14 @@ const faults = computed(() => failureKindRuleFaults(rules.value))
|
|
|
244
244
|
</p>
|
|
245
245
|
<p
|
|
246
246
|
v-else-if="duplicateKinds.size > 0"
|
|
247
|
-
class="text-[11px] text-
|
|
247
|
+
class="text-[11px] text-app-warning-300"
|
|
248
248
|
data-testid="platform-alert-failure-kinds-duplicate"
|
|
249
249
|
>
|
|
250
250
|
{{ t('settings.platformAlerts.failureKinds.duplicateKind') }}
|
|
251
251
|
</p>
|
|
252
252
|
<p
|
|
253
253
|
v-else-if="faults.rows.length > 0"
|
|
254
|
-
class="text-[11px] text-
|
|
254
|
+
class="text-[11px] text-app-warning-300"
|
|
255
255
|
data-testid="platform-alert-failure-kinds-invalid"
|
|
256
256
|
>
|
|
257
257
|
{{
|
|
@@ -272,12 +272,12 @@ const faults = computed(() => failureKindRuleFaults(rules.value))
|
|
|
272
272
|
</UButton>
|
|
273
273
|
<p
|
|
274
274
|
v-if="nextFreeKind === undefined"
|
|
275
|
-
class="text-[11px] text-
|
|
275
|
+
class="text-[11px] text-dimmed"
|
|
276
276
|
data-testid="platform-alert-failure-kinds-all-covered"
|
|
277
277
|
>
|
|
278
278
|
{{ t('settings.platformAlerts.failureKinds.allKindsCovered') }}
|
|
279
279
|
</p>
|
|
280
|
-
<p class="text-[11px] text-
|
|
280
|
+
<p class="text-[11px] text-dimmed">
|
|
281
281
|
{{ t('settings.platformAlerts.failureKinds.minCountHint') }}
|
|
282
282
|
</p>
|
|
283
283
|
</template>
|
|
@@ -12,7 +12,7 @@ const { t } = useI18n()
|
|
|
12
12
|
<template>
|
|
13
13
|
<div class="space-y-6 text-sm">
|
|
14
14
|
<section>
|
|
15
|
-
<p class="mb-3 text-[11px] text-
|
|
15
|
+
<p class="mb-3 text-[11px] text-muted">
|
|
16
16
|
{{ t('layout.accountFoundational.intro') }}
|
|
17
17
|
</p>
|
|
18
18
|
<FoundationalServiceManager
|
|
@@ -22,7 +22,7 @@ const viaWorkspaceId = computed(() => {
|
|
|
22
22
|
<template>
|
|
23
23
|
<div class="space-y-6 text-sm">
|
|
24
24
|
<section>
|
|
25
|
-
<p class="mb-3 text-[11px] text-
|
|
25
|
+
<p class="mb-3 text-[11px] text-muted">
|
|
26
26
|
{{ t('layout.accountFragments.intro') }}
|
|
27
27
|
</p>
|
|
28
28
|
<FragmentLibraryManager
|
|
@@ -149,23 +149,23 @@ async function save() {
|
|
|
149
149
|
<section
|
|
150
150
|
v-if="store.available !== false"
|
|
151
151
|
data-testid="account-model-policy"
|
|
152
|
-
class="space-y-3 border-t border-
|
|
152
|
+
class="space-y-3 border-t border-default pt-6"
|
|
153
153
|
>
|
|
154
154
|
<div>
|
|
155
|
-
<h4 class="text-sm font-semibold text-
|
|
156
|
-
<p class="text-[11px] text-
|
|
155
|
+
<h4 class="text-sm font-semibold text-default">{{ t('settings.modelPolicy.title') }}</h4>
|
|
156
|
+
<p class="text-[11px] text-muted">{{ t('settings.modelPolicy.description') }}</p>
|
|
157
157
|
</div>
|
|
158
158
|
|
|
159
159
|
<!-- Region + apply-preset templates -->
|
|
160
160
|
<div class="space-y-2">
|
|
161
|
-
<label class="text-[11px] font-medium text-
|
|
161
|
+
<label class="text-[11px] font-medium text-toned">
|
|
162
162
|
{{ t('settings.modelPolicy.regionLabel') }}
|
|
163
163
|
</label>
|
|
164
164
|
<div class="grid grid-cols-1 gap-2 sm:grid-cols-2">
|
|
165
165
|
<USelect v-model="region" :items="regionItems" value-key="value" size="sm" />
|
|
166
166
|
</div>
|
|
167
167
|
<div v-if="regionPresets.length" class="flex flex-wrap items-center gap-2">
|
|
168
|
-
<span class="text-[11px] text-
|
|
168
|
+
<span class="text-[11px] text-muted">{{ t('settings.modelPolicy.applyPreset') }}</span>
|
|
169
169
|
<UButton
|
|
170
170
|
v-for="preset in regionPresets"
|
|
171
171
|
:key="preset.id"
|
|
@@ -183,7 +183,7 @@ async function save() {
|
|
|
183
183
|
|
|
184
184
|
<!-- Mode -->
|
|
185
185
|
<div class="space-y-2">
|
|
186
|
-
<label class="text-[11px] font-medium text-
|
|
186
|
+
<label class="text-[11px] font-medium text-toned">
|
|
187
187
|
{{ t('settings.modelPolicy.modeLabel') }}
|
|
188
188
|
</label>
|
|
189
189
|
<div class="grid grid-cols-1 gap-2 sm:grid-cols-2">
|
|
@@ -193,7 +193,7 @@ async function save() {
|
|
|
193
193
|
|
|
194
194
|
<!-- Families -->
|
|
195
195
|
<div v-if="mode !== 'off'" class="space-y-2">
|
|
196
|
-
<label class="text-[11px] font-medium text-
|
|
196
|
+
<label class="text-[11px] font-medium text-toned">
|
|
197
197
|
{{
|
|
198
198
|
mode === 'blocklist'
|
|
199
199
|
? t('settings.modelPolicy.familiesBlockLabel')
|
|
@@ -214,10 +214,10 @@ async function save() {
|
|
|
214
214
|
|
|
215
215
|
<!-- Trusted (residency-guaranteed) routes -->
|
|
216
216
|
<div v-if="mode !== 'off'" class="space-y-2">
|
|
217
|
-
<label class="text-[11px] font-medium text-
|
|
217
|
+
<label class="text-[11px] font-medium text-toned">
|
|
218
218
|
{{ t('settings.modelPolicy.trustedLabel') }}
|
|
219
219
|
</label>
|
|
220
|
-
<p class="text-[11px] text-
|
|
220
|
+
<p class="text-[11px] text-muted">{{ t('settings.modelPolicy.trustedHint') }}</p>
|
|
221
221
|
<div class="grid grid-cols-2 gap-1 sm:grid-cols-4">
|
|
222
222
|
<UCheckbox
|
|
223
223
|
v-for="provider in TRUSTED_PROVIDERS"
|