@cat-factory/app 0.256.3 → 0.257.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/app/components/binaryCandidates/BinaryCandidatesWindow.vue +284 -0
  2. package/app/components/binaryOutput/BinaryOutputReport.vue +33 -0
  3. package/app/components/forkDecision/ForkDecisionWindow.vue +3 -1
  4. package/app/components/panels/AgentStepDetail.vue +42 -20
  5. package/app/components/panels/ResultWindowShell.logic.spec.ts +4 -0
  6. package/app/components/panels/inspector/TaskExecution.vue +34 -34
  7. package/app/components/pipeline/BinaryOutputStepPicker.logic.spec.ts +90 -1
  8. package/app/components/pipeline/BinaryOutputStepPicker.logic.ts +92 -1
  9. package/app/components/pipeline/BinaryOutputStepPicker.vue +354 -1
  10. package/app/components/pipeline/PipelineProgress.vue +37 -0
  11. package/app/composables/api/binaryCandidates.ts +36 -0
  12. package/app/composables/useApi.ts +2 -0
  13. package/app/modular/result-views.ts +4 -0
  14. package/app/stores/binaryCandidates.ts +89 -0
  15. package/app/stores/ui/resultViews.ts +8 -6
  16. package/app/stores/ui/runStepOpeners.ts +23 -1
  17. package/app/types/execution.ts +5 -0
  18. package/app/utils/binaryCandidates.spec.ts +110 -0
  19. package/app/utils/binaryCandidates.ts +126 -0
  20. package/app/utils/binaryOutput.ts +48 -2
  21. package/app/utils/pipelineRender.spec.ts +46 -1
  22. package/app/utils/pipelineRender.ts +70 -2
  23. package/i18n/locales/de.json +78 -2
  24. package/i18n/locales/en.json +78 -2
  25. package/i18n/locales/es.json +78 -2
  26. package/i18n/locales/fr.json +78 -2
  27. package/i18n/locales/he.json +78 -2
  28. package/i18n/locales/it.json +78 -2
  29. package/i18n/locales/ja.json +78 -2
  30. package/i18n/locales/pl.json +78 -2
  31. package/i18n/locales/tr.json +78 -2
  32. package/i18n/locales/uk.json +78 -2
  33. package/i18n/plural-forms.spec.ts +15 -0
  34. package/package.json +2 -2
@@ -133,10 +133,17 @@ export function isCompanionKind(kind: string): boolean {
133
133
  )
134
134
  }
135
135
 
136
+ /**
137
+ * The parks a surface must NOT answer with the generic approve rail, named so the tables below
138
+ * and every consumer can be keyed exhaustively by them rather than by a string.
139
+ */
140
+ export type DedicatedParkView = 'follow-ups' | 'fork-decision' | 'binary-candidates' | 'input-gate'
141
+
136
142
  /**
137
143
  * The dedicated window that owns a step's approval park, when the park is NOT a generic
138
144
  * prose approval: the implementation-fork window while a coder waits on (or chats about)
139
- * an approach choice, or the follow-up triage window while surfaced items are undecided.
145
+ * an approach choice, the follow-up triage window while surfaced items are undecided, or the
146
+ * candidate-comparison window while a generating step waits on which candidates survive.
140
147
  * The generic approve/request-changes/reject resolvers deliberately refuse these parks
141
148
  * server-side (`assertNotIterativeGate`), so every surface that offers a step's pending
142
149
  * approval must route these to their window instead of the generic "Approve & proceed"
@@ -149,7 +156,7 @@ export function isCompanionKind(kind: string): boolean {
149
156
  export function dedicatedParkView(
150
157
  step: PipelineStep,
151
158
  instance: ExecutionInstance | null | undefined,
152
- ): 'follow-ups' | 'fork-decision' | 'input-gate' | null {
159
+ ): DedicatedParkView | null {
153
160
  // The PRE-DISPATCH INPUT GATE parks whatever step 0 happens to be, so it leaves nothing on the
154
161
  // STEP to recognise it by: its verdict is a fact about the RUN. Checked first, and off the
155
162
  // instance: approving it generically would mark the run's first working step done and skip
@@ -168,6 +175,9 @@ export function dedicatedParkView(
168
175
  // flight) still belongs to the fork window, which renders the pending reply.
169
176
  const fork = step.forkDecision?.status
170
177
  if (fork === 'awaiting_choice' || fork === 'answering') return 'fork-decision'
178
+ // A generating step parked between its candidate pass and its delivering pass. Approving it
179
+ // generically would mark a step done that has staged files and delivered nothing.
180
+ if (step.binaryCandidates?.status === 'awaiting_choice') return 'binary-candidates'
171
181
  // Follow-ups only own the park itself: while the coder is still WORKING (streaming
172
182
  // items, no approval raised) a step click should keep opening the ordinary detail.
173
183
  if (
@@ -180,6 +190,64 @@ export function dedicatedParkView(
180
190
  return null
181
191
  }
182
192
 
193
+ /**
194
+ * The parks a dedicated WINDOW answers: every member of {@link DedicatedParkView} except the
195
+ * pre-dispatch input gate, which is answered by an inline notice because its remedy is to go and
196
+ * edit the task.
197
+ */
198
+ export type RedirectParkView = Exclude<DedicatedParkView, 'input-gate'>
199
+
200
+ /** How a redirect park presents itself on a surface that has to send a human to its window. */
201
+ export interface RedirectParkPresentation {
202
+ icon: string
203
+ /** Prose explaining why the generic approve rail is not offered here. */
204
+ noticeKey: string
205
+ /** The label on the step overlay's redirect button, which has room for a full phrase. */
206
+ actionKey: string
207
+ /**
208
+ * The label on the inspector's compact action rail. A separate key rather than a reuse of
209
+ * {@link actionKey}: that rail sits in a list of one-line step rows and words the same action
210
+ * more tersely, and collapsing the two would silently restyle copy that is already shipped.
211
+ */
212
+ railActionKey: string
213
+ }
214
+
215
+ /**
216
+ * What each redirect park LOOKS like, in one exhaustive table.
217
+ *
218
+ * A `Record` over the vocabulary rather than a ternary at each of the three surfaces that render
219
+ * one (the step overlay's redirect notice, the pipeline chip, the inspector's action rail),
220
+ * because a ternary has no arm for a member it has never heard of: adding `binary-candidates` to
221
+ * {@link dedicatedParkView} left every one of those surfaces rendering the FORK's copy and icon
222
+ * for it, which is worse than rendering nothing: it names the wrong decision, and the surfaces
223
+ * kept compiling and kept passing. Keyed this way, a new park fails the build here until it says
224
+ * how it presents itself, and each surface picks the entry up with no edit of its own.
225
+ *
226
+ * Presentation only. WHICH window opens is the caller's, because the openers differ in what they
227
+ * need to resolve, and a park with no window (`input-gate`) is excluded from the type entirely
228
+ * rather than carrying null fields nobody may read.
229
+ */
230
+ export const REDIRECT_PARK_PRESENTATION: Record<RedirectParkView, RedirectParkPresentation> = {
231
+ 'follow-ups': {
232
+ icon: 'i-lucide-compass',
233
+ noticeKey: 'panels.stepDetail.followUpsParked',
234
+ actionKey: 'panels.stepDetail.openFollowUps',
235
+ railActionKey: 'inspector.execution.triageFollowUps',
236
+ },
237
+ 'fork-decision': {
238
+ icon: 'i-lucide-git-fork',
239
+ noticeKey: 'panels.stepDetail.forkParked',
240
+ actionKey: 'panels.stepDetail.chooseApproach',
241
+ railActionKey: 'inspector.execution.chooseApproach',
242
+ },
243
+ 'binary-candidates': {
244
+ icon: 'i-lucide-images',
245
+ noticeKey: 'panels.stepDetail.candidatesParked',
246
+ actionKey: 'panels.stepDetail.chooseCandidates',
247
+ railActionKey: 'inspector.execution.chooseCandidates',
248
+ },
249
+ }
250
+
183
251
  /**
184
252
  * The friendly label for a container's live phase (clone → "Preparing workspace",
185
253
  * agent → "Agent running", …), falling back to the raw phase string for an unknown/new
@@ -1654,6 +1654,7 @@
1654
1654
  "mergePr": "PR mergen",
1655
1655
  "chooseApproach": "Ansatz wählen",
1656
1656
  "triageFollowUps": "Folgeaufgaben entscheiden",
1657
+ "chooseCandidates": "Kandidaten entscheiden",
1657
1658
  "elapsedTooltip": "Verstrichene Zeit für diesen Schritt",
1658
1659
  "reviewFindings": "Befunde prüfen",
1659
1660
  "dryRun": "Probelauf",
@@ -1932,8 +1933,10 @@
1932
1933
  "decisionRequired": "Entscheidung erforderlich",
1933
1934
  "followUpsParked": "Der Coder hat Folgeaufgaben aufgeworfen, die entschieden werden müssen, bevor der Lauf fortgesetzt werden kann. Bearbeite jeden Punkt (anlegen, zurückgeben, beantworten oder verwerfen) im Folgeaufgaben-Fenster.",
1934
1935
  "forkParked": "Dieser Coder-Schritt wartet darauf, dass ein Implementierungsansatz gewählt wird, bevor Code geschrieben wird. Wähle einen vorgeschlagenen Ansatz (oder gib einen eigenen ein) im Entscheidungsfenster.",
1936
+ "candidatesParked": "Dieser Schritt hat Kandidaten erzeugt und wartet darauf, dass jemand auswählt, welche behalten werden, bevor er etwas ausliefert. Vergleiche sie im Kandidatenfenster und behalte, was du möchtest.",
1935
1937
  "openFollowUps": "Folgeaufgaben öffnen",
1936
1938
  "chooseApproach": "Ansatz wählen",
1939
+ "chooseCandidates": "Kandidaten wählen",
1937
1940
  "expandAll": "Alle Abschnitte ausklappen",
1938
1941
  "collapseAll": "Alle Abschnitte einklappen",
1939
1942
  "copyRawOutput": "Rohausgabe kopieren",
@@ -4327,7 +4330,45 @@
4327
4330
  "3d-model": "3D-Modelle",
4328
4331
  "3d-scene": "3D-Szenen",
4329
4332
  "document": "Dokumente"
4330
- }
4333
+ },
4334
+ "binaryCapability": {
4335
+ "reference-image": "Referenzbild",
4336
+ "multi-reference": "Mehrere Referenzbilder",
4337
+ "instruction-edit": "Bearbeitung per Anweisung",
4338
+ "mask-edit": "Maskierte Bearbeitung",
4339
+ "negative-prompt": "Negativer Prompt",
4340
+ "seed": "Fester Seed",
4341
+ "aspect-ratio": "Seitenverhältnis",
4342
+ "candidate-batch": "Mehrere Kandidaten pro Aufruf",
4343
+ "upscale": "Hochskalierung",
4344
+ "transparent-background": "Transparenter Hintergrund",
4345
+ "tileable": "Nahtlos kachelbar"
4346
+ },
4347
+ "binaryCapabilityUnknown": "{capability} (eine Fähigkeit, die diese Installation nicht definiert)",
4348
+ "binaryCapabilityUnsupported": "Keine ausgewählte Integration unterstützt {capabilities}, was die Generierungsoptionen dieses Schritts verlangen. Entferne die Option oder wähle eine Integration, die die Fähigkeit deklariert.",
4349
+ "binaryCapabilityUnverifiable": "Keine ausgewählte Integration deklariert Unterstützung für {capabilities}, aber eine von ihnen deklariert überhaupt keine Fähigkeiten, daher konnte das nicht geprüft werden. Der Schritt startet trotzdem; prüfe es in der API der Integration.",
4350
+ "binaryReferenceImages": "Referenzbilder",
4351
+ "binaryReferenceImagesPlaceholder": "Rolle{'|'}Ort{'|'}Dienst, eine pro Zeile",
4352
+ "binaryReferenceImagesUnusable": "Nicht als Referenz gespeichert: {entries}. Jede Zeile muss Rolle{'|'}Ort sein, wobei die Rolle style, subject, composition oder base ist.",
4353
+ "binaryEditMode": "Vorhandenes bearbeiten",
4354
+ "binaryEditModeNone": "Neu generieren",
4355
+ "binaryEditModeInstruction": "Per Anweisung",
4356
+ "binaryEditModeMask": "Maskierter Bereich",
4357
+ "binaryEditInstruction": "Was geändert wird",
4358
+ "binaryEditInstructionPlaceholder": "z. B. den Himmel ersetzen",
4359
+ "binaryNegativePrompt": "Negativer Prompt",
4360
+ "binaryNegativePromptPlaceholder": "was vermieden werden soll",
4361
+ "binaryAspectRatio": "Seitenverhältnis",
4362
+ "binaryAspectRatioPlaceholder": "16:9",
4363
+ "binarySeed": "Seed",
4364
+ "binarySeedPlaceholder": "fester Seed",
4365
+ "binaryTransparent": "Transparenter Hintergrund",
4366
+ "binaryTileable": "Nahtlos kachelbar",
4367
+ "binaryUpscale": "Ergebnis hochskalieren",
4368
+ "binaryComparison": "Kandidaten vor der Lieferung vergleichen",
4369
+ "binaryPerGenerator": "Kandidaten pro Integration",
4370
+ "binaryMultiSelect": "Mehrere behalten erlauben",
4371
+ "binaryComparisonUnreachable": "Dieser Schritt kann nur einen Kandidaten pro Motiv erzeugen, es gäbe also nichts zu vergleichen und der einzige würde ungefragt behalten. Wähle eine zweite Integration oder erhöhe die Anzahl der Kandidaten pro Integration."
4331
4372
  },
4332
4373
  "progress": {
4333
4374
  "status": {
@@ -4374,6 +4415,9 @@
4374
4415
  "proposing": "Ansätze werden vorgeschlagen…",
4375
4416
  "choose": "Ansatz wählen"
4376
4417
  },
4418
+ "binaryCandidates": {
4419
+ "choose": "Kandidaten wählen"
4420
+ },
4377
4421
  "elapsedTooltip": "Verstrichene Zeit für diesen Schritt",
4378
4422
  "prReview": {
4379
4423
  "review": "Befunde prüfen"
@@ -5023,7 +5067,12 @@
5023
5067
  "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.",
5024
5068
  "generatorsUnverified": "Die generativen Integrationen dieser Installation konnten beim Abschluss des Schritts nicht gelesen werden, daher wurden die unten genannten Integrationen nicht dagegen geprüft. Die Einträge bleiben wie angegeben erhalten."
5025
5069
  },
5026
- "unknownGeneratorBadge": "Nicht registriert"
5070
+ "unknownGeneratorBadge": "Nicht registriert",
5071
+ "candidates": {
5072
+ "automatic": "{total} Kandidat wurde erzeugt und ohne Prüfung automatisch behalten.",
5073
+ "chosen": "{kept} von {total} erzeugten Kandidaten wurden behalten.",
5074
+ "awaiting": "{total} Kandidaten wurden erzeugt und warten auf den Vergleich."
5075
+ }
5027
5076
  },
5028
5077
  "brainstorm": {
5029
5078
  "title": {
@@ -7551,5 +7600,32 @@
7551
7600
  "resolverFailed": "Beim Ermitteln der Adresse ist in diesem Tool ein Fehler aufgetreten. Die Ursache steht in der Browser-Konsole, für die Betreuer dieser Installation.",
7552
7601
  "unsafeUrl": "Dieses Tool hat eine Adresse geliefert, die kein Weblink ist, und wurde daher nicht geöffnet."
7553
7602
  }
7603
+ },
7604
+ "binaryCandidates": {
7605
+ "title": "Erzeugte Kandidaten",
7606
+ "titleWithBlock": "Erzeugte Kandidaten: {title}",
7607
+ "subtitle": "Vergleiche, was jede Integration erzeugt hat, und behalte, was du willst",
7608
+ "automatic": "Es wurde nur ein Kandidat erzeugt, daher wurde er automatisch behalten. Niemand hat ihn geprüft.",
7609
+ "unlabelledSubject": "Kein Motiv angegeben",
7610
+ "noPreview": "Keine Vorschau verfügbar",
7611
+ "fromGenerator": "Von {generator}",
7612
+ "unattributed": "Keine Integration erfasst",
7613
+ "kept": "Behalten",
7614
+ "keptAs": "Behalten als {id}",
7615
+ "storeAsPlaceholder": "unter dieser ID ablegen",
7616
+ "notePlaceholder": "Was beim Ablegen geändert werden soll (optional)",
7617
+ "missingAlias": "Gib jedem behaltenen Kandidaten eine eigene ID, sonst würden alle unter demselben Namen abgelegt.",
7618
+ "duplicateAlias": "Zwei behaltene Kandidaten teilen sich eine ID. Zwei Artefakte an einem Ort sind ein Artefakt.",
7619
+ "keepAction": "{count} behalten",
7620
+ "warning": {
7621
+ "omitted": "{count} Kandidaten wurden über der Obergrenze verworfen, diese Liste ist also ein Anfang. ",
7622
+ "invalid": "{count} deklarierte Einträge waren unlesbar und fehlen hier. ",
7623
+ "previews": "{count} Vorschaulinks wurden abgelehnt, diese Kandidaten werden ohne Bild dargestellt."
7624
+ },
7625
+ "noChoice": {
7626
+ "undeclared": "Der Schritt hat seine Kandidaten nie deklariert, es gab also nichts zu vergleichen. Der Lauf ging weiter.",
7627
+ "parseFailed": "Die Kandidaten-Deklaration des Schritts war nicht lesbar, es gab also nichts zu vergleichen. Der Lauf ging weiter.",
7628
+ "noCandidates": "Der Schritt hat keine Kandidaten bereitgestellt, es gab also nichts zu vergleichen. Der Lauf ging weiter."
7629
+ }
7554
7630
  }
7555
7631
  }
@@ -1196,6 +1196,7 @@
1196
1196
  "mergePr": "Merge PR",
1197
1197
  "chooseApproach": "Choose approach",
1198
1198
  "triageFollowUps": "Decide follow-ups",
1199
+ "chooseCandidates": "Decide candidates",
1199
1200
  "elapsedTooltip": "Elapsed time on this step",
1200
1201
  "reviewFindings": "Review findings",
1201
1202
  "dryRun": "Dry run",
@@ -1478,8 +1479,10 @@
1478
1479
  "decisionRequired": "Decision required",
1479
1480
  "followUpsParked": "The Coder surfaced follow-up items that need a decision before the run can continue. Triage each item (file, send back, answer, or dismiss) in the follow-ups window.",
1480
1481
  "forkParked": "This Coder step is waiting for an implementation approach to be chosen before any code is written. Pick a proposed approach (or enter your own) in the fork-decision window.",
1482
+ "candidatesParked": "This step generated candidates and is waiting for someone to choose which ones to keep before it delivers anything. Compare them and keep what you want in the candidates window.",
1481
1483
  "openFollowUps": "Open follow-ups",
1482
1484
  "chooseApproach": "Choose approach",
1485
+ "chooseCandidates": "Choose candidates",
1483
1486
  "expandAll": "Expand all sections",
1484
1487
  "collapseAll": "Collapse all sections",
1485
1488
  "copyRawOutput": "Copy raw output",
@@ -4917,7 +4920,45 @@
4917
4920
  "3d-model": "3D models",
4918
4921
  "3d-scene": "3D scenes",
4919
4922
  "document": "Documents"
4920
- }
4923
+ },
4924
+ "binaryCapability": {
4925
+ "reference-image": "Reference image",
4926
+ "multi-reference": "Several reference images",
4927
+ "instruction-edit": "Editing from an instruction",
4928
+ "mask-edit": "Masked editing",
4929
+ "negative-prompt": "Negative prompt",
4930
+ "seed": "Fixed seed",
4931
+ "aspect-ratio": "Aspect ratio",
4932
+ "candidate-batch": "Several candidates per call",
4933
+ "upscale": "Upscaling",
4934
+ "transparent-background": "Transparent background",
4935
+ "tileable": "Seamless tiling"
4936
+ },
4937
+ "binaryCapabilityUnknown": "{capability} (a capability this deployment does not define)",
4938
+ "binaryCapabilityUnsupported": "No selected integration supports {capabilities}, which this step's generation options ask for. Remove the option, or select an integration that declares the capability.",
4939
+ "binaryCapabilityUnverifiable": "No selected integration declares support for {capabilities}, but one of them declares no capabilities at all, so this could not be checked. The step still starts; confirm it from the integration’s API.",
4940
+ "binaryReferenceImages": "Reference images",
4941
+ "binaryReferenceImagesPlaceholder": "role{'|'}location{'|'}service, one per line",
4942
+ "binaryReferenceImagesUnusable": "Not stored as references: {entries}. Each line must be role{'|'}location, where role is style, subject, composition or base.",
4943
+ "binaryEditMode": "Edit existing",
4944
+ "binaryEditModeNone": "Generate new",
4945
+ "binaryEditModeInstruction": "From an instruction",
4946
+ "binaryEditModeMask": "Masked region",
4947
+ "binaryEditInstruction": "What to change",
4948
+ "binaryEditInstructionPlaceholder": "e.g. replace the sky",
4949
+ "binaryNegativePrompt": "Negative prompt",
4950
+ "binaryNegativePromptPlaceholder": "what to keep out",
4951
+ "binaryAspectRatio": "Aspect ratio",
4952
+ "binaryAspectRatioPlaceholder": "16:9",
4953
+ "binarySeed": "Seed",
4954
+ "binarySeedPlaceholder": "fixed seed",
4955
+ "binaryTransparent": "Transparent background",
4956
+ "binaryTileable": "Seamless tiling",
4957
+ "binaryUpscale": "Upscale the result",
4958
+ "binaryComparison": "Compare candidates before delivering",
4959
+ "binaryPerGenerator": "Candidates per integration",
4960
+ "binaryMultiSelect": "Allow keeping more than one",
4961
+ "binaryComparisonUnreachable": "This step can only produce one candidate per subject, so nothing would be compared and the only one would be kept without asking. Select a second integration, or raise the candidates-per-integration count."
4921
4962
  },
4922
4963
  "progress": {
4923
4964
  "status": {
@@ -4964,6 +5005,9 @@
4964
5005
  "proposing": "Proposing approaches…",
4965
5006
  "choose": "Choose an approach"
4966
5007
  },
5008
+ "binaryCandidates": {
5009
+ "choose": "Choose candidates"
5010
+ },
4967
5011
  "elapsedTooltip": "Elapsed time on this step",
4968
5012
  "prReview": {
4969
5013
  "review": "Review findings"
@@ -6550,7 +6594,12 @@
6550
6594
  "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.",
6551
6595
  "generatorsUnverified": "This deployment's generative integrations could not be read when the step settled, so the integrations named below were not checked against them. The entries are kept as claimed."
6552
6596
  },
6553
- "unknownGeneratorBadge": "Not registered"
6597
+ "unknownGeneratorBadge": "Not registered",
6598
+ "candidates": {
6599
+ "automatic": "{total} candidate was generated and kept automatically, without review.",
6600
+ "chosen": "{kept} of {total} generated candidates were kept.",
6601
+ "awaiting": "{total} candidates were generated and are waiting to be compared."
6602
+ }
6554
6603
  },
6555
6604
  "sandbox": {
6556
6605
  "title": "Sandbox: prompt and model testing",
@@ -7815,5 +7864,32 @@
7815
7864
  "resolverFailed": "This tool failed while working out its address. The cause is in the browser console, for whoever maintains this deployment.",
7816
7865
  "unsafeUrl": "This tool returned an address that is not a web link, so it was not opened."
7817
7866
  }
7867
+ },
7868
+ "binaryCandidates": {
7869
+ "title": "Generated candidates",
7870
+ "titleWithBlock": "Generated candidates: {title}",
7871
+ "subtitle": "Compare what each integration produced, and keep what you want",
7872
+ "automatic": "Only one candidate was generated, so it was kept automatically. Nobody reviewed it.",
7873
+ "unlabelledSubject": "No subject declared",
7874
+ "noPreview": "No preview available",
7875
+ "fromGenerator": "From {generator}",
7876
+ "unattributed": "No integration recorded",
7877
+ "kept": "Kept",
7878
+ "keptAs": "Kept as {id}",
7879
+ "storeAsPlaceholder": "store under this id",
7880
+ "notePlaceholder": "Anything to change when storing these (optional)",
7881
+ "missingAlias": "Give each kept candidate its own id, or they would all be stored under the same name.",
7882
+ "duplicateAlias": "Two kept candidates share an id. Two artifacts at one location is one artifact.",
7883
+ "keepAction": "Keep {count}",
7884
+ "warning": {
7885
+ "omitted": "{count} candidates were dropped past the cap, so this list is a prefix. ",
7886
+ "invalid": "{count} declared entries were unreadable and are missing here. ",
7887
+ "previews": "{count} preview links were refused, so those candidates render without an image."
7888
+ },
7889
+ "noChoice": {
7890
+ "undeclared": "The step never declared its candidates, so there was nothing to compare. The run continued.",
7891
+ "parseFailed": "The step’s candidate declaration could not be read, so there was nothing to compare. The run continued.",
7892
+ "noCandidates": "The step staged no candidates, so there was nothing to compare. The run continued."
7893
+ }
7818
7894
  }
7819
7895
  }
@@ -1109,6 +1109,7 @@
1109
1109
  },
1110
1110
  "chooseApproach": "Elegir enfoque",
1111
1111
  "triageFollowUps": "Decidir seguimientos",
1112
+ "chooseCandidates": "Decidir candidatos",
1112
1113
  "elapsedTooltip": "Tiempo transcurrido en este paso",
1113
1114
  "reviewFindings": "Revisar hallazgos",
1114
1115
  "dryRun": "Ejecución de prueba",
@@ -1387,8 +1388,10 @@
1387
1388
  "decisionRequired": "Se requiere una decisión",
1388
1389
  "followUpsParked": "El Coder planteó seguimientos que necesitan una decisión antes de que la ejecución pueda continuar. Resuelve cada elemento (crear, devolver, responder o descartar) en la ventana de seguimientos.",
1389
1390
  "forkParked": "Este paso del Coder espera a que se elija un enfoque de implementación antes de escribir código. Elige un enfoque propuesto (o introduce el tuyo) en la ventana de decisión.",
1391
+ "candidatesParked": "Este paso generó candidatos y espera a que alguien elija cuáles conservar antes de entregar nada. Compáralos y conserva los que quieras en la ventana de candidatos.",
1390
1392
  "openFollowUps": "Abrir seguimientos",
1391
1393
  "chooseApproach": "Elegir enfoque",
1394
+ "chooseCandidates": "Elegir candidatos",
1392
1395
  "expandAll": "Expandir todas las secciones",
1393
1396
  "collapseAll": "Contraer todas las secciones",
1394
1397
  "copyRawOutput": "Copiar salida sin procesar",
@@ -4766,7 +4769,45 @@
4766
4769
  "3d-model": "Modelos 3D",
4767
4770
  "3d-scene": "Escenas 3D",
4768
4771
  "document": "Documentos"
4769
- }
4772
+ },
4773
+ "binaryCapability": {
4774
+ "reference-image": "Imagen de referencia",
4775
+ "multi-reference": "Varias imágenes de referencia",
4776
+ "instruction-edit": "Edición por instrucción",
4777
+ "mask-edit": "Edición con máscara",
4778
+ "negative-prompt": "Prompt negativo",
4779
+ "seed": "Semilla fija",
4780
+ "aspect-ratio": "Relación de aspecto",
4781
+ "candidate-batch": "Varios candidatos por llamada",
4782
+ "upscale": "Ampliación",
4783
+ "transparent-background": "Fondo transparente",
4784
+ "tileable": "Mosaico sin costuras"
4785
+ },
4786
+ "binaryCapabilityUnknown": "{capability} (una capacidad que esta instalación no define)",
4787
+ "binaryCapabilityUnsupported": "Ninguna integración seleccionada admite {capabilities}, que las opciones de generación de este paso solicitan. Quita la opción o selecciona una integración que declare la capacidad.",
4788
+ "binaryCapabilityUnverifiable": "Ninguna integración seleccionada declara admitir {capabilities}, pero una de ellas no declara capacidad alguna, así que no se pudo comprobar. El paso arranca igualmente; confírmalo en la API de la integración.",
4789
+ "binaryReferenceImages": "Imágenes de referencia",
4790
+ "binaryReferenceImagesPlaceholder": "rol{'|'}ubicación{'|'}servicio, una por línea",
4791
+ "binaryReferenceImagesUnusable": "No se guardaron como referencia: {entries}. Cada línea debe ser rol{'|'}ubicación, con el rol style, subject, composition o base.",
4792
+ "binaryEditMode": "Editar existente",
4793
+ "binaryEditModeNone": "Generar nuevo",
4794
+ "binaryEditModeInstruction": "Con una instrucción",
4795
+ "binaryEditModeMask": "Región enmascarada",
4796
+ "binaryEditInstruction": "Qué cambiar",
4797
+ "binaryEditInstructionPlaceholder": "p. ej. sustituir el cielo",
4798
+ "binaryNegativePrompt": "Prompt negativo",
4799
+ "binaryNegativePromptPlaceholder": "qué evitar",
4800
+ "binaryAspectRatio": "Relación de aspecto",
4801
+ "binaryAspectRatioPlaceholder": "16:9",
4802
+ "binarySeed": "Semilla",
4803
+ "binarySeedPlaceholder": "semilla fija",
4804
+ "binaryTransparent": "Fondo transparente",
4805
+ "binaryTileable": "Mosaico sin costuras",
4806
+ "binaryUpscale": "Ampliar el resultado",
4807
+ "binaryComparison": "Comparar candidatos antes de entregar",
4808
+ "binaryPerGenerator": "Candidatos por integración",
4809
+ "binaryMultiSelect": "Permitir conservar más de uno",
4810
+ "binaryComparisonUnreachable": "Este paso solo puede producir un candidato por sujeto, así que no habría nada que comparar y el único se conservaría sin preguntar. Selecciona una segunda integración o sube el número de candidatos por integración."
4770
4811
  },
4771
4812
  "progress": {
4772
4813
  "status": {
@@ -4813,6 +4854,9 @@
4813
4854
  "proposing": "Proponiendo enfoques…",
4814
4855
  "choose": "Elegir un enfoque"
4815
4856
  },
4857
+ "binaryCandidates": {
4858
+ "choose": "Elegir candidatos"
4859
+ },
4816
4860
  "elapsedTooltip": "Tiempo transcurrido en este paso",
4817
4861
  "prReview": {
4818
4862
  "review": "Revisar hallazgos"
@@ -6265,7 +6309,12 @@
6265
6309
  "unknownGenerators": "Nombró una integración generativa que esta instalación no registra: {ids}. La entrada se conserva tal como se declaró; la integración se registra en el código de la instalación, no en este espacio de trabajo. | Nombró integraciones generativas que esta instalación no registra: {ids}. Sus entradas se conservan tal como se declararon; las integraciones se registran en el código de la instalación, no en este espacio de trabajo.",
6266
6310
  "generatorsUnverified": "No se han podido leer las integraciones generativas de esta instalación al cerrarse el paso, así que las integraciones indicadas abajo no se han contrastado con ellas. Las entradas se conservan tal como se declararon."
6267
6311
  },
6268
- "unknownGeneratorBadge": "No registrada"
6312
+ "unknownGeneratorBadge": "No registrada",
6313
+ "candidates": {
6314
+ "automatic": "Se generó {total} candidato y se conservó automáticamente, sin revisión.",
6315
+ "chosen": "Se conservaron {kept} de {total} candidatos generados.",
6316
+ "awaiting": "Se generaron {total} candidatos y están a la espera de compararse."
6317
+ }
6269
6318
  },
6270
6319
  "sandbox": {
6271
6320
  "title": "Sandbox: pruebas de prompts y modelos",
@@ -7551,5 +7600,32 @@
7551
7600
  "resolverFailed": "Esta herramienta falló al calcular su dirección. La causa está en la consola del navegador, para quien mantiene esta instalación.",
7552
7601
  "unsafeUrl": "Esta herramienta devolvió una dirección que no es un enlace web, así que no se abrió."
7553
7602
  }
7603
+ },
7604
+ "binaryCandidates": {
7605
+ "title": "Candidatos generados",
7606
+ "titleWithBlock": "Candidatos generados: {title}",
7607
+ "subtitle": "Compara lo que produjo cada integración y conserva lo que quieras",
7608
+ "automatic": "Solo se generó un candidato, así que se conservó automáticamente. Nadie lo revisó.",
7609
+ "unlabelledSubject": "Sin sujeto declarado",
7610
+ "noPreview": "Sin vista previa disponible",
7611
+ "fromGenerator": "De {generator}",
7612
+ "unattributed": "Sin integración registrada",
7613
+ "kept": "Conservado",
7614
+ "keptAs": "Conservado como {id}",
7615
+ "storeAsPlaceholder": "guardar con este id",
7616
+ "notePlaceholder": "Algo que cambiar al guardarlos (opcional)",
7617
+ "missingAlias": "Da a cada candidato conservado su propio id, o todos se guardarían con el mismo nombre.",
7618
+ "duplicateAlias": "Dos candidatos conservados comparten un id. Dos artefactos en una ubicación son un artefacto.",
7619
+ "keepAction": "Conservar {count}",
7620
+ "warning": {
7621
+ "omitted": "Se descartaron {count} candidatos por encima del límite, así que esta lista es un prefijo. ",
7622
+ "invalid": "{count} entradas declaradas eran ilegibles y faltan aquí. ",
7623
+ "previews": "Se rechazaron {count} enlaces de vista previa, así que esos candidatos se muestran sin imagen."
7624
+ },
7625
+ "noChoice": {
7626
+ "undeclared": "El paso nunca declaró sus candidatos, así que no había nada que comparar. La ejecución continuó.",
7627
+ "parseFailed": "No se pudo leer la declaración de candidatos del paso, así que no había nada que comparar. La ejecución continuó.",
7628
+ "noCandidates": "El paso no preparó ningún candidato, así que no había nada que comparar. La ejecución continuó."
7629
+ }
7554
7630
  }
7555
7631
  }
@@ -1109,6 +1109,7 @@
1109
1109
  },
1110
1110
  "chooseApproach": "Choisir l'approche",
1111
1111
  "triageFollowUps": "Trancher les suivis",
1112
+ "chooseCandidates": "Trancher les candidats",
1112
1113
  "elapsedTooltip": "Temps écoulé sur cette étape",
1113
1114
  "reviewFindings": "Examiner les remarques",
1114
1115
  "dryRun": "Exécution à blanc",
@@ -1387,8 +1388,10 @@
1387
1388
  "decisionRequired": "Décision requise",
1388
1389
  "followUpsParked": "Le Coder a soulevé des suivis qui doivent être tranchés avant que l'exécution puisse continuer. Traitez chaque élément (créer, renvoyer, répondre ou écarter) dans la fenêtre des suivis.",
1389
1390
  "forkParked": "Cette étape du Coder attend le choix d'une approche d'implémentation avant d'écrire du code. Choisissez une approche proposée (ou saisissez la vôtre) dans la fenêtre de décision.",
1391
+ "candidatesParked": "Cette étape a généré des candidats et attend que quelqu'un choisisse ceux à conserver avant de livrer quoi que ce soit. Comparez-les et conservez ceux que vous voulez dans la fenêtre des candidats.",
1390
1392
  "openFollowUps": "Ouvrir les suivis",
1391
1393
  "chooseApproach": "Choisir l'approche",
1394
+ "chooseCandidates": "Choisir les candidats",
1392
1395
  "expandAll": "Développer toutes les sections",
1393
1396
  "collapseAll": "Réduire toutes les sections",
1394
1397
  "copyRawOutput": "Copier la sortie brute",
@@ -4766,7 +4769,45 @@
4766
4769
  "3d-model": "Modèles 3D",
4767
4770
  "3d-scene": "Scènes 3D",
4768
4771
  "document": "Documents"
4769
- }
4772
+ },
4773
+ "binaryCapability": {
4774
+ "reference-image": "Image de référence",
4775
+ "multi-reference": "Plusieurs images de référence",
4776
+ "instruction-edit": "Édition par instruction",
4777
+ "mask-edit": "Édition par masque",
4778
+ "negative-prompt": "Prompt négatif",
4779
+ "seed": "Graine fixe",
4780
+ "aspect-ratio": "Format d’image",
4781
+ "candidate-batch": "Plusieurs candidats par appel",
4782
+ "upscale": "Agrandissement",
4783
+ "transparent-background": "Fond transparent",
4784
+ "tileable": "Motif raccordable"
4785
+ },
4786
+ "binaryCapabilityUnknown": "{capability} (une capacité que ce déploiement ne définit pas)",
4787
+ "binaryCapabilityUnsupported": "Aucune intégration sélectionnée ne prend en charge {capabilities}, que les options de génération de cette étape demandent. Retirez l’option ou sélectionnez une intégration qui déclare la capacité.",
4788
+ "binaryCapabilityUnverifiable": "Aucune intégration sélectionnée ne déclare prendre en charge {capabilities}, mais l’une d’elles ne déclare aucune capacité, la vérification est donc impossible. L’étape démarre quand même ; confirmez-le dans l’API de l’intégration.",
4789
+ "binaryReferenceImages": "Images de référence",
4790
+ "binaryReferenceImagesPlaceholder": "rôle{'|'}emplacement{'|'}service, une par ligne",
4791
+ "binaryReferenceImagesUnusable": "Non enregistrées comme référence : {entries}. Chaque ligne doit être rôle{'|'}emplacement, le rôle étant style, subject, composition ou base.",
4792
+ "binaryEditMode": "Modifier l’existant",
4793
+ "binaryEditModeNone": "Générer du neuf",
4794
+ "binaryEditModeInstruction": "À partir d’une instruction",
4795
+ "binaryEditModeMask": "Zone masquée",
4796
+ "binaryEditInstruction": "Ce qu’il faut changer",
4797
+ "binaryEditInstructionPlaceholder": "ex. remplacer le ciel",
4798
+ "binaryNegativePrompt": "Prompt négatif",
4799
+ "binaryNegativePromptPlaceholder": "ce qu’il faut éviter",
4800
+ "binaryAspectRatio": "Format d’image",
4801
+ "binaryAspectRatioPlaceholder": "16:9",
4802
+ "binarySeed": "Graine",
4803
+ "binarySeedPlaceholder": "graine fixe",
4804
+ "binaryTransparent": "Fond transparent",
4805
+ "binaryTileable": "Motif raccordable",
4806
+ "binaryUpscale": "Agrandir le résultat",
4807
+ "binaryComparison": "Comparer les candidats avant livraison",
4808
+ "binaryPerGenerator": "Candidats par intégration",
4809
+ "binaryMultiSelect": "Autoriser à en conserver plusieurs",
4810
+ "binaryComparisonUnreachable": "Cette étape ne peut produire qu’un candidat par sujet : il n’y aurait rien à comparer et le seul serait conservé sans être présenté. Sélectionnez une deuxième intégration ou augmentez le nombre de candidats par intégration."
4770
4811
  },
4771
4812
  "progress": {
4772
4813
  "status": {
@@ -4813,6 +4854,9 @@
4813
4854
  "proposing": "Proposition d'approches…",
4814
4855
  "choose": "Choisir une approche"
4815
4856
  },
4857
+ "binaryCandidates": {
4858
+ "choose": "Choisir des candidats"
4859
+ },
4816
4860
  "elapsedTooltip": "Temps écoulé sur cette étape",
4817
4861
  "prReview": {
4818
4862
  "review": "Examiner les remarques"
@@ -6265,7 +6309,12 @@
6265
6309
  "unknownGenerators": "A nommé une intégration générative que ce déploiement n'enregistre pas : {ids}. L'entrée est conservée telle que déclarée ; l'intégration s'enregistre dans le code du déploiement, pas dans cet espace de travail. | A nommé des intégrations génératives que ce déploiement n'enregistre pas : {ids}. Leurs entrées sont conservées telles que déclarées ; les intégrations s'enregistrent dans le code du déploiement, pas dans cet espace de travail.",
6266
6310
  "generatorsUnverified": "Les intégrations génératives de ce déploiement n'ont pas pu être lues à la clôture de l'étape, les intégrations citées ci-dessous n'ont donc pas été vérifiées. Les entrées sont conservées telles que déclarées."
6267
6311
  },
6268
- "unknownGeneratorBadge": "Non enregistrée"
6312
+ "unknownGeneratorBadge": "Non enregistrée",
6313
+ "candidates": {
6314
+ "automatic": "{total} candidat a été généré et conservé automatiquement, sans examen.",
6315
+ "chosen": "{kept} des {total} candidats générés ont été conservés.",
6316
+ "awaiting": "{total} candidats ont été générés et attendent d’être comparés."
6317
+ }
6269
6318
  },
6270
6319
  "sandbox": {
6271
6320
  "title": "Bac à sable : test de prompts et de modèles",
@@ -7551,5 +7600,32 @@
7551
7600
  "resolverFailed": "Cet outil a échoué lors du calcul de son adresse. La cause se trouve dans la console du navigateur, pour les responsables de ce déploiement.",
7552
7601
  "unsafeUrl": "Cet outil a fourni une adresse qui n'est pas un lien web, elle n'a donc pas été ouverte."
7553
7602
  }
7603
+ },
7604
+ "binaryCandidates": {
7605
+ "title": "Candidats générés",
7606
+ "titleWithBlock": "Candidats générés : {title}",
7607
+ "subtitle": "Comparez ce que chaque intégration a produit et conservez ce que vous voulez",
7608
+ "automatic": "Un seul candidat a été généré, il a donc été conservé automatiquement. Personne ne l’a examiné.",
7609
+ "unlabelledSubject": "Aucun sujet déclaré",
7610
+ "noPreview": "Aucun aperçu disponible",
7611
+ "fromGenerator": "De {generator}",
7612
+ "unattributed": "Aucune intégration enregistrée",
7613
+ "kept": "Conservé",
7614
+ "keptAs": "Conservé sous {id}",
7615
+ "storeAsPlaceholder": "enregistrer sous cet id",
7616
+ "notePlaceholder": "Ce qu’il faut changer au moment de l’enregistrement (facultatif)",
7617
+ "missingAlias": "Donnez à chaque candidat conservé son propre id, sinon ils seraient tous enregistrés sous le même nom.",
7618
+ "duplicateAlias": "Deux candidats conservés partagent un id. Deux artefacts au même emplacement, c’est un artefact.",
7619
+ "keepAction": "Conserver {count}",
7620
+ "warning": {
7621
+ "omitted": "{count} candidats ont été écartés au-delà de la limite, cette liste est donc un préfixe. ",
7622
+ "invalid": "{count} entrées déclarées étaient illisibles et manquent ici. ",
7623
+ "previews": "{count} liens d’aperçu ont été refusés, ces candidats s’affichent donc sans image."
7624
+ },
7625
+ "noChoice": {
7626
+ "undeclared": "L’étape n’a jamais déclaré ses candidats, il n’y avait donc rien à comparer. L’exécution a continué.",
7627
+ "parseFailed": "La déclaration de candidats de l’étape était illisible, il n’y avait donc rien à comparer. L’exécution a continué.",
7628
+ "noCandidates": "L’étape n’a préparé aucun candidat, il n’y avait donc rien à comparer. L’exécution a continué."
7629
+ }
7554
7630
  }
7555
7631
  }