@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
|
@@ -128,10 +128,10 @@ async function runProbe(id: string) {
|
|
|
128
128
|
<UBadge color="neutral" variant="soft" size="sm">
|
|
129
129
|
{{ TRANSPORT_LABELS[server.transport] }}
|
|
130
130
|
</UBadge>
|
|
131
|
-
<code class="font-mono text-
|
|
131
|
+
<code class="font-mono text-2xs text-dimmed">{{ server.id }}</code>
|
|
132
132
|
</div>
|
|
133
133
|
|
|
134
|
-
<p class="truncate font-mono text-
|
|
134
|
+
<p class="truncate font-mono text-2xs text-dimmed" :title="server.target">
|
|
135
135
|
{{ server.target }}
|
|
136
136
|
</p>
|
|
137
137
|
<p v-if="server.guidance" class="text-xs text-muted">{{ server.guidance }}</p>
|
|
@@ -139,12 +139,12 @@ async function runProbe(id: string) {
|
|
|
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-
|
|
142
|
+
<p v-if="server.declaredBy.length" class="text-2xs text-muted">
|
|
143
143
|
{{ t('settings.toolServers.declaredBy', { kinds: server.declaredBy.join(', ') }) }}
|
|
144
144
|
</p>
|
|
145
145
|
<p
|
|
146
146
|
v-else
|
|
147
|
-
class="text-
|
|
147
|
+
class="text-2xs text-app-warning-400"
|
|
148
148
|
:data-testid="`tool-server-orphan-${server.id}`"
|
|
149
149
|
>
|
|
150
150
|
{{ t('settings.toolServers.declaredByNone') }}
|
|
@@ -153,21 +153,21 @@ async function runProbe(id: string) {
|
|
|
153
153
|
<!-- Which harnesses could serve it. EMPTY means the declaration can never run anywhere (an
|
|
154
154
|
`http` server narrowed to Codex, whose MCP client is stdio-only): it is never dropped FOR
|
|
155
155
|
A REASON on any run, so no prompt and no log line ever mentions it. -->
|
|
156
|
-
<p v-if="server.servableHarnesses.length" class="text-
|
|
156
|
+
<p v-if="server.servableHarnesses.length" class="text-2xs text-muted">
|
|
157
157
|
{{
|
|
158
158
|
t('settings.toolServers.servableHarnesses', {
|
|
159
159
|
harnesses: server.servableHarnesses.join(', '),
|
|
160
160
|
})
|
|
161
161
|
}}
|
|
162
162
|
</p>
|
|
163
|
-
<p v-else class="text-
|
|
163
|
+
<p v-else class="text-2xs text-app-warning-400">
|
|
164
164
|
{{ t('settings.toolServers.servableHarnessesNone') }}
|
|
165
165
|
</p>
|
|
166
166
|
|
|
167
|
-
<p v-if="server.allowedTools?.length" class="text-
|
|
167
|
+
<p v-if="server.allowedTools?.length" class="text-2xs text-muted">
|
|
168
168
|
{{ t('settings.toolServers.allowedTools', { tools: server.allowedTools.join(', ') }) }}
|
|
169
169
|
</p>
|
|
170
|
-
<p v-if="server.credentials.length" class="text-
|
|
170
|
+
<p v-if="server.credentials.length" class="text-2xs text-muted">
|
|
171
171
|
{{
|
|
172
172
|
t('settings.toolServers.credentials', {
|
|
173
173
|
keys: server.credentials.map((c) => c.key).join(', '),
|
|
@@ -199,25 +199,25 @@ async function runProbe(id: string) {
|
|
|
199
199
|
: t('settings.toolServers.oauth.machineGrant')
|
|
200
200
|
}}
|
|
201
201
|
</UBadge>
|
|
202
|
-
<span v-if="server.oauth.connectedBy" class="text-
|
|
202
|
+
<span v-if="server.oauth.connectedBy" class="text-2xs text-muted">
|
|
203
203
|
{{ t('settings.toolServers.oauth.connectedBy', { user: server.oauth.connectedBy }) }}
|
|
204
204
|
</span>
|
|
205
205
|
</div>
|
|
206
206
|
|
|
207
|
-
<p v-if="server.oauth.scopes?.length" class="text-
|
|
207
|
+
<p v-if="server.oauth.scopes?.length" class="text-2xs text-muted">
|
|
208
208
|
{{ t('settings.toolServers.oauth.scopes', { scopes: server.oauth.scopes.join(', ') }) }}
|
|
209
209
|
</p>
|
|
210
210
|
<!-- A grant with no refresh token works until its access token expires and then needs
|
|
211
211
|
granting again by hand. Said BEFORE it happens, which is the only time it is useful. -->
|
|
212
212
|
<p
|
|
213
213
|
v-if="server.oauth.connected && server.oauth.refreshable === false"
|
|
214
|
-
class="text-
|
|
214
|
+
class="text-2xs text-app-warning-400"
|
|
215
215
|
>
|
|
216
216
|
{{ t('settings.toolServers.oauth.notRefreshable') }}
|
|
217
217
|
</p>
|
|
218
218
|
<p
|
|
219
219
|
v-if="server.oauth.lastError"
|
|
220
|
-
class="text-
|
|
220
|
+
class="text-2xs text-app-error-400"
|
|
221
221
|
:data-testid="`tool-server-oauth-error-${server.id}`"
|
|
222
222
|
>
|
|
223
223
|
{{ t('settings.toolServers.oauth.lastError', { detail: server.oauth.lastError }) }}
|
|
@@ -272,7 +272,7 @@ async function runProbe(id: string) {
|
|
|
272
272
|
verify it from a run, or change the declaration. -->
|
|
273
273
|
<p
|
|
274
274
|
v-else-if="server.notProbeableReason"
|
|
275
|
-
class="text-
|
|
275
|
+
class="text-2xs text-dimmed"
|
|
276
276
|
:data-testid="`tool-server-unprobeable-${server.id}`"
|
|
277
277
|
>
|
|
278
278
|
{{ NOT_PROBEABLE_LABELS[server.notProbeableReason] }}
|
|
@@ -293,12 +293,12 @@ async function runProbe(id: string) {
|
|
|
293
293
|
>
|
|
294
294
|
{{ STATUS_LABELS[resultFor(server.id)!.status] }}
|
|
295
295
|
</UBadge>
|
|
296
|
-
<span v-if="resultFor(server.id)!.httpStatus" class="text-
|
|
296
|
+
<span v-if="resultFor(server.id)!.httpStatus" class="text-2xs text-muted">
|
|
297
297
|
{{ t('settings.toolServers.httpStatus', { status: resultFor(server.id)!.httpStatus }) }}
|
|
298
298
|
</span>
|
|
299
299
|
</div>
|
|
300
300
|
|
|
301
|
-
<p v-if="resultFor(server.id)!.status === 'ok'" class="text-
|
|
301
|
+
<p v-if="resultFor(server.id)!.status === 'ok'" class="text-2xs text-toned">
|
|
302
302
|
{{
|
|
303
303
|
t('settings.toolServers.okDetail', {
|
|
304
304
|
name: resultFor(server.id)!.serverName || server.id,
|
|
@@ -310,7 +310,7 @@ async function runProbe(id: string) {
|
|
|
310
310
|
</p>
|
|
311
311
|
<!-- A count off a truncated read is a FLOOR, not a total, and the difference decides whether
|
|
312
312
|
the allowedTools verdict below means anything. -->
|
|
313
|
-
<p v-if="resultFor(server.id)!.toolsComplete === false" class="text-
|
|
313
|
+
<p v-if="resultFor(server.id)!.toolsComplete === false" class="text-2xs text-dimmed">
|
|
314
314
|
{{ t('settings.toolServers.toolsIncomplete') }}
|
|
315
315
|
</p>
|
|
316
316
|
|
|
@@ -319,7 +319,7 @@ async function runProbe(id: string) {
|
|
|
319
319
|
advertising the tool. Withheld entirely when the tool list was a prefix. -->
|
|
320
320
|
<p
|
|
321
321
|
v-if="resultFor(server.id)!.allowedTools?.unmatched?.length"
|
|
322
|
-
class="text-
|
|
322
|
+
class="text-2xs text-app-warning-400"
|
|
323
323
|
:data-testid="`tool-server-unmatched-${server.id}`"
|
|
324
324
|
>
|
|
325
325
|
{{
|
|
@@ -330,14 +330,14 @@ async function runProbe(id: string) {
|
|
|
330
330
|
</p>
|
|
331
331
|
<p
|
|
332
332
|
v-else-if="resultFor(server.id)!.allowedTools?.checked === false"
|
|
333
|
-
class="text-
|
|
333
|
+
class="text-2xs text-dimmed"
|
|
334
334
|
>
|
|
335
335
|
{{ t('settings.toolServers.allowedToolsUnchecked') }}
|
|
336
336
|
</p>
|
|
337
337
|
|
|
338
338
|
<p
|
|
339
339
|
v-if="resultFor(server.id)!.unresolvedCredentials?.length"
|
|
340
|
-
class="text-
|
|
340
|
+
class="text-2xs text-app-warning-400"
|
|
341
341
|
>
|
|
342
342
|
{{
|
|
343
343
|
t('settings.toolServers.unresolvedCredentials', {
|
|
@@ -347,7 +347,7 @@ async function runProbe(id: string) {
|
|
|
347
347
|
</p>
|
|
348
348
|
<p
|
|
349
349
|
v-if="resultFor(server.id)!.refusedCredentials?.length"
|
|
350
|
-
class="text-
|
|
350
|
+
class="text-2xs text-app-error-400"
|
|
351
351
|
>
|
|
352
352
|
{{
|
|
353
353
|
t('settings.toolServers.refusedCredentials', {
|
|
@@ -357,7 +357,7 @@ async function runProbe(id: string) {
|
|
|
357
357
|
</p>
|
|
358
358
|
<p
|
|
359
359
|
v-if="resultFor(server.id)!.unusableCredentials?.length"
|
|
360
|
-
class="text-
|
|
360
|
+
class="text-2xs text-app-error-400"
|
|
361
361
|
>
|
|
362
362
|
{{
|
|
363
363
|
t('settings.toolServers.unusableCredentials', {
|
|
@@ -384,7 +384,7 @@ async function runProbe(id: string) {
|
|
|
384
384
|
</UButton>
|
|
385
385
|
<pre
|
|
386
386
|
v-if="expanded[server.id]"
|
|
387
|
-
class="overflow-x-auto rounded bg-app-950 p-2 font-mono text-
|
|
387
|
+
class="overflow-x-auto rounded-sm bg-app-950 p-2 font-mono text-3xs text-muted"
|
|
388
388
|
>{{ resultFor(server.id)!.error }}</pre>
|
|
389
389
|
</template>
|
|
390
390
|
</div>
|
|
@@ -38,17 +38,17 @@ const hasAny = computed(() => usage.rows.length > 0)
|
|
|
38
38
|
|
|
39
39
|
<template>
|
|
40
40
|
<div class="space-y-6">
|
|
41
|
-
<p class="text-
|
|
41
|
+
<p class="text-2xs text-muted">
|
|
42
42
|
{{ t('settings.usage.body') }}
|
|
43
43
|
</p>
|
|
44
44
|
|
|
45
|
-
<p v-if="usage.report" class="text-
|
|
45
|
+
<p v-if="usage.report" class="text-2xs 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-
|
|
50
|
-
<p v-else-if="usage.error" class="text-
|
|
51
|
-
<p v-else-if="!hasAny" class="text-
|
|
49
|
+
<p v-if="usage.loading" class="text-2xs text-dimmed">{{ t('common.loading') }}</p>
|
|
50
|
+
<p v-else-if="usage.error" class="text-2xs text-app-error-400">{{ usage.error }}</p>
|
|
51
|
+
<p v-else-if="!hasAny" class="text-2xs text-dimmed">{{ t('settings.usage.empty') }}</p>
|
|
52
52
|
|
|
53
53
|
<template v-else>
|
|
54
54
|
<!-- Subscriptions (flat-rate quota harnesses) -->
|
|
@@ -57,7 +57,7 @@ const hasAny = computed(() => usage.rows.length > 0)
|
|
|
57
57
|
<h3 class="text-sm font-semibold text-default">
|
|
58
58
|
{{ t('settings.usage.subscription') }}
|
|
59
59
|
</h3>
|
|
60
|
-
<span class="text-
|
|
60
|
+
<span class="text-2xs text-muted">
|
|
61
61
|
{{
|
|
62
62
|
t('settings.usage.tokens', {
|
|
63
63
|
input: formatTokens(usage.subscriptionTotal.inputTokens),
|
|
@@ -66,21 +66,21 @@ const hasAny = computed(() => usage.rows.length > 0)
|
|
|
66
66
|
}}
|
|
67
67
|
</span>
|
|
68
68
|
</div>
|
|
69
|
-
<p class="text-
|
|
69
|
+
<p class="text-3xs 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}`"
|
|
73
73
|
class="space-y-1"
|
|
74
74
|
:data-testid="'usage-row-subscription'"
|
|
75
75
|
>
|
|
76
|
-
<div class="flex items-center justify-between gap-2 text-
|
|
76
|
+
<div class="flex items-center justify-between gap-2 text-2xs">
|
|
77
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-
|
|
78
|
+
<span class="shrink-0 rounded-sm bg-accented/60 px-1.5 py-0.5 text-3xs 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-
|
|
83
|
+
<div class="flex justify-between text-3xs text-dimmed">
|
|
84
84
|
<span>
|
|
85
85
|
{{
|
|
86
86
|
t('settings.usage.tokens', {
|
|
@@ -101,7 +101,7 @@ const hasAny = computed(() => usage.rows.length > 0)
|
|
|
101
101
|
<h3 class="text-sm font-semibold text-default">
|
|
102
102
|
{{ t('settings.usage.metered') }}
|
|
103
103
|
</h3>
|
|
104
|
-
<span class="text-
|
|
104
|
+
<span class="text-2xs text-muted">
|
|
105
105
|
{{
|
|
106
106
|
t('settings.usage.tokens', {
|
|
107
107
|
input: formatTokens(usage.meteredTotal.inputTokens),
|
|
@@ -117,13 +117,13 @@ const hasAny = computed(() => usage.rows.length > 0)
|
|
|
117
117
|
class="space-y-1"
|
|
118
118
|
:data-testid="'usage-row-metered'"
|
|
119
119
|
>
|
|
120
|
-
<div class="flex items-center justify-between gap-2 text-
|
|
120
|
+
<div class="flex items-center justify-between gap-2 text-2xs">
|
|
121
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-
|
|
126
|
+
<div class="flex justify-between text-3xs text-dimmed">
|
|
127
127
|
<span>
|
|
128
128
|
{{
|
|
129
129
|
t('settings.usage.tokens', {
|
|
@@ -10,6 +10,7 @@ import type { ProviderConfigField, UserSecretKind } from '~/types/userSecrets'
|
|
|
10
10
|
import IntegrationBackTitle from '~/components/layout/IntegrationBackTitle.vue'
|
|
11
11
|
import SecretInput from '~/components/common/SecretInput.vue'
|
|
12
12
|
import ConnectionWarnings from '~/components/settings/ConnectionWarnings.vue'
|
|
13
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
13
14
|
|
|
14
15
|
const { t } = useI18n()
|
|
15
16
|
const ui = useUiStore()
|
|
@@ -170,7 +171,7 @@ async function remove() {
|
|
|
170
171
|
>
|
|
171
172
|
<div>
|
|
172
173
|
<span class="font-medium text-default">{{ status.label }}</span>
|
|
173
|
-
<div class="text-
|
|
174
|
+
<div class="text-2xs text-app-success-400">
|
|
174
175
|
{{ t('settings.userSecrets.connectedStored') }}
|
|
175
176
|
</div>
|
|
176
177
|
</div>
|
|
@@ -185,11 +186,11 @@ async function remove() {
|
|
|
185
186
|
</div>
|
|
186
187
|
|
|
187
188
|
<div v-if="descriptor" class="rounded-lg border border-dashed border-muted p-3 space-y-3">
|
|
188
|
-
<
|
|
189
|
+
<SectionLabel as="p">
|
|
189
190
|
{{
|
|
190
191
|
status ? t('settings.userSecrets.replaceToken') : t('settings.userSecrets.addToken')
|
|
191
192
|
}}
|
|
192
|
-
</
|
|
193
|
+
</SectionLabel>
|
|
193
194
|
|
|
194
195
|
<UFormField :label="t('settings.userSecrets.labelField')">
|
|
195
196
|
<UInput v-model="labelDraft" :placeholder="descriptor.label" />
|
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
} from '~/modular/workspace-metadata'
|
|
18
18
|
import type { WorkspaceMetadataFieldDefinition } from '~/modular/workspace-metadata'
|
|
19
19
|
import type { AppSlots } from '~/modular/slots'
|
|
20
|
+
import SectionLabel from '~/components/common/SectionLabel.vue'
|
|
20
21
|
|
|
21
22
|
const { t } = useI18n()
|
|
22
23
|
const slots = useReactiveSlots<AppSlots>()
|
|
@@ -93,12 +94,12 @@ function selectItems(field: WorkspaceMetadataFieldDefinition) {
|
|
|
93
94
|
<h3 class="text-sm font-semibold text-default">
|
|
94
95
|
{{ t('settings.workspaceSettings.metadata.heading') }}
|
|
95
96
|
</h3>
|
|
96
|
-
<p class="text-
|
|
97
|
+
<p class="text-2xs text-muted">
|
|
97
98
|
{{ t('settings.workspaceSettings.metadata.body') }}
|
|
98
99
|
</p>
|
|
99
100
|
</section>
|
|
100
101
|
|
|
101
|
-
<p v-if="fields.length === 0" class="text-
|
|
102
|
+
<p v-if="fields.length === 0" class="text-2xs text-dimmed">
|
|
102
103
|
{{ t('settings.workspaceSettings.metadata.empty') }}
|
|
103
104
|
</p>
|
|
104
105
|
|
|
@@ -106,9 +107,9 @@ function selectItems(field: WorkspaceMetadataFieldDefinition) {
|
|
|
106
107
|
<div class="space-y-4">
|
|
107
108
|
<label v-for="field in fields" :key="field.key" class="block">
|
|
108
109
|
<!-- Field labels are deployment DATA, rendered verbatim (see the module docs). -->
|
|
109
|
-
<span class="mb-1 block
|
|
110
|
+
<SectionLabel as="span" class="mb-1 block">
|
|
110
111
|
{{ field.label }}
|
|
111
|
-
</
|
|
112
|
+
</SectionLabel>
|
|
112
113
|
<USelect
|
|
113
114
|
v-if="field.type === 'select'"
|
|
114
115
|
v-model="draft[field.key]"
|
|
@@ -124,7 +125,7 @@ function selectItems(field: WorkspaceMetadataFieldDefinition) {
|
|
|
124
125
|
size="sm"
|
|
125
126
|
:data-testid="`workspace-metadata-${field.key}`"
|
|
126
127
|
/>
|
|
127
|
-
<span v-if="field.description" class="mt-1 block text-
|
|
128
|
+
<span v-if="field.description" class="mt-1 block text-2xs text-dimmed">
|
|
128
129
|
{{ field.description }}
|
|
129
130
|
</span>
|
|
130
131
|
</label>
|