@cat-factory/app 0.237.0 → 0.238.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/nodes/BlockNode.vue +33 -152
- package/app/components/context/ContextAttachmentFields.vue +9 -7
- package/app/components/documents/ContextDocumentPicker.vue +130 -12
- package/app/components/documents/TaskContextDocs.vue +18 -16
- package/app/components/panels/AgentStepDetail.vue +11 -0
- package/app/components/panels/StepToolServers.logic.spec.ts +60 -0
- package/app/components/panels/StepToolServers.logic.ts +58 -0
- package/app/components/panels/StepToolServers.vue +105 -0
- package/app/components/tasks/BugHuntModal.vue +70 -61
- package/app/components/tasks/ContextIssuePicker.vue +52 -28
- package/app/components/tasks/TaskImportModal.vue +55 -39
- package/app/composables/useContainerTargets.spec.ts +112 -0
- package/app/composables/useContainerTargets.ts +62 -0
- package/app/stores/ui/navigation.ts +8 -31
- package/app/types/toolServers.ts +2 -0
- package/app/utils/containerTargets.ts +71 -0
- package/app/utils/sourcePicker.spec.ts +258 -0
- package/app/utils/sourcePicker.ts +251 -0
- package/i18n/locales/de.json +23 -6
- package/i18n/locales/en.json +23 -6
- package/i18n/locales/es.json +23 -6
- package/i18n/locales/fr.json +23 -6
- package/i18n/locales/he.json +23 -6
- package/i18n/locales/it.json +23 -6
- package/i18n/locales/ja.json +23 -6
- package/i18n/locales/pl.json +23 -6
- package/i18n/locales/tr.json +23 -6
- package/i18n/locales/uk.json +23 -6
- package/package.json +2 -2
- package/app/utils/taskSources.spec.ts +0 -100
- package/app/utils/taskSources.ts +0 -76
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure source-selection logic shared by every surface that picks an integration source: which
|
|
3
|
+
* one is selected, what its menu offers, and how that menu renders.
|
|
4
|
+
*
|
|
5
|
+
* The menu is deliberately two-tier (pick a source the workspace already has, or go and add one)
|
|
6
|
+
* because a source-picking surface is exactly where a user discovers the source they want is
|
|
7
|
+
* missing, and sending them off to the Integrations hub loses whatever they had in progress.
|
|
8
|
+
* Today `<ContextIssuePicker>` (attach a context issue) and `<BugHuntModal>` (scan a board for
|
|
9
|
+
* bugs) render it over TRACKERS, and `<ContextDocumentPicker>` (attach a context document) over
|
|
10
|
+
* DOCUMENT sources.
|
|
11
|
+
*
|
|
12
|
+
* The two integrations describe availability differently, so each gets its own CHOICE builder and
|
|
13
|
+
* they share one RENDERER. A tracker carries `available` plus a per-workspace `enabled` toggle, so
|
|
14
|
+
* it can be connected-but-off and its add entry has to say "enable" rather than "connect"; a
|
|
15
|
+
* document source is either connected or not, so `buildConnectionSourceChoices` cannot produce an
|
|
16
|
+
* `enable` choice at all. That is a fact about its RETURN TYPE rather than a convention, which is
|
|
17
|
+
* why these are two builders instead of one taking a flag: `sourceMenuItems` derives its wording
|
|
18
|
+
* map from what the choices can actually carry, so a document surface is not asked for wording it
|
|
19
|
+
* can never use, and a document source that one day GAINS a toggle fails the typecheck at every
|
|
20
|
+
* surface that renders it.
|
|
21
|
+
*/
|
|
22
|
+
import type { DropdownMenuItem } from '@nuxt/ui'
|
|
23
|
+
|
|
24
|
+
/** What a menu needs to know about one configured source, whatever integration it belongs to. */
|
|
25
|
+
export interface SourceAvailability<S extends string> {
|
|
26
|
+
source: S
|
|
27
|
+
label: string
|
|
28
|
+
icon: string
|
|
29
|
+
/** A credential / installation is in place, so the source can be read right now. */
|
|
30
|
+
available: boolean
|
|
31
|
+
/**
|
|
32
|
+
* The workspace offers it. A tracker carries a per-workspace toggle that can be off while its
|
|
33
|
+
* credential is in place; an integration with no such toggle passes `true`.
|
|
34
|
+
*/
|
|
35
|
+
enabled: boolean
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** A source whose only state is "connected or not", with no per-workspace toggle behind it. */
|
|
39
|
+
export interface ConnectableSource<S extends string> {
|
|
40
|
+
source: S
|
|
41
|
+
label: string
|
|
42
|
+
icon: string
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** The two ways a source that is not on offer yet can be added from a menu. */
|
|
46
|
+
export type AddAction = 'connect' | 'enable'
|
|
47
|
+
|
|
48
|
+
/** A source the surface can use right now. */
|
|
49
|
+
interface SelectChoice<S extends string> {
|
|
50
|
+
action: 'select'
|
|
51
|
+
source: S
|
|
52
|
+
label: string
|
|
53
|
+
icon: string
|
|
54
|
+
active: boolean
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* A configured source that is not offered yet, so it can be added from here. `connect` has no
|
|
59
|
+
* credential/App behind it; `enable` is connected but toggled off for the workspace. Both open the
|
|
60
|
+
* same connect modal, which serves either case: only the wording differs, so the user isn't told
|
|
61
|
+
* to "connect" something already connected.
|
|
62
|
+
*/
|
|
63
|
+
interface AddChoice<S extends string, A extends AddAction> {
|
|
64
|
+
action: A
|
|
65
|
+
source: S
|
|
66
|
+
label: string
|
|
67
|
+
icon: string
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** One row of a source menu over an integration that has a per-workspace enable toggle. */
|
|
71
|
+
export type SourceChoice<S extends string> = SelectChoice<S> | AddChoice<S, AddAction>
|
|
72
|
+
|
|
73
|
+
/** One row of a source menu over an integration that is simply connected or not. */
|
|
74
|
+
export type ConnectionSourceChoice<S extends string> = SelectChoice<S> | AddChoice<S, 'connect'>
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* A source menu, as non-empty groups (the sources on offer, then the ones the user could add).
|
|
78
|
+
* Empty groups are dropped so the menu never renders a stray separator.
|
|
79
|
+
*/
|
|
80
|
+
export function buildSourceChoices<S extends string>(
|
|
81
|
+
sources: readonly SourceAvailability<S>[],
|
|
82
|
+
selected: S | undefined,
|
|
83
|
+
): SourceChoice<S>[][] {
|
|
84
|
+
const offered: SourceChoice<S>[] = []
|
|
85
|
+
const addable: SourceChoice<S>[] = []
|
|
86
|
+
for (const s of sources) {
|
|
87
|
+
if (s.available && s.enabled) {
|
|
88
|
+
offered.push({
|
|
89
|
+
action: 'select',
|
|
90
|
+
source: s.source,
|
|
91
|
+
label: s.label,
|
|
92
|
+
icon: s.icon,
|
|
93
|
+
active: s.source === selected,
|
|
94
|
+
})
|
|
95
|
+
} else {
|
|
96
|
+
addable.push({
|
|
97
|
+
action: s.available ? 'enable' : 'connect',
|
|
98
|
+
source: s.source,
|
|
99
|
+
label: s.label,
|
|
100
|
+
icon: s.icon,
|
|
101
|
+
})
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return [offered, addable].filter((group) => group.length > 0)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* The sources the acting user could add right now: those the workspace has not connected, and
|
|
109
|
+
* NONE when the integration is unavailable to this deployment or the user may not connect one.
|
|
110
|
+
*
|
|
111
|
+
* The single answer to "which document sources could I connect", so the picker's add tier and the
|
|
112
|
+
* hosts' connect shortcuts cannot drift. Both terms matter and neither implies the other: an
|
|
113
|
+
* unavailable integration has nothing to connect TO, and connecting stores a workspace credential,
|
|
114
|
+
* which is admin-tier while ATTACHING what it holds is member-tier. Offering a member an add entry
|
|
115
|
+
* would open a connect modal, take a token and 403, so what they see is what they can use.
|
|
116
|
+
*
|
|
117
|
+
* `available` is the store's probe result, so `null` (not probed yet) offers nothing: we do not know
|
|
118
|
+
* that there is anything to connect to, and a menu entry is a claim that there is.
|
|
119
|
+
*/
|
|
120
|
+
export function connectableSources<S extends string, T extends { source: S }>(
|
|
121
|
+
sources: readonly T[],
|
|
122
|
+
opts: { isConnected: (source: S) => boolean; canConnect: boolean; available: boolean | null },
|
|
123
|
+
): T[] {
|
|
124
|
+
if (opts.available !== true || !opts.canConnect) return []
|
|
125
|
+
return sources.filter((s) => !opts.isConnected(s.source))
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* A source menu for an integration that is either connected or not (document sources). Same two
|
|
130
|
+
* groups as {@link buildSourceChoices}, but the add tier can only ever be `connect`.
|
|
131
|
+
*/
|
|
132
|
+
export function buildConnectionSourceChoices<S extends string>(
|
|
133
|
+
sources: readonly ConnectableSource<S>[],
|
|
134
|
+
opts: {
|
|
135
|
+
isConnected: (source: S) => boolean
|
|
136
|
+
canConnect: boolean
|
|
137
|
+
available: boolean | null
|
|
138
|
+
selected: S | undefined
|
|
139
|
+
},
|
|
140
|
+
): ConnectionSourceChoice<S>[][] {
|
|
141
|
+
const connected: ConnectionSourceChoice<S>[] = sources
|
|
142
|
+
.filter((s) => opts.isConnected(s.source))
|
|
143
|
+
.map((s) => ({
|
|
144
|
+
action: 'select',
|
|
145
|
+
source: s.source,
|
|
146
|
+
label: s.label,
|
|
147
|
+
icon: s.icon,
|
|
148
|
+
active: s.source === opts.selected,
|
|
149
|
+
}))
|
|
150
|
+
const addable: ConnectionSourceChoice<S>[] = connectableSources(sources, opts).map((s) => ({
|
|
151
|
+
action: 'connect',
|
|
152
|
+
source: s.source,
|
|
153
|
+
label: s.label,
|
|
154
|
+
icon: s.icon,
|
|
155
|
+
}))
|
|
156
|
+
return [connected, addable].filter((group) => group.length > 0)
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Wording for each way a source can be ADDED, as an exhaustive `Record` over exactly the add
|
|
161
|
+
* actions the menu's own choices can carry. A tracker surface owes both spellings; a document
|
|
162
|
+
* surface owes only `connect`, and gains a typecheck failure rather than the wrong wording if that
|
|
163
|
+
* ever stops being true.
|
|
164
|
+
*/
|
|
165
|
+
export type AddSourceLabels<A extends AddAction> = Record<A, (label: string) => string>
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Render source choices as dropdown items. The ONE place the two-tier menu's presentation lives:
|
|
169
|
+
* the selected source is a CHECKED item rather than one carrying a decorative glyph, so a screen
|
|
170
|
+
* reader announces which source is in use instead of just naming it, and every add entry carries
|
|
171
|
+
* the plug icon that distinguishes "go and set this up" from "use this".
|
|
172
|
+
*/
|
|
173
|
+
export function sourceMenuItems<S extends string, A extends AddAction>(
|
|
174
|
+
groups: readonly (readonly (SelectChoice<S> | AddChoice<S, A>)[])[],
|
|
175
|
+
opts: {
|
|
176
|
+
onSelect: (source: S) => void
|
|
177
|
+
onAdd: (source: S) => void
|
|
178
|
+
addLabel: AddSourceLabels<A>
|
|
179
|
+
},
|
|
180
|
+
): DropdownMenuItem[][] {
|
|
181
|
+
return groups.map((group) =>
|
|
182
|
+
group.map((choice) =>
|
|
183
|
+
isAddChoice(choice)
|
|
184
|
+
? {
|
|
185
|
+
label: opts.addLabel[choice.action](choice.label),
|
|
186
|
+
icon: 'i-lucide-plug',
|
|
187
|
+
onSelect: () => opts.onAdd(choice.source),
|
|
188
|
+
}
|
|
189
|
+
: {
|
|
190
|
+
label: choice.label,
|
|
191
|
+
icon: choice.icon,
|
|
192
|
+
type: 'checkbox' as const,
|
|
193
|
+
checked: choice.active,
|
|
194
|
+
onSelect: () => opts.onSelect(choice.source),
|
|
195
|
+
},
|
|
196
|
+
),
|
|
197
|
+
)
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Whether a choice is an ADD entry. A hand-written predicate because the add member's `action` is
|
|
202
|
+
* the type parameter `A` rather than a literal, and TypeScript will not narrow a generic discriminant
|
|
203
|
+
* on its own: without this, reading `.active` off the select half fails to compile.
|
|
204
|
+
*/
|
|
205
|
+
function isAddChoice<S extends string, A extends AddAction>(
|
|
206
|
+
choice: SelectChoice<S> | AddChoice<S, A>,
|
|
207
|
+
): choice is AddChoice<S, A> {
|
|
208
|
+
return choice.action !== 'select'
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* The ADD half of a menu's choices, flattened: what a surface renders as buttons when nothing is
|
|
213
|
+
* offered yet and there is no selection to make. Narrowed here rather than at each call site so the
|
|
214
|
+
* wording map stays exhaustive over what actually arrives, and so a `select` choice cannot leak into
|
|
215
|
+
* a row that offers to connect a source the workspace already has.
|
|
216
|
+
*/
|
|
217
|
+
export function addChoicesOf<S extends string, A extends AddAction>(
|
|
218
|
+
groups: readonly (readonly (SelectChoice<S> | AddChoice<S, A>)[])[],
|
|
219
|
+
): AddChoice<S, A>[] {
|
|
220
|
+
return groups.flat().filter((choice) => isAddChoice(choice))
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Whether a source menu has anything to decide. With a single entry the trigger can only re-pick
|
|
225
|
+
* what is already selected, so a surface names the source as a LABEL instead: a chevron opening a
|
|
226
|
+
* one-item menu promises a choice that isn't there. The state is reached most often by a member,
|
|
227
|
+
* whose add tier is withheld (see {@link connectableSources}), which is exactly the reader least
|
|
228
|
+
* able to tell a dead control from a broken one.
|
|
229
|
+
*/
|
|
230
|
+
export function menuIsPickable(groups: readonly (readonly unknown[])[]): boolean {
|
|
231
|
+
return groups.reduce((total, group) => total + group.length, 0) > 1
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* The source a surface should hold once the offered set changes: after a connect, a disconnect, or
|
|
236
|
+
* the per-workspace toggle flipping elsewhere.
|
|
237
|
+
*
|
|
238
|
+
* `awaiting` is the source the user just left to connect: the moment it becomes offered it wins, so
|
|
239
|
+
* they land back on the source they went to add rather than on whatever was selected before.
|
|
240
|
+
* Otherwise a still-offered selection is kept, and a selection that stopped being offered falls
|
|
241
|
+
* back to the first one (reading a source the workspace no longer offers only yields errors).
|
|
242
|
+
*/
|
|
243
|
+
export function reconcileSource<S extends string>(
|
|
244
|
+
offered: readonly S[],
|
|
245
|
+
selected: S | undefined,
|
|
246
|
+
awaiting: S | null,
|
|
247
|
+
): S | undefined {
|
|
248
|
+
if (awaiting && offered.includes(awaiting)) return awaiting
|
|
249
|
+
if (selected && offered.includes(selected)) return selected
|
|
250
|
+
return offered[0]
|
|
251
|
+
}
|
package/i18n/locales/de.json
CHANGED
|
@@ -1983,6 +1983,22 @@
|
|
|
1983
1983
|
"reduced": "Was die Effektivität verringert hat",
|
|
1984
1984
|
"obstacles": "Wichtigste Hindernisse"
|
|
1985
1985
|
},
|
|
1986
|
+
"toolServers": {
|
|
1987
|
+
"heading": "Tool-Server (MCP)",
|
|
1988
|
+
"dispatchedAs": "Ermittelt für den Agenten {agent}, den dieser Schritt gestartet hat.",
|
|
1989
|
+
"allTools": "Alle Tools, die dieser Server bereitstellt.",
|
|
1990
|
+
"narrowed": "Eingeschränkt auf: {tools}",
|
|
1991
|
+
"reason": {
|
|
1992
|
+
"harnessUnsupported": "war nicht verfügbar: die Agenten-CLI dieses Schritts hat keinen MCP-Client.",
|
|
1993
|
+
"transportUnsupported": "war nicht verfügbar: die Agenten-CLI dieses Schritts erreicht Server dieser Art nicht.",
|
|
1994
|
+
"missingSecret": "war nicht verfügbar: eine benötigte Zugangsinformation ist für dieses Board nicht hinterlegt.",
|
|
1995
|
+
"reservedSecret": "war nicht verfügbar: er verlangt eine Variable, die zur Konfiguration der Plattform gehört; die Deklaration muss geändert werden.",
|
|
1996
|
+
"oauthNotConnected": "war nicht verfügbar: dieses Board wurde noch nicht damit verbunden.",
|
|
1997
|
+
"oauthTokenFailed": "war nicht verfügbar: die Verbindung liefert kein Zugriffstoken mehr.",
|
|
1998
|
+
"overBudget": "war nicht verfügbar: dieser Agent deklariert mehr Tool-Server, als ein Lauf mitführt.",
|
|
1999
|
+
"unknown": "war nicht verfügbar ({reason})."
|
|
2000
|
+
}
|
|
2001
|
+
},
|
|
1986
2002
|
"adherence": {
|
|
1987
2003
|
"heading": "Einhaltung der Best Practices",
|
|
1988
2004
|
"headingHint": "Die Best-Practice-Standards, die in den Prompt dieses Reviewers eingefügt wurden, und wie genau die Änderung ihnen nach seinem Urteil folgt.",
|
|
@@ -2911,20 +2927,14 @@
|
|
|
2911
2927
|
},
|
|
2912
2928
|
"shared": "Geteilt",
|
|
2913
2929
|
"sharedTitle": "Über Workspaces in dieser Organisation hinweg geteilt",
|
|
2914
|
-
"bootstrapping": "Wird gebootstrappt…",
|
|
2915
2930
|
"bootstrappingRepository": "Repository wird gebootstrappt…",
|
|
2916
2931
|
"bootstrapStepsCount": "{completed}/{total} Schritte",
|
|
2917
|
-
"runFailed": "Lauf fehlgeschlagen",
|
|
2918
|
-
"mergedOfTotal": "{merged}/{total} gemergt",
|
|
2919
|
-
"noTasksYet": "Noch keine Aufgaben",
|
|
2920
|
-
"prCount": "{count} PR",
|
|
2921
2932
|
"prReadyCount": "{count} PR bereit",
|
|
2922
2933
|
"taskCount": "{count} Aufgabe | {count} Aufgaben",
|
|
2923
2934
|
"moduleCount": "{count} Modul | {count} Module",
|
|
2924
2935
|
"addTaskTitle": "Aufgabe hinzufügen",
|
|
2925
2936
|
"createTaskFromIssueTitle": "Aufgabe aus Issue erstellen",
|
|
2926
2937
|
"addRecurringTitle": "Wiederkehrende Pipeline hinzufügen",
|
|
2927
|
-
"collapseTitle": "Einklappen",
|
|
2928
2938
|
"dragService": "Service ziehen",
|
|
2929
2939
|
"dragTask": "Aufgabe ziehen",
|
|
2930
2940
|
"dragToResize": "Zum Ändern der Größe ziehen",
|
|
@@ -3786,6 +3796,11 @@
|
|
|
3786
3796
|
"noMatches": "Keine passenden Seiten.",
|
|
3787
3797
|
"emptySearchable": "Nach Titel suchen oder ein importiertes Dokument auswählen.",
|
|
3788
3798
|
"emptyRefOnly": "Fügen Sie eine Seiten-URL oder -ID ein, um sie anzuhängen.",
|
|
3799
|
+
"sourceLabel": "Quelle",
|
|
3800
|
+
"noSource": "Quelle wählen",
|
|
3801
|
+
"connectSource": "{label} verbinden",
|
|
3802
|
+
"needsSource": "Verbinden Sie eine Dokumentquelle, um eine Seite anzuhängen.",
|
|
3803
|
+
"needsSourceAdmin": "Es ist keine Dokumentquelle verbunden. Bitte einen Workspace-Admin, eine zu verbinden.",
|
|
3789
3804
|
"refChecking": "Referenz wird geprüft…",
|
|
3790
3805
|
"refUnrecognized": "Keine {source}-Referenz. Erwartet: {expected}",
|
|
3791
3806
|
"refOtherSource": "Das ist ein {claimed}-Link, kein {source}-Link.",
|
|
@@ -3922,6 +3937,7 @@
|
|
|
3922
3937
|
"searchIssues": "Issues durchsuchen",
|
|
3923
3938
|
"searchPlaceholder": "Nach Titel suchen, eine Issue-URL einfügen oder eine Issue-Nummer eingeben…",
|
|
3924
3939
|
"createTasksIn": "Aufgaben erstellen in",
|
|
3940
|
+
"creatingIn": "Neue Aufgaben landen in {container}",
|
|
3925
3941
|
"needFrameFirst": "Fügen Sie dem Board zuerst einen Service-Frame hinzu, um Aufgaben aus Issues zu erstellen.",
|
|
3926
3942
|
"searchFailed": "Suche fehlgeschlagen: {error}",
|
|
3927
3943
|
"searchResults": "Suchergebnisse",
|
|
@@ -3974,6 +3990,7 @@
|
|
|
3974
3990
|
"labels": "Labels",
|
|
3975
3991
|
"labelsHelp": "Durch Komma getrennt. Alle müssen vorhanden sein.",
|
|
3976
3992
|
"adoptInto": "Ausgewählten Fehler hinzufügen zu",
|
|
3993
|
+
"adoptingInto": "Der ausgewählte Fehler landet in {container}",
|
|
3977
3994
|
"run": "Jagen",
|
|
3978
3995
|
"running": "Board wird gelesen und die Funde werden bewertet…",
|
|
3979
3996
|
"huntFailed": "Die Jagd ist fehlgeschlagen",
|
package/i18n/locales/en.json
CHANGED
|
@@ -449,13 +449,8 @@
|
|
|
449
449
|
},
|
|
450
450
|
"shared": "Shared",
|
|
451
451
|
"sharedTitle": "Shared across workspaces in this org",
|
|
452
|
-
"bootstrapping": "Bootstrapping…",
|
|
453
452
|
"bootstrappingRepository": "Bootstrapping repository…",
|
|
454
453
|
"bootstrapStepsCount": "{completed}/{total} steps",
|
|
455
|
-
"runFailed": "Run failed",
|
|
456
|
-
"mergedOfTotal": "{merged}/{total} merged",
|
|
457
|
-
"noTasksYet": "No tasks yet",
|
|
458
|
-
"prCount": "{count} PR",
|
|
459
454
|
"prReadyCount": "{count} PR ready",
|
|
460
455
|
"taskCount": "{count} task | {count} tasks",
|
|
461
456
|
"@taskCount": {
|
|
@@ -468,7 +463,6 @@
|
|
|
468
463
|
"addTaskTitle": "Add task",
|
|
469
464
|
"createTaskFromIssueTitle": "Create task from issue",
|
|
470
465
|
"addRecurringTitle": "Add recurring pipeline",
|
|
471
|
-
"collapseTitle": "Collapse",
|
|
472
466
|
"dragService": "Drag service",
|
|
473
467
|
"dragTask": "Drag task",
|
|
474
468
|
"dragToResize": "Drag to resize",
|
|
@@ -1511,6 +1505,22 @@
|
|
|
1511
1505
|
"reduced": "What reduced effectiveness",
|
|
1512
1506
|
"obstacles": "Key obstacles"
|
|
1513
1507
|
},
|
|
1508
|
+
"toolServers": {
|
|
1509
|
+
"heading": "Tool servers (MCP)",
|
|
1510
|
+
"dispatchedAs": "Resolved for the {agent} agent this step dispatched.",
|
|
1511
|
+
"allTools": "Every tool this server exposes.",
|
|
1512
|
+
"narrowed": "Narrowed to: {tools}",
|
|
1513
|
+
"reason": {
|
|
1514
|
+
"harnessUnsupported": "was not available: the agent CLI this step ran on has no MCP client.",
|
|
1515
|
+
"transportUnsupported": "was not available: the agent CLI this step ran on cannot reach this kind of server.",
|
|
1516
|
+
"missingSecret": "was not available: a credential it needs is not set for this board.",
|
|
1517
|
+
"reservedSecret": "was not available: it asks for a variable the platform's own configuration owns, so the declaration has to change.",
|
|
1518
|
+
"oauthNotConnected": "was not available: nobody has connected this board to it yet.",
|
|
1519
|
+
"oauthTokenFailed": "was not available: the connection stopped producing an access token.",
|
|
1520
|
+
"overBudget": "was not available: this agent declares more tool servers than one run carries.",
|
|
1521
|
+
"unknown": "was not available ({reason})."
|
|
1522
|
+
}
|
|
1523
|
+
},
|
|
1514
1524
|
"adherence": {
|
|
1515
1525
|
"heading": "Best-practice adherence",
|
|
1516
1526
|
"headingHint": "The best-practice standards folded into this reviewer's prompt, and how closely it judged the change to follow each one.",
|
|
@@ -4306,6 +4316,11 @@
|
|
|
4306
4316
|
"noMatches": "No matching pages.",
|
|
4307
4317
|
"emptySearchable": "Search by title, or pick an imported document.",
|
|
4308
4318
|
"emptyRefOnly": "Paste a page URL or ID to attach it.",
|
|
4319
|
+
"sourceLabel": "Source",
|
|
4320
|
+
"noSource": "Choose a source",
|
|
4321
|
+
"connectSource": "Connect {label}",
|
|
4322
|
+
"needsSource": "Connect a document source to attach a page.",
|
|
4323
|
+
"needsSourceAdmin": "No document source is connected. Ask a workspace admin to connect one.",
|
|
4309
4324
|
"refChecking": "Checking the reference…",
|
|
4310
4325
|
"refUnrecognized": "Not a {source} reference. Expected {expected}",
|
|
4311
4326
|
"refOtherSource": "That is a {claimed} link, not a {source} one.",
|
|
@@ -4442,6 +4457,7 @@
|
|
|
4442
4457
|
"searchIssues": "Search issues",
|
|
4443
4458
|
"searchPlaceholder": "Search by title, paste an issue URL, or type an issue number…",
|
|
4444
4459
|
"createTasksIn": "Create tasks in",
|
|
4460
|
+
"creatingIn": "New tasks land in {container}",
|
|
4445
4461
|
"needFrameFirst": "Add a service frame to the board first to create tasks from issues.",
|
|
4446
4462
|
"searchFailed": "Search failed: {error}",
|
|
4447
4463
|
"searchResults": "Search results",
|
|
@@ -4497,6 +4513,7 @@
|
|
|
4497
4513
|
"labels": "Labels",
|
|
4498
4514
|
"labelsHelp": "Comma separated. All of them must be present.",
|
|
4499
4515
|
"adoptInto": "Add the picked bug to",
|
|
4516
|
+
"adoptingInto": "The picked bug lands in {container}",
|
|
4500
4517
|
"run": "Hunt",
|
|
4501
4518
|
"running": "Reading the board and rating what it finds…",
|
|
4502
4519
|
"huntFailed": "The hunt failed",
|
package/i18n/locales/es.json
CHANGED
|
@@ -404,20 +404,14 @@
|
|
|
404
404
|
},
|
|
405
405
|
"shared": "Compartido",
|
|
406
406
|
"sharedTitle": "Compartido entre espacios de trabajo de esta organización",
|
|
407
|
-
"bootstrapping": "Arrancando…",
|
|
408
407
|
"bootstrappingRepository": "Arrancando repositorio…",
|
|
409
408
|
"bootstrapStepsCount": "{completed}/{total} pasos",
|
|
410
|
-
"runFailed": "La ejecución falló",
|
|
411
|
-
"mergedOfTotal": "{merged}/{total} fusionadas",
|
|
412
|
-
"noTasksYet": "Aún no hay tareas",
|
|
413
|
-
"prCount": "{count} PR",
|
|
414
409
|
"prReadyCount": "{count} PR listas",
|
|
415
410
|
"taskCount": "{count} tarea | {count} tareas",
|
|
416
411
|
"moduleCount": "{count} módulo | {count} módulos",
|
|
417
412
|
"addTaskTitle": "Añadir tarea",
|
|
418
413
|
"createTaskFromIssueTitle": "Crear tarea desde incidencia",
|
|
419
414
|
"addRecurringTitle": "Añadir pipeline recurrente",
|
|
420
|
-
"collapseTitle": "Contraer",
|
|
421
415
|
"dragService": "Arrastrar servicio",
|
|
422
416
|
"dragTask": "Arrastrar tarea",
|
|
423
417
|
"dragToResize": "Arrastra para cambiar el tamaño",
|
|
@@ -1420,6 +1414,22 @@
|
|
|
1420
1414
|
"reduced": "Qué redujo la efectividad",
|
|
1421
1415
|
"obstacles": "Obstáculos clave"
|
|
1422
1416
|
},
|
|
1417
|
+
"toolServers": {
|
|
1418
|
+
"heading": "Servidores de herramientas (MCP)",
|
|
1419
|
+
"dispatchedAs": "Resuelto para el agente {agent} que este paso ejecutó.",
|
|
1420
|
+
"allTools": "Todas las herramientas que expone este servidor.",
|
|
1421
|
+
"narrowed": "Limitado a: {tools}",
|
|
1422
|
+
"reason": {
|
|
1423
|
+
"harnessUnsupported": "no estuvo disponible: la CLI del agente de este paso no tiene cliente MCP.",
|
|
1424
|
+
"transportUnsupported": "no estuvo disponible: la CLI del agente de este paso no puede alcanzar este tipo de servidor.",
|
|
1425
|
+
"missingSecret": "no estuvo disponible: falta en este tablero una credencial que necesita.",
|
|
1426
|
+
"reservedSecret": "no estuvo disponible: pide una variable que pertenece a la configuración de la plataforma, así que hay que cambiar la declaración.",
|
|
1427
|
+
"oauthNotConnected": "no estuvo disponible: nadie ha conectado este tablero con él todavía.",
|
|
1428
|
+
"oauthTokenFailed": "no estuvo disponible: la conexión dejó de producir un token de acceso.",
|
|
1429
|
+
"overBudget": "no estuvo disponible: este agente declara más servidores de los que lleva una ejecución.",
|
|
1430
|
+
"unknown": "no estuvo disponible ({reason})."
|
|
1431
|
+
}
|
|
1432
|
+
},
|
|
1423
1433
|
"adherence": {
|
|
1424
1434
|
"heading": "Cumplimiento de buenas prácticas",
|
|
1425
1435
|
"headingHint": "Los estandares de buenas practicas incorporados al prompt de este revisor, y con cuanta fidelidad juzgo que el cambio sigue cada uno.",
|
|
@@ -4169,6 +4179,11 @@
|
|
|
4169
4179
|
"noMatches": "No hay páginas que coincidan.",
|
|
4170
4180
|
"emptySearchable": "Busca por título o elige un documento importado.",
|
|
4171
4181
|
"emptyRefOnly": "Pega la URL o el ID de una página para adjuntarla.",
|
|
4182
|
+
"sourceLabel": "Fuente",
|
|
4183
|
+
"noSource": "Elige una fuente",
|
|
4184
|
+
"connectSource": "Conectar {label}",
|
|
4185
|
+
"needsSource": "Conecta una fuente de documentos para adjuntar una página.",
|
|
4186
|
+
"needsSourceAdmin": "No hay ninguna fuente de documentos conectada. Pide a un administrador del espacio de trabajo que conecte una.",
|
|
4172
4187
|
"refChecking": "Comprobando la referencia…",
|
|
4173
4188
|
"refUnrecognized": "No es una referencia de {source}. Se esperaba {expected}",
|
|
4174
4189
|
"refOtherSource": "Es un enlace de {claimed}, no de {source}.",
|
|
@@ -4305,6 +4320,7 @@
|
|
|
4305
4320
|
"searchIssues": "Buscar incidencias",
|
|
4306
4321
|
"searchPlaceholder": "Busca por título, pega la URL de una incidencia o escribe un número de incidencia…",
|
|
4307
4322
|
"createTasksIn": "Crear tareas en",
|
|
4323
|
+
"creatingIn": "Las tareas nuevas se crean en {container}",
|
|
4308
4324
|
"needFrameFirst": "Añade primero un marco de servicio al tablero para crear tareas desde incidencias.",
|
|
4309
4325
|
"searchFailed": "La búsqueda falló: {error}",
|
|
4310
4326
|
"searchResults": "Resultados de la búsqueda",
|
|
@@ -4357,6 +4373,7 @@
|
|
|
4357
4373
|
"labels": "Etiquetas",
|
|
4358
4374
|
"labelsHelp": "Separadas por comas. Todas deben estar presentes.",
|
|
4359
4375
|
"adoptInto": "Añadir el error elegido a",
|
|
4376
|
+
"adoptingInto": "El error elegido se añade a {container}",
|
|
4360
4377
|
"run": "Cazar",
|
|
4361
4378
|
"running": "Leyendo el tablero y valorando lo que encuentra…",
|
|
4362
4379
|
"huntFailed": "La caza ha fallado",
|
package/i18n/locales/fr.json
CHANGED
|
@@ -404,20 +404,14 @@
|
|
|
404
404
|
},
|
|
405
405
|
"shared": "Partagé",
|
|
406
406
|
"sharedTitle": "Partagé entre les espaces de travail de cette organisation",
|
|
407
|
-
"bootstrapping": "Initialisation…",
|
|
408
407
|
"bootstrappingRepository": "Initialisation du dépôt…",
|
|
409
408
|
"bootstrapStepsCount": "{completed}/{total} étapes",
|
|
410
|
-
"runFailed": "L’exécution a échoué",
|
|
411
|
-
"mergedOfTotal": "{merged}/{total} fusionnées",
|
|
412
|
-
"noTasksYet": "Pas encore de tâches",
|
|
413
|
-
"prCount": "{count} PR",
|
|
414
409
|
"prReadyCount": "{count} PR prêtes",
|
|
415
410
|
"taskCount": "{count} tâche | {count} tâches",
|
|
416
411
|
"moduleCount": "{count} module | {count} modules",
|
|
417
412
|
"addTaskTitle": "Ajouter une tâche",
|
|
418
413
|
"createTaskFromIssueTitle": "Créer une tâche depuis un ticket",
|
|
419
414
|
"addRecurringTitle": "Ajouter une pipeline récurrente",
|
|
420
|
-
"collapseTitle": "Réduire",
|
|
421
415
|
"dragService": "Faire glisser le service",
|
|
422
416
|
"dragTask": "Faire glisser la tâche",
|
|
423
417
|
"dragToResize": "Glisser pour redimensionner",
|
|
@@ -1420,6 +1414,22 @@
|
|
|
1420
1414
|
"reduced": "Ce qui a réduit l'efficacité",
|
|
1421
1415
|
"obstacles": "Principaux obstacles"
|
|
1422
1416
|
},
|
|
1417
|
+
"toolServers": {
|
|
1418
|
+
"heading": "Serveurs d'outils (MCP)",
|
|
1419
|
+
"dispatchedAs": "Résolu pour l’agent {agent} lancé par cette étape.",
|
|
1420
|
+
"allTools": "Tous les outils exposés par ce serveur.",
|
|
1421
|
+
"narrowed": "Limité à : {tools}",
|
|
1422
|
+
"reason": {
|
|
1423
|
+
"harnessUnsupported": "n'était pas disponible : la CLI d'agent de cette étape n'a pas de client MCP.",
|
|
1424
|
+
"transportUnsupported": "n'était pas disponible : la CLI d'agent de cette étape ne peut pas atteindre ce type de serveur.",
|
|
1425
|
+
"missingSecret": "n'était pas disponible : un identifiant dont il a besoin n'est pas renseigné pour ce tableau.",
|
|
1426
|
+
"reservedSecret": "n'était pas disponible : il demande une variable qui appartient à la configuration de la plateforme, la déclaration doit donc changer.",
|
|
1427
|
+
"oauthNotConnected": "n'était pas disponible : personne n'a encore connecté ce tableau à ce serveur.",
|
|
1428
|
+
"oauthTokenFailed": "n'était pas disponible : la connexion ne produit plus de jeton d'accès.",
|
|
1429
|
+
"overBudget": "n'était pas disponible : cet agent déclare plus de serveurs d'outils qu'une exécution n'en transporte.",
|
|
1430
|
+
"unknown": "n'était pas disponible ({reason})."
|
|
1431
|
+
}
|
|
1432
|
+
},
|
|
1423
1433
|
"adherence": {
|
|
1424
1434
|
"heading": "Respect des bonnes pratiques",
|
|
1425
1435
|
"headingHint": "Les standards de bonnes pratiques integres au prompt de ce relecteur, et le degre de respect de chacun qu'il a estime pour la modification.",
|
|
@@ -4169,6 +4179,11 @@
|
|
|
4169
4179
|
"noMatches": "Aucune page correspondante.",
|
|
4170
4180
|
"emptySearchable": "Recherchez par titre ou choisissez un document importé.",
|
|
4171
4181
|
"emptyRefOnly": "Collez l'URL ou l'ID d'une page pour la joindre.",
|
|
4182
|
+
"sourceLabel": "Source",
|
|
4183
|
+
"noSource": "Choisir une source",
|
|
4184
|
+
"connectSource": "Connecter {label}",
|
|
4185
|
+
"needsSource": "Connectez une source de documents pour joindre une page.",
|
|
4186
|
+
"needsSourceAdmin": "Aucune source de documents n'est connectée. Demandez à un administrateur de l'espace de travail d'en connecter une.",
|
|
4172
4187
|
"refChecking": "Vérification de la référence…",
|
|
4173
4188
|
"refUnrecognized": "Ce n'est pas une référence {source}. Format attendu : {expected}",
|
|
4174
4189
|
"refOtherSource": "C'est un lien {claimed}, pas un lien {source}.",
|
|
@@ -4305,6 +4320,7 @@
|
|
|
4305
4320
|
"searchIssues": "Rechercher des tickets",
|
|
4306
4321
|
"searchPlaceholder": "Recherchez par titre, collez l'URL d'un ticket ou saisissez un numéro de ticket…",
|
|
4307
4322
|
"createTasksIn": "Créer des tâches dans",
|
|
4323
|
+
"creatingIn": "Les nouvelles tâches sont créées dans {container}",
|
|
4308
4324
|
"needFrameFirst": "Ajoutez d'abord un cadre de service au tableau pour créer des tâches à partir de tickets.",
|
|
4309
4325
|
"searchFailed": "Échec de la recherche : {error}",
|
|
4310
4326
|
"searchResults": "Résultats de la recherche",
|
|
@@ -4357,6 +4373,7 @@
|
|
|
4357
4373
|
"labels": "Étiquettes",
|
|
4358
4374
|
"labelsHelp": "Séparées par des virgules. Toutes doivent être présentes.",
|
|
4359
4375
|
"adoptInto": "Ajouter le bug retenu à",
|
|
4376
|
+
"adoptingInto": "Le bug retenu est ajouté à {container}",
|
|
4360
4377
|
"run": "Chasser",
|
|
4361
4378
|
"running": "Lecture du tableau et évaluation des résultats…",
|
|
4362
4379
|
"huntFailed": "La chasse a échoué",
|
package/i18n/locales/he.json
CHANGED
|
@@ -404,20 +404,14 @@
|
|
|
404
404
|
},
|
|
405
405
|
"shared": "משותף",
|
|
406
406
|
"sharedTitle": "משותף בין סביבות העבודה בארגון זה",
|
|
407
|
-
"bootstrapping": "מאתחל…",
|
|
408
407
|
"bootstrappingRepository": "מאתחל מאגר…",
|
|
409
408
|
"bootstrapStepsCount": "{completed}/{total} שלבים",
|
|
410
|
-
"runFailed": "הריצה נכשלה",
|
|
411
|
-
"mergedOfTotal": "{merged}/{total} מוזגו",
|
|
412
|
-
"noTasksYet": "אין עדיין משימות",
|
|
413
|
-
"prCount": "{count} PR",
|
|
414
409
|
"prReadyCount": "{count} PR מוכנים",
|
|
415
410
|
"taskCount": "{count} משימה | שתי משימות | {count} משימות",
|
|
416
411
|
"moduleCount": "{count} מודול | שני מודולים | {count} מודולים",
|
|
417
412
|
"addTaskTitle": "הוסף משימה",
|
|
418
413
|
"createTaskFromIssueTitle": "צור משימה מאישיו",
|
|
419
414
|
"addRecurringTitle": "הוסף צינור מחזורי",
|
|
420
|
-
"collapseTitle": "כווץ",
|
|
421
415
|
"dragService": "גרור שירות",
|
|
422
416
|
"dragTask": "גרור משימה",
|
|
423
417
|
"dragToResize": "גרור לשינוי גודל",
|
|
@@ -1420,6 +1414,22 @@
|
|
|
1420
1414
|
"reduced": "מה הפחית את היעילות",
|
|
1421
1415
|
"obstacles": "מכשולים עיקריים"
|
|
1422
1416
|
},
|
|
1417
|
+
"toolServers": {
|
|
1418
|
+
"heading": "שרתי כלים (MCP)",
|
|
1419
|
+
"dispatchedAs": "נקבע עבור סוכן {agent} שהופעל בשלב הזה.",
|
|
1420
|
+
"allTools": "כל הכלים שהשרת הזה חושף.",
|
|
1421
|
+
"narrowed": "מוגבל אל: {tools}",
|
|
1422
|
+
"reason": {
|
|
1423
|
+
"harnessUnsupported": "לא היה זמין: לממשק הסוכן שבו רץ השלב הזה אין לקוח MCP.",
|
|
1424
|
+
"transportUnsupported": "לא היה זמין: ממשק הסוכן שבו רץ השלב הזה אינו יכול להגיע לשרת מסוג זה.",
|
|
1425
|
+
"missingSecret": "לא היה זמין: אישור גישה שהוא צריך אינו מוגדר עבור הלוח הזה.",
|
|
1426
|
+
"reservedSecret": "לא היה זמין: הוא מבקש משתנה ששייך לתצורת הפלטפורמה עצמה, ולכן יש לשנות את ההצהרה.",
|
|
1427
|
+
"oauthNotConnected": "לא היה זמין: איש עדיין לא חיבר את הלוח הזה אליו.",
|
|
1428
|
+
"oauthTokenFailed": "לא היה זמין: החיבור הפסיק להנפיק אסימון גישה.",
|
|
1429
|
+
"overBudget": "לא היה זמין: הסוכן הזה מצהיר על יותר שרתי כלים ממה שריצה אחת נושאת.",
|
|
1430
|
+
"unknown": "לא היה זמין ({reason})."
|
|
1431
|
+
}
|
|
1432
|
+
},
|
|
1423
1433
|
"adherence": {
|
|
1424
1434
|
"heading": "עמידה בשיטות עבודה מומלצות",
|
|
1425
1435
|
"headingHint": "תקני העבודה המומלצים ששולבו בהנחיה של הסוקר הזה, ועד כמה לפי שיפוטו השינוי עומד בכל אחד מהם.",
|
|
@@ -4169,6 +4179,11 @@
|
|
|
4169
4179
|
"noMatches": "אין דפים תואמים.",
|
|
4170
4180
|
"emptySearchable": "חפש לפי כותרת, או בחר מסמך שיובא.",
|
|
4171
4181
|
"emptyRefOnly": "הדבק כתובת URL או מזהה של דף כדי לצרף אותו.",
|
|
4182
|
+
"sourceLabel": "מקור",
|
|
4183
|
+
"noSource": "בחר מקור",
|
|
4184
|
+
"connectSource": "חבר {label}",
|
|
4185
|
+
"needsSource": "חבר מקור מסמכים כדי לצרף עמוד.",
|
|
4186
|
+
"needsSourceAdmin": "לא מחובר שום מקור מסמכים. בקש ממנהל סביבת העבודה לחבר מקור.",
|
|
4172
4187
|
"refChecking": "בודקים את ההפניה…",
|
|
4173
4188
|
"refUnrecognized": "זו אינה הפניה של {source}. הפורמט הצפוי: {expected}",
|
|
4174
4189
|
"refOtherSource": "זה קישור של {claimed}, לא של {source}.",
|
|
@@ -4305,6 +4320,7 @@
|
|
|
4305
4320
|
"searchIssues": "חפש ניושנים",
|
|
4306
4321
|
"searchPlaceholder": "חפש לפי כותרת, הדבק URL של ניושן, או הקלד מספר ניושן…",
|
|
4307
4322
|
"createTasksIn": "צור משימות ב-",
|
|
4323
|
+
"creatingIn": "משימות חדשות ייווצרו ב-{container}",
|
|
4308
4324
|
"needFrameFirst": "הוסף תחילה מסגרת שירות ללוח כדי ליצור משימות מניושנים.",
|
|
4309
4325
|
"searchFailed": "החיפוש נכשל: {error}",
|
|
4310
4326
|
"searchResults": "תוצאות חיפוש",
|
|
@@ -4357,6 +4373,7 @@
|
|
|
4357
4373
|
"labels": "תוויות",
|
|
4358
4374
|
"labelsHelp": "מופרדות בפסיקים. כולן חייבות להופיע.",
|
|
4359
4375
|
"adoptInto": "הוסף את הבאג הנבחר אל",
|
|
4376
|
+
"adoptingInto": "הבאג הנבחר יתווסף ל-{container}",
|
|
4360
4377
|
"run": "צוד",
|
|
4361
4378
|
"running": "קורא את הלוח ומעריך את מה שנמצא…",
|
|
4362
4379
|
"huntFailed": "הציד נכשל",
|