@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
@@ -137,7 +137,7 @@ const reseedableCount = computed(
137
137
  {{ t('pipeline.health.newHeading') }}
138
138
  </h3>
139
139
  </div>
140
- <p class="text-[11px] text-dimmed">{{ t('pipeline.health.newDescription') }}</p>
140
+ <p class="text-2xs text-dimmed">{{ t('pipeline.health.newDescription') }}</p>
141
141
  <ul class="space-y-2">
142
142
  <li
143
143
  v-for="p in newPipelines"
@@ -172,7 +172,7 @@ const reseedableCount = computed(
172
172
  {{ t('pipeline.health.invalidHeading') }}
173
173
  </h3>
174
174
  </div>
175
- <p class="text-[11px] text-dimmed">
175
+ <p class="text-2xs text-dimmed">
176
176
  {{ t('pipeline.health.invalidDescription') }}
177
177
  </p>
178
178
  <ul class="space-y-2">
@@ -195,7 +195,7 @@ const reseedableCount = computed(
195
195
  <li
196
196
  v-for="(p, i) in h.problems"
197
197
  :key="i"
198
- class="text-[11px]"
198
+ class="text-2xs"
199
199
  :class="
200
200
  p.type === 'outdated' ? 'text-app-warning-400/80' : 'text-app-error-400/90'
201
201
  "
@@ -241,7 +241,7 @@ const reseedableCount = computed(
241
241
  {{ t('pipeline.health.retiredHeading') }}
242
242
  </h3>
243
243
  </div>
244
- <p class="text-[11px] text-dimmed">{{ t('pipeline.health.retiredDescription') }}</p>
244
+ <p class="text-2xs text-dimmed">{{ t('pipeline.health.retiredDescription') }}</p>
245
245
  <ul class="space-y-2">
246
246
  <li
247
247
  v-for="r in retired"
@@ -250,7 +250,7 @@ const reseedableCount = computed(
250
250
  >
251
251
  <div class="min-w-0">
252
252
  <span class="truncate text-sm font-medium text-app-100">{{ r.pipeline.name }}</span>
253
- <p class="text-[11px] text-muted/80">
253
+ <p class="text-2xs text-muted/80">
254
254
  {{
255
255
  r.replacement
256
256
  ? t('pipeline.health.retiredReplacedBy', { name: r.replacement.name })
@@ -281,7 +281,7 @@ const reseedableCount = computed(
281
281
  {{ t('pipeline.health.updatesHeading') }}
282
282
  </h3>
283
283
  </div>
284
- <p class="text-[11px] text-dimmed">
284
+ <p class="text-2xs text-dimmed">
285
285
  {{ t('pipeline.health.updatesDescription') }}
286
286
  </p>
287
287
  <ul class="space-y-2">
@@ -292,7 +292,7 @@ const reseedableCount = computed(
292
292
  >
293
293
  <div class="min-w-0">
294
294
  <span class="truncate text-sm font-medium text-app-100">{{ h.pipeline.name }}</span>
295
- <p class="text-[11px] text-app-warning-400/80">{{ h.problems[0]?.message }}</p>
295
+ <p class="text-2xs text-app-warning-400/80">{{ h.problems[0]?.message }}</p>
296
296
  </div>
297
297
  <UButton
298
298
  size="xs"
@@ -96,7 +96,7 @@ function choose(id: string) {
96
96
  <li v-if="noneLabel !== undefined">
97
97
  <button
98
98
  type="button"
99
- class="flex w-full items-center gap-2 rounded px-2 py-1.5 text-start text-sm hover:bg-elevated/60"
99
+ class="flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-start text-sm hover:bg-elevated/60"
100
100
  :class="modelValue ? 'text-toned' : 'text-app-100'"
101
101
  data-testid="pipeline-option-none"
102
102
  @mouseenter="hoverId = ''"
@@ -114,7 +114,7 @@ function choose(id: string) {
114
114
  <li v-for="p in options" :key="p.id">
115
115
  <button
116
116
  type="button"
117
- class="flex w-full items-center gap-2 rounded px-2 py-1.5 text-start text-sm hover:bg-elevated/60"
117
+ class="flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-start text-sm hover:bg-elevated/60"
118
118
  :class="modelValue === p.id ? 'text-app-100' : 'text-toned'"
119
119
  :data-testid="`pipeline-option-${p.id}`"
120
120
  @mouseenter="hoverId = p.id"
@@ -134,7 +134,7 @@ function choose(id: string) {
134
134
  <!-- right: preview of the hovered (or selected) pipeline -->
135
135
  <div class="w-1/2 overflow-y-auto p-3">
136
136
  <PipelinePreview v-if="previewPipeline" :pipeline="previewPipeline" />
137
- <div v-else class="text-[12px] leading-snug text-dimmed">{{ emptyHint }}</div>
137
+ <div v-else class="text-xs leading-snug text-dimmed">{{ emptyHint }}</div>
138
138
  </div>
139
139
  </div>
140
140
  </template>
@@ -18,6 +18,7 @@ import {
18
18
  pipelineGateCount,
19
19
  } from '~/utils/pipeline'
20
20
  import AgentKindIcon from '~/components/pipeline/AgentKindIcon.vue'
21
+ import SectionLabel from '~/components/common/SectionLabel.vue'
21
22
 
22
23
  const props = defineProps<{ pipeline: Pipeline }>()
23
24
  const { t } = useI18n()
@@ -37,15 +38,13 @@ function stepDescription(kind: string): string {
37
38
  <div class="text-sm font-semibold text-app-100">{{ pipeline.name }}</div>
38
39
  <p
39
40
  v-if="pipeline.description"
40
- class="text-[12px] leading-snug text-muted"
41
+ class="text-xs leading-snug text-muted"
41
42
  data-testid="pipeline-preview-description"
42
43
  >
43
44
  {{ pipeline.description }}
44
45
  </p>
45
46
 
46
- <div
47
- class="flex flex-wrap items-center gap-x-3 gap-y-1 text-[10px] uppercase tracking-wide text-dimmed"
48
- >
47
+ <SectionLabel class="flex flex-wrap items-center gap-x-3 gap-y-1">
49
48
  <span class="inline-flex items-center gap-1">
50
49
  <UIcon name="i-lucide-workflow" class="h-3 w-3" />
51
50
  {{ t('pipeline.preview.stepCount', { count: steps.length }, steps.length) }}
@@ -62,7 +61,7 @@ function stepDescription(kind: string): string {
62
61
  <UIcon name="i-lucide-git-branch" class="h-3 w-3" />
63
62
  {{ t('pipeline.preview.conditionalCount', { count: conditionalCount }, conditionalCount) }}
64
63
  </span>
65
- </div>
64
+ </SectionLabel>
66
65
 
67
66
  <!-- The ordered steps. The number column doubles as the flow connector (a rule drawn between
68
67
  consecutive numbers), so the list reads as a sequence rather than an unordered set. -->
@@ -76,7 +75,7 @@ function stepDescription(kind: string): string {
76
75
  >
77
76
  <div class="flex flex-col items-center">
78
77
  <span
79
- class="flex h-4 w-4 shrink-0 items-center justify-center rounded-full bg-elevated font-mono text-[9px] tabular-nums text-muted"
78
+ class="flex h-4 w-4 shrink-0 items-center justify-center rounded-full bg-elevated font-mono text-3xs tabular-nums text-muted"
80
79
  >
81
80
  {{ i + 1 }}
82
81
  </span>
@@ -101,7 +100,7 @@ function stepDescription(kind: string): string {
101
100
  </div>
102
101
  <!-- Clamped: the catalog prose runs long for some kinds, and <AgentKindIcon> already
103
102
  carries the full text in its hover tooltip. -->
104
- <p class="line-clamp-2 text-[11px] leading-snug text-dimmed">
103
+ <p class="line-clamp-2 text-2xs leading-snug text-dimmed">
105
104
  {{ stepDescription(s.kind) }}
106
105
  </p>
107
106
  </div>
@@ -20,6 +20,7 @@ import StepMetricsBar from '~/components/observability/StepMetricsBar.vue'
20
20
  import PrReviewPhaseBadge from '~/components/prReview/PrReviewPhaseBadge.vue'
21
21
  import { useNowTick, stepDurationLabel } from '~/composables/useStepTimer'
22
22
  import type { BadgeColor } from '~/utils/badge'
23
+ import SectionLabel from '~/components/common/SectionLabel.vue'
23
24
 
24
25
  const props = defineProps<{ instance: ExecutionInstance }>()
25
26
  const emit = defineEmits<{
@@ -292,7 +293,7 @@ const ITEM_ICON: Record<string, string> = {
292
293
  <span
293
294
  v-for="l in legend"
294
295
  :key="l.state"
295
- class="inline-flex items-center gap-1.5 text-[11px] text-muted"
296
+ class="inline-flex items-center gap-1.5 text-2xs text-muted"
296
297
  >
297
298
  <span
298
299
  class="h-2 w-2 rounded-full"
@@ -365,15 +366,13 @@ const ITEM_ICON: Record<string, string> = {
365
366
  </span>
366
367
  <span
367
368
  v-if="isCompanionKind(s.agentKind)"
368
- class="shrink-0 rounded bg-accented/60 px-1 text-[9px] font-medium uppercase tracking-wide text-toned"
369
+ class="shrink-0 rounded-sm bg-accented/60 px-1 text-3xs font-medium uppercase tracking-wide text-toned"
369
370
  :title="t('pipeline.progress.companionTooltip')"
370
371
  >
371
372
  {{ t('pipeline.progress.companion') }}
372
373
  </span>
373
374
  </div>
374
- <div
375
- class="flex items-center gap-1.5 text-[10px] uppercase tracking-wide text-dimmed"
376
- >
375
+ <SectionLabel class="flex items-center gap-1.5">
377
376
  <span>{{ t('pipeline.progress.stepOf', { current: i + 1, total }) }}</span>
378
377
  <!-- live elapsed clock: a running step counts up (so no-subtask steps
379
378
  don't read as hung), a finished step shows its total duration -->
@@ -385,10 +384,10 @@ const ITEM_ICON: Record<string, string> = {
385
384
  <UIcon name="i-lucide-clock" class="h-2.5 w-2.5 shrink-0" />
386
385
  {{ stepElapsed(s) }}
387
386
  </span>
388
- </div>
387
+ </SectionLabel>
389
388
  </div>
390
389
  <span
391
- class="ms-auto shrink-0 text-[11px] font-medium"
390
+ class="ms-auto shrink-0 text-2xs font-medium"
392
391
  :style="{ color: stepVisual(s).color }"
393
392
  >
394
393
  {{ stepVisual(s).label }}
@@ -458,7 +457,7 @@ const ITEM_ICON: Record<string, string> = {
458
457
  <!-- container cold-boot phase: shown while the container is spinning up. -->
459
458
  <div
460
459
  v-if="s.container?.status === 'starting' && !runFailed"
461
- class="mt-2 flex items-center gap-1.5 text-[11px] text-app-info-300"
460
+ class="mt-2 flex items-center gap-1.5 text-2xs text-app-info-300"
462
461
  >
463
462
  <UIcon name="i-lucide-loader-circle" class="h-3.5 w-3.5 shrink-0 animate-spin" />
464
463
  <span>{{ t('pipeline.progress.spinningUpContainer') }}</span>
@@ -468,7 +467,7 @@ const ITEM_ICON: Record<string, string> = {
468
467
  making calls) so the step isn't a blank "working" before subtasks appear. -->
469
468
  <div
470
469
  v-else-if="stepPhaseLabel(s) && !runFailed"
471
- class="mt-2 flex items-center gap-1.5 text-[11px] text-app-success-300"
470
+ class="mt-2 flex items-center gap-1.5 text-2xs text-app-success-300"
472
471
  >
473
472
  <UIcon name="i-lucide-box" class="h-3.5 w-3.5 shrink-0" />
474
473
  <span>{{ stepPhaseLabel(s) }}</span>
@@ -481,14 +480,14 @@ const ITEM_ICON: Record<string, string> = {
481
480
  v-if="prPhaseActive(s)"
482
481
  :step="s"
483
482
  :run-failed="runFailed"
484
- class="mt-2 text-[11px]"
483
+ class="mt-2 text-2xs"
485
484
  />
486
485
 
487
486
  <!-- live subtask counts from the agent's todo list -->
488
487
  <div v-if="s.subtasks && s.subtasks.total > 0" class="mt-2">
489
488
  <div
490
489
  v-if="!prPhaseActive(s)"
491
- class="flex items-center justify-between text-[10px] text-muted"
490
+ class="flex items-center justify-between text-3xs text-muted"
492
491
  >
493
492
  <span>
494
493
  {{
@@ -515,7 +514,7 @@ const ITEM_ICON: Record<string, string> = {
515
514
  <li
516
515
  v-for="(item, i) in s.subtasks.items"
517
516
  :key="i"
518
- class="flex items-start gap-1.5 text-[11px]"
517
+ class="flex items-start gap-1.5 text-2xs"
519
518
  :class="
520
519
  item.status === 'completed'
521
520
  ? 'text-dimmed line-through'
@@ -537,7 +536,7 @@ const ITEM_ICON: Record<string, string> = {
537
536
  <!-- model used for this step -->
538
537
  <p
539
538
  v-if="s.model"
540
- class="mt-2 flex items-center gap-1 truncate text-[10px] text-dimmed"
539
+ class="mt-2 flex items-center gap-1 truncate text-3xs text-dimmed"
541
540
  :title="s.model"
542
541
  >
543
542
  <UIcon name="i-lucide-cpu" class="h-3 w-3 shrink-0" />
@@ -557,7 +556,7 @@ const ITEM_ICON: Record<string, string> = {
557
556
 
558
557
  <!-- A one-line hint that the agent produced prose; the full output (and
559
558
  all step metadata) lives in the step-detail overlay opened by click. -->
560
- <p v-if="stepHasOutput(s)" class="mt-2 flex items-center gap-1 text-[11px] text-dimmed">
559
+ <p v-if="stepHasOutput(s)" class="mt-2 flex items-center gap-1 text-2xs text-dimmed">
561
560
  <UIcon name="i-lucide-book-open-text" class="h-3 w-3 shrink-0" />
562
561
  {{ t('pipeline.progress.clickToRead') }}
563
562
  </p>
@@ -567,7 +566,7 @@ const ITEM_ICON: Record<string, string> = {
567
566
  which reads as a tester that silently did its job. -->
568
567
  <p
569
568
  v-if="stepSkipReasonKey(s)"
570
- class="mt-2 flex items-center gap-1 text-[11px] text-dimmed"
569
+ class="mt-2 flex items-center gap-1 text-2xs text-dimmed"
571
570
  data-testid="step-skip-reason"
572
571
  >
573
572
  <UIcon name="i-lucide-skip-forward" class="h-3 w-3 shrink-0" />
@@ -593,12 +592,12 @@ const ITEM_ICON: Record<string, string> = {
593
592
  ]"
594
593
  />
595
594
  </span>
596
- <span class="min-w-0 flex-1 truncate text-[12px] text-toned">
595
+ <span class="min-w-0 flex-1 truncate text-xs text-toned">
597
596
  {{ agentKindMeta(companionByStep[i]!.kind).label }}
598
597
  <span class="text-dimmed">{{ t('pipeline.progress.companionSuffix') }}</span>
599
598
  </span>
600
599
  <span
601
- class="shrink-0 text-[11px] font-medium"
600
+ class="shrink-0 text-2xs font-medium"
602
601
  :class="COMPANION_STATE_META[companionByStep[i]!.state].text"
603
602
  >
604
603
  {{ COMPANION_STATE_META[companionByStep[i]!.state].label }}
@@ -624,12 +623,12 @@ const ITEM_ICON: Record<string, string> = {
624
623
  >
625
624
  <UIcon :name="FOLLOW_UP_COMPANION_META.icon" class="h-3 w-3 text-app-hue-pink" />
626
625
  </span>
627
- <span class="min-w-0 flex-1 truncate text-[12px] text-toned">
626
+ <span class="min-w-0 flex-1 truncate text-xs text-toned">
628
627
  {{ FOLLOW_UP_COMPANION_META.label }}
629
628
  <span class="text-dimmed">{{ t('pipeline.progress.companionSuffix') }}</span>
630
629
  </span>
631
630
  <span
632
- class="shrink-0 text-[11px] font-medium"
631
+ class="shrink-0 text-2xs font-medium"
633
632
  :class="followUpPending(s) > 0 ? 'text-app-hue-pink' : 'text-muted'"
634
633
  >
635
634
  {{ followUpLabel(s) }}
@@ -663,7 +662,7 @@ const ITEM_ICON: Record<string, string> = {
663
662
  :class="forkPhase(s) === 'proposing' ? 'animate-spin' : ''"
664
663
  />
665
664
  </span>
666
- <span class="min-w-0 flex-1 truncate text-[12px] text-toned">
665
+ <span class="min-w-0 flex-1 truncate text-xs text-toned">
667
666
  {{
668
667
  forkPhase(s) === 'proposing'
669
668
  ? t('pipeline.progress.forkDecision.proposing')
@@ -687,7 +686,7 @@ const ITEM_ICON: Record<string, string> = {
687
686
  >
688
687
  <UIcon name="i-lucide-clipboard-check" class="h-3 w-3 text-primary" />
689
688
  </span>
690
- <span class="min-w-0 flex-1 truncate text-[12px] text-toned">
689
+ <span class="min-w-0 flex-1 truncate text-xs text-toned">
691
690
  {{ t('pipeline.progress.prReview.review') }}
692
691
  </span>
693
692
  </button>
@@ -712,7 +711,7 @@ const ITEM_ICON: Record<string, string> = {
712
711
  class="h-3 w-3 text-app-hue-cyan"
713
712
  />
714
713
  </span>
715
- <span class="min-w-0 flex-1 truncate text-[12px] text-toned">
714
+ <span class="min-w-0 flex-1 truncate text-xs text-toned">
716
715
  {{ t('pipeline.progress.binaryCandidates.choose') }}
717
716
  </span>
718
717
  </button>
@@ -721,7 +720,7 @@ const ITEM_ICON: Record<string, string> = {
721
720
  NOT a "Review & approve" gate (the human is summoned only if needed) -->
722
721
  <div
723
722
  v-if="reviewStageLabel(s.agentKind)"
724
- class="mt-3 inline-flex items-center gap-1 text-[11px] text-primary"
723
+ class="mt-3 inline-flex items-center gap-1 text-2xs text-primary"
725
724
  >
726
725
  <UIcon name="i-lucide-loader-circle" class="h-3 w-3 animate-spin" />
727
726
  {{ reviewStageLabel(s.agentKind) }}
@@ -766,7 +765,7 @@ const ITEM_ICON: Record<string, string> = {
766
765
  </div>
767
766
  <p
768
767
  v-else-if="s.decision?.chosen"
769
- class="mt-2 flex items-center gap-1 truncate text-[11px] text-app-success-400"
768
+ class="mt-2 flex items-center gap-1 truncate text-2xs text-app-success-400"
770
769
  :title="s.decision.chosen"
771
770
  >
772
771
  <UIcon name="i-lucide-check" class="h-3 w-3 shrink-0" />