@cat-factory/app 0.202.0 → 0.205.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/README.md +62 -10
- package/app/components/binaryOutput/BinaryOutputReport.vue +220 -0
- package/app/components/initiative/InitiativePlanReview.vue +11 -1
- package/app/components/panels/AgentStepDetail.vue +10 -0
- package/app/components/panels/ResultWindowShell.vue +86 -0
- package/app/components/pipeline/BinaryOutputStepPicker.vue +274 -0
- package/app/components/pipeline/PipelineBuilder.vue +54 -0
- package/app/components/settings/OpenRouterCatalogPanel.vue +6 -3
- package/app/components/tutorial/TutorialCatalogue.logic.spec.ts +103 -0
- package/app/components/tutorial/TutorialCatalogue.logic.ts +102 -0
- package/app/components/tutorial/TutorialCatalogue.vue +150 -0
- package/app/components/tutorial/TutorialOverlay.vue +9 -2
- package/app/components/tutorial/TutorialPrompt.vue +40 -33
- package/app/composables/useNavContributions.ts +4 -1
- package/app/composables/usePipelineErrorToast.ts +4 -0
- package/app/composables/useTutorialLaunch.ts +50 -0
- package/app/composables/useTutorialTours.ts +37 -9
- package/app/docs/consumer-extensions.md +24 -11
- package/app/modular/agent-kinds.ts +6 -0
- package/app/modular/nav-contributions.spec.ts +7 -0
- package/app/modular/nav-contributions.ts +25 -13
- package/app/modular/slots.ts +5 -2
- package/app/modular/tutorial-tours.spec.ts +92 -43
- package/app/modular/tutorial-tours.ts +57 -8
- package/app/pages/index.vue +7 -2
- package/app/stores/agents.ts +20 -0
- package/app/stores/pipelines/draftBinaryOutput.spec.ts +70 -0
- package/app/stores/pipelines/draftStepConfig.ts +44 -2
- package/app/stores/tutorial.spec.ts +75 -0
- package/app/stores/tutorial.ts +66 -1
- package/app/stores/workspace/hydrate.ts +3 -0
- package/app/types/domain.ts +9 -0
- package/app/types/execution.ts +5 -0
- package/app/utils/binaryOutput.spec.ts +421 -0
- package/app/utils/binaryOutput.ts +444 -0
- package/app/utils/tutorial.spec.ts +120 -8
- package/app/utils/tutorial.ts +166 -21
- package/i18n/locales/de.json +105 -8
- package/i18n/locales/en.json +111 -8
- package/i18n/locales/es.json +105 -8
- package/i18n/locales/fr.json +105 -8
- package/i18n/locales/he.json +105 -8
- package/i18n/locales/it.json +105 -8
- package/i18n/locales/ja.json +105 -8
- package/i18n/locales/pl.json +105 -8
- package/i18n/locales/tr.json +105 -8
- package/i18n/locales/uk.json +105 -8
- package/package.json +2 -2
package/app/utils/tutorial.ts
CHANGED
|
@@ -95,6 +95,30 @@ export interface TutorialStep {
|
|
|
95
95
|
when?: (gates: NavGates) => boolean
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
+
/**
|
|
99
|
+
* One named precondition a tour needs before it can be taken — a board write permission, a
|
|
100
|
+
* source-control connection, a service on the board.
|
|
101
|
+
*
|
|
102
|
+
* A DECLARED object rather than the bare `when(gates)` predicate a tour used to carry, because
|
|
103
|
+
* the catalogue has to say why a tour it is showing cannot be started right now. A predicate
|
|
104
|
+
* answers only "no", and a surface that lists what it can offer while silently omitting the
|
|
105
|
+
* rest reads exactly like a deployment that ships four tours instead of six — the "absent and
|
|
106
|
+
* zero must never render the same" rule, applied to a catalog. Pairing the predicate with the
|
|
107
|
+
* i18n key that NAMES it means the reason is computed from the same fact that withheld the
|
|
108
|
+
* tour, rather than restated beside it and left to drift.
|
|
109
|
+
*
|
|
110
|
+
* A consumer deployment writes its own: this is a plain object with its own copy key, so it
|
|
111
|
+
* needs no registration and no entry in a first-party table.
|
|
112
|
+
*/
|
|
113
|
+
export interface TutorialRequirement {
|
|
114
|
+
/** Stable id, unique within a tour's list; the catalogue keys its reason list on it. */
|
|
115
|
+
id: string
|
|
116
|
+
/** i18n key naming the requirement as a noun phrase ("A service on the board"). */
|
|
117
|
+
labelKey: string
|
|
118
|
+
/** Whether this board/user currently satisfies it. */
|
|
119
|
+
met: (gates: NavGates) => boolean
|
|
120
|
+
}
|
|
121
|
+
|
|
98
122
|
export interface TutorialTour {
|
|
99
123
|
/** Stable id; completion is persisted against it, so renaming one resets its state. */
|
|
100
124
|
id: string
|
|
@@ -104,11 +128,12 @@ export interface TutorialTour {
|
|
|
104
128
|
/** Sort key in the tour list; ties break on `id` so the order is deterministic. */
|
|
105
129
|
order: number
|
|
106
130
|
/**
|
|
107
|
-
*
|
|
108
|
-
* tour about a surface the caller can't reach
|
|
109
|
-
*
|
|
131
|
+
* What this board/user must have before the tour can run, over the same reactive
|
|
132
|
+
* {@link NavGates} the nav catalog uses — so a tour about a surface the caller can't reach
|
|
133
|
+
* (no board write, no source control) is never started, and the catalogue can say which of
|
|
134
|
+
* these is the one still missing. Absent = always available.
|
|
110
135
|
*/
|
|
111
|
-
|
|
136
|
+
requires?: readonly TutorialRequirement[]
|
|
112
137
|
steps: readonly TutorialStep[]
|
|
113
138
|
}
|
|
114
139
|
|
|
@@ -153,28 +178,148 @@ export function sortTours(tours: readonly TutorialTour[]): TutorialTour[] {
|
|
|
153
178
|
}
|
|
154
179
|
|
|
155
180
|
/**
|
|
156
|
-
*
|
|
157
|
-
*
|
|
181
|
+
* Why a tour is or isn't offered right now.
|
|
182
|
+
*
|
|
183
|
+
* Three values rather than a boolean, because the two unavailable ones need different copy
|
|
184
|
+
* and different action from the reader: `blocked` names things they can go and do (link a
|
|
185
|
+
* repository, start a run), while `not-applicable` is a tour whose every step is about a
|
|
186
|
+
* branch this board isn't on — nothing to fix, and telling someone to fix it would send them
|
|
187
|
+
* looking for a control that was never missing.
|
|
188
|
+
*
|
|
189
|
+
* `blocked` OUTRANKS `not-applicable` when a tour is both, and that order is load-bearing: a
|
|
190
|
+
* step's `when` reads the same gates the requirements do, so under UNMET requirements the step
|
|
191
|
+
* filter is answering a hypothetical — what would apply on a board that, by construction, this
|
|
192
|
+
* one is not. Reporting that as `not-applicable` would tell the reader there is nothing to be
|
|
193
|
+
* done about a tour they can in fact unlock. The cost is the reverse case: a tour can be named
|
|
194
|
+
* as unlockable and still turn out `not-applicable` once the requirement is met. See
|
|
195
|
+
* {@link resolveTourCatalogue} for why a tour should not be authored that way.
|
|
196
|
+
*/
|
|
197
|
+
export type TutorialAvailability = 'ready' | 'blocked' | 'not-applicable'
|
|
198
|
+
|
|
199
|
+
/** One tour as this board sees it: the resolved script plus why it can (or can't) run. */
|
|
200
|
+
export interface TutorialCatalogueEntry {
|
|
201
|
+
/** The tour with its inapplicable steps already dropped — what a start would run. */
|
|
202
|
+
tour: TutorialTour
|
|
203
|
+
availability: TutorialAvailability
|
|
204
|
+
/** The requirements this board/user does not meet. Empty unless `blocked`. */
|
|
205
|
+
unmet: readonly TutorialRequirement[]
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Resolve the whole catalog against the gates: which tours can run now, and for the rest,
|
|
210
|
+
* exactly what is standing in the way.
|
|
158
211
|
*
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
*
|
|
212
|
+
* Per-step `when`s are applied here too, and a tour left with NO applicable steps is
|
|
213
|
+
* `not-applicable` rather than ready. That rule is what makes per-step gating safe to reach
|
|
214
|
+
* for: a tour whose every step is branch-specific (the parked-run tour — some boards have a
|
|
215
|
+
* decision waiting, some an approval) would otherwise open on an empty cursor, which the
|
|
162
216
|
* overlay ends immediately, so the user presses Start and nothing happens.
|
|
163
217
|
*
|
|
164
|
-
*
|
|
165
|
-
*
|
|
218
|
+
* `gates` is nullable for the same reason `navSlotFilter` passes everything through when no
|
|
219
|
+
* gates service is wired (a bare install / dev-open parity): with nothing to gate against,
|
|
220
|
+
* nothing is withheld — including the per-step branches, which must not be silently thinned.
|
|
221
|
+
*
|
|
222
|
+
* AUTHORING RULE, and the reason `blocked` outranks `not-applicable` is safe in practice: give
|
|
223
|
+
* every tour at least one step with NO `when`. An intro and a finish card qualify, which is why
|
|
224
|
+
* every built-in has two (pinned by `tutorial-tours.spec.ts`). Then `steps` can never be empty,
|
|
225
|
+
* `not-applicable` is reachable only for a tour authored as branch-specific END TO END, and a
|
|
226
|
+
* tour named in the catalogue as unlockable can never turn out unstartable after the reader has
|
|
227
|
+
* gone and done the thing it asked for.
|
|
228
|
+
*
|
|
229
|
+
* Pure, total and sorted, so both consumers (the launch prompt's offer list and the
|
|
230
|
+
* catalogue) read one resolution rather than each re-deriving availability, and the rules
|
|
231
|
+
* above are unit-testable without a Vue runtime.
|
|
166
232
|
*/
|
|
167
|
-
export function
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
//
|
|
175
|
-
|
|
233
|
+
export function resolveTourCatalogue(
|
|
234
|
+
tours: readonly TutorialTour[],
|
|
235
|
+
gates: NavGates | null,
|
|
236
|
+
): TutorialCatalogueEntry[] {
|
|
237
|
+
return sortTours(tours).map((tour) => {
|
|
238
|
+
const unmet = gates ? (tour.requires ?? []).filter((r) => !r.met(gates)) : []
|
|
239
|
+
const steps = gates ? tour.steps.filter((s) => (s.when ? s.when(gates) : true)) : tour.steps
|
|
240
|
+
// Reuse the original object when nothing was dropped: both surfaces key their lists on
|
|
241
|
+
// the tour, and a fresh object per gate read would re-render on every unrelated flip.
|
|
242
|
+
const resolved = steps.length === tour.steps.length ? tour : { ...tour, steps }
|
|
243
|
+
const availability: TutorialAvailability =
|
|
244
|
+
unmet.length > 0 ? 'blocked' : steps.length === 0 ? 'not-applicable' : 'ready'
|
|
245
|
+
return { tour: resolved, availability, unmet }
|
|
246
|
+
})
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/** The tours that can be started right now, resolved — the launch prompt's offer list. */
|
|
250
|
+
export function resolveTours(
|
|
251
|
+
tours: readonly TutorialTour[],
|
|
252
|
+
gates: NavGates | null,
|
|
253
|
+
): TutorialTour[] {
|
|
254
|
+
return resolveTourCatalogue(tours, gates)
|
|
255
|
+
.filter((entry) => entry.availability === 'ready')
|
|
256
|
+
.map((entry) => entry.tour)
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Where a tour stands for this user: the state the catalogue badges and the action label
|
|
261
|
+
* derive from. Camel-cased because the values ARE the i18n leaf keys
|
|
262
|
+
* (`tutorial.status.<state>`, `tutorial.action.<action>`), which keeps those lookups total.
|
|
263
|
+
*/
|
|
264
|
+
export type TutorialTourState = 'notStarted' | 'inProgress' | 'paused' | 'completed'
|
|
265
|
+
|
|
266
|
+
/** What the tour's button does, given that state. */
|
|
267
|
+
export type TutorialLaunchAction = 'start' | 'resume' | 'restart' | 'continue'
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Which state a tour is in, in precedence order: the one RUNNING wins over everything, then a
|
|
271
|
+
* broken-off position, then completion.
|
|
272
|
+
*
|
|
273
|
+
* Paused beating completed is the deliberate half: a tour taken again and broken off is
|
|
274
|
+
* offered where it stopped, rather than being described by the badge it earned last time.
|
|
275
|
+
*/
|
|
276
|
+
export function tourState(input: {
|
|
277
|
+
active: boolean
|
|
278
|
+
resumable: boolean
|
|
279
|
+
completed: boolean
|
|
280
|
+
}): TutorialTourState {
|
|
281
|
+
if (input.active) return 'inProgress'
|
|
282
|
+
if (input.resumable) return 'paused'
|
|
283
|
+
return input.completed ? 'completed' : 'notStarted'
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* The action offered for a state. Total, so a new state cannot reach a surface without an
|
|
288
|
+
* action — `continue` exists because the catalogue is reachable DURING a tour (nothing about
|
|
289
|
+
* the overlay blocks the sidebar), and offering "Start" for the walkthrough already on screen
|
|
290
|
+
* would restart it from step one on a click most people would read as "back to it".
|
|
291
|
+
*/
|
|
292
|
+
export function launchActionFor(state: TutorialTourState): TutorialLaunchAction {
|
|
293
|
+
const actions: Record<TutorialTourState, TutorialLaunchAction> = {
|
|
294
|
+
notStarted: 'start',
|
|
295
|
+
inProgress: 'continue',
|
|
296
|
+
paused: 'resume',
|
|
297
|
+
completed: 'restart',
|
|
176
298
|
}
|
|
177
|
-
return
|
|
299
|
+
return actions[state]
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* The copy for each state / action, as exhaustive `Record`s rather than a key assembled at
|
|
304
|
+
* the call site (`t(\`tutorial.action.${action}\`)`).
|
|
305
|
+
*
|
|
306
|
+
* The typed-message-key check only covers keys written as literals, so an assembled one is
|
|
307
|
+
* exactly the drift it cannot see — the i18n guard's tier-2 rule. Declared this way, adding a
|
|
308
|
+
* state without its copy fails the typecheck, and `tutorial.spec.ts` pins every value against
|
|
309
|
+
* the catalog so a RENAMED key fails a test instead of rendering a raw path to the user.
|
|
310
|
+
*/
|
|
311
|
+
export const TUTORIAL_STATUS_KEYS: Record<TutorialTourState, string> = {
|
|
312
|
+
notStarted: 'tutorial.status.notStarted',
|
|
313
|
+
inProgress: 'tutorial.status.inProgress',
|
|
314
|
+
paused: 'tutorial.status.paused',
|
|
315
|
+
completed: 'tutorial.status.completed',
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
export const TUTORIAL_ACTION_KEYS: Record<TutorialLaunchAction, string> = {
|
|
319
|
+
start: 'tutorial.action.start',
|
|
320
|
+
resume: 'tutorial.action.resume',
|
|
321
|
+
restart: 'tutorial.action.restart',
|
|
322
|
+
continue: 'tutorial.action.continue',
|
|
178
323
|
}
|
|
179
324
|
|
|
180
325
|
/** A DOMRect-shaped box, structurally typed so the geometry below is unit-testable. */
|
package/i18n/locales/de.json
CHANGED
|
@@ -2162,7 +2162,6 @@
|
|
|
2162
2162
|
"shortcuts": "Tastenkürzel",
|
|
2163
2163
|
"bugHunt": "Fehlerjagd",
|
|
2164
2164
|
"toggleUiMode": "Oberflächenmodus wechseln",
|
|
2165
|
-
"tutorial": "Tour starten",
|
|
2166
2165
|
"foundationalServices": "Basisdienste"
|
|
2167
2166
|
},
|
|
2168
2167
|
"keywords": {
|
|
@@ -3733,7 +3732,30 @@
|
|
|
3733
3732
|
"consensusGroupsActive": "Dieser Schritt führt die ausgewählte Gruppe aus. Hebe die Auswahl aller Gruppen auf, um die Teilnehmer hier zu konfigurieren.",
|
|
3734
3733
|
"consensusGroupAlways": "immer",
|
|
3735
3734
|
"variantLabel": "Prompt-Variante",
|
|
3736
|
-
"variantShipped": "Ausgelieferter Prompt"
|
|
3735
|
+
"variantShipped": "Ausgelieferter Prompt",
|
|
3736
|
+
"binaryOutputStorage": "Speichern über",
|
|
3737
|
+
"binaryOutputContext": "Kontext der Erzeugung",
|
|
3738
|
+
"binaryOutputPlaceholder": "Speicherdienst wählen",
|
|
3739
|
+
"binaryOutputContextPlaceholder": "Optional: Dienste, die den Umfang bestimmen",
|
|
3740
|
+
"binaryOutputNeedsPick": "Für einen Schritt, der binäre Ausgaben erzeugt, ist kein Speicherdienst gewählt. Wähle einen vor dem Speichern.",
|
|
3741
|
+
"binaryOutputNoStorage": "Kein Dienst im Katalog dieses Boards deklariert die Fähigkeit {capability}. Registriere einen, oder ergänze die Fähigkeit beim gemeinten Dienst unter den grundlegenden Diensten.",
|
|
3742
|
+
"binaryOutputMissing": "Dieser Speicherdienst ist nicht mehr im Katalog; wähle einen anderen.",
|
|
3743
|
+
"binaryOutputNotStorage": "Dieser Dienst deklariert die Fähigkeit {capability} nicht mehr, deshalb werden Läufe abgelehnt; wähle einen anderen.",
|
|
3744
|
+
"binaryOutputContextMissing": "Diese Kontextdienste sind nicht mehr im Katalog: {ids}",
|
|
3745
|
+
"binaryOutputUnavailable": "Der Katalog der grundlegenden Dienste ist nicht erreichbar, deshalb lässt sich hier noch nichts wählen.",
|
|
3746
|
+
"binaryOutputGenerators": "Erzeugen mit",
|
|
3747
|
+
"binaryOutputGeneratorsPlaceholder": "Keine Integration ausgewählt",
|
|
3748
|
+
"binaryOutputModalities": "Muss liefern",
|
|
3749
|
+
"binaryOutputModalitiesPlaceholder": "Keine Anforderung",
|
|
3750
|
+
"binaryOutputGeneratorMissing": "Diese Installation registriert diese generativen Integrationen nicht: {ids}. Sie werden im Code der Installation registriert, nicht in diesem Workspace.",
|
|
3751
|
+
"binaryOutputModalityUncovered": "Keine ausgewählte Integration erzeugt {modalities}, was dieser Schritt liefern soll.",
|
|
3752
|
+
"binaryOutputModality": {
|
|
3753
|
+
"image": "Bilder",
|
|
3754
|
+
"audio": "Audio",
|
|
3755
|
+
"video": "Video",
|
|
3756
|
+
"3d": "3D-Modelle",
|
|
3757
|
+
"document": "Dokumente"
|
|
3758
|
+
}
|
|
3737
3759
|
},
|
|
3738
3760
|
"progress": {
|
|
3739
3761
|
"status": {
|
|
@@ -4384,6 +4406,49 @@
|
|
|
4384
4406
|
"unlinkSourceFailed": "Repo-Verknüpfung konnte nicht gelöst werden"
|
|
4385
4407
|
}
|
|
4386
4408
|
},
|
|
4409
|
+
"binaryOutput": {
|
|
4410
|
+
"heading": "Binäre Ausgaben",
|
|
4411
|
+
"target": "Speicherdienst",
|
|
4412
|
+
"targetNone": "Für diesen Schritt nicht erfasst",
|
|
4413
|
+
"contextServices": "Kontext der Erzeugung",
|
|
4414
|
+
"misdirectedBadge": "Anderer Dienst",
|
|
4415
|
+
"unknownBadge": "Nicht im Katalog",
|
|
4416
|
+
"storedCount": "{outcome}, 1 Artefakt | {outcome}, {count} Artefakte",
|
|
4417
|
+
"state": {
|
|
4418
|
+
"notStarted": {
|
|
4419
|
+
"summary": "Noch nicht gestartet",
|
|
4420
|
+
"detail": "Dieser Schritt hat noch nicht begonnen. Wenn er läuft, speichert er seine binären Ausgaben über den unten genannten Dienst."
|
|
4421
|
+
},
|
|
4422
|
+
"configured": {
|
|
4423
|
+
"summary": "Noch nichts erfasst",
|
|
4424
|
+
"detail": "Dieser Schritt ist auf das Speichern binärer Ausgaben eingerichtet, hat aber noch keine gemeldet. Er läuft noch, oder er endete vor seiner Meldung."
|
|
4425
|
+
},
|
|
4426
|
+
"undeclared": {
|
|
4427
|
+
"summary": "Nichts angegeben",
|
|
4428
|
+
"detail": "Dieser Schritt endete, ohne anzugeben, was er gespeichert hat. Möglicherweise hat er etwas gespeichert, möglicherweise nicht; erfasst wurde in beiden Fällen nichts."
|
|
4429
|
+
},
|
|
4430
|
+
"parseFailed": {
|
|
4431
|
+
"summary": "Angabe unlesbar",
|
|
4432
|
+
"detail": "Dieser Schritt endete mit einer Angabe, welche die Plattform nicht lesen konnte, deshalb wurde nichts erfasst. Was er gespeichert hat, fehlt in der Liste unten."
|
|
4433
|
+
},
|
|
4434
|
+
"declaredNone": {
|
|
4435
|
+
"summary": "Nichts gespeichert",
|
|
4436
|
+
"detail": "Der Agent hat gemeldet, dass er keine binären Artefakte gespeichert hat. Das ist ein gültiges Ergebnis, kein Fehler."
|
|
4437
|
+
},
|
|
4438
|
+
"stored": {
|
|
4439
|
+
"summary": "Gespeichert"
|
|
4440
|
+
}
|
|
4441
|
+
},
|
|
4442
|
+
"warning": {
|
|
4443
|
+
"unknownServices": "Nennt einen Dienst, den der Katalog nicht enthält: {ids}. Der Eintrag bleibt wie angegeben erhalten; prüfe die Kennung gegen den Katalog des Boards. | Nennt Dienste, die der Katalog nicht enthält: {ids}. Die Einträge bleiben wie angegeben erhalten; prüfe die Kennungen gegen den Katalog des Boards.",
|
|
4444
|
+
"targetUnknown": "Der Katalog enthält den eigenen Speicherdienst dieses Schritts nicht mehr ({id}), deshalb konnte nichts unten dagegen geprüft werden. Registriere ihn erneut, oder verweise den Schritt auf einen anderen Dienst.",
|
|
4445
|
+
"misdirected": "1 Artefakt ging an einen anderen Dienst als {target}. | {count} Artefakte gingen an einen anderen Dienst als {target}.",
|
|
4446
|
+
"invalidEntries": "1 angegebener Eintrag wurde verworfen: er nannte weder Dienst noch Ablageort. | {count} angegebene Einträge wurden verworfen: sie nannten weder Dienst noch Ablageort.",
|
|
4447
|
+
"omitted": "1 weiteres Artefakt wurde jenseits der Berichtsgrenze angegeben und ist nicht aufgeführt. | {count} weitere Artefakte wurden jenseits der Berichtsgrenze angegeben und sind nicht aufgeführt.",
|
|
4448
|
+
"unknownGenerators": "Eine generative Integration genannt, die diese Installation nicht registriert: {ids}. Der Eintrag bleibt wie angegeben erhalten; die Integration wird im Code der Installation registriert, nicht in diesem Workspace. | Generative Integrationen genannt, die diese Installation nicht registriert: {ids}. Ihre Einträge bleiben wie angegeben erhalten; Integrationen werden im Code der Installation registriert, nicht in diesem Workspace."
|
|
4449
|
+
},
|
|
4450
|
+
"unknownGeneratorBadge": "Nicht registriert"
|
|
4451
|
+
},
|
|
4387
4452
|
"brainstorm": {
|
|
4388
4453
|
"title": {
|
|
4389
4454
|
"architecture": "Architektur-Brainstorm",
|
|
@@ -4823,7 +4888,9 @@
|
|
|
4823
4888
|
"accountSettings": "Kontoeinstellungen",
|
|
4824
4889
|
"operatorDashboard": "Plattform-Observability",
|
|
4825
4890
|
"reports": "Berichte",
|
|
4826
|
-
"foundationalServices": "Basisdienste"
|
|
4891
|
+
"foundationalServices": "Basisdienste",
|
|
4892
|
+
"tutorials": "Tutorials",
|
|
4893
|
+
"help": "Hilfe"
|
|
4827
4894
|
},
|
|
4828
4895
|
"errors": {
|
|
4829
4896
|
"generic": {
|
|
@@ -4894,6 +4961,7 @@
|
|
|
4894
4961
|
"pipeline_schedule_intake_unconfigured": "Zeitplan ohne Ticket-Erfassung",
|
|
4895
4962
|
"foundational_service_exists": "Basisdienst existiert bereits",
|
|
4896
4963
|
"binary_output_service_invalid": "Dienst für Binärausgaben nicht auflösbar",
|
|
4964
|
+
"binary_output_generator_invalid": "Generator für Binärausgaben nicht auflösbar",
|
|
4897
4965
|
"foundational_service_not_inherited": "Dieses Board hat den Dienst registriert"
|
|
4898
4966
|
},
|
|
4899
4967
|
"description": {
|
|
@@ -4925,6 +4993,7 @@
|
|
|
4925
4993
|
"pipeline_schedule_intake_unconfigured": "Ein Bug-Intake-Schritt bezieht seine Arbeit aus der Ticket-Erfassung des Zeitplans, und der verknüpfte Zeitplan hat keine. Konfigurieren Sie zuerst die Ticket-Erfassung im Zeitplan.",
|
|
4926
4994
|
"foundational_service_exists": "Ein Basisdienst mit dieser ID ist in diesem Bereich bereits registriert. Öffnen Sie den vorhandenen Eintrag und bearbeiten Sie ihn — zwei Dienste können sich keine ID teilen, denn die ID ist der Name, den ein Architekt in seinem Entwurf verwendet.",
|
|
4927
4995
|
"binary_output_service_invalid": "Ein Schritt, der Binärausgaben erzeugt, wählt einen Basisdienst aus, den der Katalog dieses Workspace nicht auflösen kann: Die ID ist unbekannt, oder der gewählte Speicherdienst trägt nicht die Fähigkeit asset-storage. Korrigieren Sie die Auswahl des Schritts oder registrieren Sie den Dienst und starten Sie erneut.",
|
|
4996
|
+
"binary_output_generator_invalid": "Ein Schritt, der Binärausgaben erzeugt, wählt eine generative Integration aus, die diese Installation nicht registriert, oder keine der gewählten Integrationen erzeugt einen Inhaltstyp, den der Schritt liefern muss. Generative Integrationen werden im Code der Installation registriert, nicht in diesem Workspace: registrieren Sie sie oder korrigieren Sie die Auswahl des Schritts und starten Sie erneut.",
|
|
4928
4997
|
"foundational_service_not_inherited": "Abwählen gilt für einen vom Konto geerbten Dienst. Diese ID ist von diesem Board registriert, es gibt also nichts abzuwählen - lösche stattdessen den eigenen Eintrag des Boards."
|
|
4929
4998
|
},
|
|
4930
4999
|
"action": {
|
|
@@ -6125,13 +6194,41 @@
|
|
|
6125
6194
|
"prompt": {
|
|
6126
6195
|
"title": "Eine kurze Tour machen?",
|
|
6127
6196
|
"intro": "Geführte Touren zeigen dir die App direkt auf diesem Bildschirm: Sie heben die echten Bedienelemente hervor und sagen dir, was du anklicken sollst.",
|
|
6128
|
-
"start": "Starten",
|
|
6129
|
-
"restart": "Wiederholen",
|
|
6130
|
-
"resume": "Fortsetzen",
|
|
6131
|
-
"completed": "Abgeschlossen",
|
|
6132
6197
|
"decline": "Nein danke",
|
|
6133
6198
|
"later": "Vielleicht später",
|
|
6134
|
-
"empty": "Für deine Rolle auf diesem Board sind noch keine Touren verfügbar."
|
|
6199
|
+
"empty": "Für deine Rolle auf diesem Board sind noch keine Touren verfügbar.",
|
|
6200
|
+
"browse": "Alle Tutorials anzeigen"
|
|
6201
|
+
},
|
|
6202
|
+
"catalogue": {
|
|
6203
|
+
"title": "Tutorials",
|
|
6204
|
+
"intro": "Geführte Rundgänge, die dir unterwegs die echten Bedienelemente hervorheben. Du kannst jeden davon jederzeit starten und beliebig oft wiederholen.",
|
|
6205
|
+
"progress": "{completed} von {total} abgeschlossen",
|
|
6206
|
+
"steps": "1 Schritt | {count} Schritte",
|
|
6207
|
+
"blocked": "Verfügbar, sobald du Folgendes hast:",
|
|
6208
|
+
"notApplicable": "Auf diesem Board gibt es derzeit nichts, was dieser Rundgang zeigen könnte.",
|
|
6209
|
+
"empty": "Diese Installation enthält keine Tutorials.",
|
|
6210
|
+
"reset": "Fortschritt zurücksetzen",
|
|
6211
|
+
"resetHint": "Vergisst, welche Tutorials du abgeschlossen hast, und fragt dich beim nächsten Besuch erneut nach der Tour."
|
|
6212
|
+
},
|
|
6213
|
+
"action": {
|
|
6214
|
+
"start": "Starten",
|
|
6215
|
+
"resume": "Fortsetzen",
|
|
6216
|
+
"restart": "Wiederholen",
|
|
6217
|
+
"continue": "Zurück zur Tour"
|
|
6218
|
+
},
|
|
6219
|
+
"status": {
|
|
6220
|
+
"notStarted": "Nicht begonnen",
|
|
6221
|
+
"inProgress": "Läuft",
|
|
6222
|
+
"paused": "Pausiert",
|
|
6223
|
+
"completed": "Abgeschlossen"
|
|
6224
|
+
},
|
|
6225
|
+
"requirements": {
|
|
6226
|
+
"boardWrite": "Berechtigung, dieses Board zu bearbeiten",
|
|
6227
|
+
"sourceControl": "Eine verbundene Quellcodeverwaltung",
|
|
6228
|
+
"service": "Ein Service auf dem Board",
|
|
6229
|
+
"task": "Eine Aufgabe auf dem Board",
|
|
6230
|
+
"waitingAnswer": "Ein Lauf, der auf deine Antwort wartet",
|
|
6231
|
+
"finishedRun": "Ein erfolgreich abgeschlossener Lauf"
|
|
6135
6232
|
},
|
|
6136
6233
|
"overlay": {
|
|
6137
6234
|
"next": "Weiter",
|
package/i18n/locales/en.json
CHANGED
|
@@ -151,7 +151,9 @@
|
|
|
151
151
|
"accountSettings": "Account settings",
|
|
152
152
|
"operatorDashboard": "Platform observability",
|
|
153
153
|
"reports": "Reports",
|
|
154
|
-
"foundationalServices": "Foundational services"
|
|
154
|
+
"foundationalServices": "Foundational services",
|
|
155
|
+
"tutorials": "Tutorials",
|
|
156
|
+
"help": "Help"
|
|
155
157
|
},
|
|
156
158
|
"board": {
|
|
157
159
|
"toast": {
|
|
@@ -604,6 +606,7 @@
|
|
|
604
606
|
"pipeline_schedule_intake_unconfigured": "Schedule has no issue intake",
|
|
605
607
|
"foundational_service_exists": "Foundational service already exists",
|
|
606
608
|
"binary_output_service_invalid": "Binary output service can't be resolved",
|
|
609
|
+
"binary_output_generator_invalid": "Binary output generator can't be resolved",
|
|
607
610
|
"foundational_service_not_inherited": "This board registered that service"
|
|
608
611
|
},
|
|
609
612
|
"description": {
|
|
@@ -638,6 +641,7 @@
|
|
|
638
641
|
"pipeline_schedule_intake_unconfigured": "A bug intake step draws its work from the schedule issue intake settings, and the attached schedule has none. Configure issue intake on the schedule first.",
|
|
639
642
|
"foundational_service_exists": "A foundational service with this id is already registered at this scope. Open the existing entry and edit it — two services cannot share an id, because the id is what an architect names in its design.",
|
|
640
643
|
"binary_output_service_invalid": "A step that generates binary outputs selects a foundational service this workspace's catalog can't resolve: the id is unknown, or the chosen storage service doesn't carry the asset-storage capability. Fix the step's selection or register the service, then start again.",
|
|
644
|
+
"binary_output_generator_invalid": "A step that generates binary outputs selects a generative integration this deployment doesn't register, or none of the selected integrations produces a content type the step must deliver. Generative integrations are registered in the deployment's code, not in this workspace: register it or fix the step's selection, then start again.",
|
|
641
645
|
"foundational_service_not_inherited": "Opting out applies to a service inherited from the account. This id is registered by this board, so there is nothing to opt out of - delete the board's own entry instead."
|
|
642
646
|
},
|
|
643
647
|
"action": {
|
|
@@ -2164,7 +2168,6 @@
|
|
|
2164
2168
|
"shortcuts": "Keyboard shortcuts",
|
|
2165
2169
|
"bugHunt": "Bug hunt",
|
|
2166
2170
|
"toggleUiMode": "Switch interface mode",
|
|
2167
|
-
"tutorial": "Take a tour",
|
|
2168
2171
|
"foundationalServices": "Foundational services"
|
|
2169
2172
|
},
|
|
2170
2173
|
"keywords": {
|
|
@@ -4208,7 +4211,30 @@
|
|
|
4208
4211
|
"consensusGroupsActive": "This step runs the selected group. Deselect every group to configure participants here instead.",
|
|
4209
4212
|
"consensusGroupAlways": "always",
|
|
4210
4213
|
"variantLabel": "Prompt variant",
|
|
4211
|
-
"variantShipped": "Shipped prompt"
|
|
4214
|
+
"variantShipped": "Shipped prompt",
|
|
4215
|
+
"binaryOutputStorage": "Store through",
|
|
4216
|
+
"binaryOutputContext": "Generation context",
|
|
4217
|
+
"binaryOutputPlaceholder": "Pick a storage service",
|
|
4218
|
+
"binaryOutputContextPlaceholder": "Optional: services that scope the generation",
|
|
4219
|
+
"binaryOutputNeedsPick": "A step that generates binary outputs has no storage service selected. Pick one before saving.",
|
|
4220
|
+
"binaryOutputNoStorage": "No service in this board's catalog declares the {capability} capability. Register one, or add the capability to the service you meant, under foundational services.",
|
|
4221
|
+
"binaryOutputMissing": "This storage service is no longer in the catalog; pick another.",
|
|
4222
|
+
"binaryOutputNotStorage": "This service no longer declares the {capability} capability, so runs will be refused; pick another.",
|
|
4223
|
+
"binaryOutputContextMissing": "These context services are no longer in the catalog: {ids}",
|
|
4224
|
+
"binaryOutputUnavailable": "The foundational services catalog is unreachable, so nothing can be picked here yet.",
|
|
4225
|
+
"binaryOutputGenerators": "Generate with",
|
|
4226
|
+
"binaryOutputGeneratorsPlaceholder": "No integration selected",
|
|
4227
|
+
"binaryOutputModalities": "Must deliver",
|
|
4228
|
+
"binaryOutputModalitiesPlaceholder": "No requirement",
|
|
4229
|
+
"binaryOutputGeneratorMissing": "This deployment does not register these generative integrations: {ids}. They are registered in the deployment's code, not in this workspace.",
|
|
4230
|
+
"binaryOutputModalityUncovered": "No selected integration produces {modalities}, which this step is set to deliver.",
|
|
4231
|
+
"binaryOutputModality": {
|
|
4232
|
+
"image": "Images",
|
|
4233
|
+
"audio": "Audio",
|
|
4234
|
+
"video": "Video",
|
|
4235
|
+
"3d": "3D models",
|
|
4236
|
+
"document": "Documents"
|
|
4237
|
+
}
|
|
4212
4238
|
},
|
|
4213
4239
|
"progress": {
|
|
4214
4240
|
"status": {
|
|
@@ -5592,6 +5618,49 @@
|
|
|
5592
5618
|
"unlinkSourceFailed": "Could not unlink the repo"
|
|
5593
5619
|
}
|
|
5594
5620
|
},
|
|
5621
|
+
"binaryOutput": {
|
|
5622
|
+
"heading": "Binary outputs",
|
|
5623
|
+
"target": "Storage service",
|
|
5624
|
+
"targetNone": "None recorded on this step",
|
|
5625
|
+
"contextServices": "Generation context",
|
|
5626
|
+
"misdirectedBadge": "Other service",
|
|
5627
|
+
"unknownBadge": "Not in catalog",
|
|
5628
|
+
"storedCount": "{outcome}, 1 artifact | {outcome}, {count} artifacts",
|
|
5629
|
+
"state": {
|
|
5630
|
+
"notStarted": {
|
|
5631
|
+
"summary": "Not started yet",
|
|
5632
|
+
"detail": "This step has not started yet. When it runs, it will store its binary outputs through the service below."
|
|
5633
|
+
},
|
|
5634
|
+
"configured": {
|
|
5635
|
+
"summary": "Nothing recorded yet",
|
|
5636
|
+
"detail": "This step is set up to store binary outputs, but it has not reported any yet. It is still running, or it ended before it reported."
|
|
5637
|
+
},
|
|
5638
|
+
"undeclared": {
|
|
5639
|
+
"summary": "Nothing declared",
|
|
5640
|
+
"detail": "This step finished without declaring what it stored. It may or may not have stored something; either way, nothing was recorded."
|
|
5641
|
+
},
|
|
5642
|
+
"parseFailed": {
|
|
5643
|
+
"summary": "Declaration unreadable",
|
|
5644
|
+
"detail": "This step ended with a declaration the platform could not read, so nothing was recorded. Anything it stored is missing from the list below."
|
|
5645
|
+
},
|
|
5646
|
+
"declaredNone": {
|
|
5647
|
+
"summary": "Stored nothing",
|
|
5648
|
+
"detail": "The agent reported that it stored no binary artifacts. That is a valid outcome, not a failure."
|
|
5649
|
+
},
|
|
5650
|
+
"stored": {
|
|
5651
|
+
"summary": "Stored"
|
|
5652
|
+
}
|
|
5653
|
+
},
|
|
5654
|
+
"warning": {
|
|
5655
|
+
"unknownServices": "Named a service the catalog does not contain: {ids}. The entry is kept as claimed; check the id against the workspace catalog. | Named services the catalog does not contain: {ids}. Their entries are kept as claimed; check the ids against the workspace catalog.",
|
|
5656
|
+
"targetUnknown": "The catalog no longer contains this step's own storage service ({id}), so nothing below could be checked against it. Register it again, or point the step at another service.",
|
|
5657
|
+
"misdirected": "1 artifact went to a service other than {target}. | {count} artifacts went to a service other than {target}.",
|
|
5658
|
+
"invalidEntries": "1 declared entry was dropped: it named no service and location. | {count} declared entries were dropped: they named no service and location.",
|
|
5659
|
+
"omitted": "1 more artifact was declared beyond the report's limit and is not listed. | {count} more artifacts were declared beyond the report's limit and are not listed.",
|
|
5660
|
+
"unknownGenerators": "Named a generative integration this deployment does not register: {ids}. The entry is kept as claimed; the integration is registered in the deployment's code, not in this workspace. | Named generative integrations this deployment does not register: {ids}. Their entries are kept as claimed; integrations are registered in the deployment's code, not in this workspace."
|
|
5661
|
+
},
|
|
5662
|
+
"unknownGeneratorBadge": "Not registered"
|
|
5663
|
+
},
|
|
5595
5664
|
"sandbox": {
|
|
5596
5665
|
"title": "Sandbox: prompt and model testing",
|
|
5597
5666
|
"description": "Try prompt versions and models against graded fixtures, scored by a judge model.",
|
|
@@ -6329,16 +6398,50 @@
|
|
|
6329
6398
|
"prompt": {
|
|
6330
6399
|
"title": "Take a quick tour?",
|
|
6331
6400
|
"intro": "Guided tours walk you through the app right on this screen: they highlight the actual controls and tell you what to click.",
|
|
6401
|
+
"decline": "No thanks",
|
|
6402
|
+
"later": "Maybe later",
|
|
6403
|
+
"empty": "No tours are available for your role on this board yet.",
|
|
6404
|
+
"browse": "See all tutorials"
|
|
6405
|
+
},
|
|
6406
|
+
"catalogue": {
|
|
6407
|
+
"title": "Tutorials",
|
|
6408
|
+
"intro": "Guided walkthroughs that highlight the real controls as you go. Start any of them whenever you like, and take one again as often as you want.",
|
|
6409
|
+
"progress": "{completed} of {total} completed",
|
|
6410
|
+
"steps": "1 step | {count} steps",
|
|
6411
|
+
"@steps": {
|
|
6412
|
+
"description": "The length of one walkthrough. Needs the plural forms of the target language (pl/uk take three: one | few | many); {count} is the number of steps."
|
|
6413
|
+
},
|
|
6414
|
+
"blocked": "Available once you have:",
|
|
6415
|
+
"notApplicable": "Nothing on this board matches this walkthrough right now.",
|
|
6416
|
+
"empty": "This deployment ships no tutorials.",
|
|
6417
|
+
"reset": "Reset progress",
|
|
6418
|
+
"resetHint": "Forget which tutorials you have finished and ask about the tour again on your next visit."
|
|
6419
|
+
},
|
|
6420
|
+
"action": {
|
|
6332
6421
|
"start": "Start",
|
|
6333
|
-
"restart": "Repeat",
|
|
6334
6422
|
"resume": "Resume",
|
|
6335
6423
|
"@resume": {
|
|
6336
6424
|
"description": "Verb, on a button: pick a guided tour back up from where it was broken off. Not the noun (CV/resume)."
|
|
6337
6425
|
},
|
|
6338
|
-
"
|
|
6339
|
-
"
|
|
6340
|
-
"
|
|
6341
|
-
|
|
6426
|
+
"restart": "Repeat",
|
|
6427
|
+
"continue": "Back to the tour",
|
|
6428
|
+
"@continue": {
|
|
6429
|
+
"description": "Button on the tour that is already running: return to it. It does not restart the walkthrough from the beginning."
|
|
6430
|
+
}
|
|
6431
|
+
},
|
|
6432
|
+
"status": {
|
|
6433
|
+
"notStarted": "Not started",
|
|
6434
|
+
"inProgress": "In progress",
|
|
6435
|
+
"paused": "Paused",
|
|
6436
|
+
"completed": "Completed"
|
|
6437
|
+
},
|
|
6438
|
+
"requirements": {
|
|
6439
|
+
"boardWrite": "Permission to edit this board",
|
|
6440
|
+
"sourceControl": "A connected source-control provider",
|
|
6441
|
+
"service": "A service on the board",
|
|
6442
|
+
"task": "A task on the board",
|
|
6443
|
+
"waitingAnswer": "A run waiting for your answer",
|
|
6444
|
+
"finishedRun": "A run that finished successfully"
|
|
6342
6445
|
},
|
|
6343
6446
|
"overlay": {
|
|
6344
6447
|
"next": "Next",
|