@cat-factory/app 0.308.0 → 0.310.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -2
- package/app/assets/css/main.css +22 -0
- package/app/assets/css/prose.css +4 -4
- package/app/assets/css/type.css +24 -0
- package/app/components/assistant/AssistantModal.vue +8 -6
- package/app/components/auth/BackendMisconfiguredScreen.vue +4 -3
- package/app/components/auth/LoginScreen.vue +40 -26
- package/app/components/auth/ResetPasswordScreen.vue +9 -4
- package/app/components/auth/UserMenu.vue +5 -4
- package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +48 -37
- package/app/components/binaryOutput/BinaryOutputReport.vue +10 -14
- package/app/components/binaryOutput/StoredAssetView.vue +13 -11
- package/app/components/board/AddTaskModal.vue +30 -27
- package/app/components/board/AgentFailureCard.vue +21 -18
- package/app/components/board/AgentFailureHistory.vue +18 -9
- package/app/components/board/CreateInitiativeModal.vue +7 -6
- package/app/components/board/FailureDetail.vue +22 -12
- package/app/components/board/FailureHistoryList.vue +5 -5
- package/app/components/board/RecurringPipelineModal.vue +12 -11
- package/app/components/board/ReviewFrictionDialog.vue +8 -6
- package/app/components/board/StepExecutionHistory.vue +8 -8
- package/app/components/board/nodes/AgentChip.vue +1 -1
- package/app/components/board/nodes/BlockNode.vue +25 -24
- package/app/components/board/nodes/DecisionBadge.vue +4 -3
- package/app/components/board/nodes/EpicNode.vue +4 -4
- package/app/components/board/nodes/FrameSwimlanes.vue +8 -10
- package/app/components/board/nodes/InitiativeCard.vue +4 -4
- package/app/components/board/nodes/LaneGroup.vue +3 -5
- package/app/components/board/nodes/TaskCard.vue +20 -15
- package/app/components/board/nodes/TaskLane.vue +3 -3
- package/app/components/board/nodes/TaskPipelineMini.vue +21 -18
- package/app/components/bootstrap/AdoptionReviewModal.vue +36 -26
- package/app/components/bootstrap/BootstrapModal.vue +14 -13
- package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
- package/app/components/brainstorm/BrainstormWindow.vue +13 -10
- package/app/components/bugFishing/BugFishingWindow.vue +81 -58
- package/app/components/clarity/ClarityReviewWindow.vue +13 -10
- package/app/components/common/AsyncViewError.vue +1 -1
- package/app/components/common/ClarificationItem.vue +6 -6
- package/app/components/common/CopyButton.vue +12 -11
- package/app/components/common/DescriptorFields.vue +1 -1
- package/app/components/common/EmptyState.vue +1 -1
- package/app/components/common/IconButton.vue +34 -9
- package/app/components/common/InterviewGateNotice.vue +4 -4
- package/app/components/common/MarkdownProse.vue +8 -2
- package/app/components/common/SectionLabel.vue +38 -0
- package/app/components/consensus/ConsensusSessionWindow.vue +10 -9
- package/app/components/context/ContextAttachmentFields.vue +32 -20
- package/app/components/docs/DocInterviewWindow.vue +10 -9
- package/app/components/documents/ContextDocumentPicker.vue +22 -21
- package/app/components/documents/DocumentImportModal.vue +7 -5
- package/app/components/documents/DocumentOriginLink.vue +12 -9
- package/app/components/documents/DocumentSourceConnectModal.vue +2 -2
- package/app/components/documents/DocumentSyncState.vue +4 -4
- package/app/components/documents/DocumentTemplatesModal.vue +5 -4
- package/app/components/documents/RepoContextDocPicker.vue +7 -9
- package/app/components/documents/StartFromDesignModal.vue +4 -4
- package/app/components/documents/TaskContextDocs.vue +1 -1
- package/app/components/environments/EnvSetupStepper.vue +3 -3
- package/app/components/environments/EnvironmentStatusPanel.vue +15 -13
- package/app/components/environments/steps/EnvPreflightStep.vue +8 -8
- package/app/components/environments/steps/EnvReviewStep.vue +23 -22
- package/app/components/environments/steps/EnvSaveStep.vue +5 -5
- package/app/components/focus/BlockFocusView.vue +11 -10
- package/app/components/followUp/FollowUpWindow.vue +18 -15
- package/app/components/forkDecision/ForkDecisionWindow.vue +85 -97
- package/app/components/foundational/FoundationalContractSummary.vue +2 -2
- package/app/components/foundational/FoundationalServiceCatalogList.vue +6 -5
- package/app/components/foundational/FoundationalServiceRegistry.vue +10 -9
- package/app/components/foundational/FoundationalServiceSources.vue +7 -6
- package/app/components/foundational/FoundationalSuppressions.vue +2 -2
- package/app/components/fragments/FragmentLibraryManager.vue +8 -7
- package/app/components/fragments/FragmentSelector.vue +22 -20
- package/app/components/gates/GateFailingCheckList.vue +7 -6
- package/app/components/gates/GateResultView.vue +55 -49
- package/app/components/github/AddServiceFromRepoModal.vue +16 -11
- package/app/components/github/BranchProtectionPreflight.vue +5 -5
- package/app/components/github/GitHubConnect.vue +5 -3
- package/app/components/github/GitHubOnboarding.vue +7 -2
- package/app/components/github/GitHubPanel.vue +23 -19
- package/app/components/github/RepoTreeBrowser.vue +16 -13
- package/app/components/humanTest/HumanTestWindow.vue +29 -24
- package/app/components/initiative/InitiativePlanNotice.vue +3 -3
- package/app/components/initiative/InitiativePlanReview.vue +46 -38
- package/app/components/initiative/InitiativePlanningWindow.vue +5 -5
- package/app/components/initiative/InitiativeTrackerWindow.vue +213 -165
- package/app/components/judge/JudgeResultView.vue +28 -27
- package/app/components/kaizen/KaizenPanel.vue +70 -56
- package/app/components/kaizen/KaizenStepStatus.vue +7 -6
- package/app/components/layout/AccountAuditLog.vue +1 -1
- package/app/components/layout/AccountDeploymentSettings.vue +10 -10
- package/app/components/layout/AccountFailureKindRules.vue +13 -13
- package/app/components/layout/AccountFoundationalSettings.vue +1 -1
- package/app/components/layout/AccountFragmentSettings.vue +1 -1
- package/app/components/layout/AccountModelPolicySettings.vue +7 -7
- package/app/components/layout/AccountPlatformAlertSettings.vue +8 -8
- package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
- package/app/components/layout/AccountRunCredentialSettings.vue +3 -3
- package/app/components/layout/AccountSkillSettings.vue +1 -1
- package/app/components/layout/AccountTeamSettings.vue +13 -9
- package/app/components/layout/AiProvidersBanner.vue +1 -1
- package/app/components/layout/AppearanceSwitcher.vue +5 -4
- package/app/components/layout/BoardSwitcher.vue +13 -10
- package/app/components/layout/BoardToolbar.vue +10 -5
- package/app/components/layout/CommandBar.vue +8 -5
- package/app/components/layout/DefaultTestEnvBanner.vue +6 -5
- package/app/components/layout/IntegrationsHub.vue +12 -9
- package/app/components/layout/LanguageSwitcher.vue +5 -4
- package/app/components/layout/ModelProvidersHub.vue +10 -7
- package/app/components/layout/NotificationsInbox.vue +47 -36
- package/app/components/layout/PersonalSetupModal.vue +9 -6
- package/app/components/layout/RolePrompt.vue +5 -4
- package/app/components/layout/SideBar.vue +7 -8
- package/app/components/layout/SpendWarningBanner.vue +3 -3
- package/app/components/layout/TranslationWarningBanner.vue +5 -4
- package/app/components/layout/UiModeSwitcher.vue +15 -12
- package/app/components/layout/UiRoleSwitcher.vue +10 -8
- package/app/components/layout/WorkspaceMembersSettings.vue +2 -2
- package/app/components/media/ArtifactLightbox.vue +74 -44
- package/app/components/media/ImageCompare.vue +80 -85
- package/app/components/merge/MergeEffortChips.vue +4 -6
- package/app/components/notifications/NotificationSettingsPanel.vue +6 -5
- package/app/components/observability/OutcomeFilterChips.vue +6 -5
- package/app/components/observability/RunFailureSummary.vue +22 -23
- package/app/components/observability/StepMetricsBar.vue +9 -8
- package/app/components/observability/StepModelActivity.vue +8 -5
- package/app/components/observability/ToolCallList.vue +19 -20
- package/app/components/outcome/OutcomeSummaryWindow.vue +48 -46
- package/app/components/palettes/AgentPalette.vue +21 -15
- package/app/components/palettes/AgentTierSelect.vue +1 -1
- package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
- package/app/components/panels/AgentStepDetail.vue +57 -49
- package/app/components/panels/AttemptEntryHeader.vue +2 -2
- package/app/components/panels/DecisionModal.vue +1 -1
- package/app/components/panels/GenericStructuredResultView.vue +6 -5
- package/app/components/panels/InspectorPanel.vue +15 -13
- package/app/components/panels/MergerResultView.vue +10 -9
- package/app/components/panels/ObservabilityPanel.vue +211 -186
- package/app/components/panels/OperatorDashboardPanel.vue +124 -115
- package/app/components/panels/ReportsPanel.vue +87 -83
- package/app/components/panels/ReportsSpendBreakdown.vue +2 -2
- package/app/components/panels/ResultWindowShell.vue +152 -137
- package/app/components/panels/RunDetailLoadState.vue +1 -1
- package/app/components/panels/StepContainerStatus.vue +17 -16
- package/app/components/panels/StepDelegatedStatus.vue +24 -21
- package/app/components/panels/StepEffortReport.vue +12 -17
- package/app/components/panels/StepFragmentAdherence.vue +9 -10
- package/app/components/panels/StepMetadataCard.vue +41 -43
- package/app/components/panels/StepReproductionReport.vue +18 -20
- package/app/components/panels/StepRestartControl.vue +3 -2
- package/app/components/panels/StepRunMeta.vue +27 -26
- package/app/components/panels/StepTestReport.vue +16 -15
- package/app/components/panels/StepToolServers.vue +7 -8
- package/app/components/panels/StepValidationReport.vue +5 -5
- package/app/components/panels/inspector/ContainerSummary.vue +4 -4
- package/app/components/panels/inspector/DocReferenceRepos.vue +5 -4
- package/app/components/panels/inspector/EnvProbeReport.vue +16 -13
- package/app/components/panels/inspector/EpicChildren.vue +12 -10
- package/app/components/panels/inspector/FrontendBindingsResolved.vue +5 -4
- package/app/components/panels/inspector/FrontendConfig.vue +29 -36
- package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
- package/app/components/panels/inspector/InspectorSection.vue +25 -17
- package/app/components/panels/inspector/RecurringScheduleSettings.vue +9 -8
- package/app/components/panels/inspector/ServiceConnections.vue +5 -4
- package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
- package/app/components/panels/inspector/ServiceSelfTests.vue +9 -13
- package/app/components/panels/inspector/ServiceTestConfig.vue +46 -49
- package/app/components/panels/inspector/ServiceTestSecrets.vue +3 -3
- package/app/components/panels/inspector/ServiceTestingContext.vue +2 -2
- package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
- package/app/components/panels/inspector/TaskAgentConfig.vue +2 -2
- package/app/components/panels/inspector/TaskAprioriBranches.vue +6 -5
- package/app/components/panels/inspector/TaskDependencies.vue +1 -1
- package/app/components/panels/inspector/TaskEstimateBadge.vue +3 -7
- package/app/components/panels/inspector/TaskExecution.vue +18 -16
- package/app/components/panels/inspector/TaskRunSettings.vue +45 -44
- package/app/components/panels/inspector/TaskStructure.vue +5 -4
- package/app/components/pipeline/AgentPromptEditor.vue +15 -14
- package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -52
- package/app/components/pipeline/EstimateThresholdFields.vue +14 -11
- package/app/components/pipeline/GateConfigFields.vue +19 -23
- package/app/components/pipeline/IterationCapPrompt.vue +1 -1
- package/app/components/pipeline/PipelineBuilder.vue +113 -99
- package/app/components/pipeline/PipelineHealthModal.vue +7 -7
- package/app/components/pipeline/PipelinePicker.vue +11 -9
- package/app/components/pipeline/PipelinePreview.vue +6 -7
- package/app/components/pipeline/PipelineProgress.vue +49 -45
- package/app/components/prReview/PrReviewWindow.vue +87 -65
- package/app/components/providers/AiPresetMismatchDialog.vue +4 -3
- package/app/components/providers/AiProviderOnboardingModal.vue +2 -2
- package/app/components/providers/ApiKeysSection.vue +11 -9
- package/app/components/providers/PersonalSubscriptionSection.vue +4 -3
- package/app/components/providers/VendorCredentialsModal.vue +5 -4
- package/app/components/provisioning/ProvisioningLogsDrawer.vue +10 -9
- package/app/components/ralph/RalphLoopResultView.vue +29 -29
- package/app/components/requirements/RequirementsReviewWindow.vue +22 -17
- package/app/components/riskPolicy/RiskPolicyPicker.vue +13 -11
- package/app/components/riskPolicy/RiskPolicyPreview.vue +16 -15
- package/app/components/sandbox/SandboxPanel.vue +93 -73
- package/app/components/settings/ApiTokensPanel.vue +1 -1
- package/app/components/settings/BudgetSettings.vue +18 -17
- package/app/components/settings/CapabilityCredentialsPanel.vue +5 -5
- package/app/components/settings/CloudflareHandlerSection.vue +44 -41
- package/app/components/settings/ComposeEnvironmentSetupSection.vue +14 -12
- package/app/components/settings/ConnectionTestVerdict.vue +1 -1
- package/app/components/settings/ConsensusGroupsSection.vue +58 -47
- package/app/components/settings/CustomManifestTypeEditor.vue +8 -7
- package/app/components/settings/DefaultProvisionTypeSection.vue +5 -5
- package/app/components/settings/InfraHandlersConfigurator.vue +26 -24
- package/app/components/settings/InfrastructureBackendPicker.vue +18 -18
- package/app/components/settings/IssueTrackerPanel.vue +30 -21
- package/app/components/settings/KubernetesEngineForm.vue +9 -8
- package/app/components/settings/KubernetesEnvironmentForm.vue +4 -3
- package/app/components/settings/LocalContainerPoolSettings.vue +2 -2
- package/app/components/settings/LocalModelEndpointsPanel.vue +13 -11
- package/app/components/settings/MergeClassRulesEditor.vue +6 -5
- package/app/components/settings/MergeRolePolicyEditor.vue +13 -12
- package/app/components/settings/ModelConfigurationPanel.vue +17 -19
- package/app/components/settings/ModelPresetHealthModal.vue +3 -3
- package/app/components/settings/ObservabilityConnectionPanel.vue +1 -1
- package/app/components/settings/OpenRouterCatalogPanel.vue +10 -8
- package/app/components/settings/PackageRegistriesPanel.vue +4 -4
- package/app/components/settings/ProviderConnectionTab.vue +5 -4
- package/app/components/settings/ProviderManifestEditor.vue +9 -8
- package/app/components/settings/ProviderPreferenceEditor.vue +13 -13
- package/app/components/settings/RiskPolicyCreateForm.vue +40 -26
- package/app/components/settings/RiskPolicyEditorRow.vue +21 -19
- package/app/components/settings/RiskPolicyHealthModal.vue +3 -3
- package/app/components/settings/RiskPolicyPanel.vue +11 -13
- package/app/components/settings/ServiceFragmentDefaultsPanel.vue +15 -12
- package/app/components/settings/SharedStacksPanel.vue +5 -5
- package/app/components/settings/TaskSourceCard.vue +2 -2
- package/app/components/settings/TaskTypeSuppressionsPanel.vue +4 -4
- package/app/components/settings/ToolServerChecklist.vue +22 -22
- package/app/components/settings/UsageSettings.vue +13 -13
- package/app/components/settings/UserSecretsSection.vue +4 -3
- package/app/components/settings/WorkspaceMetadataSettings.vue +6 -5
- package/app/components/settings/WorkspaceSettingsPanel.vue +72 -58
- package/app/components/skills/ReviewSkillQueue.vue +12 -10
- package/app/components/skills/SkillLibraryManager.vue +9 -8
- package/app/components/slack/SlackPanel.vue +17 -12
- package/app/components/spec/ServiceSpecWindow.vue +19 -19
- package/app/components/tasks/BugHuntModal.vue +1 -1
- package/app/components/tasks/ContextIssuePicker.vue +16 -15
- package/app/components/tasks/TaskContextIssues.vue +5 -4
- package/app/components/tasks/TaskImportModal.vue +3 -2
- package/app/components/tasks/TaskSourceConnectModal.vue +5 -5
- package/app/components/testing/TestReportWindow.vue +67 -60
- package/app/components/theme/ThemeImportModal.vue +2 -2
- package/app/components/tutorial/TutorialNudge.vue +3 -2
- package/app/components/tutorial/TutorialOverlay.vue +3 -2
- package/app/components/vcs/GitLabConnect.vue +1 -1
- package/app/components/visualConfirm/VisualConfirmationWindow.vue +79 -54
- package/app/utils/theme/builtins.ts +7 -1
- package/i18n/locales/de.json +7 -3
- package/i18n/locales/en.json +7 -3
- package/i18n/locales/es.json +7 -3
- package/i18n/locales/fr.json +7 -3
- package/i18n/locales/he.json +7 -3
- package/i18n/locales/it.json +7 -3
- package/i18n/locales/ja.json +7 -3
- package/i18n/locales/pl.json +7 -3
- package/i18n/locales/tr.json +7 -3
- package/i18n/locales/uk.json +7 -3
- package/package.json +1 -1
|
@@ -11,6 +11,7 @@ import { computed, ref, watch } from 'vue'
|
|
|
11
11
|
import type { OpenRouterModelMeta } from '~/types/openrouter'
|
|
12
12
|
import IntegrationBackTitle from '~/components/layout/IntegrationBackTitle.vue'
|
|
13
13
|
import SecretInput from '~/components/common/SecretInput.vue'
|
|
14
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
14
15
|
|
|
15
16
|
const { t } = useI18n()
|
|
16
17
|
const ui = useUiStore()
|
|
@@ -239,19 +240,20 @@ function manageKeys() {
|
|
|
239
240
|
v-if="!keyConnected"
|
|
240
241
|
class="space-y-3 rounded-lg border border-muted bg-default/60 p-4"
|
|
241
242
|
>
|
|
242
|
-
<
|
|
243
|
+
<SectionLabel as="h4">
|
|
243
244
|
{{ t('settings.openRouterCatalog.connectHeading') }}
|
|
244
|
-
</
|
|
245
|
+
</SectionLabel>
|
|
245
246
|
<ol class="list-decimal space-y-1 ps-5 text-sm text-toned">
|
|
246
247
|
<li>
|
|
247
248
|
<i18n-t keypath="settings.openRouterCatalog.step1" tag="span" scope="global">
|
|
248
249
|
<template #link>
|
|
249
|
-
<
|
|
250
|
-
|
|
250
|
+
<ULink
|
|
251
|
+
raw
|
|
252
|
+
to="https://openrouter.ai/keys"
|
|
251
253
|
target="_blank"
|
|
252
254
|
rel="noopener noreferrer"
|
|
253
255
|
class="text-primary underline"
|
|
254
|
-
>{{ t('settings.openRouterCatalog.step1Link') }}</
|
|
256
|
+
>{{ t('settings.openRouterCatalog.step1Link') }}</ULink
|
|
255
257
|
>
|
|
256
258
|
</template>
|
|
257
259
|
</i18n-t>
|
|
@@ -363,7 +365,7 @@ function manageKeys() {
|
|
|
363
365
|
/>
|
|
364
366
|
<span class="min-w-0 flex-1">
|
|
365
367
|
<span class="block truncate text-default">{{ m.name }}</span>
|
|
366
|
-
<span class="block truncate font-mono text-
|
|
368
|
+
<span class="block truncate font-mono text-2xs text-dimmed">{{ m.id }}</span>
|
|
367
369
|
<!--
|
|
368
370
|
A withdrawal date is the one fact about a model that fails SILENTLY: past it the
|
|
369
371
|
route simply stops answering and the run falls through to whatever the picker
|
|
@@ -371,11 +373,11 @@ function manageKeys() {
|
|
|
371
373
|
-->
|
|
372
374
|
<span
|
|
373
375
|
v-if="m.expirationDate"
|
|
374
|
-
class="block truncate text-
|
|
376
|
+
class="block truncate text-2xs text-app-warning-400"
|
|
375
377
|
>{{ t('settings.openRouterCatalog.retiresOn', { date: m.expirationDate }) }}</span
|
|
376
378
|
>
|
|
377
379
|
</span>
|
|
378
|
-
<span class="shrink-0 text-end text-
|
|
380
|
+
<span class="shrink-0 text-end text-2xs text-dimmed">
|
|
379
381
|
<span v-if="m.contextLength" class="block">{{
|
|
380
382
|
contextLabel(m.contextLength)
|
|
381
383
|
}}</span>
|
|
@@ -115,7 +115,7 @@ async function removeEntry(entryId: string) {
|
|
|
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-
|
|
118
|
+
<span class="text-2xs 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-
|
|
135
|
+
<span v-if="!entry.scopes.length" class="text-2xs text-dimmed">
|
|
136
136
|
{{ t('settings.packageRegistries.list.noScopes') }}
|
|
137
137
|
</span>
|
|
138
138
|
</div>
|
|
@@ -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-
|
|
167
|
+
<p class="text-2xs 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-
|
|
200
|
+
<p class="text-2xs text-dimmed">
|
|
201
201
|
{{ t('settings.packageRegistries.add.scopesNote') }}
|
|
202
202
|
</p>
|
|
203
203
|
|
|
@@ -19,6 +19,7 @@ import ConnectionTestVerdict from '~/components/settings/ConnectionTestVerdict.v
|
|
|
19
19
|
import ProvisioningLogsDrawer from '~/components/provisioning/ProvisioningLogsDrawer.vue'
|
|
20
20
|
import ProviderManifestEditor from '~/components/settings/ProviderManifestEditor.vue'
|
|
21
21
|
import KubernetesEnvironmentForm from '~/components/settings/KubernetesEnvironmentForm.vue'
|
|
22
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
22
23
|
|
|
23
24
|
const props = defineProps<{
|
|
24
25
|
kind: ProviderConnectionKind
|
|
@@ -383,7 +384,7 @@ function fieldHelp(key: string): string | undefined {
|
|
|
383
384
|
>
|
|
384
385
|
<div>
|
|
385
386
|
<span class="font-medium text-default">{{ connection.label }}</span>
|
|
386
|
-
<div class="text-
|
|
387
|
+
<div class="text-2xs text-app-success-400">
|
|
387
388
|
{{ t('settings.providerConnection.connectedAt', { baseUrl: connection.baseUrl }) }}
|
|
388
389
|
</div>
|
|
389
390
|
</div>
|
|
@@ -426,14 +427,14 @@ function fieldHelp(key: string): string | undefined {
|
|
|
426
427
|
|
|
427
428
|
<!-- NATIVE provider: the friendly, descriptor-driven flat field form. -->
|
|
428
429
|
<div v-else-if="isNative" class="rounded-lg border border-dashed border-muted p-3 space-y-3">
|
|
429
|
-
<
|
|
430
|
+
<SectionLabel as="p">
|
|
430
431
|
{{
|
|
431
432
|
connection
|
|
432
433
|
? t('settings.providerConnection.form.updateConfiguration')
|
|
433
434
|
: t('settings.providerConnection.form.connect')
|
|
434
435
|
}}
|
|
435
|
-
</
|
|
436
|
-
<p v-if="connection && hasSecretFields" class="text-
|
|
436
|
+
</SectionLabel>
|
|
437
|
+
<p v-if="connection && hasSecretFields" class="text-2xs text-app-warning-300/80">
|
|
437
438
|
{{
|
|
438
439
|
t(
|
|
439
440
|
'settings.providerConnection.form.reenterSecrets',
|
|
@@ -22,6 +22,7 @@ import type { ProviderConnectionKind } from '~/types/providerConnections'
|
|
|
22
22
|
import ConnectionWarnings from '~/components/settings/ConnectionWarnings.vue'
|
|
23
23
|
import ConnectionTestVerdict from '~/components/settings/ConnectionTestVerdict.vue'
|
|
24
24
|
import SecretInput from '~/components/common/SecretInput.vue'
|
|
25
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
25
26
|
|
|
26
27
|
const props = defineProps<{
|
|
27
28
|
kind: ProviderConnectionKind
|
|
@@ -197,9 +198,9 @@ function onSave() {
|
|
|
197
198
|
|
|
198
199
|
<template>
|
|
199
200
|
<div class="space-y-3 rounded-lg border border-dashed border-muted p-3">
|
|
200
|
-
<
|
|
201
|
+
<SectionLabel as="p">
|
|
201
202
|
{{ t('settings.providerConnection.manifestEditor.title') }}
|
|
202
|
-
</
|
|
203
|
+
</SectionLabel>
|
|
203
204
|
|
|
204
205
|
<UFormField
|
|
205
206
|
:label="t('settings.providerConnection.manifestEditor.jsonLabel')"
|
|
@@ -214,7 +215,7 @@ function onSave() {
|
|
|
214
215
|
/>
|
|
215
216
|
</UFormField>
|
|
216
217
|
|
|
217
|
-
<p v-if="!savedManifest && !jsonError && !schemaError" class="text-
|
|
218
|
+
<p v-if="!savedManifest && !jsonError && !schemaError" class="text-2xs text-dimmed">
|
|
218
219
|
{{ t('settings.providerConnection.manifestEditor.starterHint') }}
|
|
219
220
|
</p>
|
|
220
221
|
|
|
@@ -236,16 +237,16 @@ function onSave() {
|
|
|
236
237
|
|
|
237
238
|
<!-- Secret sub-form: one write-only input per secret key the manifest references. -->
|
|
238
239
|
<div class="space-y-2">
|
|
239
|
-
<
|
|
240
|
+
<SectionLabel as="p">
|
|
240
241
|
{{ t('settings.providerConnection.manifestEditor.secretsLabel') }}
|
|
241
|
-
</
|
|
242
|
-
<p v-if="!secretKeys.length" class="text-
|
|
242
|
+
</SectionLabel>
|
|
243
|
+
<p v-if="!secretKeys.length" class="text-2xs text-dimmed">
|
|
243
244
|
{{ t('settings.providerConnection.manifestEditor.noSecrets') }}
|
|
244
245
|
</p>
|
|
245
246
|
<template v-else-if="connected">
|
|
246
247
|
<p
|
|
247
248
|
v-if="storedSecretKeys && storedSecretKeys.length"
|
|
248
|
-
class="text-
|
|
249
|
+
class="text-2xs text-muted"
|
|
249
250
|
data-testid="manifest-editor-stored"
|
|
250
251
|
>
|
|
251
252
|
{{
|
|
@@ -254,7 +255,7 @@ function onSave() {
|
|
|
254
255
|
})
|
|
255
256
|
}}
|
|
256
257
|
</p>
|
|
257
|
-
<p class="text-
|
|
258
|
+
<p class="text-2xs text-app-warning-300/80">
|
|
258
259
|
{{ t('settings.providerConnection.manifestEditor.reenterSecrets') }}
|
|
259
260
|
</p>
|
|
260
261
|
</template>
|
|
@@ -26,6 +26,8 @@ import {
|
|
|
26
26
|
moveFlavor,
|
|
27
27
|
subscriptionOverridesOrder,
|
|
28
28
|
} from '~/components/settings/ProviderPreferenceEditor.logic'
|
|
29
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
30
|
+
import IconButton from '~/components/common/IconButton.vue'
|
|
29
31
|
|
|
30
32
|
const props = defineProps<{
|
|
31
33
|
/** The preset's stored order; empty/absent ⇒ the deployment's default order. */
|
|
@@ -90,9 +92,9 @@ function reset() {
|
|
|
90
92
|
<template>
|
|
91
93
|
<div>
|
|
92
94
|
<div class="mb-1 flex items-start justify-between gap-3">
|
|
93
|
-
<
|
|
95
|
+
<SectionLabel as="span">
|
|
94
96
|
{{ t('settings.modelConfiguration.routeOrder.label') }}
|
|
95
|
-
</
|
|
97
|
+
</SectionLabel>
|
|
96
98
|
<UButton
|
|
97
99
|
v-if="isCustom"
|
|
98
100
|
size="xs"
|
|
@@ -105,7 +107,7 @@ function reset() {
|
|
|
105
107
|
{{ t('settings.modelConfiguration.routeOrder.reset') }}
|
|
106
108
|
</UButton>
|
|
107
109
|
</div>
|
|
108
|
-
<p class="mb-2 text-
|
|
110
|
+
<p class="mb-2 text-2xs leading-relaxed text-dimmed">
|
|
109
111
|
{{
|
|
110
112
|
isCustom
|
|
111
113
|
? t('settings.modelConfiguration.routeOrder.customHint')
|
|
@@ -118,7 +120,7 @@ function reset() {
|
|
|
118
120
|
route a connected plan quietly overrules is the one thing this control must not do. -->
|
|
119
121
|
<p
|
|
120
122
|
v-if="subscriptionWins"
|
|
121
|
-
class="mb-2 text-
|
|
123
|
+
class="mb-2 text-2xs leading-relaxed text-app-warning-400/90"
|
|
122
124
|
data-testid="preset-route-order-subscription-warning"
|
|
123
125
|
>
|
|
124
126
|
{{ t('settings.modelConfiguration.routeOrder.subscriptionOverrideHint') }}
|
|
@@ -128,7 +130,7 @@ function reset() {
|
|
|
128
130
|
answering a different question than this order asks. -->
|
|
129
131
|
<p
|
|
130
132
|
v-if="badgesShowAnotherOrder"
|
|
131
|
-
class="mb-2 text-
|
|
133
|
+
class="mb-2 text-2xs leading-relaxed text-dimmed"
|
|
132
134
|
data-testid="preset-route-order-badge-hint"
|
|
133
135
|
>
|
|
134
136
|
{{ t('settings.modelConfiguration.routeOrder.badgesUseDefaultPresetHint') }}
|
|
@@ -144,33 +146,31 @@ function reset() {
|
|
|
144
146
|
:data-testid="`preset-route-${flavor}`"
|
|
145
147
|
>
|
|
146
148
|
<span
|
|
147
|
-
class="flex h-5 w-5 shrink-0 items-center justify-center rounded bg-elevated text-
|
|
149
|
+
class="flex h-5 w-5 shrink-0 items-center justify-center rounded-sm bg-elevated text-3xs font-semibold text-muted"
|
|
148
150
|
>
|
|
149
151
|
{{ index + 1 }}
|
|
150
152
|
</span>
|
|
151
153
|
<div class="min-w-0 flex-1">
|
|
152
154
|
<p class="truncate text-sm text-default">{{ t(ROUTE_LABELS[flavor]) }}</p>
|
|
153
|
-
<p class="truncate text-
|
|
155
|
+
<p class="truncate text-2xs text-dimmed">{{ t(ROUTE_HINTS[flavor]) }}</p>
|
|
154
156
|
</div>
|
|
155
157
|
<div class="flex shrink-0 items-center gap-1">
|
|
156
|
-
<
|
|
158
|
+
<IconButton
|
|
157
159
|
size="xs"
|
|
158
160
|
variant="ghost"
|
|
159
161
|
color="neutral"
|
|
160
162
|
icon="i-lucide-chevron-up"
|
|
161
163
|
:disabled="index === 0"
|
|
162
|
-
:
|
|
163
|
-
:aria-label="t('settings.modelConfiguration.routeOrder.moveUp')"
|
|
164
|
+
:label="t('settings.modelConfiguration.routeOrder.moveUp')"
|
|
164
165
|
@click="move(index, -1)"
|
|
165
166
|
/>
|
|
166
|
-
<
|
|
167
|
+
<IconButton
|
|
167
168
|
size="xs"
|
|
168
169
|
variant="ghost"
|
|
169
170
|
color="neutral"
|
|
170
171
|
icon="i-lucide-chevron-down"
|
|
171
172
|
:disabled="index === order.length - 1"
|
|
172
|
-
:
|
|
173
|
-
:aria-label="t('settings.modelConfiguration.routeOrder.moveDown')"
|
|
173
|
+
:label="t('settings.modelConfiguration.routeOrder.moveDown')"
|
|
174
174
|
@click="move(index, 1)"
|
|
175
175
|
/>
|
|
176
176
|
</div>
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
blankRiskPolicyDraft,
|
|
11
11
|
forkGatingFromDraft,
|
|
12
12
|
} from '~/utils/riskPolicyDraft'
|
|
13
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
13
14
|
|
|
14
15
|
const props = defineProps<{ busy: boolean }>()
|
|
15
16
|
|
|
@@ -56,14 +57,14 @@ function submit() {
|
|
|
56
57
|
|
|
57
58
|
<template>
|
|
58
59
|
<div class="rounded-lg border border-dashed border-muted p-3">
|
|
59
|
-
<p class="mb-2
|
|
60
|
+
<SectionLabel as="p" class="mb-2">
|
|
60
61
|
{{ t('settings.riskPolicy.newPreset') }}
|
|
61
|
-
</
|
|
62
|
+
</SectionLabel>
|
|
62
63
|
<div class="flex flex-wrap items-end gap-3">
|
|
63
64
|
<label class="block min-w-40 flex-1">
|
|
64
|
-
<span class="mb-1 block
|
|
65
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
65
66
|
{{ t('settings.riskPolicy.create.name') }}
|
|
66
|
-
</
|
|
67
|
+
</SectionLabel>
|
|
67
68
|
<UInput
|
|
68
69
|
v-model="draft.name"
|
|
69
70
|
size="sm"
|
|
@@ -71,11 +72,12 @@ function submit() {
|
|
|
71
72
|
data-testid="risk-policy-create-name"
|
|
72
73
|
/>
|
|
73
74
|
</label>
|
|
74
|
-
<label class="block
|
|
75
|
-
<span class="mb-1 block
|
|
75
|
+
<label class="block">
|
|
76
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
76
77
|
{{ t('settings.riskPolicy.create.complexity') }}
|
|
77
|
-
</
|
|
78
|
+
</SectionLabel>
|
|
78
79
|
<UInput
|
|
80
|
+
class="w-20"
|
|
79
81
|
v-model.number="draft.maxComplexity"
|
|
80
82
|
type="number"
|
|
81
83
|
:min="0"
|
|
@@ -84,11 +86,12 @@ function submit() {
|
|
|
84
86
|
data-testid="risk-policy-create-complexity"
|
|
85
87
|
/>
|
|
86
88
|
</label>
|
|
87
|
-
<label class="block
|
|
88
|
-
<span class="mb-1 block
|
|
89
|
+
<label class="block">
|
|
90
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
89
91
|
{{ t('settings.riskPolicy.create.risk') }}
|
|
90
|
-
</
|
|
92
|
+
</SectionLabel>
|
|
91
93
|
<UInput
|
|
94
|
+
class="w-20"
|
|
92
95
|
v-model.number="draft.maxRisk"
|
|
93
96
|
type="number"
|
|
94
97
|
:min="0"
|
|
@@ -97,11 +100,12 @@ function submit() {
|
|
|
97
100
|
data-testid="risk-policy-create-risk"
|
|
98
101
|
/>
|
|
99
102
|
</label>
|
|
100
|
-
<label class="block
|
|
101
|
-
<span class="mb-1 block
|
|
103
|
+
<label class="block">
|
|
104
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
102
105
|
{{ t('settings.riskPolicy.create.impact') }}
|
|
103
|
-
</
|
|
106
|
+
</SectionLabel>
|
|
104
107
|
<UInput
|
|
108
|
+
class="w-20"
|
|
105
109
|
v-model.number="draft.maxImpact"
|
|
106
110
|
type="number"
|
|
107
111
|
:min="0"
|
|
@@ -110,17 +114,25 @@ function submit() {
|
|
|
110
114
|
data-testid="risk-policy-create-impact"
|
|
111
115
|
/>
|
|
112
116
|
</label>
|
|
113
|
-
<label class="block
|
|
114
|
-
<span class="mb-1 block
|
|
117
|
+
<label class="block">
|
|
118
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
115
119
|
{{ t('settings.riskPolicy.create.ciFix') }}
|
|
116
|
-
</
|
|
117
|
-
<UInput
|
|
120
|
+
</SectionLabel>
|
|
121
|
+
<UInput
|
|
122
|
+
class="w-20"
|
|
123
|
+
v-model.number="draft.ciMaxAttempts"
|
|
124
|
+
type="number"
|
|
125
|
+
:min="0"
|
|
126
|
+
:max="50"
|
|
127
|
+
size="sm"
|
|
128
|
+
/>
|
|
118
129
|
</label>
|
|
119
|
-
<label class="block
|
|
120
|
-
<span class="mb-1 block
|
|
130
|
+
<label class="block">
|
|
131
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
121
132
|
{{ t('settings.riskPolicy.create.reqIter') }}
|
|
122
|
-
</
|
|
133
|
+
</SectionLabel>
|
|
123
134
|
<UInput
|
|
135
|
+
class="w-20"
|
|
124
136
|
v-model.number="draft.maxRequirementIterations"
|
|
125
137
|
type="number"
|
|
126
138
|
:min="1"
|
|
@@ -128,11 +140,12 @@ function submit() {
|
|
|
128
140
|
size="sm"
|
|
129
141
|
/>
|
|
130
142
|
</label>
|
|
131
|
-
<label class="block
|
|
132
|
-
<span class="mb-1 block
|
|
143
|
+
<label class="block">
|
|
144
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
133
145
|
{{ t('settings.riskPolicy.create.companionRework') }}
|
|
134
|
-
</
|
|
146
|
+
</SectionLabel>
|
|
135
147
|
<UInput
|
|
148
|
+
class="w-20"
|
|
136
149
|
v-model.number="draft.companionMaxReworks"
|
|
137
150
|
type="number"
|
|
138
151
|
:min="0"
|
|
@@ -140,11 +153,12 @@ function submit() {
|
|
|
140
153
|
size="sm"
|
|
141
154
|
/>
|
|
142
155
|
</label>
|
|
143
|
-
<label class="block
|
|
144
|
-
<span class="mb-1 block
|
|
156
|
+
<label class="block">
|
|
157
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
145
158
|
{{ t('settings.riskPolicy.create.autoPass') }}
|
|
146
|
-
</
|
|
159
|
+
</SectionLabel>
|
|
147
160
|
<USelect
|
|
161
|
+
class="w-32"
|
|
148
162
|
v-model="draft.maxRequirementConcernAllowed"
|
|
149
163
|
:items="concernOptions"
|
|
150
164
|
value-key="value"
|
|
@@ -23,6 +23,8 @@ import {
|
|
|
23
23
|
import { RISK_POLICY_AXES, RISK_POLICY_CEILING_FIELD } from '~/utils/riskPolicy'
|
|
24
24
|
import MergeClassRulesEditor from '~/components/settings/MergeClassRulesEditor.vue'
|
|
25
25
|
import MergeRolePolicyEditor from '~/components/settings/MergeRolePolicyEditor.vue'
|
|
26
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
27
|
+
import IconButton from '~/components/common/IconButton.vue'
|
|
26
28
|
|
|
27
29
|
const props = defineProps<{
|
|
28
30
|
policy: RiskPolicyLibraryEntry
|
|
@@ -143,22 +145,22 @@ const deleteBlocked = computed(
|
|
|
143
145
|
{{ t('settings.riskPolicy.makeDefault') }}
|
|
144
146
|
</UButton>
|
|
145
147
|
</template>
|
|
146
|
-
<
|
|
148
|
+
<IconButton
|
|
147
149
|
color="error"
|
|
148
150
|
variant="ghost"
|
|
149
151
|
size="xs"
|
|
150
152
|
icon="i-lucide-trash-2"
|
|
151
153
|
:disabled="deleteBlocked || busy?.startsWith(policy.id)"
|
|
152
|
-
:
|
|
154
|
+
:label="deleteBlockedReason"
|
|
153
155
|
@click="emit('remove')"
|
|
154
156
|
/>
|
|
155
157
|
</div>
|
|
156
158
|
|
|
157
159
|
<div class="grid grid-cols-1 gap-3 sm:grid-cols-4">
|
|
158
160
|
<label v-for="axis in RISK_POLICY_AXES" :key="axis" class="block">
|
|
159
|
-
<span class="mb-1 block
|
|
161
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
160
162
|
{{ t(CEILING_LABEL_KEYS[axis]) }}
|
|
161
|
-
</
|
|
163
|
+
</SectionLabel>
|
|
162
164
|
<UInput
|
|
163
165
|
v-model.number="draft[RISK_POLICY_CEILING_FIELD[axis]]"
|
|
164
166
|
type="number"
|
|
@@ -168,15 +170,15 @@ const deleteBlocked = computed(
|
|
|
168
170
|
/>
|
|
169
171
|
</label>
|
|
170
172
|
<label class="block">
|
|
171
|
-
<span class="mb-1 block
|
|
173
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
172
174
|
{{ t('settings.riskPolicy.field.ciMaxAttempts') }}
|
|
173
|
-
</
|
|
175
|
+
</SectionLabel>
|
|
174
176
|
<UInput v-model.number="draft.ciMaxAttempts" type="number" :min="0" :max="50" size="sm" />
|
|
175
177
|
</label>
|
|
176
178
|
<label class="block">
|
|
177
|
-
<span class="mb-1 block
|
|
179
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
178
180
|
{{ t('settings.riskPolicy.field.maxRequirementIterations') }}
|
|
179
|
-
</
|
|
181
|
+
</SectionLabel>
|
|
180
182
|
<UInput
|
|
181
183
|
v-model.number="draft.maxRequirementIterations"
|
|
182
184
|
type="number"
|
|
@@ -186,9 +188,9 @@ const deleteBlocked = computed(
|
|
|
186
188
|
/>
|
|
187
189
|
</label>
|
|
188
190
|
<label class="block">
|
|
189
|
-
<span class="mb-1 block
|
|
191
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
190
192
|
{{ t('settings.riskPolicy.field.companionMaxReworks') }}
|
|
191
|
-
</
|
|
193
|
+
</SectionLabel>
|
|
192
194
|
<UInput
|
|
193
195
|
v-model.number="draft.companionMaxReworks"
|
|
194
196
|
type="number"
|
|
@@ -198,9 +200,9 @@ const deleteBlocked = computed(
|
|
|
198
200
|
/>
|
|
199
201
|
</label>
|
|
200
202
|
<label class="block">
|
|
201
|
-
<span class="mb-1 block
|
|
203
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
202
204
|
{{ t('settings.riskPolicy.field.maxRequirementConcernAllowed') }}
|
|
203
|
-
</
|
|
205
|
+
</SectionLabel>
|
|
204
206
|
<USelect
|
|
205
207
|
v-model="draft.maxRequirementConcernAllowed"
|
|
206
208
|
:items="concernOptions"
|
|
@@ -245,9 +247,9 @@ const deleteBlocked = computed(
|
|
|
245
247
|
/>
|
|
246
248
|
<div v-if="draft.forkEnabled" class="mt-3 grid grid-cols-1 gap-3 sm:grid-cols-4">
|
|
247
249
|
<label v-for="axis in RISK_POLICY_AXES" :key="axis" class="block">
|
|
248
|
-
<span class="mb-1 block
|
|
250
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
249
251
|
{{ t(FORK_FLOOR_LABEL_KEYS[axis]) }}
|
|
250
|
-
</
|
|
252
|
+
</SectionLabel>
|
|
251
253
|
<UInput
|
|
252
254
|
v-model.number="draft[FORK_FLOOR_FIELD[axis]]"
|
|
253
255
|
type="number"
|
|
@@ -257,9 +259,9 @@ const deleteBlocked = computed(
|
|
|
257
259
|
/>
|
|
258
260
|
</label>
|
|
259
261
|
<label class="block">
|
|
260
|
-
<span class="mb-1 block
|
|
262
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
261
263
|
{{ t('settings.riskPolicy.forkDecision.onMissingLabel') }}
|
|
262
|
-
</
|
|
264
|
+
</SectionLabel>
|
|
263
265
|
<USelect v-model="draft.forkOnMissing" :items="onMissingOptions" size="sm" />
|
|
264
266
|
</label>
|
|
265
267
|
</div>
|
|
@@ -283,9 +285,9 @@ const deleteBlocked = computed(
|
|
|
283
285
|
on an attended policy would be a control over a decision this policy never makes. It is
|
|
284
286
|
not hidden as an "advanced override" — it is inert, which is a different thing. -->
|
|
285
287
|
<label v-if="draft.unattended" class="mt-3 block">
|
|
286
|
-
<span class="mb-1 block
|
|
288
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
287
289
|
{{ t('settings.riskPolicy.autoAnswer.label') }}
|
|
288
|
-
</
|
|
290
|
+
</SectionLabel>
|
|
289
291
|
<UInput
|
|
290
292
|
v-model.number="draft.minAutoAnswerConfidence"
|
|
291
293
|
type="number"
|
|
@@ -294,7 +296,7 @@ const deleteBlocked = computed(
|
|
|
294
296
|
size="sm"
|
|
295
297
|
data-testid="risk-policy-auto-answer-floor"
|
|
296
298
|
/>
|
|
297
|
-
<span class="mt-1 block text-
|
|
299
|
+
<span class="mt-1 block text-2xs text-dimmed">
|
|
298
300
|
{{ t('settings.riskPolicy.autoAnswer.hint') }}
|
|
299
301
|
</span>
|
|
300
302
|
</label>
|
|
@@ -64,7 +64,7 @@ const reseedableCount = computed(
|
|
|
64
64
|
{{ t('riskPolicy.health.newHeading') }}
|
|
65
65
|
</h3>
|
|
66
66
|
</div>
|
|
67
|
-
<p class="text-
|
|
67
|
+
<p class="text-2xs text-dimmed">{{ t('riskPolicy.health.newDescription') }}</p>
|
|
68
68
|
<ul class="space-y-2">
|
|
69
69
|
<li
|
|
70
70
|
v-for="i in newPresets"
|
|
@@ -99,7 +99,7 @@ const reseedableCount = computed(
|
|
|
99
99
|
{{ t('riskPolicy.health.updatesHeading') }}
|
|
100
100
|
</h3>
|
|
101
101
|
</div>
|
|
102
|
-
<p class="text-
|
|
102
|
+
<p class="text-2xs text-dimmed">
|
|
103
103
|
{{ t('riskPolicy.health.updatesDescription') }}
|
|
104
104
|
</p>
|
|
105
105
|
<ul class="space-y-2">
|
|
@@ -110,7 +110,7 @@ const reseedableCount = computed(
|
|
|
110
110
|
>
|
|
111
111
|
<div class="min-w-0">
|
|
112
112
|
<span class="truncate text-sm font-medium text-app-100">{{ i.name }}</span>
|
|
113
|
-
<p class="text-
|
|
113
|
+
<p class="text-2xs text-app-warning-400/80">
|
|
114
114
|
{{
|
|
115
115
|
t('riskPolicy.health.versionAvailable', {
|
|
116
116
|
from: i.fromVersion ?? 0,
|
|
@@ -13,6 +13,7 @@ import { riskPolicyCopyName } from '~/utils/riskPolicy'
|
|
|
13
13
|
import RiskPolicyCreateForm from '~/components/settings/RiskPolicyCreateForm.vue'
|
|
14
14
|
import RiskPolicyEditorRow from '~/components/settings/RiskPolicyEditorRow.vue'
|
|
15
15
|
import RiskPolicyInheritedRow from '~/components/settings/RiskPolicyInheritedRow.vue'
|
|
16
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
16
17
|
|
|
17
18
|
const { t } = useI18n()
|
|
18
19
|
|
|
@@ -179,10 +180,10 @@ function unhide(presetId: string) {
|
|
|
179
180
|
<!-- Inherited FIRST: they are the org's posture, and a board reading its own list wants to see
|
|
180
181
|
what it is working from before what it has changed. -->
|
|
181
182
|
<section v-if="inherited.length > 0" class="space-y-2">
|
|
182
|
-
<
|
|
183
|
+
<SectionLabel as="p">
|
|
183
184
|
{{ t('settings.riskPolicy.inherited.heading') }}
|
|
184
|
-
</
|
|
185
|
-
<p class="text-
|
|
185
|
+
</SectionLabel>
|
|
186
|
+
<p class="text-2xs text-dimmed">{{ t('settings.riskPolicy.inherited.hint') }}</p>
|
|
186
187
|
<RiskPolicyInheritedRow
|
|
187
188
|
v-for="policy in inherited"
|
|
188
189
|
:key="policy.id"
|
|
@@ -194,12 +195,9 @@ function unhide(presetId: string) {
|
|
|
194
195
|
</section>
|
|
195
196
|
|
|
196
197
|
<section class="space-y-4">
|
|
197
|
-
<p
|
|
198
|
-
v-if="inherited.length > 0"
|
|
199
|
-
class="text-[11px] font-semibold uppercase tracking-wide text-muted"
|
|
200
|
-
>
|
|
198
|
+
<SectionLabel v-if="inherited.length > 0" as="p">
|
|
201
199
|
{{ t('settings.riskPolicy.own.heading') }}
|
|
202
|
-
</
|
|
200
|
+
</SectionLabel>
|
|
203
201
|
<RiskPolicyEditorRow
|
|
204
202
|
v-for="policy in own"
|
|
205
203
|
:key="policy.id"
|
|
@@ -217,10 +215,10 @@ function unhide(presetId: string) {
|
|
|
217
215
|
whether it still shadows an account policy: one whose policy the account has since withdrawn
|
|
218
216
|
withholds nothing, and reading it as a live opt-out would misstate what the board is doing. -->
|
|
219
217
|
<section v-if="store.suppressions.length > 0 || suppressionsFailed" class="space-y-2">
|
|
220
|
-
<
|
|
218
|
+
<SectionLabel as="p">
|
|
221
219
|
{{ t('settings.riskPolicy.hidden.heading') }}
|
|
222
|
-
</
|
|
223
|
-
<p v-if="suppressionsFailed" class="text-
|
|
220
|
+
</SectionLabel>
|
|
221
|
+
<p v-if="suppressionsFailed" class="text-2xs text-app-warning-400">
|
|
224
222
|
{{ t('settings.riskPolicy.hidden.loadFailed') }}
|
|
225
223
|
</p>
|
|
226
224
|
<div
|
|
@@ -230,8 +228,8 @@ function unhide(presetId: string) {
|
|
|
230
228
|
data-testid="risk-policy-hidden-row"
|
|
231
229
|
:data-policy-id="entry.id"
|
|
232
230
|
>
|
|
233
|
-
<span class="flex-1 truncate text-
|
|
234
|
-
<span v-if="!entry.inherited" class="text-
|
|
231
|
+
<span class="flex-1 truncate text-xs text-toned">{{ entry.name }}</span>
|
|
232
|
+
<span v-if="!entry.inherited" class="text-2xs text-dimmed">
|
|
235
233
|
{{ t('settings.riskPolicy.hidden.withdrawn') }}
|
|
236
234
|
</span>
|
|
237
235
|
<UButton
|