@cat-factory/app 0.308.0 → 0.309.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 +21 -0
- 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 +3 -2
- package/app/components/auth/UserMenu.vue +1 -1
- package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +15 -15
- package/app/components/binaryOutput/BinaryOutputReport.vue +10 -14
- package/app/components/binaryOutput/StoredAssetView.vue +5 -5
- package/app/components/board/AddTaskModal.vue +16 -14
- package/app/components/board/AgentFailureCard.vue +9 -9
- package/app/components/board/AgentFailureHistory.vue +1 -1
- package/app/components/board/CreateInitiativeModal.vue +2 -2
- package/app/components/board/FailureDetail.vue +1 -1
- package/app/components/board/FailureHistoryList.vue +5 -5
- package/app/components/board/RecurringPipelineModal.vue +12 -11
- package/app/components/board/ReviewFrictionDialog.vue +4 -3
- package/app/components/board/StepExecutionHistory.vue +8 -8
- package/app/components/board/nodes/AgentChip.vue +1 -1
- package/app/components/board/nodes/BlockNode.vue +8 -9
- package/app/components/board/nodes/EpicNode.vue +4 -4
- package/app/components/board/nodes/FrameSwimlanes.vue +4 -7
- 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 +8 -8
- package/app/components/board/nodes/TaskLane.vue +3 -3
- package/app/components/board/nodes/TaskPipelineMini.vue +13 -12
- package/app/components/bootstrap/AdoptionReviewModal.vue +7 -6
- package/app/components/bootstrap/BootstrapModal.vue +11 -10
- package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
- package/app/components/brainstorm/BrainstormWindow.vue +8 -7
- package/app/components/bugFishing/BugFishingWindow.vue +37 -36
- package/app/components/clarity/ClarityReviewWindow.vue +8 -7
- package/app/components/common/AsyncViewError.vue +1 -1
- package/app/components/common/ClarificationItem.vue +6 -6
- package/app/components/common/DescriptorFields.vue +1 -1
- package/app/components/common/EmptyState.vue +1 -1
- 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 +9 -8
- package/app/components/docs/DocInterviewWindow.vue +10 -9
- package/app/components/documents/ContextDocumentPicker.vue +10 -12
- package/app/components/documents/DocumentImportModal.vue +3 -2
- package/app/components/documents/DocumentSourceConnectModal.vue +2 -2
- package/app/components/documents/DocumentSyncState.vue +1 -1
- package/app/components/documents/DocumentTemplatesModal.vue +5 -4
- package/app/components/documents/RepoContextDocPicker.vue +3 -6
- 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 +11 -10
- 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 +10 -10
- package/app/components/forkDecision/ForkDecisionWindow.vue +23 -26
- package/app/components/foundational/FoundationalContractSummary.vue +2 -2
- package/app/components/foundational/FoundationalServiceCatalogList.vue +3 -3
- package/app/components/foundational/FoundationalServiceRegistry.vue +3 -3
- package/app/components/foundational/FoundationalSuppressions.vue +2 -2
- package/app/components/fragments/FragmentLibraryManager.vue +3 -3
- package/app/components/fragments/FragmentSelector.vue +10 -11
- package/app/components/gates/GateFailingCheckList.vue +3 -3
- package/app/components/gates/GateResultView.vue +39 -38
- package/app/components/github/AddServiceFromRepoModal.vue +5 -4
- package/app/components/github/BranchProtectionPreflight.vue +5 -5
- package/app/components/github/GitHubConnect.vue +5 -3
- package/app/components/github/GitHubPanel.vue +14 -13
- package/app/components/github/RepoTreeBrowser.vue +1 -1
- package/app/components/humanTest/HumanTestWindow.vue +18 -17
- package/app/components/initiative/InitiativePlanNotice.vue +3 -3
- package/app/components/initiative/InitiativePlanReview.vue +19 -21
- package/app/components/initiative/InitiativePlanningWindow.vue +5 -5
- package/app/components/initiative/InitiativeTrackerWindow.vue +54 -53
- package/app/components/judge/JudgeResultView.vue +24 -25
- package/app/components/kaizen/KaizenPanel.vue +4 -4
- 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 +4 -0
- package/app/components/layout/AiProvidersBanner.vue +1 -1
- package/app/components/layout/AppearanceSwitcher.vue +1 -1
- package/app/components/layout/BoardSwitcher.vue +3 -2
- package/app/components/layout/BoardToolbar.vue +6 -2
- package/app/components/layout/CommandBar.vue +4 -2
- package/app/components/layout/DefaultTestEnvBanner.vue +2 -2
- package/app/components/layout/IntegrationsHub.vue +4 -3
- package/app/components/layout/LanguageSwitcher.vue +1 -1
- package/app/components/layout/ModelProvidersHub.vue +6 -4
- package/app/components/layout/NotificationsInbox.vue +8 -7
- package/app/components/layout/PersonalSetupModal.vue +5 -3
- package/app/components/layout/RolePrompt.vue +1 -1
- package/app/components/layout/SideBar.vue +3 -5
- package/app/components/layout/SpendWarningBanner.vue +3 -3
- package/app/components/layout/TranslationWarningBanner.vue +1 -1
- package/app/components/layout/UiModeSwitcher.vue +7 -6
- package/app/components/layout/UiRoleSwitcher.vue +2 -2
- package/app/components/media/ArtifactLightbox.vue +6 -6
- package/app/components/media/ImageCompare.vue +16 -16
- package/app/components/merge/MergeEffortChips.vue +4 -6
- package/app/components/notifications/NotificationSettingsPanel.vue +6 -5
- package/app/components/observability/OutcomeFilterChips.vue +1 -1
- package/app/components/observability/RunFailureSummary.vue +14 -17
- package/app/components/observability/StepMetricsBar.vue +9 -8
- package/app/components/observability/StepModelActivity.vue +4 -3
- package/app/components/observability/ToolCallList.vue +15 -18
- package/app/components/outcome/OutcomeSummaryWindow.vue +43 -42
- package/app/components/palettes/AgentPalette.vue +7 -5
- package/app/components/palettes/AgentTierSelect.vue +1 -1
- package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
- package/app/components/panels/AgentStepDetail.vue +27 -30
- 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 +66 -76
- package/app/components/panels/OperatorDashboardPanel.vue +27 -26
- package/app/components/panels/ReportsPanel.vue +26 -25
- package/app/components/panels/ReportsSpendBreakdown.vue +2 -2
- package/app/components/panels/ResultWindowShell.vue +19 -18
- package/app/components/panels/RunDetailLoadState.vue +1 -1
- package/app/components/panels/StepContainerStatus.vue +8 -7
- package/app/components/panels/StepDelegatedStatus.vue +13 -12
- 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/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 +8 -7
- package/app/components/panels/inspector/FrontendBindingsResolved.vue +5 -4
- package/app/components/panels/inspector/FrontendConfig.vue +26 -34
- package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
- package/app/components/panels/inspector/InspectorSection.vue +7 -4
- package/app/components/panels/inspector/RecurringScheduleSettings.vue +9 -8
- 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 +9 -13
- package/app/components/panels/inspector/ServiceTestConfig.vue +41 -45
- 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 +13 -12
- package/app/components/panels/inspector/TaskRunSettings.vue +35 -38
- 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 +2 -2
- package/app/components/pipeline/GateConfigFields.vue +6 -6
- package/app/components/pipeline/IterationCapPrompt.vue +1 -1
- package/app/components/pipeline/PipelineBuilder.vue +28 -27
- package/app/components/pipeline/PipelineHealthModal.vue +7 -7
- package/app/components/pipeline/PipelinePicker.vue +3 -3
- package/app/components/pipeline/PipelinePreview.vue +6 -7
- package/app/components/pipeline/PipelineProgress.vue +23 -24
- package/app/components/prReview/PrReviewWindow.vue +42 -41
- package/app/components/providers/AiPresetMismatchDialog.vue +4 -3
- package/app/components/providers/AiProviderOnboardingModal.vue +2 -2
- package/app/components/providers/ApiKeysSection.vue +7 -6
- 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 +25 -26
- package/app/components/requirements/RequirementsReviewWindow.vue +13 -12
- package/app/components/riskPolicy/RiskPolicyPicker.vue +5 -5
- package/app/components/riskPolicy/RiskPolicyPreview.vue +16 -15
- package/app/components/sandbox/SandboxPanel.vue +21 -20
- 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 +16 -16
- package/app/components/settings/ComposeEnvironmentSetupSection.vue +14 -12
- package/app/components/settings/ConnectionTestVerdict.vue +1 -1
- package/app/components/settings/ConsensusGroupsSection.vue +21 -20
- package/app/components/settings/CustomManifestTypeEditor.vue +8 -7
- package/app/components/settings/DefaultProvisionTypeSection.vue +5 -5
- package/app/components/settings/InfraHandlersConfigurator.vue +14 -15
- package/app/components/settings/InfrastructureBackendPicker.vue +2 -2
- package/app/components/settings/IssueTrackerPanel.vue +9 -15
- 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 +10 -9
- package/app/components/settings/MergeClassRulesEditor.vue +6 -5
- package/app/components/settings/MergeRolePolicyEditor.vue +13 -12
- package/app/components/settings/ModelConfigurationPanel.vue +8 -11
- package/app/components/settings/ModelPresetHealthModal.vue +3 -3
- package/app/components/settings/ObservabilityConnectionPanel.vue +1 -1
- package/app/components/settings/OpenRouterCatalogPanel.vue +6 -5
- 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 +8 -7
- package/app/components/settings/RiskPolicyCreateForm.vue +40 -26
- package/app/components/settings/RiskPolicyEditorRow.vue +18 -17
- package/app/components/settings/RiskPolicyHealthModal.vue +3 -3
- package/app/components/settings/RiskPolicyPanel.vue +11 -13
- package/app/components/settings/ServiceFragmentDefaultsPanel.vue +5 -4
- 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 +8 -7
- package/app/components/skills/SkillLibraryManager.vue +2 -2
- package/app/components/slack/SlackPanel.vue +8 -7
- package/app/components/spec/ServiceSpecWindow.vue +15 -16
- package/app/components/tasks/BugHuntModal.vue +1 -1
- package/app/components/tasks/ContextIssuePicker.vue +4 -6
- package/app/components/tasks/TaskContextIssues.vue +1 -1
- package/app/components/tasks/TaskImportModal.vue +3 -2
- package/app/components/tasks/TaskSourceConnectModal.vue +5 -5
- package/app/components/testing/TestReportWindow.vue +54 -53
- 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 +23 -25
- package/app/utils/theme/builtins.ts +7 -1
- 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,10 +247,10 @@ 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
|
<textarea
|
|
@@ -259,9 +258,9 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
|
|
|
259
258
|
rows="3"
|
|
260
259
|
:disabled="busy"
|
|
261
260
|
:placeholder="t('judge.feedbackPlaceholder')"
|
|
262
|
-
class="w-full resize-y rounded-md border border-default bg-app-950/60 px-3 py-2 text-
|
|
261
|
+
class="w-full resize-y rounded-md border border-default bg-app-950/60 px-3 py-2 text-sm text-default placeholder:text-app-600 focus:border-app-warning-500/60 focus:outline-none focus-visible:ring-2 focus-visible:ring-app-warning-500/60"
|
|
263
262
|
/>
|
|
264
|
-
<p v-if="judgeStore.error" class="mt-2 text-
|
|
263
|
+
<p v-if="judgeStore.error" class="mt-2 text-xs text-app-error-300">
|
|
265
264
|
{{ judgeStore.error }}
|
|
266
265
|
</p>
|
|
267
266
|
<div class="mt-2 flex flex-wrap justify-end gap-2">
|
|
@@ -307,21 +306,21 @@ async function act(choice: 'proceed' | 'bounce' | 'stop') {
|
|
|
307
306
|
|
|
308
307
|
<!-- The round history: a looping judge must not be a black box (the gate-attempt rule). -->
|
|
309
308
|
<section v-if="rounds.length > 1" class="mt-5">
|
|
310
|
-
<h3 class="mb-2
|
|
309
|
+
<SectionLabel as="h3" class="mb-2">
|
|
311
310
|
{{ t('judge.roundsHeading') }}
|
|
312
|
-
</
|
|
311
|
+
</SectionLabel>
|
|
313
312
|
<ul class="flex flex-col gap-1.5">
|
|
314
313
|
<li
|
|
315
314
|
v-for="round in rounds"
|
|
316
315
|
: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-
|
|
316
|
+
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
317
|
data-testid="judge-round"
|
|
319
318
|
:data-round-disposition="round.disposition"
|
|
320
319
|
>
|
|
321
320
|
<span class="text-dimmed">{{ t('judge.round', { round: round.round }) }}</span>
|
|
322
321
|
<span class="font-medium text-app-100">{{ n(round.verdict.score, 'percent') }}</span>
|
|
323
322
|
<span class="text-muted">{{ DISPOSITION_LABELS[round.disposition] }}</span>
|
|
324
|
-
<code v-if="round.model" class="text-
|
|
323
|
+
<code v-if="round.model" class="text-2xs text-dimmed">{{ round.model }}</code>
|
|
325
324
|
</li>
|
|
326
325
|
</ul>
|
|
327
326
|
</section>
|
|
@@ -107,7 +107,7 @@ function statusLabel(g: KaizenGrading): string {
|
|
|
107
107
|
t('kaizen.verifiedCombos.count', { count: kaizen.verifiedCount })
|
|
108
108
|
}}</span>
|
|
109
109
|
</h2>
|
|
110
|
-
<p class="mb-3 text-
|
|
110
|
+
<p class="mb-3 text-2xs text-dimmed">
|
|
111
111
|
{{ t('kaizen.verifiedCombos.hint') }}
|
|
112
112
|
</p>
|
|
113
113
|
<ul class="space-y-2">
|
|
@@ -130,11 +130,11 @@ function statusLabel(g: KaizenGrading): string {
|
|
|
130
130
|
name="i-lucide-badge-check"
|
|
131
131
|
class="ms-auto h-3.5 w-3.5 text-app-success-400"
|
|
132
132
|
/>
|
|
133
|
-
<span v-else class="ms-auto text-
|
|
133
|
+
<span v-else class="ms-auto text-2xs text-dimmed">
|
|
134
134
|
{{ t('kaizen.verifiedCombos.progress', { count: c.consecutiveHighGrades }) }}
|
|
135
135
|
</span>
|
|
136
136
|
</div>
|
|
137
|
-
<div class="mt-1 truncate text-
|
|
137
|
+
<div class="mt-1 truncate text-2xs text-dimmed" :title="c.model">
|
|
138
138
|
{{
|
|
139
139
|
t('kaizen.verifiedCombos.modelPrompt', {
|
|
140
140
|
model: c.model,
|
|
@@ -157,7 +157,7 @@ function statusLabel(g: KaizenGrading): string {
|
|
|
157
157
|
</h2>
|
|
158
158
|
<div class="overflow-hidden rounded-lg border border-default">
|
|
159
159
|
<table class="w-full text-start text-xs">
|
|
160
|
-
<thead class="bg-default/60 text-
|
|
160
|
+
<thead class="bg-default/60 text-2xs uppercase tracking-wide text-dimmed">
|
|
161
161
|
<tr>
|
|
162
162
|
<th class="px-3 py-2 font-medium">{{ t('kaizen.history.col.when') }}</th>
|
|
163
163
|
<th class="px-3 py-2 font-medium">{{ t('kaizen.history.col.agent') }}</th>
|
|
@@ -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"
|
|
@@ -267,7 +267,7 @@ const hasOverrides = computed(
|
|
|
267
267
|
<h4 class="text-sm font-semibold text-default">
|
|
268
268
|
{{ t('settings.platformAlerts.title') }}
|
|
269
269
|
</h4>
|
|
270
|
-
<p class="text-
|
|
270
|
+
<p class="text-2xs text-muted">{{ t('settings.platformAlerts.description') }}</p>
|
|
271
271
|
</div>
|
|
272
272
|
|
|
273
273
|
<!--
|
|
@@ -282,11 +282,11 @@ const hasOverrides = computed(
|
|
|
282
282
|
:label="t('settings.platformAlerts.muteLabel')"
|
|
283
283
|
data-testid="platform-alerts-mute"
|
|
284
284
|
/>
|
|
285
|
-
<p class="ps-6 text-
|
|
285
|
+
<p class="ps-6 text-2xs text-muted">{{ t('settings.platformAlerts.muteHint') }}</p>
|
|
286
286
|
</div>
|
|
287
287
|
|
|
288
288
|
<div class="space-y-1">
|
|
289
|
-
<label class="text-
|
|
289
|
+
<label class="text-2xs font-medium text-toned">
|
|
290
290
|
{{ t('settings.platformAlerts.windowLabel') }}
|
|
291
291
|
</label>
|
|
292
292
|
<div class="grid grid-cols-1 gap-2 sm:grid-cols-2">
|
|
@@ -298,17 +298,17 @@ const hasOverrides = computed(
|
|
|
298
298
|
data-testid="platform-alerts-window"
|
|
299
299
|
/>
|
|
300
300
|
</div>
|
|
301
|
-
<p class="text-
|
|
301
|
+
<p class="text-2xs text-muted">{{ t('settings.platformAlerts.windowHint') }}</p>
|
|
302
302
|
</div>
|
|
303
303
|
|
|
304
304
|
<div class="space-y-2">
|
|
305
|
-
<label class="text-
|
|
305
|
+
<label class="text-2xs font-medium text-toned">
|
|
306
306
|
{{ t('settings.platformAlerts.thresholdsLabel') }}
|
|
307
307
|
</label>
|
|
308
|
-
<p class="text-
|
|
308
|
+
<p class="text-2xs text-muted">{{ t('settings.platformAlerts.inheritHint') }}</p>
|
|
309
309
|
<div class="grid grid-cols-1 gap-3 sm:grid-cols-2">
|
|
310
310
|
<div v-for="th in THRESHOLDS" :key="th.field" class="space-y-1">
|
|
311
|
-
<label class="block text-
|
|
311
|
+
<label class="block text-2xs text-toned" :for="`platform-alert-${th.field}`">
|
|
312
312
|
{{ thresholdLabels[th.field] }}
|
|
313
313
|
</label>
|
|
314
314
|
<UInput
|
|
@@ -320,7 +320,7 @@ const hasOverrides = computed(
|
|
|
320
320
|
:placeholder="t('settings.platformAlerts.inheritPlaceholder')"
|
|
321
321
|
:data-testid="`platform-alert-${th.field}`"
|
|
322
322
|
/>
|
|
323
|
-
<p class="text-
|
|
323
|
+
<p class="text-2xs leading-snug text-dimmed">{{ thresholdHints[th.field] }}</p>
|
|
324
324
|
</div>
|
|
325
325
|
</div>
|
|
326
326
|
</div>
|
|
@@ -99,9 +99,9 @@ async function create(input: CreateRiskPolicyInput) {
|
|
|
99
99
|
|
|
100
100
|
<template>
|
|
101
101
|
<div class="space-y-4 text-sm" data-testid="account-risk-policy-panel">
|
|
102
|
-
<p class="text-
|
|
102
|
+
<p class="text-2xs text-muted">{{ t('layout.accountRiskPolicies.intro') }}</p>
|
|
103
103
|
|
|
104
|
-
<p v-if="!store.loading && policies.length === 0" class="text-
|
|
104
|
+
<p v-if="!store.loading && policies.length === 0" class="text-2xs text-dimmed">
|
|
105
105
|
{{ t('layout.accountRiskPolicies.empty') }}
|
|
106
106
|
</p>
|
|
107
107
|
|
|
@@ -62,7 +62,7 @@ async function save() {
|
|
|
62
62
|
<h3 class="text-sm font-semibold text-default">
|
|
63
63
|
{{ t('settings.runCredentialPolicy.heading') }}
|
|
64
64
|
</h3>
|
|
65
|
-
<p class="text-
|
|
65
|
+
<p class="text-2xs text-muted">{{ t('settings.runCredentialPolicy.body') }}</p>
|
|
66
66
|
|
|
67
67
|
<label class="flex items-center gap-2">
|
|
68
68
|
<USwitch v-model="forbid" size="sm" data-testid="account-forbid-initiator-pat" />
|
|
@@ -71,10 +71,10 @@ async function save() {
|
|
|
71
71
|
|
|
72
72
|
<!-- What the choice actually costs, stated at the point of choosing rather than discovered
|
|
73
73
|
later: attribution is a real feature, and turning this on is what trades it away. -->
|
|
74
|
-
<p v-if="forbid" class="text-
|
|
74
|
+
<p v-if="forbid" class="text-2xs text-app-warning-300">
|
|
75
75
|
{{ t('settings.runCredentialPolicy.onHint') }}
|
|
76
76
|
</p>
|
|
77
|
-
<p v-else class="text-
|
|
77
|
+
<p v-else class="text-2xs text-dimmed">
|
|
78
78
|
{{ t('settings.runCredentialPolicy.offHint') }}
|
|
79
79
|
</p>
|
|
80
80
|
|
|
@@ -12,7 +12,7 @@ const { t } = useI18n()
|
|
|
12
12
|
<template>
|
|
13
13
|
<div class="space-y-6 text-sm">
|
|
14
14
|
<section>
|
|
15
|
-
<p class="mb-3 text-
|
|
15
|
+
<p class="mb-3 text-2xs text-muted">
|
|
16
16
|
{{ t('layout.accountSkills.intro') }}
|
|
17
17
|
</p>
|
|
18
18
|
<SkillLibraryManager :account-id="props.accountId" />
|
|
@@ -240,6 +240,9 @@ async function disconnectEmail() {
|
|
|
240
240
|
class="w-44"
|
|
241
241
|
@update:model-value="(r: AccountRole[]) => updateMemberRoles(m.userId, r)"
|
|
242
242
|
/>
|
|
243
|
+
<!-- The roles a member HOLDS, read-only where the select would be: the row's data, not
|
|
244
|
+
a heading over it, so it keeps its own classes rather than adopting the eyebrow
|
|
245
|
+
recipe (`common/SectionLabel.vue`). -->
|
|
243
246
|
<span v-else class="text-xs uppercase tracking-wide text-muted">
|
|
244
247
|
{{ m.roles.join(', ') }}
|
|
245
248
|
</span>
|
|
@@ -290,6 +293,7 @@ async function disconnectEmail() {
|
|
|
290
293
|
>
|
|
291
294
|
<span class="truncate">{{ inv.email }}</span>
|
|
292
295
|
<span class="flex items-center gap-2 text-xs">
|
|
296
|
+
<!-- The invitation's STATE, which is what this row is about. Not an eyebrow. -->
|
|
293
297
|
<span class="uppercase tracking-wide text-muted">
|
|
294
298
|
{{ invitationStatusLabel(inv.status) }}
|
|
295
299
|
</span>
|
|
@@ -85,7 +85,7 @@ const show = computed(() => showSetup.value || showPreset.value)
|
|
|
85
85
|
@click="ui.dismissAiPresetMismatch()"
|
|
86
86
|
/>
|
|
87
87
|
</div>
|
|
88
|
-
<p class="mt-1 text-
|
|
88
|
+
<p class="mt-1 text-sm text-app-warning-200/90">
|
|
89
89
|
{{ t('layout.aiProvidersBanner.preset.body') }}
|
|
90
90
|
</p>
|
|
91
91
|
<div class="mt-3">
|
|
@@ -96,7 +96,7 @@ const items = computed<DropdownMenuItem[][]>(() => [
|
|
|
96
96
|
>
|
|
97
97
|
<UIcon :name="MODE_ICONS[preference]" class="h-4 w-4 shrink-0 text-muted" />
|
|
98
98
|
<div v-if="!collapsed" class="min-w-0 flex-1">
|
|
99
|
-
<div class="truncate text-
|
|
99
|
+
<div class="truncate text-2xs uppercase tracking-wide text-muted">
|
|
100
100
|
{{ t('appearance.switcher') }}
|
|
101
101
|
</div>
|
|
102
102
|
<div class="truncate text-xs font-medium text-highlighted">{{ summary }}</div>
|