@cat-factory/app 0.210.1 → 0.211.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/components/board/RecurringPipelineModal.vue +145 -7
- package/app/components/settings/LocalModelEndpointsPanel.vue +45 -3
- package/app/types/localModels.ts +1 -0
- package/i18n/locales/de.json +19 -1
- package/i18n/locales/en.json +19 -1
- package/i18n/locales/es.json +19 -1
- package/i18n/locales/fr.json +19 -1
- package/i18n/locales/he.json +19 -1
- package/i18n/locales/it.json +19 -1
- package/i18n/locales/ja.json +19 -1
- package/i18n/locales/pl.json +19 -1
- package/i18n/locales/tr.json +19 -1
- package/i18n/locales/uk.json +19 -1
- package/package.json +2 -2
|
@@ -7,6 +7,9 @@
|
|
|
7
7
|
// where that pipeline files its ticket) and saved alongside.
|
|
8
8
|
import type { IssueIntakeConfig, Recurrence, ScheduleTemplate } from '~/types/recurring'
|
|
9
9
|
import type { TaskSourceKind } from '~/types/domain'
|
|
10
|
+
import type { IssueIntakeRefusalReason } from '@cat-factory/contracts'
|
|
11
|
+
import { BUILTIN_TASK_SOURCE_KINDS } from '@cat-factory/contracts'
|
|
12
|
+
import { apiErrorReason } from '~/composables/api/errors'
|
|
10
13
|
import { pipelineAllowedForSchedule } from '~/utils/pipeline'
|
|
11
14
|
|
|
12
15
|
const ui = useUiStore()
|
|
@@ -17,7 +20,7 @@ const tracker = useTrackerStore()
|
|
|
17
20
|
const tasks = useTasksStore()
|
|
18
21
|
const toast = useToast()
|
|
19
22
|
const access = useWorkspaceAccess()
|
|
20
|
-
const { t } = useI18n()
|
|
23
|
+
const { t, te } = useI18n()
|
|
21
24
|
|
|
22
25
|
const open = computed({
|
|
23
26
|
get: () => ui.addRecurringFrameId !== null,
|
|
@@ -50,6 +53,68 @@ const intakeSource = ref<TaskSourceKind | null>(null)
|
|
|
50
53
|
const intakeJiraProjectKey = ref('')
|
|
51
54
|
const intakeLinearTeamId = ref('')
|
|
52
55
|
const intakeGithubRepo = ref('')
|
|
56
|
+
/**
|
|
57
|
+
* The board scope for a DEPLOYMENT-REGISTERED source, held opaquely. Its own field rather than
|
|
58
|
+
* reusing one of the three above, mirroring `issueIntakeConfigSchema.board.boardId`: only that
|
|
59
|
+
* deployment's provider knows what its board id means, so the form carries the string and the
|
|
60
|
+
* label stays generic.
|
|
61
|
+
*/
|
|
62
|
+
const intakeBoardId = ref('')
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Opt in to driving THIS schedule from tracker webhooks, for a pipeline that has no `bug-intake`
|
|
66
|
+
* step. Enabling it also switches the schedule to on-demand, because the two are inseparable: a
|
|
67
|
+
* cadence tick carries no triggering ticket, and the server refuses that combination.
|
|
68
|
+
*/
|
|
69
|
+
const trackerTrigger = ref(false)
|
|
70
|
+
|
|
71
|
+
function setTrackerTrigger(on: boolean): void {
|
|
72
|
+
trackerTrigger.value = on
|
|
73
|
+
if (on) onDemand.value = true
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* On-demand is FORCED, not merely defaulted, while the tracker trigger is on: the server refuses a
|
|
78
|
+
* per-ticket schedule that could also fire on a cadence, and setting the switch once at opt-in time
|
|
79
|
+
* left the refusal reachable by turning it back off afterwards. The switch is disabled rather than
|
|
80
|
+
* hidden, so the state it is locked into stays visible and the reason is stated beside it.
|
|
81
|
+
*/
|
|
82
|
+
const onDemandLocked = computed(() => trackerTrigger.value)
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Translated copy for a refused intake configuration, keyed off the backend's machine-readable
|
|
86
|
+
* `details.reason`.
|
|
87
|
+
*
|
|
88
|
+
* The form makes both refusals unrepresentable, so this is the SECOND line rather than the first:
|
|
89
|
+
* a stale form whose pipeline gained a `bug-intake` step since it opened, or an API client driving
|
|
90
|
+
* the same endpoint, still reaches them, and the backend does not localize its prose. An EXHAUSTIVE
|
|
91
|
+
* `Record` over the contracts union is the drift guard: a new refusal reason fails this typecheck
|
|
92
|
+
* until it has copy, which a runtime `t()` lookup could not catch.
|
|
93
|
+
*/
|
|
94
|
+
const INTAKE_REFUSAL_KEYS: Record<IssueIntakeRefusalReason, string> = {
|
|
95
|
+
per_ticket_requires_on_demand: 'board.recurring.refusalPerTicketRequiresOnDemand',
|
|
96
|
+
per_ticket_conflicts_with_bug_intake: 'board.recurring.refusalPerTicketConflictsWithBugIntake',
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function intakeRefusalCopy(error: unknown): string | null {
|
|
100
|
+
const reason = apiErrorReason(error)
|
|
101
|
+
if (!reason || !(reason in INTAKE_REFUSAL_KEYS)) return null
|
|
102
|
+
// `te` before `t`, the `usePipelineErrorToast` idiom: a locale missing the key falls through to
|
|
103
|
+
// the backend's prose rather than rendering the key path at the user.
|
|
104
|
+
const key = INTAKE_REFUSAL_KEYS[reason as IssueIntakeRefusalReason]
|
|
105
|
+
return te(key) ? t(key) : null
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Whether the picked source is one this build ships (and so has a vendor-specific board field).
|
|
110
|
+
*
|
|
111
|
+
* Read from the contracts constant rather than re-listing the three ids: the vocabulary has one
|
|
112
|
+
* owner, and a fourth built-in source would otherwise render the opaque board field here while
|
|
113
|
+
* every other surface offered its vendor one.
|
|
114
|
+
*/
|
|
115
|
+
const intakeSourceIsBuiltin = computed(() =>
|
|
116
|
+
(BUILTIN_TASK_SOURCE_KINDS as readonly string[]).includes(intakeSource.value ?? ''),
|
|
117
|
+
)
|
|
53
118
|
const intakeTitleFragment = ref('')
|
|
54
119
|
const intakeLabels = ref('') // comma-separated in the UI, sent as an array
|
|
55
120
|
const intakeIssueType = ref('')
|
|
@@ -98,6 +163,23 @@ const isBugIntake = computed(() => {
|
|
|
98
163
|
(kind, i) => kind === 'bug-intake' && pipeline.enabled?.[i] !== false,
|
|
99
164
|
)
|
|
100
165
|
})
|
|
166
|
+
/**
|
|
167
|
+
* Whether the intake section is shown, and in which DISPATCH mode — both DERIVED from the picked
|
|
168
|
+
* pipeline rather than chosen, because the two modes are not interchangeable:
|
|
169
|
+
*
|
|
170
|
+
* - a `bug-intake` pipeline pulls its own work from the board, so a pushed event can only mean
|
|
171
|
+
* "drain the queue now" (`queue`);
|
|
172
|
+
* - any other pipeline has no step that picks work, so a pushed event can only mean "run THIS
|
|
173
|
+
* ticket" (`per-ticket`).
|
|
174
|
+
*
|
|
175
|
+
* Deriving it makes the combination the server refuses (`per-ticket` on a `bug-intake` pipeline)
|
|
176
|
+
* unrepresentable here, instead of offering it and reporting a validation error afterwards.
|
|
177
|
+
*/
|
|
178
|
+
const showIntake = computed(() => isBugIntake.value || trackerTrigger.value)
|
|
179
|
+
const intakeDispatch = computed<'queue' | 'per-ticket'>(() =>
|
|
180
|
+
isBugIntake.value ? 'queue' : 'per-ticket',
|
|
181
|
+
)
|
|
182
|
+
|
|
101
183
|
// Sources that can back intake right now (connected / App-installed AND enabled).
|
|
102
184
|
const intakeSources = computed(() => tasks.offeredSources)
|
|
103
185
|
|
|
@@ -119,6 +201,8 @@ watch(open, (isOpen) => {
|
|
|
119
201
|
intakeJiraProjectKey.value = ''
|
|
120
202
|
intakeLinearTeamId.value = ''
|
|
121
203
|
intakeGithubRepo.value = ''
|
|
204
|
+
intakeBoardId.value = ''
|
|
205
|
+
trackerTrigger.value = false
|
|
122
206
|
intakeTitleFragment.value = ''
|
|
123
207
|
intakeLabels.value = ''
|
|
124
208
|
intakeIssueType.value = ''
|
|
@@ -147,6 +231,8 @@ const { requestClose } = useUnsavedGuard({
|
|
|
147
231
|
intakeJiraProjectKey: intakeJiraProjectKey.value.trim(),
|
|
148
232
|
intakeLinearTeamId: intakeLinearTeamId.value.trim(),
|
|
149
233
|
intakeGithubRepo: intakeGithubRepo.value.trim(),
|
|
234
|
+
intakeBoardId: intakeBoardId.value.trim(),
|
|
235
|
+
trackerTrigger: trackerTrigger.value,
|
|
150
236
|
intakeTitleFragment: intakeTitleFragment.value.trim(),
|
|
151
237
|
intakeLabels: intakeLabels.value.trim(),
|
|
152
238
|
intakeIssueType: intakeIssueType.value.trim(),
|
|
@@ -156,10 +242,13 @@ const { requestClose } = useUnsavedGuard({
|
|
|
156
242
|
|
|
157
243
|
// The board field required for the picked source must be filled before a bug-intake schedule saves.
|
|
158
244
|
const intakeReady = computed(() => {
|
|
159
|
-
if (!
|
|
245
|
+
if (!showIntake.value) return true
|
|
160
246
|
if (intakeSource.value === 'jira') return intakeJiraProjectKey.value.trim().length > 0
|
|
161
247
|
if (intakeSource.value === 'linear') return intakeLinearTeamId.value.trim().length > 0
|
|
162
248
|
if (intakeSource.value === 'github') return intakeGithubRepo.value.trim().length > 0
|
|
249
|
+
// A registered source is scoped by its opaque board id. Falling through to `false` here would
|
|
250
|
+
// make its schedule permanently unsaveable rather than merely unscoped.
|
|
251
|
+
if (intakeSource.value) return intakeBoardId.value.trim().length > 0
|
|
163
252
|
return false
|
|
164
253
|
})
|
|
165
254
|
|
|
@@ -181,6 +270,9 @@ function buildIssueIntake(): IssueIntakeConfig {
|
|
|
181
270
|
...(source === 'github' && intakeGithubRepo.value.trim()
|
|
182
271
|
? { githubRepo: intakeGithubRepo.value.trim() }
|
|
183
272
|
: {}),
|
|
273
|
+
...(!intakeSourceIsBuiltin.value && intakeBoardId.value.trim()
|
|
274
|
+
? { boardId: intakeBoardId.value.trim() }
|
|
275
|
+
: {}),
|
|
184
276
|
},
|
|
185
277
|
predicates: {
|
|
186
278
|
...(intakeTitleFragment.value.trim()
|
|
@@ -192,6 +284,9 @@ function buildIssueIntake(): IssueIntakeConfig {
|
|
|
192
284
|
...(source === 'github' && intakeInProgressLabel.value.trim()
|
|
193
285
|
? { inProgressLabel: intakeInProgressLabel.value.trim() }
|
|
194
286
|
: {}),
|
|
287
|
+
// Sent only when it differs from the default, so an ordinary bug-intake schedule's stored
|
|
288
|
+
// config is byte-for-byte what it was before the mode existed.
|
|
289
|
+
...(intakeDispatch.value === 'per-ticket' ? { dispatch: 'per-ticket' as const } : {}),
|
|
195
290
|
}
|
|
196
291
|
}
|
|
197
292
|
|
|
@@ -227,13 +322,13 @@ async function add() {
|
|
|
227
322
|
onDemand: onDemand.value,
|
|
228
323
|
...(onDemand.value ? {} : { recurrence: recurrence.value }),
|
|
229
324
|
...(description.value.trim() ? { description: description.value.trim() } : {}),
|
|
230
|
-
...(
|
|
325
|
+
...(showIntake.value ? { issueIntake: buildIssueIntake() } : {}),
|
|
231
326
|
})
|
|
232
327
|
ui.closeAddRecurring()
|
|
233
328
|
} catch (e) {
|
|
234
329
|
toast.add({
|
|
235
330
|
title: t('board.recurring.addFailedTitle'),
|
|
236
|
-
description: e instanceof Error ? e.message : String(e),
|
|
331
|
+
description: intakeRefusalCopy(e) ?? (e instanceof Error ? e.message : String(e)),
|
|
237
332
|
icon: 'i-lucide-triangle-alert',
|
|
238
333
|
color: 'error',
|
|
239
334
|
})
|
|
@@ -287,10 +382,16 @@ async function add() {
|
|
|
287
382
|
</UFormField>
|
|
288
383
|
|
|
289
384
|
<div class="flex items-start gap-2 rounded-lg border border-slate-800 p-3">
|
|
290
|
-
<USwitch v-model="onDemand" size="sm" class="mt-0.5" />
|
|
385
|
+
<USwitch v-model="onDemand" :disabled="onDemandLocked" size="sm" class="mt-0.5" />
|
|
291
386
|
<div class="space-y-0.5">
|
|
292
387
|
<p class="text-xs font-medium text-slate-200">{{ t('board.recurring.onDemand') }}</p>
|
|
293
|
-
<p class="text-[11px] text-slate-500">
|
|
388
|
+
<p class="text-[11px] text-slate-500">
|
|
389
|
+
{{
|
|
390
|
+
onDemandLocked
|
|
391
|
+
? t('board.recurring.onDemandLockedHint')
|
|
392
|
+
: t('board.recurring.onDemandHint')
|
|
393
|
+
}}
|
|
394
|
+
</p>
|
|
294
395
|
</div>
|
|
295
396
|
</div>
|
|
296
397
|
|
|
@@ -356,7 +457,29 @@ async function add() {
|
|
|
356
457
|
</UFormField>
|
|
357
458
|
</div>
|
|
358
459
|
|
|
359
|
-
|
|
460
|
+
<!--
|
|
461
|
+
A pipeline with no `bug-intake` step has no step that picks work, so tracker intake is an
|
|
462
|
+
OPT-IN here: turning it on makes a matching webhook event run that ticket as its own task.
|
|
463
|
+
A `bug-intake` pipeline needs no toggle — it cannot run without intake config at all.
|
|
464
|
+
-->
|
|
465
|
+
<div v-if="!isBugIntake" class="flex items-start gap-2">
|
|
466
|
+
<USwitch
|
|
467
|
+
:model-value="trackerTrigger"
|
|
468
|
+
size="sm"
|
|
469
|
+
class="mt-0.5"
|
|
470
|
+
@update:model-value="setTrackerTrigger"
|
|
471
|
+
/>
|
|
472
|
+
<div>
|
|
473
|
+
<p class="text-xs font-medium text-slate-200">
|
|
474
|
+
{{ t('board.recurring.trackerTrigger') }}
|
|
475
|
+
</p>
|
|
476
|
+
<p class="text-[11px] text-slate-500">
|
|
477
|
+
{{ t('board.recurring.trackerTriggerHint') }}
|
|
478
|
+
</p>
|
|
479
|
+
</div>
|
|
480
|
+
</div>
|
|
481
|
+
|
|
482
|
+
<div v-if="showIntake" class="space-y-3 rounded-lg border border-slate-800 p-3">
|
|
360
483
|
<p class="text-[11px] font-semibold uppercase tracking-wide text-slate-400">
|
|
361
484
|
{{ t('board.recurring.intake') }}
|
|
362
485
|
</p>
|
|
@@ -410,8 +533,23 @@ async function add() {
|
|
|
410
533
|
<!-- A GitHub repo ref is always the literal `owner/name` path, never localized. -->
|
|
411
534
|
<UInput v-model="intakeGithubRepo" placeholder="owner/name" class="w-full" />
|
|
412
535
|
</UFormField>
|
|
536
|
+
<UFormField
|
|
537
|
+
v-if="intakeSource && !intakeSourceIsBuiltin"
|
|
538
|
+
:label="t('board.recurring.intakeBoardId')"
|
|
539
|
+
:help="t('board.recurring.intakeBoardIdHelp')"
|
|
540
|
+
required
|
|
541
|
+
>
|
|
542
|
+
<UInput v-model="intakeBoardId" class="w-full" />
|
|
543
|
+
</UFormField>
|
|
413
544
|
|
|
414
545
|
<template v-if="intakeSource">
|
|
546
|
+
<p class="text-[11px] text-slate-500">
|
|
547
|
+
{{
|
|
548
|
+
intakeDispatch === 'per-ticket'
|
|
549
|
+
? t('board.recurring.intakeDispatchPerTicketHint')
|
|
550
|
+
: t('board.recurring.intakeDispatchQueueHint')
|
|
551
|
+
}}
|
|
552
|
+
</p>
|
|
415
553
|
<UFormField :label="t('board.recurring.intakeTitleFragment')">
|
|
416
554
|
<UInput
|
|
417
555
|
v-model="intakeTitleFragment"
|
|
@@ -6,7 +6,12 @@
|
|
|
6
6
|
// serves and tick which to enable. Save persists the endpoint; the enabled models then surface
|
|
7
7
|
// automatically in the per-workspace model picker. One endpoint per runner type.
|
|
8
8
|
import { computed, ref, watch } from 'vue'
|
|
9
|
-
import {
|
|
9
|
+
import {
|
|
10
|
+
LOCAL_RUNNER_DEFAULTS,
|
|
11
|
+
LOCAL_RUNNER_LABELS,
|
|
12
|
+
type LocalRunner,
|
|
13
|
+
type LocalRunnerUrlReason,
|
|
14
|
+
} from '~/types/localModels'
|
|
10
15
|
import IntegrationBackTitle from '~/components/layout/IntegrationBackTitle.vue'
|
|
11
16
|
import SecretInput from '~/components/common/SecretInput.vue'
|
|
12
17
|
|
|
@@ -36,6 +41,23 @@ const RUNNERS: { value: LocalRunner; label: string }[] = (
|
|
|
36
41
|
Object.keys(LOCAL_RUNNER_LABELS) as LocalRunner[]
|
|
37
42
|
).map((value) => ({ value, label: LOCAL_RUNNER_LABELS[value] }))
|
|
38
43
|
|
|
44
|
+
// Why the deployment refuses a runner URL, in translated copy. An exhaustive Record keyed
|
|
45
|
+
// off the contracts union, so adding a reason backend-side fails this typecheck instead of
|
|
46
|
+
// rendering the backend's English (which stays available as the "details" line).
|
|
47
|
+
const URL_REASON_KEYS = {
|
|
48
|
+
invalid_url: 'settings.localModelEndpoints.urlReason.invalid_url',
|
|
49
|
+
scheme_not_allowed: 'settings.localModelEndpoints.urlReason.scheme_not_allowed',
|
|
50
|
+
credentials_not_allowed: 'settings.localModelEndpoints.urlReason.credentials_not_allowed',
|
|
51
|
+
query_or_fragment_not_allowed:
|
|
52
|
+
'settings.localModelEndpoints.urlReason.query_or_fragment_not_allowed',
|
|
53
|
+
host_not_loopback: 'settings.localModelEndpoints.urlReason.host_not_loopback',
|
|
54
|
+
host_not_local: 'settings.localModelEndpoints.urlReason.host_not_local',
|
|
55
|
+
} as const satisfies Record<LocalRunnerUrlReason, string>
|
|
56
|
+
|
|
57
|
+
function urlReasonText(reason: LocalRunnerUrlReason): string {
|
|
58
|
+
return t(URL_REASON_KEYS[reason])
|
|
59
|
+
}
|
|
60
|
+
|
|
39
61
|
// ---- add / edit draft ------------------------------------------------------
|
|
40
62
|
const provider = ref<LocalRunner>('ollama')
|
|
41
63
|
const label = ref('')
|
|
@@ -45,6 +67,9 @@ const apiKey = ref('')
|
|
|
45
67
|
const discovered = ref<string[]>([])
|
|
46
68
|
const selected = ref<string[]>([])
|
|
47
69
|
const testError = ref<string | null>(null)
|
|
70
|
+
// The backend's own wording, kept as DETAIL beside a translated refusal rather than being
|
|
71
|
+
// shown as the description (it names env vars an operator, not this user, acts on).
|
|
72
|
+
const testErrorDetail = ref<string | null>(null)
|
|
48
73
|
const tested = ref(false)
|
|
49
74
|
const testing = ref(false)
|
|
50
75
|
const busy = ref(false)
|
|
@@ -84,6 +109,7 @@ async function test() {
|
|
|
84
109
|
if (!baseUrl.value.trim()) return
|
|
85
110
|
testing.value = true
|
|
86
111
|
testError.value = null
|
|
112
|
+
testErrorDetail.value = null
|
|
87
113
|
try {
|
|
88
114
|
const result = await store.test({
|
|
89
115
|
provider: provider.value,
|
|
@@ -98,7 +124,12 @@ async function test() {
|
|
|
98
124
|
selected.value = keep.length ? keep : [...result.models]
|
|
99
125
|
testError.value = null
|
|
100
126
|
} else {
|
|
101
|
-
|
|
127
|
+
// A policy refusal describes itself in the user's language; the backend's English
|
|
128
|
+
// stays as the detail line. A genuine reachability failure has no reason vocabulary.
|
|
129
|
+
testError.value = result.errorReason
|
|
130
|
+
? urlReasonText(result.errorReason)
|
|
131
|
+
: (result.error ?? t('settings.localModelEndpoints.unreachable'))
|
|
132
|
+
testErrorDetail.value = result.errorReason ? (result.error ?? null) : null
|
|
102
133
|
}
|
|
103
134
|
} catch (e) {
|
|
104
135
|
testError.value = e instanceof Error ? e.message : String(e)
|
|
@@ -217,6 +248,12 @@ async function remove(p: LocalRunner) {
|
|
|
217
248
|
· {{ t('settings.localModelEndpoints.keySet') }}</template
|
|
218
249
|
>
|
|
219
250
|
</div>
|
|
251
|
+
<!-- A row whose URL the deployment no longer permits: its models are withheld
|
|
252
|
+
from the picker, so this is the only place that can say why. -->
|
|
253
|
+
<div v-if="e.urlBlockedReason" class="mt-1 text-[11px] text-amber-400">
|
|
254
|
+
{{ t('settings.localModelEndpoints.blocked') }}
|
|
255
|
+
<span class="block text-amber-300/70">{{ urlReasonText(e.urlBlockedReason) }}</span>
|
|
256
|
+
</div>
|
|
220
257
|
</div>
|
|
221
258
|
<div class="flex items-center gap-1">
|
|
222
259
|
<UButton
|
|
@@ -300,7 +337,12 @@ async function remove(p: LocalRunner) {
|
|
|
300
337
|
>
|
|
301
338
|
{{ t('settings.localModelEndpoints.testConnection') }}
|
|
302
339
|
</UButton>
|
|
303
|
-
<span v-if="testError" class="text-xs text-rose-400">
|
|
340
|
+
<span v-if="testError" class="text-xs text-rose-400">
|
|
341
|
+
{{ testError }}
|
|
342
|
+
<span v-if="testErrorDetail" class="block text-[11px] text-rose-300/70">{{
|
|
343
|
+
testErrorDetail
|
|
344
|
+
}}</span>
|
|
345
|
+
</span>
|
|
304
346
|
<span v-else-if="tested && discovered.length" class="text-xs text-emerald-400">
|
|
305
347
|
{{
|
|
306
348
|
t(
|
package/app/types/localModels.ts
CHANGED
package/i18n/locales/de.json
CHANGED
|
@@ -957,6 +957,15 @@
|
|
|
957
957
|
"confirmRemove": {
|
|
958
958
|
"title": "Diesen Runner entfernen?",
|
|
959
959
|
"body": "\"{name}\" wird entfernt. Dies kann nicht rückgängig gemacht werden."
|
|
960
|
+
},
|
|
961
|
+
"blocked": "Die URL dieses Runners ist auf dieser Installation nicht erlaubt, daher sind seine Modelle in der Auswahl ausgeblendet.",
|
|
962
|
+
"urlReason": {
|
|
963
|
+
"invalid_url": "Das ist keine gültige URL.",
|
|
964
|
+
"scheme_not_allowed": "Eine Runner-URL muss mit http:// oder https:// beginnen.",
|
|
965
|
+
"credentials_not_allowed": "Eine Runner-URL darf keinen Benutzernamen und kein Passwort enthalten.",
|
|
966
|
+
"query_or_fragment_not_allowed": "Gib nur die Basis-URL ein, ohne \"?\"-Abfrage und ohne \"#\"-Fragment.",
|
|
967
|
+
"host_not_loopback": "Diese Installation erreicht nur Runner auf ihrem eigenen Rechner (localhost). Bitte einen Betreiber, Runner im lokalen Netzwerk zu erlauben.",
|
|
968
|
+
"host_not_local": "Ein Runner muss auf deinem eigenen Rechner oder in deinem lokalen Netzwerk laufen. Öffentliche Hosts sind nicht erlaubt."
|
|
960
969
|
}
|
|
961
970
|
},
|
|
962
971
|
"modelPolicy": {
|
|
@@ -2587,16 +2596,25 @@
|
|
|
2587
2596
|
"addFailedTitle": "Wiederkehrende Pipeline konnte nicht hinzugefügt werden",
|
|
2588
2597
|
"onDemand": "On-Demand (nur manuell)",
|
|
2589
2598
|
"onDemandHint": "Läuft nur, wenn Sie ihn auslösen, ohne Zeitplan. Da Sie jedes Mal anwesend sind, kann seine Aufgabe ein Modell mit individueller Nutzung verwenden.",
|
|
2599
|
+
"onDemandLockedHint": "Fest aktiviert: Ein per Tracker ausgelöster Zeitplan wird von Webhooks gesteuert und hat daher keinen eigenen Rhythmus.",
|
|
2590
2600
|
"intake": "Issue-Aufnahme",
|
|
2591
2601
|
"intakeHint": "Jeder Lauf wählt ein passendes offenes Issue aus dem Tracker und bearbeitet es von Anfang bis Ende.",
|
|
2592
2602
|
"intakeNoSources": "Verbinden Sie zuerst eine Task-Quelle, um Issues daraus zu ziehen.",
|
|
2593
2603
|
"intakeGithubRepo": "Repository",
|
|
2604
|
+
"intakeBoardId": "Board-ID",
|
|
2605
|
+
"intakeBoardIdHelp": "Das Board, Projekt oder die Warteschlange, auf die dieser Tracker die Aufnahme eingrenzt. Das Format gibt der Tracker vor.",
|
|
2606
|
+
"trackerTrigger": "Läufe durch Tracker-Webhooks starten",
|
|
2607
|
+
"trackerTriggerHint": "Ein Ticket, das den Filtern unten entspricht, wird als eigene Aufgabe importiert und auf dieser Pipeline ausgeführt. Erfordert einen bedarfsgesteuerten Zeitplan.",
|
|
2608
|
+
"intakeDispatchQueueHint": "Ein passendes Ereignis startet diesen Zeitplan, der das älteste passende Ticket des Boards übernimmt. Geeignet für einen Rückstand, bei dem die Plattform entscheidet, was als Nächstes bearbeitet wird.",
|
|
2609
|
+
"intakeDispatchPerTicketHint": "Ein passendes Ereignis importiert genau dieses Ticket als eigene Aufgabe und führt die Pipeline darauf aus. Geeignet für bereits gesichtete Tickets.",
|
|
2594
2610
|
"intakeTitleFragment": "Titel enthält",
|
|
2595
2611
|
"intakeTitleFragmentPlaceholder": "z. B. crash",
|
|
2596
2612
|
"intakeLabels": "Labels",
|
|
2597
2613
|
"intakeLabelsPlaceholder": "durch Komma getrennt",
|
|
2598
2614
|
"intakeIssueType": "Issue-Typ",
|
|
2599
|
-
"intakeInProgressLabel": "In-Bearbeitung-Label"
|
|
2615
|
+
"intakeInProgressLabel": "In-Bearbeitung-Label",
|
|
2616
|
+
"refusalPerTicketRequiresOnDemand": "Ein per Tracker ausgelöster Zeitplan muss bedarfsgesteuert sein. Ein Rhythmus-Tick enthält kein Ticket, das übergeben werden könnte.",
|
|
2617
|
+
"refusalPerTicketConflictsWithBugIntake": "Diese Pipeline wählt ihr Issue selbst vom Board und kann daher nicht zusätzlich von einem eingehenden Ticket gesteuert werden. Wählen Sie eine Pipeline ohne Bug-Intake-Schritt."
|
|
2600
2618
|
},
|
|
2601
2619
|
"failure": {
|
|
2602
2620
|
"containerFailedToStart": "Container konnte nicht gestartet werden",
|
package/i18n/locales/en.json
CHANGED
|
@@ -362,16 +362,25 @@
|
|
|
362
362
|
"addFailedTitle": "Could not add recurring pipeline",
|
|
363
363
|
"onDemand": "On-demand (manual only)",
|
|
364
364
|
"onDemandHint": "Runs only when you trigger it, with no schedule. Because you are present each time, its task may use an individual-usage subscription model.",
|
|
365
|
+
"onDemandLockedHint": "Locked on: a tracker-triggered schedule is driven by webhooks, so it has no cadence of its own.",
|
|
365
366
|
"intake": "Issue intake",
|
|
366
367
|
"intakeHint": "Each run picks one matching open issue from the tracker and works it end to end.",
|
|
367
368
|
"intakeNoSources": "Connect a task source first to pull issues from it.",
|
|
368
369
|
"intakeGithubRepo": "Repository",
|
|
370
|
+
"intakeBoardId": "Board id",
|
|
371
|
+
"intakeBoardIdHelp": "The board, project or queue this tracker scopes intake to. Its format is defined by the tracker.",
|
|
372
|
+
"trackerTrigger": "Start runs from tracker webhooks",
|
|
373
|
+
"trackerTriggerHint": "A ticket matching the filters below is imported as its own task and run on this pipeline. Needs an on-demand schedule.",
|
|
374
|
+
"intakeDispatchQueueHint": "A matching event starts this schedule, which picks up the oldest matching issue on the board. Use this for a backlog, where the platform decides what is worked next.",
|
|
375
|
+
"intakeDispatchPerTicketHint": "A matching event imports that ticket as its own task and runs the pipeline on it. Use this for tickets someone has already triaged.",
|
|
369
376
|
"intakeTitleFragment": "Title contains",
|
|
370
377
|
"intakeTitleFragmentPlaceholder": "e.g. crash",
|
|
371
378
|
"intakeLabels": "Labels",
|
|
372
379
|
"intakeLabelsPlaceholder": "comma-separated",
|
|
373
380
|
"intakeIssueType": "Issue type",
|
|
374
|
-
"intakeInProgressLabel": "In-progress label"
|
|
381
|
+
"intakeInProgressLabel": "In-progress label",
|
|
382
|
+
"refusalPerTicketRequiresOnDemand": "A tracker-triggered schedule must be on-demand. A cadence tick carries no ticket to dispatch.",
|
|
383
|
+
"refusalPerTicketConflictsWithBugIntake": "This pipeline picks its own issue from the board, so it cannot also be driven by a pushed ticket. Choose a pipeline without a bug-intake step."
|
|
375
384
|
},
|
|
376
385
|
"failure": {
|
|
377
386
|
"containerFailedToStart": "Container failed to start",
|
|
@@ -3333,6 +3342,15 @@
|
|
|
3333
3342
|
"confirmRemove": {
|
|
3334
3343
|
"title": "Remove this runner?",
|
|
3335
3344
|
"body": "\"{name}\" will be removed. This can't be undone."
|
|
3345
|
+
},
|
|
3346
|
+
"blocked": "This runner's URL is not allowed on this deployment, so its models are hidden from the picker.",
|
|
3347
|
+
"urlReason": {
|
|
3348
|
+
"invalid_url": "That is not a valid URL.",
|
|
3349
|
+
"scheme_not_allowed": "A runner URL must start with http:// or https://.",
|
|
3350
|
+
"credentials_not_allowed": "A runner URL must not contain a username or password.",
|
|
3351
|
+
"query_or_fragment_not_allowed": "Enter the base URL only, with no \"?\" query and no \"#\" fragment.",
|
|
3352
|
+
"host_not_loopback": "This deployment only reaches runners on its own machine (localhost). Ask an operator to allow local-network runners.",
|
|
3353
|
+
"host_not_local": "A runner must be on your own machine or your local network. Public hosts are not allowed."
|
|
3336
3354
|
}
|
|
3337
3355
|
},
|
|
3338
3356
|
"modelPolicy": {
|
package/i18n/locales/es.json
CHANGED
|
@@ -332,16 +332,25 @@
|
|
|
332
332
|
"addFailedTitle": "No se pudo añadir la pipeline recurrente",
|
|
333
333
|
"onDemand": "Bajo demanda (solo manual)",
|
|
334
334
|
"onDemandHint": "Se ejecuta solo cuando lo activas, sin programación. Como estás presente cada vez, su tarea puede usar un modelo de suscripción de uso individual.",
|
|
335
|
+
"onDemandLockedHint": "Fijado: una programación activada por el rastreador se controla mediante webhooks, así que no tiene cadencia propia.",
|
|
335
336
|
"intake": "Admisión de incidencias",
|
|
336
337
|
"intakeHint": "Cada ejecución toma una incidencia abierta que coincide del rastreador y la resuelve de principio a fin.",
|
|
337
338
|
"intakeNoSources": "Primero conecta una fuente de tareas para extraer incidencias de ella.",
|
|
338
339
|
"intakeGithubRepo": "Repositorio",
|
|
340
|
+
"intakeBoardId": "ID del tablero",
|
|
341
|
+
"intakeBoardIdHelp": "El tablero, proyecto o cola al que este rastreador limita la admisión. El formato lo define el rastreador.",
|
|
342
|
+
"trackerTrigger": "Iniciar ejecuciones desde webhooks del rastreador",
|
|
343
|
+
"trackerTriggerHint": "Una incidencia que coincida con los filtros de abajo se importa como su propia tarea y se ejecuta en esta canalización. Requiere una programación bajo demanda.",
|
|
344
|
+
"intakeDispatchQueueHint": "Un evento coincidente inicia esta programación, que toma la incidencia coincidente más antigua del tablero. Úsalo para una lista pendiente, donde la plataforma decide qué se trabaja a continuación.",
|
|
345
|
+
"intakeDispatchPerTicketHint": "Un evento coincidente importa esa incidencia como su propia tarea y ejecuta la canalización sobre ella. Úsalo para incidencias que alguien ya ha clasificado.",
|
|
339
346
|
"intakeTitleFragment": "El título contiene",
|
|
340
347
|
"intakeTitleFragmentPlaceholder": "p. ej. crash",
|
|
341
348
|
"intakeLabels": "Etiquetas",
|
|
342
349
|
"intakeLabelsPlaceholder": "separadas por comas",
|
|
343
350
|
"intakeIssueType": "Tipo de incidencia",
|
|
344
|
-
"intakeInProgressLabel": "Etiqueta de en progreso"
|
|
351
|
+
"intakeInProgressLabel": "Etiqueta de en progreso",
|
|
352
|
+
"refusalPerTicketRequiresOnDemand": "Una programación activada por el rastreador debe ser bajo demanda. Un ciclo de cadencia no lleva ningún ticket que despachar.",
|
|
353
|
+
"refusalPerTicketConflictsWithBugIntake": "Esta canalización elige su propia incidencia del tablero, así que no puede además activarse con un ticket entrante. Elija una canalización sin paso de admisión de errores."
|
|
345
354
|
},
|
|
346
355
|
"failure": {
|
|
347
356
|
"containerFailedToStart": "El contenedor no pudo iniciarse",
|
|
@@ -3098,6 +3107,15 @@
|
|
|
3098
3107
|
"confirmRemove": {
|
|
3099
3108
|
"title": "¿Quitar este runner?",
|
|
3100
3109
|
"body": "Se eliminará \"{name}\". Esta acción no se puede deshacer."
|
|
3110
|
+
},
|
|
3111
|
+
"blocked": "La URL de este runner no está permitida en esta instalación, por lo que sus modelos están ocultos en el selector.",
|
|
3112
|
+
"urlReason": {
|
|
3113
|
+
"invalid_url": "Esa URL no es válida.",
|
|
3114
|
+
"scheme_not_allowed": "La URL de un runner debe empezar por http:// o https://.",
|
|
3115
|
+
"credentials_not_allowed": "La URL de un runner no puede contener usuario ni contraseña.",
|
|
3116
|
+
"query_or_fragment_not_allowed": "Introduce solo la URL base, sin consulta \"?\" ni fragmento \"#\".",
|
|
3117
|
+
"host_not_loopback": "Esta instalación solo alcanza runners en su propia máquina (localhost). Pide a un operador que permita runners de la red local.",
|
|
3118
|
+
"host_not_local": "Un runner debe estar en tu propia máquina o en tu red local. No se permiten hosts públicos."
|
|
3101
3119
|
}
|
|
3102
3120
|
},
|
|
3103
3121
|
"infrastructure": {
|
package/i18n/locales/fr.json
CHANGED
|
@@ -332,16 +332,25 @@
|
|
|
332
332
|
"addFailedTitle": "Impossible d’ajouter la pipeline récurrente",
|
|
333
333
|
"onDemand": "À la demande (manuel uniquement)",
|
|
334
334
|
"onDemandHint": "Ne s'exécute que lorsque vous le déclenchez, sans planification. Comme vous êtes présent à chaque fois, sa tâche peut utiliser un modèle d'abonnement à usage individuel.",
|
|
335
|
+
"onDemandLockedHint": "Verrouillé : une planification déclenchée par le traqueur est pilotée par des webhooks, elle n'a donc pas de cadence propre.",
|
|
335
336
|
"intake": "Prise en charge des tickets",
|
|
336
337
|
"intakeHint": "Chaque exécution sélectionne un ticket ouvert correspondant dans le suivi et le traite de bout en bout.",
|
|
337
338
|
"intakeNoSources": "Connectez d'abord une source de tâches pour en extraire des tickets.",
|
|
338
339
|
"intakeGithubRepo": "Dépôt",
|
|
340
|
+
"intakeBoardId": "ID du tableau",
|
|
341
|
+
"intakeBoardIdHelp": "Le tableau, projet ou file d’attente auquel ce traqueur limite la prise en charge. Son format est défini par le traqueur.",
|
|
342
|
+
"trackerTrigger": "Lancer des exécutions depuis les webhooks du traqueur",
|
|
343
|
+
"trackerTriggerHint": "Un ticket correspondant aux filtres ci-dessous est importé comme tâche à part entière et exécuté sur ce pipeline. Nécessite une planification à la demande.",
|
|
344
|
+
"intakeDispatchQueueHint": "Un événement correspondant démarre cette planification, qui prend le ticket correspondant le plus ancien du tableau. À utiliser pour un arriéré, où la plateforme décide de la prochaine tâche.",
|
|
345
|
+
"intakeDispatchPerTicketHint": "Un événement correspondant importe ce ticket comme tâche à part entière et y exécute le pipeline. À utiliser pour les tickets déjà triés par quelqu’un.",
|
|
339
346
|
"intakeTitleFragment": "Le titre contient",
|
|
340
347
|
"intakeTitleFragmentPlaceholder": "ex. crash",
|
|
341
348
|
"intakeLabels": "Étiquettes",
|
|
342
349
|
"intakeLabelsPlaceholder": "séparées par des virgules",
|
|
343
350
|
"intakeIssueType": "Type de ticket",
|
|
344
|
-
"intakeInProgressLabel": "Étiquette en cours"
|
|
351
|
+
"intakeInProgressLabel": "Étiquette en cours",
|
|
352
|
+
"refusalPerTicketRequiresOnDemand": "Une planification déclenchée par le traqueur doit être à la demande. Un cycle de cadence ne porte aucun ticket à répartir.",
|
|
353
|
+
"refusalPerTicketConflictsWithBugIntake": "Ce pipeline choisit lui-même son ticket sur le tableau : il ne peut pas être piloté en plus par un ticket entrant. Choisissez un pipeline sans étape de collecte de bogues."
|
|
345
354
|
},
|
|
346
355
|
"failure": {
|
|
347
356
|
"containerFailedToStart": "Le conteneur n’a pas pu démarrer",
|
|
@@ -3098,6 +3107,15 @@
|
|
|
3098
3107
|
"confirmRemove": {
|
|
3099
3108
|
"title": "Supprimer ce runner ?",
|
|
3100
3109
|
"body": "\"{name}\" sera supprimé. Cette action est irréversible."
|
|
3110
|
+
},
|
|
3111
|
+
"blocked": "L'URL de ce runner n'est pas autorisée sur ce déploiement, ses modèles sont donc masqués dans le sélecteur.",
|
|
3112
|
+
"urlReason": {
|
|
3113
|
+
"invalid_url": "Cette URL n'est pas valide.",
|
|
3114
|
+
"scheme_not_allowed": "L'URL d'un runner doit commencer par http:// ou https://.",
|
|
3115
|
+
"credentials_not_allowed": "L'URL d'un runner ne doit contenir ni identifiant ni mot de passe.",
|
|
3116
|
+
"query_or_fragment_not_allowed": "Saisissez uniquement l'URL de base, sans requête \"?\" ni fragment \"#\".",
|
|
3117
|
+
"host_not_loopback": "Ce déploiement n'atteint que les runners de sa propre machine (localhost). Demandez à un opérateur d'autoriser les runners du réseau local.",
|
|
3118
|
+
"host_not_local": "Un runner doit se trouver sur votre machine ou sur votre réseau local. Les hôtes publics ne sont pas autorisés."
|
|
3101
3119
|
}
|
|
3102
3120
|
},
|
|
3103
3121
|
"infrastructure": {
|
package/i18n/locales/he.json
CHANGED
|
@@ -332,16 +332,25 @@
|
|
|
332
332
|
"addFailedTitle": "לא ניתן היה להוסיף צינור מחזורי",
|
|
333
333
|
"onDemand": "לפי דרישה (ידני בלבד)",
|
|
334
334
|
"onDemandHint": "רץ רק כשאתה מפעיל אותו, ללא תזמון. מכיוון שאתה נוכח בכל פעם, המשימה יכולה להשתמש במודל מנוי לשימוש אישי.",
|
|
335
|
+
"onDemandLockedHint": "נעול: תזמון המופעל ממערכת המעקב מונע על ידי וובהוקים, ולכן אין לו קצב משלו.",
|
|
335
336
|
"intake": "קליטת תקלות",
|
|
336
337
|
"intakeHint": "כל הרצה בוחרת תקלה פתוחה תואמת אחת מהמעקב ומטפלת בה מקצה לקצה.",
|
|
337
338
|
"intakeNoSources": "חבר תחילה מקור משימות כדי למשוך ממנו תקלות.",
|
|
338
339
|
"intakeGithubRepo": "מאגר",
|
|
340
|
+
"intakeBoardId": "מזהה לוח",
|
|
341
|
+
"intakeBoardIdHelp": "הלוח, הפרויקט או התור שאליהם מערכת המעקב מגבילה את הקליטה. התבנית נקבעת על ידי מערכת המעקב.",
|
|
342
|
+
"trackerTrigger": "להתחיל הרצות מ-webhooks של מערכת המעקב",
|
|
343
|
+
"trackerTriggerHint": "פנייה שתואמת את המסננים שלמטה מיובאת כמשימה נפרדת ומורצת בצינור הזה. נדרש תזמון לפי דרישה.",
|
|
344
|
+
"intakeDispatchQueueHint": "אירוע מתאים מפעיל את התזמון הזה, שלוקח את הפנייה המתאימה הוותיקה ביותר בלוח. מתאים למצבור משימות, שבו הפלטפורמה מחליטה במה לטפל הלאה.",
|
|
345
|
+
"intakeDispatchPerTicketHint": "אירוע מתאים מייבא את אותה פנייה כמשימה נפרדת ומריץ עליה את הצינור. מתאים לפניות שכבר מוינו על ידי אדם.",
|
|
339
346
|
"intakeTitleFragment": "הכותרת מכילה",
|
|
340
347
|
"intakeTitleFragmentPlaceholder": "למשל crash",
|
|
341
348
|
"intakeLabels": "תוויות",
|
|
342
349
|
"intakeLabelsPlaceholder": "מופרדות בפסיקים",
|
|
343
350
|
"intakeIssueType": "סוג תקלה",
|
|
344
|
-
"intakeInProgressLabel": "תווית בתהליך"
|
|
351
|
+
"intakeInProgressLabel": "תווית בתהליך",
|
|
352
|
+
"refusalPerTicketRequiresOnDemand": "תזמון המופעל ממערכת המעקב חייב להיות לפי דרישה. פעימת קצב אינה נושאת כרטיס לשיגור.",
|
|
353
|
+
"refusalPerTicketConflictsWithBugIntake": "צינור זה בוחר בעצמו את הנושא מהלוח, ולכן אינו יכול להיות מונע גם מכרטיס נכנס. בחרו צינור ללא שלב bug-intake."
|
|
345
354
|
},
|
|
346
355
|
"failure": {
|
|
347
356
|
"containerFailedToStart": "מכל הקונטיינר נכשל בהפעלה",
|
|
@@ -3238,6 +3247,15 @@
|
|
|
3238
3247
|
"confirmRemove": {
|
|
3239
3248
|
"title": "להסיר את ה־runner הזה?",
|
|
3240
3249
|
"body": "\"{name}\" יימחק. לא ניתן לבטל פעולה זו."
|
|
3250
|
+
},
|
|
3251
|
+
"blocked": "כתובת ה-URL של מריץ זה אינה מותרת בפריסה הזו, ולכן הדגמים שלו מוסתרים מהבורר.",
|
|
3252
|
+
"urlReason": {
|
|
3253
|
+
"invalid_url": "זו אינה כתובת URL תקפה.",
|
|
3254
|
+
"scheme_not_allowed": "כתובת URL של מריץ חייבת להתחיל ב-http:// או ב-https://.",
|
|
3255
|
+
"credentials_not_allowed": "כתובת URL של מריץ אינה יכולה להכיל שם משתמש או סיסמה.",
|
|
3256
|
+
"query_or_fragment_not_allowed": "הזן רק את כתובת הבסיס, בלי שאילתת \"?\" ובלי מקטע \"#\".",
|
|
3257
|
+
"host_not_loopback": "פריסה זו מגיעה רק למריצים על המכונה שלה עצמה (localhost). בקש ממפעיל לאפשר מריצים ברשת המקומית.",
|
|
3258
|
+
"host_not_local": "מריץ חייב להיות על המכונה שלך או ברשת המקומית שלך. מאחסנים ציבוריים אינם מותרים."
|
|
3241
3259
|
}
|
|
3242
3260
|
},
|
|
3243
3261
|
"modelPolicy": {
|
package/i18n/locales/it.json
CHANGED
|
@@ -957,6 +957,15 @@
|
|
|
957
957
|
"confirmRemove": {
|
|
958
958
|
"title": "Rimuovere questo runner?",
|
|
959
959
|
"body": "\"{name}\" verra rimosso. Questa operazione non puo essere annullata."
|
|
960
|
+
},
|
|
961
|
+
"blocked": "L'URL di questo runner non è consentito su questo deployment, quindi i suoi modelli sono nascosti nel selettore.",
|
|
962
|
+
"urlReason": {
|
|
963
|
+
"invalid_url": "Questo URL non è valido.",
|
|
964
|
+
"scheme_not_allowed": "L'URL di un runner deve iniziare con http:// o https://.",
|
|
965
|
+
"credentials_not_allowed": "L'URL di un runner non può contenere nome utente o password.",
|
|
966
|
+
"query_or_fragment_not_allowed": "Inserisci solo l'URL di base, senza query \"?\" né frammento \"#\".",
|
|
967
|
+
"host_not_loopback": "Questo deployment raggiunge solo runner sulla propria macchina (localhost). Chiedi a un operatore di consentire i runner della rete locale.",
|
|
968
|
+
"host_not_local": "Un runner deve essere sulla tua macchina o nella tua rete locale. Gli host pubblici non sono consentiti."
|
|
960
969
|
}
|
|
961
970
|
},
|
|
962
971
|
"modelPolicy": {
|
|
@@ -2587,16 +2596,25 @@
|
|
|
2587
2596
|
"addFailedTitle": "Impossibile aggiungere la pipeline ricorrente",
|
|
2588
2597
|
"onDemand": "Su richiesta (solo manuale)",
|
|
2589
2598
|
"onDemandHint": "Viene eseguita solo quando la attivi tu, senza pianificazione. Poiché sei presente ogni volta, la sua attività può usare un modello con abbonamento a uso individuale.",
|
|
2599
|
+
"onDemandLockedHint": "Bloccato: una pianificazione attivata dal tracker è guidata dai webhook, quindi non ha una cadenza propria.",
|
|
2590
2600
|
"intake": "Acquisizione issue",
|
|
2591
2601
|
"intakeHint": "Ogni esecuzione seleziona una issue aperta corrispondente dal tracker e la porta a termine dall'inizio alla fine.",
|
|
2592
2602
|
"intakeNoSources": "Connetti prima una sorgente di attività per estrarne le issue.",
|
|
2593
2603
|
"intakeGithubRepo": "Repository",
|
|
2604
|
+
"intakeBoardId": "ID della board",
|
|
2605
|
+
"intakeBoardIdHelp": "La board, il progetto o la coda a cui questo tracker limita l’acquisizione. Il formato è definito dal tracker.",
|
|
2606
|
+
"trackerTrigger": "Avvia esecuzioni dai webhook del tracker",
|
|
2607
|
+
"trackerTriggerHint": "Un ticket che corrisponde ai filtri qui sotto viene importato come attività a sé e eseguito su questa pipeline. Richiede una pianificazione su richiesta.",
|
|
2608
|
+
"intakeDispatchQueueHint": "Un evento corrispondente avvia questa pianificazione, che prende il ticket corrispondente più vecchio della board. Utile per un arretrato, dove è la piattaforma a decidere cosa lavorare per primo.",
|
|
2609
|
+
"intakeDispatchPerTicketHint": "Un evento corrispondente importa quel ticket come attività a sé e vi esegue la pipeline. Utile per i ticket già selezionati da una persona.",
|
|
2594
2610
|
"intakeTitleFragment": "Il titolo contiene",
|
|
2595
2611
|
"intakeTitleFragmentPlaceholder": "es. crash",
|
|
2596
2612
|
"intakeLabels": "Etichette",
|
|
2597
2613
|
"intakeLabelsPlaceholder": "separate da virgole",
|
|
2598
2614
|
"intakeIssueType": "Tipo di issue",
|
|
2599
|
-
"intakeInProgressLabel": "Etichetta in corso"
|
|
2615
|
+
"intakeInProgressLabel": "Etichetta in corso",
|
|
2616
|
+
"refusalPerTicketRequiresOnDemand": "Una pianificazione attivata dal tracker deve essere su richiesta. Un ciclo a cadenza non porta con sé alcun ticket da assegnare.",
|
|
2617
|
+
"refusalPerTicketConflictsWithBugIntake": "Questa pipeline sceglie da sola il proprio problema dalla bacheca, quindi non può essere guidata anche da un ticket in arrivo. Scegli una pipeline senza passaggio di raccolta bug."
|
|
2600
2618
|
},
|
|
2601
2619
|
"failure": {
|
|
2602
2620
|
"containerFailedToStart": "Avvio del container fallito",
|
package/i18n/locales/ja.json
CHANGED
|
@@ -332,16 +332,25 @@
|
|
|
332
332
|
"addFailedTitle": "繰り返しパイプラインを追加できませんでした",
|
|
333
333
|
"onDemand": "オンデマンド(手動のみ)",
|
|
334
334
|
"onDemandHint": "スケジュールはなく、手動で実行したときのみ動作します。毎回ユーザーが立ち会うため、タスクは個人利用のサブスクリプションモデルを使用できます。",
|
|
335
|
+
"onDemandLockedHint": "固定されています。トラッカー起動のスケジュールは Webhook で駆動されるため、独自の実行間隔を持ちません。",
|
|
335
336
|
"intake": "課題の取り込み",
|
|
336
337
|
"intakeHint": "各実行はトラッカーから条件に一致する未解決の課題を1件選び、最後まで対応します。",
|
|
337
338
|
"intakeNoSources": "課題を取り込むには、まずタスクソースを接続してください。",
|
|
338
339
|
"intakeGithubRepo": "リポジトリ",
|
|
340
|
+
"intakeBoardId": "ボード ID",
|
|
341
|
+
"intakeBoardIdHelp": "このトラッカーが取り込み対象とするボード、プロジェクト、またはキュー。形式はトラッカーが定めます。",
|
|
342
|
+
"trackerTrigger": "トラッカーの Webhook から実行を開始",
|
|
343
|
+
"trackerTriggerHint": "下のフィルターに一致するチケットを独立したタスクとして取り込み、このパイプラインで実行します。オンデマンドのスケジュールが必要です。",
|
|
344
|
+
"intakeDispatchQueueHint": "該当するイベントがこのスケジュールを開始し、ボード上で最も古い該当チケットを取り上げます。次に何を扱うかをプラットフォームが決めるバックログ向けです。",
|
|
345
|
+
"intakeDispatchPerTicketHint": "該当するイベントがそのチケットを独立したタスクとして取り込み、パイプラインを実行します。すでにトリアージ済みのチケット向けです。",
|
|
339
346
|
"intakeTitleFragment": "タイトルに含む",
|
|
340
347
|
"intakeTitleFragmentPlaceholder": "例: crash",
|
|
341
348
|
"intakeLabels": "ラベル",
|
|
342
349
|
"intakeLabelsPlaceholder": "カンマ区切り",
|
|
343
350
|
"intakeIssueType": "課題タイプ",
|
|
344
|
-
"intakeInProgressLabel": "進行中ラベル"
|
|
351
|
+
"intakeInProgressLabel": "進行中ラベル",
|
|
352
|
+
"refusalPerTicketRequiresOnDemand": "トラッカー起動のスケジュールはオンデマンドである必要があります。定期実行のタイミングには、割り当てるチケットがありません。",
|
|
353
|
+
"refusalPerTicketConflictsWithBugIntake": "このパイプラインはボードから自分で課題を選ぶため、送信されたチケットで駆動することはできません。bug-intake ステップのないパイプラインを選んでください。"
|
|
345
354
|
},
|
|
346
355
|
"failure": {
|
|
347
356
|
"containerFailedToStart": "コンテナの起動に失敗しました",
|
|
@@ -3239,6 +3248,15 @@
|
|
|
3239
3248
|
"confirmRemove": {
|
|
3240
3249
|
"title": "このランナーを削除しますか?",
|
|
3241
3250
|
"body": "「{name}」が削除されます。 この操作は取り消せません。"
|
|
3251
|
+
},
|
|
3252
|
+
"blocked": "このランナーの URL はこのデプロイでは許可されていないため、モデルはピッカーに表示されません。",
|
|
3253
|
+
"urlReason": {
|
|
3254
|
+
"invalid_url": "有効な URL ではありません。",
|
|
3255
|
+
"scheme_not_allowed": "ランナーの URL は http:// または https:// で始める必要があります。",
|
|
3256
|
+
"credentials_not_allowed": "ランナーの URL にユーザー名やパスワードを含めることはできません。",
|
|
3257
|
+
"query_or_fragment_not_allowed": "ベース URL のみを入力してください。「?」クエリと「#」フラグメントは使用できません。",
|
|
3258
|
+
"host_not_loopback": "このデプロイは自身のマシン (localhost) 上のランナーにのみ接続します。ローカルネットワークのランナーを許可するには運用者に依頼してください。",
|
|
3259
|
+
"host_not_local": "ランナーは自分のマシンかローカルネットワーク上にある必要があります。公開ホストは許可されていません。"
|
|
3242
3260
|
}
|
|
3243
3261
|
},
|
|
3244
3262
|
"modelPolicy": {
|
package/i18n/locales/pl.json
CHANGED
|
@@ -332,16 +332,25 @@
|
|
|
332
332
|
"addFailedTitle": "Nie udało się dodać cyklicznego pipeline’u",
|
|
333
333
|
"onDemand": "Na żądanie (tylko ręcznie)",
|
|
334
334
|
"onDemandHint": "Uruchamia się tylko po ręcznym wyzwoleniu, bez harmonogramu. Ponieważ za każdym razem jesteś obecny, jego zadanie może korzystać z modelu subskrypcji do użytku indywidualnego.",
|
|
335
|
+
"onDemandLockedHint": "Zablokowane: harmonogram wyzwalany przez tracker jest sterowany webhookami, więc nie ma własnego cyklu.",
|
|
335
336
|
"intake": "Pobieranie zgłoszeń",
|
|
336
337
|
"intakeHint": "Każde uruchomienie wybiera jedno pasujące otwarte zgłoszenie z trackera i realizuje je od początku do końca.",
|
|
337
338
|
"intakeNoSources": "Najpierw połącz źródło zadań, aby pobierać z niego zgłoszenia.",
|
|
338
339
|
"intakeGithubRepo": "Repozytorium",
|
|
340
|
+
"intakeBoardId": "ID tablicy",
|
|
341
|
+
"intakeBoardIdHelp": "Tablica, projekt lub kolejka, do której ten tracker ogranicza pozyskiwanie. Format określa tracker.",
|
|
342
|
+
"trackerTrigger": "Uruchamiaj przebiegi z webhooków trackera",
|
|
343
|
+
"trackerTriggerHint": "Zgłoszenie pasujące do poniższych filtrów jest importowane jako osobne zadanie i uruchamiane w tym potoku. Wymaga harmonogramu na żądanie.",
|
|
344
|
+
"intakeDispatchQueueHint": "Pasujące zdarzenie uruchamia ten harmonogram, który pobiera najstarsze pasujące zgłoszenie z tablicy. Nadaje się do zaległości, gdzie o kolejności decyduje platforma.",
|
|
345
|
+
"intakeDispatchPerTicketHint": "Pasujące zdarzenie importuje to zgłoszenie jako osobne zadanie i uruchamia na nim potok. Nadaje się do zgłoszeń już przejrzanych przez człowieka.",
|
|
339
346
|
"intakeTitleFragment": "Tytuł zawiera",
|
|
340
347
|
"intakeTitleFragmentPlaceholder": "np. crash",
|
|
341
348
|
"intakeLabels": "Etykiety",
|
|
342
349
|
"intakeLabelsPlaceholder": "oddzielone przecinkami",
|
|
343
350
|
"intakeIssueType": "Typ zgłoszenia",
|
|
344
|
-
"intakeInProgressLabel": "Etykieta w toku"
|
|
351
|
+
"intakeInProgressLabel": "Etykieta w toku",
|
|
352
|
+
"refusalPerTicketRequiresOnDemand": "Harmonogram wyzwalany przez tracker musi być na żądanie. Takt cyklu nie niesie ze sobą żadnego zgłoszenia do przekazania.",
|
|
353
|
+
"refusalPerTicketConflictsWithBugIntake": "Ten potok sam wybiera zgłoszenie z tablicy, więc nie może być dodatkowo sterowany przesłanym zgłoszeniem. Wybierz potok bez kroku bug-intake."
|
|
345
354
|
},
|
|
346
355
|
"failure": {
|
|
347
356
|
"containerFailedToStart": "Nie udało się uruchomić kontenera",
|
|
@@ -3098,6 +3107,15 @@
|
|
|
3098
3107
|
"confirmRemove": {
|
|
3099
3108
|
"title": "Usunąć ten runner?",
|
|
3100
3109
|
"body": "\"{name}\" zostanie usunięty. Tej operacji nie można cofnąć."
|
|
3110
|
+
},
|
|
3111
|
+
"blocked": "Adres URL tego runnera nie jest dozwolony w tym wdrożeniu, dlatego jego modele są ukryte w selektorze.",
|
|
3112
|
+
"urlReason": {
|
|
3113
|
+
"invalid_url": "To nie jest prawidłowy adres URL.",
|
|
3114
|
+
"scheme_not_allowed": "Adres URL runnera musi zaczynać się od http:// lub https://.",
|
|
3115
|
+
"credentials_not_allowed": "Adres URL runnera nie może zawierać nazwy użytkownika ani hasła.",
|
|
3116
|
+
"query_or_fragment_not_allowed": "Podaj tylko adres bazowy, bez zapytania \"?\" i bez fragmentu \"#\".",
|
|
3117
|
+
"host_not_loopback": "To wdrożenie łączy się tylko z runnerami na własnej maszynie (localhost). Poproś operatora o zezwolenie na runnery w sieci lokalnej.",
|
|
3118
|
+
"host_not_local": "Runner musi działać na Twojej maszynie lub w Twojej sieci lokalnej. Publiczne hosty nie są dozwolone."
|
|
3101
3119
|
}
|
|
3102
3120
|
},
|
|
3103
3121
|
"infrastructure": {
|
package/i18n/locales/tr.json
CHANGED
|
@@ -332,16 +332,25 @@
|
|
|
332
332
|
"addFailedTitle": "Yinelenen pipeline eklenemedi",
|
|
333
333
|
"onDemand": "İstek üzerine (yalnızca manuel)",
|
|
334
334
|
"onDemandHint": "Yalnızca siz tetiklediğinizde çalışır, zamanlama yoktur. Her seferinde siz hazır bulunduğunuz için görevi bireysel kullanımlı bir abonelik modeli kullanabilir.",
|
|
335
|
+
"onDemandLockedHint": "Sabitlendi: izleyici tetiklemeli bir zamanlama webhook’larla sürülür, bu yüzden kendine ait bir döngüsü yoktur.",
|
|
335
336
|
"intake": "Sorun alımı",
|
|
336
337
|
"intakeHint": "Her çalıştırma, izleyiciden eşleşen açık bir sorunu seçer ve baştan sona işler.",
|
|
337
338
|
"intakeNoSources": "Sorunları çekmek için önce bir görev kaynağı bağlayın.",
|
|
338
339
|
"intakeGithubRepo": "Depo",
|
|
340
|
+
"intakeBoardId": "Pano kimliği",
|
|
341
|
+
"intakeBoardIdHelp": "Bu izleyicinin alımı kapsamlandırdığı pano, proje veya kuyruk. Biçimini izleyici belirler.",
|
|
342
|
+
"trackerTrigger": "Çalıştırmaları izleyici webhookları ile başlat",
|
|
343
|
+
"trackerTriggerHint": "Aşağıdaki filtrelerle eşleşen bir kayıt kendi görevi olarak içe aktarılır ve bu hatta çalıştırılır. İsteğe bağlı bir zamanlama gerektirir.",
|
|
344
|
+
"intakeDispatchQueueHint": "Eşleşen bir olay bu zamanlamayı başlatır ve panodaki eşleşen en eski kaydı alır. Sıradakine platformun karar verdiği birikmiş işler için uygundur.",
|
|
345
|
+
"intakeDispatchPerTicketHint": "Eşleşen bir olay o kaydı kendi görevi olarak içe aktarır ve üzerinde hattı çalıştırır. Birinin daha önce ayıkladığı kayıtlar için uygundur.",
|
|
339
346
|
"intakeTitleFragment": "Başlık şunu içerir",
|
|
340
347
|
"intakeTitleFragmentPlaceholder": "örn. crash",
|
|
341
348
|
"intakeLabels": "Etiketler",
|
|
342
349
|
"intakeLabelsPlaceholder": "virgülle ayrılmış",
|
|
343
350
|
"intakeIssueType": "Sorun türü",
|
|
344
|
-
"intakeInProgressLabel": "Devam ediyor etiketi"
|
|
351
|
+
"intakeInProgressLabel": "Devam ediyor etiketi",
|
|
352
|
+
"refusalPerTicketRequiresOnDemand": "İzleyici tetiklemeli bir zamanlama istek üzerine olmalıdır. Döngü tikinin gönderilecek bir kaydı yoktur.",
|
|
353
|
+
"refusalPerTicketConflictsWithBugIntake": "Bu işlem hattı kendi kaydını panodan seçer, bu nedenle ayrıca gelen bir kayıtla sürülemez. Bug-intake adımı olmayan bir işlem hattı seçin."
|
|
345
354
|
},
|
|
346
355
|
"failure": {
|
|
347
356
|
"containerFailedToStart": "Konteyner başlatılamadı",
|
|
@@ -3239,6 +3248,15 @@
|
|
|
3239
3248
|
"confirmRemove": {
|
|
3240
3249
|
"title": "Bu runner kaldırılsın mı?",
|
|
3241
3250
|
"body": "\"{name}\" kaldırılacak. Bu işlem geri alınamaz."
|
|
3251
|
+
},
|
|
3252
|
+
"blocked": "Bu çalıştırıcının URL adresi bu kurulumda izinli değil, bu nedenle modelleri seçicide gizlendi.",
|
|
3253
|
+
"urlReason": {
|
|
3254
|
+
"invalid_url": "Bu geçerli bir URL değil.",
|
|
3255
|
+
"scheme_not_allowed": "Çalıştırıcı URL adresi http:// veya https:// ile başlamalıdır.",
|
|
3256
|
+
"credentials_not_allowed": "Çalıştırıcı URL adresi kullanıcı adı veya şifre içeremez.",
|
|
3257
|
+
"query_or_fragment_not_allowed": "Yalnızca temel URL adresini girin; \"?\" sorgusu ve \"#\" parçası olmadan.",
|
|
3258
|
+
"host_not_loopback": "Bu kurulum yalnızca kendi makinesindeki (localhost) çalıştırıcılara erişir. Yerel ağ çalıştırıcılarına izin vermesi için bir operatöre başvurun.",
|
|
3259
|
+
"host_not_local": "Çalıştırıcı kendi makinenizde veya yerel ağınızda olmalıdır. Genel ana makinelere izin verilmez."
|
|
3242
3260
|
}
|
|
3243
3261
|
},
|
|
3244
3262
|
"modelPolicy": {
|
package/i18n/locales/uk.json
CHANGED
|
@@ -332,16 +332,25 @@
|
|
|
332
332
|
"addFailedTitle": "Не вдалося додати періодичний конвеєр",
|
|
333
333
|
"onDemand": "За запитом (лише вручну)",
|
|
334
334
|
"onDemandHint": "Запускається лише коли ви його активуєте, без розкладу. Оскільки ви присутні щоразу, його завдання може використовувати модель підписки для індивідуального використання.",
|
|
335
|
+
"onDemandLockedHint": "Зафіксовано: розклад, запущений трекером, керується вебхуками, тому не має власної періодичності.",
|
|
335
336
|
"intake": "Приймання завдань",
|
|
336
337
|
"intakeHint": "Кожен запуск вибирає одне відкрите завдання з трекера, що відповідає умовам, і опрацьовує його від початку до кінця.",
|
|
337
338
|
"intakeNoSources": "Спочатку підключіть джерело завдань, щоб отримувати з нього завдання.",
|
|
338
339
|
"intakeGithubRepo": "Репозиторій",
|
|
340
|
+
"intakeBoardId": "ID дошки",
|
|
341
|
+
"intakeBoardIdHelp": "Дошка, проєкт або черга, якими цей трекер обмежує приймання. Формат визначає трекер.",
|
|
342
|
+
"trackerTrigger": "Запускати виконання з вебхуків трекера",
|
|
343
|
+
"trackerTriggerHint": "Звернення, що відповідає фільтрам нижче, імпортується як окреме завдання й виконується в цьому конвеєрі. Потребує розкладу на вимогу.",
|
|
344
|
+
"intakeDispatchQueueHint": "Відповідна подія запускає цей розклад, який бере найстаріше відповідне звернення з дошки. Підходить для беклогу, де платформа вирішує, що робити далі.",
|
|
345
|
+
"intakeDispatchPerTicketHint": "Відповідна подія імпортує саме це звернення як окреме завдання й виконує на ньому конвеєр. Підходить для звернень, які вже пройшли сортування.",
|
|
339
346
|
"intakeTitleFragment": "Заголовок містить",
|
|
340
347
|
"intakeTitleFragmentPlaceholder": "напр. crash",
|
|
341
348
|
"intakeLabels": "Мітки",
|
|
342
349
|
"intakeLabelsPlaceholder": "через кому",
|
|
343
350
|
"intakeIssueType": "Тип завдання",
|
|
344
|
-
"intakeInProgressLabel": "Мітка «в роботі»"
|
|
351
|
+
"intakeInProgressLabel": "Мітка «в роботі»",
|
|
352
|
+
"refusalPerTicketRequiresOnDemand": "Розклад, запущений трекером, має бути на вимогу. Спрацювання за розкладом не несе жодної заявки для передавання.",
|
|
353
|
+
"refusalPerTicketConflictsWithBugIntake": "Цей конвеєр сам обирає задачу з дошки, тож його не можна додатково запускати надісланою заявкою. Оберіть конвеєр без кроку bug-intake."
|
|
345
354
|
},
|
|
346
355
|
"failure": {
|
|
347
356
|
"containerFailedToStart": "Не вдалося запустити контейнер",
|
|
@@ -3098,6 +3107,15 @@
|
|
|
3098
3107
|
"confirmRemove": {
|
|
3099
3108
|
"title": "Прибрати цей runner?",
|
|
3100
3109
|
"body": "\"{name}\" буде видалено. Цю дію не можна скасувати."
|
|
3110
|
+
},
|
|
3111
|
+
"blocked": "URL цього раннера не дозволений у цьому розгортанні, тому його моделі приховані у виборі.",
|
|
3112
|
+
"urlReason": {
|
|
3113
|
+
"invalid_url": "Це недійсний URL.",
|
|
3114
|
+
"scheme_not_allowed": "URL раннера має починатися з http:// або https://.",
|
|
3115
|
+
"credentials_not_allowed": "URL раннера не може містити імʼя користувача або пароль.",
|
|
3116
|
+
"query_or_fragment_not_allowed": "Вкажіть лише базовий URL, без запиту \"?\" та фрагмента \"#\".",
|
|
3117
|
+
"host_not_loopback": "Це розгортання досягає лише раннерів на власній машині (localhost). Попросіть оператора дозволити раннери локальної мережі.",
|
|
3118
|
+
"host_not_local": "Раннер має бути на вашій машині або у вашій локальній мережі. Публічні хости не дозволені."
|
|
3101
3119
|
}
|
|
3102
3120
|
},
|
|
3103
3121
|
"infrastructure": {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cat-factory/app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.211.0",
|
|
4
4
|
"description": "Reusable Nuxt layer for the Agent Architecture Board SPA (components, stores, composables, pages). Consume it from a thin deployment app via `extends: ['@cat-factory/app']` and point it at your backend with NUXT_PUBLIC_API_BASE. See deploy/frontend for an example.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"valibot": "^1.4.2",
|
|
41
41
|
"vue": "3.5.40",
|
|
42
42
|
"wretch": "^3.0.9",
|
|
43
|
-
"@cat-factory/contracts": "0.
|
|
43
|
+
"@cat-factory/contracts": "0.220.0"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@toad-contracts/testing": "0.3.2",
|