@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
|
@@ -13,6 +13,7 @@ import type { JudgeFinding, JudgeStepState } from '~/types/execution'
|
|
|
13
13
|
import ResultWindowShell from '~/components/panels/ResultWindowShell.vue'
|
|
14
14
|
import CopyButton from '~/components/common/CopyButton.vue'
|
|
15
15
|
import MarkdownProse from '~/components/common/MarkdownProse.vue'
|
|
16
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
16
17
|
|
|
17
18
|
const board = useBoardStore()
|
|
18
19
|
const execution = useExecutionStore()
|
|
@@ -162,23 +163,23 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
|
|
|
162
163
|
class="flex flex-wrap items-center gap-x-3 gap-y-1 rounded-lg border border-default bg-app-950/40 px-3 py-2.5"
|
|
163
164
|
data-testid="judge-score"
|
|
164
165
|
>
|
|
165
|
-
<span class="text-
|
|
166
|
+
<span class="text-sm font-semibold text-app-100">
|
|
166
167
|
{{ score === null ? t('judge.notScored') : n(score, 'percent') }}
|
|
167
168
|
</span>
|
|
168
169
|
<span
|
|
169
170
|
v-if="threshold !== null"
|
|
170
|
-
class="text-
|
|
171
|
+
class="text-xs text-muted"
|
|
171
172
|
:title="t('judge.thresholdHint')"
|
|
172
173
|
>
|
|
173
174
|
{{ t('judge.threshold', { threshold: n(threshold, 'percent') }) }}
|
|
174
175
|
</span>
|
|
175
|
-
<span v-if="judge.disposition" class="text-
|
|
176
|
+
<span v-if="judge.disposition" class="text-xs text-muted">
|
|
176
177
|
· {{ DISPOSITION_LABELS[judge.disposition] }}
|
|
177
178
|
</span>
|
|
178
|
-
<span v-if="judge.rubricOverridden" class="text-
|
|
179
|
+
<span v-if="judge.rubricOverridden" class="text-2xs text-app-secondary-300">
|
|
179
180
|
· {{ t('judge.rubricOverridden') }}
|
|
180
181
|
</span>
|
|
181
|
-
<span v-if="(judge.maxBounces ?? 0) > 0" class="text-
|
|
182
|
+
<span v-if="(judge.maxBounces ?? 0) > 0" class="text-2xs text-dimmed">
|
|
182
183
|
·
|
|
183
184
|
{{ t('judge.reworkRounds', { spent: judge.bounces ?? 0, budget: judge.maxBounces }) }}
|
|
184
185
|
</span>
|
|
@@ -189,7 +190,7 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
|
|
|
189
190
|
name doesn't, and being overridden by the task's own choice is the normal outcome. -->
|
|
190
191
|
<p
|
|
191
192
|
v-if="judge.modelPin?.status === 'unavailable'"
|
|
192
|
-
class="mt-2 rounded-md border border-app-warning-500/30 bg-app-warning-500/5 px-3 py-2 text-
|
|
193
|
+
class="mt-2 rounded-md border border-app-warning-500/30 bg-app-warning-500/5 px-3 py-2 text-xs leading-relaxed text-app-warning-200"
|
|
193
194
|
data-testid="judge-model-pin"
|
|
194
195
|
>
|
|
195
196
|
{{ t('judge.modelPinUnavailable', { model: judge.modelPin.requested }) }}
|
|
@@ -199,7 +200,7 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
|
|
|
199
200
|
like a clean pass. -->
|
|
200
201
|
<p
|
|
201
202
|
v-if="judge.note"
|
|
202
|
-
class="mt-2 rounded-md border border-default bg-app-950/40 px-3 py-2 text-
|
|
203
|
+
class="mt-2 rounded-md border border-default bg-app-950/40 px-3 py-2 text-xs leading-relaxed text-muted"
|
|
203
204
|
>
|
|
204
205
|
{{ judge.note }}
|
|
205
206
|
</p>
|
|
@@ -210,14 +211,14 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
|
|
|
210
211
|
<CopyButton :text="verdict.summary" class="absolute end-1 top-1" />
|
|
211
212
|
<MarkdownProse
|
|
212
213
|
:text="verdict.summary"
|
|
213
|
-
class="pe-8 text-
|
|
214
|
+
class="pe-8 text-sm leading-relaxed text-default"
|
|
214
215
|
/>
|
|
215
216
|
</div>
|
|
216
217
|
|
|
217
218
|
<section v-if="findings.length" class="mt-4">
|
|
218
|
-
<h3 class="mb-2
|
|
219
|
+
<SectionLabel as="h3" class="mb-2">
|
|
219
220
|
{{ t('judge.findingsHeading') }}
|
|
220
|
-
</
|
|
221
|
+
</SectionLabel>
|
|
221
222
|
<ul class="flex flex-col gap-2">
|
|
222
223
|
<li
|
|
223
224
|
v-for="(finding, i) in findings"
|
|
@@ -227,20 +228,18 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
|
|
|
227
228
|
>
|
|
228
229
|
<div class="flex flex-wrap items-center gap-2">
|
|
229
230
|
<span
|
|
230
|
-
class="rounded border px-1.5 py-0.5 text-
|
|
231
|
+
class="rounded-sm border px-1.5 py-0.5 text-3xs uppercase tracking-wide"
|
|
231
232
|
:class="SEVERITY_CLASSES[finding.severity]"
|
|
232
233
|
>
|
|
233
234
|
{{ SEVERITY_LABELS[finding.severity] }}
|
|
234
235
|
</span>
|
|
235
|
-
<span class="text-
|
|
236
|
-
<code v-if="finding.where" class="text-
|
|
237
|
-
finding.where
|
|
238
|
-
}}</code>
|
|
236
|
+
<span class="text-sm font-medium text-app-100">{{ finding.title }}</span>
|
|
237
|
+
<code v-if="finding.where" class="text-2xs text-dimmed">{{ finding.where }}</code>
|
|
239
238
|
</div>
|
|
240
239
|
<MarkdownProse
|
|
241
240
|
v-if="finding.detail"
|
|
242
241
|
:text="finding.detail"
|
|
243
|
-
class="mt-1 text-
|
|
242
|
+
class="mt-1 text-xs leading-relaxed text-muted"
|
|
244
243
|
/>
|
|
245
244
|
</li>
|
|
246
245
|
</ul>
|
|
@@ -248,20 +247,22 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
|
|
|
248
247
|
|
|
249
248
|
<!-- The decision. Only shown while the run is actually parked on this verdict. -->
|
|
250
249
|
<section v-if="awaiting" class="mt-5" data-testid="judge-decision">
|
|
251
|
-
<h3 class="mb-1.5
|
|
250
|
+
<SectionLabel as="h3" class="mb-1.5">
|
|
252
251
|
{{ t('judge.decisionHeading') }}
|
|
253
|
-
</
|
|
254
|
-
<p class="mb-2 text-
|
|
252
|
+
</SectionLabel>
|
|
253
|
+
<p class="mb-2 text-2xs leading-relaxed text-dimmed">
|
|
255
254
|
{{ t('judge.decisionDescription') }}
|
|
256
255
|
</p>
|
|
257
|
-
<
|
|
256
|
+
<UTextarea
|
|
258
257
|
v-model="feedback"
|
|
259
|
-
rows="3"
|
|
258
|
+
:rows="3"
|
|
260
259
|
:disabled="busy"
|
|
261
260
|
:placeholder="t('judge.feedbackPlaceholder')"
|
|
262
|
-
|
|
261
|
+
size="sm"
|
|
262
|
+
class="w-full"
|
|
263
|
+
:ui="{ base: 'resize-y' }"
|
|
263
264
|
/>
|
|
264
|
-
<p v-if="judgeStore.error" class="mt-2 text-
|
|
265
|
+
<p v-if="judgeStore.error" class="mt-2 text-xs text-app-error-300">
|
|
265
266
|
{{ judgeStore.error }}
|
|
266
267
|
</p>
|
|
267
268
|
<div class="mt-2 flex flex-wrap justify-end gap-2">
|
|
@@ -307,21 +308,21 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
|
|
|
307
308
|
|
|
308
309
|
<!-- The round history: a looping judge must not be a black box (the gate-attempt rule). -->
|
|
309
310
|
<section v-if="rounds.length > 1" class="mt-5">
|
|
310
|
-
<h3 class="mb-2
|
|
311
|
+
<SectionLabel as="h3" class="mb-2">
|
|
311
312
|
{{ t('judge.roundsHeading') }}
|
|
312
|
-
</
|
|
313
|
+
</SectionLabel>
|
|
313
314
|
<ul class="flex flex-col gap-1.5">
|
|
314
315
|
<li
|
|
315
316
|
v-for="round in rounds"
|
|
316
317
|
:key="round.round"
|
|
317
|
-
class="flex flex-wrap items-center gap-2 rounded-md border border-default bg-app-950/40 px-3 py-1.5 text-
|
|
318
|
+
class="flex flex-wrap items-center gap-2 rounded-md border border-default bg-app-950/40 px-3 py-1.5 text-xs text-toned"
|
|
318
319
|
data-testid="judge-round"
|
|
319
320
|
:data-round-disposition="round.disposition"
|
|
320
321
|
>
|
|
321
322
|
<span class="text-dimmed">{{ t('judge.round', { round: round.round }) }}</span>
|
|
322
323
|
<span class="font-medium text-app-100">{{ n(round.verdict.score, 'percent') }}</span>
|
|
323
324
|
<span class="text-muted">{{ DISPOSITION_LABELS[round.disposition] }}</span>
|
|
324
|
-
<code v-if="round.model" class="text-
|
|
325
|
+
<code v-if="round.model" class="text-2xs text-dimmed">{{ round.model }}</code>
|
|
325
326
|
</li>
|
|
326
327
|
</ul>
|
|
327
328
|
</section>
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import { computed, watch } from 'vue'
|
|
3
3
|
import { onKeyStroke } from '@vueuse/core'
|
|
4
|
+
import type { TableColumn } from '@nuxt/ui'
|
|
4
5
|
import type { KaizenGrading } from '~/types/domain'
|
|
5
6
|
import { agentKindMeta } from '~/utils/catalog'
|
|
6
7
|
|
|
@@ -48,6 +49,16 @@ function statusLabel(g: KaizenGrading): string {
|
|
|
48
49
|
if (g.status === 'failed') return t('kaizen.status.failed')
|
|
49
50
|
return g.grade != null ? t('kaizen.gradeValue', { grade: g.grade }) : t('kaizen.status.graded')
|
|
50
51
|
}
|
|
52
|
+
|
|
53
|
+
// Column definitions rather than hand-written `<th>`s, so the header typography comes from the
|
|
54
|
+
// table theme and is the same one every other table in the SPA renders.
|
|
55
|
+
const historyColumns = computed<TableColumn<KaizenGrading>[]>(() => [
|
|
56
|
+
{ id: 'when', header: t('kaizen.history.col.when') },
|
|
57
|
+
{ id: 'agent', header: t('kaizen.history.col.agent') },
|
|
58
|
+
{ id: 'model', header: t('kaizen.history.col.model') },
|
|
59
|
+
{ id: 'grade', header: t('kaizen.history.col.grade') },
|
|
60
|
+
{ id: 'recommendations', header: t('kaizen.history.col.recommendations') },
|
|
61
|
+
])
|
|
51
62
|
</script>
|
|
52
63
|
|
|
53
64
|
<template>
|
|
@@ -107,7 +118,7 @@ function statusLabel(g: KaizenGrading): string {
|
|
|
107
118
|
t('kaizen.verifiedCombos.count', { count: kaizen.verifiedCount })
|
|
108
119
|
}}</span>
|
|
109
120
|
</h2>
|
|
110
|
-
<p class="mb-3 text-
|
|
121
|
+
<p class="mb-3 text-2xs text-dimmed">
|
|
111
122
|
{{ t('kaizen.verifiedCombos.hint') }}
|
|
112
123
|
</p>
|
|
113
124
|
<ul class="space-y-2">
|
|
@@ -130,11 +141,11 @@ function statusLabel(g: KaizenGrading): string {
|
|
|
130
141
|
name="i-lucide-badge-check"
|
|
131
142
|
class="ms-auto h-3.5 w-3.5 text-app-success-400"
|
|
132
143
|
/>
|
|
133
|
-
<span v-else class="ms-auto text-
|
|
144
|
+
<span v-else class="ms-auto text-2xs text-dimmed">
|
|
134
145
|
{{ t('kaizen.verifiedCombos.progress', { count: c.consecutiveHighGrades }) }}
|
|
135
146
|
</span>
|
|
136
147
|
</div>
|
|
137
|
-
<div class="mt-1 truncate text-
|
|
148
|
+
<div class="mt-1 truncate text-2xs text-dimmed" :title="c.model">
|
|
138
149
|
{{
|
|
139
150
|
t('kaizen.verifiedCombos.modelPrompt', {
|
|
140
151
|
model: c.model,
|
|
@@ -155,59 +166,62 @@ function statusLabel(g: KaizenGrading): string {
|
|
|
155
166
|
<UIcon name="i-lucide-history" class="h-4 w-4 text-app-hue-teal" />
|
|
156
167
|
{{ t('kaizen.history.title') }}
|
|
157
168
|
</h2>
|
|
158
|
-
<
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
</
|
|
208
|
-
</
|
|
209
|
-
</
|
|
210
|
-
|
|
169
|
+
<UTable
|
|
170
|
+
:data="kaizen.history"
|
|
171
|
+
:columns="historyColumns"
|
|
172
|
+
:ui="{
|
|
173
|
+
root: 'overflow-hidden rounded-lg border border-default',
|
|
174
|
+
base: 'text-xs',
|
|
175
|
+
th: 'px-3 py-2',
|
|
176
|
+
td: 'px-3 py-2 text-xs whitespace-normal',
|
|
177
|
+
tr: 'align-top',
|
|
178
|
+
}"
|
|
179
|
+
>
|
|
180
|
+
<template #when-cell="{ row }">
|
|
181
|
+
<span class="whitespace-nowrap text-dimmed">{{
|
|
182
|
+
when(row.original.createdAt)
|
|
183
|
+
}}</span>
|
|
184
|
+
</template>
|
|
185
|
+
<template #agent-cell="{ row }">
|
|
186
|
+
<span class="flex items-center gap-1.5">
|
|
187
|
+
<UIcon
|
|
188
|
+
:name="meta(row.original.agentKind).icon"
|
|
189
|
+
class="h-3.5 w-3.5"
|
|
190
|
+
:style="{ color: meta(row.original.agentKind).color }"
|
|
191
|
+
/>
|
|
192
|
+
<span class="text-default">{{ meta(row.original.agentKind).label }}</span>
|
|
193
|
+
<span class="text-app-600">{{
|
|
194
|
+
t('kaizen.promptVersion', { version: row.original.promptVersion })
|
|
195
|
+
}}</span>
|
|
196
|
+
</span>
|
|
197
|
+
</template>
|
|
198
|
+
<template #model-cell="{ row }">
|
|
199
|
+
<span class="block max-w-[12rem] truncate text-muted" :title="row.original.model">
|
|
200
|
+
{{ row.original.model }}
|
|
201
|
+
</span>
|
|
202
|
+
</template>
|
|
203
|
+
<template #grade-cell="{ row }">
|
|
204
|
+
<span class="whitespace-nowrap font-semibold" :class="gradeTone(row.original)">
|
|
205
|
+
{{ statusLabel(row.original) }}
|
|
206
|
+
</span>
|
|
207
|
+
</template>
|
|
208
|
+
<template #recommendations-cell="{ row }">
|
|
209
|
+
<div class="text-muted">
|
|
210
|
+
<ul v-if="row.original.recommendations.length" class="list-disc space-y-0.5 ps-4">
|
|
211
|
+
<li v-for="(r, i) in row.original.recommendations" :key="i">{{ r }}</li>
|
|
212
|
+
</ul>
|
|
213
|
+
<span v-else-if="row.original.status === 'complete'" class="text-app-600">
|
|
214
|
+
—
|
|
215
|
+
</span>
|
|
216
|
+
<span v-else-if="row.original.error" class="text-app-error-400/80">
|
|
217
|
+
{{ row.original.error }}
|
|
218
|
+
</span>
|
|
219
|
+
</div>
|
|
220
|
+
</template>
|
|
221
|
+
<template #empty>
|
|
222
|
+
<span class="text-app-600">{{ t('kaizen.history.empty') }}</span>
|
|
223
|
+
</template>
|
|
224
|
+
</UTable>
|
|
211
225
|
</section>
|
|
212
226
|
</div>
|
|
213
227
|
</div>
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import { computed, watch } from 'vue'
|
|
3
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
3
4
|
|
|
4
5
|
// Per-step Kaizen grading status, shown inside the run window (NOT on the board). Reads
|
|
5
6
|
// the grading for this run's step from the kaizen store, lazily loading the run's
|
|
@@ -68,29 +69,29 @@ const tone = computed(() => {
|
|
|
68
69
|
</span>
|
|
69
70
|
</div>
|
|
70
71
|
|
|
71
|
-
<p v-if="grading.status === 'scheduled'" class="mt-2 text-
|
|
72
|
+
<p v-if="grading.status === 'scheduled'" class="mt-2 text-2xs text-dimmed">
|
|
72
73
|
{{ t('kaizen.scheduledHint') }}
|
|
73
74
|
</p>
|
|
74
75
|
|
|
75
76
|
<template v-else-if="grading.status === 'complete'">
|
|
76
77
|
<p v-if="grading.summary" class="mt-2 text-xs text-toned">{{ grading.summary }}</p>
|
|
77
78
|
<div v-if="grading.recommendations.length" class="mt-2">
|
|
78
|
-
<
|
|
79
|
+
<SectionLabel as="p">
|
|
79
80
|
{{ t('kaizen.recommendations') }}
|
|
80
|
-
</
|
|
81
|
+
</SectionLabel>
|
|
81
82
|
<ul class="mt-1 list-disc space-y-0.5 ps-4 text-xs text-toned">
|
|
82
83
|
<li v-for="(r, i) in grading.recommendations" :key="i">{{ r }}</li>
|
|
83
84
|
</ul>
|
|
84
85
|
</div>
|
|
85
|
-
<p v-else class="mt-2 text-
|
|
86
|
+
<p v-else class="mt-2 text-2xs text-app-success-400/80">
|
|
86
87
|
{{ t('kaizen.noImprovements') }}
|
|
87
88
|
</p>
|
|
88
|
-
<p v-if="grading.graderModel" class="mt-2 text-
|
|
89
|
+
<p v-if="grading.graderModel" class="mt-2 text-3xs text-app-600">
|
|
89
90
|
{{ t('kaizen.gradedBy', { model: grading.graderModel }) }}
|
|
90
91
|
</p>
|
|
91
92
|
</template>
|
|
92
93
|
|
|
93
|
-
<p v-else-if="grading.status === 'failed'" class="mt-2 text-
|
|
94
|
+
<p v-else-if="grading.status === 'failed'" class="mt-2 text-2xs text-app-error-400/80">
|
|
94
95
|
{{ grading.error ?? t('kaizen.failedFallback') }}
|
|
95
96
|
</p>
|
|
96
97
|
</section>
|
|
@@ -117,7 +117,7 @@ function timestamp(at: number): string {
|
|
|
117
117
|
<li
|
|
118
118
|
v-for="event in events"
|
|
119
119
|
:key="event.id"
|
|
120
|
-
class="rounded border border-default bg-default/40 px-3 py-2"
|
|
120
|
+
class="rounded-sm border border-default bg-default/40 px-3 py-2"
|
|
121
121
|
>
|
|
122
122
|
<div class="flex flex-wrap items-baseline gap-x-2">
|
|
123
123
|
<span class="font-medium text-highlighted">{{ actor(event) }}</span>
|
|
@@ -435,7 +435,7 @@ async function clearWeb() {
|
|
|
435
435
|
<div v-if="store.available !== false" class="space-y-6">
|
|
436
436
|
<div>
|
|
437
437
|
<h3 class="mb-1 font-semibold text-highlighted">{{ t('layout.accountDeployment.title') }}</h3>
|
|
438
|
-
<p class="text-
|
|
438
|
+
<p class="text-2xs text-muted">
|
|
439
439
|
{{ t('layout.accountDeployment.intro') }}
|
|
440
440
|
</p>
|
|
441
441
|
</div>
|
|
@@ -458,7 +458,7 @@ async function clearWeb() {
|
|
|
458
458
|
}}
|
|
459
459
|
</UBadge>
|
|
460
460
|
</div>
|
|
461
|
-
<p class="text-
|
|
461
|
+
<p class="text-2xs text-muted">
|
|
462
462
|
{{ t('layout.accountDeployment.slack.description') }}
|
|
463
463
|
</p>
|
|
464
464
|
<div class="grid grid-cols-1 gap-2 sm:grid-cols-3">
|
|
@@ -519,7 +519,7 @@ async function clearWeb() {
|
|
|
519
519
|
}}
|
|
520
520
|
</UBadge>
|
|
521
521
|
</div>
|
|
522
|
-
<p class="text-
|
|
522
|
+
<p class="text-2xs text-muted">
|
|
523
523
|
{{ t('layout.accountDeployment.linear.description') }}
|
|
524
524
|
</p>
|
|
525
525
|
<div class="grid grid-cols-1 gap-2 sm:grid-cols-3">
|
|
@@ -580,7 +580,7 @@ async function clearWeb() {
|
|
|
580
580
|
}}
|
|
581
581
|
</UBadge>
|
|
582
582
|
</div>
|
|
583
|
-
<p class="text-
|
|
583
|
+
<p class="text-2xs text-muted">
|
|
584
584
|
{{ t('layout.accountDeployment.figma.description') }}
|
|
585
585
|
</p>
|
|
586
586
|
<div class="grid grid-cols-1 gap-2 sm:grid-cols-3">
|
|
@@ -637,7 +637,7 @@ async function clearWeb() {
|
|
|
637
637
|
}}
|
|
638
638
|
</UBadge>
|
|
639
639
|
</div>
|
|
640
|
-
<p class="text-
|
|
640
|
+
<p class="text-2xs text-muted">
|
|
641
641
|
{{ t('layout.accountDeployment.web.description') }}
|
|
642
642
|
</p>
|
|
643
643
|
<div class="grid grid-cols-1 gap-2 sm:grid-cols-3">
|
|
@@ -706,16 +706,16 @@ async function clearWeb() {
|
|
|
706
706
|
}}
|
|
707
707
|
</UBadge>
|
|
708
708
|
</div>
|
|
709
|
-
<p class="text-
|
|
709
|
+
<p class="text-2xs text-muted">
|
|
710
710
|
{{ t('layout.accountDeployment.contentStorage.description') }}
|
|
711
711
|
</p>
|
|
712
712
|
<div class="grid grid-cols-1 gap-2 sm:grid-cols-2">
|
|
713
713
|
<USelect v-model="csBackend" :items="backendItems" value-key="value" size="sm" />
|
|
714
714
|
</div>
|
|
715
|
-
<p v-if="selectedCustomStore?.summary" class="text-
|
|
715
|
+
<p v-if="selectedCustomStore?.summary" class="text-2xs text-muted">
|
|
716
716
|
{{ selectedCustomStore.summary }}
|
|
717
717
|
</p>
|
|
718
|
-
<p v-if="unregisteredStoreId" class="text-
|
|
718
|
+
<p v-if="unregisteredStoreId" class="text-2xs text-app-warning-400">
|
|
719
719
|
{{
|
|
720
720
|
t('layout.accountDeployment.contentStorage.unregisteredStoreWarning', {
|
|
721
721
|
store: unregisteredStoreId,
|
|
@@ -762,7 +762,7 @@ async function clearWeb() {
|
|
|
762
762
|
size="sm"
|
|
763
763
|
/>
|
|
764
764
|
<div class="flex items-center gap-2">
|
|
765
|
-
<span class="text-
|
|
765
|
+
<span class="text-2xs text-muted">
|
|
766
766
|
{{ t('layout.accountDeployment.contentStorage.accessKeys') }}
|
|
767
767
|
</span>
|
|
768
768
|
<UBadge
|
|
@@ -789,7 +789,7 @@ async function clearWeb() {
|
|
|
789
789
|
size="sm"
|
|
790
790
|
/>
|
|
791
791
|
</div>
|
|
792
|
-
<p class="text-
|
|
792
|
+
<p class="text-2xs text-muted">
|
|
793
793
|
{{ t('layout.accountDeployment.contentStorage.keysHint') }}
|
|
794
794
|
</p>
|
|
795
795
|
</template>
|
|
@@ -144,10 +144,10 @@ const faults = computed(() => failureKindRuleFaults(rules.value))
|
|
|
144
144
|
|
|
145
145
|
<template>
|
|
146
146
|
<div class="space-y-2" data-testid="platform-alert-failure-kinds">
|
|
147
|
-
<label class="text-
|
|
147
|
+
<label class="text-2xs font-medium text-toned">
|
|
148
148
|
{{ t('settings.platformAlerts.failureKinds.label') }}
|
|
149
149
|
</label>
|
|
150
|
-
<p class="text-
|
|
150
|
+
<p class="text-2xs text-muted">
|
|
151
151
|
{{ t('settings.platformAlerts.failureKinds.description') }}
|
|
152
152
|
</p>
|
|
153
153
|
|
|
@@ -159,7 +159,7 @@ const faults = computed(() => failureKindRuleFaults(rules.value))
|
|
|
159
159
|
data-testid="platform-alert-failure-kinds-override"
|
|
160
160
|
@update:model-value="setOverriding(!!$event)"
|
|
161
161
|
/>
|
|
162
|
-
<p class="ps-6 text-
|
|
162
|
+
<p class="ps-6 text-2xs text-muted">
|
|
163
163
|
{{ t('settings.platformAlerts.failureKinds.overrideHint') }}
|
|
164
164
|
</p>
|
|
165
165
|
</div>
|
|
@@ -167,7 +167,7 @@ const faults = computed(() => failureKindRuleFaults(rules.value))
|
|
|
167
167
|
<template v-if="overriding">
|
|
168
168
|
<p
|
|
169
169
|
v-if="rules.length === 0"
|
|
170
|
-
class="text-
|
|
170
|
+
class="text-2xs text-dimmed"
|
|
171
171
|
data-testid="platform-alert-failure-kinds-empty"
|
|
172
172
|
>
|
|
173
173
|
{{ t('settings.platformAlerts.failureKinds.empty') }}
|
|
@@ -180,7 +180,7 @@ const faults = computed(() => failureKindRuleFaults(rules.value))
|
|
|
180
180
|
:data-testid="`platform-alert-failure-kind-row-${index}`"
|
|
181
181
|
>
|
|
182
182
|
<div class="space-y-1">
|
|
183
|
-
<label class="block text-
|
|
183
|
+
<label class="block text-2xs text-toned">
|
|
184
184
|
{{ t('settings.platformAlerts.failureKinds.kindLabel') }}
|
|
185
185
|
</label>
|
|
186
186
|
<USelect
|
|
@@ -193,7 +193,7 @@ const faults = computed(() => failureKindRuleFaults(rules.value))
|
|
|
193
193
|
/>
|
|
194
194
|
</div>
|
|
195
195
|
<div class="space-y-1">
|
|
196
|
-
<label class="block text-
|
|
196
|
+
<label class="block text-2xs text-toned">
|
|
197
197
|
{{ t('settings.platformAlerts.failureKinds.shareLabel') }}
|
|
198
198
|
</label>
|
|
199
199
|
<UInput
|
|
@@ -204,12 +204,12 @@ const faults = computed(() => failureKindRuleFaults(rules.value))
|
|
|
204
204
|
:data-testid="`platform-alert-failure-share-${index}`"
|
|
205
205
|
@update:model-value="setShare(index, String($event))"
|
|
206
206
|
/>
|
|
207
|
-
<p v-if="index === 0" class="text-
|
|
207
|
+
<p v-if="index === 0" class="text-2xs text-dimmed">
|
|
208
208
|
{{ t('settings.platformAlerts.failureKinds.shareHint') }}
|
|
209
209
|
</p>
|
|
210
210
|
</div>
|
|
211
211
|
<div class="space-y-1">
|
|
212
|
-
<label class="block text-
|
|
212
|
+
<label class="block text-2xs text-toned">
|
|
213
213
|
{{ t('settings.platformAlerts.failureKinds.minCountLabel') }}
|
|
214
214
|
</label>
|
|
215
215
|
<UInput
|
|
@@ -235,7 +235,7 @@ const faults = computed(() => failureKindRuleFaults(rules.value))
|
|
|
235
235
|
|
|
236
236
|
<p
|
|
237
237
|
v-if="faults.tooMany"
|
|
238
|
-
class="text-
|
|
238
|
+
class="text-2xs text-app-warning-300"
|
|
239
239
|
data-testid="platform-alert-failure-kinds-too-many"
|
|
240
240
|
>
|
|
241
241
|
{{
|
|
@@ -244,14 +244,14 @@ const faults = computed(() => failureKindRuleFaults(rules.value))
|
|
|
244
244
|
</p>
|
|
245
245
|
<p
|
|
246
246
|
v-else-if="duplicateKinds.size > 0"
|
|
247
|
-
class="text-
|
|
247
|
+
class="text-2xs text-app-warning-300"
|
|
248
248
|
data-testid="platform-alert-failure-kinds-duplicate"
|
|
249
249
|
>
|
|
250
250
|
{{ t('settings.platformAlerts.failureKinds.duplicateKind') }}
|
|
251
251
|
</p>
|
|
252
252
|
<p
|
|
253
253
|
v-else-if="faults.rows.length > 0"
|
|
254
|
-
class="text-
|
|
254
|
+
class="text-2xs text-app-warning-300"
|
|
255
255
|
data-testid="platform-alert-failure-kinds-invalid"
|
|
256
256
|
>
|
|
257
257
|
{{
|
|
@@ -272,12 +272,12 @@ const faults = computed(() => failureKindRuleFaults(rules.value))
|
|
|
272
272
|
</UButton>
|
|
273
273
|
<p
|
|
274
274
|
v-if="nextFreeKind === undefined"
|
|
275
|
-
class="text-
|
|
275
|
+
class="text-2xs text-dimmed"
|
|
276
276
|
data-testid="platform-alert-failure-kinds-all-covered"
|
|
277
277
|
>
|
|
278
278
|
{{ t('settings.platformAlerts.failureKinds.allKindsCovered') }}
|
|
279
279
|
</p>
|
|
280
|
-
<p class="text-
|
|
280
|
+
<p class="text-2xs text-dimmed">
|
|
281
281
|
{{ t('settings.platformAlerts.failureKinds.minCountHint') }}
|
|
282
282
|
</p>
|
|
283
283
|
</template>
|
|
@@ -22,7 +22,7 @@ const viaWorkspaceId = computed(() => {
|
|
|
22
22
|
<template>
|
|
23
23
|
<div class="space-y-6 text-sm">
|
|
24
24
|
<section>
|
|
25
|
-
<p class="mb-3 text-
|
|
25
|
+
<p class="mb-3 text-2xs text-muted">
|
|
26
26
|
{{ t('layout.accountFragments.intro') }}
|
|
27
27
|
</p>
|
|
28
28
|
<FragmentLibraryManager
|
|
@@ -153,19 +153,19 @@ async function save() {
|
|
|
153
153
|
>
|
|
154
154
|
<div>
|
|
155
155
|
<h4 class="text-sm font-semibold text-default">{{ t('settings.modelPolicy.title') }}</h4>
|
|
156
|
-
<p class="text-
|
|
156
|
+
<p class="text-2xs text-muted">{{ t('settings.modelPolicy.description') }}</p>
|
|
157
157
|
</div>
|
|
158
158
|
|
|
159
159
|
<!-- Region + apply-preset templates -->
|
|
160
160
|
<div class="space-y-2">
|
|
161
|
-
<label class="text-
|
|
161
|
+
<label class="text-2xs font-medium text-toned">
|
|
162
162
|
{{ t('settings.modelPolicy.regionLabel') }}
|
|
163
163
|
</label>
|
|
164
164
|
<div class="grid grid-cols-1 gap-2 sm:grid-cols-2">
|
|
165
165
|
<USelect v-model="region" :items="regionItems" value-key="value" size="sm" />
|
|
166
166
|
</div>
|
|
167
167
|
<div v-if="regionPresets.length" class="flex flex-wrap items-center gap-2">
|
|
168
|
-
<span class="text-
|
|
168
|
+
<span class="text-2xs text-muted">{{ t('settings.modelPolicy.applyPreset') }}</span>
|
|
169
169
|
<UButton
|
|
170
170
|
v-for="preset in regionPresets"
|
|
171
171
|
:key="preset.id"
|
|
@@ -183,7 +183,7 @@ async function save() {
|
|
|
183
183
|
|
|
184
184
|
<!-- Mode -->
|
|
185
185
|
<div class="space-y-2">
|
|
186
|
-
<label class="text-
|
|
186
|
+
<label class="text-2xs font-medium text-toned">
|
|
187
187
|
{{ t('settings.modelPolicy.modeLabel') }}
|
|
188
188
|
</label>
|
|
189
189
|
<div class="grid grid-cols-1 gap-2 sm:grid-cols-2">
|
|
@@ -193,7 +193,7 @@ async function save() {
|
|
|
193
193
|
|
|
194
194
|
<!-- Families -->
|
|
195
195
|
<div v-if="mode !== 'off'" class="space-y-2">
|
|
196
|
-
<label class="text-
|
|
196
|
+
<label class="text-2xs font-medium text-toned">
|
|
197
197
|
{{
|
|
198
198
|
mode === 'blocklist'
|
|
199
199
|
? t('settings.modelPolicy.familiesBlockLabel')
|
|
@@ -214,10 +214,10 @@ async function save() {
|
|
|
214
214
|
|
|
215
215
|
<!-- Trusted (residency-guaranteed) routes -->
|
|
216
216
|
<div v-if="mode !== 'off'" class="space-y-2">
|
|
217
|
-
<label class="text-
|
|
217
|
+
<label class="text-2xs font-medium text-toned">
|
|
218
218
|
{{ t('settings.modelPolicy.trustedLabel') }}
|
|
219
219
|
</label>
|
|
220
|
-
<p class="text-
|
|
220
|
+
<p class="text-2xs text-muted">{{ t('settings.modelPolicy.trustedHint') }}</p>
|
|
221
221
|
<div class="grid grid-cols-2 gap-1 sm:grid-cols-4">
|
|
222
222
|
<UCheckbox
|
|
223
223
|
v-for="provider in TRUSTED_PROVIDERS"
|