@cat-factory/app 0.204.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.
@@ -126,6 +126,21 @@ const state = computed(() => {
126
126
  >
127
127
  {{ t('binaryOutput.unknownBadge') }}
128
128
  </UBadge>
129
+ <!-- WHAT MADE IT, beside where it went. Absent is a real state, not a gap: a step may
130
+ generate through its own model with no registered integration, so an unattributed
131
+ row is rendered without a generator rather than with an "unknown" one. -->
132
+ <span v-if="row.generator" class="font-mono" data-testid="binary-output-generator">{{
133
+ row.generator
134
+ }}</span>
135
+ <UBadge
136
+ v-if="row.generatorUnknown"
137
+ color="warning"
138
+ variant="subtle"
139
+ size="sm"
140
+ data-testid="binary-output-unknown-generator-badge"
141
+ >
142
+ {{ t('binaryOutput.unknownGeneratorBadge') }}
143
+ </UBadge>
129
144
  <span v-if="row.entity">{{ row.entity }}</span>
130
145
  <span v-if="row.contentType" class="font-mono">{{ row.contentType }}</span>
131
146
  </div>
@@ -160,6 +175,25 @@ const state = computed(() => {
160
175
  )
161
176
  }}
162
177
  </li>
178
+ <!-- The generative twin of the line above, and its own line for the same reason: an
179
+ unregistered integration is fixed in the DEPLOYMENT'S BUILD, where an unknown service is
180
+ fixed in the workspace catalog. The entries themselves are RETAINED, so leaving this out
181
+ would attribute an artifact to something nobody can look up with nothing saying so. -->
182
+ <li
183
+ v-if="view.unknownDeclaredGenerators.length"
184
+ data-testid="binary-output-unknown-generators"
185
+ >
186
+ {{
187
+ t(
188
+ 'binaryOutput.warning.unknownGenerators',
189
+ {
190
+ ids: view.unknownDeclaredGenerators.join(', '),
191
+ count: view.unknownDeclaredGenerators.length,
192
+ },
193
+ view.unknownDeclaredGenerators.length,
194
+ )
195
+ }}
196
+ </li>
163
197
  <li v-if="view.misdirected" data-testid="binary-output-misdirected-note">
164
198
  {{
165
199
  t(
@@ -13,16 +13,45 @@
13
13
  // `asset-storage` capability, because that is exactly what run admission re-validates against
14
14
  // at every start/retry/restart. Offering an id from a stale client copy would let a step save
15
15
  // clean and fail one refusal cycle later.
16
+ //
17
+ // The GENERATIVE half answers the other question — what MAKES the artifacts — and its candidates
18
+ // come from a different place: the integrations are registered in the deployment's CODE, so they
19
+ // ride the workspace snapshot (`binaryGenerators`) rather than a catalog read. Both halves are
20
+ // offered here because a step needs both to work, and only this surface can tell a human that the
21
+ // content types it promises to deliver are not covered by anything it selected.
16
22
  import { computed } from 'vue'
17
- import { ASSET_STORAGE_CAPABILITY, GENERATION_CONTEXT_CAPABILITY } from '@cat-factory/contracts'
23
+ import {
24
+ ASSET_STORAGE_CAPABILITY,
25
+ GENERATION_CONTEXT_CAPABILITY,
26
+ type BinaryModality,
27
+ type BinaryOutputConfig,
28
+ } from '@cat-factory/contracts'
18
29
  import { binaryOutputPickIssues, type BinaryOutputPickIssue } from '~/utils/binaryOutput'
19
30
 
20
31
  const props = defineProps<{ index: number }>()
21
32
 
22
33
  const pipelines = usePipelinesStore()
23
34
  const catalog = useFoundationalServicesStore()
35
+ const agents = useAgentsStore()
24
36
  const { t } = useI18n()
25
37
 
38
+ /**
39
+ * The content-type vocabulary, as STATIC literal `t()` keys — one per member, never a key
40
+ * assembled at runtime, so the typed-message-key check covers them (the standing i18n rule for
41
+ * an enum-keyed set).
42
+ */
43
+ const MODALITY_LABELS: Record<BinaryModality, () => string> = {
44
+ image: () => t('pipeline.builder.binaryOutputModality.image'),
45
+ audio: () => t('pipeline.builder.binaryOutputModality.audio'),
46
+ video: () => t('pipeline.builder.binaryOutputModality.video'),
47
+ '3d': () => t('pipeline.builder.binaryOutputModality.3d'),
48
+ document: () => t('pipeline.builder.binaryOutputModality.document'),
49
+ }
50
+ const MODALITY_ORDER: BinaryModality[] = ['image', 'audio', 'video', '3d', 'document']
51
+ function modalityLabel(modality: BinaryModality): string {
52
+ return MODALITY_LABELS[modality]()
53
+ }
54
+
26
55
  const config = computed(() => pipelines.draftBinaryOutput(props.index))
27
56
 
28
57
  /** Storage candidates: the capability tag is a REQUIREMENT here, enforced by admission. */
@@ -48,32 +77,70 @@ const contextItems = computed(() =>
48
77
  .map((service) => ({ label: service.name, value: service.id })),
49
78
  )
50
79
 
80
+ /**
81
+ * Generative candidates: every integration the deployment registered, labelled with what it
82
+ * produces so the choice is legible without cross-referencing. No filter — unlike the storage
83
+ * half there is no capability to require, and any registered integration is one admission accepts.
84
+ */
85
+ const generatorItems = computed(() =>
86
+ agents.binaryGenerators.map((generator) => ({
87
+ label: `${generator.name} — ${generator.modalities.map(modalityLabel).join(', ')}`,
88
+ value: generator.id,
89
+ })),
90
+ )
91
+
92
+ const modalityItems = computed(() =>
93
+ MODALITY_ORDER.map((modality) => ({ label: modalityLabel(modality), value: modality })),
94
+ )
95
+
51
96
  const pick = computed(() =>
52
- binaryOutputPickIssues(config.value, catalog.resolved, catalog.available),
97
+ binaryOutputPickIssues(
98
+ config.value,
99
+ catalog.resolved,
100
+ catalog.available,
101
+ agents.binaryGenerators,
102
+ ),
53
103
  )
54
104
  function has(issue: BinaryOutputPickIssue): boolean {
55
105
  return pick.value.issues.includes(issue)
56
106
  }
57
107
 
58
108
  /**
59
- * Clearing the storage target drops the WHOLE selection, context included: the context ids
60
- * only mean anything as scope for a generation that has somewhere to land, and a step carrying
61
- * context alone would persist a shape the backend has no rule for.
109
+ * Clearing the storage target drops the WHOLE selection context and generative halves included:
110
+ * every other id only means anything as part of a generation that has somewhere to land, and a
111
+ * step carrying them alone would persist a shape the backend has no rule for. Setting a target
112
+ * carries the rest through, so re-pointing storage is not a silent reset of the other two.
62
113
  */
63
114
  function setStorage(storageServiceId: string | undefined) {
64
- const contextServiceIds = config.value?.contextServiceIds
115
+ const current = config.value
65
116
  pipelines.setDraftBinaryOutput(
66
117
  props.index,
67
- storageServiceId
68
- ? { storageServiceId, ...(contextServiceIds?.length ? { contextServiceIds } : {}) }
69
- : undefined,
118
+ storageServiceId ? { ...current, storageServiceId } : undefined,
70
119
  )
71
120
  }
72
121
 
73
- function setContext(ids: string[]) {
74
- const storageServiceId = config.value?.storageServiceId
122
+ /**
123
+ * Patch one half of the selection, carrying the others through. Every setter but `setStorage`
124
+ * goes via here so a change to one half can never silently drop another — the store rebuilds the
125
+ * whole `binaryOutput` bag from what it is handed, so an omitted field is a deletion.
126
+ */
127
+ function patch(fields: Partial<BinaryOutputConfig>) {
128
+ const current = config.value
129
+ const storageServiceId = current?.storageServiceId
75
130
  if (!storageServiceId) return
76
- pipelines.setDraftBinaryOutput(props.index, { storageServiceId, contextServiceIds: ids })
131
+ pipelines.setDraftBinaryOutput(props.index, { ...current, storageServiceId, ...fields })
132
+ }
133
+
134
+ function setContext(ids: string[]) {
135
+ patch({ contextServiceIds: ids })
136
+ }
137
+
138
+ function setGenerators(ids: string[]) {
139
+ patch({ generatorIds: ids })
140
+ }
141
+
142
+ function setModalities(modalities: BinaryModality[]) {
143
+ patch({ modalities })
77
144
  }
78
145
  </script>
79
146
 
@@ -113,6 +180,41 @@ function setContext(ids: string[]) {
113
180
  />
114
181
  </div>
115
182
 
183
+ <div v-if="config?.storageServiceId" class="flex items-center gap-2">
184
+ <span class="text-[10px] text-slate-500">{{
185
+ t('pipeline.builder.binaryOutputGenerators')
186
+ }}</span>
187
+ <USelectMenu
188
+ class="w-56"
189
+ multiple
190
+ :model-value="config.generatorIds ?? []"
191
+ :items="generatorItems"
192
+ value-key="value"
193
+ size="xs"
194
+ :placeholder="t('pipeline.builder.binaryOutputGeneratorsPlaceholder')"
195
+ :disabled="!generatorItems.length"
196
+ data-testid="binary-output-generator-select"
197
+ @update:model-value="setGenerators($event)"
198
+ />
199
+ </div>
200
+
201
+ <div v-if="config?.storageServiceId" class="flex items-center gap-2">
202
+ <span class="text-[10px] text-slate-500">{{
203
+ t('pipeline.builder.binaryOutputModalities')
204
+ }}</span>
205
+ <USelectMenu
206
+ class="w-56"
207
+ multiple
208
+ :model-value="config.modalities ?? []"
209
+ :items="modalityItems"
210
+ value-key="value"
211
+ size="xs"
212
+ :placeholder="t('pipeline.builder.binaryOutputModalitiesPlaceholder')"
213
+ data-testid="binary-output-modality-select"
214
+ @update:model-value="setModalities($event)"
215
+ />
216
+ </div>
217
+
116
218
  <!-- Every refusal this step would hit, named where it is fixable. Each is its own line
117
219
  with its own remedy: an unreachable catalog is not an empty one, a lost service is not
118
220
  an untagged one, and a lost CONTEXT service is not a lost storage target. -->
@@ -143,5 +245,30 @@ function setContext(ids: string[]) {
143
245
  })
144
246
  }}
145
247
  </p>
248
+ <!-- The generative refusals stay their own lines, and their remedies point somewhere else
249
+ entirely: an unregistered integration is fixed in the DEPLOYMENT'S BUILD, not in this
250
+ workspace, which is the whole reason the backend keeps the two reason codes apart. -->
251
+ <p
252
+ v-if="has('unknown_generator')"
253
+ class="text-[10px] text-amber-400"
254
+ data-testid="binary-output-unknown-generator"
255
+ >
256
+ {{
257
+ t('pipeline.builder.binaryOutputGeneratorMissing', {
258
+ ids: pick.unknownGeneratorIds.join(', '),
259
+ })
260
+ }}
261
+ </p>
262
+ <p
263
+ v-if="has('modality_uncovered')"
264
+ class="text-[10px] text-amber-400"
265
+ data-testid="binary-output-modality-uncovered"
266
+ >
267
+ {{
268
+ t('pipeline.builder.binaryOutputModalityUncovered', {
269
+ modalities: pick.uncoveredModalities.map(modalityLabel).join(', '),
270
+ })
271
+ }}
272
+ </p>
146
273
  </div>
147
274
  </template>
@@ -228,6 +228,10 @@ const CONFLICT_INFO: Record<Exclude<ConflictReason, BespokeConflictReason>, Conf
228
228
  titleKey: 'errors.conflict.title.binary_output_service_invalid',
229
229
  descriptionKey: 'errors.conflict.description.binary_output_service_invalid',
230
230
  },
231
+ binary_output_generator_invalid: {
232
+ titleKey: 'errors.conflict.title.binary_output_generator_invalid',
233
+ descriptionKey: 'errors.conflict.description.binary_output_generator_invalid',
234
+ },
231
235
  foundational_service_not_inherited: {
232
236
  titleKey: 'errors.conflict.title.foundational_service_not_inherited',
233
237
  descriptionKey: 'errors.conflict.description.foundational_service_not_inherited',
@@ -10,6 +10,7 @@ import {
10
10
  SYSTEM_AGENT_META,
11
11
  uid,
12
12
  } from '~/utils/catalog'
13
+ import type { RegisteredBinaryGenerator } from '@cat-factory/contracts'
13
14
  import type { AgentArchetype, AgentKind, AgentKindVariant, CustomAgentKind } from '~/types/domain'
14
15
 
15
16
  /**
@@ -45,6 +46,13 @@ export const useAgentsStore = defineStore('agents', () => {
45
46
  // there — so folding it into the kind catalog would make it placeable, which is exactly what
46
47
  // the backend model says it is not. A straight replace, like the skills catalog it mirrors.
47
48
  const variants = ref<AgentKindVariant[]>([])
49
+ /**
50
+ * The deployment's GENERATIVE BINARY INTEGRATIONS, from the workspace snapshot. Static
51
+ * deployment-registered composition data like {@link variants}, and it rides the same store for
52
+ * the same reason: it is a fact ABOUT the agent catalog that the pipeline builder branches on,
53
+ * with no workspace state behind it. Empty on the stock product — the platform ships none.
54
+ */
55
+ const binaryGenerators = ref<RegisteredBinaryGenerator[]>([])
48
56
 
49
57
  /**
50
58
  * The merged CUSTOM catalog (consumer-slot → backend-manifest → runtime), each
@@ -140,6 +148,16 @@ export const useAgentsStore = defineStore('agents', () => {
140
148
  capabilitiesManifest.value = manifest
141
149
  }
142
150
 
151
+ /**
152
+ * Hydrate the deployment's registered generative binary integrations from the snapshot (a
153
+ * straight replace, like {@link hydrateVariants}). The builder's binary-output picker offers
154
+ * exactly these ids, so they are the same set run admission resolves a step's `generatorIds`
155
+ * against — an id offered from anywhere else would save clean and be refused at run START.
156
+ */
157
+ function hydrateBinaryGenerators(list: readonly RegisteredBinaryGenerator[]) {
158
+ binaryGenerators.value = [...list]
159
+ }
160
+
143
161
  /** Hydrate the deployment's registered agent-kind variants from the snapshot (straight replace). */
144
162
  function hydrateVariants(list: readonly AgentKindVariant[]) {
145
163
  variants.value = [...list]
@@ -172,6 +190,8 @@ export const useAgentsStore = defineStore('agents', () => {
172
190
  variants,
173
191
  hydrateVariants,
174
192
  variantsForKind,
193
+ binaryGenerators,
194
+ hydrateBinaryGenerators,
175
195
  variantLabel,
176
196
  }
177
197
  })
@@ -180,15 +180,21 @@ export function createPipelineStepConfigActions(ctx: PipelinesContext) {
180
180
  * An EMPTY `contextServiceIds` is dropped rather than stored, for the reason the consensus
181
181
  * tier set drops its own empty array: the field's absence means "no scope service was
182
182
  * selected", while `[]` reads as "context was considered and rejected" — a different claim,
183
- * and one the brief renderer would repeat to the agent.
183
+ * and one the brief renderer would repeat to the agent. `generatorIds` and `modalities` take
184
+ * the same treatment for the same reason: an absent `generatorIds` means the step generates
185
+ * through whatever its agent already has, and an absent `modalities` imposes no delivery
186
+ * requirement — both of which the brief STATES, so persisting `[]` would have it state the
187
+ * wrong thing.
184
188
  */
185
189
  function setDraftBinaryOutput(index: number, config: BinaryOutputConfig | undefined) {
186
190
  const next: StepOptions = { ...draftStepOptions.value[index] }
187
191
  if (config?.storageServiceId) {
188
- const { storageServiceId, contextServiceIds } = config
192
+ const { storageServiceId, contextServiceIds, generatorIds, modalities } = config
189
193
  next.binaryOutput = {
190
194
  storageServiceId,
191
195
  ...(contextServiceIds?.length ? { contextServiceIds } : {}),
196
+ ...(generatorIds?.length ? { generatorIds } : {}),
197
+ ...(modalities?.length ? { modalities } : {}),
192
198
  }
193
199
  } else delete next.binaryOutput
194
200
  draftStepOptions.value[index] = Object.keys(next).length ? next : null
@@ -100,6 +100,9 @@ export function applySnapshotToStores(snapshot: WorkspaceSnapshot, boardSince?:
100
100
  // The deployment's registered agent-kind variants (alternate prompts for existing kinds), so
101
101
  // the builder can offer them per step and the run views can name the one a step ran under.
102
102
  useAgentsStore().hydrateVariants(snapshot.agentKindVariants ?? [])
103
+ // The deployment's registered generative binary integrations, so the builder's binary-output
104
+ // picker can offer a step's `generatorIds` from the same set run admission validates against.
105
+ useAgentsStore().hydrateBinaryGenerators(snapshot.binaryGenerators ?? [])
103
106
  useTaskTypesStore().hydrateCapabilities(capabilities)
104
107
  // The account's repo-sourced Claude Skills catalog (shared across its workspaces), so the
105
108
  // pipeline builder's per-step skill picker has its options. A straight replace.
@@ -12,7 +12,14 @@ function step(patch: Partial<PipelineStep>): PipelineStep {
12
12
  }
13
13
 
14
14
  function report(patch: Partial<BinaryOutputReport> = {}): BinaryOutputReport {
15
- return { stored: [], unknownServices: [], invalidEntries: 0, omitted: 0, ...patch }
15
+ return {
16
+ stored: [],
17
+ unknownServices: [],
18
+ unknownGenerators: [],
19
+ invalidEntries: 0,
20
+ omitted: 0,
21
+ ...patch,
22
+ }
16
23
  }
17
24
 
18
25
  const artifact = (service: string, location: string) => ({ service, location })
@@ -220,6 +227,113 @@ describe('binaryOutputView', () => {
220
227
  })
221
228
  })
222
229
 
230
+ describe('the generative half of the read model', () => {
231
+ // The schema gained `unknownGenerators` and a per-artifact `generator`; both are RETAINED
232
+ // claims, so a surface that drops them attributes an artifact to something nobody can look up
233
+ // with nothing saying so — the exact silent loss `unknownDeclaredServices` exists to close.
234
+ it('names integrations the deployment does not register, and badges their rows', () => {
235
+ const view = binaryOutputView(
236
+ step({
237
+ stepOptions: { binaryOutput: { storageServiceId: 'files', generatorIds: ['retro'] } },
238
+ binaryOutputs: report({
239
+ stored: [
240
+ { ...artifact('files', 'a.png'), generator: 'retro' },
241
+ { ...artifact('files', 'b.png'), generator: 'ghost' },
242
+ artifact('files', 'c.png'),
243
+ ],
244
+ unknownGenerators: ['ghost'],
245
+ }),
246
+ }),
247
+ )
248
+ expect(view?.unknownDeclaredGenerators).toEqual(['ghost'])
249
+ expect(view?.rows.map((r) => r.generatorUnknown)).toEqual([false, true, false])
250
+ // An UNATTRIBUTED row is not an unknown one: generating without a registered integration is
251
+ // legal (a model with native image output), so it must not be flagged as a bad id.
252
+ expect(view?.rows[2]?.generator).toBeUndefined()
253
+ expect(binaryOutputHasWarnings(view!)).toBe(true)
254
+ })
255
+
256
+ it('carries the step selection through, and treats empty as a real state', () => {
257
+ const configured = binaryOutputView(
258
+ step({
259
+ state: 'pending',
260
+ stepOptions: {
261
+ binaryOutput: {
262
+ storageServiceId: 'files',
263
+ generatorIds: ['retro'],
264
+ modalities: ['image'],
265
+ },
266
+ },
267
+ }),
268
+ )
269
+ expect(configured?.generators).toEqual(['retro'])
270
+ expect(configured?.modalities).toEqual(['image'])
271
+ const bare = binaryOutputView(
272
+ step({ state: 'pending', stepOptions: { binaryOutput: { storageServiceId: 'files' } } }),
273
+ )
274
+ expect(bare?.generators).toEqual([])
275
+ expect(bare?.modalities).toEqual([])
276
+ })
277
+ })
278
+
279
+ describe('binaryOutputPickIssues, generative half', () => {
280
+ const catalog = [{ id: 'files', capabilities: ['asset-storage'] }]
281
+ const generators = [
282
+ { id: 'retro', modalities: ['image' as const] },
283
+ { id: 'studio', modalities: ['audio' as const] },
284
+ ]
285
+
286
+ it('mirrors the admission refusal for an id this deployment does not register', () => {
287
+ const pick = binaryOutputPickIssues(
288
+ { storageServiceId: 'files', generatorIds: ['retro', 'ghost'] },
289
+ catalog,
290
+ true,
291
+ generators,
292
+ )
293
+ expect(pick.issues).toContain('unknown_generator')
294
+ expect(pick.unknownGeneratorIds).toEqual(['ghost'])
295
+ })
296
+
297
+ it('names a declared content type nothing selected can produce', () => {
298
+ const pick = binaryOutputPickIssues(
299
+ { storageServiceId: 'files', generatorIds: ['retro'], modalities: ['image', 'audio'] },
300
+ catalog,
301
+ true,
302
+ generators,
303
+ )
304
+ expect(pick.issues).toContain('modality_uncovered')
305
+ expect(pick.uncoveredModalities).toEqual(['audio'])
306
+ })
307
+
308
+ it('reports BOTH faults when an unknown id was the one covering a requirement', () => {
309
+ // One edit should clear the step. Naming only the missing id would leave the user to
310
+ // discover the uncovered requirement on the next round trip.
311
+ const pick = binaryOutputPickIssues(
312
+ { storageServiceId: 'files', generatorIds: ['ghost'], modalities: ['audio'] },
313
+ catalog,
314
+ true,
315
+ generators,
316
+ )
317
+ expect(pick.issues).toEqual(expect.arrayContaining(['unknown_generator', 'modality_uncovered']))
318
+ })
319
+
320
+ it('judges the generative half even when no storage target is picked yet', () => {
321
+ // The early return for `not_selected` must not hide a second, independent fault.
322
+ const pick = binaryOutputPickIssues(
323
+ { storageServiceId: '', generatorIds: ['ghost'] },
324
+ catalog,
325
+ true,
326
+ generators,
327
+ )
328
+ expect(pick.issues).toEqual(expect.arrayContaining(['not_selected', 'unknown_generator']))
329
+ })
330
+
331
+ it('is silent about a step that selects no integration at all', () => {
332
+ const pick = binaryOutputPickIssues({ storageServiceId: 'files' }, catalog, true, generators)
333
+ expect(pick.issues).toEqual([])
334
+ })
335
+ })
336
+
223
337
  describe('binaryOutputPickIssues', () => {
224
338
  const service = (id: string, capabilities: string[]) => ({ id, capabilities })
225
339
  const catalog = [
@@ -1,4 +1,5 @@
1
1
  import { ASSET_STORAGE_CAPABILITY } from '@cat-factory/contracts'
2
+ import type { BinaryModality, RegisteredBinaryGenerator } from '@cat-factory/contracts'
2
3
  import type {
3
4
  BinaryOutputArtifact,
4
5
  BinaryOutputConfig,
@@ -63,6 +64,15 @@ export interface BinaryOutputRow extends BinaryOutputArtifact {
63
64
  misdirected: boolean
64
65
  /** The named service was not in the resolved catalog when the declaration was parsed. */
65
66
  unknown: boolean
67
+ /**
68
+ * The named GENERATIVE INTEGRATION (`artifact.generator`) was not one the deployment registers
69
+ * when the declaration was parsed. The generative twin of {@link unknown}, and kept as its own
70
+ * flag for the same reason the two unknown-id lists are: the fixes live in different places —
71
+ * an unknown service is workspace catalog state, an unknown integration is the deployment's
72
+ * build. A row that claims NO generator is not unknown, it is unattributed, which is a legal
73
+ * state (a model with native image output generates without a registered integration).
74
+ */
75
+ generatorUnknown: boolean
66
76
  }
67
77
 
68
78
  /** The whole surface's read model: one state, the join, and every loss the report counted. */
@@ -97,6 +107,25 @@ export interface BinaryOutputView {
97
107
  * that cannot overlap is the only shape where naming one cannot mis-state the other.
98
108
  */
99
109
  unknownDeclaredServices: readonly string[]
110
+ /**
111
+ * The GENERATIVE INTEGRATIONS the step selected (`stepOptions.binaryOutput.generatorIds`), in
112
+ * selection order. Empty is a real state and not a gap: a step may generate through whatever
113
+ * its agent already has, and its brief says so.
114
+ */
115
+ generators: readonly string[]
116
+ /**
117
+ * The CONTENT TYPES the step declares it must deliver (`stepOptions.binaryOutput.modalities`).
118
+ * Empty ⇒ the step imposes no requirement, so nothing is uncovered by construction.
119
+ */
120
+ modalities: readonly BinaryModality[]
121
+ /**
122
+ * Integration ids the AGENT named that the deployment does not register. The generative twin of
123
+ * {@link unknownDeclaredServices}, and it needs no exclusion to stay disjoint from anything —
124
+ * there is no single "target" integration a step selects, so the report's own list is already
125
+ * the whole fact. Rendering it is not optional: the entries are RETAINED, so dropping the list
126
+ * would leave an artifact attributed to something nobody can look up, with nothing saying so.
127
+ */
128
+ unknownDeclaredGenerators: readonly string[]
100
129
  /** Entries dropped because they were not `{ service, location }` objects. */
101
130
  invalidEntries: number
102
131
  /** Valid entries dropped past the report's cap — so {@link rows} is a PREFIX. */
@@ -129,6 +158,8 @@ export function binaryOutputView(step: PipelineStep | null | undefined): BinaryO
129
158
 
130
159
  const target = config?.storageServiceId ?? null
131
160
  const contextServices = config?.contextServiceIds ?? []
161
+ const generators = config?.generatorIds ?? []
162
+ const modalities = config?.modalities ?? []
132
163
  if (!report) {
133
164
  return {
134
165
  // A step still queued has not had the chance to record anything, which is a different
@@ -139,6 +170,9 @@ export function binaryOutputView(step: PipelineStep | null | undefined): BinaryO
139
170
  rows: [],
140
171
  targetUnknown: false,
141
172
  unknownDeclaredServices: [],
173
+ generators,
174
+ modalities,
175
+ unknownDeclaredGenerators: [],
142
176
  invalidEntries: 0,
143
177
  omitted: 0,
144
178
  misdirected: 0,
@@ -146,11 +180,14 @@ export function binaryOutputView(step: PipelineStep | null | undefined): BinaryO
146
180
  }
147
181
 
148
182
  const unknown = new Set(report.unknownServices)
183
+ const unknownGenerators = new Set(report.unknownGenerators)
149
184
  const rows: BinaryOutputRow[] = report.stored.map((artifact) => ({
150
185
  ...artifact,
151
186
  // A null target cannot make anything misdirected: there is no place it was supposed to go.
152
187
  misdirected: target !== null && artifact.service !== target,
153
188
  unknown: unknown.has(artifact.service),
189
+ // An UNATTRIBUTED row (no `generator` claimed) is not unknown — see the field's own note.
190
+ generatorUnknown: artifact.generator !== undefined && unknownGenerators.has(artifact.generator),
154
191
  }))
155
192
 
156
193
  return {
@@ -160,6 +197,9 @@ export function binaryOutputView(step: PipelineStep | null | undefined): BinaryO
160
197
  rows,
161
198
  targetUnknown: target !== null && unknown.has(target),
162
199
  unknownDeclaredServices: report.unknownServices.filter((id) => id !== target),
200
+ generators,
201
+ modalities,
202
+ unknownDeclaredGenerators: report.unknownGenerators,
163
203
  invalidEntries: report.invalidEntries,
164
204
  omitted: report.omitted,
165
205
  misdirected: rows.filter((row) => row.misdirected).length,
@@ -242,6 +282,7 @@ export function binaryOutputHasWarnings(view: BinaryOutputView): boolean {
242
282
  view.state === 'undeclared' ||
243
283
  view.targetUnknown ||
244
284
  view.unknownDeclaredServices.length > 0 ||
285
+ view.unknownDeclaredGenerators.length > 0 ||
245
286
  view.invalidEntries > 0 ||
246
287
  view.omitted > 0 ||
247
288
  view.misdirected > 0
@@ -277,12 +318,52 @@ export type BinaryOutputPickIssue =
277
318
  | 'not_storage_capable'
278
319
  /** One or more selected CONTEXT ids are not in the resolved catalog. */
279
320
  | 'unknown_context_service'
321
+ /**
322
+ * A selected GENERATIVE INTEGRATION is not one this deployment registers (kernel's
323
+ * `BinaryGeneratorSelectionIssue.problem` spelling verbatim, like the two `*_service` members).
324
+ */
325
+ | 'unknown_generator'
326
+ /** A content type the step declares it delivers is produced by NO selected integration. */
327
+ | 'modality_uncovered'
280
328
 
281
329
  /** What the builder found wrong with one step's selection, and which ids to name. */
282
330
  export interface BinaryOutputPickState {
283
331
  issues: readonly BinaryOutputPickIssue[]
284
332
  /** The unresolved CONTEXT ids, for the message that names them. */
285
333
  unknownContextIds: readonly string[]
334
+ /** The unregistered GENERATIVE INTEGRATION ids, for the message that names them. */
335
+ unknownGeneratorIds: readonly string[]
336
+ /** The declared content types nothing selected can produce, for the message that names them. */
337
+ uncoveredModalities: readonly BinaryModality[]
338
+ }
339
+
340
+ /**
341
+ * The GENERATIVE half of {@link binaryOutputPickIssues}, mirroring kernel's
342
+ * `binaryGeneratorSelectionIssues` so the builder surfaces the `binary_output_generator_invalid`
343
+ * refusal before the round trip rather than inventing a second opinion.
344
+ *
345
+ * It needs no `available` tri-state, unlike the catalog half: the integrations ride the workspace
346
+ * SNAPSHOT rather than their own probe, so there is no "not read yet" state distinct from the
347
+ * board not having loaded — if the caller has a snapshot at all, this list is the whole truth. An
348
+ * empty list is therefore a real EMPTY (this deployment registers none), which is exactly why a
349
+ * selected id in that state is `unknown_generator` and not silence.
350
+ */
351
+ function generatorPickIssues(
352
+ config: BinaryOutputConfig | undefined,
353
+ generators: readonly Pick<RegisteredBinaryGenerator, 'id' | 'modalities'>[],
354
+ ): { issues: BinaryOutputPickIssue[]; unknownGeneratorIds: string[]; uncovered: BinaryModality[] } {
355
+ const byId = new Map(generators.map((g) => [g.id, g]))
356
+ const selectedIds = config?.generatorIds ?? []
357
+ const unknownGeneratorIds = selectedIds.filter((id) => !byId.has(id))
358
+ // Coverage is judged against what RESOLVED, exactly as admission judges it: an unknown id
359
+ // contributes no content types, so a step whose only audio generator is unregistered is told
360
+ // BOTH things — the id is gone, and the requirement it was covering is now uncovered.
361
+ const covered = new Set(selectedIds.flatMap((id) => byId.get(id)?.modalities ?? []))
362
+ const uncovered = (config?.modalities ?? []).filter((m) => !covered.has(m))
363
+ const issues: BinaryOutputPickIssue[] = []
364
+ if (unknownGeneratorIds.length) issues.push('unknown_generator')
365
+ if (uncovered.length) issues.push('modality_uncovered')
366
+ return { issues, unknownGeneratorIds, uncovered }
286
367
  }
287
368
 
288
369
  /**
@@ -312,9 +393,19 @@ export function binaryOutputPickIssues(
312
393
  config: BinaryOutputConfig | undefined,
313
394
  catalog: readonly Pick<ResolvedFoundationalService, 'id' | 'capabilities'>[],
314
395
  available: boolean | null,
396
+ // Defaulted to EMPTY, the same reading `RunAdmission` gives an unwired registry: a deployment
397
+ // that registers no integrations cannot satisfy a step that selects one. So a call site that
398
+ // omits this FLAGS a selection rather than passing it — the loud direction — and the default
399
+ // stays a legitimate value rather than a hole.
400
+ generators: readonly Pick<RegisteredBinaryGenerator, 'id' | 'modalities'>[] = [],
315
401
  ): BinaryOutputPickState {
316
402
  const resolved = available === true
317
403
  const issues: BinaryOutputPickIssue[] = []
404
+ // Judged FIRST and outside the `not_selected` early return below, because the two halves
405
+ // resolve against different registries and a step missing its storage pick routinely has a
406
+ // generative fault too. Reporting them one round at a time is exactly the fix-and-retry cycle
407
+ // this function returns every issue to avoid.
408
+ const generative = generatorPickIssues(config, generators)
318
409
  const noStorageService =
319
410
  resolved && !catalog.some((s) => s.capabilities.includes(ASSET_STORAGE_CAPABILITY))
320
411
  if (available === false) issues.push('catalog_unavailable')
@@ -323,7 +414,12 @@ export function binaryOutputPickIssues(
323
414
  const storageId = config?.storageServiceId?.trim()
324
415
  if (!storageId) {
325
416
  issues.push('not_selected')
326
- return { issues, unknownContextIds: [] }
417
+ return {
418
+ issues: [...issues, ...generative.issues],
419
+ unknownContextIds: [],
420
+ unknownGeneratorIds: generative.unknownGeneratorIds,
421
+ uncoveredModalities: generative.uncovered,
422
+ }
327
423
  }
328
424
 
329
425
  if (resolved && !noStorageService) {
@@ -339,5 +435,10 @@ export function binaryOutputPickIssues(
339
435
  : []
340
436
  if (unknownContextIds.length) issues.push('unknown_context_service')
341
437
 
342
- return { issues, unknownContextIds }
438
+ return {
439
+ issues: [...issues, ...generative.issues],
440
+ unknownContextIds,
441
+ unknownGeneratorIds: generative.unknownGeneratorIds,
442
+ uncoveredModalities: generative.uncovered,
443
+ }
343
444
  }
@@ -3742,7 +3742,20 @@
3742
3742
  "binaryOutputMissing": "Dieser Speicherdienst ist nicht mehr im Katalog; wähle einen anderen.",
3743
3743
  "binaryOutputNotStorage": "Dieser Dienst deklariert die Fähigkeit {capability} nicht mehr, deshalb werden Läufe abgelehnt; wähle einen anderen.",
3744
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."
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
+ }
3746
3759
  },
3747
3760
  "progress": {
3748
3761
  "status": {
@@ -4431,8 +4444,10 @@
4431
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.",
4432
4445
  "misdirected": "1 Artefakt ging an einen anderen Dienst als {target}. | {count} Artefakte gingen an einen anderen Dienst als {target}.",
4433
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.",
4434
- "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."
4435
- }
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"
4436
4451
  },
4437
4452
  "brainstorm": {
4438
4453
  "title": {
@@ -4946,6 +4961,7 @@
4946
4961
  "pipeline_schedule_intake_unconfigured": "Zeitplan ohne Ticket-Erfassung",
4947
4962
  "foundational_service_exists": "Basisdienst existiert bereits",
4948
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",
4949
4965
  "foundational_service_not_inherited": "Dieses Board hat den Dienst registriert"
4950
4966
  },
4951
4967
  "description": {
@@ -4977,6 +4993,7 @@
4977
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.",
4978
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.",
4979
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.",
4980
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."
4981
4998
  },
4982
4999
  "action": {
@@ -606,6 +606,7 @@
606
606
  "pipeline_schedule_intake_unconfigured": "Schedule has no issue intake",
607
607
  "foundational_service_exists": "Foundational service already exists",
608
608
  "binary_output_service_invalid": "Binary output service can't be resolved",
609
+ "binary_output_generator_invalid": "Binary output generator can't be resolved",
609
610
  "foundational_service_not_inherited": "This board registered that service"
610
611
  },
611
612
  "description": {
@@ -640,6 +641,7 @@
640
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.",
641
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.",
642
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.",
643
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."
644
646
  },
645
647
  "action": {
@@ -4219,7 +4221,20 @@
4219
4221
  "binaryOutputMissing": "This storage service is no longer in the catalog; pick another.",
4220
4222
  "binaryOutputNotStorage": "This service no longer declares the {capability} capability, so runs will be refused; pick another.",
4221
4223
  "binaryOutputContextMissing": "These context services are no longer in the catalog: {ids}",
4222
- "binaryOutputUnavailable": "The foundational services catalog is unreachable, so nothing can be picked here yet."
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
+ }
4223
4238
  },
4224
4239
  "progress": {
4225
4240
  "status": {
@@ -5641,8 +5656,10 @@
5641
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.",
5642
5657
  "misdirected": "1 artifact went to a service other than {target}. | {count} artifacts went to a service other than {target}.",
5643
5658
  "invalidEntries": "1 declared entry was dropped: it named no service and location. | {count} declared entries were dropped: they named no service and location.",
5644
- "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."
5645
- }
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"
5646
5663
  },
5647
5664
  "sandbox": {
5648
5665
  "title": "Sandbox: prompt and model testing",
@@ -549,6 +549,7 @@
549
549
  "pipeline_schedule_intake_unconfigured": "La programación no tiene entrada de incidencias",
550
550
  "foundational_service_exists": "El servicio fundacional ya existe",
551
551
  "binary_output_service_invalid": "No se puede resolver el servicio de salidas binarias",
552
+ "binary_output_generator_invalid": "No se puede resolver el generador de salidas binarias",
552
553
  "foundational_service_not_inherited": "Este tablero registró ese servicio"
553
554
  },
554
555
  "description": {
@@ -580,6 +581,7 @@
580
581
  "pipeline_schedule_intake_unconfigured": "Un paso de entrada de errores toma su trabajo de la entrada de incidencias de la programación, y la programación vinculada no la tiene. Configure la entrada de incidencias en la programación primero.",
581
582
  "foundational_service_exists": "Ya hay un servicio fundacional con este identificador registrado en este ámbito. Abre la entrada existente y edítala: dos servicios no pueden compartir un identificador, porque es el nombre que un arquitecto usa en su diseño.",
582
583
  "binary_output_service_invalid": "Un paso que genera salidas binarias selecciona un servicio fundacional que el catálogo de este espacio de trabajo no puede resolver: el identificador es desconocido, o el servicio de almacenamiento elegido no tiene la capacidad asset-storage. Corrige la selección del paso o registra el servicio y vuelve a iniciarlo.",
584
+ "binary_output_generator_invalid": "Un paso que genera salidas binarias selecciona una integración generativa que esta instalación no registra, o ninguna de las integraciones seleccionadas produce un tipo de contenido que el paso debe entregar. Las integraciones generativas se registran en el código de la instalación, no en este espacio de trabajo: regístrala o corrige la selección del paso y vuelve a iniciar.",
583
585
  "foundational_service_not_inherited": "La exclusión se aplica a un servicio heredado de la cuenta. Este id está registrado por este tablero, así que no hay nada que excluir: elimina la entrada propia del tablero."
584
586
  },
585
587
  "action": {
@@ -4092,7 +4094,20 @@
4092
4094
  "binaryOutputMissing": "Este servicio de almacenamiento ya no está en el catálogo; elige otro.",
4093
4095
  "binaryOutputNotStorage": "Este servicio ya no declara la capacidad {capability}, así que las ejecuciones se rechazarán; elige otro.",
4094
4096
  "binaryOutputContextMissing": "Estos servicios de contexto ya no están en el catálogo: {ids}",
4095
- "binaryOutputUnavailable": "El catálogo de servicios fundamentales no está disponible, así que aún no se puede elegir nada aquí."
4097
+ "binaryOutputUnavailable": "El catálogo de servicios fundamentales no está disponible, así que aún no se puede elegir nada aquí.",
4098
+ "binaryOutputGenerators": "Generar con",
4099
+ "binaryOutputGeneratorsPlaceholder": "Ninguna integración seleccionada",
4100
+ "binaryOutputModalities": "Debe entregar",
4101
+ "binaryOutputModalitiesPlaceholder": "Sin requisito",
4102
+ "binaryOutputGeneratorMissing": "Esta instalación no registra estas integraciones generativas: {ids}. Se registran en el código de la instalación, no en este espacio de trabajo.",
4103
+ "binaryOutputModalityUncovered": "Ninguna integración seleccionada produce {modalities}, que este paso debe entregar.",
4104
+ "binaryOutputModality": {
4105
+ "image": "Imágenes",
4106
+ "audio": "Audio",
4107
+ "video": "Vídeo",
4108
+ "3d": "Modelos 3D",
4109
+ "document": "Documentos"
4110
+ }
4096
4111
  },
4097
4112
  "progress": {
4098
4113
  "status": {
@@ -5392,8 +5407,10 @@
5392
5407
  "targetUnknown": "El catálogo ya no contiene el servicio de almacenamiento de este paso ({id}), así que nada de lo de abajo pudo comprobarse contra él. Vuelve a registrarlo, o apunta el paso a otro servicio.",
5393
5408
  "misdirected": "1 artefacto fue a un servicio distinto de {target}. | {count} artefactos fueron a un servicio distinto de {target}.",
5394
5409
  "invalidEntries": "Se descartó 1 entrada declarada: no nombraba servicio ni ubicación. | Se descartaron {count} entradas declaradas: no nombraban servicio ni ubicación.",
5395
- "omitted": "Se declaró 1 artefacto más por encima del límite del informe y no aparece en la lista. | Se declararon {count} artefactos más por encima del límite del informe y no aparecen en la lista."
5396
- }
5410
+ "omitted": "Se declaró 1 artefacto más por encima del límite del informe y no aparece en la lista. | Se declararon {count} artefactos más por encima del límite del informe y no aparecen en la lista.",
5411
+ "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."
5412
+ },
5413
+ "unknownGeneratorBadge": "No registrada"
5397
5414
  },
5398
5415
  "sandbox": {
5399
5416
  "title": "Sandbox: pruebas de prompts y modelos",
@@ -549,6 +549,7 @@
549
549
  "pipeline_schedule_intake_unconfigured": "La planification n'a pas de collecte de tickets",
550
550
  "foundational_service_exists": "Ce service fondamental existe déjà",
551
551
  "binary_output_service_invalid": "Service des sorties binaires introuvable",
552
+ "binary_output_generator_invalid": "Générateur de sorties binaires introuvable",
552
553
  "foundational_service_not_inherited": "Ce tableau a enregistré ce service"
553
554
  },
554
555
  "description": {
@@ -580,6 +581,7 @@
580
581
  "pipeline_schedule_intake_unconfigured": "Une étape de collecte de bogues tire son travail des réglages de collecte de tickets de la planification, et la planification associée n'en a aucun. Configurez d'abord la collecte de tickets sur la planification.",
581
582
  "foundational_service_exists": "Un service fondamental portant cet identifiant est déjà enregistré dans cette portée. Ouvrez l’entrée existante et modifiez-la : deux services ne peuvent pas partager un identifiant, car c’est le nom qu’un architecte emploie dans sa conception.",
582
583
  "binary_output_service_invalid": "Une étape qui génère des sorties binaires sélectionne un service fondamental que le catalogue de cet espace de travail ne peut pas résoudre : l’identifiant est inconnu, ou le service de stockage choisi ne porte pas la capacité asset-storage. Corrigez la sélection de l’étape ou enregistrez le service, puis relancez.",
584
+ "binary_output_generator_invalid": "Une étape qui génère des sorties binaires sélectionne une intégration générative que ce déploiement n’enregistre pas, ou aucune des intégrations sélectionnées ne produit un type de contenu que l’étape doit livrer. Les intégrations génératives sont enregistrées dans le code du déploiement, pas dans cet espace de travail : enregistrez-la ou corrigez la sélection de l’étape, puis relancez.",
583
585
  "foundational_service_not_inherited": "L'écartement s'applique à un service hérité du compte. Cet identifiant est enregistré par ce tableau : il n'y a donc rien à écarter - supprimez plutôt l'entrée propre au tableau."
584
586
  },
585
587
  "action": {
@@ -4092,7 +4094,20 @@
4092
4094
  "binaryOutputMissing": "Ce service de stockage n'est plus dans le catalogue ; choisissez-en un autre.",
4093
4095
  "binaryOutputNotStorage": "Ce service ne déclare plus la capacité {capability}, les exécutions seront donc refusées ; choisissez-en un autre.",
4094
4096
  "binaryOutputContextMissing": "Ces services de contexte ne sont plus dans le catalogue : {ids}",
4095
- "binaryOutputUnavailable": "Le catalogue des services fondamentaux est injoignable, rien ne peut donc encore être choisi ici."
4097
+ "binaryOutputUnavailable": "Le catalogue des services fondamentaux est injoignable, rien ne peut donc encore être choisi ici.",
4098
+ "binaryOutputGenerators": "Générer avec",
4099
+ "binaryOutputGeneratorsPlaceholder": "Aucune intégration sélectionnée",
4100
+ "binaryOutputModalities": "Doit livrer",
4101
+ "binaryOutputModalitiesPlaceholder": "Aucune exigence",
4102
+ "binaryOutputGeneratorMissing": "Ce déploiement n'enregistre pas ces intégrations génératives : {ids}. Elles s'enregistrent dans le code du déploiement, pas dans cet espace de travail.",
4103
+ "binaryOutputModalityUncovered": "Aucune intégration sélectionnée ne produit {modalities}, que cette étape doit livrer.",
4104
+ "binaryOutputModality": {
4105
+ "image": "Images",
4106
+ "audio": "Audio",
4107
+ "video": "Vidéo",
4108
+ "3d": "Modèles 3D",
4109
+ "document": "Documents"
4110
+ }
4096
4111
  },
4097
4112
  "progress": {
4098
4113
  "status": {
@@ -5392,8 +5407,10 @@
5392
5407
  "targetUnknown": "Le catalogue ne contient plus le service de stockage propre à cette étape ({id}), donc rien ci-dessous n'a pu être vérifié par rapport à lui. Enregistrez-le de nouveau, ou orientez l'étape vers un autre service.",
5393
5408
  "misdirected": "1 artefact est allé vers un service autre que {target}. | {count} artefacts sont allés vers un service autre que {target}.",
5394
5409
  "invalidEntries": "1 entrée déclarée a été écartée : elle ne nommait ni service ni emplacement. | {count} entrées déclarées ont été écartées : elles ne nommaient ni service ni emplacement.",
5395
- "omitted": "1 artefact supplémentaire a été déclaré au-delà de la limite du rapport et n'est pas listé. | {count} artefacts supplémentaires ont été déclarés au-delà de la limite du rapport et ne sont pas listés."
5396
- }
5410
+ "omitted": "1 artefact supplémentaire a été déclaré au-delà de la limite du rapport et n'est pas listé. | {count} artefacts supplémentaires ont été déclarés au-delà de la limite du rapport et ne sont pas listés.",
5411
+ "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."
5412
+ },
5413
+ "unknownGeneratorBadge": "Non enregistrée"
5397
5414
  },
5398
5415
  "sandbox": {
5399
5416
  "title": "Bac à sable : test de prompts et de modèles",
@@ -549,6 +549,7 @@
549
549
  "pipeline_schedule_intake_unconfigured": "לתזמון אין קליטת פניות",
550
550
  "foundational_service_exists": "שירות תשתית כזה כבר קיים",
551
551
  "binary_output_service_invalid": "לא ניתן לזהות את השירות לפלט בינארי",
552
+ "binary_output_generator_invalid": "לא ניתן לזהות את מחולל הפלט הבינארי",
552
553
  "foundational_service_not_inherited": "הלוח הזה רשם את השירות"
553
554
  },
554
555
  "description": {
@@ -580,6 +581,7 @@
580
581
  "pipeline_schedule_intake_unconfigured": "שלב קליטת באגים שואב את עבודתו מהגדרות קליטת הפניות של התזמון, ולתזמון המקושר אין כאלה. הגדירו קודם קליטת פניות בתזמון.",
581
582
  "foundational_service_exists": "שירות תשתית עם מזהה זה כבר רשום בהיקף הזה. פתחו את הרשומה הקיימת וערכו אותה — שני שירותים אינם יכולים לחלוק מזהה, מפני שהמזהה הוא השם שארכיטקט מציין בתכנון שלו.",
582
583
  "binary_output_service_invalid": "שלב שמייצר פלט בינארי בוחר שירות תשתית שהקטלוג של סביבת העבודה אינו יכול לזהות: המזהה אינו מוכר, או ששירות האחסון שנבחר אינו נושא את היכולת asset-storage. תקנו את הבחירה בשלב או רשמו את השירות, ואז התחילו מחדש.",
584
+ "binary_output_generator_invalid": "שלב שמייצר פלט בינארי בוחר אינטגרציה גנרטיבית שהפריסה הזו אינה רושמת, או שאף אחת מהאינטגרציות שנבחרו אינה מייצרת סוג תוכן שהשלב אמור לספק. אינטגרציות גנרטיביות נרשמות בקוד של הפריסה ולא במרחב העבודה הזה: רשמו אותה או תקנו את הבחירה בשלב, ואז התחילו מחדש.",
583
585
  "foundational_service_not_inherited": "החרגה חלה על שירות שנורש מהחשבון. המזהה הזה רשום על ידי הלוח הזה, ולכן אין מה להחריג - מחקו במקום זאת את הרשומה של הלוח עצמו."
584
586
  },
585
587
  "action": {
@@ -4103,7 +4105,20 @@
4103
4105
  "binaryOutputMissing": "שירות אחסון זה כבר אינו בקטלוג; בחר אחר.",
4104
4106
  "binaryOutputNotStorage": "השירות הזה כבר אינו מצהיר על יכולת {capability}, ולכן הרצות יידחו; בחר אחר.",
4105
4107
  "binaryOutputContextMissing": "שירותי ההקשר האלה כבר אינם בקטלוג: {ids}",
4106
- "binaryOutputUnavailable": "קטלוג שירותי הבסיס אינו זמין, ולכן עדיין אי אפשר לבחור כאן דבר."
4108
+ "binaryOutputUnavailable": "קטלוג שירותי הבסיס אינו זמין, ולכן עדיין אי אפשר לבחור כאן דבר.",
4109
+ "binaryOutputGenerators": "ליצור באמצעות",
4110
+ "binaryOutputGeneratorsPlaceholder": "לא נבחרה אינטגרציה",
4111
+ "binaryOutputModalities": "חייב לספק",
4112
+ "binaryOutputModalitiesPlaceholder": "ללא דרישה",
4113
+ "binaryOutputGeneratorMissing": "ההתקנה הזו אינה רושמת את האינטגרציות הגנרטיביות האלה: {ids}. הן נרשמות בקוד ההתקנה, לא במרחב העבודה הזה.",
4114
+ "binaryOutputModalityUncovered": "אף אינטגרציה שנבחרה אינה מייצרת {modalities}, שהשלב הזה אמור לספק.",
4115
+ "binaryOutputModality": {
4116
+ "image": "תמונות",
4117
+ "audio": "אודיו",
4118
+ "video": "וידאו",
4119
+ "3d": "מודלים תלת-ממדיים",
4120
+ "document": "מסמכים"
4121
+ }
4107
4122
  },
4108
4123
  "progress": {
4109
4124
  "status": {
@@ -5403,8 +5418,10 @@
5403
5418
  "targetUnknown": "הקטלוג כבר אינו מכיל את שירות האחסון של השלב הזה ({id}), ולכן לא ניתן היה להשוות מולו דבר ממה שלהלן. רשום אותו מחדש, או הפנה את השלב לשירות אחר.",
5404
5419
  "misdirected": "פריט אחד הגיע לשירות אחר מ- {target}. | {count} פריטים הגיעו לשירות אחר מ- {target}.",
5405
5420
  "invalidEntries": "רשומה מוצהרת אחת נדחתה: לא צוינו בה שירות ומיקום. | {count} רשומות מוצהרות נדחו: לא צוינו בהן שירות ומיקום.",
5406
- "omitted": "פריט נוסף אחד הוצהר מעבר למגבלת הדוח ואינו מופיע ברשימה. | {count} פריטים נוספים הוצהרו מעבר למגבלת הדוח ואינם מופיעים ברשימה."
5407
- }
5421
+ "omitted": "פריט נוסף אחד הוצהר מעבר למגבלת הדוח ואינו מופיע ברשימה. | {count} פריטים נוספים הוצהרו מעבר למגבלת הדוח ואינם מופיעים ברשימה.",
5422
+ "unknownGenerators": "צוינה אינטגרציה גנרטיבית שההתקנה הזו אינה רושמת: {ids}. הרשומה נשמרת כפי שהוצהרה; האינטגרציה נרשמת בקוד ההתקנה, לא במרחב העבודה הזה. | צוינו אינטגרציות גנרטיביות שההתקנה הזו אינה רושמת: {ids}. הרשומות נשמרות כפי שהוצהרו; אינטגרציות נרשמות בקוד ההתקנה, לא במרחב העבודה הזה."
5423
+ },
5424
+ "unknownGeneratorBadge": "לא רשומה"
5408
5425
  },
5409
5426
  "sandbox": {
5410
5427
  "title": "Sandbox: בדיקת פרומפטים ומודלים",
@@ -3742,7 +3742,20 @@
3742
3742
  "binaryOutputMissing": "Questo servizio di archiviazione non è più nel catalogo; scegline un altro.",
3743
3743
  "binaryOutputNotStorage": "Questo servizio non dichiara più la capacità {capability}, quindi le esecuzioni verranno rifiutate; scegline un altro.",
3744
3744
  "binaryOutputContextMissing": "Questi servizi di contesto non sono più nel catalogo: {ids}",
3745
- "binaryOutputUnavailable": "Il catalogo dei servizi fondamentali non è raggiungibile, quindi qui non si può ancora scegliere nulla."
3745
+ "binaryOutputUnavailable": "Il catalogo dei servizi fondamentali non è raggiungibile, quindi qui non si può ancora scegliere nulla.",
3746
+ "binaryOutputGenerators": "Genera con",
3747
+ "binaryOutputGeneratorsPlaceholder": "Nessuna integrazione selezionata",
3748
+ "binaryOutputModalities": "Deve fornire",
3749
+ "binaryOutputModalitiesPlaceholder": "Nessun requisito",
3750
+ "binaryOutputGeneratorMissing": "Questa installazione non registra queste integrazioni generative: {ids}. Si registrano nel codice dell'installazione, non in questo spazio di lavoro.",
3751
+ "binaryOutputModalityUncovered": "Nessuna integrazione selezionata produce {modalities}, che questo passaggio deve fornire.",
3752
+ "binaryOutputModality": {
3753
+ "image": "Immagini",
3754
+ "audio": "Audio",
3755
+ "video": "Video",
3756
+ "3d": "Modelli 3D",
3757
+ "document": "Documenti"
3758
+ }
3746
3759
  },
3747
3760
  "progress": {
3748
3761
  "status": {
@@ -4431,8 +4444,10 @@
4431
4444
  "targetUnknown": "Il catalogo non contiene più il servizio di archiviazione di questo passo ({id}), quindi nulla di quanto segue ha potuto essere verificato rispetto ad esso. Registralo di nuovo, oppure indirizza il passo a un altro servizio.",
4432
4445
  "misdirected": "1 artefatto è finito su un servizio diverso da {target}. | {count} artefatti sono finiti su un servizio diverso da {target}.",
4433
4446
  "invalidEntries": "1 voce dichiarata è stata scartata: non indicava né servizio né posizione. | {count} voci dichiarate sono state scartate: non indicavano né servizio né posizione.",
4434
- "omitted": "È stato dichiarato 1 altro artefatto oltre il limite del rapporto e non compare nell'elenco. | Sono stati dichiarati altri {count} artefatti oltre il limite del rapporto e non compaiono nell'elenco."
4435
- }
4447
+ "omitted": "È stato dichiarato 1 altro artefatto oltre il limite del rapporto e non compare nell'elenco. | Sono stati dichiarati altri {count} artefatti oltre il limite del rapporto e non compaiono nell'elenco.",
4448
+ "unknownGenerators": "Ha indicato un'integrazione generativa che questa installazione non registra: {ids}. La voce viene mantenuta come dichiarata; l'integrazione si registra nel codice dell'installazione, non in questo spazio di lavoro. | Ha indicato integrazioni generative che questa installazione non registra: {ids}. Le loro voci vengono mantenute come dichiarate; le integrazioni si registrano nel codice dell'installazione, non in questo spazio di lavoro."
4449
+ },
4450
+ "unknownGeneratorBadge": "Non registrata"
4436
4451
  },
4437
4452
  "brainstorm": {
4438
4453
  "title": {
@@ -4946,6 +4961,7 @@
4946
4961
  "pipeline_schedule_intake_unconfigured": "La pianificazione non ha raccolta ticket",
4947
4962
  "foundational_service_exists": "Il servizio fondamentale esiste già",
4948
4963
  "binary_output_service_invalid": "Impossibile risolvere il servizio per gli output binari",
4964
+ "binary_output_generator_invalid": "Impossibile risolvere il generatore per gli output binari",
4949
4965
  "foundational_service_not_inherited": "Questa bacheca ha registrato quel servizio"
4950
4966
  },
4951
4967
  "description": {
@@ -4977,6 +4993,7 @@
4977
4993
  "pipeline_schedule_intake_unconfigured": "Un passo di raccolta bug prende il lavoro dalle impostazioni di raccolta ticket della pianificazione, e la pianificazione collegata non le ha. Configura prima la raccolta ticket sulla pianificazione.",
4978
4994
  "foundational_service_exists": "Un servizio fondamentale con questo identificatore è già registrato in questo ambito. Apri la voce esistente e modificala: due servizi non possono condividere un identificatore, perché è il nome che un architetto indica nella sua progettazione.",
4979
4995
  "binary_output_service_invalid": "Un passaggio che genera output binari seleziona un servizio fondamentale che il catalogo di questo workspace non riesce a risolvere: l'identificatore è sconosciuto, oppure il servizio di archiviazione scelto non ha la capacità asset-storage. Correggi la selezione del passaggio o registra il servizio, poi riavvia.",
4996
+ "binary_output_generator_invalid": "Un passaggio che genera output binari seleziona un'integrazione generativa che questa installazione non registra, oppure nessuna delle integrazioni selezionate produce un tipo di contenuto che il passaggio deve consegnare. Le integrazioni generative si registrano nel codice dell'installazione, non in questo workspace: registrala o correggi la selezione del passaggio, poi riavvia.",
4980
4997
  "foundational_service_not_inherited": "L'esclusione vale per un servizio ereditato dall'account. Questo id è registrato da questa bacheca, quindi non c'è nulla da escludere: elimina invece la voce propria della bacheca."
4981
4998
  },
4982
4999
  "action": {
@@ -549,6 +549,7 @@
549
549
  "pipeline_schedule_intake_unconfigured": "スケジュールに課題取り込み設定がありません",
550
550
  "foundational_service_exists": "その基盤サービスはすでに存在します",
551
551
  "binary_output_service_invalid": "バイナリ出力用のサービスを解決できません",
552
+ "binary_output_generator_invalid": "バイナリ出力のジェネレーターを解決できません",
552
553
  "foundational_service_not_inherited": "このボードが登録したサービスです"
553
554
  },
554
555
  "description": {
@@ -580,6 +581,7 @@
580
581
  "pipeline_schedule_intake_unconfigured": "バグ取り込みステップはスケジュールの課題取り込み設定から作業を取得しますが、関連付けられたスケジュールにその設定がありません。先にスケジュールで課題取り込みを設定してください。",
581
582
  "foundational_service_exists": "この ID の基盤サービスはこのスコープにすでに登録されています。既存のエントリを開いて編集してください。ID は設計でアーキテクトが指定する名前なので、2 つのサービスが同じ ID を共有することはできません。",
582
583
  "binary_output_service_invalid": "バイナリ出力を生成するステップが、このワークスペースのカタログでは解決できない基盤サービスを選択しています。ID が不明か、選択した保存先サービスに asset-storage ケイパビリティがありません。ステップの選択を修正するかサービスを登録して、もう一度開始してください。",
584
+ "binary_output_generator_invalid": "バイナリ出力を生成するステップが、このデプロイメントに登録されていない生成インテグレーションを選択しているか、選択されたインテグレーションのいずれもステップが提供すべきコンテンツタイプを生成できません。生成インテグレーションはこのワークスペースではなくデプロイメントのコードに登録します。登録するかステップの選択を修正して、もう一度開始してください。",
583
585
  "foundational_service_not_inherited": "除外はアカウントから継承したサービスに対する操作です。この ID はこのボード自身が登録しているため、除外するものがありません。代わりにボード自身のエントリを削除してください。"
584
586
  },
585
587
  "action": {
@@ -4104,7 +4106,20 @@
4104
4106
  "binaryOutputMissing": "この保存サービスはカタログに存在しません。別のサービスを選んでください。",
4105
4107
  "binaryOutputNotStorage": "このサービスは {capability} 機能を宣言しなくなったため、実行は拒否されます。別のサービスを選んでください。",
4106
4108
  "binaryOutputContextMissing": "これらのコンテキストサービスはカタログに存在しません: {ids}",
4107
- "binaryOutputUnavailable": "基盤サービスのカタログに接続できないため、ここではまだ何も選択できません。"
4109
+ "binaryOutputUnavailable": "基盤サービスのカタログに接続できないため、ここではまだ何も選択できません。",
4110
+ "binaryOutputGenerators": "生成に使用",
4111
+ "binaryOutputGeneratorsPlaceholder": "統合が未選択",
4112
+ "binaryOutputModalities": "提供が必要",
4113
+ "binaryOutputModalitiesPlaceholder": "要件なし",
4114
+ "binaryOutputGeneratorMissing": "このデプロイメントは次の生成統合を登録していません: {ids}。これらはこのワークスペースではなくデプロイメントのコードで登録します。",
4115
+ "binaryOutputModalityUncovered": "このステップが提供することになっている {modalities} を、選択されたどの統合も生成できません。",
4116
+ "binaryOutputModality": {
4117
+ "image": "画像",
4118
+ "audio": "音声",
4119
+ "video": "動画",
4120
+ "3d": "3D モデル",
4121
+ "document": "ドキュメント"
4122
+ }
4108
4123
  },
4109
4124
  "progress": {
4110
4125
  "status": {
@@ -5404,8 +5419,10 @@
5404
5419
  "targetUnknown": "このステップ自身の保存サービス ({id}) がカタログにもうありません。このため下のどれも照合できませんでした。再登録するか、別のサービスを指定してください。",
5405
5420
  "misdirected": "{count} 件の成果物が {target} 以外のサービスに保存されました。",
5406
5421
  "invalidEntries": "サービスと場所のどちらも示さない宣言項目 {count} 件を破棄しました。",
5407
- "omitted": "レポートの上限を超えてさらに {count} 件が宣言されており、一覧には含まれていません。"
5408
- }
5422
+ "omitted": "レポートの上限を超えてさらに {count} 件が宣言されており、一覧には含まれていません。",
5423
+ "unknownGenerators": "このデプロイメントが登録していない生成統合が指定されました: {ids}。エントリは申告どおり保持されます。統合はこのワークスペースではなくデプロイメントのコードで登録します。"
5424
+ },
5425
+ "unknownGeneratorBadge": "未登録"
5409
5426
  },
5410
5427
  "sandbox": {
5411
5428
  "title": "Sandbox: プロンプトとモデルのテスト",
@@ -549,6 +549,7 @@
549
549
  "pipeline_schedule_intake_unconfigured": "Harmonogram nie ma pobierania zgłoszeń",
550
550
  "foundational_service_exists": "Usługa fundamentalna już istnieje",
551
551
  "binary_output_service_invalid": "Nie można rozpoznać usługi dla wyników binarnych",
552
+ "binary_output_generator_invalid": "Nie można rozpoznać generatora danych binarnych",
552
553
  "foundational_service_not_inherited": "Ta tablica zarejestrowała tę usługę"
553
554
  },
554
555
  "description": {
@@ -580,6 +581,7 @@
580
581
  "pipeline_schedule_intake_unconfigured": "Krok pobierania błędów czerpie pracę z ustawień pobierania zgłoszeń harmonogramu, a powiązany harmonogram ich nie ma. Najpierw skonfiguruj pobieranie zgłoszeń w harmonogramie.",
581
582
  "foundational_service_exists": "Usługa fundamentalna o tym identyfikatorze jest już zarejestrowana w tym zakresie. Otwórz istniejący wpis i go edytuj — dwie usługi nie mogą współdzielić identyfikatora, ponieważ to jego nazwą architekt posługuje się w projekcie.",
582
583
  "binary_output_service_invalid": "Krok generujący wyniki binarne wybiera usługę fundamentalną, której katalog tego obszaru roboczego nie może rozpoznać: identyfikator jest nieznany albo wybrana usługa przechowywania nie ma zdolności asset-storage. Popraw wybór w kroku lub zarejestruj usługę, a następnie uruchom ponownie.",
584
+ "binary_output_generator_invalid": "Krok generujący dane binarne wybiera integrację generatywną, której to wdrożenie nie rejestruje, albo żadna z wybranych integracji nie tworzy typu treści, który krok ma dostarczyć. Integracje generatywne rejestruje się w kodzie wdrożenia, a nie w tej przestrzeni roboczej: zarejestruj ją lub popraw wybór w kroku, a następnie uruchom ponownie.",
583
585
  "foundational_service_not_inherited": "Wyłączenie dotyczy usługi dziedziczonej z konta. Ten identyfikator jest zarejestrowany przez tę tablicę, więc nie ma czego wyłączać - usuń zamiast tego własny wpis tablicy."
584
586
  },
585
587
  "action": {
@@ -4092,7 +4094,20 @@
4092
4094
  "binaryOutputMissing": "Tej usługi przechowywania nie ma już w katalogu; wybierz inną.",
4093
4095
  "binaryOutputNotStorage": "Ta usługa nie deklaruje już możliwości {capability}, więc uruchomienia będą odrzucane; wybierz inną.",
4094
4096
  "binaryOutputContextMissing": "Tych usług kontekstu nie ma już w katalogu: {ids}",
4095
- "binaryOutputUnavailable": "Katalog usług podstawowych jest nieosiągalny, więc nic nie da się tu jeszcze wybrać."
4097
+ "binaryOutputUnavailable": "Katalog usług podstawowych jest nieosiągalny, więc nic nie da się tu jeszcze wybrać.",
4098
+ "binaryOutputGenerators": "Generuj za pomocą",
4099
+ "binaryOutputGeneratorsPlaceholder": "Nie wybrano integracji",
4100
+ "binaryOutputModalities": "Musi dostarczyć",
4101
+ "binaryOutputModalitiesPlaceholder": "Brak wymagania",
4102
+ "binaryOutputGeneratorMissing": "Ta instalacja nie rejestruje tych integracji generatywnych: {ids}. Rejestruje się je w kodzie instalacji, a nie w tym obszarze roboczym.",
4103
+ "binaryOutputModalityUncovered": "Żadna wybrana integracja nie tworzy {modalities}, które ten krok ma dostarczyć.",
4104
+ "binaryOutputModality": {
4105
+ "image": "Obrazy",
4106
+ "audio": "Dźwięk",
4107
+ "video": "Wideo",
4108
+ "3d": "Modele 3D",
4109
+ "document": "Dokumenty"
4110
+ }
4096
4111
  },
4097
4112
  "progress": {
4098
4113
  "status": {
@@ -5392,8 +5407,10 @@
5392
5407
  "targetUnknown": "Katalog nie zawiera już własnej usługi przechowywania tego kroku ({id}), więc niczego poniżej nie dało się z nią porównać. Zarejestruj ją ponownie albo wskaż krokowi inną usługę.",
5393
5408
  "misdirected": "1 artefakt trafił do usługi innej niż {target}. | {count} artefakty trafiły do usługi innej niż {target}. | {count} artefaktów trafiło do usługi innej niż {target}.",
5394
5409
  "invalidEntries": "Odrzucono 1 zadeklarowany wpis: nie wskazywał usługi ani lokalizacji. | Odrzucono {count} zadeklarowane wpisy: nie wskazywały usługi ani lokalizacji. | Odrzucono {count} zadeklarowanych wpisów: nie wskazywały usługi ani lokalizacji.",
5395
- "omitted": "Zadeklarowano jeszcze 1 artefakt ponad limit raportu i nie ma go na liście. | Zadeklarowano jeszcze {count} artefakty ponad limit raportu i nie ma ich na liście. | Zadeklarowano jeszcze {count} artefaktów ponad limit raportu i nie ma ich na liście."
5396
- }
5410
+ "omitted": "Zadeklarowano jeszcze 1 artefakt ponad limit raportu i nie ma go na liście. | Zadeklarowano jeszcze {count} artefakty ponad limit raportu i nie ma ich na liście. | Zadeklarowano jeszcze {count} artefaktów ponad limit raportu i nie ma ich na liście.",
5411
+ "unknownGenerators": "Wskazano integrację generatywną, której ta instalacja nie rejestruje: {ids}. Wpis zostaje zachowany zgodnie z deklaracją; integrację rejestruje się w kodzie instalacji, a nie w tym obszarze roboczym. | Wskazano integracje generatywne, których ta instalacja nie rejestruje: {ids}. Ich wpisy zostają zachowane zgodnie z deklaracją; integracje rejestruje się w kodzie instalacji, a nie w tym obszarze roboczym. | Wskazano integracji generatywnych, których ta instalacja nie rejestruje: {ids}. Ich wpisy zostają zachowane zgodnie z deklaracją; integracje rejestruje się w kodzie instalacji, a nie w tym obszarze roboczym."
5412
+ },
5413
+ "unknownGeneratorBadge": "Niezarejestrowana"
5397
5414
  },
5398
5415
  "sandbox": {
5399
5416
  "title": "Piaskownica: testowanie promptów i modeli",
@@ -549,6 +549,7 @@
549
549
  "pipeline_schedule_intake_unconfigured": "Zamanlamada sorun alımı yok",
550
550
  "foundational_service_exists": "Temel hizmet zaten var",
551
551
  "binary_output_service_invalid": "İkili çıktı hizmeti çözümlenemiyor",
552
+ "binary_output_generator_invalid": "İkili çıktı üreticisi çözümlenemiyor",
552
553
  "foundational_service_not_inherited": "Bu hizmeti bu pano kaydetti"
553
554
  },
554
555
  "description": {
@@ -580,6 +581,7 @@
580
581
  "pipeline_schedule_intake_unconfigured": "Hata alımı adımı işini zamanlamanın sorun alımı ayarlarından alır ve bağlı zamanlamada bu ayar yok. Önce zamanlamada sorun alımını yapılandırın.",
581
582
  "foundational_service_exists": "Bu kimliğe sahip bir temel hizmet bu kapsamda zaten kayıtlı. Var olan kaydı açıp düzenleyin — iki hizmet aynı kimliği paylaşamaz, çünkü kimlik bir mimarın tasarımında andığı addır.",
582
583
  "binary_output_service_invalid": "İkili çıktılar üreten bir adım, bu çalışma alanının kataloğunda çözümlenemeyen bir temel hizmet seçiyor: kimlik bilinmiyor ya da seçilen depolama hizmeti asset-storage yeteneğini taşımıyor. Adımın seçimini düzeltin veya hizmeti kaydedin, sonra yeniden başlatın.",
584
+ "binary_output_generator_invalid": "İkili çıktı üreten bir adım, bu dağıtımın kaydetmediği bir üretken entegrasyon seçiyor ya da seçilen entegrasyonların hiçbiri adımın teslim etmesi gereken içerik türünü üretmiyor. Üretken entegrasyonlar bu çalışma alanında değil, dağıtımın kodunda kaydedilir: entegrasyonu kaydedin veya adımın seçimini düzeltin, sonra yeniden başlatın.",
583
585
  "foundational_service_not_inherited": "Devre dışı bırakma, hesaptan devralınan bir hizmet için geçerlidir. Bu kimlik bu pano tarafından kaydedilmiş, dolayısıyla devre dışı bırakılacak bir şey yok - bunun yerine panonun kendi kaydını silin."
584
586
  },
585
587
  "action": {
@@ -4104,7 +4106,20 @@
4104
4106
  "binaryOutputMissing": "Bu depolama hizmeti artık katalogda yok; başka birini seç.",
4105
4107
  "binaryOutputNotStorage": "Bu hizmet artık {capability} yeteneğini bildirmiyor, bu yüzden çalıştırmalar reddedilecek; başka birini seç.",
4106
4108
  "binaryOutputContextMissing": "Bu bağlam hizmetleri artık katalogda yok: {ids}",
4107
- "binaryOutputUnavailable": "Temel hizmetler katalogu erişilemez durumda, bu yüzden burada henüz bir şey seçilemiyor."
4109
+ "binaryOutputUnavailable": "Temel hizmetler katalogu erişilemez durumda, bu yüzden burada henüz bir şey seçilemiyor.",
4110
+ "binaryOutputGenerators": "Şununla üret",
4111
+ "binaryOutputGeneratorsPlaceholder": "Entegrasyon seçilmedi",
4112
+ "binaryOutputModalities": "Teslim etmeli",
4113
+ "binaryOutputModalitiesPlaceholder": "Gereksinim yok",
4114
+ "binaryOutputGeneratorMissing": "Bu kurulum şu üretken entegrasyonları kaydetmiyor: {ids}. Bunlar bu çalışma alanında değil, kurulumun kodunda kaydedilir.",
4115
+ "binaryOutputModalityUncovered": "Seçili entegrasyonların hiçbiri, bu adımın teslim etmesi gereken {modalities} içeriğini üretmiyor.",
4116
+ "binaryOutputModality": {
4117
+ "image": "Görseller",
4118
+ "audio": "Ses",
4119
+ "video": "Video",
4120
+ "3d": "3B modeller",
4121
+ "document": "Belgeler"
4122
+ }
4108
4123
  },
4109
4124
  "progress": {
4110
4125
  "status": {
@@ -5404,8 +5419,10 @@
5404
5419
  "targetUnknown": "Katalog artık bu adımın kendi depolama hizmetini ({id}) içermiyor, bu yüzden aşağıdakilerin hiçbiri onunla karşılaştırılamadı. Hizmeti yeniden kaydet ya da adımı başka bir hizmete yönlendir.",
5405
5420
  "misdirected": "1 ürün {target} dışında bir hizmete gitti. | {count} ürün {target} dışında bir hizmete gitti.",
5406
5421
  "invalidEntries": "Bildirilen 1 kayıt düşürüldü: ne hizmet ne de konum belirtiyordu. | Bildirilen {count} kayıt düşürüldü: ne hizmet ne de konum belirtiyorlardı.",
5407
- "omitted": "Raporun sınırının ötesinde 1 ürün daha bildirildi ve listede yer almıyor. | Raporun sınırının ötesinde {count} ürün daha bildirildi ve listede yer almıyor."
5408
- }
5422
+ "omitted": "Raporun sınırının ötesinde 1 ürün daha bildirildi ve listede yer almıyor. | Raporun sınırının ötesinde {count} ürün daha bildirildi ve listede yer almıyor.",
5423
+ "unknownGenerators": "Bu kurulumun kaydetmediği bir üretken entegrasyon belirtildi: {ids}. Kayıt bildirildiği gibi korunur; entegrasyon bu çalışma alanında değil, kurulumun kodunda kaydedilir. | Bu kurulumun kaydetmediği üretken entegrasyonlar belirtildi: {ids}. Kayıtları bildirildiği gibi korunur; entegrasyonlar bu çalışma alanında değil, kurulumun kodunda kaydedilir."
5424
+ },
5425
+ "unknownGeneratorBadge": "Kayıtlı değil"
5409
5426
  },
5410
5427
  "sandbox": {
5411
5428
  "title": "Sandbox: prompt ve model testi",
@@ -549,6 +549,7 @@
549
549
  "pipeline_schedule_intake_unconfigured": "У розкладі немає збору звернень",
550
550
  "foundational_service_exists": "Базовий сервіс уже існує",
551
551
  "binary_output_service_invalid": "Не вдається розпізнати сервіс для бінарних результатів",
552
+ "binary_output_generator_invalid": "Не вдається розпізнати генератор бінарних результатів",
552
553
  "foundational_service_not_inherited": "Цей сервіс зареєструвала ця дошка"
553
554
  },
554
555
  "description": {
@@ -580,6 +581,7 @@
580
581
  "pipeline_schedule_intake_unconfigured": "Крок збору помилок бере роботу з налаштувань збору звернень у розкладі, а привʼязаний розклад їх не має. Спершу налаштуйте збір звернень у розкладі.",
581
582
  "foundational_service_exists": "Базовий сервіс із цим ідентифікатором уже зареєстровано в цій області. Відкрийте наявний запис і відредагуйте його — два сервіси не можуть мати спільний ідентифікатор, бо саме його архітектор називає у своєму проєкті.",
582
583
  "binary_output_service_invalid": "Крок, що генерує бінарні результати, вибирає базовий сервіс, який каталог цього робочого простору не може розпізнати: ідентифікатор невідомий або вибраний сервіс зберігання не має здатності asset-storage. Виправте вибір у кроці або зареєструйте сервіс і запустіть знову.",
584
+ "binary_output_generator_invalid": "Крок, що генерує бінарні результати, вибирає генеративну інтеграцію, якої це розгортання не реєструє, або жодна з вибраних інтеграцій не створює тип вмісту, який крок має надати. Генеративні інтеграції реєструються в коді розгортання, а не в цьому робочому просторі: зареєструйте її або виправте вибір у кроці й запустіть знову.",
583
585
  "foundational_service_not_inherited": "Вимкнення стосується сервісу, успадкованого від облікового запису. Цей ідентифікатор зареєстровано цією дошкою, тож вимикати нічого - натомість видаліть власний запис дошки."
584
586
  },
585
587
  "action": {
@@ -4092,7 +4094,20 @@
4092
4094
  "binaryOutputMissing": "Цієї служби зберігання більше немає в каталозі; оберіть іншу.",
4093
4095
  "binaryOutputNotStorage": "Ця служба більше не заявляє здатність {capability}, тому запуски буде відхилено; оберіть іншу.",
4094
4096
  "binaryOutputContextMissing": "Цих служб контексту більше немає в каталозі: {ids}",
4095
- "binaryOutputUnavailable": "Каталог базових служб недосяжний, тому тут ще нічого не можна обрати."
4097
+ "binaryOutputUnavailable": "Каталог базових служб недосяжний, тому тут ще нічого не можна обрати.",
4098
+ "binaryOutputGenerators": "Генерувати за допомогою",
4099
+ "binaryOutputGeneratorsPlaceholder": "Інтеграцію не вибрано",
4100
+ "binaryOutputModalities": "Має надати",
4101
+ "binaryOutputModalitiesPlaceholder": "Без вимоги",
4102
+ "binaryOutputGeneratorMissing": "Ця інсталяція не реєструє ці генеративні інтеграції: {ids}. Їх реєструють у коді інсталяції, а не в цьому робочому просторі.",
4103
+ "binaryOutputModalityUncovered": "Жодна вибрана інтеграція не створює {modalities}, які має надати цей крок.",
4104
+ "binaryOutputModality": {
4105
+ "image": "Зображення",
4106
+ "audio": "Аудіо",
4107
+ "video": "Відео",
4108
+ "3d": "3D-моделі",
4109
+ "document": "Документи"
4110
+ }
4096
4111
  },
4097
4112
  "progress": {
4098
4113
  "status": {
@@ -5392,8 +5407,10 @@
5392
5407
  "targetUnknown": "Каталог більше не містить власної служби зберігання цього кроку ({id}), тому нічого нижче не вдалося з нею зіставити. Зареєструйте її знову або вкажіть кроку іншу службу.",
5393
5408
  "misdirected": "1 артефакт потрапив до служби, відмінної від {target}. | {count} артефакти потрапили до служби, відмінної від {target}. | {count} артефактів потрапило до служби, відмінної від {target}.",
5394
5409
  "invalidEntries": "Відкинуто 1 заявлений запис: у ньому не було ні служби, ні розташування. | Відкинуто {count} заявлені записи: у них не було ні служби, ні розташування. | Відкинуто {count} заявлених записів: у них не було ні служби, ні розташування.",
5395
- "omitted": "Ще 1 артефакт заявлено понад межу звіту, і його немає в списку. | Ще {count} артефакти заявлено понад межу звіту, і їх немає в списку. | Ще {count} артефактів заявлено понад межу звіту, і їх немає в списку."
5396
- }
5410
+ "omitted": "Ще 1 артефакт заявлено понад межу звіту, і його немає в списку. | Ще {count} артефакти заявлено понад межу звіту, і їх немає в списку. | Ще {count} артефактів заявлено понад межу звіту, і їх немає в списку.",
5411
+ "unknownGenerators": "Названо генеративну інтеграцію, якої ця інсталяція не реєструє: {ids}. Запис збережено як заявлено; інтеграція реєструється в коді інсталяції, а не в цьому робочому просторі. | Названо генеративні інтеграції, яких ця інсталяція не реєструє: {ids}. Їхні записи збережено як заявлено; інтеграції реєструються в коді інсталяції, а не в цьому робочому просторі. | Названо генеративних інтеграцій, яких ця інсталяція не реєструє: {ids}. Їхні записи збережено як заявлено; інтеграції реєструються в коді інсталяції, а не в цьому робочому просторі."
5412
+ },
5413
+ "unknownGeneratorBadge": "Не зареєстровано"
5397
5414
  },
5398
5415
  "sandbox": {
5399
5416
  "title": "Пісочниця: тестування промптів і моделей",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/app",
3
- "version": "0.204.0",
3
+ "version": "0.205.0",
4
4
  "description": "Reusable Nuxt layer for the Agent Architecture Board SPA (components, stores, composables, pages). Consume it from a thin deployment app via `extends: ['@cat-factory/app']` and point it at your backend with NUXT_PUBLIC_API_BASE. See deploy/frontend for an example.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -40,7 +40,7 @@
40
40
  "valibot": "^1.4.2",
41
41
  "vue": "3.5.40",
42
42
  "wretch": "^3.0.9",
43
- "@cat-factory/contracts": "0.211.0"
43
+ "@cat-factory/contracts": "0.212.0"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@toad-contracts/testing": "0.3.2",