@cat-factory/app 0.92.2 → 0.94.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 (55) hide show
  1. package/app/components/auth/LoginScreen.vue +5 -1
  2. package/app/components/board/AddTaskModal.vue +25 -5
  3. package/app/components/board/CreateInitiativeModal.vue +9 -1
  4. package/app/components/board/RecurringPipelineModal.vue +20 -4
  5. package/app/components/bootstrap/BootstrapModal.vue +9 -1
  6. package/app/components/brainstorm/BrainstormWindow.vue +5 -1
  7. package/app/components/clarity/ClarityReviewWindow.vue +5 -1
  8. package/app/components/docs/DocInterviewWindow.vue +209 -0
  9. package/app/components/documents/DocumentTemplatesModal.vue +5 -1
  10. package/app/components/fragments/FragmentLibraryManager.vue +10 -2
  11. package/app/components/github/GitHubPanel.vue +25 -4
  12. package/app/components/layout/BoardSwitcher.vue +10 -1
  13. package/app/components/layout/BoardToolbar.vue +15 -3
  14. package/app/components/layout/GitHubPatBanner.vue +5 -1
  15. package/app/components/layout/ProviderConfigBanner.vue +5 -1
  16. package/app/components/panels/AgentStepDetail.vue +5 -1
  17. package/app/components/panels/InspectorPanel.vue +5 -1
  18. package/app/components/panels/StepRestartControl.vue +10 -2
  19. package/app/components/panels/StepResultViewHost.vue +4 -0
  20. package/app/components/panels/inspector/FrontendConfig.vue +10 -1
  21. package/app/components/panels/inspector/RecurringScheduleSettings.vue +11 -3
  22. package/app/components/pipeline/PipelineBuilder.vue +15 -2
  23. package/app/components/pipeline/PipelineProgress.vue +10 -2
  24. package/app/components/providers/AiPresetMismatchDialog.vue +10 -1
  25. package/app/components/providers/PersonalCredentialModal.vue +18 -2
  26. package/app/components/requirements/RequirementsReviewWindow.vue +5 -1
  27. package/app/components/sandbox/SandboxPanel.vue +10 -1
  28. package/app/components/settings/InfraHandlersConfigurator.vue +5 -1
  29. package/app/components/settings/InfrastructureWindow.vue +18 -2
  30. package/app/components/settings/IssueTrackerPanel.vue +20 -4
  31. package/app/components/settings/LocalModelEndpointsPanel.vue +5 -1
  32. package/app/components/settings/ModelConfigurationPanel.vue +20 -3
  33. package/app/components/settings/ProviderConnectionTab.vue +5 -1
  34. package/app/components/settings/SharedStacksPanel.vue +363 -0
  35. package/app/components/spec/ServiceSpecWindow.vue +15 -3
  36. package/app/components/testing/TestReportWindow.vue +10 -2
  37. package/app/composables/api/docInterview.ts +36 -0
  38. package/app/composables/api/sharedStacks.ts +42 -0
  39. package/app/composables/useApi.ts +4 -0
  40. package/app/composables/useWorkspaceStream.ts +5 -0
  41. package/app/stores/docInterview.ts +89 -0
  42. package/app/stores/sharedStacks.ts +65 -0
  43. package/app/stores/workspace.ts +3 -0
  44. package/app/types/doc-interview.ts +9 -0
  45. package/app/types/domain.ts +1 -0
  46. package/app/types/sharedStacks.ts +8 -0
  47. package/i18n/locales/en.json +62 -0
  48. package/i18n/locales/es.json +62 -0
  49. package/i18n/locales/fr.json +62 -0
  50. package/i18n/locales/he.json +62 -0
  51. package/i18n/locales/ja.json +62 -0
  52. package/i18n/locales/pl.json +62 -0
  53. package/i18n/locales/tr.json +62 -0
  54. package/i18n/locales/uk.json +62 -0
  55. package/package.json +5 -5
@@ -279,7 +279,16 @@ onUnmounted(() => preview.stopPolling(props.block.id))
279
279
  >
280
280
  {{ t('inspector.frontendConfig.detect.apply') }}
281
281
  </UButton>
282
- <UButton size="xs" variant="ghost" color="neutral" @click="detectResult = null">
282
+ <UButton
283
+ size="xs"
284
+ variant="ghost"
285
+ color="neutral"
286
+ @click="
287
+ () => {
288
+ detectResult = null
289
+ }
290
+ "
291
+ >
283
292
  {{ t('inspector.frontendConfig.detect.dismiss') }}
284
293
  </UButton>
285
294
  </div>
@@ -213,9 +213,17 @@ function fmtTime(ms: number) {
213
213
  <template v-else-if="draft">
214
214
  <RecurringRecurrenceEditor v-model="draft" />
215
215
  <div class="flex justify-end gap-1.5 pt-1">
216
- <UButton size="xs" variant="ghost" color="neutral" @click="editing = false">{{
217
- t('common.cancel')
218
- }}</UButton>
216
+ <UButton
217
+ size="xs"
218
+ variant="ghost"
219
+ color="neutral"
220
+ @click="
221
+ () => {
222
+ editing = false
223
+ }
224
+ "
225
+ >{{ t('common.cancel') }}</UButton
226
+ >
219
227
  <UButton size="xs" color="primary" :loading="busy" @click="saveEdit">{{
220
228
  t('common.save')
221
229
  }}</UButton>
@@ -762,7 +762,11 @@ async function clone(p: Pipeline) {
762
762
  :color="showArchived ? 'primary' : 'neutral'"
763
763
  variant="ghost"
764
764
  size="xs"
765
- @click="showArchived = !showArchived"
765
+ @click="
766
+ () => {
767
+ showArchived = !showArchived
768
+ }
769
+ "
766
770
  >
767
771
  {{
768
772
  showArchived
@@ -987,7 +991,16 @@ async function clone(p: Pipeline) {
987
991
 
988
992
  <template #footer>
989
993
  <div class="flex w-full items-center justify-end gap-2">
990
- <UButton color="neutral" variant="ghost" size="sm" @click="addAgentOpen = false">
994
+ <UButton
995
+ color="neutral"
996
+ variant="ghost"
997
+ size="sm"
998
+ @click="
999
+ () => {
1000
+ addAgentOpen = false
1001
+ }
1002
+ "
1003
+ >
991
1004
  {{ t('common.cancel') }}
992
1005
  </UButton>
993
1006
  <UButton
@@ -324,7 +324,11 @@ const ITEM_ICON: Record<string, string> = {
324
324
  size="xs"
325
325
  class="shrink-0 opacity-0 transition-opacity group-hover:opacity-100"
326
326
  :title="t('pipeline.progress.restartTooltip')"
327
- @click.stop="restartArmed = i"
327
+ @click.stop="
328
+ () => {
329
+ restartArmed = i
330
+ }
331
+ "
328
332
  />
329
333
  <template v-else>
330
334
  <UButton
@@ -344,7 +348,11 @@ const ITEM_ICON: Record<string, string> = {
344
348
  size="xs"
345
349
  class="shrink-0"
346
350
  :disabled="restarting === i"
347
- @click.stop="restartArmed = null"
351
+ @click.stop="
352
+ () => {
353
+ restartArmed = null
354
+ }
355
+ "
348
356
  >
349
357
  {{ t('common.cancel') }}
350
358
  </UButton>
@@ -75,7 +75,16 @@ function go(action: () => void) {
75
75
  </p>
76
76
 
77
77
  <div class="flex flex-wrap justify-end gap-2">
78
- <UButton color="neutral" variant="ghost" size="sm" @click="open = false">
78
+ <UButton
79
+ color="neutral"
80
+ variant="ghost"
81
+ size="sm"
82
+ @click="
83
+ () => {
84
+ open = false
85
+ }
86
+ "
87
+ >
79
88
  {{ t('providers.presetMismatch.later') }}
80
89
  </UButton>
81
90
  <UButton
@@ -97,7 +97,15 @@ function goConnect() {
97
97
  {{ t('providers.personalCredential.connectBody', { vendor: vendorLabel }) }}
98
98
  </p>
99
99
  <div class="flex justify-end gap-2">
100
- <UButton color="neutral" variant="ghost" @click="open = false">
100
+ <UButton
101
+ color="neutral"
102
+ variant="ghost"
103
+ @click="
104
+ () => {
105
+ open = false
106
+ }
107
+ "
108
+ >
101
109
  {{ t('providers.personalCredential.cancel') }}
102
110
  </UButton>
103
111
  <UButton icon="i-lucide-shield-check" @click="goConnect()">
@@ -120,7 +128,15 @@ function goConnect() {
120
128
  />
121
129
  </UFormField>
122
130
  <div class="flex justify-end gap-2">
123
- <UButton color="neutral" variant="ghost" @click="open = false">
131
+ <UButton
132
+ color="neutral"
133
+ variant="ghost"
134
+ @click="
135
+ () => {
136
+ open = false
137
+ }
138
+ "
139
+ >
124
140
  {{ t('providers.personalCredential.cancel') }}
125
141
  </UButton>
126
142
  <UButton :loading="busy" :disabled="password.length < 6" @click="submit()">
@@ -979,7 +979,11 @@ async function resolveExceeded(choice: 'extra-round' | 'proceed' | 'stop-reset')
979
979
  size="sm"
980
980
  block
981
981
  icon="i-lucide-pencil"
982
- @click="showRedo = !showRedo"
982
+ @click="
983
+ () => {
984
+ showRedo = !showRedo
985
+ }
986
+ "
983
987
  >
984
988
  {{ t('requirements.actions.redoIncorporation') }}
985
989
  </UButton>
@@ -561,7 +561,16 @@ async function archive(prompt: SandboxPromptVersion) {
561
561
  </p>
562
562
  <UTextarea v-model="editText" :rows="16" class="w-full font-mono text-xs" autoresize />
563
563
  <div class="flex justify-end gap-2">
564
- <UButton color="neutral" variant="ghost" size="sm" @click="editing = null">
564
+ <UButton
565
+ color="neutral"
566
+ variant="ghost"
567
+ size="sm"
568
+ @click="
569
+ () => {
570
+ editing = null
571
+ }
572
+ "
573
+ >
565
574
  {{ t('common.cancel') }}
566
575
  </UButton>
567
576
  <UButton
@@ -443,7 +443,11 @@ function notifyError(e: unknown) {
443
443
  :color="selectedKubeEngine === e ? 'primary' : 'neutral'"
444
444
  :variant="selectedKubeEngine === e ? 'soft' : 'ghost'"
445
445
  size="xs"
446
- @click="selectedKubeEngine = e"
446
+ @click="
447
+ () => {
448
+ selectedKubeEngine = e
449
+ }
450
+ "
447
451
  >
448
452
  {{ t(KUBE_ENGINE_KEYS[e]) }}
449
453
  </UButton>
@@ -14,6 +14,10 @@ import type { ProviderConnectionKind } from '~/types/providerConnections'
14
14
  import InfrastructureBackendPicker from '~/components/settings/InfrastructureBackendPicker.vue'
15
15
  import InfraHandlersConfigurator from '~/components/settings/InfraHandlersConfigurator.vue'
16
16
  import LocalContainerPoolSettings from '~/components/settings/LocalContainerPoolSettings.vue'
17
+ import SharedStacksPanel from '~/components/settings/SharedStacksPanel.vue'
18
+
19
+ // The shared-stacks tab uses its own slot key beyond the provider-connection kinds.
20
+ type InfraTabValue = ProviderConnectionKind | 'shared-stacks'
17
21
 
18
22
  const { t } = useI18n()
19
23
  const ui = useUiStore()
@@ -37,7 +41,7 @@ const agentsAvailable = computed(() => (auth.infrastructure?.execution.available
37
41
  const envsAvailable = computed(() => (auth.infrastructure?.testEnv.available.length ?? 0) > 0)
38
42
 
39
43
  const tabs = computed(() => {
40
- const out: { value: ProviderConnectionKind; label: string; icon: string; slot: string }[] = []
44
+ const out: { value: InfraTabValue; label: string; icon: string; slot: string }[] = []
41
45
  if (agentsAvailable.value)
42
46
  out.push({
43
47
  value: 'runner-pool',
@@ -52,10 +56,19 @@ const tabs = computed(() => {
52
56
  icon: 'i-lucide-cloud',
53
57
  slot: 'environment',
54
58
  })
59
+ // Shared stacks are long-lived compose infra a Tester environment attaches to, so they live
60
+ // alongside the test-environment config (shown wherever an environment backend is available).
61
+ if (envsAvailable.value)
62
+ out.push({
63
+ value: 'shared-stacks',
64
+ label: t('settings.sharedStacks.tab'),
65
+ icon: 'i-lucide-layers',
66
+ slot: 'shared-stacks',
67
+ })
55
68
  return out
56
69
  })
57
70
 
58
- const activeTab = ref<ProviderConnectionKind>(ui.infrastructureTab)
71
+ const activeTab = ref<InfraTabValue>(ui.infrastructureTab)
59
72
 
60
73
  // Honour the deep-linked tab each time the window opens, falling back to the first available
61
74
  // tab if the requested one is off.
@@ -124,6 +137,9 @@ watch([tabs, () => store.loaded], () => {
124
137
  <InfraHandlersConfigurator />
125
138
  </div>
126
139
  </template>
140
+ <template #shared-stacks>
141
+ <SharedStacksPanel />
142
+ </template>
127
143
  </UTabs>
128
144
 
129
145
  <p v-else class="px-1 py-6 text-center text-sm text-slate-500">
@@ -234,7 +234,11 @@ const STATUS_UI: Record<
234
234
  size="sm"
235
235
  :color="trackerKind === null ? 'primary' : 'neutral'"
236
236
  :variant="trackerKind === null ? 'solid' : 'subtle'"
237
- @click="trackerKind = null"
237
+ @click="
238
+ () => {
239
+ trackerKind = null
240
+ }
241
+ "
238
242
  >
239
243
  {{ t('settings.issueTracker.filing.none') }}
240
244
  </UButton>
@@ -243,7 +247,11 @@ const STATUS_UI: Record<
243
247
  size="sm"
244
248
  :color="trackerKind === 'github' ? 'primary' : 'neutral'"
245
249
  :variant="trackerKind === 'github' ? 'solid' : 'subtle'"
246
- @click="trackerKind = 'github'"
250
+ @click="
251
+ () => {
252
+ trackerKind = 'github'
253
+ }
254
+ "
247
255
  >
248
256
  {{ t('settings.issueTracker.vendor.github') }}
249
257
  </UButton>
@@ -252,7 +260,11 @@ const STATUS_UI: Record<
252
260
  size="sm"
253
261
  :color="trackerKind === 'jira' ? 'primary' : 'neutral'"
254
262
  :variant="trackerKind === 'jira' ? 'solid' : 'subtle'"
255
- @click="trackerKind = 'jira'"
263
+ @click="
264
+ () => {
265
+ trackerKind = 'jira'
266
+ }
267
+ "
256
268
  >
257
269
  Jira
258
270
  </UButton>
@@ -261,7 +273,11 @@ const STATUS_UI: Record<
261
273
  size="sm"
262
274
  :color="trackerKind === 'linear' ? 'primary' : 'neutral'"
263
275
  :variant="trackerKind === 'linear' ? 'solid' : 'subtle'"
264
- @click="trackerKind = 'linear'"
276
+ @click="
277
+ () => {
278
+ trackerKind = 'linear'
279
+ }
280
+ "
265
281
  >
266
282
  Linear
267
283
  </UButton>
@@ -225,7 +225,11 @@ async function remove(p: LocalRunner) {
225
225
  size="xs"
226
226
  :disabled="busy"
227
227
  :title="t('settings.localModelEndpoints.edit')"
228
- @click="provider = e.provider"
228
+ @click="
229
+ () => {
230
+ provider = e.provider
231
+ }
232
+ "
229
233
  />
230
234
  <UButton
231
235
  icon="i-lucide-trash-2"
@@ -281,7 +281,11 @@ function fail(title: string, e: unknown) {
281
281
  variant="ghost"
282
282
  size="sm"
283
283
  class="ms-auto"
284
- @click="editor = null"
284
+ @click="
285
+ () => {
286
+ editor = null
287
+ }
288
+ "
285
289
  >
286
290
  {{ t('settings.modelConfiguration.back') }}
287
291
  </UButton>
@@ -292,7 +296,11 @@ function fail(title: string, e: unknown) {
292
296
  size="sm"
293
297
  :class="editor ? '' : 'ms-auto'"
294
298
  :title="t('settings.modelConfiguration.closeEsc')"
295
- @click="open = false"
299
+ @click="
300
+ () => {
301
+ open = false
302
+ }
303
+ "
296
304
  />
297
305
  </header>
298
306
 
@@ -499,7 +507,16 @@ function fail(title: string, e: unknown) {
499
507
  </div>
500
508
 
501
509
  <div class="flex items-center justify-end gap-2">
502
- <UButton color="neutral" variant="ghost" size="sm" @click="editor = null">
510
+ <UButton
511
+ color="neutral"
512
+ variant="ghost"
513
+ size="sm"
514
+ @click="
515
+ () => {
516
+ editor = null
517
+ }
518
+ "
519
+ >
503
520
  {{ t('common.cancel') }}
504
521
  </UButton>
505
522
  <UButton color="primary" size="sm" :loading="busy" @click="save">
@@ -364,7 +364,11 @@ function fieldHelp(key: string): string | undefined {
364
364
  variant="ghost"
365
365
  size="xs"
366
366
  class="shrink-0"
367
- @click="showLogs = !showLogs"
367
+ @click="
368
+ () => {
369
+ showLogs = !showLogs
370
+ }
371
+ "
368
372
  >
369
373
  {{
370
374
  showLogs