@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,8 +35,10 @@ const back = useIntegrationBack(open)
|
|
|
35
35
|
// that trade on somebody's behalf.
|
|
36
36
|
const RECOMMENDED_SLUGS = [
|
|
37
37
|
'anthropic/claude-fable-5.1',
|
|
38
|
+
'anthropic/claude-opus-5.5',
|
|
38
39
|
'anthropic/claude-opus-5',
|
|
39
40
|
'openai/gpt-6-astra',
|
|
41
|
+
'openai/gpt-6-sol',
|
|
40
42
|
'openai/gpt-5.6-sol',
|
|
41
43
|
'openai/gpt-5.6-terra',
|
|
42
44
|
'google/gemini-3.1-pro-preview',
|
|
@@ -44,6 +46,7 @@ const RECOMMENDED_SLUGS = [
|
|
|
44
46
|
'meta/muse-spark-1.3',
|
|
45
47
|
'deepseek/deepseek-v4.1-flash',
|
|
46
48
|
'moonshotai/kimi-k2.7-code',
|
|
49
|
+
'x-ai/grok-4.7',
|
|
47
50
|
'z-ai/glm-5.3',
|
|
48
51
|
'z-ai/glm-5.2',
|
|
49
52
|
]
|
|
@@ -221,7 +224,7 @@ function manageKeys() {
|
|
|
221
224
|
</template>
|
|
222
225
|
<template #body>
|
|
223
226
|
<div class="space-y-4">
|
|
224
|
-
<p class="text-xs text-
|
|
227
|
+
<p class="text-xs text-muted">
|
|
225
228
|
<i18n-t keypath="settings.openRouterCatalog.intro" tag="span" scope="global">
|
|
226
229
|
<template #models>
|
|
227
230
|
<strong>{{ t('settings.openRouterCatalog.introModels') }}</strong>
|
|
@@ -232,12 +235,12 @@ function manageKeys() {
|
|
|
232
235
|
<!-- Step 1: connect a key (inline) — hidden once a key is connected -->
|
|
233
236
|
<div
|
|
234
237
|
v-if="!keyConnected"
|
|
235
|
-
class="space-y-3 rounded-lg border border-
|
|
238
|
+
class="space-y-3 rounded-lg border border-muted bg-default/60 p-4"
|
|
236
239
|
>
|
|
237
|
-
<h4 class="text-xs font-semibold uppercase tracking-wide text-
|
|
240
|
+
<h4 class="text-xs font-semibold uppercase tracking-wide text-dimmed">
|
|
238
241
|
{{ t('settings.openRouterCatalog.connectHeading') }}
|
|
239
242
|
</h4>
|
|
240
|
-
<ol class="list-decimal space-y-1 ps-5 text-sm text-
|
|
243
|
+
<ol class="list-decimal space-y-1 ps-5 text-sm text-toned">
|
|
241
244
|
<li>
|
|
242
245
|
<i18n-t keypath="settings.openRouterCatalog.step1" tag="span" scope="global">
|
|
243
246
|
<template #link>
|
|
@@ -245,7 +248,7 @@ function manageKeys() {
|
|
|
245
248
|
href="https://openrouter.ai/keys"
|
|
246
249
|
target="_blank"
|
|
247
250
|
rel="noopener noreferrer"
|
|
248
|
-
class="text-primary
|
|
251
|
+
class="text-primary underline"
|
|
249
252
|
>{{ t('settings.openRouterCatalog.step1Link') }}</a
|
|
250
253
|
>
|
|
251
254
|
</template>
|
|
@@ -299,10 +302,10 @@ function manageKeys() {
|
|
|
299
302
|
<!-- Key connected status -->
|
|
300
303
|
<div
|
|
301
304
|
v-else
|
|
302
|
-
class="flex items-center justify-between rounded-lg border border-
|
|
305
|
+
class="flex items-center justify-between rounded-lg border border-muted bg-default/60 px-3 py-2 text-sm"
|
|
303
306
|
>
|
|
304
|
-
<span class="flex items-center gap-2 text-
|
|
305
|
-
<UIcon name="i-lucide-check-circle" class="h-4 w-4 text-
|
|
307
|
+
<span class="flex items-center gap-2 text-toned">
|
|
308
|
+
<UIcon name="i-lucide-check-circle" class="h-4 w-4 text-app-success-400" />
|
|
306
309
|
{{ t('settings.openRouterCatalog.keyConnected') }}
|
|
307
310
|
</span>
|
|
308
311
|
<UButton color="neutral" variant="ghost" size="xs" @click="manageKeys()">
|
|
@@ -342,31 +345,35 @@ function manageKeys() {
|
|
|
342
345
|
/>
|
|
343
346
|
</div>
|
|
344
347
|
|
|
345
|
-
<p v-if="store.refreshError" class="text-xs text-
|
|
348
|
+
<p v-if="store.refreshError" class="text-xs text-app-error-400">
|
|
349
|
+
{{ store.refreshError }}
|
|
350
|
+
</p>
|
|
346
351
|
|
|
347
352
|
<div v-if="visible.length" class="max-h-96 space-y-1 overflow-y-auto pe-1">
|
|
348
353
|
<label
|
|
349
354
|
v-for="m in visible"
|
|
350
355
|
:key="m.id"
|
|
351
|
-
class="flex items-center gap-2 rounded-md border border-
|
|
356
|
+
class="flex items-center gap-2 rounded-md border border-default bg-default/40 px-2.5 py-1.5 text-sm"
|
|
352
357
|
>
|
|
353
358
|
<UCheckbox
|
|
354
359
|
:model-value="selected.has(m.id)"
|
|
355
360
|
@update:model-value="(v: boolean | 'indeterminate') => toggle(m.id, v === true)"
|
|
356
361
|
/>
|
|
357
362
|
<span class="min-w-0 flex-1">
|
|
358
|
-
<span class="block truncate text-
|
|
359
|
-
<span class="block truncate font-mono text-[11px] text-
|
|
363
|
+
<span class="block truncate text-default">{{ m.name }}</span>
|
|
364
|
+
<span class="block truncate font-mono text-[11px] text-dimmed">{{ m.id }}</span>
|
|
360
365
|
<!--
|
|
361
366
|
A withdrawal date is the one fact about a model that fails SILENTLY: past it the
|
|
362
367
|
route simply stops answering and the run falls through to whatever the picker
|
|
363
368
|
offers next, so the moment to see it is while choosing.
|
|
364
369
|
-->
|
|
365
|
-
<span
|
|
366
|
-
|
|
367
|
-
|
|
370
|
+
<span
|
|
371
|
+
v-if="m.expirationDate"
|
|
372
|
+
class="block truncate text-[11px] text-app-warning-400"
|
|
373
|
+
>{{ t('settings.openRouterCatalog.retiresOn', { date: m.expirationDate }) }}</span
|
|
374
|
+
>
|
|
368
375
|
</span>
|
|
369
|
-
<span class="shrink-0 text-end text-[11px] text-
|
|
376
|
+
<span class="shrink-0 text-end text-[11px] text-dimmed">
|
|
370
377
|
<span v-if="m.contextLength" class="block">{{
|
|
371
378
|
contextLabel(m.contextLength)
|
|
372
379
|
}}</span>
|
|
@@ -374,16 +381,16 @@ function manageKeys() {
|
|
|
374
381
|
</span>
|
|
375
382
|
</label>
|
|
376
383
|
</div>
|
|
377
|
-
<p v-else class="text-xs text-
|
|
384
|
+
<p v-else class="text-xs text-dimmed">
|
|
378
385
|
<i18n-t keypath="settings.openRouterCatalog.empty" tag="span" scope="global">
|
|
379
386
|
<template #action>
|
|
380
|
-
<span class="text-
|
|
387
|
+
<span class="text-toned">{{ t('settings.openRouterCatalog.refresh') }}</span>
|
|
381
388
|
</template>
|
|
382
389
|
</i18n-t>
|
|
383
390
|
</p>
|
|
384
391
|
|
|
385
392
|
<div class="flex items-center justify-between">
|
|
386
|
-
<span class="text-xs text-
|
|
393
|
+
<span class="text-xs text-dimmed">{{
|
|
387
394
|
t('settings.openRouterCatalog.enabledCount', { count: selectedCount }, selectedCount)
|
|
388
395
|
}}</span>
|
|
389
396
|
<UButton
|
|
@@ -99,23 +99,23 @@ async function removeEntry(entryId: string) {
|
|
|
99
99
|
|
|
100
100
|
<template>
|
|
101
101
|
<div class="space-y-4" data-testid="package-registries-panel">
|
|
102
|
-
<p class="text-sm text-
|
|
102
|
+
<p class="text-sm text-muted">
|
|
103
103
|
{{ t('settings.packageRegistries.intro') }}
|
|
104
104
|
</p>
|
|
105
105
|
|
|
106
|
-
<section v-if="store.entries.length" class="space-y-2 rounded-lg border border-
|
|
106
|
+
<section v-if="store.entries.length" class="space-y-2 rounded-lg border border-muted p-3">
|
|
107
107
|
<h3 class="text-sm font-semibold">
|
|
108
108
|
{{ t('settings.packageRegistries.list.heading') }}
|
|
109
109
|
</h3>
|
|
110
110
|
<div
|
|
111
111
|
v-for="entry in store.entries"
|
|
112
112
|
:key="entry.id"
|
|
113
|
-
class="flex items-center justify-between gap-2 rounded-md border border-
|
|
113
|
+
class="flex items-center justify-between gap-2 rounded-md border border-default px-3 py-2"
|
|
114
114
|
>
|
|
115
115
|
<div class="min-w-0 space-y-1">
|
|
116
116
|
<div class="flex items-center gap-2">
|
|
117
117
|
<span class="text-sm font-medium">{{ vendorLabel(entry.vendor) }}</span>
|
|
118
|
-
<span class="text-[11px] text-
|
|
118
|
+
<span class="text-[11px] text-dimmed">
|
|
119
119
|
{{ t('settings.packageRegistries.list.tokenTail', { tail: entry.tokenTail }) }}
|
|
120
120
|
</span>
|
|
121
121
|
</div>
|
|
@@ -132,7 +132,7 @@ async function removeEntry(entryId: string) {
|
|
|
132
132
|
<!-- An entry with no scopes authenticates its host without routing any scope to
|
|
133
133
|
it (the deliberate mixed public/private setup) — say so, or the row reads as
|
|
134
134
|
half-configured. -->
|
|
135
|
-
<span v-if="!entry.scopes.length" class="text-[11px] text-
|
|
135
|
+
<span v-if="!entry.scopes.length" class="text-[11px] text-dimmed">
|
|
136
136
|
{{ t('settings.packageRegistries.list.noScopes') }}
|
|
137
137
|
</span>
|
|
138
138
|
</div>
|
|
@@ -150,7 +150,7 @@ async function removeEntry(entryId: string) {
|
|
|
150
150
|
</div>
|
|
151
151
|
</section>
|
|
152
152
|
|
|
153
|
-
<section class="space-y-3 rounded-lg border border-
|
|
153
|
+
<section class="space-y-3 rounded-lg border border-muted p-3">
|
|
154
154
|
<h3 class="text-sm font-semibold">
|
|
155
155
|
{{ t('settings.packageRegistries.add.heading') }}
|
|
156
156
|
</h3>
|
|
@@ -164,7 +164,7 @@ async function removeEntry(entryId: string) {
|
|
|
164
164
|
data-testid="package-registry-vendor"
|
|
165
165
|
/>
|
|
166
166
|
</UFormField>
|
|
167
|
-
<p class="text-[11px] text-
|
|
167
|
+
<p class="text-[11px] text-dimmed">
|
|
168
168
|
{{ t('settings.packageRegistries.add.host', { host: vendorHost }) }}
|
|
169
169
|
</p>
|
|
170
170
|
|
|
@@ -197,7 +197,7 @@ async function removeEntry(entryId: string) {
|
|
|
197
197
|
</div>
|
|
198
198
|
<!-- Why leaving this empty is often the RIGHT answer — a scope mapping is all-or-nothing,
|
|
199
199
|
so an org publishing some of its `@org` packages publicly breaks under one. -->
|
|
200
|
-
<p class="text-[11px] text-
|
|
200
|
+
<p class="text-[11px] text-dimmed">
|
|
201
201
|
{{ t('settings.packageRegistries.add.scopesNote') }}
|
|
202
202
|
</p>
|
|
203
203
|
|
|
@@ -353,7 +353,7 @@ function fieldHelp(key: string): string | undefined {
|
|
|
353
353
|
<template>
|
|
354
354
|
<div v-if="descriptor" class="space-y-4">
|
|
355
355
|
<div class="flex items-start justify-between gap-3">
|
|
356
|
-
<p class="text-xs text-
|
|
356
|
+
<p class="text-xs text-muted">{{ blurb }}</p>
|
|
357
357
|
<UButton
|
|
358
358
|
:icon="showLogs ? 'i-lucide-chevron-up' : 'i-lucide-scroll-text'"
|
|
359
359
|
variant="ghost"
|
|
@@ -379,11 +379,11 @@ function fieldHelp(key: string): string | undefined {
|
|
|
379
379
|
<!-- Saved connection summary -->
|
|
380
380
|
<div
|
|
381
381
|
v-if="connection"
|
|
382
|
-
class="flex items-center justify-between rounded-md border border-
|
|
382
|
+
class="flex items-center justify-between rounded-md border border-muted bg-default/50 px-3 py-2 text-sm"
|
|
383
383
|
>
|
|
384
384
|
<div>
|
|
385
|
-
<span class="font-medium text-
|
|
386
|
-
<div class="text-[11px] text-
|
|
385
|
+
<span class="font-medium text-default">{{ connection.label }}</span>
|
|
386
|
+
<div class="text-[11px] text-app-success-400">
|
|
387
387
|
{{ t('settings.providerConnection.connectedAt', { baseUrl: connection.baseUrl }) }}
|
|
388
388
|
</div>
|
|
389
389
|
</div>
|
|
@@ -400,7 +400,7 @@ function fieldHelp(key: string): string | undefined {
|
|
|
400
400
|
<!-- Mandatory-fields warning (mirrors the banner) -->
|
|
401
401
|
<div
|
|
402
402
|
v-if="descriptor.missingRequired.length"
|
|
403
|
-
class="rounded-md border border-
|
|
403
|
+
class="rounded-md border border-app-warning-500/40 bg-app-warning-950/40 px-3 py-2 text-xs text-app-warning-200"
|
|
404
404
|
>
|
|
405
405
|
{{
|
|
406
406
|
t('settings.providerConnection.missingConfig', {
|
|
@@ -425,18 +425,15 @@ function fieldHelp(key: string): string | undefined {
|
|
|
425
425
|
/>
|
|
426
426
|
|
|
427
427
|
<!-- NATIVE provider: the friendly, descriptor-driven flat field form. -->
|
|
428
|
-
<div
|
|
429
|
-
|
|
430
|
-
class="rounded-lg border border-dashed border-slate-700 p-3 space-y-3"
|
|
431
|
-
>
|
|
432
|
-
<p class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
|
|
428
|
+
<div v-else-if="isNative" class="rounded-lg border border-dashed border-muted p-3 space-y-3">
|
|
429
|
+
<p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
433
430
|
{{
|
|
434
431
|
connection
|
|
435
432
|
? t('settings.providerConnection.form.updateConfiguration')
|
|
436
433
|
: t('settings.providerConnection.form.connect')
|
|
437
434
|
}}
|
|
438
435
|
</p>
|
|
439
|
-
<p v-if="connection && hasSecretFields" class="text-[11px] text-
|
|
436
|
+
<p v-if="connection && hasSecretFields" class="text-[11px] text-app-warning-300/80">
|
|
440
437
|
{{
|
|
441
438
|
t(
|
|
442
439
|
'settings.providerConnection.form.reenterSecrets',
|
|
@@ -196,8 +196,8 @@ function onSave() {
|
|
|
196
196
|
</script>
|
|
197
197
|
|
|
198
198
|
<template>
|
|
199
|
-
<div class="space-y-3 rounded-lg border border-dashed border-
|
|
200
|
-
<p class="text-[11px] font-semibold uppercase tracking-wide text-
|
|
199
|
+
<div class="space-y-3 rounded-lg border border-dashed border-muted p-3">
|
|
200
|
+
<p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
201
201
|
{{ t('settings.providerConnection.manifestEditor.title') }}
|
|
202
202
|
</p>
|
|
203
203
|
|
|
@@ -214,21 +214,21 @@ function onSave() {
|
|
|
214
214
|
/>
|
|
215
215
|
</UFormField>
|
|
216
216
|
|
|
217
|
-
<p v-if="!savedManifest && !jsonError && !schemaError" class="text-[11px] text-
|
|
217
|
+
<p v-if="!savedManifest && !jsonError && !schemaError" class="text-[11px] text-dimmed">
|
|
218
218
|
{{ t('settings.providerConnection.manifestEditor.starterHint') }}
|
|
219
219
|
</p>
|
|
220
220
|
|
|
221
221
|
<!-- Parse + shape errors, validated against the same contract the backend enforces. -->
|
|
222
222
|
<p
|
|
223
223
|
v-if="jsonError"
|
|
224
|
-
class="rounded-md border border-
|
|
224
|
+
class="rounded-md border border-app-error-500/40 bg-app-error-950/40 px-3 py-2 text-xs text-app-error-200"
|
|
225
225
|
data-testid="manifest-editor-error"
|
|
226
226
|
>
|
|
227
227
|
{{ t('settings.providerConnection.manifestEditor.invalidJson') }}
|
|
228
228
|
</p>
|
|
229
229
|
<p
|
|
230
230
|
v-else-if="schemaError"
|
|
231
|
-
class="rounded-md border border-
|
|
231
|
+
class="rounded-md border border-app-warning-500/40 bg-app-warning-950/40 px-3 py-2 text-xs text-app-warning-200"
|
|
232
232
|
data-testid="manifest-editor-error"
|
|
233
233
|
>
|
|
234
234
|
{{ t('settings.providerConnection.manifestEditor.schemaError', { message: schemaError }) }}
|
|
@@ -236,16 +236,16 @@ function onSave() {
|
|
|
236
236
|
|
|
237
237
|
<!-- Secret sub-form: one write-only input per secret key the manifest references. -->
|
|
238
238
|
<div class="space-y-2">
|
|
239
|
-
<p class="text-[11px] font-semibold uppercase tracking-wide text-
|
|
239
|
+
<p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
240
240
|
{{ t('settings.providerConnection.manifestEditor.secretsLabel') }}
|
|
241
241
|
</p>
|
|
242
|
-
<p v-if="!secretKeys.length" class="text-[11px] text-
|
|
242
|
+
<p v-if="!secretKeys.length" class="text-[11px] text-dimmed">
|
|
243
243
|
{{ t('settings.providerConnection.manifestEditor.noSecrets') }}
|
|
244
244
|
</p>
|
|
245
245
|
<template v-else-if="connected">
|
|
246
246
|
<p
|
|
247
247
|
v-if="storedSecretKeys && storedSecretKeys.length"
|
|
248
|
-
class="text-[11px] text-
|
|
248
|
+
class="text-[11px] text-muted"
|
|
249
249
|
data-testid="manifest-editor-stored"
|
|
250
250
|
>
|
|
251
251
|
{{
|
|
@@ -254,7 +254,7 @@ function onSave() {
|
|
|
254
254
|
})
|
|
255
255
|
}}
|
|
256
256
|
</p>
|
|
257
|
-
<p class="text-[11px] text-
|
|
257
|
+
<p class="text-[11px] text-app-warning-300/80">
|
|
258
258
|
{{ t('settings.providerConnection.manifestEditor.reenterSecrets') }}
|
|
259
259
|
</p>
|
|
260
260
|
</template>
|
|
@@ -90,7 +90,7 @@ function reset() {
|
|
|
90
90
|
<template>
|
|
91
91
|
<div>
|
|
92
92
|
<div class="mb-1 flex items-start justify-between gap-3">
|
|
93
|
-
<span class="text-[11px] font-semibold uppercase tracking-wide text-
|
|
93
|
+
<span class="text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
94
94
|
{{ t('settings.modelConfiguration.routeOrder.label') }}
|
|
95
95
|
</span>
|
|
96
96
|
<UButton
|
|
@@ -105,7 +105,7 @@ function reset() {
|
|
|
105
105
|
{{ t('settings.modelConfiguration.routeOrder.reset') }}
|
|
106
106
|
</UButton>
|
|
107
107
|
</div>
|
|
108
|
-
<p class="mb-2 text-[11px] leading-relaxed text-
|
|
108
|
+
<p class="mb-2 text-[11px] leading-relaxed text-dimmed">
|
|
109
109
|
{{
|
|
110
110
|
isCustom
|
|
111
111
|
? t('settings.modelConfiguration.routeOrder.customHint')
|
|
@@ -118,7 +118,7 @@ function reset() {
|
|
|
118
118
|
route a connected plan quietly overrules is the one thing this control must not do. -->
|
|
119
119
|
<p
|
|
120
120
|
v-if="subscriptionWins"
|
|
121
|
-
class="mb-2 text-[11px] leading-relaxed text-
|
|
121
|
+
class="mb-2 text-[11px] leading-relaxed text-app-warning-400/90"
|
|
122
122
|
data-testid="preset-route-order-subscription-warning"
|
|
123
123
|
>
|
|
124
124
|
{{ t('settings.modelConfiguration.routeOrder.subscriptionOverrideHint') }}
|
|
@@ -128,13 +128,13 @@ function reset() {
|
|
|
128
128
|
answering a different question than this order asks. -->
|
|
129
129
|
<p
|
|
130
130
|
v-if="badgesShowAnotherOrder"
|
|
131
|
-
class="mb-2 text-[11px] leading-relaxed text-
|
|
131
|
+
class="mb-2 text-[11px] leading-relaxed text-dimmed"
|
|
132
132
|
data-testid="preset-route-order-badge-hint"
|
|
133
133
|
>
|
|
134
134
|
{{ t('settings.modelConfiguration.routeOrder.badgesUseDefaultPresetHint') }}
|
|
135
135
|
</p>
|
|
136
136
|
<ol
|
|
137
|
-
class="divide-y divide-
|
|
137
|
+
class="divide-y divide-default rounded-xl border border-default bg-default/50"
|
|
138
138
|
data-testid="preset-route-order"
|
|
139
139
|
>
|
|
140
140
|
<li
|
|
@@ -144,13 +144,13 @@ function reset() {
|
|
|
144
144
|
:data-testid="`preset-route-${flavor}`"
|
|
145
145
|
>
|
|
146
146
|
<span
|
|
147
|
-
class="flex h-5 w-5 shrink-0 items-center justify-center rounded bg-
|
|
147
|
+
class="flex h-5 w-5 shrink-0 items-center justify-center rounded bg-elevated text-[10px] font-semibold text-muted"
|
|
148
148
|
>
|
|
149
149
|
{{ index + 1 }}
|
|
150
150
|
</span>
|
|
151
151
|
<div class="min-w-0 flex-1">
|
|
152
|
-
<p class="truncate text-sm text-
|
|
153
|
-
<p class="truncate text-[11px] text-
|
|
152
|
+
<p class="truncate text-sm text-default">{{ t(ROUTE_LABELS[flavor]) }}</p>
|
|
153
|
+
<p class="truncate text-[11px] text-dimmed">{{ t(ROUTE_HINTS[flavor]) }}</p>
|
|
154
154
|
</div>
|
|
155
155
|
<div class="flex shrink-0 items-center gap-1">
|
|
156
156
|
<UButton
|
|
@@ -55,13 +55,13 @@ function submit() {
|
|
|
55
55
|
</script>
|
|
56
56
|
|
|
57
57
|
<template>
|
|
58
|
-
<div class="rounded-lg border border-dashed border-
|
|
59
|
-
<p class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-
|
|
58
|
+
<div class="rounded-lg border border-dashed border-muted p-3">
|
|
59
|
+
<p class="mb-2 text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
60
60
|
{{ t('settings.riskPolicy.newPreset') }}
|
|
61
61
|
</p>
|
|
62
62
|
<div class="flex flex-wrap items-end gap-3">
|
|
63
63
|
<label class="block min-w-40 flex-1">
|
|
64
|
-
<span class="mb-1 block text-[10px] uppercase tracking-wide text-
|
|
64
|
+
<span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
|
|
65
65
|
{{ t('settings.riskPolicy.create.name') }}
|
|
66
66
|
</span>
|
|
67
67
|
<UInput
|
|
@@ -72,7 +72,7 @@ function submit() {
|
|
|
72
72
|
/>
|
|
73
73
|
</label>
|
|
74
74
|
<label class="block w-20">
|
|
75
|
-
<span class="mb-1 block text-[10px] uppercase tracking-wide text-
|
|
75
|
+
<span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
|
|
76
76
|
{{ t('settings.riskPolicy.create.complexity') }}
|
|
77
77
|
</span>
|
|
78
78
|
<UInput
|
|
@@ -85,7 +85,7 @@ function submit() {
|
|
|
85
85
|
/>
|
|
86
86
|
</label>
|
|
87
87
|
<label class="block w-20">
|
|
88
|
-
<span class="mb-1 block text-[10px] uppercase tracking-wide text-
|
|
88
|
+
<span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
|
|
89
89
|
{{ t('settings.riskPolicy.create.risk') }}
|
|
90
90
|
</span>
|
|
91
91
|
<UInput
|
|
@@ -98,7 +98,7 @@ function submit() {
|
|
|
98
98
|
/>
|
|
99
99
|
</label>
|
|
100
100
|
<label class="block w-20">
|
|
101
|
-
<span class="mb-1 block text-[10px] uppercase tracking-wide text-
|
|
101
|
+
<span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
|
|
102
102
|
{{ t('settings.riskPolicy.create.impact') }}
|
|
103
103
|
</span>
|
|
104
104
|
<UInput
|
|
@@ -111,13 +111,13 @@ function submit() {
|
|
|
111
111
|
/>
|
|
112
112
|
</label>
|
|
113
113
|
<label class="block w-20">
|
|
114
|
-
<span class="mb-1 block text-[10px] uppercase tracking-wide text-
|
|
114
|
+
<span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
|
|
115
115
|
{{ t('settings.riskPolicy.create.ciFix') }}
|
|
116
116
|
</span>
|
|
117
117
|
<UInput v-model.number="draft.ciMaxAttempts" type="number" :min="0" :max="50" size="sm" />
|
|
118
118
|
</label>
|
|
119
119
|
<label class="block w-20">
|
|
120
|
-
<span class="mb-1 block text-[10px] uppercase tracking-wide text-
|
|
120
|
+
<span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
|
|
121
121
|
{{ t('settings.riskPolicy.create.reqIter') }}
|
|
122
122
|
</span>
|
|
123
123
|
<UInput
|
|
@@ -129,7 +129,7 @@ function submit() {
|
|
|
129
129
|
/>
|
|
130
130
|
</label>
|
|
131
131
|
<label class="block w-20">
|
|
132
|
-
<span class="mb-1 block text-[10px] uppercase tracking-wide text-
|
|
132
|
+
<span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
|
|
133
133
|
{{ t('settings.riskPolicy.create.companionRework') }}
|
|
134
134
|
</span>
|
|
135
135
|
<UInput
|
|
@@ -141,7 +141,7 @@ function submit() {
|
|
|
141
141
|
/>
|
|
142
142
|
</label>
|
|
143
143
|
<label class="block w-32">
|
|
144
|
-
<span class="mb-1 block text-[10px] uppercase tracking-wide text-
|
|
144
|
+
<span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
|
|
145
145
|
{{ t('settings.riskPolicy.create.autoPass') }}
|
|
146
146
|
</span>
|
|
147
147
|
<USelect
|
|
@@ -93,7 +93,7 @@ const deleteBlocked = computed(
|
|
|
93
93
|
|
|
94
94
|
<template>
|
|
95
95
|
<div
|
|
96
|
-
class="rounded-lg border border-
|
|
96
|
+
class="rounded-lg border border-muted bg-elevated/40 p-3"
|
|
97
97
|
data-testid="risk-policy-row"
|
|
98
98
|
:data-policy-id="policy.id"
|
|
99
99
|
:data-policy-tier="policy.tier"
|
|
@@ -156,7 +156,7 @@ const deleteBlocked = computed(
|
|
|
156
156
|
|
|
157
157
|
<div class="grid grid-cols-1 gap-3 sm:grid-cols-4">
|
|
158
158
|
<label v-for="axis in RISK_POLICY_AXES" :key="axis" class="block">
|
|
159
|
-
<span class="mb-1 block text-[10px] uppercase tracking-wide text-
|
|
159
|
+
<span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
|
|
160
160
|
{{ t(CEILING_LABEL_KEYS[axis]) }}
|
|
161
161
|
</span>
|
|
162
162
|
<UInput
|
|
@@ -168,13 +168,13 @@ const deleteBlocked = computed(
|
|
|
168
168
|
/>
|
|
169
169
|
</label>
|
|
170
170
|
<label class="block">
|
|
171
|
-
<span class="mb-1 block text-[10px] uppercase tracking-wide text-
|
|
171
|
+
<span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
|
|
172
172
|
{{ t('settings.riskPolicy.field.ciMaxAttempts') }}
|
|
173
173
|
</span>
|
|
174
174
|
<UInput v-model.number="draft.ciMaxAttempts" type="number" :min="0" :max="50" size="sm" />
|
|
175
175
|
</label>
|
|
176
176
|
<label class="block">
|
|
177
|
-
<span class="mb-1 block text-[10px] uppercase tracking-wide text-
|
|
177
|
+
<span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
|
|
178
178
|
{{ t('settings.riskPolicy.field.maxRequirementIterations') }}
|
|
179
179
|
</span>
|
|
180
180
|
<UInput
|
|
@@ -186,7 +186,7 @@ const deleteBlocked = computed(
|
|
|
186
186
|
/>
|
|
187
187
|
</label>
|
|
188
188
|
<label class="block">
|
|
189
|
-
<span class="mb-1 block text-[10px] uppercase tracking-wide text-
|
|
189
|
+
<span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
|
|
190
190
|
{{ t('settings.riskPolicy.field.companionMaxReworks') }}
|
|
191
191
|
</span>
|
|
192
192
|
<UInput
|
|
@@ -198,7 +198,7 @@ const deleteBlocked = computed(
|
|
|
198
198
|
/>
|
|
199
199
|
</label>
|
|
200
200
|
<label class="block">
|
|
201
|
-
<span class="mb-1 block text-[10px] uppercase tracking-wide text-
|
|
201
|
+
<span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
|
|
202
202
|
{{ t('settings.riskPolicy.field.maxRequirementConcernAllowed') }}
|
|
203
203
|
</span>
|
|
204
204
|
<USelect
|
|
@@ -212,7 +212,7 @@ const deleteBlocked = computed(
|
|
|
212
212
|
|
|
213
213
|
<!-- Per-change-class auto-merge rules, each shown beside that class's accumulated track
|
|
214
214
|
record — the number that justifies widening the rule. -->
|
|
215
|
-
<div class="mt-3 rounded-md border border-
|
|
215
|
+
<div class="mt-3 rounded-md border border-default bg-default/40 p-3">
|
|
216
216
|
<MergeClassRulesEditor
|
|
217
217
|
v-model="draft.classRules"
|
|
218
218
|
:auto-merge-enabled="draft.autoMergeEnabled"
|
|
@@ -223,7 +223,7 @@ const deleteBlocked = computed(
|
|
|
223
223
|
<!-- The role layer over those rules: what a run may do depending on WHO started it, up to and
|
|
224
224
|
including a full sandbox. Directly under the base rules it narrows, since a role rule is
|
|
225
225
|
only readable against the rule it applies to. -->
|
|
226
|
-
<div class="mt-3 rounded-md border border-
|
|
226
|
+
<div class="mt-3 rounded-md border border-default bg-default/40 p-3">
|
|
227
227
|
<MergeRolePolicyEditor
|
|
228
228
|
v-model:class-rules-by-role="draft.classRulesByRole"
|
|
229
229
|
v-model:dry-run-roles="draft.dryRunRoles"
|
|
@@ -236,7 +236,7 @@ const deleteBlocked = computed(
|
|
|
236
236
|
|
|
237
237
|
<!-- Implementation-fork decision gate: propose materially different approaches before the
|
|
238
238
|
Coder writes code (in `auto` tri-state, gated on the task estimate). -->
|
|
239
|
-
<div class="mt-3 rounded-md border border-
|
|
239
|
+
<div class="mt-3 rounded-md border border-default bg-default/40 p-3">
|
|
240
240
|
<USwitch
|
|
241
241
|
v-model="draft.forkEnabled"
|
|
242
242
|
size="sm"
|
|
@@ -245,7 +245,7 @@ const deleteBlocked = computed(
|
|
|
245
245
|
/>
|
|
246
246
|
<div v-if="draft.forkEnabled" class="mt-3 grid grid-cols-1 gap-3 sm:grid-cols-4">
|
|
247
247
|
<label v-for="axis in RISK_POLICY_AXES" :key="axis" class="block">
|
|
248
|
-
<span class="mb-1 block text-[10px] uppercase tracking-wide text-
|
|
248
|
+
<span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
|
|
249
249
|
{{ t(FORK_FLOOR_LABEL_KEYS[axis]) }}
|
|
250
250
|
</span>
|
|
251
251
|
<UInput
|
|
@@ -257,7 +257,7 @@ const deleteBlocked = computed(
|
|
|
257
257
|
/>
|
|
258
258
|
</label>
|
|
259
259
|
<label class="block">
|
|
260
|
-
<span class="mb-1 block text-[10px] uppercase tracking-wide text-
|
|
260
|
+
<span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
|
|
261
261
|
{{ t('settings.riskPolicy.forkDecision.onMissingLabel') }}
|
|
262
262
|
</span>
|
|
263
263
|
<USelect v-model="draft.forkOnMissing" :items="onMissingOptions" size="sm" />
|
|
@@ -268,7 +268,7 @@ const deleteBlocked = computed(
|
|
|
268
268
|
<!-- The autonomy posture: whether the parks the engine's own quality loops raise when they give
|
|
269
269
|
up wait for a person, or are answered on the record so the run finishes. Never touches a
|
|
270
270
|
gate the PIPELINE asked for. -->
|
|
271
|
-
<div class="mt-3 rounded-md border border-
|
|
271
|
+
<div class="mt-3 rounded-md border border-default bg-default/40 p-3">
|
|
272
272
|
<USwitch
|
|
273
273
|
v-model="draft.unattended"
|
|
274
274
|
size="sm"
|
|
@@ -283,7 +283,7 @@ const deleteBlocked = computed(
|
|
|
283
283
|
on an attended policy would be a control over a decision this policy never makes. It is
|
|
284
284
|
not hidden as an "advanced override" — it is inert, which is a different thing. -->
|
|
285
285
|
<label v-if="draft.unattended" class="mt-3 block">
|
|
286
|
-
<span class="mb-1 block text-[10px] uppercase tracking-wide text-
|
|
286
|
+
<span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
|
|
287
287
|
{{ t('settings.riskPolicy.autoAnswer.label') }}
|
|
288
288
|
</span>
|
|
289
289
|
<UInput
|
|
@@ -294,7 +294,7 @@ const deleteBlocked = computed(
|
|
|
294
294
|
size="sm"
|
|
295
295
|
data-testid="risk-policy-auto-answer-floor"
|
|
296
296
|
/>
|
|
297
|
-
<span class="mt-1 block text-[11px] text-
|
|
297
|
+
<span class="mt-1 block text-[11px] text-dimmed">
|
|
298
298
|
{{ t('settings.riskPolicy.autoAnswer.hint') }}
|
|
299
299
|
</span>
|
|
300
300
|
</label>
|
|
@@ -50,8 +50,8 @@ const reseedableCount = computed(
|
|
|
50
50
|
<template>
|
|
51
51
|
<UModal v-model:open="open" :title="t('riskPolicy.health.title')" :ui="{ content: 'max-w-2xl' }">
|
|
52
52
|
<template #body>
|
|
53
|
-
<div v-if="!hasIssues" class="py-6 text-center text-sm text-
|
|
54
|
-
<UIcon name="i-lucide-check-circle-2" class="mx-auto mb-2 h-8 w-8 text-
|
|
53
|
+
<div v-if="!hasIssues" class="py-6 text-center text-sm text-muted">
|
|
54
|
+
<UIcon name="i-lucide-check-circle-2" class="mx-auto mb-2 h-8 w-8 text-app-success-400" />
|
|
55
55
|
{{ t('riskPolicy.health.allValid') }}
|
|
56
56
|
</div>
|
|
57
57
|
|
|
@@ -59,20 +59,20 @@ const reseedableCount = computed(
|
|
|
59
59
|
<!-- New built-in presets the workspace can add. -->
|
|
60
60
|
<section v-if="newPresets.length" class="space-y-2">
|
|
61
61
|
<div class="flex items-center gap-2">
|
|
62
|
-
<UIcon name="i-lucide-sparkles" class="h-4 w-4 text-
|
|
63
|
-
<h3 class="text-sm font-semibold text-
|
|
62
|
+
<UIcon name="i-lucide-sparkles" class="h-4 w-4 text-app-success-400" />
|
|
63
|
+
<h3 class="text-sm font-semibold text-default">
|
|
64
64
|
{{ t('riskPolicy.health.newHeading') }}
|
|
65
65
|
</h3>
|
|
66
66
|
</div>
|
|
67
|
-
<p class="text-[11px] text-
|
|
67
|
+
<p class="text-[11px] text-dimmed">{{ t('riskPolicy.health.newDescription') }}</p>
|
|
68
68
|
<ul class="space-y-2">
|
|
69
69
|
<li
|
|
70
70
|
v-for="i in newPresets"
|
|
71
71
|
:key="i.id"
|
|
72
|
-
class="flex items-center justify-between gap-3 rounded-lg border border-
|
|
72
|
+
class="flex items-center justify-between gap-3 rounded-lg border border-default bg-default/40 p-3"
|
|
73
73
|
>
|
|
74
74
|
<div class="min-w-0">
|
|
75
|
-
<span class="truncate text-sm font-medium text-
|
|
75
|
+
<span class="truncate text-sm font-medium text-app-100 capitalize">{{
|
|
76
76
|
i.name
|
|
77
77
|
}}</span>
|
|
78
78
|
</div>
|
|
@@ -94,21 +94,23 @@ const reseedableCount = computed(
|
|
|
94
94
|
<!-- Outdated built-ins: a newer catalog version is available. -->
|
|
95
95
|
<section v-if="outdated.length" class="space-y-2">
|
|
96
96
|
<div class="flex items-center gap-2">
|
|
97
|
-
<UIcon name="i-lucide-arrow-up-circle" class="h-4 w-4 text-
|
|
98
|
-
<h3 class="text-sm font-semibold text-
|
|
97
|
+
<UIcon name="i-lucide-arrow-up-circle" class="h-4 w-4 text-app-warning-400" />
|
|
98
|
+
<h3 class="text-sm font-semibold text-default">
|
|
99
99
|
{{ t('riskPolicy.health.updatesHeading') }}
|
|
100
100
|
</h3>
|
|
101
101
|
</div>
|
|
102
|
-
<p class="text-[11px] text-
|
|
102
|
+
<p class="text-[11px] text-dimmed">
|
|
103
|
+
{{ t('riskPolicy.health.updatesDescription') }}
|
|
104
|
+
</p>
|
|
103
105
|
<ul class="space-y-2">
|
|
104
106
|
<li
|
|
105
107
|
v-for="i in outdated"
|
|
106
108
|
:key="i.id"
|
|
107
|
-
class="flex items-center justify-between gap-3 rounded-lg border border-
|
|
109
|
+
class="flex items-center justify-between gap-3 rounded-lg border border-default bg-default/40 p-3"
|
|
108
110
|
>
|
|
109
111
|
<div class="min-w-0">
|
|
110
|
-
<span class="truncate text-sm font-medium text-
|
|
111
|
-
<p class="text-[11px] text-
|
|
112
|
+
<span class="truncate text-sm font-medium text-app-100">{{ i.name }}</span>
|
|
113
|
+
<p class="text-[11px] text-app-warning-400/80">
|
|
112
114
|
{{
|
|
113
115
|
t('riskPolicy.health.versionAvailable', {
|
|
114
116
|
from: i.fromVersion ?? 0,
|