@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.
Files changed (243) hide show
  1. package/README.md +21 -0
  2. package/app/assets/css/main.css +22 -0
  3. package/app/assets/css/prose.css +4 -4
  4. package/app/assets/css/type.css +24 -0
  5. package/app/components/assistant/AssistantModal.vue +3 -2
  6. package/app/components/auth/UserMenu.vue +1 -1
  7. package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +15 -15
  8. package/app/components/binaryOutput/BinaryOutputReport.vue +10 -14
  9. package/app/components/binaryOutput/StoredAssetView.vue +5 -5
  10. package/app/components/board/AddTaskModal.vue +16 -14
  11. package/app/components/board/AgentFailureCard.vue +9 -9
  12. package/app/components/board/AgentFailureHistory.vue +1 -1
  13. package/app/components/board/CreateInitiativeModal.vue +2 -2
  14. package/app/components/board/FailureDetail.vue +1 -1
  15. package/app/components/board/FailureHistoryList.vue +5 -5
  16. package/app/components/board/RecurringPipelineModal.vue +12 -11
  17. package/app/components/board/ReviewFrictionDialog.vue +4 -3
  18. package/app/components/board/StepExecutionHistory.vue +8 -8
  19. package/app/components/board/nodes/AgentChip.vue +1 -1
  20. package/app/components/board/nodes/BlockNode.vue +8 -9
  21. package/app/components/board/nodes/EpicNode.vue +4 -4
  22. package/app/components/board/nodes/FrameSwimlanes.vue +4 -7
  23. package/app/components/board/nodes/InitiativeCard.vue +4 -4
  24. package/app/components/board/nodes/LaneGroup.vue +3 -5
  25. package/app/components/board/nodes/TaskCard.vue +8 -8
  26. package/app/components/board/nodes/TaskLane.vue +3 -3
  27. package/app/components/board/nodes/TaskPipelineMini.vue +13 -12
  28. package/app/components/bootstrap/AdoptionReviewModal.vue +7 -6
  29. package/app/components/bootstrap/BootstrapModal.vue +11 -10
  30. package/app/components/bootstrap/BootstrapRunSteps.vue +1 -1
  31. package/app/components/brainstorm/BrainstormWindow.vue +8 -7
  32. package/app/components/bugFishing/BugFishingWindow.vue +37 -36
  33. package/app/components/clarity/ClarityReviewWindow.vue +8 -7
  34. package/app/components/common/AsyncViewError.vue +1 -1
  35. package/app/components/common/ClarificationItem.vue +6 -6
  36. package/app/components/common/DescriptorFields.vue +1 -1
  37. package/app/components/common/EmptyState.vue +1 -1
  38. package/app/components/common/InterviewGateNotice.vue +4 -4
  39. package/app/components/common/MarkdownProse.vue +8 -2
  40. package/app/components/common/SectionLabel.vue +38 -0
  41. package/app/components/consensus/ConsensusSessionWindow.vue +10 -9
  42. package/app/components/context/ContextAttachmentFields.vue +9 -8
  43. package/app/components/docs/DocInterviewWindow.vue +10 -9
  44. package/app/components/documents/ContextDocumentPicker.vue +10 -12
  45. package/app/components/documents/DocumentImportModal.vue +3 -2
  46. package/app/components/documents/DocumentSourceConnectModal.vue +2 -2
  47. package/app/components/documents/DocumentSyncState.vue +1 -1
  48. package/app/components/documents/DocumentTemplatesModal.vue +5 -4
  49. package/app/components/documents/RepoContextDocPicker.vue +3 -6
  50. package/app/components/documents/StartFromDesignModal.vue +4 -4
  51. package/app/components/documents/TaskContextDocs.vue +1 -1
  52. package/app/components/environments/EnvSetupStepper.vue +3 -3
  53. package/app/components/environments/EnvironmentStatusPanel.vue +11 -10
  54. package/app/components/environments/steps/EnvPreflightStep.vue +8 -8
  55. package/app/components/environments/steps/EnvReviewStep.vue +23 -22
  56. package/app/components/environments/steps/EnvSaveStep.vue +5 -5
  57. package/app/components/focus/BlockFocusView.vue +11 -10
  58. package/app/components/followUp/FollowUpWindow.vue +10 -10
  59. package/app/components/forkDecision/ForkDecisionWindow.vue +23 -26
  60. package/app/components/foundational/FoundationalContractSummary.vue +2 -2
  61. package/app/components/foundational/FoundationalServiceCatalogList.vue +3 -3
  62. package/app/components/foundational/FoundationalServiceRegistry.vue +3 -3
  63. package/app/components/foundational/FoundationalSuppressions.vue +2 -2
  64. package/app/components/fragments/FragmentLibraryManager.vue +3 -3
  65. package/app/components/fragments/FragmentSelector.vue +10 -11
  66. package/app/components/gates/GateFailingCheckList.vue +3 -3
  67. package/app/components/gates/GateResultView.vue +39 -38
  68. package/app/components/github/AddServiceFromRepoModal.vue +5 -4
  69. package/app/components/github/BranchProtectionPreflight.vue +5 -5
  70. package/app/components/github/GitHubConnect.vue +5 -3
  71. package/app/components/github/GitHubPanel.vue +14 -13
  72. package/app/components/github/RepoTreeBrowser.vue +1 -1
  73. package/app/components/humanTest/HumanTestWindow.vue +18 -17
  74. package/app/components/initiative/InitiativePlanNotice.vue +3 -3
  75. package/app/components/initiative/InitiativePlanReview.vue +19 -21
  76. package/app/components/initiative/InitiativePlanningWindow.vue +5 -5
  77. package/app/components/initiative/InitiativeTrackerWindow.vue +54 -53
  78. package/app/components/judge/JudgeResultView.vue +24 -25
  79. package/app/components/kaizen/KaizenPanel.vue +4 -4
  80. package/app/components/kaizen/KaizenStepStatus.vue +7 -6
  81. package/app/components/layout/AccountAuditLog.vue +1 -1
  82. package/app/components/layout/AccountDeploymentSettings.vue +10 -10
  83. package/app/components/layout/AccountFailureKindRules.vue +13 -13
  84. package/app/components/layout/AccountFoundationalSettings.vue +1 -1
  85. package/app/components/layout/AccountFragmentSettings.vue +1 -1
  86. package/app/components/layout/AccountModelPolicySettings.vue +7 -7
  87. package/app/components/layout/AccountPlatformAlertSettings.vue +8 -8
  88. package/app/components/layout/AccountRiskPolicySettings.vue +2 -2
  89. package/app/components/layout/AccountRunCredentialSettings.vue +3 -3
  90. package/app/components/layout/AccountSkillSettings.vue +1 -1
  91. package/app/components/layout/AccountTeamSettings.vue +4 -0
  92. package/app/components/layout/AiProvidersBanner.vue +1 -1
  93. package/app/components/layout/AppearanceSwitcher.vue +1 -1
  94. package/app/components/layout/BoardSwitcher.vue +3 -2
  95. package/app/components/layout/BoardToolbar.vue +6 -2
  96. package/app/components/layout/CommandBar.vue +4 -2
  97. package/app/components/layout/DefaultTestEnvBanner.vue +2 -2
  98. package/app/components/layout/IntegrationsHub.vue +4 -3
  99. package/app/components/layout/LanguageSwitcher.vue +1 -1
  100. package/app/components/layout/ModelProvidersHub.vue +6 -4
  101. package/app/components/layout/NotificationsInbox.vue +8 -7
  102. package/app/components/layout/PersonalSetupModal.vue +5 -3
  103. package/app/components/layout/RolePrompt.vue +1 -1
  104. package/app/components/layout/SideBar.vue +3 -5
  105. package/app/components/layout/SpendWarningBanner.vue +3 -3
  106. package/app/components/layout/TranslationWarningBanner.vue +1 -1
  107. package/app/components/layout/UiModeSwitcher.vue +7 -6
  108. package/app/components/layout/UiRoleSwitcher.vue +2 -2
  109. package/app/components/media/ArtifactLightbox.vue +6 -6
  110. package/app/components/media/ImageCompare.vue +16 -16
  111. package/app/components/merge/MergeEffortChips.vue +4 -6
  112. package/app/components/notifications/NotificationSettingsPanel.vue +6 -5
  113. package/app/components/observability/OutcomeFilterChips.vue +1 -1
  114. package/app/components/observability/RunFailureSummary.vue +14 -17
  115. package/app/components/observability/StepMetricsBar.vue +9 -8
  116. package/app/components/observability/StepModelActivity.vue +4 -3
  117. package/app/components/observability/ToolCallList.vue +15 -18
  118. package/app/components/outcome/OutcomeSummaryWindow.vue +43 -42
  119. package/app/components/palettes/AgentPalette.vue +7 -5
  120. package/app/components/palettes/AgentTierSelect.vue +1 -1
  121. package/app/components/palettes/PipelinePurposeSelect.vue +1 -1
  122. package/app/components/panels/AgentStepDetail.vue +27 -30
  123. package/app/components/panels/AttemptEntryHeader.vue +2 -2
  124. package/app/components/panels/DecisionModal.vue +1 -1
  125. package/app/components/panels/GenericStructuredResultView.vue +6 -5
  126. package/app/components/panels/InspectorPanel.vue +15 -13
  127. package/app/components/panels/MergerResultView.vue +10 -9
  128. package/app/components/panels/ObservabilityPanel.vue +66 -76
  129. package/app/components/panels/OperatorDashboardPanel.vue +27 -26
  130. package/app/components/panels/ReportsPanel.vue +26 -25
  131. package/app/components/panels/ReportsSpendBreakdown.vue +2 -2
  132. package/app/components/panels/ResultWindowShell.vue +19 -18
  133. package/app/components/panels/RunDetailLoadState.vue +1 -1
  134. package/app/components/panels/StepContainerStatus.vue +8 -7
  135. package/app/components/panels/StepDelegatedStatus.vue +13 -12
  136. package/app/components/panels/StepEffortReport.vue +12 -17
  137. package/app/components/panels/StepFragmentAdherence.vue +9 -10
  138. package/app/components/panels/StepMetadataCard.vue +41 -43
  139. package/app/components/panels/StepReproductionReport.vue +18 -20
  140. package/app/components/panels/StepRunMeta.vue +27 -26
  141. package/app/components/panels/StepTestReport.vue +16 -15
  142. package/app/components/panels/StepToolServers.vue +7 -8
  143. package/app/components/panels/StepValidationReport.vue +5 -5
  144. package/app/components/panels/inspector/ContainerSummary.vue +4 -4
  145. package/app/components/panels/inspector/DocReferenceRepos.vue +5 -4
  146. package/app/components/panels/inspector/EnvProbeReport.vue +16 -13
  147. package/app/components/panels/inspector/EpicChildren.vue +8 -7
  148. package/app/components/panels/inspector/FrontendBindingsResolved.vue +5 -4
  149. package/app/components/panels/inspector/FrontendConfig.vue +26 -34
  150. package/app/components/panels/inspector/InitiativeInspector.vue +3 -3
  151. package/app/components/panels/inspector/InspectorSection.vue +7 -4
  152. package/app/components/panels/inspector/RecurringScheduleSettings.vue +9 -8
  153. package/app/components/panels/inspector/ServiceConnections.vue +2 -2
  154. package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +2 -2
  155. package/app/components/panels/inspector/ServiceSelfTests.vue +9 -13
  156. package/app/components/panels/inspector/ServiceTestConfig.vue +41 -45
  157. package/app/components/panels/inspector/ServiceTestSecrets.vue +3 -3
  158. package/app/components/panels/inspector/ServiceTestingContext.vue +2 -2
  159. package/app/components/panels/inspector/ServiceValidationConfig.vue +2 -2
  160. package/app/components/panels/inspector/TaskAgentConfig.vue +2 -2
  161. package/app/components/panels/inspector/TaskAprioriBranches.vue +6 -5
  162. package/app/components/panels/inspector/TaskDependencies.vue +1 -1
  163. package/app/components/panels/inspector/TaskEstimateBadge.vue +3 -7
  164. package/app/components/panels/inspector/TaskExecution.vue +13 -12
  165. package/app/components/panels/inspector/TaskRunSettings.vue +35 -38
  166. package/app/components/panels/inspector/TaskStructure.vue +5 -4
  167. package/app/components/pipeline/AgentPromptEditor.vue +15 -14
  168. package/app/components/pipeline/BinaryOutputStepPicker.vue +42 -52
  169. package/app/components/pipeline/EstimateThresholdFields.vue +2 -2
  170. package/app/components/pipeline/GateConfigFields.vue +6 -6
  171. package/app/components/pipeline/IterationCapPrompt.vue +1 -1
  172. package/app/components/pipeline/PipelineBuilder.vue +28 -27
  173. package/app/components/pipeline/PipelineHealthModal.vue +7 -7
  174. package/app/components/pipeline/PipelinePicker.vue +3 -3
  175. package/app/components/pipeline/PipelinePreview.vue +6 -7
  176. package/app/components/pipeline/PipelineProgress.vue +23 -24
  177. package/app/components/prReview/PrReviewWindow.vue +42 -41
  178. package/app/components/providers/AiPresetMismatchDialog.vue +4 -3
  179. package/app/components/providers/AiProviderOnboardingModal.vue +2 -2
  180. package/app/components/providers/ApiKeysSection.vue +7 -6
  181. package/app/components/providers/PersonalSubscriptionSection.vue +4 -3
  182. package/app/components/providers/VendorCredentialsModal.vue +5 -4
  183. package/app/components/provisioning/ProvisioningLogsDrawer.vue +10 -9
  184. package/app/components/ralph/RalphLoopResultView.vue +25 -26
  185. package/app/components/requirements/RequirementsReviewWindow.vue +13 -12
  186. package/app/components/riskPolicy/RiskPolicyPicker.vue +5 -5
  187. package/app/components/riskPolicy/RiskPolicyPreview.vue +16 -15
  188. package/app/components/sandbox/SandboxPanel.vue +21 -20
  189. package/app/components/settings/ApiTokensPanel.vue +1 -1
  190. package/app/components/settings/BudgetSettings.vue +18 -17
  191. package/app/components/settings/CapabilityCredentialsPanel.vue +5 -5
  192. package/app/components/settings/CloudflareHandlerSection.vue +16 -16
  193. package/app/components/settings/ComposeEnvironmentSetupSection.vue +14 -12
  194. package/app/components/settings/ConnectionTestVerdict.vue +1 -1
  195. package/app/components/settings/ConsensusGroupsSection.vue +21 -20
  196. package/app/components/settings/CustomManifestTypeEditor.vue +8 -7
  197. package/app/components/settings/DefaultProvisionTypeSection.vue +5 -5
  198. package/app/components/settings/InfraHandlersConfigurator.vue +14 -15
  199. package/app/components/settings/InfrastructureBackendPicker.vue +2 -2
  200. package/app/components/settings/IssueTrackerPanel.vue +9 -15
  201. package/app/components/settings/KubernetesEngineForm.vue +9 -8
  202. package/app/components/settings/KubernetesEnvironmentForm.vue +4 -3
  203. package/app/components/settings/LocalContainerPoolSettings.vue +2 -2
  204. package/app/components/settings/LocalModelEndpointsPanel.vue +10 -9
  205. package/app/components/settings/MergeClassRulesEditor.vue +6 -5
  206. package/app/components/settings/MergeRolePolicyEditor.vue +13 -12
  207. package/app/components/settings/ModelConfigurationPanel.vue +8 -11
  208. package/app/components/settings/ModelPresetHealthModal.vue +3 -3
  209. package/app/components/settings/ObservabilityConnectionPanel.vue +1 -1
  210. package/app/components/settings/OpenRouterCatalogPanel.vue +6 -5
  211. package/app/components/settings/PackageRegistriesPanel.vue +4 -4
  212. package/app/components/settings/ProviderConnectionTab.vue +5 -4
  213. package/app/components/settings/ProviderManifestEditor.vue +9 -8
  214. package/app/components/settings/ProviderPreferenceEditor.vue +8 -7
  215. package/app/components/settings/RiskPolicyCreateForm.vue +40 -26
  216. package/app/components/settings/RiskPolicyEditorRow.vue +18 -17
  217. package/app/components/settings/RiskPolicyHealthModal.vue +3 -3
  218. package/app/components/settings/RiskPolicyPanel.vue +11 -13
  219. package/app/components/settings/ServiceFragmentDefaultsPanel.vue +5 -4
  220. package/app/components/settings/SharedStacksPanel.vue +5 -5
  221. package/app/components/settings/TaskSourceCard.vue +2 -2
  222. package/app/components/settings/TaskTypeSuppressionsPanel.vue +4 -4
  223. package/app/components/settings/ToolServerChecklist.vue +22 -22
  224. package/app/components/settings/UsageSettings.vue +13 -13
  225. package/app/components/settings/UserSecretsSection.vue +4 -3
  226. package/app/components/settings/WorkspaceMetadataSettings.vue +6 -5
  227. package/app/components/settings/WorkspaceSettingsPanel.vue +72 -58
  228. package/app/components/skills/ReviewSkillQueue.vue +8 -7
  229. package/app/components/skills/SkillLibraryManager.vue +2 -2
  230. package/app/components/slack/SlackPanel.vue +8 -7
  231. package/app/components/spec/ServiceSpecWindow.vue +15 -16
  232. package/app/components/tasks/BugHuntModal.vue +1 -1
  233. package/app/components/tasks/ContextIssuePicker.vue +4 -6
  234. package/app/components/tasks/TaskContextIssues.vue +1 -1
  235. package/app/components/tasks/TaskImportModal.vue +3 -2
  236. package/app/components/tasks/TaskSourceConnectModal.vue +5 -5
  237. package/app/components/testing/TestReportWindow.vue +54 -53
  238. package/app/components/tutorial/TutorialNudge.vue +3 -2
  239. package/app/components/tutorial/TutorialOverlay.vue +3 -2
  240. package/app/components/vcs/GitLabConnect.vue +1 -1
  241. package/app/components/visualConfirm/VisualConfirmationWindow.vue +23 -25
  242. package/app/utils/theme/builtins.ts +7 -1
  243. package/package.json +1 -1
@@ -22,6 +22,7 @@ import MergeEffortChips from '~/components/merge/MergeEffortChips.vue'
22
22
  import InputGateNotice from '~/components/inputGate/InputGateNotice.vue'
23
23
  import { inputGateNoticeFor } from '~/utils/inputGate'
24
24
  import { composeRunOutcome, hasOutcomeToShow } from '~/utils/runOutcome'
25
+ import SectionLabel from '~/components/common/SectionLabel.vue'
25
26
 
26
27
  const props = defineProps<{ block: Block }>()
27
28
 
@@ -306,9 +307,9 @@ async function mergePr() {
306
307
  <div v-if="instance">
307
308
  <div class="mb-1 flex items-center justify-between">
308
309
  <span class="flex min-w-0 items-center gap-1.5">
309
- <span class="truncate text-[11px] font-semibold uppercase tracking-wide text-muted">
310
+ <SectionLabel as="span" class="truncate">
310
311
  {{ instance.pipelineName }}
311
- </span>
312
+ </SectionLabel>
312
313
  <!-- A sandboxed run looks exactly like one that simply has not reached the merge yet,
313
314
  right up until it stops there, so it says what it is from the start. -->
314
315
  <UBadge
@@ -406,7 +407,7 @@ async function mergePr() {
406
407
  </span>
407
408
  <span
408
409
  v-if="isCompanionKind(s.agentKind)"
409
- class="shrink-0 rounded bg-accented/60 px-1 text-[9px] font-medium uppercase tracking-wide text-toned"
410
+ class="shrink-0 rounded-sm bg-accented/60 px-1 text-3xs font-medium uppercase tracking-wide text-toned"
410
411
  :title="t('inspector.execution.companionTooltip')"
411
412
  >
412
413
  {{ t('inspector.execution.companion') }}
@@ -418,7 +419,7 @@ async function mergePr() {
418
419
  </button>
419
420
  <span
420
421
  v-if="s.subtasks && s.subtasks.total > 0"
421
- class="ms-auto font-mono text-[10px] tabular-nums text-toned"
422
+ class="ms-auto font-mono text-3xs tabular-nums text-toned"
422
423
  data-testid="run-subtasks"
423
424
  :title="
424
425
  s.subtasks.inProgress > 0
@@ -436,7 +437,7 @@ async function mergePr() {
436
437
  {{ s.subtasks.completed }}/{{ s.subtasks.total }}
437
438
  </span>
438
439
  <span
439
- class="inline-flex items-center gap-1 text-[10px]"
440
+ class="inline-flex items-center gap-1 text-3xs"
440
441
  :class="[
441
442
  stepFailed(s) ? 'text-app-error-400' : 'text-muted',
442
443
  { 'ms-auto': !s.subtasks },
@@ -467,7 +468,7 @@ async function mergePr() {
467
468
  indicator, NOT a "Review" gate (the human is summoned only if needed) -->
468
469
  <span
469
470
  v-else-if="reviews.isBackground(s.agentKind, block.id) && reviewStage"
470
- class="inline-flex shrink-0 items-center gap-1 text-[10px] text-primary"
471
+ class="inline-flex shrink-0 items-center gap-1 text-3xs text-primary"
471
472
  >
472
473
  <UIcon name="i-lucide-loader-circle" class="h-3 w-3 animate-spin" />
473
474
  {{ reviewStageLabel }}
@@ -560,7 +561,7 @@ async function mergePr() {
560
561
  </div>
561
562
  <div
562
563
  v-if="s.model"
563
- class="mt-0.5 flex items-center gap-1 ps-6 text-[10px] text-dimmed"
564
+ class="mt-0.5 flex items-center gap-1 ps-6 text-3xs text-dimmed"
564
565
  :title="s.model"
565
566
  >
566
567
  <UIcon name="i-lucide-cpu" class="h-3 w-3" />
@@ -569,7 +570,7 @@ async function mergePr() {
569
570
  <!-- Prompt-fragment standards the library selected for this step. -->
570
571
  <div
571
572
  v-if="s.selectedFragmentIds && s.selectedFragmentIds.length"
572
- class="mt-0.5 flex flex-wrap items-center gap-1 ps-6 text-[10px] text-dimmed"
573
+ class="mt-0.5 flex flex-wrap items-center gap-1 ps-6 text-3xs text-dimmed"
573
574
  :title="
574
575
  t('inspector.execution.fragmentsTooltip', {
575
576
  fragments: s.selectedFragmentIds.join(', '),
@@ -589,7 +590,7 @@ async function mergePr() {
589
590
  completed/skipped, so it's clear whether a fix pass ran. -->
590
591
  <div
591
592
  v-if="gateCompanionFor(s, runFailed)"
592
- class="mt-0.5 flex items-center gap-1.5 ps-6 text-[10px]"
593
+ class="mt-0.5 flex items-center gap-1.5 ps-6 text-3xs"
593
594
  >
594
595
  <UIcon
595
596
  :name="agentKindMeta(gateCompanionFor(s, runFailed)!.kind).icon"
@@ -641,9 +642,9 @@ async function mergePr() {
641
642
 
642
643
  <!-- Open PR: link straight to it on GitHub -->
643
644
  <div v-if="pr" class="space-y-2">
644
- <span class="text-[11px] font-semibold uppercase tracking-wide text-muted">
645
+ <SectionLabel as="span">
645
646
  {{ t('inspector.execution.pullRequest') }}
646
- </span>
647
+ </SectionLabel>
647
648
  <UButton
648
649
  :to="pr.url"
649
650
  target="_blank"
@@ -663,7 +664,7 @@ async function mergePr() {
663
664
  </UBadge>
664
665
  </span>
665
666
  </UButton>
666
- <p v-if="pr.branch" class="flex items-center gap-1 truncate text-[10px] text-dimmed">
667
+ <p v-if="pr.branch" class="flex items-center gap-1 truncate text-3xs text-dimmed">
667
668
  <UIcon name="i-lucide-git-branch" class="h-3 w-3 shrink-0" />
668
669
  <span class="truncate" :title="pr.branch">{{ pr.branch }}</span>
669
670
  </p>
@@ -9,6 +9,7 @@ import InspectorSection from '~/components/panels/inspector/InspectorSection.vue
9
9
  import RiskPolicyPicker from '~/components/riskPolicy/RiskPolicyPicker.vue'
10
10
  import TaskAprioriBranches from '~/components/panels/inspector/TaskAprioriBranches.vue'
11
11
  import DocReferenceRepos from '~/components/panels/inspector/DocReferenceRepos.vue'
12
+ import SectionLabel from '~/components/common/SectionLabel.vue'
12
13
 
13
14
  const props = defineProps<{ block: Block }>()
14
15
 
@@ -283,9 +284,9 @@ const technicalLabel = computed(() => {
283
284
  <!-- pipeline -->
284
285
  <div>
285
286
  <div class="mb-1 flex items-center justify-between">
286
- <span class="text-[11px] font-semibold uppercase tracking-wide text-muted">
287
+ <SectionLabel as="span">
287
288
  {{ t('inspector.runSettings.pipeline') }}
288
- </span>
289
+ </SectionLabel>
289
290
  <PipelinePicker
290
291
  :model-value="block.pipelineId ?? ''"
291
292
  :options="selectablePipelines"
@@ -314,10 +315,10 @@ const technicalLabel = computed(() => {
314
315
  {{ selectedPipeline.name }}<UIcon name="i-lucide-x" class="ms-0.5 h-3 w-3" />
315
316
  </UBadge>
316
317
  </div>
317
- <div v-else class="text-[11px] text-dimmed">
318
+ <div v-else class="text-2xs text-dimmed">
318
319
  {{ t('inspector.runSettings.pipelineEmpty') }}
319
320
  </div>
320
- <p class="mt-1 text-[11px] leading-snug text-dimmed">
321
+ <p class="mt-1 text-2xs leading-snug text-dimmed">
321
322
  {{ t('inspector.runSettings.pipelineHint') }}
322
323
  </p>
323
324
  </div>
@@ -325,9 +326,9 @@ const technicalLabel = computed(() => {
325
326
  <!-- merge policy preset (advanced, or basic with an override already set) -->
326
327
  <div v-if="showOverrideField(uiMode.isAdvanced, block.riskPolicyId)">
327
328
  <div class="mb-1 flex items-center justify-between">
328
- <span class="text-[11px] font-semibold uppercase tracking-wide text-muted">
329
+ <SectionLabel as="span">
329
330
  {{ t('inspector.runSettings.mergePolicy') }}
330
- </span>
331
+ </SectionLabel>
331
332
  <RiskPolicyPicker
332
333
  :model-value="block.riskPolicyId ?? ''"
333
334
  :options="riskPolicies.presets"
@@ -347,7 +348,7 @@ const technicalLabel = computed(() => {
347
348
  </template>
348
349
  </RiskPolicyPicker>
349
350
  </div>
350
- <div v-if="selectedPreset" class="text-[11px] text-muted">
351
+ <div v-if="selectedPreset" class="text-2xs text-muted">
351
352
  <i18n-t
352
353
  v-if="selectedPreset.autoMergeEnabled"
353
354
  keypath="inspector.runSettings.riskPolicyDetail"
@@ -373,10 +374,10 @@ const technicalLabel = computed(() => {
373
374
  t('inspector.runSettings.workspaceDefaultParen')
374
375
  }}</span>
375
376
  </div>
376
- <div v-else class="text-[11px] text-dimmed">
377
+ <div v-else class="text-2xs text-dimmed">
377
378
  {{ t('inspector.runSettings.riskPolicyEmpty') }}
378
379
  </div>
379
- <p class="mt-1 text-[11px] leading-snug text-dimmed">
380
+ <p class="mt-1 text-2xs leading-snug text-dimmed">
380
381
  {{ t('inspector.runSettings.mergePolicyHint') }}
381
382
  </p>
382
383
  </div>
@@ -384,9 +385,9 @@ const technicalLabel = computed(() => {
384
385
  <!-- model preset (advanced, or basic with an override already set) -->
385
386
  <div v-if="showOverrideField(uiMode.isAdvanced, block.modelPresetId)">
386
387
  <div class="mb-1 flex items-center justify-between">
387
- <span class="text-[11px] font-semibold uppercase tracking-wide text-muted">
388
+ <SectionLabel as="span">
388
389
  {{ t('inspector.runSettings.modelPreset') }}
389
- </span>
390
+ </SectionLabel>
390
391
  <UDropdownMenu :items="modelPresetMenu">
391
392
  <UButton
392
393
  size="xs"
@@ -397,7 +398,7 @@ const technicalLabel = computed(() => {
397
398
  />
398
399
  </UDropdownMenu>
399
400
  </div>
400
- <div v-if="selectedModelPreset" class="text-[11px] text-muted">
401
+ <div v-if="selectedModelPreset" class="text-2xs text-muted">
401
402
  <span class="text-toned">{{ selectedModelPreset.name }}</span>
402
403
  {{ t('inspector.runSettings.modelPresetBase', { model: selectedModelPreset.baseModelId })
403
404
  }}<span v-if="Object.keys(selectedModelPreset.overrides).length">{{
@@ -412,12 +413,12 @@ const technicalLabel = computed(() => {
412
413
  t('inspector.runSettings.workspaceDefaultParen')
413
414
  }}</span>
414
415
  </div>
415
- <div v-else class="text-[11px] text-dimmed">
416
+ <div v-else class="text-2xs text-dimmed">
416
417
  {{ t('inspector.runSettings.modelPresetEmpty') }}
417
418
  </div>
418
419
  <div
419
420
  v-if="unavailablePresetModels.length"
420
- class="mt-2 rounded-md border border-app-warning-500/40 bg-app-warning-950/40 p-2 text-[11px] text-app-warning-200/90"
421
+ class="mt-2 rounded-md border border-app-warning-500/40 bg-app-warning-950/40 p-2 text-2xs text-app-warning-200/90"
421
422
  >
422
423
  <div class="flex items-start gap-1.5">
423
424
  <UIcon
@@ -449,7 +450,7 @@ const technicalLabel = computed(() => {
449
450
  </div>
450
451
  </div>
451
452
  </div>
452
- <p class="mt-1 text-[11px] text-dimmed">
453
+ <p class="mt-1 text-2xs text-dimmed">
453
454
  {{ t('inspector.runSettings.modelPresetHint') }}
454
455
  {{ t('inspector.runSettings.modelPresetChangeHint') }}
455
456
  </p>
@@ -458,9 +459,9 @@ const technicalLabel = computed(() => {
458
459
  <!-- technical label (tri-state) — unset lets the engine infer it -->
459
460
  <div v-if="showOverrideField(uiMode.isAdvanced, block.technical)">
460
461
  <div class="mb-1 flex items-center justify-between">
461
- <span class="text-[11px] font-semibold uppercase tracking-wide text-muted">
462
+ <SectionLabel as="span">
462
463
  {{ t('inspector.runSettings.taskKind') }}
463
- </span>
464
+ </SectionLabel>
464
465
  <UDropdownMenu :items="technicalMenu">
465
466
  <UButton
466
467
  size="xs"
@@ -473,7 +474,7 @@ const technicalLabel = computed(() => {
473
474
  </UButton>
474
475
  </UDropdownMenu>
475
476
  </div>
476
- <div class="text-[11px] text-dimmed">
477
+ <div class="text-2xs text-dimmed">
477
478
  <template v-if="block.technical === true">
478
479
  {{ t('inspector.runSettings.technicalHint.technical') }}
479
480
  </template>
@@ -489,9 +490,9 @@ const technicalLabel = computed(() => {
489
490
  <!-- involved services: connected services this task spans (envs + possible code changes) -->
490
491
  <div data-testid="involved-services">
491
492
  <div class="mb-1 flex items-center justify-between">
492
- <span class="text-[11px] font-semibold uppercase tracking-wide text-muted">
493
+ <SectionLabel as="span">
493
494
  {{ t('inspector.runSettings.involvedServices') }}
494
- </span>
495
+ </SectionLabel>
495
496
  </div>
496
497
  <div v-if="connectedServices.length" class="space-y-1">
497
498
  <UCheckbox
@@ -504,7 +505,7 @@ const technicalLabel = computed(() => {
504
505
  @update:model-value="(v: boolean | 'indeterminate') => toggleInvolved(s.id, v === true)"
505
506
  />
506
507
  </div>
507
- <div v-else class="text-[11px] text-dimmed">
508
+ <div v-else class="text-2xs text-dimmed">
508
509
  {{ t('inspector.runSettings.involvedServicesEmpty') }}
509
510
  </div>
510
511
  <div v-if="staleInvolvedServices.length" class="mt-1 flex flex-wrap gap-1">
@@ -519,7 +520,7 @@ const technicalLabel = computed(() => {
519
520
  {{ board.getBlock(id)?.title ?? id }}
520
521
  </UBadge>
521
522
  </div>
522
- <div class="mt-1 text-[11px] text-dimmed">
523
+ <div class="mt-1 text-2xs text-dimmed">
523
524
  {{ t('inspector.runSettings.involvedServicesHint') }}
524
525
  </div>
525
526
  </div>
@@ -543,15 +544,13 @@ const technicalLabel = computed(() => {
543
544
  "
544
545
  >
545
546
  <div class="mb-1 flex items-center justify-between">
546
- <span class="text-[11px] font-semibold uppercase tracking-wide text-muted">
547
+ <SectionLabel as="span">
547
548
  {{ t('inspector.runSettings.issueWriteback') }}
548
- </span>
549
+ </SectionLabel>
549
550
  </div>
550
551
  <div class="space-y-1.5">
551
552
  <div class="flex items-center justify-between">
552
- <span class="text-[11px] text-muted">{{
553
- t('inspector.runSettings.commentOnPrOpen')
554
- }}</span>
553
+ <span class="text-2xs text-muted">{{ t('inspector.runSettings.commentOnPrOpen') }}</span>
555
554
  <UDropdownMenu :items="writebackMenu(setCommentOnPrOpen)">
556
555
  <UButton
557
556
  size="xs"
@@ -564,7 +563,7 @@ const technicalLabel = computed(() => {
564
563
  </UDropdownMenu>
565
564
  </div>
566
565
  <div class="flex items-center justify-between">
567
- <span class="text-[11px] text-muted">{{ t('inspector.runSettings.closeOnMerge') }}</span>
566
+ <span class="text-2xs text-muted">{{ t('inspector.runSettings.closeOnMerge') }}</span>
568
567
  <UDropdownMenu :items="writebackMenu(setResolveOnMerge)">
569
568
  <UButton
570
569
  size="xs"
@@ -577,9 +576,7 @@ const technicalLabel = computed(() => {
577
576
  </UDropdownMenu>
578
577
  </div>
579
578
  <div class="flex items-center justify-between">
580
- <span class="text-[11px] text-muted">{{
581
- t('inspector.runSettings.questionsOnPark')
582
- }}</span>
579
+ <span class="text-2xs text-muted">{{ t('inspector.runSettings.questionsOnPark') }}</span>
583
580
  <UDropdownMenu :items="writebackMenu(setQuestionsOnPark)">
584
581
  <UButton
585
582
  size="xs"
@@ -592,7 +589,7 @@ const technicalLabel = computed(() => {
592
589
  </UDropdownMenu>
593
590
  </div>
594
591
  </div>
595
- <div class="mt-1 text-[11px] text-dimmed">
592
+ <div class="mt-1 text-2xs text-dimmed">
596
593
  {{ t('inspector.runSettings.writebackHint') }}
597
594
  </div>
598
595
  </div>
@@ -600,9 +597,9 @@ const technicalLabel = computed(() => {
600
597
  <!-- responsible product person -->
601
598
  <div>
602
599
  <div class="mb-1 flex items-center justify-between">
603
- <span class="text-[11px] font-semibold uppercase tracking-wide text-muted">
600
+ <SectionLabel as="span">
604
601
  {{ t('inspector.runSettings.responsibleProduct') }}
605
- </span>
602
+ </SectionLabel>
606
603
  <UDropdownMenu :items="responsibleMenu">
607
604
  <UButton
608
605
  size="xs"
@@ -624,7 +621,7 @@ const technicalLabel = computed(() => {
624
621
  {{ responsibleLabel }}<UIcon name="i-lucide-x" class="ms-0.5 h-3 w-3" />
625
622
  </UBadge>
626
623
  </div>
627
- <div v-else class="text-[11px] text-dimmed">
624
+ <div v-else class="text-2xs text-dimmed">
628
625
  {{ t('inspector.runSettings.responsibleEmpty') }}
629
626
  </div>
630
627
  </div>
@@ -632,16 +629,16 @@ const technicalLabel = computed(() => {
632
629
  <!-- auto-start dependents: when this task merges, start the tasks that depend on it -->
633
630
  <div>
634
631
  <div class="flex items-center justify-between gap-2">
635
- <span class="text-[11px] font-semibold uppercase tracking-wide text-muted">
632
+ <SectionLabel as="span">
636
633
  {{ t('inspector.runSettings.autoStartDependents') }}
637
- </span>
634
+ </SectionLabel>
638
635
  <USwitch
639
636
  size="sm"
640
637
  :model-value="block.autoStartDependents ?? false"
641
638
  @update:model-value="setAutoStartDependents"
642
639
  />
643
640
  </div>
644
- <div class="mt-1 text-[11px] text-dimmed">
641
+ <div class="mt-1 text-2xs text-dimmed">
645
642
  {{ t('inspector.runSettings.autoStartHint') }}
646
643
  </div>
647
644
  </div>
@@ -2,6 +2,7 @@
2
2
  import type { Block } from '~/types/domain'
3
3
  import InspectorSection from '~/components/panels/inspector/InspectorSection.vue'
4
4
  import FragmentSelector from '~/components/fragments/FragmentSelector.vue'
5
+ import SectionLabel from '~/components/common/SectionLabel.vue'
5
6
 
6
7
  const props = defineProps<{ block: Block }>()
7
8
 
@@ -83,9 +84,9 @@ function setFragments(ids: string[]) {
83
84
  <InspectorSection :title="t('inspector.structure.title')" :hint="t('inspector.structure.hint')">
84
85
  <!-- module assignment -->
85
86
  <div>
86
- <div class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-muted">
87
+ <SectionLabel class="mb-1">
87
88
  {{ t('inspector.structure.module') }}
88
- </div>
89
+ </SectionLabel>
89
90
  <USelectMenu
90
91
  :model-value="selectedModule"
91
92
  :items="moduleOptions"
@@ -99,7 +100,7 @@ function setFragments(ids: string[]) {
99
100
  @update:model-value="setModule"
100
101
  @create="setModule"
101
102
  />
102
- <p class="mt-1 text-[11px] leading-snug text-dimmed">
103
+ <p class="mt-1 text-2xs leading-snug text-dimmed">
103
104
  {{ t('inspector.structure.moduleHint') }}
104
105
  </p>
105
106
  </div>
@@ -113,7 +114,7 @@ function setFragments(ids: string[]) {
113
114
  :empty-text="t('inspector.structure.bestPracticesEmpty')"
114
115
  @update:model-value="setFragments"
115
116
  />
116
- <p class="mt-1 text-[11px] leading-snug text-dimmed">
117
+ <p class="mt-1 text-2xs leading-snug text-dimmed">
117
118
  {{ t('inspector.structure.bestPracticesHint') }}
118
119
  </p>
119
120
  </div>
@@ -10,6 +10,7 @@ import {
10
10
  isRevisionConflict,
11
11
  saveIntent,
12
12
  } from '~/components/pipeline/AgentPromptEditor.logic'
13
+ import SectionLabel from '~/components/common/SectionLabel.vue'
13
14
 
14
15
  // The per-workspace system-prompt editor for ONE agent kind, opened from the pipeline builder
15
16
  // (where the kinds are actually chosen). It edits the SHIPPED track prompt only: the platform
@@ -192,14 +193,14 @@ function revisionLabel(revision: AgentPromptRevision): string {
192
193
  <!-- The workspace-wide output ceiling for this kind. Same per-agent-kind scope as the
193
194
  prompt below it; saves on change, since there is no revision log to commit to. -->
194
195
  <div class="flex flex-wrap items-center gap-2">
195
- <span class="text-[11px] text-muted">{{ t('pipeline.outputBudget.kindLabel') }}</span>
196
+ <span class="text-2xs text-muted">{{ t('pipeline.outputBudget.kindLabel') }}</span>
196
197
  <OutputBudgetInput
197
198
  class="w-32"
198
199
  :model-value="budget"
199
200
  :disabled="agentSettings.saving"
200
201
  @update:model-value="saveBudget"
201
202
  />
202
- <span class="text-[10px] text-dimmed">
203
+ <span class="text-3xs text-dimmed">
203
204
  {{ t('pipeline.outputBudget.kindHint') }}
204
205
  </span>
205
206
  </div>
@@ -207,7 +208,7 @@ function revisionLabel(revision: AgentPromptRevision): string {
207
208
  <!-- What the platform appends is SHOWN, not described. A prose summary of it is copy
208
209
  that silently goes stale the moment a directive is added, and a user who does not
209
210
  know what is already there writes a prompt that fights it. -->
210
- <p v-if="directives" class="text-[11px] leading-relaxed text-dimmed">
211
+ <p v-if="directives" class="text-2xs leading-relaxed text-dimmed">
211
212
  {{ t('agentPrompt.managedNotice') }}
212
213
  <UButton
213
214
  variant="link"
@@ -222,11 +223,11 @@ function revisionLabel(revision: AgentPromptRevision): string {
222
223
  v-if="directives && showDirectives"
223
224
  class="rounded-md border border-default bg-app-950/60 p-2"
224
225
  >
225
- <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-muted">
226
+ <SectionLabel as="h4" class="mb-1">
226
227
  {{ t('agentPrompt.appendedHeading') }}
227
- </h4>
228
+ </SectionLabel>
228
229
  <pre
229
- class="max-h-64 overflow-auto whitespace-pre-wrap break-words font-mono text-[11px] text-toned"
230
+ class="max-h-64 overflow-auto whitespace-pre-wrap break-words font-mono text-2xs text-toned"
230
231
  >{{ directives.trim() }}</pre>
231
232
  </div>
232
233
 
@@ -278,25 +279,25 @@ function revisionLabel(revision: AgentPromptRevision): string {
278
279
  >
279
280
  {{ showBuiltin ? t('agentPrompt.hideBuiltin') : t('agentPrompt.showBuiltin') }}
280
281
  </UButton>
281
- <span v-if="restoredFrom !== undefined" class="text-[11px] text-muted">
282
+ <span v-if="restoredFrom !== undefined" class="text-2xs text-muted">
282
283
  {{ t('agentPrompt.restoringFrom', { n: restoredFrom }) }}
283
284
  </span>
284
285
  </div>
285
286
 
286
287
  <div v-if="showBuiltin" class="rounded-md border border-default bg-app-950/60 p-2">
287
- <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-muted">
288
+ <SectionLabel as="h4" class="mb-1">
288
289
  {{ t('agentPrompt.builtinHeading') }}
289
- </h4>
290
+ </SectionLabel>
290
291
  <pre
291
- class="max-h-64 overflow-auto whitespace-pre-wrap break-words font-mono text-[11px] text-toned"
292
+ class="max-h-64 overflow-auto whitespace-pre-wrap break-words font-mono text-2xs text-toned"
292
293
  >{{ detail.builtinText }}</pre>
293
294
  </div>
294
295
 
295
296
  <div>
296
- <h4 class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-muted">
297
+ <SectionLabel as="h4" class="mb-1">
297
298
  {{ t('agentPrompt.historyHeading') }}
298
- </h4>
299
- <p v-if="!detail.revisions.length" class="text-[11px] text-dimmed">
299
+ </SectionLabel>
300
+ <p v-if="!detail.revisions.length" class="text-2xs text-dimmed">
300
301
  {{ t('agentPrompt.historyEmpty') }}
301
302
  </p>
302
303
  <ul v-else class="max-h-52 divide-y divide-default overflow-y-auto text-xs">
@@ -316,7 +317,7 @@ function revisionLabel(revision: AgentPromptRevision): string {
316
317
  <span class="min-w-0 flex-1 truncate text-toned">
317
318
  {{ revisionLabel(revision) }}
318
319
  </span>
319
- <span class="shrink-0 text-[11px] text-dimmed">
320
+ <span class="shrink-0 text-2xs text-dimmed">
320
321
  {{ d(new Date(revision.createdAt), 'short') }}
321
322
  </span>
322
323
  <UButton