@cat-factory/app 0.302.2 → 0.303.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 +16 -0
- package/app/app.config.ts +19 -10
- package/app/assets/css/main.css +13 -13
- package/app/assets/css/prose.css +22 -22
- package/app/assets/css/tokens.css +298 -0
- package/app/components/assistant/AssistantModal.vue +22 -22
- package/app/components/auth/AuthGate.vue +1 -1
- package/app/components/auth/BackendMisconfiguredScreen.vue +10 -10
- package/app/components/auth/LoginScreen.vue +34 -36
- package/app/components/auth/ResetPasswordScreen.vue +12 -12
- package/app/components/auth/UserMenu.vue +4 -4
- package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +27 -25
- package/app/components/binaryOutput/BinaryOutputReport.vue +15 -15
- package/app/components/binaryOutput/StoredAssetView.vue +5 -5
- package/app/components/board/AddTaskModal.vue +17 -20
- package/app/components/board/AgentFailureCard.vue +11 -11
- package/app/components/board/AgentFailureHistory.vue +2 -2
- package/app/components/board/BoardCanvas.vue +6 -5
- package/app/components/board/CreateInitiativeModal.vue +8 -10
- package/app/components/board/DependencyConnectOverlay.vue +1 -1
- package/app/components/board/FailureHistoryList.vue +7 -7
- package/app/components/board/RecurringPipelineModal.vue +17 -17
- package/app/components/board/ReviewFrictionDialog.vue +6 -6
- package/app/components/board/StepExecutionHistory.vue +13 -13
- package/app/components/board/TaskDependencyEdges.vue +8 -8
- package/app/components/board/nodes/AgentChip.vue +10 -10
- package/app/components/board/nodes/BlockNode.vue +29 -29
- package/app/components/board/nodes/DecisionBadge.vue +2 -2
- package/app/components/board/nodes/EpicNode.vue +14 -10
- package/app/components/board/nodes/FrameSwimlanes.vue +7 -9
- package/app/components/board/nodes/InitiativeCard.vue +8 -8
- package/app/components/board/nodes/LaneGroup.vue +1 -1
- package/app/components/board/nodes/LaneTask.vue +2 -2
- package/app/components/board/nodes/ResizeGrips.vue +4 -4
- package/app/components/board/nodes/TaskCard.vue +18 -18
- package/app/components/board/nodes/TaskLane.vue +5 -5
- package/app/components/board/nodes/TaskPipelineMini.vue +18 -18
- package/app/components/bootstrap/AdoptionReviewModal.vue +29 -26
- package/app/components/bootstrap/BootstrapModal.vue +21 -23
- package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
- package/app/components/brainstorm/BrainstormWindow.vue +30 -33
- package/app/components/bugFishing/BugFishingWindow.vue +49 -49
- package/app/components/clarity/ClarityReviewWindow.vue +30 -30
- package/app/components/common/AsyncViewError.vue +5 -5
- package/app/components/common/ClarificationItem.vue +8 -13
- package/app/components/common/ConfirmDialog.vue +4 -2
- package/app/components/common/DescriptorFields.vue +1 -1
- package/app/components/common/EmptyState.vue +3 -3
- package/app/components/common/InterviewGateNotice.vue +7 -7
- package/app/components/common/KeyboardShortcutsHelp.vue +1 -1
- package/app/components/common/MarkdownProse.vue +14 -13
- package/app/components/consensus/ConsensusSessionWindow.vue +26 -26
- package/app/components/context/ContextAttachmentFields.vue +17 -17
- package/app/components/docs/DocInterviewWindow.vue +14 -14
- package/app/components/documents/ContextDocumentPicker.vue +17 -17
- package/app/components/documents/DocumentImportModal.vue +7 -7
- package/app/components/documents/DocumentSourceConnectModal.vue +3 -3
- package/app/components/documents/DocumentSyncState.vue +5 -5
- package/app/components/documents/DocumentTemplatesModal.vue +15 -15
- package/app/components/documents/RepoContextDocPicker.vue +5 -5
- package/app/components/documents/SpawnPreviewModal.vue +12 -12
- package/app/components/documents/StartFromDesignModal.vue +11 -11
- package/app/components/documents/TaskContextDocs.vue +5 -5
- package/app/components/environments/EnvSetupStepper.vue +6 -6
- package/app/components/environments/EnvironmentStatusPanel.vue +17 -17
- package/app/components/environments/steps/EnvPickStep.vue +3 -3
- package/app/components/environments/steps/EnvPreflightStep.vue +9 -9
- package/app/components/environments/steps/EnvReviewStep.vue +25 -22
- package/app/components/environments/steps/EnvSaveStep.vue +7 -5
- package/app/components/environments/steps/JourneyStepNav.vue +1 -1
- package/app/components/focus/BlockFocusView.vue +17 -19
- package/app/components/followUp/FollowUpWindow.vue +23 -23
- package/app/components/forkDecision/ForkDecisionWindow.vue +37 -39
- package/app/components/foundational/FoundationalContractSummary.vue +7 -7
- package/app/components/foundational/FoundationalServiceCatalogList.vue +11 -11
- package/app/components/foundational/FoundationalServiceManager.vue +1 -1
- package/app/components/foundational/FoundationalServiceRegistry.vue +13 -13
- package/app/components/foundational/FoundationalServiceSources.vue +13 -13
- package/app/components/foundational/FoundationalSuppressions.vue +7 -7
- package/app/components/foundational/ServiceCatalogConnection.vue +10 -10
- package/app/components/fragments/FragmentLibraryManager.vue +41 -44
- package/app/components/fragments/FragmentSelector.vue +13 -13
- package/app/components/fragments/GitHubDocUrlImport.vue +1 -1
- package/app/components/gates/GateFailingCheckList.vue +5 -5
- package/app/components/gates/GateResultView.vue +50 -47
- package/app/components/github/AddServiceFromRepoModal.vue +14 -14
- package/app/components/github/BranchProtectionPreflight.vue +13 -13
- package/app/components/github/GitHubConnect.vue +7 -7
- package/app/components/github/GitHubOnboarding.vue +7 -7
- package/app/components/github/GitHubPanel.vue +37 -40
- package/app/components/github/RepoTreeBrowser.vue +18 -18
- package/app/components/humanTest/HumanTestWindow.vue +30 -33
- package/app/components/initiative/InitiativePlanNotice.vue +5 -5
- package/app/components/initiative/InitiativePlanReview.vue +27 -29
- package/app/components/initiative/InitiativePlanningWindow.vue +10 -10
- package/app/components/initiative/InitiativeTrackerWindow.vue +71 -65
- package/app/components/inputGate/InputGateNotice.vue +2 -4
- package/app/components/judge/JudgeResultView.vue +30 -32
- package/app/components/kaizen/KaizenPanel.vue +40 -36
- package/app/components/kaizen/KaizenStepStatus.vue +21 -21
- package/app/components/layout/AccountAuditLog.vue +10 -10
- package/app/components/layout/AccountDeploymentSettings.vue +20 -20
- package/app/components/layout/AccountFailureKindRules.vue +13 -13
- package/app/components/layout/AccountFoundationalSettings.vue +1 -1
- package/app/components/layout/AccountFragmentSettings.vue +1 -1
- package/app/components/layout/AccountModelPolicySettings.vue +9 -9
- package/app/components/layout/AccountPlatformAlertSettings.vue +11 -11
- package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
- package/app/components/layout/AccountRunCredentialSettings.vue +5 -5
- package/app/components/layout/AccountSkillSettings.vue +1 -1
- package/app/components/layout/AccountTeamSettings.vue +23 -15
- package/app/components/layout/AiProvidersBanner.vue +11 -8
- package/app/components/layout/AppearanceSwitcher.vue +108 -0
- package/app/components/layout/BoardSwitcher.vue +8 -11
- package/app/components/layout/BoardToolbar.vue +3 -3
- package/app/components/layout/CommandBar.vue +7 -9
- package/app/components/layout/ConnectionStatusBanner.vue +2 -2
- package/app/components/layout/DefaultTestEnvBanner.vue +5 -5
- package/app/components/layout/GitHubPatBanner.vue +5 -5
- package/app/components/layout/GitHubPatPermissionsBanner.vue +16 -10
- package/app/components/layout/InfraSetupBanner.vue +6 -6
- package/app/components/layout/IntegrationsHub.vue +15 -15
- package/app/components/layout/LanguageSwitcher.vue +5 -5
- package/app/components/layout/ModelProvidersHub.vue +13 -16
- package/app/components/layout/NotificationsInbox.vue +10 -10
- package/app/components/layout/PersonalSetupModal.vue +8 -8
- package/app/components/layout/ProviderConfigBanner.vue +4 -4
- package/app/components/layout/RolePrompt.vue +7 -7
- package/app/components/layout/SideBar.vue +6 -4
- package/app/components/layout/SpendWarningBanner.vue +17 -14
- package/app/components/layout/TranslationWarningBanner.vue +4 -4
- package/app/components/layout/UiModeSwitcher.vue +13 -13
- package/app/components/layout/UiRoleSwitcher.vue +8 -8
- package/app/components/layout/WorkspaceMembersSettings.vue +15 -11
- package/app/components/media/ArtifactLightbox.vue +13 -13
- package/app/components/media/ImageCompare.vue +31 -24
- package/app/components/merge/MergeEffortChips.vue +2 -2
- package/app/components/notifications/NotificationSettingsPanel.vue +14 -12
- package/app/components/observability/OutcomeFilterChips.vue +6 -6
- package/app/components/observability/RunFailureSummary.vue +28 -25
- package/app/components/observability/StepMetricsBar.vue +26 -28
- package/app/components/observability/StepModelActivity.vue +2 -2
- package/app/components/observability/ToolCallList.vue +24 -24
- package/app/components/outcome/OutcomeSummaryWindow.vue +47 -47
- package/app/components/palettes/AgentPalette.vue +8 -8
- package/app/components/palettes/AgentTierSelect.vue +1 -1
- package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
- package/app/components/panels/AgentStepDetail.vue +52 -51
- package/app/components/panels/AttemptEntryHeader.vue +4 -6
- package/app/components/panels/DecisionModal.vue +7 -7
- package/app/components/panels/GenericStructuredResultView.vue +7 -7
- package/app/components/panels/InspectorPanel.vue +17 -17
- package/app/components/panels/MergerResultView.vue +19 -19
- package/app/components/panels/ObservabilityPanel.vue +115 -123
- package/app/components/panels/OperatorDashboardPanel.vue +89 -97
- package/app/components/panels/ReportsPanel.vue +69 -66
- package/app/components/panels/ReportsSpendBreakdown.vue +9 -9
- package/app/components/panels/ResultWindowShell.vue +38 -38
- package/app/components/panels/RunDetailLoadState.vue +2 -2
- package/app/components/panels/StepContainerStatus.vue +9 -9
- package/app/components/panels/StepDelegatedStatus.logic.spec.ts +135 -0
- package/app/components/panels/StepDelegatedStatus.logic.ts +160 -0
- package/app/components/panels/StepDelegatedStatus.vue +181 -0
- package/app/components/panels/StepEffortReport.vue +16 -15
- package/app/components/panels/StepFragmentAdherence.vue +14 -10
- package/app/components/panels/StepMetadataCard.vue +74 -45
- package/app/components/panels/StepReproductionReport.vue +25 -21
- package/app/components/panels/StepRunMeta.vue +20 -20
- package/app/components/panels/StepTestReport.logic.spec.ts +8 -3
- package/app/components/panels/StepTestReport.logic.ts +4 -4
- package/app/components/panels/StepTestReport.vue +28 -28
- package/app/components/panels/StepToolServers.vue +14 -11
- package/app/components/panels/StepValidationReport.vue +7 -7
- package/app/components/panels/inspector/ContainerSummary.vue +9 -9
- package/app/components/panels/inspector/DocReferenceRepos.vue +3 -3
- package/app/components/panels/inspector/EnvProbeReport.vue +24 -27
- package/app/components/panels/inspector/EpicChildren.vue +8 -12
- package/app/components/panels/inspector/FrontendBindingsResolved.vue +11 -11
- package/app/components/panels/inspector/FrontendConfig.vue +37 -41
- package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
- package/app/components/panels/inspector/InspectorSection.vue +6 -6
- package/app/components/panels/inspector/RecurringScheduleSettings.vue +16 -19
- package/app/components/panels/inspector/ServiceConnections.vue +2 -2
- package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
- package/app/components/panels/inspector/ServiceSelfTests.vue +21 -17
- package/app/components/panels/inspector/ServiceTestConfig.vue +51 -59
- package/app/components/panels/inspector/ServiceTestSecrets.vue +5 -5
- package/app/components/panels/inspector/ServiceTestingContext.vue +3 -3
- package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
- package/app/components/panels/inspector/TaskAgentConfig.vue +3 -3
- package/app/components/panels/inspector/TaskAprioriBranches.vue +8 -5
- package/app/components/panels/inspector/TaskDependencies.vue +1 -1
- package/app/components/panels/inspector/TaskEstimateBadge.vue +11 -11
- package/app/components/panels/inspector/TaskExecution.vue +17 -17
- package/app/components/panels/inspector/TaskReviewTarget.vue +2 -2
- package/app/components/panels/inspector/TaskRunSettings.vue +35 -37
- package/app/components/panels/inspector/TaskStructure.vue +3 -3
- package/app/components/pipeline/AgentKindIcon.vue +1 -1
- package/app/components/pipeline/AgentPromptEditor.vue +17 -17
- package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -56
- package/app/components/pipeline/EstimateThresholdFields.vue +4 -4
- package/app/components/pipeline/GateConfigFields.vue +13 -10
- package/app/components/pipeline/IterationCapPrompt.vue +4 -2
- package/app/components/pipeline/PipelineBuilder.vue +47 -55
- package/app/components/pipeline/PipelineHealthModal.vue +27 -29
- package/app/components/pipeline/PipelinePicker.vue +10 -10
- package/app/components/pipeline/PipelinePreview.vue +10 -10
- package/app/components/pipeline/PipelineProgress.vue +64 -67
- package/app/components/prReview/PrReviewPhaseBadge.vue +7 -7
- package/app/components/prReview/PrReviewWindow.vue +75 -77
- package/app/components/providers/AiPresetMismatchDialog.vue +5 -5
- package/app/components/providers/AiProviderOnboardingModal.vue +9 -9
- package/app/components/providers/ApiKeysSection.vue +13 -13
- package/app/components/providers/PersonalCredentialModal.vue +2 -2
- package/app/components/providers/PersonalSubscriptionSection.vue +10 -10
- package/app/components/providers/SignInRequiredNotice.vue +1 -1
- package/app/components/providers/VendorCredentialsModal.vue +10 -10
- package/app/components/provisioning/ProvisioningLogsDrawer.vue +13 -13
- package/app/components/ralph/RalphLoopResultView.vue +28 -30
- package/app/components/recurring/RecurrenceEditor.vue +2 -2
- package/app/components/requirements/RequirementsReviewWindow.vue +51 -58
- package/app/components/riskPolicy/RiskPolicyPicker.vue +12 -15
- package/app/components/riskPolicy/RiskPolicyPreview.vue +14 -14
- package/app/components/sandbox/SandboxPanel.vue +58 -59
- package/app/components/settings/AccountSettingsPanel.vue +1 -1
- package/app/components/settings/ApiTokensPanel.vue +10 -10
- package/app/components/settings/BudgetSettings.vue +18 -22
- package/app/components/settings/CapabilityCredentialsPanel.vue +15 -15
- package/app/components/settings/CloudflareHandlerSection.vue +20 -20
- package/app/components/settings/ComposeEnvironmentSetupSection.vue +13 -13
- package/app/components/settings/ConnectionTestVerdict.vue +3 -3
- package/app/components/settings/ConnectionWarnings.vue +1 -1
- package/app/components/settings/ConsensusGroupsSection.vue +27 -35
- package/app/components/settings/CustomManifestTypeEditor.vue +10 -10
- package/app/components/settings/DefaultProvisionTypeSection.vue +6 -6
- package/app/components/settings/InfraHandlersConfigurator.vue +24 -22
- package/app/components/settings/InfrastructureBackendPicker.vue +6 -6
- package/app/components/settings/InfrastructureWindow.vue +5 -5
- package/app/components/settings/IssueTrackerPanel.vue +29 -23
- package/app/components/settings/KubernetesEngineForm.vue +11 -11
- package/app/components/settings/KubernetesEnvironmentForm.vue +4 -4
- package/app/components/settings/LocalContainerPoolSettings.vue +6 -11
- package/app/components/settings/LocalModelEndpointsPanel.vue +20 -18
- package/app/components/settings/McpAuthorizeScreen.vue +13 -15
- package/app/components/settings/McpOAuthCallbackScreen.vue +16 -10
- package/app/components/settings/MergeClassRulesEditor.vue +6 -9
- package/app/components/settings/MergeRolePolicyEditor.vue +16 -16
- package/app/components/settings/ModelConfigurationPanel.vue +23 -30
- package/app/components/settings/ModelPresetHealthModal.vue +15 -13
- package/app/components/settings/ObservabilityConnectionPanel.vue +4 -4
- package/app/components/settings/OpenRouterCatalogPanel.vue +23 -19
- package/app/components/settings/PackageRegistriesPanel.vue +8 -8
- package/app/components/settings/ProviderConnectionTab.vue +8 -11
- package/app/components/settings/ProviderManifestEditor.vue +9 -9
- package/app/components/settings/ProviderPreferenceEditor.vue +8 -8
- package/app/components/settings/RiskPolicyCreateForm.vue +10 -10
- package/app/components/settings/RiskPolicyEditorRow.vue +14 -14
- package/app/components/settings/RiskPolicyHealthModal.vue +15 -13
- package/app/components/settings/RiskPolicyInheritedRow.vue +1 -1
- package/app/components/settings/RiskPolicyPanel.vue +10 -15
- package/app/components/settings/ServiceFragmentDefaultsPanel.vue +7 -7
- package/app/components/settings/SharedStacksPanel.vue +9 -12
- package/app/components/settings/TaskSourceCard.vue +4 -4
- package/app/components/settings/TaskTypeSuppressionsPanel.vue +6 -6
- package/app/components/settings/ToolServerChecklist.vue +36 -29
- package/app/components/settings/UsageSettings.vue +15 -15
- package/app/components/settings/UserSecretsSection.vue +9 -12
- package/app/components/settings/WorkspaceMetadataSettings.vue +5 -5
- package/app/components/settings/WorkspaceSettingsPanel.vue +47 -47
- package/app/components/skills/ReviewSkillQueue.vue +10 -10
- package/app/components/skills/SkillLibraryManager.vue +23 -20
- package/app/components/slack/SlackPanel.vue +13 -17
- package/app/components/spec/ServiceSpecWindow.vue +45 -42
- package/app/components/tasks/BugHuntModal.vue +24 -27
- package/app/components/tasks/ContextIssuePicker.vue +11 -11
- package/app/components/tasks/TaskContextIssues.vue +3 -3
- package/app/components/tasks/TaskImportModal.vue +7 -7
- package/app/components/tasks/TaskSourceConnectModal.vue +10 -8
- package/app/components/testing/TestReportWindow.vue +99 -82
- package/app/components/theme/ThemeImportModal.vue +115 -0
- package/app/components/tutorial/TutorialCatalogue.vue +9 -9
- package/app/components/tutorial/TutorialNudge.vue +5 -5
- package/app/components/tutorial/TutorialOverlay.vue +12 -12
- package/app/components/tutorial/TutorialPrompt.vue +6 -9
- package/app/components/vcs/GitLabConnect.vue +4 -4
- package/app/components/vcs/VcsConnectSurfaces.vue +2 -2
- package/app/components/visualConfirm/VisualConfirmationWindow.vue +36 -36
- package/app/composables/api/client.ts +6 -1
- package/app/composables/usePipelineErrorToast.ts +17 -0
- package/app/modular/agent-kinds.ts +24 -0
- package/app/pages/index.vue +5 -5
- package/app/plugins/theme.client.ts +125 -0
- package/app/spa-loading-template.html +52 -14
- package/app/stores/agents.ts +1 -1
- package/app/stores/theme.spec.ts +56 -0
- package/app/stores/theme.ts +87 -0
- package/app/types/domain.ts +19 -0
- package/app/types/execution.ts +4 -0
- package/app/utils/agentOutput.ts +1 -1
- package/app/utils/binaryOutput.ts +6 -6
- package/app/utils/bootstrapSteps.ts +14 -14
- package/app/utils/catalog.ts +87 -83
- package/app/utils/colorTint.ts +10 -0
- package/app/utils/failureKinds.ts +1 -0
- package/app/utils/observability.ts +3 -3
- package/app/utils/pipelineRender.ts +13 -17
- package/app/utils/swimlanes.ts +4 -4
- package/app/utils/theme/bootPalette.spec.ts +54 -0
- package/app/utils/theme/bootPalette.ts +108 -0
- package/app/utils/theme/builtins.spec.ts +38 -0
- package/app/utils/theme/builtins.ts +55 -0
- package/app/utils/theme/css.ts +162 -0
- package/app/utils/theme/doc.ts +353 -0
- package/app/utils/theme/link.ts +93 -0
- package/app/utils/theme/presets.ts +509 -0
- package/app/utils/theme/theme.spec.ts +224 -0
- package/i18n/locales/de.json +61 -4
- package/i18n/locales/en.json +70 -4
- package/i18n/locales/es.json +61 -4
- package/i18n/locales/fr.json +61 -4
- package/i18n/locales/he.json +61 -4
- package/i18n/locales/it.json +61 -4
- package/i18n/locales/ja.json +61 -4
- package/i18n/locales/pl.json +61 -4
- package/i18n/locales/tr.json +61 -4
- package/i18n/locales/uk.json +61 -4
- package/nuxt.config.ts +37 -11
- package/package.json +9 -8
|
@@ -170,24 +170,19 @@ function unhide(presetId: string) {
|
|
|
170
170
|
|
|
171
171
|
<template>
|
|
172
172
|
<div class="space-y-4" data-testid="risk-policy-panel">
|
|
173
|
-
<i18n-t
|
|
174
|
-
keypath="settings.riskPolicy.intro"
|
|
175
|
-
tag="p"
|
|
176
|
-
class="text-xs text-slate-400"
|
|
177
|
-
scope="global"
|
|
178
|
-
>
|
|
173
|
+
<i18n-t keypath="settings.riskPolicy.intro" tag="p" class="text-xs text-muted" scope="global">
|
|
179
174
|
<template #merger>
|
|
180
|
-
<span class="text-
|
|
175
|
+
<span class="text-toned">{{ t('settings.riskPolicy.mergerAgent') }}</span>
|
|
181
176
|
</template>
|
|
182
177
|
</i18n-t>
|
|
183
178
|
|
|
184
179
|
<!-- Inherited FIRST: they are the org's posture, and a board reading its own list wants to see
|
|
185
180
|
what it is working from before what it has changed. -->
|
|
186
181
|
<section v-if="inherited.length > 0" class="space-y-2">
|
|
187
|
-
<p class="text-[11px] font-semibold uppercase tracking-wide text-
|
|
182
|
+
<p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
188
183
|
{{ t('settings.riskPolicy.inherited.heading') }}
|
|
189
184
|
</p>
|
|
190
|
-
<p class="text-[11px] text-
|
|
185
|
+
<p class="text-[11px] text-dimmed">{{ t('settings.riskPolicy.inherited.hint') }}</p>
|
|
191
186
|
<RiskPolicyInheritedRow
|
|
192
187
|
v-for="policy in inherited"
|
|
193
188
|
:key="policy.id"
|
|
@@ -201,7 +196,7 @@ function unhide(presetId: string) {
|
|
|
201
196
|
<section class="space-y-4">
|
|
202
197
|
<p
|
|
203
198
|
v-if="inherited.length > 0"
|
|
204
|
-
class="text-[11px] font-semibold uppercase tracking-wide text-
|
|
199
|
+
class="text-[11px] font-semibold uppercase tracking-wide text-muted"
|
|
205
200
|
>
|
|
206
201
|
{{ t('settings.riskPolicy.own.heading') }}
|
|
207
202
|
</p>
|
|
@@ -222,21 +217,21 @@ function unhide(presetId: string) {
|
|
|
222
217
|
whether it still shadows an account policy: one whose policy the account has since withdrawn
|
|
223
218
|
withholds nothing, and reading it as a live opt-out would misstate what the board is doing. -->
|
|
224
219
|
<section v-if="store.suppressions.length > 0 || suppressionsFailed" class="space-y-2">
|
|
225
|
-
<p class="text-[11px] font-semibold uppercase tracking-wide text-
|
|
220
|
+
<p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
226
221
|
{{ t('settings.riskPolicy.hidden.heading') }}
|
|
227
222
|
</p>
|
|
228
|
-
<p v-if="suppressionsFailed" class="text-[11px] text-
|
|
223
|
+
<p v-if="suppressionsFailed" class="text-[11px] text-app-warning-400">
|
|
229
224
|
{{ t('settings.riskPolicy.hidden.loadFailed') }}
|
|
230
225
|
</p>
|
|
231
226
|
<div
|
|
232
227
|
v-for="entry in store.suppressions"
|
|
233
228
|
:key="entry.id"
|
|
234
|
-
class="flex items-center gap-2 rounded-md border border-
|
|
229
|
+
class="flex items-center gap-2 rounded-md border border-default bg-default/40 px-3 py-2"
|
|
235
230
|
data-testid="risk-policy-hidden-row"
|
|
236
231
|
:data-policy-id="entry.id"
|
|
237
232
|
>
|
|
238
|
-
<span class="flex-1 truncate text-[12px] text-
|
|
239
|
-
<span v-if="!entry.inherited" class="text-[11px] text-
|
|
233
|
+
<span class="flex-1 truncate text-[12px] text-toned">{{ entry.name }}</span>
|
|
234
|
+
<span v-if="!entry.inherited" class="text-[11px] text-dimmed">
|
|
240
235
|
{{ t('settings.riskPolicy.hidden.withdrawn') }}
|
|
241
236
|
</span>
|
|
242
237
|
<UButton
|
|
@@ -54,12 +54,12 @@ function remove(id: string) {
|
|
|
54
54
|
|
|
55
55
|
<template>
|
|
56
56
|
<div class="space-y-4">
|
|
57
|
-
<p class="text-xs text-
|
|
57
|
+
<p class="text-xs text-muted">
|
|
58
58
|
{{ t('settings.serviceFragmentDefaults.intro') }}
|
|
59
59
|
</p>
|
|
60
60
|
|
|
61
61
|
<div class="flex items-center justify-between">
|
|
62
|
-
<span class="text-[11px] font-semibold uppercase tracking-wide text-
|
|
62
|
+
<span class="text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
63
63
|
{{ t('settings.serviceFragmentDefaults.defaultFragments') }}
|
|
64
64
|
</span>
|
|
65
65
|
<UDropdownMenu v-if="menu.length" :items="menu" :ui="{ content: 'max-h-72 overflow-y-auto' }">
|
|
@@ -90,24 +90,24 @@ function remove(id: string) {
|
|
|
90
90
|
{{ f.title }}<UIcon name="i-lucide-x" class="ms-0.5 h-3 w-3" />
|
|
91
91
|
</UBadge>
|
|
92
92
|
</div>
|
|
93
|
-
<p v-else class="text-[11px] text-
|
|
93
|
+
<p v-else class="text-[11px] text-dimmed">
|
|
94
94
|
{{ t('settings.serviceFragmentDefaults.empty') }}
|
|
95
95
|
</p>
|
|
96
96
|
|
|
97
|
-
<div class="flex flex-wrap gap-x-4 gap-y-1 border-t border-
|
|
98
|
-
<span class="text-
|
|
97
|
+
<div class="flex flex-wrap gap-x-4 gap-y-1 border-t border-default pt-3 text-[11px]">
|
|
98
|
+
<span class="text-dimmed">
|
|
99
99
|
{{ t('settings.serviceFragmentDefaults.footer.question') }}
|
|
100
100
|
</span>
|
|
101
101
|
<button
|
|
102
102
|
type="button"
|
|
103
|
-
class="font-medium text-primary
|
|
103
|
+
class="font-medium text-primary hover:underline"
|
|
104
104
|
@click="ui.openFragmentLibrary()"
|
|
105
105
|
>
|
|
106
106
|
{{ t('settings.serviceFragmentDefaults.footer.manageBoard') }}
|
|
107
107
|
</button>
|
|
108
108
|
<button
|
|
109
109
|
type="button"
|
|
110
|
-
class="font-medium text-primary
|
|
110
|
+
class="font-medium text-primary hover:underline"
|
|
111
111
|
@click="ui.openAccountSettings('fragments')"
|
|
112
112
|
>
|
|
113
113
|
{{ t('settings.serviceFragmentDefaults.footer.manageAccount') }}
|
|
@@ -270,14 +270,14 @@ async function remove(stack: SharedStack) {
|
|
|
270
270
|
|
|
271
271
|
<template>
|
|
272
272
|
<div class="space-y-4" data-testid="shared-stacks-panel">
|
|
273
|
-
<p class="text-sm text-
|
|
273
|
+
<p class="text-sm text-muted">{{ t('settings.sharedStacks.intro') }}</p>
|
|
274
274
|
|
|
275
|
-
<section v-if="stacks.length" class="space-y-2 rounded-lg border border-
|
|
275
|
+
<section v-if="stacks.length" class="space-y-2 rounded-lg border border-muted p-3">
|
|
276
276
|
<h3 class="text-sm font-semibold">{{ t('settings.sharedStacks.list.heading') }}</h3>
|
|
277
277
|
<div
|
|
278
278
|
v-for="stack in stacks"
|
|
279
279
|
:key="stack.id"
|
|
280
|
-
class="space-y-2 rounded-md border border-
|
|
280
|
+
class="space-y-2 rounded-md border border-default px-3 py-2"
|
|
281
281
|
:data-testid="`shared-stack-${stack.id}`"
|
|
282
282
|
>
|
|
283
283
|
<div class="flex items-center justify-between gap-2">
|
|
@@ -288,7 +288,7 @@ async function remove(stack: SharedStack) {
|
|
|
288
288
|
{{ statusLabel(stack.status) }}
|
|
289
289
|
</UBadge>
|
|
290
290
|
</div>
|
|
291
|
-
<p class="truncate text-[11px] text-
|
|
291
|
+
<p class="truncate text-[11px] text-dimmed">{{ stack.cloneUrl }}</p>
|
|
292
292
|
<div v-if="stack.managedNetworks.length" class="flex flex-wrap gap-1">
|
|
293
293
|
<UBadge
|
|
294
294
|
v-for="net in stack.managedNetworks"
|
|
@@ -347,14 +347,11 @@ async function remove(stack: SharedStack) {
|
|
|
347
347
|
/>
|
|
348
348
|
</div>
|
|
349
349
|
</div>
|
|
350
|
-
<p v-if="stack.lastError" class="text-[11px] text-
|
|
350
|
+
<p v-if="stack.lastError" class="text-[11px] text-app-error-400">{{ stack.lastError }}</p>
|
|
351
351
|
</div>
|
|
352
352
|
</section>
|
|
353
353
|
|
|
354
|
-
<section
|
|
355
|
-
class="space-y-3 rounded-lg border border-slate-700 p-3"
|
|
356
|
-
data-testid="shared-stack-form"
|
|
357
|
-
>
|
|
354
|
+
<section class="space-y-3 rounded-lg border border-muted p-3" data-testid="shared-stack-form">
|
|
358
355
|
<h3 class="text-sm font-semibold">
|
|
359
356
|
{{
|
|
360
357
|
t(editingId ? 'settings.sharedStacks.edit.heading' : 'settings.sharedStacks.add.heading')
|
|
@@ -410,12 +407,12 @@ async function remove(stack: SharedStack) {
|
|
|
410
407
|
>
|
|
411
408
|
{{ t('settings.sharedStacks.detect.button') }}
|
|
412
409
|
</UButton>
|
|
413
|
-
<span class="text-[11px] text-
|
|
410
|
+
<span class="text-[11px] text-dimmed">{{ t('settings.sharedStacks.detect.hint') }}</span>
|
|
414
411
|
</div>
|
|
415
412
|
|
|
416
413
|
<p
|
|
417
414
|
v-if="detectedEnvFiles.length"
|
|
418
|
-
class="text-[11px] text-
|
|
415
|
+
class="text-[11px] text-dimmed"
|
|
419
416
|
data-testid="shared-stack-env-files"
|
|
420
417
|
>
|
|
421
418
|
{{ t('settings.sharedStacks.detect.envFiles') }}
|
|
@@ -431,7 +428,7 @@ async function remove(stack: SharedStack) {
|
|
|
431
428
|
<li
|
|
432
429
|
v-for="(label, index) in layerLabels"
|
|
433
430
|
:key="index"
|
|
434
|
-
class="font-mono text-[11px] text-
|
|
431
|
+
class="font-mono text-[11px] text-dimmed"
|
|
435
432
|
>
|
|
436
433
|
{{ label }}
|
|
437
434
|
</li>
|
|
@@ -89,13 +89,13 @@ const STATUS_UI: Record<
|
|
|
89
89
|
</script>
|
|
90
90
|
|
|
91
91
|
<template>
|
|
92
|
-
<div class="rounded-lg border border-
|
|
92
|
+
<div class="rounded-lg border border-default bg-elevated/40 px-3 py-2.5">
|
|
93
93
|
<div class="flex items-center justify-between gap-2">
|
|
94
94
|
<div class="flex min-w-0 items-center gap-2.5">
|
|
95
|
-
<UIcon :name="state.icon" class="h-5 w-5 shrink-0 text-
|
|
95
|
+
<UIcon :name="state.icon" class="h-5 w-5 shrink-0 text-toned" />
|
|
96
96
|
<div class="min-w-0">
|
|
97
|
-
<div class="text-sm font-medium text-
|
|
98
|
-
<div class="text-[11px] text-
|
|
97
|
+
<div class="text-sm font-medium text-default">{{ state.label }}</div>
|
|
98
|
+
<div class="text-[11px] text-dimmed">{{ subtitle }}</div>
|
|
99
99
|
</div>
|
|
100
100
|
</div>
|
|
101
101
|
<div class="flex shrink-0 items-center gap-2">
|
|
@@ -61,28 +61,28 @@ async function toggle(row: TaskTypeSuppression, offered: boolean) {
|
|
|
61
61
|
|
|
62
62
|
<template>
|
|
63
63
|
<div class="space-y-4">
|
|
64
|
-
<p class="text-xs text-
|
|
64
|
+
<p class="text-xs text-muted">
|
|
65
65
|
{{ t('settings.taskTypeSuppressions.intro') }}
|
|
66
66
|
</p>
|
|
67
67
|
|
|
68
|
-
<p v-if="loading" class="text-[11px] text-
|
|
68
|
+
<p v-if="loading" class="text-[11px] text-dimmed">
|
|
69
69
|
{{ t('settings.taskTypeSuppressions.loading') }}
|
|
70
70
|
</p>
|
|
71
|
-
<p v-else-if="!rows.length" class="text-[11px] text-
|
|
71
|
+
<p v-else-if="!rows.length" class="text-[11px] text-dimmed">
|
|
72
72
|
{{ t('settings.taskTypeSuppressions.empty') }}
|
|
73
73
|
</p>
|
|
74
74
|
<ul v-else class="space-y-2" data-testid="task-type-suppressions">
|
|
75
75
|
<li
|
|
76
76
|
v-for="row in rows"
|
|
77
77
|
:key="row.taskType.taskType"
|
|
78
|
-
class="flex items-start justify-between gap-3 rounded border border-
|
|
78
|
+
class="flex items-start justify-between gap-3 rounded border border-default px-3 py-2"
|
|
79
79
|
data-testid="task-type-suppression"
|
|
80
80
|
:data-task-type="row.taskType.taskType"
|
|
81
81
|
>
|
|
82
82
|
<div class="min-w-0">
|
|
83
83
|
<div class="flex items-center gap-1.5">
|
|
84
84
|
<UIcon :name="row.taskType.presentation.icon" class="h-3.5 w-3.5 shrink-0" />
|
|
85
|
-
<span class="truncate text-xs font-medium text-
|
|
85
|
+
<span class="truncate text-xs font-medium text-default">
|
|
86
86
|
{{ row.taskType.presentation.label }}
|
|
87
87
|
</span>
|
|
88
88
|
<UBadge
|
|
@@ -94,7 +94,7 @@ async function toggle(row: TaskTypeSuppression, offered: boolean) {
|
|
|
94
94
|
{{ row.taskType.presentation.category }}
|
|
95
95
|
</UBadge>
|
|
96
96
|
</div>
|
|
97
|
-
<p class="mt-0.5 text-[11px] text-
|
|
97
|
+
<p class="mt-0.5 text-[11px] text-dimmed">
|
|
98
98
|
{{ row.taskType.presentation.description }}
|
|
99
99
|
</p>
|
|
100
100
|
</div>
|
|
@@ -111,59 +111,63 @@ async function runProbe(id: string) {
|
|
|
111
111
|
<template>
|
|
112
112
|
<section v-if="servers.length" class="space-y-3" data-testid="tool-servers-section">
|
|
113
113
|
<div>
|
|
114
|
-
<h3 class="text-sm font-semibold text-
|
|
114
|
+
<h3 class="text-sm font-semibold text-default">
|
|
115
115
|
{{ t('settings.toolServers.heading') }}
|
|
116
116
|
</h3>
|
|
117
|
-
<p class="text-xs text-
|
|
117
|
+
<p class="text-xs text-muted">{{ t('settings.toolServers.intro') }}</p>
|
|
118
118
|
</div>
|
|
119
119
|
|
|
120
120
|
<article
|
|
121
121
|
v-for="server in servers"
|
|
122
122
|
:key="server.id"
|
|
123
|
-
class="space-y-2 rounded-lg border border-
|
|
123
|
+
class="space-y-2 rounded-lg border border-muted p-3"
|
|
124
124
|
:data-testid="`tool-server-${server.id}`"
|
|
125
125
|
>
|
|
126
126
|
<div class="flex flex-wrap items-center gap-2">
|
|
127
|
-
<span class="text-sm font-medium text-
|
|
127
|
+
<span class="text-sm font-medium text-default">{{ server.label }}</span>
|
|
128
128
|
<UBadge color="neutral" variant="soft" size="sm">
|
|
129
129
|
{{ TRANSPORT_LABELS[server.transport] }}
|
|
130
130
|
</UBadge>
|
|
131
|
-
<code class="font-mono text-[11px] text-
|
|
131
|
+
<code class="font-mono text-[11px] text-dimmed">{{ server.id }}</code>
|
|
132
132
|
</div>
|
|
133
133
|
|
|
134
|
-
<p class="truncate font-mono text-[11px] text-
|
|
134
|
+
<p class="truncate font-mono text-[11px] text-dimmed" :title="server.target">
|
|
135
135
|
{{ server.target }}
|
|
136
136
|
</p>
|
|
137
|
-
<p v-if="server.guidance" class="text-xs text-
|
|
137
|
+
<p v-if="server.guidance" class="text-xs text-muted">{{ server.guidance }}</p>
|
|
138
138
|
|
|
139
139
|
<!-- Which agents get it. An EMPTY list is a registration attached to nothing: it never reaches
|
|
140
140
|
a dispatch, so the credentials it asks for are keys an operator fills in for no run. Said
|
|
141
141
|
out loud, because no other surface in the platform can see that state. -->
|
|
142
|
-
<p v-if="server.declaredBy.length" class="text-[11px] text-
|
|
142
|
+
<p v-if="server.declaredBy.length" class="text-[11px] text-muted">
|
|
143
143
|
{{ t('settings.toolServers.declaredBy', { kinds: server.declaredBy.join(', ') }) }}
|
|
144
144
|
</p>
|
|
145
|
-
<p
|
|
145
|
+
<p
|
|
146
|
+
v-else
|
|
147
|
+
class="text-[11px] text-app-warning-400"
|
|
148
|
+
:data-testid="`tool-server-orphan-${server.id}`"
|
|
149
|
+
>
|
|
146
150
|
{{ t('settings.toolServers.declaredByNone') }}
|
|
147
151
|
</p>
|
|
148
152
|
|
|
149
153
|
<!-- Which harnesses could serve it. EMPTY means the declaration can never run anywhere (an
|
|
150
154
|
`http` server narrowed to Codex, whose MCP client is stdio-only): it is never dropped FOR
|
|
151
155
|
A REASON on any run, so no prompt and no log line ever mentions it. -->
|
|
152
|
-
<p v-if="server.servableHarnesses.length" class="text-[11px] text-
|
|
156
|
+
<p v-if="server.servableHarnesses.length" class="text-[11px] text-muted">
|
|
153
157
|
{{
|
|
154
158
|
t('settings.toolServers.servableHarnesses', {
|
|
155
159
|
harnesses: server.servableHarnesses.join(', '),
|
|
156
160
|
})
|
|
157
161
|
}}
|
|
158
162
|
</p>
|
|
159
|
-
<p v-else class="text-[11px] text-
|
|
163
|
+
<p v-else class="text-[11px] text-app-warning-400">
|
|
160
164
|
{{ t('settings.toolServers.servableHarnessesNone') }}
|
|
161
165
|
</p>
|
|
162
166
|
|
|
163
|
-
<p v-if="server.allowedTools?.length" class="text-[11px] text-
|
|
167
|
+
<p v-if="server.allowedTools?.length" class="text-[11px] text-muted">
|
|
164
168
|
{{ t('settings.toolServers.allowedTools', { tools: server.allowedTools.join(', ') }) }}
|
|
165
169
|
</p>
|
|
166
|
-
<p v-if="server.credentials.length" class="text-[11px] text-
|
|
170
|
+
<p v-if="server.credentials.length" class="text-[11px] text-muted">
|
|
167
171
|
{{
|
|
168
172
|
t('settings.toolServers.credentials', {
|
|
169
173
|
keys: server.credentials.map((c) => c.key).join(', '),
|
|
@@ -177,7 +181,7 @@ async function runProbe(id: string) {
|
|
|
177
181
|
producing tokens is exactly the state that reads as working and is not. -->
|
|
178
182
|
<div
|
|
179
183
|
v-if="server.oauth"
|
|
180
|
-
class="space-y-1 rounded-md border border-
|
|
184
|
+
class="space-y-1 rounded-md border border-default bg-default/40 p-2"
|
|
181
185
|
:data-testid="`tool-server-oauth-${server.id}`"
|
|
182
186
|
>
|
|
183
187
|
<div class="flex flex-wrap items-center gap-2">
|
|
@@ -195,25 +199,25 @@ async function runProbe(id: string) {
|
|
|
195
199
|
: t('settings.toolServers.oauth.machineGrant')
|
|
196
200
|
}}
|
|
197
201
|
</UBadge>
|
|
198
|
-
<span v-if="server.oauth.connectedBy" class="text-[11px] text-
|
|
202
|
+
<span v-if="server.oauth.connectedBy" class="text-[11px] text-muted">
|
|
199
203
|
{{ t('settings.toolServers.oauth.connectedBy', { user: server.oauth.connectedBy }) }}
|
|
200
204
|
</span>
|
|
201
205
|
</div>
|
|
202
206
|
|
|
203
|
-
<p v-if="server.oauth.scopes?.length" class="text-[11px] text-
|
|
207
|
+
<p v-if="server.oauth.scopes?.length" class="text-[11px] text-muted">
|
|
204
208
|
{{ t('settings.toolServers.oauth.scopes', { scopes: server.oauth.scopes.join(', ') }) }}
|
|
205
209
|
</p>
|
|
206
210
|
<!-- A grant with no refresh token works until its access token expires and then needs
|
|
207
211
|
granting again by hand. Said BEFORE it happens, which is the only time it is useful. -->
|
|
208
212
|
<p
|
|
209
213
|
v-if="server.oauth.connected && server.oauth.refreshable === false"
|
|
210
|
-
class="text-[11px] text-
|
|
214
|
+
class="text-[11px] text-app-warning-400"
|
|
211
215
|
>
|
|
212
216
|
{{ t('settings.toolServers.oauth.notRefreshable') }}
|
|
213
217
|
</p>
|
|
214
218
|
<p
|
|
215
219
|
v-if="server.oauth.lastError"
|
|
216
|
-
class="text-[11px] text-
|
|
220
|
+
class="text-[11px] text-app-error-400"
|
|
217
221
|
:data-testid="`tool-server-oauth-error-${server.id}`"
|
|
218
222
|
>
|
|
219
223
|
{{ t('settings.toolServers.oauth.lastError', { detail: server.oauth.lastError }) }}
|
|
@@ -268,7 +272,7 @@ async function runProbe(id: string) {
|
|
|
268
272
|
verify it from a run, or change the declaration. -->
|
|
269
273
|
<p
|
|
270
274
|
v-else-if="server.notProbeableReason"
|
|
271
|
-
class="text-[11px] text-
|
|
275
|
+
class="text-[11px] text-dimmed"
|
|
272
276
|
:data-testid="`tool-server-unprobeable-${server.id}`"
|
|
273
277
|
>
|
|
274
278
|
{{ NOT_PROBEABLE_LABELS[server.notProbeableReason] }}
|
|
@@ -277,7 +281,7 @@ async function runProbe(id: string) {
|
|
|
277
281
|
|
|
278
282
|
<div
|
|
279
283
|
v-if="resultFor(server.id)"
|
|
280
|
-
class="space-y-1 rounded-md border border-
|
|
284
|
+
class="space-y-1 rounded-md border border-default bg-default/40 p-2"
|
|
281
285
|
:data-testid="`tool-server-result-${server.id}`"
|
|
282
286
|
>
|
|
283
287
|
<div class="flex flex-wrap items-center gap-2">
|
|
@@ -289,12 +293,12 @@ async function runProbe(id: string) {
|
|
|
289
293
|
>
|
|
290
294
|
{{ STATUS_LABELS[resultFor(server.id)!.status] }}
|
|
291
295
|
</UBadge>
|
|
292
|
-
<span v-if="resultFor(server.id)!.httpStatus" class="text-[11px] text-
|
|
296
|
+
<span v-if="resultFor(server.id)!.httpStatus" class="text-[11px] text-muted">
|
|
293
297
|
{{ t('settings.toolServers.httpStatus', { status: resultFor(server.id)!.httpStatus }) }}
|
|
294
298
|
</span>
|
|
295
299
|
</div>
|
|
296
300
|
|
|
297
|
-
<p v-if="resultFor(server.id)!.status === 'ok'" class="text-[11px] text-
|
|
301
|
+
<p v-if="resultFor(server.id)!.status === 'ok'" class="text-[11px] text-toned">
|
|
298
302
|
{{
|
|
299
303
|
t('settings.toolServers.okDetail', {
|
|
300
304
|
name: resultFor(server.id)!.serverName || server.id,
|
|
@@ -306,7 +310,7 @@ async function runProbe(id: string) {
|
|
|
306
310
|
</p>
|
|
307
311
|
<!-- A count off a truncated read is a FLOOR, not a total, and the difference decides whether
|
|
308
312
|
the allowedTools verdict below means anything. -->
|
|
309
|
-
<p v-if="resultFor(server.id)!.toolsComplete === false" class="text-[11px] text-
|
|
313
|
+
<p v-if="resultFor(server.id)!.toolsComplete === false" class="text-[11px] text-dimmed">
|
|
310
314
|
{{ t('settings.toolServers.toolsIncomplete') }}
|
|
311
315
|
</p>
|
|
312
316
|
|
|
@@ -315,7 +319,7 @@ async function runProbe(id: string) {
|
|
|
315
319
|
advertising the tool. Withheld entirely when the tool list was a prefix. -->
|
|
316
320
|
<p
|
|
317
321
|
v-if="resultFor(server.id)!.allowedTools?.unmatched?.length"
|
|
318
|
-
class="text-[11px] text-
|
|
322
|
+
class="text-[11px] text-app-warning-400"
|
|
319
323
|
:data-testid="`tool-server-unmatched-${server.id}`"
|
|
320
324
|
>
|
|
321
325
|
{{
|
|
@@ -326,14 +330,14 @@ async function runProbe(id: string) {
|
|
|
326
330
|
</p>
|
|
327
331
|
<p
|
|
328
332
|
v-else-if="resultFor(server.id)!.allowedTools?.checked === false"
|
|
329
|
-
class="text-[11px] text-
|
|
333
|
+
class="text-[11px] text-dimmed"
|
|
330
334
|
>
|
|
331
335
|
{{ t('settings.toolServers.allowedToolsUnchecked') }}
|
|
332
336
|
</p>
|
|
333
337
|
|
|
334
338
|
<p
|
|
335
339
|
v-if="resultFor(server.id)!.unresolvedCredentials?.length"
|
|
336
|
-
class="text-[11px] text-
|
|
340
|
+
class="text-[11px] text-app-warning-400"
|
|
337
341
|
>
|
|
338
342
|
{{
|
|
339
343
|
t('settings.toolServers.unresolvedCredentials', {
|
|
@@ -341,7 +345,10 @@ async function runProbe(id: string) {
|
|
|
341
345
|
})
|
|
342
346
|
}}
|
|
343
347
|
</p>
|
|
344
|
-
<p
|
|
348
|
+
<p
|
|
349
|
+
v-if="resultFor(server.id)!.refusedCredentials?.length"
|
|
350
|
+
class="text-[11px] text-app-error-400"
|
|
351
|
+
>
|
|
345
352
|
{{
|
|
346
353
|
t('settings.toolServers.refusedCredentials', {
|
|
347
354
|
keys: resultFor(server.id)!.refusedCredentials!.join(', '),
|
|
@@ -350,7 +357,7 @@ async function runProbe(id: string) {
|
|
|
350
357
|
</p>
|
|
351
358
|
<p
|
|
352
359
|
v-if="resultFor(server.id)!.unusableCredentials?.length"
|
|
353
|
-
class="text-[11px] text-
|
|
360
|
+
class="text-[11px] text-app-error-400"
|
|
354
361
|
>
|
|
355
362
|
{{
|
|
356
363
|
t('settings.toolServers.unusableCredentials', {
|
|
@@ -377,7 +384,7 @@ async function runProbe(id: string) {
|
|
|
377
384
|
</UButton>
|
|
378
385
|
<pre
|
|
379
386
|
v-if="expanded[server.id]"
|
|
380
|
-
class="overflow-x-auto rounded bg-
|
|
387
|
+
class="overflow-x-auto rounded bg-app-950 p-2 font-mono text-[10px] text-muted"
|
|
381
388
|
>{{ resultFor(server.id)!.error }}</pre>
|
|
382
389
|
</template>
|
|
383
390
|
</div>
|
|
@@ -38,26 +38,26 @@ const hasAny = computed(() => usage.rows.length > 0)
|
|
|
38
38
|
|
|
39
39
|
<template>
|
|
40
40
|
<div class="space-y-6">
|
|
41
|
-
<p class="text-[11px] text-
|
|
41
|
+
<p class="text-[11px] text-muted">
|
|
42
42
|
{{ t('settings.usage.body') }}
|
|
43
43
|
</p>
|
|
44
44
|
|
|
45
|
-
<p v-if="usage.report" class="text-[11px] text-
|
|
45
|
+
<p v-if="usage.report" class="text-[11px] text-dimmed">
|
|
46
46
|
{{ t('settings.usage.period', { date: d(new Date(usage.report.periodStart), 'short') }) }}
|
|
47
47
|
</p>
|
|
48
48
|
|
|
49
|
-
<p v-if="usage.loading" class="text-[11px] text-
|
|
50
|
-
<p v-else-if="usage.error" class="text-[11px] text-
|
|
51
|
-
<p v-else-if="!hasAny" class="text-[11px] text-
|
|
49
|
+
<p v-if="usage.loading" class="text-[11px] text-dimmed">{{ t('common.loading') }}</p>
|
|
50
|
+
<p v-else-if="usage.error" class="text-[11px] text-app-error-400">{{ usage.error }}</p>
|
|
51
|
+
<p v-else-if="!hasAny" class="text-[11px] text-dimmed">{{ t('settings.usage.empty') }}</p>
|
|
52
52
|
|
|
53
53
|
<template v-else>
|
|
54
54
|
<!-- Subscriptions (flat-rate quota harnesses) -->
|
|
55
55
|
<section v-if="usage.subscription.length" class="space-y-3">
|
|
56
56
|
<div class="flex items-baseline justify-between">
|
|
57
|
-
<h3 class="text-sm font-semibold text-
|
|
57
|
+
<h3 class="text-sm font-semibold text-default">
|
|
58
58
|
{{ t('settings.usage.subscription') }}
|
|
59
59
|
</h3>
|
|
60
|
-
<span class="text-[11px] text-
|
|
60
|
+
<span class="text-[11px] text-muted">
|
|
61
61
|
{{
|
|
62
62
|
t('settings.usage.tokens', {
|
|
63
63
|
input: formatTokens(usage.subscriptionTotal.inputTokens),
|
|
@@ -66,7 +66,7 @@ const hasAny = computed(() => usage.rows.length > 0)
|
|
|
66
66
|
}}
|
|
67
67
|
</span>
|
|
68
68
|
</div>
|
|
69
|
-
<p class="text-[10px] text-
|
|
69
|
+
<p class="text-[10px] text-dimmed">{{ t('settings.usage.illustrative') }}</p>
|
|
70
70
|
<div
|
|
71
71
|
v-for="row in usage.subscription"
|
|
72
72
|
:key="`sub-${row.vendor}-${row.provider}-${row.model}`"
|
|
@@ -74,13 +74,13 @@ const hasAny = computed(() => usage.rows.length > 0)
|
|
|
74
74
|
:data-testid="'usage-row-subscription'"
|
|
75
75
|
>
|
|
76
76
|
<div class="flex items-center justify-between gap-2 text-[11px]">
|
|
77
|
-
<span class="min-w-0 truncate font-medium text-
|
|
78
|
-
<span class="shrink-0 rounded bg-
|
|
77
|
+
<span class="min-w-0 truncate font-medium text-toned">{{ row.model }}</span>
|
|
78
|
+
<span class="shrink-0 rounded bg-accented/60 px-1.5 py-0.5 text-[10px] text-toned">
|
|
79
79
|
{{ row.vendor ?? row.provider }}
|
|
80
80
|
</span>
|
|
81
81
|
</div>
|
|
82
82
|
<UProgress :model-value="pctOf(row, usage.subscription)" size="xs" color="primary" />
|
|
83
|
-
<div class="flex justify-between text-[10px] text-
|
|
83
|
+
<div class="flex justify-between text-[10px] text-dimmed">
|
|
84
84
|
<span>
|
|
85
85
|
{{
|
|
86
86
|
t('settings.usage.tokens', {
|
|
@@ -98,10 +98,10 @@ const hasAny = computed(() => usage.rows.length > 0)
|
|
|
98
98
|
<!-- Metered API / proxy calls (real spend) -->
|
|
99
99
|
<section v-if="usage.metered.length" class="space-y-3">
|
|
100
100
|
<div class="flex items-baseline justify-between">
|
|
101
|
-
<h3 class="text-sm font-semibold text-
|
|
101
|
+
<h3 class="text-sm font-semibold text-default">
|
|
102
102
|
{{ t('settings.usage.metered') }}
|
|
103
103
|
</h3>
|
|
104
|
-
<span class="text-[11px] text-
|
|
104
|
+
<span class="text-[11px] text-muted">
|
|
105
105
|
{{
|
|
106
106
|
t('settings.usage.tokens', {
|
|
107
107
|
input: formatTokens(usage.meteredTotal.inputTokens),
|
|
@@ -118,12 +118,12 @@ const hasAny = computed(() => usage.rows.length > 0)
|
|
|
118
118
|
:data-testid="'usage-row-metered'"
|
|
119
119
|
>
|
|
120
120
|
<div class="flex items-center justify-between gap-2 text-[11px]">
|
|
121
|
-
<span class="min-w-0 truncate font-medium text-
|
|
121
|
+
<span class="min-w-0 truncate font-medium text-toned">
|
|
122
122
|
{{ row.provider }}:{{ row.model }}
|
|
123
123
|
</span>
|
|
124
124
|
</div>
|
|
125
125
|
<UProgress :model-value="pctOf(row, usage.metered)" size="xs" color="neutral" />
|
|
126
|
-
<div class="flex justify-between text-[10px] text-
|
|
126
|
+
<div class="flex justify-between text-[10px] text-dimmed">
|
|
127
127
|
<span>
|
|
128
128
|
{{
|
|
129
129
|
t('settings.usage.tokens', {
|
|
@@ -153,24 +153,24 @@ async function remove() {
|
|
|
153
153
|
</template>
|
|
154
154
|
<template #body>
|
|
155
155
|
<div class="space-y-4">
|
|
156
|
-
<p class="text-xs text-
|
|
156
|
+
<p class="text-xs text-muted">
|
|
157
157
|
<i18n-t keypath="settings.userSecrets.intro" tag="span" scope="global">
|
|
158
158
|
<template #you>
|
|
159
159
|
<strong>{{ t('settings.userSecrets.introYou') }}</strong>
|
|
160
160
|
</template>
|
|
161
161
|
<template #scope>
|
|
162
|
-
<span class="text-
|
|
162
|
+
<span class="text-toned">{{ t('settings.userSecrets.introScope') }}</span>
|
|
163
163
|
</template>
|
|
164
164
|
</i18n-t>
|
|
165
165
|
</p>
|
|
166
166
|
|
|
167
167
|
<div
|
|
168
168
|
v-if="status"
|
|
169
|
-
class="flex items-center justify-between rounded-md border border-
|
|
169
|
+
class="flex items-center justify-between rounded-md border border-muted bg-default/50 px-3 py-2 text-sm"
|
|
170
170
|
>
|
|
171
171
|
<div>
|
|
172
|
-
<span class="font-medium text-
|
|
173
|
-
<div class="text-[11px] text-
|
|
172
|
+
<span class="font-medium text-default">{{ status.label }}</span>
|
|
173
|
+
<div class="text-[11px] text-app-success-400">
|
|
174
174
|
{{ t('settings.userSecrets.connectedStored') }}
|
|
175
175
|
</div>
|
|
176
176
|
</div>
|
|
@@ -184,11 +184,8 @@ async function remove() {
|
|
|
184
184
|
/>
|
|
185
185
|
</div>
|
|
186
186
|
|
|
187
|
-
<div
|
|
188
|
-
|
|
189
|
-
class="rounded-lg border border-dashed border-slate-700 p-3 space-y-3"
|
|
190
|
-
>
|
|
191
|
-
<p class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
|
|
187
|
+
<div v-if="descriptor" class="rounded-lg border border-dashed border-muted p-3 space-y-3">
|
|
188
|
+
<p class="text-[11px] font-semibold uppercase tracking-wide text-muted">
|
|
192
189
|
{{
|
|
193
190
|
status ? t('settings.userSecrets.replaceToken') : t('settings.userSecrets.addToken')
|
|
194
191
|
}}
|
|
@@ -228,10 +225,10 @@ async function remove() {
|
|
|
228
225
|
>
|
|
229
226
|
{{ t('settings.userSecrets.testConnection') }}
|
|
230
227
|
</UButton>
|
|
231
|
-
<span v-if="testResult && testResult.ok" class="text-xs text-
|
|
228
|
+
<span v-if="testResult && testResult.ok" class="text-xs text-app-success-400">
|
|
232
229
|
{{ testResult.message ?? t('settings.userSecrets.tokenValid') }}
|
|
233
230
|
</span>
|
|
234
|
-
<span v-else-if="testResult" class="text-xs text-
|
|
231
|
+
<span v-else-if="testResult" class="text-xs text-app-error-400">
|
|
235
232
|
{{ testResult.message ?? t('settings.userSecrets.tokenRejected') }}
|
|
236
233
|
</span>
|
|
237
234
|
</div>
|
|
@@ -90,15 +90,15 @@ function selectItems(field: WorkspaceMetadataFieldDefinition) {
|
|
|
90
90
|
<template>
|
|
91
91
|
<div class="space-y-6" data-testid="workspace-metadata-settings">
|
|
92
92
|
<section class="space-y-2">
|
|
93
|
-
<h3 class="text-sm font-semibold text-
|
|
93
|
+
<h3 class="text-sm font-semibold text-default">
|
|
94
94
|
{{ t('settings.workspaceSettings.metadata.heading') }}
|
|
95
95
|
</h3>
|
|
96
|
-
<p class="text-[11px] text-
|
|
96
|
+
<p class="text-[11px] text-muted">
|
|
97
97
|
{{ t('settings.workspaceSettings.metadata.body') }}
|
|
98
98
|
</p>
|
|
99
99
|
</section>
|
|
100
100
|
|
|
101
|
-
<p v-if="fields.length === 0" class="text-[11px] text-
|
|
101
|
+
<p v-if="fields.length === 0" class="text-[11px] text-dimmed">
|
|
102
102
|
{{ t('settings.workspaceSettings.metadata.empty') }}
|
|
103
103
|
</p>
|
|
104
104
|
|
|
@@ -106,7 +106,7 @@ function selectItems(field: WorkspaceMetadataFieldDefinition) {
|
|
|
106
106
|
<div class="space-y-4">
|
|
107
107
|
<label v-for="field in fields" :key="field.key" class="block">
|
|
108
108
|
<!-- Field labels are deployment DATA, rendered verbatim (see the module docs). -->
|
|
109
|
-
<span class="mb-1 block text-[10px] uppercase tracking-wide text-
|
|
109
|
+
<span class="mb-1 block text-[10px] uppercase tracking-wide text-dimmed">
|
|
110
110
|
{{ field.label }}
|
|
111
111
|
</span>
|
|
112
112
|
<USelect
|
|
@@ -124,7 +124,7 @@ function selectItems(field: WorkspaceMetadataFieldDefinition) {
|
|
|
124
124
|
size="sm"
|
|
125
125
|
:data-testid="`workspace-metadata-${field.key}`"
|
|
126
126
|
/>
|
|
127
|
-
<span v-if="field.description" class="mt-1 block text-[11px] text-
|
|
127
|
+
<span v-if="field.description" class="mt-1 block text-[11px] text-dimmed">
|
|
128
128
|
{{ field.description }}
|
|
129
129
|
</span>
|
|
130
130
|
</label>
|