@cat-factory/app 0.261.3 → 0.261.4
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 +40 -0
- package/app/components/board/AddTaskModal.vue +10 -6
- package/app/components/board/AgentStopButton.vue +2 -5
- package/app/components/board/CreateInitiativeModal.vue +2 -7
- package/app/components/board/RecurringPipelineModal.vue +10 -6
- package/app/components/bootstrap/BootstrapModal.vue +5 -24
- package/app/components/brainstorm/BrainstormWindow.vue +7 -15
- package/app/components/clarity/ClarityReviewWindow.vue +7 -15
- package/app/components/documents/DocumentImportModal.vue +2 -6
- package/app/components/documents/DocumentSourceConnectModal.vue +3 -12
- package/app/components/documents/DocumentSyncState.vue +2 -7
- package/app/components/documents/DocumentTemplatesModal.vue +4 -19
- package/app/components/documents/SpawnPreviewModal.vue +3 -12
- package/app/components/foundational/FoundationalServiceCatalogList.vue +3 -11
- package/app/components/foundational/FoundationalServiceRegistry.vue +3 -11
- package/app/components/foundational/FoundationalServiceSources.vue +5 -13
- package/app/components/foundational/FoundationalSuppressions.vue +2 -6
- package/app/components/fragments/FragmentLibraryManager.vue +12 -20
- package/app/components/github/AddServiceFromRepoModal.vue +3 -12
- package/app/components/github/GitHubConnect.vue +4 -12
- package/app/components/github/GitHubPanel.vue +9 -17
- package/app/components/github/RepoTreeBrowser.vue +2 -7
- package/app/components/humanTest/HumanTestWindow.vue +2 -7
- package/app/components/initiative/InitiativeTrackerWindow.vue +2 -3
- package/app/components/layout/AccountAuditLog.vue +2 -7
- package/app/components/layout/AccountDeploymentSettings.vue +11 -51
- package/app/components/layout/AccountModelPolicySettings.vue +2 -5
- package/app/components/layout/AccountPlatformAlertSettings.vue +2 -5
- package/app/components/layout/AccountRunCredentialSettings.vue +2 -5
- package/app/components/layout/AccountTeamSettings.vue +9 -18
- package/app/components/layout/BoardSwitcher.vue +6 -14
- package/app/components/layout/BoardToolbar.vue +3 -10
- package/app/components/layout/NotificationsInbox.vue +3 -13
- package/app/components/layout/WorkspaceMembersSettings.vue +6 -15
- package/app/components/notifications/NotificationSettingsPanel.vue +3 -11
- package/app/components/panels/DecisionModal.vue +2 -7
- package/app/components/panels/inspector/RecurringScheduleSettings.vue +4 -20
- package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +3 -11
- package/app/components/panels/inspector/ServiceTestSecrets.vue +3 -11
- package/app/components/panels/inspector/ServiceValidationConfig.vue +4 -12
- package/app/components/pipeline/PipelineBuilder.vue +4 -7
- package/app/components/providers/ApiKeysSection.vue +4 -15
- package/app/components/providers/PersonalCredentialModal.vue +2 -5
- package/app/components/providers/PersonalSubscriptionSection.vue +3 -10
- package/app/components/providers/VendorCredentialsModal.vue +5 -20
- package/app/components/requirements/RequirementsReviewWindow.vue +11 -19
- package/app/components/sandbox/SandboxPanel.vue +4 -18
- package/app/components/settings/ApiTokensPanel.vue +4 -12
- package/app/components/settings/BudgetSettings.vue +2 -5
- package/app/components/settings/CloudflareHandlerSection.vue +3 -12
- package/app/components/settings/ConsensusGroupsSection.vue +3 -12
- package/app/components/settings/CustomManifestTypeEditor.vue +3 -13
- package/app/components/settings/DefaultProvisionTypeSection.vue +2 -5
- package/app/components/settings/InfraHandlersConfigurator.vue +7 -14
- package/app/components/settings/InfrastructureBackendPicker.vue +2 -7
- package/app/components/settings/IssueTrackerPanel.vue +4 -18
- package/app/components/settings/LocalContainerPoolSettings.vue +2 -6
- package/app/components/settings/LocalModelEndpointsPanel.vue +3 -11
- package/app/components/settings/ModelConfigurationPanel.vue +13 -16
- package/app/components/settings/ModelPresetHealthModal.vue +3 -13
- package/app/components/settings/ObservabilityConnectionPanel.vue +6 -14
- package/app/components/settings/OpenRouterCatalogPanel.vue +3 -12
- package/app/components/settings/PackageRegistriesPanel.vue +4 -12
- package/app/components/settings/ProviderConnectionTab.vue +5 -13
- package/app/components/settings/RiskPolicyHealthModal.vue +2 -7
- package/app/components/settings/RiskPolicyPanel.vue +5 -13
- package/app/components/settings/ServiceFragmentDefaultsPanel.vue +2 -7
- package/app/components/settings/SharedStacksPanel.vue +10 -20
- package/app/components/settings/TaskTypeSuppressionsPanel.vue +3 -12
- package/app/components/settings/UserSecretsSection.vue +3 -11
- package/app/components/settings/WorkspaceMetadataSettings.vue +2 -6
- package/app/components/settings/WorkspaceSettingsPanel.vue +2 -6
- package/app/components/skills/SkillLibraryManager.vue +5 -13
- package/app/components/slack/SlackPanel.vue +7 -15
- package/app/components/tasks/BugHuntModal.vue +2 -6
- package/app/components/tasks/TaskImportModal.vue +2 -6
- package/app/components/tasks/TaskSourceConnectModal.vue +4 -18
- package/app/composables/useBlockDeletion.ts +2 -6
- package/app/composables/useCopyToClipboard.ts +7 -1
- package/app/composables/usePipelineErrorToast.spec.ts +76 -16
- package/app/composables/usePipelineErrorToast.ts +109 -50
- package/app/stores/board/context.ts +9 -2
- package/app/stores/board/dependencies.ts +3 -13
- package/app/stores/board/mutations.ts +2 -7
- package/app/stores/board/placement.ts +12 -25
- package/app/stores/board/removal.ts +2 -7
- package/app/stores/board.spec.ts +15 -8
- package/app/stores/board.ts +11 -1
- package/app/stores/recurringPipelines.ts +5 -11
- package/package.json +1 -1
|
@@ -35,6 +35,7 @@ const catalog =
|
|
|
35
35
|
: useFoundationalServices(props.kind, props.ownerId)
|
|
36
36
|
const github = useGitHubStore()
|
|
37
37
|
const toast = useToast()
|
|
38
|
+
const { present } = usePipelineErrorToast()
|
|
38
39
|
const { t, d } = useI18n()
|
|
39
40
|
const { confirm } = useConfirm()
|
|
40
41
|
|
|
@@ -42,15 +43,6 @@ const { confirm } = useConfirm()
|
|
|
42
43
|
// back to manual text entry.
|
|
43
44
|
const githubReady = computed(() => github.available === true && github.connected)
|
|
44
45
|
|
|
45
|
-
function notifyError(title: string, e: unknown) {
|
|
46
|
-
toast.add({
|
|
47
|
-
title,
|
|
48
|
-
description: e instanceof Error ? e.message : String(e),
|
|
49
|
-
icon: 'i-lucide-triangle-alert',
|
|
50
|
-
color: 'error',
|
|
51
|
-
})
|
|
52
|
-
}
|
|
53
|
-
|
|
54
46
|
// Per-row in-flight tracking so only the control that triggered an action spins.
|
|
55
47
|
const busyRows = reactive(new Set<string>())
|
|
56
48
|
const rowBusy = (key: string) => busyRows.has(key)
|
|
@@ -182,7 +174,7 @@ async function link() {
|
|
|
182
174
|
toast.add({ title: t('foundational.toast.sourceLinked'), icon: 'i-lucide-git-branch' })
|
|
183
175
|
return result
|
|
184
176
|
} catch (e) {
|
|
185
|
-
|
|
177
|
+
present(e, 'foundational.toast.linkSourceFailed')
|
|
186
178
|
} finally {
|
|
187
179
|
linking.value = false
|
|
188
180
|
}
|
|
@@ -213,7 +205,7 @@ async function sync(id: string) {
|
|
|
213
205
|
color: coverage ? 'warning' : 'info',
|
|
214
206
|
})
|
|
215
207
|
} catch (e) {
|
|
216
|
-
|
|
208
|
+
present(e, 'foundational.toast.syncFailed')
|
|
217
209
|
}
|
|
218
210
|
})
|
|
219
211
|
}
|
|
@@ -229,7 +221,7 @@ async function check(id: string) {
|
|
|
229
221
|
icon: status.changed ? 'i-lucide-bell-dot' : 'i-lucide-check',
|
|
230
222
|
})
|
|
231
223
|
} catch (e) {
|
|
232
|
-
|
|
224
|
+
present(e, 'foundational.toast.checkSourceFailed')
|
|
233
225
|
}
|
|
234
226
|
})
|
|
235
227
|
}
|
|
@@ -251,7 +243,7 @@ async function unlink(id: string) {
|
|
|
251
243
|
await catalog.unlinkSource(id)
|
|
252
244
|
toast.add({ title: t('foundational.toast.sourceUnlinked'), icon: 'i-lucide-unplug' })
|
|
253
245
|
} catch (e) {
|
|
254
|
-
|
|
246
|
+
present(e, 'foundational.toast.unlinkSourceFailed')
|
|
255
247
|
}
|
|
256
248
|
})
|
|
257
249
|
}
|
|
@@ -24,6 +24,7 @@ const catalog =
|
|
|
24
24
|
? useFoundationalServicesStore()
|
|
25
25
|
: useFoundationalServices(props.kind, props.ownerId)
|
|
26
26
|
const toast = useToast()
|
|
27
|
+
const { present } = usePipelineErrorToast()
|
|
27
28
|
const { t } = useI18n()
|
|
28
29
|
|
|
29
30
|
// Exhaustive scope→key maps of literal `t(...)` keys: what a board opts out of (its account's
|
|
@@ -48,12 +49,7 @@ async function restore(serviceId: string) {
|
|
|
48
49
|
await catalog.restore(serviceId)
|
|
49
50
|
toast.add({ title: t('foundational.toast.restored'), icon: 'i-lucide-eye' })
|
|
50
51
|
} catch (e) {
|
|
51
|
-
toast.
|
|
52
|
-
title: t('foundational.toast.restoreFailed'),
|
|
53
|
-
description: e instanceof Error ? e.message : String(e),
|
|
54
|
-
icon: 'i-lucide-triangle-alert',
|
|
55
|
-
color: 'error',
|
|
56
|
-
})
|
|
52
|
+
present(e, 'foundational.toast.restoreFailed')
|
|
57
53
|
} finally {
|
|
58
54
|
busyRows.delete(serviceId)
|
|
59
55
|
}
|
|
@@ -40,6 +40,7 @@ const library =
|
|
|
40
40
|
const documents = useDocumentsStore()
|
|
41
41
|
const github = useGitHubStore()
|
|
42
42
|
const toast = useToast()
|
|
43
|
+
const { present } = usePipelineErrorToast()
|
|
43
44
|
const { t, d } = useI18n()
|
|
44
45
|
const { confirm } = useConfirm()
|
|
45
46
|
|
|
@@ -104,15 +105,6 @@ function tabLabel(which: Tab): string {
|
|
|
104
105
|
return t('fragments.tab.sources')
|
|
105
106
|
}
|
|
106
107
|
|
|
107
|
-
function notifyError(title: string, e: unknown) {
|
|
108
|
-
toast.add({
|
|
109
|
-
title,
|
|
110
|
-
description: e instanceof Error ? e.message : String(e),
|
|
111
|
-
icon: 'i-lucide-triangle-alert',
|
|
112
|
-
color: 'error',
|
|
113
|
-
})
|
|
114
|
-
}
|
|
115
|
-
|
|
116
108
|
// Per-row / per-form in-flight tracking. The store's single `library.loading` flag
|
|
117
109
|
// drove every row's button at once (UX-29) and cross-spun the add/link forms; key
|
|
118
110
|
// each async action so only the control that triggered it shows a spinner.
|
|
@@ -156,7 +148,7 @@ async function autofillTitle(
|
|
|
156
148
|
})
|
|
157
149
|
set(title)
|
|
158
150
|
} catch (e) {
|
|
159
|
-
|
|
151
|
+
present(e, 'fragments.authored.titleGenFailed')
|
|
160
152
|
} finally {
|
|
161
153
|
generatingTitleFor.value = null
|
|
162
154
|
}
|
|
@@ -225,7 +217,7 @@ async function saveEdit() {
|
|
|
225
217
|
editDraft.value = null
|
|
226
218
|
toast.add({ title: t('fragments.toast.updated'), icon: 'i-lucide-check' })
|
|
227
219
|
} catch (e) {
|
|
228
|
-
|
|
220
|
+
present(e, 'fragments.toast.updateFailed')
|
|
229
221
|
}
|
|
230
222
|
})
|
|
231
223
|
}
|
|
@@ -247,7 +239,7 @@ async function createFragment() {
|
|
|
247
239
|
draft.value = { title: '', summary: '', body: '', brief: '', tags: '' }
|
|
248
240
|
toast.add({ title: t('fragments.toast.added'), icon: 'i-lucide-check' })
|
|
249
241
|
} catch (e) {
|
|
250
|
-
|
|
242
|
+
present(e, 'fragments.toast.addFailed')
|
|
251
243
|
} finally {
|
|
252
244
|
creating.value = false
|
|
253
245
|
}
|
|
@@ -268,7 +260,7 @@ async function removeFragment(id: string) {
|
|
|
268
260
|
await library.remove(id)
|
|
269
261
|
toast.add({ title: t('fragments.toast.removed'), icon: 'i-lucide-trash-2' })
|
|
270
262
|
} catch (e) {
|
|
271
|
-
|
|
263
|
+
present(e, 'fragments.toast.removeFailed')
|
|
272
264
|
}
|
|
273
265
|
})
|
|
274
266
|
}
|
|
@@ -462,13 +454,13 @@ async function linkDocumentFragment() {
|
|
|
462
454
|
})
|
|
463
455
|
}
|
|
464
456
|
if (firstError) {
|
|
465
|
-
|
|
457
|
+
present(firstError, 'fragments.toast.linkDocumentFailed')
|
|
466
458
|
} else {
|
|
467
459
|
// Everything staged linked — clear the whole draft (also resets repo/source selection).
|
|
468
460
|
docDraft.value = { source: '', ref: '', tags: '' }
|
|
469
461
|
}
|
|
470
462
|
} catch (e) {
|
|
471
|
-
|
|
463
|
+
present(e, 'fragments.toast.linkDocumentFailed')
|
|
472
464
|
} finally {
|
|
473
465
|
linkingDoc.value = false
|
|
474
466
|
}
|
|
@@ -480,7 +472,7 @@ async function refreshFragment(id: string) {
|
|
|
480
472
|
await library.refreshDocumentFragment(id)
|
|
481
473
|
toast.add({ title: t('fragments.toast.refreshed'), icon: 'i-lucide-refresh-cw' })
|
|
482
474
|
} catch (e) {
|
|
483
|
-
|
|
475
|
+
present(e, 'fragments.toast.refreshFailed')
|
|
484
476
|
}
|
|
485
477
|
})
|
|
486
478
|
}
|
|
@@ -537,7 +529,7 @@ async function linkSource() {
|
|
|
537
529
|
await library.syncSource(source.id)
|
|
538
530
|
toast.add({ title: t('fragments.toast.sourceLinked'), icon: 'i-lucide-git-branch' })
|
|
539
531
|
} catch (e) {
|
|
540
|
-
|
|
532
|
+
present(e, 'fragments.toast.linkSourceFailed')
|
|
541
533
|
} finally {
|
|
542
534
|
linkingSource.value = false
|
|
543
535
|
}
|
|
@@ -556,7 +548,7 @@ async function syncSource(id: string) {
|
|
|
556
548
|
color: 'info',
|
|
557
549
|
})
|
|
558
550
|
} catch (e) {
|
|
559
|
-
|
|
551
|
+
present(e, 'fragments.toast.syncFailed')
|
|
560
552
|
}
|
|
561
553
|
})
|
|
562
554
|
}
|
|
@@ -572,7 +564,7 @@ async function checkSource(id: string) {
|
|
|
572
564
|
icon: status.changed ? 'i-lucide-bell-dot' : 'i-lucide-check',
|
|
573
565
|
})
|
|
574
566
|
} catch (e) {
|
|
575
|
-
|
|
567
|
+
present(e, 'fragments.toast.checkSourceFailed')
|
|
576
568
|
}
|
|
577
569
|
})
|
|
578
570
|
}
|
|
@@ -593,7 +585,7 @@ async function unlinkSource(id: string) {
|
|
|
593
585
|
await library.unlinkSource(id)
|
|
594
586
|
toast.add({ title: t('fragments.toast.sourceUnlinked'), icon: 'i-lucide-unplug' })
|
|
595
587
|
} catch (e) {
|
|
596
|
-
|
|
588
|
+
present(e, 'fragments.toast.unlinkSourceFailed')
|
|
597
589
|
}
|
|
598
590
|
})
|
|
599
591
|
}
|
|
@@ -40,6 +40,7 @@ const github = useGitHubStore()
|
|
|
40
40
|
const board = useBoardStore()
|
|
41
41
|
const services = useServicesStore()
|
|
42
42
|
const toast = useToast()
|
|
43
|
+
const { present } = usePipelineErrorToast()
|
|
43
44
|
const { freeFramePosition, focusFrame } = useFramePlacement()
|
|
44
45
|
|
|
45
46
|
const open = computed({
|
|
@@ -353,12 +354,7 @@ async function add() {
|
|
|
353
354
|
color: 'success',
|
|
354
355
|
})
|
|
355
356
|
} catch (e) {
|
|
356
|
-
toast.
|
|
357
|
-
title: t('github.addService.toast.addFailedTitle'),
|
|
358
|
-
description: e instanceof Error ? e.message : String(e),
|
|
359
|
-
icon: 'i-lucide-triangle-alert',
|
|
360
|
-
color: 'error',
|
|
361
|
-
})
|
|
357
|
+
present(e, 'github.addService.toast.addFailedTitle')
|
|
362
358
|
} finally {
|
|
363
359
|
adding.value = false
|
|
364
360
|
}
|
|
@@ -431,12 +427,7 @@ async function addServices() {
|
|
|
431
427
|
color: wiringLanded ? 'success' : 'warning',
|
|
432
428
|
})
|
|
433
429
|
} catch (e) {
|
|
434
|
-
toast.
|
|
435
|
-
title: t('github.addService.toast.addFailedTitle'),
|
|
436
|
-
description: e instanceof Error ? e.message : String(e),
|
|
437
|
-
icon: 'i-lucide-triangle-alert',
|
|
438
|
-
color: 'error',
|
|
439
|
-
})
|
|
430
|
+
present(e, 'github.addService.toast.addFailedTitle')
|
|
440
431
|
} finally {
|
|
441
432
|
adding.value = false
|
|
442
433
|
}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
const { t } = useI18n()
|
|
10
10
|
const github = useGitHubStore()
|
|
11
11
|
const toast = useToast()
|
|
12
|
+
const { present } = usePipelineErrorToast()
|
|
12
13
|
|
|
13
14
|
const installing = ref(false)
|
|
14
15
|
const installationId = ref('')
|
|
@@ -20,21 +21,12 @@ onMounted(() => {
|
|
|
20
21
|
void refreshInstallations()
|
|
21
22
|
})
|
|
22
23
|
|
|
23
|
-
function notifyError(title: string, e: unknown) {
|
|
24
|
-
toast.add({
|
|
25
|
-
title,
|
|
26
|
-
description: e instanceof Error ? e.message : String(e),
|
|
27
|
-
icon: 'i-lucide-triangle-alert',
|
|
28
|
-
color: 'error',
|
|
29
|
-
})
|
|
30
|
-
}
|
|
31
|
-
|
|
32
24
|
async function refreshInstallations() {
|
|
33
25
|
try {
|
|
34
26
|
await github.loadInstallations()
|
|
35
27
|
} catch (e) {
|
|
36
28
|
// A 503 (integration off) is handled by the host; surface anything else.
|
|
37
|
-
|
|
29
|
+
present(e, 'github.connect.errors.listInstallations')
|
|
38
30
|
}
|
|
39
31
|
}
|
|
40
32
|
|
|
@@ -43,7 +35,7 @@ async function install() {
|
|
|
43
35
|
try {
|
|
44
36
|
window.location.href = await github.getInstallUrl()
|
|
45
37
|
} catch (e) {
|
|
46
|
-
|
|
38
|
+
present(e, 'github.connect.errors.startInstall')
|
|
47
39
|
installing.value = false
|
|
48
40
|
}
|
|
49
41
|
}
|
|
@@ -60,7 +52,7 @@ async function connect(id: number, onDone?: () => void) {
|
|
|
60
52
|
color: 'success',
|
|
61
53
|
})
|
|
62
54
|
} catch (e) {
|
|
63
|
-
|
|
55
|
+
present(e, 'github.connect.errors.connect')
|
|
64
56
|
} finally {
|
|
65
57
|
connecting.value = false
|
|
66
58
|
connectingId.value = null
|
|
@@ -17,6 +17,7 @@ const ui = useUiStore()
|
|
|
17
17
|
const access = useWorkspaceAccess()
|
|
18
18
|
const github = useGitHubStore()
|
|
19
19
|
const toast = useToast()
|
|
20
|
+
const { present } = usePipelineErrorToast()
|
|
20
21
|
const { confirm } = useConfirm()
|
|
21
22
|
|
|
22
23
|
const open = computed({
|
|
@@ -95,15 +96,6 @@ watch(
|
|
|
95
96
|
{ immediate: true },
|
|
96
97
|
)
|
|
97
98
|
|
|
98
|
-
function notifyError(title: string, e: unknown) {
|
|
99
|
-
toast.add({
|
|
100
|
-
title,
|
|
101
|
-
description: e instanceof Error ? e.message : String(e),
|
|
102
|
-
icon: 'i-lucide-triangle-alert',
|
|
103
|
-
color: 'error',
|
|
104
|
-
})
|
|
105
|
-
}
|
|
106
|
-
|
|
107
99
|
async function disconnect() {
|
|
108
100
|
const ok = await confirm({
|
|
109
101
|
title: t('vcs.panel.confirmDisconnect.title', {
|
|
@@ -122,7 +114,7 @@ async function disconnect() {
|
|
|
122
114
|
icon: 'i-lucide-unplug',
|
|
123
115
|
})
|
|
124
116
|
} catch (e) {
|
|
125
|
-
|
|
117
|
+
present(e, 'github.panel.errors.disconnect')
|
|
126
118
|
}
|
|
127
119
|
}
|
|
128
120
|
|
|
@@ -135,7 +127,7 @@ async function resync(full = false) {
|
|
|
135
127
|
color: 'info',
|
|
136
128
|
})
|
|
137
129
|
} catch (e) {
|
|
138
|
-
|
|
130
|
+
present(e, 'github.panel.errors.resync')
|
|
139
131
|
}
|
|
140
132
|
}
|
|
141
133
|
|
|
@@ -159,7 +151,7 @@ async function openManage() {
|
|
|
159
151
|
await github.loadAvailableRepos()
|
|
160
152
|
selected.value = new Set(github.availableRepos.filter((r) => r.linked).map((r) => r.githubId))
|
|
161
153
|
} catch (e) {
|
|
162
|
-
|
|
154
|
+
present(e, 'github.panel.errors.loadRepos')
|
|
163
155
|
managing.value = false
|
|
164
156
|
}
|
|
165
157
|
}
|
|
@@ -181,7 +173,7 @@ async function saveRepos() {
|
|
|
181
173
|
color: 'success',
|
|
182
174
|
})
|
|
183
175
|
} catch (e) {
|
|
184
|
-
|
|
176
|
+
present(e, 'github.panel.errors.updateRepos')
|
|
185
177
|
}
|
|
186
178
|
}
|
|
187
179
|
|
|
@@ -201,7 +193,7 @@ async function toggleRepo(repo: GitHubRepo) {
|
|
|
201
193
|
try {
|
|
202
194
|
await github.loadBranches(repo.githubId)
|
|
203
195
|
} catch (e) {
|
|
204
|
-
|
|
196
|
+
present(e, 'github.panel.errors.loadBranches')
|
|
205
197
|
}
|
|
206
198
|
}
|
|
207
199
|
}
|
|
@@ -220,7 +212,7 @@ async function createBranch(repo: GitHubRepo) {
|
|
|
220
212
|
color: 'success',
|
|
221
213
|
})
|
|
222
214
|
} catch (e) {
|
|
223
|
-
|
|
215
|
+
present(e, 'github.panel.errors.createBranch')
|
|
224
216
|
} finally {
|
|
225
217
|
creatingBranch.value = false
|
|
226
218
|
}
|
|
@@ -268,7 +260,7 @@ async function openPr() {
|
|
|
268
260
|
prForm.value = { repoGithubId: null, title: '', head: '', base: '' }
|
|
269
261
|
toast.add({ title: t(pullTerms.value.opened), icon: 'i-lucide-check', color: 'success' })
|
|
270
262
|
} catch (e) {
|
|
271
|
-
|
|
263
|
+
present(e, pullTerms.value.openFailed)
|
|
272
264
|
} finally {
|
|
273
265
|
openingPr.value = false
|
|
274
266
|
}
|
|
@@ -296,7 +288,7 @@ async function merge(pr: GitHubPullRequest) {
|
|
|
296
288
|
color: 'success',
|
|
297
289
|
})
|
|
298
290
|
} catch (e) {
|
|
299
|
-
|
|
291
|
+
present(e, 'github.panel.errors.merge')
|
|
300
292
|
} finally {
|
|
301
293
|
merging.value = null
|
|
302
294
|
}
|
|
@@ -41,7 +41,7 @@ const emit = defineEmits<{
|
|
|
41
41
|
|
|
42
42
|
const { t } = useI18n()
|
|
43
43
|
const github = useGitHubStore()
|
|
44
|
-
const
|
|
44
|
+
const { present } = usePipelineErrorToast()
|
|
45
45
|
|
|
46
46
|
const currentPath = ref(props.startPath)
|
|
47
47
|
const treeEntries = ref<RepoTreeEntry[]>([])
|
|
@@ -94,12 +94,7 @@ async function browseTo(path: string) {
|
|
|
94
94
|
treeEntries.value = await github.loadRepoTree(props.repoGithubId, path)
|
|
95
95
|
} catch (e) {
|
|
96
96
|
treeEntries.value = []
|
|
97
|
-
|
|
98
|
-
title: t('github.repoTree.errors.listDirectory'),
|
|
99
|
-
description: e instanceof Error ? e.message : String(e),
|
|
100
|
-
icon: 'i-lucide-triangle-alert',
|
|
101
|
-
color: 'error',
|
|
102
|
-
})
|
|
97
|
+
present(e, 'github.repoTree.errors.listDirectory')
|
|
103
98
|
} finally {
|
|
104
99
|
loading.value = false
|
|
105
100
|
}
|
|
@@ -20,7 +20,7 @@ const board = useBoardStore()
|
|
|
20
20
|
const execution = useExecutionStore()
|
|
21
21
|
const humanTest = useHumanTestStore()
|
|
22
22
|
const { t, d } = useI18n()
|
|
23
|
-
const
|
|
23
|
+
const { present } = usePipelineErrorToast()
|
|
24
24
|
const access = useWorkspaceAccess()
|
|
25
25
|
const { confirmAction, toastDone } = useConfirmAction()
|
|
26
26
|
|
|
@@ -116,12 +116,7 @@ async function destroy() {
|
|
|
116
116
|
await humanTest.destroyEnv(blockId.value)
|
|
117
117
|
toastDone('destroy', noun)
|
|
118
118
|
} catch (e) {
|
|
119
|
-
|
|
120
|
-
title: t('humanTest.destroyFailed'),
|
|
121
|
-
description: e instanceof Error ? e.message : String(e),
|
|
122
|
-
icon: 'i-lucide-triangle-alert',
|
|
123
|
-
color: 'error',
|
|
124
|
-
})
|
|
119
|
+
present(e, 'humanTest.destroyFailed')
|
|
125
120
|
}
|
|
126
121
|
}
|
|
127
122
|
|
|
@@ -34,7 +34,7 @@ const board = useBoardStore()
|
|
|
34
34
|
const initiatives = useInitiativesStore()
|
|
35
35
|
const access = useWorkspaceAccess()
|
|
36
36
|
const { t } = useI18n()
|
|
37
|
-
const
|
|
37
|
+
const { present } = usePipelineErrorToast()
|
|
38
38
|
|
|
39
39
|
const { open, blockId, instanceId, stepIndex, close } = useResultView('initiative-tracker', {
|
|
40
40
|
onOpen: ({ blockId }) => void initiatives.load(blockId),
|
|
@@ -155,8 +155,7 @@ const editable = computed(() => initiative.value?.status === 'executing')
|
|
|
155
155
|
|
|
156
156
|
/** Report a failed curation call as a toast (a stale-rev CAS conflict, an illegal edit, …). */
|
|
157
157
|
function reportError(error: unknown) {
|
|
158
|
-
|
|
159
|
-
toast.add({ title: t('initiative.curation.failed'), description: message, color: 'error' })
|
|
158
|
+
present(error, 'initiative.curation.failed')
|
|
160
159
|
}
|
|
161
160
|
|
|
162
161
|
// Follow-up promotion: an inline per-follow-up form (phase + optional title override).
|
|
@@ -17,7 +17,7 @@ import { actorLabel, describeEvent } from './AccountAuditLog.logic'
|
|
|
17
17
|
const props = defineProps<{ accountId: string }>()
|
|
18
18
|
|
|
19
19
|
const accounts = useAccountsStore()
|
|
20
|
-
const
|
|
20
|
+
const { present } = usePipelineErrorToast()
|
|
21
21
|
const { t } = useI18n()
|
|
22
22
|
|
|
23
23
|
const events = computed(() => accounts.auditEvents)
|
|
@@ -43,12 +43,7 @@ async function loadMore() {
|
|
|
43
43
|
try {
|
|
44
44
|
await accounts.loadMoreAuditEvents(props.accountId)
|
|
45
45
|
} catch (e) {
|
|
46
|
-
|
|
47
|
-
title: t('layout.auditLog.errors.loadMore'),
|
|
48
|
-
description: apiErrorEnvelope(e)?.message ?? (e instanceof Error ? e.message : String(e)),
|
|
49
|
-
icon: 'i-lucide-triangle-alert',
|
|
50
|
-
color: 'error',
|
|
51
|
-
})
|
|
46
|
+
present(e, 'layout.auditLog.errors.loadMore')
|
|
52
47
|
}
|
|
53
48
|
}
|
|
54
49
|
|
|
@@ -14,6 +14,7 @@ const props = defineProps<{ accountId: string }>()
|
|
|
14
14
|
const store = useAccountSettingsStore()
|
|
15
15
|
const ui = useUiStore()
|
|
16
16
|
const toast = useToast()
|
|
17
|
+
const { present } = usePipelineErrorToast()
|
|
17
18
|
const { t } = useI18n()
|
|
18
19
|
const { confirmAction } = useConfirmAction()
|
|
19
20
|
|
|
@@ -157,12 +158,7 @@ onMounted(async () => {
|
|
|
157
158
|
// deep-link scroll here (the up-front watcher misses the target set before mount).
|
|
158
159
|
void maybeScrollToStorage()
|
|
159
160
|
} catch (e) {
|
|
160
|
-
|
|
161
|
-
title: t('layout.accountDeployment.loadFailed'),
|
|
162
|
-
description: e instanceof Error ? e.message : String(e),
|
|
163
|
-
icon: 'i-lucide-triangle-alert',
|
|
164
|
-
color: 'error',
|
|
165
|
-
})
|
|
161
|
+
present(e, 'layout.accountDeployment.loadFailed')
|
|
166
162
|
}
|
|
167
163
|
})
|
|
168
164
|
|
|
@@ -234,11 +230,7 @@ async function saveStorage() {
|
|
|
234
230
|
color: 'success',
|
|
235
231
|
})
|
|
236
232
|
} catch (e) {
|
|
237
|
-
|
|
238
|
-
title: t('layout.accountDeployment.contentStorage.saveFailed'),
|
|
239
|
-
description: e instanceof Error ? e.message : String(e),
|
|
240
|
-
color: 'error',
|
|
241
|
-
})
|
|
233
|
+
present(e, 'layout.accountDeployment.contentStorage.saveFailed')
|
|
242
234
|
} finally {
|
|
243
235
|
savingStorage.value = false
|
|
244
236
|
}
|
|
@@ -269,11 +261,7 @@ async function saveSlack() {
|
|
|
269
261
|
color: 'success',
|
|
270
262
|
})
|
|
271
263
|
} catch (e) {
|
|
272
|
-
|
|
273
|
-
title: t('layout.accountDeployment.slack.saveFailed'),
|
|
274
|
-
description: e instanceof Error ? e.message : String(e),
|
|
275
|
-
color: 'error',
|
|
276
|
-
})
|
|
264
|
+
present(e, 'layout.accountDeployment.slack.saveFailed')
|
|
277
265
|
} finally {
|
|
278
266
|
savingSlack.value = false
|
|
279
267
|
}
|
|
@@ -290,11 +278,7 @@ async function clearSlack() {
|
|
|
290
278
|
color: 'success',
|
|
291
279
|
})
|
|
292
280
|
} catch (e) {
|
|
293
|
-
|
|
294
|
-
title: t('layout.accountDeployment.slack.clearFailed'),
|
|
295
|
-
description: e instanceof Error ? e.message : String(e),
|
|
296
|
-
color: 'error',
|
|
297
|
-
})
|
|
281
|
+
present(e, 'layout.accountDeployment.slack.clearFailed')
|
|
298
282
|
} finally {
|
|
299
283
|
savingSlack.value = false
|
|
300
284
|
}
|
|
@@ -325,11 +309,7 @@ async function saveLinear() {
|
|
|
325
309
|
color: 'success',
|
|
326
310
|
})
|
|
327
311
|
} catch (e) {
|
|
328
|
-
|
|
329
|
-
title: t('layout.accountDeployment.linear.saveFailed'),
|
|
330
|
-
description: e instanceof Error ? e.message : String(e),
|
|
331
|
-
color: 'error',
|
|
332
|
-
})
|
|
312
|
+
present(e, 'layout.accountDeployment.linear.saveFailed')
|
|
333
313
|
} finally {
|
|
334
314
|
savingLinear.value = false
|
|
335
315
|
}
|
|
@@ -346,11 +326,7 @@ async function clearLinear() {
|
|
|
346
326
|
color: 'success',
|
|
347
327
|
})
|
|
348
328
|
} catch (e) {
|
|
349
|
-
|
|
350
|
-
title: t('layout.accountDeployment.linear.clearFailed'),
|
|
351
|
-
description: e instanceof Error ? e.message : String(e),
|
|
352
|
-
color: 'error',
|
|
353
|
-
})
|
|
329
|
+
present(e, 'layout.accountDeployment.linear.clearFailed')
|
|
354
330
|
} finally {
|
|
355
331
|
savingLinear.value = false
|
|
356
332
|
}
|
|
@@ -381,11 +357,7 @@ async function saveFigma() {
|
|
|
381
357
|
color: 'success',
|
|
382
358
|
})
|
|
383
359
|
} catch (e) {
|
|
384
|
-
|
|
385
|
-
title: t('layout.accountDeployment.figma.saveFailed'),
|
|
386
|
-
description: e instanceof Error ? e.message : String(e),
|
|
387
|
-
color: 'error',
|
|
388
|
-
})
|
|
360
|
+
present(e, 'layout.accountDeployment.figma.saveFailed')
|
|
389
361
|
} finally {
|
|
390
362
|
savingFigma.value = false
|
|
391
363
|
}
|
|
@@ -402,11 +374,7 @@ async function clearFigma() {
|
|
|
402
374
|
color: 'success',
|
|
403
375
|
})
|
|
404
376
|
} catch (e) {
|
|
405
|
-
|
|
406
|
-
title: t('layout.accountDeployment.figma.clearFailed'),
|
|
407
|
-
description: e instanceof Error ? e.message : String(e),
|
|
408
|
-
color: 'error',
|
|
409
|
-
})
|
|
377
|
+
present(e, 'layout.accountDeployment.figma.clearFailed')
|
|
410
378
|
} finally {
|
|
411
379
|
savingFigma.value = false
|
|
412
380
|
}
|
|
@@ -439,11 +407,7 @@ async function saveWeb() {
|
|
|
439
407
|
color: 'success',
|
|
440
408
|
})
|
|
441
409
|
} catch (e) {
|
|
442
|
-
|
|
443
|
-
title: t('layout.accountDeployment.web.saveFailed'),
|
|
444
|
-
description: e instanceof Error ? e.message : String(e),
|
|
445
|
-
color: 'error',
|
|
446
|
-
})
|
|
410
|
+
present(e, 'layout.accountDeployment.web.saveFailed')
|
|
447
411
|
} finally {
|
|
448
412
|
savingWeb.value = false
|
|
449
413
|
}
|
|
@@ -460,11 +424,7 @@ async function clearWeb() {
|
|
|
460
424
|
color: 'success',
|
|
461
425
|
})
|
|
462
426
|
} catch (e) {
|
|
463
|
-
|
|
464
|
-
title: t('layout.accountDeployment.web.clearFailed'),
|
|
465
|
-
description: e instanceof Error ? e.message : String(e),
|
|
466
|
-
color: 'error',
|
|
467
|
-
})
|
|
427
|
+
present(e, 'layout.accountDeployment.web.clearFailed')
|
|
468
428
|
} finally {
|
|
469
429
|
savingWeb.value = false
|
|
470
430
|
}
|
|
@@ -17,6 +17,7 @@ const props = defineProps<{ accountId: string }>()
|
|
|
17
17
|
|
|
18
18
|
const store = useAccountSettingsStore()
|
|
19
19
|
const toast = useToast()
|
|
20
|
+
const { present } = usePipelineErrorToast()
|
|
20
21
|
const { t } = useI18n()
|
|
21
22
|
|
|
22
23
|
// The family / region / mode / trusted-provider domains, pinned to the contract unions so a
|
|
@@ -135,11 +136,7 @@ async function save() {
|
|
|
135
136
|
color: 'success',
|
|
136
137
|
})
|
|
137
138
|
} catch (e) {
|
|
138
|
-
|
|
139
|
-
title: t('settings.modelPolicy.saveFailed'),
|
|
140
|
-
description: e instanceof Error ? e.message : String(e),
|
|
141
|
-
color: 'error',
|
|
142
|
-
})
|
|
139
|
+
present(e, 'settings.modelPolicy.saveFailed')
|
|
143
140
|
} finally {
|
|
144
141
|
saving.value = false
|
|
145
142
|
}
|
|
@@ -26,6 +26,7 @@ const props = defineProps<{ accountId: string }>()
|
|
|
26
26
|
|
|
27
27
|
const store = useAccountSettingsStore()
|
|
28
28
|
const toast = useToast()
|
|
29
|
+
const { present } = usePipelineErrorToast()
|
|
29
30
|
const { t } = useI18n()
|
|
30
31
|
|
|
31
32
|
const WINDOWS = ['1h', '24h', '7d'] as const satisfies readonly PlatformAlertWindow[]
|
|
@@ -234,11 +235,7 @@ async function save() {
|
|
|
234
235
|
color: 'success',
|
|
235
236
|
})
|
|
236
237
|
} catch (e) {
|
|
237
|
-
|
|
238
|
-
title: t('settings.platformAlerts.saveFailed'),
|
|
239
|
-
description: e instanceof Error ? e.message : String(e),
|
|
240
|
-
color: 'error',
|
|
241
|
-
})
|
|
238
|
+
present(e, 'settings.platformAlerts.saveFailed')
|
|
242
239
|
} finally {
|
|
243
240
|
saving.value = false
|
|
244
241
|
}
|
|
@@ -17,6 +17,7 @@ const props = defineProps<{ accountId: string }>()
|
|
|
17
17
|
|
|
18
18
|
const store = useAccountSettingsStore()
|
|
19
19
|
const toast = useToast()
|
|
20
|
+
const { present } = usePipelineErrorToast()
|
|
20
21
|
const { t } = useI18n()
|
|
21
22
|
|
|
22
23
|
// Tri-state, and it must stay tri-state: "not set" is a real, distinct answer from "permitted".
|
|
@@ -49,11 +50,7 @@ async function save() {
|
|
|
49
50
|
})
|
|
50
51
|
toast.add({ title: t('settings.runCredentialPolicy.saved'), color: 'success' })
|
|
51
52
|
} catch (e) {
|
|
52
|
-
|
|
53
|
-
title: t('settings.runCredentialPolicy.saveFailed'),
|
|
54
|
-
description: e instanceof Error ? e.message : String(e),
|
|
55
|
-
color: 'error',
|
|
56
|
-
})
|
|
53
|
+
present(e, 'settings.runCredentialPolicy.saveFailed')
|
|
57
54
|
} finally {
|
|
58
55
|
saving.value = false
|
|
59
56
|
}
|