@rslsp1/fa-app-tools 10.1.3 → 10.3.2

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.
@@ -117,6 +117,7 @@ async function seedSceneSetupUmgebung(store) {
117
117
  camera_rig: {
118
118
  cameras: cameraIds.map((camera_id) => ({
119
119
  camera_id,
120
+ aspect_ratio: "4:3",
120
121
  preset_ref: {
121
122
  element_id: presetElement.element_id,
122
123
  version_id: preset.version_id
@@ -885,6 +886,32 @@ function elementStoreContractChecks() {
885
886
  });
886
887
  kindIs(result, "error", "writeDraft auf unbekanntes Element");
887
888
  });
889
+ check("Veroeffentlichen", "verlangt ein explizites Kameraformat bei neuen oder geaenderten Kameras (#569)", async (store) => {
890
+ const setup = await seedSceneSetupUmgebung(store);
891
+ const missing = setup.payloadMit(["cam_a"]);
892
+ delete missing.camera_rig.cameras[0].aspect_ratio;
893
+ const rejected = await store.publishVersion({
894
+ elementId: setup.elementId,
895
+ payload: missing,
896
+ schemaVersion: "1.0.0",
897
+ publishedBy: "vertrag"
898
+ });
899
+ kindIs(rejected, "rejected", "neue Kamera ohne Format");
900
+ if (rejected.kind === "rejected") {
901
+ isTrue(rejected.errors.some((e) => e.instancePath === "/camera_rig/cameras/0/aspect_ratio"), "Ablehnung nennt Kameraformat");
902
+ }
903
+ hasLength((await snapshotOf(store, setup.elementId)).versions, 0, "kein Publish bei fehlendem Kameraformat");
904
+ const version = await seedVersion(store, setup.elementId, setup.payloadMit(["cam_a"]));
905
+ const result = await store.publishVersion({
906
+ elementId: setup.elementId,
907
+ payload: missing,
908
+ schemaVersion: "1.0.0",
909
+ publishedBy: "vertrag",
910
+ parents: [{ parent_version_id: version.version_id, relation: "derived_from" }]
911
+ });
912
+ kindIs(result, "rejected", "geaenderte Kamera verliert Format");
913
+ hasLength((await snapshotOf(store, setup.elementId)).versions, 1, "kein Publish beim Entfernen des Kameraformats");
914
+ });
888
915
  check("Veroeffentlichen", "veroeffentlicht eine gueltige Payload", async (store) => {
889
916
  const elementId = await seedElement(store);
890
917
  const version = await seedVersion(store, elementId);
@@ -1247,6 +1274,59 @@ function elementStoreContractChecks() {
1247
1274
  },
1248
1275
  "reviseMetadata"
1249
1276
  );
1277
+ check(
1278
+ "Elementmetadaten D-35",
1279
+ "setzt, behaelt und loescht das Titelbild (P6)",
1280
+ async (store) => {
1281
+ const element = ok(
1282
+ await store.createElement({ type: "scene", title: "A" }),
1283
+ "createElement"
1284
+ );
1285
+ equal(
1286
+ (await snapshotOf(store, element.element_id)).metadata?.cover_media_ref ?? null,
1287
+ null,
1288
+ "Titelbild nach Anlage"
1289
+ );
1290
+ ok(
1291
+ await store.reviseMetadata({
1292
+ elementId: element.element_id,
1293
+ title: "A",
1294
+ cover_media_ref: "bild-7",
1295
+ expectedRevision: 1
1296
+ }),
1297
+ "reviseMetadata mit cover_media_ref"
1298
+ );
1299
+ equal(
1300
+ (await snapshotOf(store, element.element_id)).metadata?.cover_media_ref,
1301
+ "bild-7",
1302
+ "Titelbild gesetzt"
1303
+ );
1304
+ ok(
1305
+ await store.reviseMetadata({ elementId: element.element_id, title: "B", expectedRevision: 2 }),
1306
+ "reviseMetadata ohne cover_media_ref"
1307
+ );
1308
+ equal(
1309
+ (await snapshotOf(store, element.element_id)).metadata?.cover_media_ref,
1310
+ "bild-7",
1311
+ "Titelbild behalten"
1312
+ );
1313
+ ok(
1314
+ await store.reviseMetadata({
1315
+ elementId: element.element_id,
1316
+ title: "B",
1317
+ cover_media_ref: null,
1318
+ expectedRevision: 3
1319
+ }),
1320
+ "reviseMetadata mit cover_media_ref null"
1321
+ );
1322
+ equal(
1323
+ (await snapshotOf(store, element.element_id)).metadata?.cover_media_ref ?? null,
1324
+ null,
1325
+ "Titelbild automatisch"
1326
+ );
1327
+ },
1328
+ "reviseMetadata"
1329
+ );
1250
1330
  check(
1251
1331
  "Elementmetadaten D-35",
1252
1332
  "lehnt eine veraltete Revision ab",
@@ -0,0 +1,218 @@
1
+ // src/lib/szenen/cameraContract.ts
2
+ var CAMERA_ASPECT_RATIOS = ["1:1", "4:3", "3:4", "16:9", "9:16"];
3
+ var object = (value) => value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
4
+ function cameraAspectRatioValue(aspectRatio) {
5
+ if (!/^[1-9][0-9]*(\.[0-9]+)?:[1-9][0-9]*(\.[0-9]+)?$/.test(aspectRatio)) {
6
+ throw new Error(`Ung\xFCltiges Kamera-Seitenverh\xE4ltnis \u201E${aspectRatio}\u201C.`);
7
+ }
8
+ const [width, height] = aspectRatio.split(":").map(Number);
9
+ const ratio = width / height;
10
+ if (!Number.isFinite(width) || !Number.isFinite(height) || !Number.isFinite(ratio) || ratio <= 0) {
11
+ throw new Error(`Kamera-Seitenverh\xE4ltnis \u201E${aspectRatio}\u201C ist nicht darstellbar.`);
12
+ }
13
+ return ratio;
14
+ }
15
+ function canonical(value) {
16
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
17
+ const record = object(value);
18
+ if (record) return `{${Object.keys(record).sort().map((key) => `${JSON.stringify(key)}:${canonical(record[key])}`).join(",")}}`;
19
+ return JSON.stringify(value) ?? "undefined";
20
+ }
21
+ function camerasOf(payload) {
22
+ const cameras = object(object(payload)?.camera_rig)?.cameras;
23
+ return Array.isArray(cameras) ? cameras : [];
24
+ }
25
+ function checkCameraAspectRatioChanges(type, payload, previousPayloads = []) {
26
+ if (type !== "scene_setup") return [];
27
+ const previous = previousPayloads.flatMap(camerasOf);
28
+ return camerasOf(payload).flatMap((value, index) => {
29
+ const camera = object(value);
30
+ if (!camera) return [];
31
+ if (typeof camera.aspect_ratio === "string") {
32
+ try {
33
+ cameraAspectRatioValue(camera.aspect_ratio);
34
+ return [];
35
+ } catch (error) {
36
+ return [{ instancePath: `/camera_rig/cameras/${index}/aspect_ratio`, keyword: "aspect_ratio", message: error.message }];
37
+ }
38
+ }
39
+ if (camera.aspect_ratio === void 0 && previous.some((old) => canonical(old) === canonical(camera))) return [];
40
+ return [{
41
+ instancePath: `/camera_rig/cameras/${index}/aspect_ratio`,
42
+ keyword: "required",
43
+ message: `Kamera \u201E${String(camera.camera_id ?? index)}\u201C wurde neu angelegt oder ge\xE4ndert. Bitte ihr Seitenverh\xE4ltnis ausdr\xFCcklich speichern.`
44
+ }];
45
+ });
46
+ }
47
+ function cameraPerspective(camera) {
48
+ if (!camera.aspect_ratio) throw new Error(`Kamera \u201E${camera.camera_id}\u201C hat kein gespeichertes Seitenverh\xE4ltnis.`);
49
+ const lens = object(object(camera.preset)?.lens);
50
+ const focal = lens?.focal_length_mm;
51
+ const sensor = lens?.sensor_width_mm;
52
+ if (typeof focal !== "number" || !Number.isFinite(focal) || focal <= 0 || typeof sensor !== "number" || !Number.isFinite(sensor) || sensor <= 0) {
53
+ throw new Error(`Kamera \u201E${camera.camera_id}\u201C hat kein aufgel\xF6stes Objektiv mit Brennweite und Sensorbreite.`);
54
+ }
55
+ if (object(camera.preset)?.projection !== "perspective") {
56
+ throw new Error(`Kamera \u201E${camera.camera_id}\u201C verwendet keine perspektivische Projektion.`);
57
+ }
58
+ const aspect = cameraAspectRatioValue(camera.aspect_ratio);
59
+ return {
60
+ aspect_ratio: camera.aspect_ratio,
61
+ aspect,
62
+ focal_length_mm: focal,
63
+ sensor_width_mm: sensor,
64
+ vertical_fov_deg: 2 * Math.atan(sensor / (2 * focal * aspect)) * 180 / Math.PI
65
+ };
66
+ }
67
+ function frozenCameraAspectRatio(input) {
68
+ const aspect = object(object(input)?.camera)?.aspect_ratio;
69
+ if (aspect === void 0) return void 0;
70
+ if (typeof aspect !== "string") throw new Error("Das eingefrorene Kamera-Seitenverh\xE4ltnis ist kein Text.");
71
+ cameraAspectRatioValue(aspect);
72
+ return aspect;
73
+ }
74
+
75
+ // src/lib/szenen/stage3d.ts
76
+ var STAGE_CATALOGUE = [
77
+ { label: "Mensch", type: "subject", dimensions: [0.55, 0.35, 1.75] },
78
+ { label: "Stuhl", type: "object", dimensions: [0.5, 0.5, 0.9] },
79
+ { label: "Tisch", type: "surface", dimensions: [1.2, 0.7, 0.75] },
80
+ { label: "Lampe", type: "light", dimensions: [0.35, 0.35, 1.5] }
81
+ ];
82
+ var stageColor = (type) => ({ subject: "#df995f", light: "#ffe084", surface: "#65aabc", object: "#b998d9" })[type] ?? "#9bafbc";
83
+ function stageColors(nodes) {
84
+ const result = /* @__PURE__ */ Object.create(null);
85
+ const used = /* @__PURE__ */ new Set();
86
+ const names = { subject: "orange", light: "yellow", surface: "cyan", object: "purple" };
87
+ let next = 0;
88
+ for (const node of [...nodes].sort((a, b) => a.node_id.localeCompare(b.node_id))) {
89
+ let hex = stageColor(node.type), name = names[node.type] ?? "blue grey";
90
+ while (used.has(hex)) {
91
+ const hue = (next++ * 137.508 + 25) % 360;
92
+ const channel = (n) => {
93
+ const k = (n + hue / 30) % 12;
94
+ return Math.round(255 * (0.62 - 0.29 * Math.max(-1, Math.min(k - 3, 9 - k, 1)))).toString(16).padStart(2, "0");
95
+ };
96
+ hex = `#${channel(0)}${channel(8)}${channel(4)}`;
97
+ name = `${["red", "orange", "yellow", "green", "cyan", "blue", "purple", "pink"][Math.round(hue / 45) % 8]} (${hex})`;
98
+ }
99
+ used.add(hex);
100
+ result[node.node_id] = { hex, name };
101
+ }
102
+ return result;
103
+ }
104
+ var stageTypeLabel = (type) => ({ subject: "Person", light: "Licht", surface: "Fl\xE4che", object: "Objekt" })[type] ?? type;
105
+ function vector3(value, label) {
106
+ if (!Array.isArray(value) || value.length !== 3 || value.some((n) => typeof n !== "number" || !Number.isFinite(n))) {
107
+ throw new Error(`${label}: drei endliche Koordinaten erforderlich.`);
108
+ }
109
+ return [...value];
110
+ }
111
+ function dragPosition(position, point, plane) {
112
+ const p = vector3(position, "Position");
113
+ const q = vector3(point, "Drag");
114
+ return plane === "top" ? [q[0], q[1], p[2]] : plane === "side" ? [q[0], p[1], q[2]] : p;
115
+ }
116
+ function stageNode(node) {
117
+ if (!node.placement) throw new Error(`\u201E${node.node_id}\u201C hat keine Weltplatzierung.`);
118
+ if (!node.proxy_3d) throw new Error(`\u201E${node.node_id}\u201C hat keine Proxy-Geometrie. Bitte Ma\xDFe festlegen.`);
119
+ const dimensions = vector3(node.proxy_3d.dimensions, `Ma\xDFe von ${node.node_id}`);
120
+ if (dimensions.some((d) => d <= 0)) throw new Error(`\u201E${node.node_id}\u201C braucht positive Proxy-Ma\xDFe.`);
121
+ return {
122
+ node_id: node.node_id,
123
+ type: node.type,
124
+ primitive: node.proxy_3d.primitive,
125
+ dimensions,
126
+ position: vector3(node.placement.position, `Position von ${node.node_id}`),
127
+ rotation: vector3(node.placement.rotation_euler_deg ?? [0, 0, 0], "Rotation"),
128
+ scale: vector3(node.placement.scale ?? [1, 1, 1], "Skalierung"),
129
+ anchors: node.anchors
130
+ };
131
+ }
132
+ function stageFrame(input) {
133
+ if (input.capabilities.can_place !== "yes") throw new Error("Die Szene ben\xF6tigt Meterma\xDFe und ein Scene Setup in Z-up-Koordinaten.");
134
+ const visible = input.scene.nodes.filter((n) => !n.hidden);
135
+ const colors = stageColors(visible);
136
+ const nodes = visible.map((n) => ({ ...stageNode(n), preview_color: colors[n.node_id] }));
137
+ if (!input.camera) throw new Error("Bitte eine Kamera ausw\xE4hlen.");
138
+ const optical = cameraPerspective(input.camera);
139
+ const placement = input.camera.placement;
140
+ if (placement?.mode !== "absolute") throw new Error("Diese Kamera verwendet eine Pattern-Platzierung. F\xFCr den MVP bitte eine explizite Weltposition speichern.");
141
+ const position = vector3(placement.position, "Kameraposition");
142
+ const orientation = input.camera.orientation;
143
+ if (orientation?.mode !== "explicit" && orientation?.mode !== "look_at") throw new Error("Bitte eine explizite Kameraausrichtung oder ein Blickziel festlegen.");
144
+ if (orientation.mode === "explicit") vector3(orientation.rotation_euler_deg, "Kameraausrichtung");
145
+ return { nodes, camera: { ...input.camera, ...optical, position, orientation } };
146
+ }
147
+ function planeAxes(plane) {
148
+ return plane === "top" ? [0, 1] : [0, 2];
149
+ }
150
+ function snapPosition(position, plane, step) {
151
+ const p = vector3(position, "Position");
152
+ for (const axis of planeAxes(plane)) p[axis] = Math.round(p[axis] / step) * step;
153
+ return p.map((v) => Number(v.toFixed(6)));
154
+ }
155
+ function nudgePosition(position, plane, right, up) {
156
+ const p = vector3(position, "Position");
157
+ const [u, v] = planeAxes(plane);
158
+ p[u] = Number((p[u] + right).toFixed(6));
159
+ p[v] = Number((p[v] + up).toFixed(6));
160
+ return p;
161
+ }
162
+ function fitPlaneView(points, plane, width, height) {
163
+ if (!points.length || width <= 0 || height <= 0) return { center: [0, 0], zoom: 60 };
164
+ const [u, v] = planeAxes(plane);
165
+ const us = points.map((p) => p[u]), vs = points.map((p) => p[v]);
166
+ const [minU, maxU, minV, maxV] = [Math.min(...us), Math.max(...us), Math.min(...vs), Math.max(...vs)];
167
+ const spanU = Math.max(maxU - minU, 2), spanV = Math.max(maxV - minV, 2);
168
+ const zoom = Math.min(width / (spanU * 1.25), height / (spanV * 1.25));
169
+ return { center: [(minU + maxU) / 2, (minV + maxV) / 2], zoom: clampZoom(zoom) };
170
+ }
171
+ var clampZoom = (zoom) => Math.min(800, Math.max(8, zoom));
172
+ function screenToPlane(view, dx, dy) {
173
+ return [view.center[0] + dx / view.zoom, view.center[1] - dy / view.zoom];
174
+ }
175
+ function zoomPlaneView(view, factor, dx, dy) {
176
+ const zoom = clampZoom(view.zoom * factor);
177
+ const [u, v] = screenToPlane(view, dx, dy);
178
+ return { zoom, center: [u - dx / zoom, v + dy / zoom] };
179
+ }
180
+ function gridStep(zoom, minPx = 14) {
181
+ return [0.05, 0.1, 0.25, 0.5, 1, 2, 5, 10, 25, 50].find((step) => step * zoom >= minPx) ?? 100;
182
+ }
183
+ function withStagePositions(input, nodes, camera) {
184
+ if (!nodes.size && !camera) return input;
185
+ const next = {
186
+ ...input,
187
+ scene: { ...input.scene, nodes: input.scene.nodes.map((n) => nodes.has(n.node_id) && n.placement ? { ...n, placement: { ...n.placement, position: nodes.get(n.node_id) } } : n) }
188
+ };
189
+ if (camera && input.camera) next.camera = { ...input.camera, placement: { ...input.camera.placement, position: camera } };
190
+ return next;
191
+ }
192
+ var roundMeters = (value) => Math.round(value * 1e3) / 1e3;
193
+
194
+ export {
195
+ CAMERA_ASPECT_RATIOS,
196
+ cameraAspectRatioValue,
197
+ checkCameraAspectRatioChanges,
198
+ cameraPerspective,
199
+ frozenCameraAspectRatio,
200
+ STAGE_CATALOGUE,
201
+ stageColor,
202
+ stageColors,
203
+ stageTypeLabel,
204
+ vector3,
205
+ dragPosition,
206
+ stageNode,
207
+ stageFrame,
208
+ planeAxes,
209
+ snapPosition,
210
+ nudgePosition,
211
+ fitPlaneView,
212
+ clampZoom,
213
+ screenToPlane,
214
+ zoomPlaneView,
215
+ gridStep,
216
+ withStagePositions,
217
+ roundMeters
218
+ };
@@ -163,4 +163,4 @@ type CommandResult<T> = {
163
163
  retryable: boolean;
164
164
  };
165
165
 
166
- export { type CommandResult as C, type FeatureSliceId as F, type LoadResult as L, type PersistedSlice as P, type QueryResult as Q, type RequestContext as R, SIMULATION_PROVIDER as S, type TextGenerationPort as T, type WorkspacePersistence as W, type PersistenceDescriptor as a, type SliceContract as b, type TextGenerationRequest as c, type TextGenerationResult as d, type WorkspaceTabId as e, type WriteResult as f, createFakeTextGenerationPort as g, createSimulationTextGenerationPort as h, simulatedAnswerFor as s };
166
+ export { type CommandResult as C, type FeatureSliceId as F, type LoadResult as L, type PersistedSlice as P, type QueryResult as Q, type RequestContext as R, SIMULATION_PROVIDER as S, type TextGenerationImage as T, type WorkspacePersistence as W, type PersistenceDescriptor as a, type SliceContract as b, type TextGenerationPort as c, type TextGenerationRequest as d, type TextGenerationResult as e, type WorkspaceTabId as f, type WriteResult as g, createFakeTextGenerationPort as h, createSimulationTextGenerationPort as i, simulatedAnswerFor as s };
@@ -163,4 +163,4 @@ type CommandResult<T> = {
163
163
  retryable: boolean;
164
164
  };
165
165
 
166
- export { type CommandResult as C, type FeatureSliceId as F, type LoadResult as L, type PersistedSlice as P, type QueryResult as Q, type RequestContext as R, SIMULATION_PROVIDER as S, type TextGenerationPort as T, type WorkspacePersistence as W, type PersistenceDescriptor as a, type SliceContract as b, type TextGenerationRequest as c, type TextGenerationResult as d, type WorkspaceTabId as e, type WriteResult as f, createFakeTextGenerationPort as g, createSimulationTextGenerationPort as h, simulatedAnswerFor as s };
166
+ export { type CommandResult as C, type FeatureSliceId as F, type LoadResult as L, type PersistedSlice as P, type QueryResult as Q, type RequestContext as R, SIMULATION_PROVIDER as S, type TextGenerationImage as T, type WorkspacePersistence as W, type PersistenceDescriptor as a, type SliceContract as b, type TextGenerationPort as c, type TextGenerationRequest as d, type TextGenerationResult as e, type WorkspaceTabId as f, type WriteResult as g, createFakeTextGenerationPort as h, createSimulationTextGenerationPort as i, simulatedAnswerFor as s };
@@ -1,4 +1,4 @@
1
- import { T as TextGenerationPort } from './contracts-DdYOMBl9.mjs';
1
+ import { c as TextGenerationPort } from './contracts-B3AbzYQ4.mjs';
2
2
 
3
3
  interface TagOption {
4
4
  label: string;
@@ -100,6 +100,17 @@ interface HFMetadataEntry {
100
100
  filename?: string;
101
101
  hasThumb?: boolean;
102
102
  titleTs?: number;
103
+ /** Display metadata, independent of prompt identity. */
104
+ title?: string;
105
+ /** Upload origin; only server is excluded by the Library sync (#511). */
106
+ source?: 'server' | 'flow' | 'external';
107
+ flow_provenance?: {
108
+ kind: 'szenen';
109
+ prompt_run_id: string;
110
+ generation_batch_id: string;
111
+ position: number;
112
+ source_kind: 'generated_in_app' | 'external_import';
113
+ };
103
114
  }
104
115
 
105
116
  declare function buildGenerationPrompt(hierarchyText: string, mode?: 'literal' | 'creative'): string;
@@ -1,4 +1,4 @@
1
- import { T as TextGenerationPort } from './contracts-DdYOMBl9.js';
1
+ import { c as TextGenerationPort } from './contracts-B3AbzYQ4.js';
2
2
 
3
3
  interface TagOption {
4
4
  label: string;
@@ -100,6 +100,17 @@ interface HFMetadataEntry {
100
100
  filename?: string;
101
101
  hasThumb?: boolean;
102
102
  titleTs?: number;
103
+ /** Display metadata, independent of prompt identity. */
104
+ title?: string;
105
+ /** Upload origin; only server is excluded by the Library sync (#511). */
106
+ source?: 'server' | 'flow' | 'external';
107
+ flow_provenance?: {
108
+ kind: 'szenen';
109
+ prompt_run_id: string;
110
+ generation_batch_id: string;
111
+ position: number;
112
+ source_kind: 'generated_in_app' | 'external_import';
113
+ };
103
114
  }
104
115
 
105
116
  declare function buildGenerationPrompt(hierarchyText: string, mode?: 'literal' | 'creative'): string;
package/dist/index.d.mts CHANGED
@@ -1,12 +1,12 @@
1
1
  import * as React from 'react';
2
2
  import React__default, { RefObject, ReactNode } from 'react';
3
- import { G as Generation, W as WorkspaceTags, F as FlowGenerateText, b as FlowTextGenerationOptions, j as SelectedTag, T as TagOption, i as LabServices, h as LabItem, L as LabFrame, S as SelectedLabImage, H as HFEvent, g as HFStateSnapshot } from './hfEventTypes-BUztJySs.mjs';
4
- export { a as FlowSdk, c as HFEventVersion, d as HFFileInfo, e as HFMetadataEntry, f as HFStateMeta, I as ImageAddedPayload, M as MetadataUpdatedPayload, P as ProjectSettings, k as TagUpsertedPayload, l as buildFallbackPrompt, m as buildGenerationPrompt, n as buildImageGenerationOptions, o as buildPromptTabPayload, p as cleanAiResponse, q as createFlowServices, s as interpretSdkError, t as parsePromptResponse } from './hfEventTypes-BUztJySs.mjs';
3
+ import { G as Generation, W as WorkspaceTags, F as FlowGenerateText, b as FlowTextGenerationOptions, j as SelectedTag, T as TagOption, i as LabServices, h as LabItem, L as LabFrame, S as SelectedLabImage, H as HFEvent, g as HFStateSnapshot } from './hfEventTypes-DQPjEP4T.mjs';
4
+ export { a as FlowSdk, c as HFEventVersion, d as HFFileInfo, e as HFMetadataEntry, f as HFStateMeta, I as ImageAddedPayload, M as MetadataUpdatedPayload, P as ProjectSettings, k as TagUpsertedPayload, l as buildFallbackPrompt, m as buildGenerationPrompt, n as buildImageGenerationOptions, o as buildPromptTabPayload, p as cleanAiResponse, q as createFlowServices, s as interpretSdkError, t as parsePromptResponse } from './hfEventTypes-DQPjEP4T.mjs';
5
5
  import { Node, Edge } from '@xyflow/react';
6
6
  import * as zustand_vanilla from 'zustand/vanilla';
7
- import { F as FeatureSliceId, b as SliceContract, a as PersistenceDescriptor, W as WorkspacePersistence, P as PersistedSlice, L as LoadResult, f as WriteResult, e as WorkspaceTabId, C as CommandResult, R as RequestContext, Q as QueryResult } from './contracts-DdYOMBl9.mjs';
7
+ import { F as FeatureSliceId, b as SliceContract, a as PersistenceDescriptor, W as WorkspacePersistence, P as PersistedSlice, L as LoadResult, g as WriteResult, f as WorkspaceTabId, C as CommandResult, R as RequestContext, Q as QueryResult } from './contracts-B3AbzYQ4.mjs';
8
8
 
9
- var version = "10.1.3";
9
+ var version = "10.3.2";
10
10
 
11
11
  declare function useOnClickOutside(ref: RefObject<HTMLElement | null>, handler: (e: MouseEvent | TouchEvent) => void): void;
12
12
 
@@ -580,6 +580,8 @@ interface LibraryViewProps {
580
580
  layout?: 'list' | 'grid';
581
581
  emptyText?: string;
582
582
  /** Host-gerenderte Zusatzaktionen je Item (z.B. Flow-Referenzgenerierung). */
583
+ /** Inline child rows below a list card, e.g. expandable related items. */
584
+ renderItemChildren?: (item: LibraryViewItem) => React__default.ReactNode;
583
585
  renderItemExtras?: (item: LibraryViewItem) => React__default.ReactNode;
584
586
  /** Host-Datenversion: Änderung erzwingt Re-Query (z.B. nach Reload/Import). */
585
587
  dataVersion?: number;
@@ -617,12 +619,22 @@ interface Zugehoerigkeit {
617
619
  */
618
620
  hinweis: string | null;
619
621
  }
620
- /** Das Item, soweit die Zuordnung es überhaupt anschaut. */
622
+ /**
623
+ * Das Item, soweit die Zuordnung es überhaupt anschaut.
624
+ *
625
+ * Seit Issue #503 (E7) ist ein Item ein Prompt und kann **mehrere** Runs
626
+ * führen: `szenen.prompt_run_id` bleibt der Primärlauf (der erste), alle Runs
627
+ * stehen in `szenen.runs[]`; `szenen_run_links` löst sie der Reihe nach auf.
628
+ */
621
629
  interface ZugehoerigkeitEingabe {
622
630
  szenen?: {
623
631
  prompt_run_id?: string | null;
632
+ runs?: ReadonlyArray<{
633
+ prompt_run_id?: string | null;
634
+ }> | null;
624
635
  } | null;
625
636
  szenen_links?: SzenenLinks | null;
637
+ szenen_run_links?: ReadonlyArray<SzenenLinks> | null;
626
638
  }
627
639
  /**
628
640
  * Ob die Zugehörigkeit ein **anklickbares** Ziel hergibt.
@@ -642,6 +654,15 @@ declare function hatNavigationsziele(zugehoerigkeit: Zugehoerigkeit | null | und
642
654
  * Oberfläche zeigt dann gar nichts an.
643
655
  */
644
656
  declare function zugehoerigkeitOf(item: ZugehoerigkeitEingabe | null | undefined): Zugehoerigkeit | null;
657
+ /**
658
+ * Die Zugehörigkeiten **aller** Runs eines Items, in Reihenfolge des
659
+ * Hinzukommens (Primärlauf zuerst). Ein Item mit einem Run liefert genau die
660
+ * Zugehörigkeit von `zugehoerigkeitOf`; ein Item ohne Run eine leere Liste.
661
+ *
662
+ * Additiv zu `zugehoerigkeitOf` (dessen Vertrag unverändert bleibt): Wer nur den
663
+ * Primärlauf zeigt, ruft weiter diese Funktion.
664
+ */
665
+ declare function zugehoerigkeitenOf(item: ZugehoerigkeitEingabe | null | undefined): Zugehoerigkeit[];
645
666
 
646
667
  interface ZugehoerigkeitLinksProps {
647
668
  zugehoerigkeit: Zugehoerigkeit | null;
@@ -974,4 +995,4 @@ interface UseTagBaseResult {
974
995
  }
975
996
  declare function useTagBase(token: string, namespace: string): UseTagBaseResult;
976
997
 
977
- export { AvatarArchitectApp, type AvatarArchitectAppProps, CURRENT_TAG_EVENT_VERSION, CollapsibleCard, CommandResult, CompactDropdown, type CreateFaStoreOptions, type CreatePersistenceCoordinatorOptions, type ExtractedCharacter, FaApp, type FaAppProps, type FaStore, type FaStoreState, FaToolsBadge, FeatureSliceId, FlowTextGenerationOptions, FlowWorkspacePicker, type FlowWorkspacePickerProps, GLOBAL_STYLES, Generation, HFEvent, type HFStateResult, HFStateSnapshot, HfMediaSyncTab, HistoryPanel, type InMemoryWorkspacePersistence, InspectPanel, LIBRARY_CUTOVER_MARKER, LIBRARY_SLICE_SCHEMA_VERSION, version as LIB_VERSION, LabBlend, LabCompare, LabFrame, LabFrameExtractor, type LabFrameExtractorProps, LabImagePicker, LabItem, LabLoop, LabRemix, LabServices, type LabSlotId, LabsTab, type LegacyMigrationOptions, type LegacyMigrationResult, type LegacyRecentTagRef, type LegacySourceResult, type LibraryCommandName, type LibraryCommands, type LibraryDataSource, type LibraryLegacySource, type LibraryListQuery, type LibraryPage, LibraryView, type LibraryViewItem, type LibraryViewProps, type LibraryViewTag, type LibraryWorkspaceState, ListView, LoadResult, type MediaItem, MediaLibrary, PersistedSlice, type PersistenceCoordinator, PersistenceDescriptor, PillButton, PromptTab, QueryResult, RequestContext, type RunLibraryLegacyImportOptions, type RunTagsLegacyImportOptions, SCOPE_MAP, type SaveState, SectionLabel, SelectedLabImage, SelectedTag, type SelectionValidation, ServerTab, SetupPanel, SliceContract, type SliceMeta, type SzenenLinks, TAGS_CUTOVER_MARKER, TAGS_SLICE_SCHEMA_VERSION, type TagBase, type TagBaseContext, type TagBaseEvent, type TagBaseMeta, TagBaseSection, type TagBaseSectionProps, type TagBaseTagEntry, type TagBaseTagOption, type TagBaseUser, type TagBaseWorkspaceTags, type TagCommandName, type TagCommands, type TagCreatedEvent, type TagCreatedPayload, type TagEntry, type TagEntryInput, TagManager, TagManagerPanel, type TagManagerProps, type TagManagerSelection, TagOption, type TagQueries, type TagUpdateDelta, type TagUpdatedDelta, type TagUpdatedEvent, type TagUpdatedPayload, type TagViewCategory, type TagViewModel, type TagViewOption, type TagViewScope, type TagsWorkspaceState, type UseTagBaseResult, WorkspacePersistence, WorkspaceTabId, WorkspaceTags, WriteResult, type Zugehoerigkeit, type ZugehoerigkeitEingabe, ZugehoerigkeitLinks, type ZugehoerigkeitLinksProps, type ZugehoerigkeitZiel, autoLabel, buildBlendInstruction, buildCompareInstruction, buildLoopInstruction, buildReferenceImageMediaIds, buildRemixInstruction, buildScanInstruction, createFaStore, createInMemoryLibraryDataSource, createInMemoryWorkspacePersistence, createLibraryDefault, createPersistenceCoordinator, createTagCreatedEvent, createTagUpdatedEvent, createTagsDefault, deriveTagBaseWorkspaceTags, deriveTagViewModel, formatTreeToMarkdown, frameToGeneration, getFormattedTimestamp, getHFToken, getSessionClientId, groupGenerationsToLabItems, hatNavigationsziele, hfBatchArchive, hfBootstrapFromLegacy, hfListDir, hfLoadImageAsBase64, hfUploadImage, hfUploadSmallFile, injectXMPMetadata, libraryContract, libraryReactDescriptor, listCategories, loadHFState, loadPendingEvents, loadTagBase, parseLegacyLibraryFilters, parseLegacyRecentTags, parsePromptFile, runLegacyMigration, runLibraryLegacyImport, runTagsLegacyImport, setHFToken, tagsContract, tagsReactDescriptor, tsFromEventPath, useFaSlice, useFaSliceMeta, useHFState, useKeyboardNavigation, useOnClickOutside, useTagBase, validateTagBaseSelection, writeHFEvent, writeTagEvent, zugehoerigkeitOf };
998
+ export { AvatarArchitectApp, type AvatarArchitectAppProps, CURRENT_TAG_EVENT_VERSION, CollapsibleCard, CommandResult, CompactDropdown, type CreateFaStoreOptions, type CreatePersistenceCoordinatorOptions, type ExtractedCharacter, FaApp, type FaAppProps, type FaStore, type FaStoreState, FaToolsBadge, FeatureSliceId, FlowTextGenerationOptions, FlowWorkspacePicker, type FlowWorkspacePickerProps, GLOBAL_STYLES, Generation, HFEvent, type HFStateResult, HFStateSnapshot, HfMediaSyncTab, HistoryPanel, type InMemoryWorkspacePersistence, InspectPanel, LIBRARY_CUTOVER_MARKER, LIBRARY_SLICE_SCHEMA_VERSION, version as LIB_VERSION, LabBlend, LabCompare, LabFrame, LabFrameExtractor, type LabFrameExtractorProps, LabImagePicker, LabItem, LabLoop, LabRemix, LabServices, type LabSlotId, LabsTab, type LegacyMigrationOptions, type LegacyMigrationResult, type LegacyRecentTagRef, type LegacySourceResult, type LibraryCommandName, type LibraryCommands, type LibraryDataSource, type LibraryLegacySource, type LibraryListQuery, type LibraryPage, LibraryView, type LibraryViewItem, type LibraryViewProps, type LibraryViewTag, type LibraryWorkspaceState, ListView, LoadResult, type MediaItem, MediaLibrary, PersistedSlice, type PersistenceCoordinator, PersistenceDescriptor, PillButton, PromptTab, QueryResult, RequestContext, type RunLibraryLegacyImportOptions, type RunTagsLegacyImportOptions, SCOPE_MAP, type SaveState, SectionLabel, SelectedLabImage, SelectedTag, type SelectionValidation, ServerTab, SetupPanel, SliceContract, type SliceMeta, type SzenenLinks, TAGS_CUTOVER_MARKER, TAGS_SLICE_SCHEMA_VERSION, type TagBase, type TagBaseContext, type TagBaseEvent, type TagBaseMeta, TagBaseSection, type TagBaseSectionProps, type TagBaseTagEntry, type TagBaseTagOption, type TagBaseUser, type TagBaseWorkspaceTags, type TagCommandName, type TagCommands, type TagCreatedEvent, type TagCreatedPayload, type TagEntry, type TagEntryInput, TagManager, TagManagerPanel, type TagManagerProps, type TagManagerSelection, TagOption, type TagQueries, type TagUpdateDelta, type TagUpdatedDelta, type TagUpdatedEvent, type TagUpdatedPayload, type TagViewCategory, type TagViewModel, type TagViewOption, type TagViewScope, type TagsWorkspaceState, type UseTagBaseResult, WorkspacePersistence, WorkspaceTabId, WorkspaceTags, WriteResult, type Zugehoerigkeit, type ZugehoerigkeitEingabe, ZugehoerigkeitLinks, type ZugehoerigkeitLinksProps, type ZugehoerigkeitZiel, autoLabel, buildBlendInstruction, buildCompareInstruction, buildLoopInstruction, buildReferenceImageMediaIds, buildRemixInstruction, buildScanInstruction, createFaStore, createInMemoryLibraryDataSource, createInMemoryWorkspacePersistence, createLibraryDefault, createPersistenceCoordinator, createTagCreatedEvent, createTagUpdatedEvent, createTagsDefault, deriveTagBaseWorkspaceTags, deriveTagViewModel, formatTreeToMarkdown, frameToGeneration, getFormattedTimestamp, getHFToken, getSessionClientId, groupGenerationsToLabItems, hatNavigationsziele, hfBatchArchive, hfBootstrapFromLegacy, hfListDir, hfLoadImageAsBase64, hfUploadImage, hfUploadSmallFile, injectXMPMetadata, libraryContract, libraryReactDescriptor, listCategories, loadHFState, loadPendingEvents, loadTagBase, parseLegacyLibraryFilters, parseLegacyRecentTags, parsePromptFile, runLegacyMigration, runLibraryLegacyImport, runTagsLegacyImport, setHFToken, tagsContract, tagsReactDescriptor, tsFromEventPath, useFaSlice, useFaSliceMeta, useHFState, useKeyboardNavigation, useOnClickOutside, useTagBase, validateTagBaseSelection, writeHFEvent, writeTagEvent, zugehoerigkeitOf, zugehoerigkeitenOf };
package/dist/index.d.ts CHANGED
@@ -1,12 +1,12 @@
1
1
  import * as React from 'react';
2
2
  import React__default, { RefObject, ReactNode } from 'react';
3
- import { G as Generation, W as WorkspaceTags, F as FlowGenerateText, b as FlowTextGenerationOptions, j as SelectedTag, T as TagOption, i as LabServices, h as LabItem, L as LabFrame, S as SelectedLabImage, H as HFEvent, g as HFStateSnapshot } from './hfEventTypes-fAdA-0A9.js';
4
- export { a as FlowSdk, c as HFEventVersion, d as HFFileInfo, e as HFMetadataEntry, f as HFStateMeta, I as ImageAddedPayload, M as MetadataUpdatedPayload, P as ProjectSettings, k as TagUpsertedPayload, l as buildFallbackPrompt, m as buildGenerationPrompt, n as buildImageGenerationOptions, o as buildPromptTabPayload, p as cleanAiResponse, q as createFlowServices, s as interpretSdkError, t as parsePromptResponse } from './hfEventTypes-fAdA-0A9.js';
3
+ import { G as Generation, W as WorkspaceTags, F as FlowGenerateText, b as FlowTextGenerationOptions, j as SelectedTag, T as TagOption, i as LabServices, h as LabItem, L as LabFrame, S as SelectedLabImage, H as HFEvent, g as HFStateSnapshot } from './hfEventTypes-DharkVsi.js';
4
+ export { a as FlowSdk, c as HFEventVersion, d as HFFileInfo, e as HFMetadataEntry, f as HFStateMeta, I as ImageAddedPayload, M as MetadataUpdatedPayload, P as ProjectSettings, k as TagUpsertedPayload, l as buildFallbackPrompt, m as buildGenerationPrompt, n as buildImageGenerationOptions, o as buildPromptTabPayload, p as cleanAiResponse, q as createFlowServices, s as interpretSdkError, t as parsePromptResponse } from './hfEventTypes-DharkVsi.js';
5
5
  import { Node, Edge } from '@xyflow/react';
6
6
  import * as zustand_vanilla from 'zustand/vanilla';
7
- import { F as FeatureSliceId, b as SliceContract, a as PersistenceDescriptor, W as WorkspacePersistence, P as PersistedSlice, L as LoadResult, f as WriteResult, e as WorkspaceTabId, C as CommandResult, R as RequestContext, Q as QueryResult } from './contracts-DdYOMBl9.js';
7
+ import { F as FeatureSliceId, b as SliceContract, a as PersistenceDescriptor, W as WorkspacePersistence, P as PersistedSlice, L as LoadResult, g as WriteResult, f as WorkspaceTabId, C as CommandResult, R as RequestContext, Q as QueryResult } from './contracts-B3AbzYQ4.js';
8
8
 
9
- var version = "10.1.3";
9
+ var version = "10.3.2";
10
10
 
11
11
  declare function useOnClickOutside(ref: RefObject<HTMLElement | null>, handler: (e: MouseEvent | TouchEvent) => void): void;
12
12
 
@@ -580,6 +580,8 @@ interface LibraryViewProps {
580
580
  layout?: 'list' | 'grid';
581
581
  emptyText?: string;
582
582
  /** Host-gerenderte Zusatzaktionen je Item (z.B. Flow-Referenzgenerierung). */
583
+ /** Inline child rows below a list card, e.g. expandable related items. */
584
+ renderItemChildren?: (item: LibraryViewItem) => React__default.ReactNode;
583
585
  renderItemExtras?: (item: LibraryViewItem) => React__default.ReactNode;
584
586
  /** Host-Datenversion: Änderung erzwingt Re-Query (z.B. nach Reload/Import). */
585
587
  dataVersion?: number;
@@ -617,12 +619,22 @@ interface Zugehoerigkeit {
617
619
  */
618
620
  hinweis: string | null;
619
621
  }
620
- /** Das Item, soweit die Zuordnung es überhaupt anschaut. */
622
+ /**
623
+ * Das Item, soweit die Zuordnung es überhaupt anschaut.
624
+ *
625
+ * Seit Issue #503 (E7) ist ein Item ein Prompt und kann **mehrere** Runs
626
+ * führen: `szenen.prompt_run_id` bleibt der Primärlauf (der erste), alle Runs
627
+ * stehen in `szenen.runs[]`; `szenen_run_links` löst sie der Reihe nach auf.
628
+ */
621
629
  interface ZugehoerigkeitEingabe {
622
630
  szenen?: {
623
631
  prompt_run_id?: string | null;
632
+ runs?: ReadonlyArray<{
633
+ prompt_run_id?: string | null;
634
+ }> | null;
624
635
  } | null;
625
636
  szenen_links?: SzenenLinks | null;
637
+ szenen_run_links?: ReadonlyArray<SzenenLinks> | null;
626
638
  }
627
639
  /**
628
640
  * Ob die Zugehörigkeit ein **anklickbares** Ziel hergibt.
@@ -642,6 +654,15 @@ declare function hatNavigationsziele(zugehoerigkeit: Zugehoerigkeit | null | und
642
654
  * Oberfläche zeigt dann gar nichts an.
643
655
  */
644
656
  declare function zugehoerigkeitOf(item: ZugehoerigkeitEingabe | null | undefined): Zugehoerigkeit | null;
657
+ /**
658
+ * Die Zugehörigkeiten **aller** Runs eines Items, in Reihenfolge des
659
+ * Hinzukommens (Primärlauf zuerst). Ein Item mit einem Run liefert genau die
660
+ * Zugehörigkeit von `zugehoerigkeitOf`; ein Item ohne Run eine leere Liste.
661
+ *
662
+ * Additiv zu `zugehoerigkeitOf` (dessen Vertrag unverändert bleibt): Wer nur den
663
+ * Primärlauf zeigt, ruft weiter diese Funktion.
664
+ */
665
+ declare function zugehoerigkeitenOf(item: ZugehoerigkeitEingabe | null | undefined): Zugehoerigkeit[];
645
666
 
646
667
  interface ZugehoerigkeitLinksProps {
647
668
  zugehoerigkeit: Zugehoerigkeit | null;
@@ -974,4 +995,4 @@ interface UseTagBaseResult {
974
995
  }
975
996
  declare function useTagBase(token: string, namespace: string): UseTagBaseResult;
976
997
 
977
- export { AvatarArchitectApp, type AvatarArchitectAppProps, CURRENT_TAG_EVENT_VERSION, CollapsibleCard, CommandResult, CompactDropdown, type CreateFaStoreOptions, type CreatePersistenceCoordinatorOptions, type ExtractedCharacter, FaApp, type FaAppProps, type FaStore, type FaStoreState, FaToolsBadge, FeatureSliceId, FlowTextGenerationOptions, FlowWorkspacePicker, type FlowWorkspacePickerProps, GLOBAL_STYLES, Generation, HFEvent, type HFStateResult, HFStateSnapshot, HfMediaSyncTab, HistoryPanel, type InMemoryWorkspacePersistence, InspectPanel, LIBRARY_CUTOVER_MARKER, LIBRARY_SLICE_SCHEMA_VERSION, version as LIB_VERSION, LabBlend, LabCompare, LabFrame, LabFrameExtractor, type LabFrameExtractorProps, LabImagePicker, LabItem, LabLoop, LabRemix, LabServices, type LabSlotId, LabsTab, type LegacyMigrationOptions, type LegacyMigrationResult, type LegacyRecentTagRef, type LegacySourceResult, type LibraryCommandName, type LibraryCommands, type LibraryDataSource, type LibraryLegacySource, type LibraryListQuery, type LibraryPage, LibraryView, type LibraryViewItem, type LibraryViewProps, type LibraryViewTag, type LibraryWorkspaceState, ListView, LoadResult, type MediaItem, MediaLibrary, PersistedSlice, type PersistenceCoordinator, PersistenceDescriptor, PillButton, PromptTab, QueryResult, RequestContext, type RunLibraryLegacyImportOptions, type RunTagsLegacyImportOptions, SCOPE_MAP, type SaveState, SectionLabel, SelectedLabImage, SelectedTag, type SelectionValidation, ServerTab, SetupPanel, SliceContract, type SliceMeta, type SzenenLinks, TAGS_CUTOVER_MARKER, TAGS_SLICE_SCHEMA_VERSION, type TagBase, type TagBaseContext, type TagBaseEvent, type TagBaseMeta, TagBaseSection, type TagBaseSectionProps, type TagBaseTagEntry, type TagBaseTagOption, type TagBaseUser, type TagBaseWorkspaceTags, type TagCommandName, type TagCommands, type TagCreatedEvent, type TagCreatedPayload, type TagEntry, type TagEntryInput, TagManager, TagManagerPanel, type TagManagerProps, type TagManagerSelection, TagOption, type TagQueries, type TagUpdateDelta, type TagUpdatedDelta, type TagUpdatedEvent, type TagUpdatedPayload, type TagViewCategory, type TagViewModel, type TagViewOption, type TagViewScope, type TagsWorkspaceState, type UseTagBaseResult, WorkspacePersistence, WorkspaceTabId, WorkspaceTags, WriteResult, type Zugehoerigkeit, type ZugehoerigkeitEingabe, ZugehoerigkeitLinks, type ZugehoerigkeitLinksProps, type ZugehoerigkeitZiel, autoLabel, buildBlendInstruction, buildCompareInstruction, buildLoopInstruction, buildReferenceImageMediaIds, buildRemixInstruction, buildScanInstruction, createFaStore, createInMemoryLibraryDataSource, createInMemoryWorkspacePersistence, createLibraryDefault, createPersistenceCoordinator, createTagCreatedEvent, createTagUpdatedEvent, createTagsDefault, deriveTagBaseWorkspaceTags, deriveTagViewModel, formatTreeToMarkdown, frameToGeneration, getFormattedTimestamp, getHFToken, getSessionClientId, groupGenerationsToLabItems, hatNavigationsziele, hfBatchArchive, hfBootstrapFromLegacy, hfListDir, hfLoadImageAsBase64, hfUploadImage, hfUploadSmallFile, injectXMPMetadata, libraryContract, libraryReactDescriptor, listCategories, loadHFState, loadPendingEvents, loadTagBase, parseLegacyLibraryFilters, parseLegacyRecentTags, parsePromptFile, runLegacyMigration, runLibraryLegacyImport, runTagsLegacyImport, setHFToken, tagsContract, tagsReactDescriptor, tsFromEventPath, useFaSlice, useFaSliceMeta, useHFState, useKeyboardNavigation, useOnClickOutside, useTagBase, validateTagBaseSelection, writeHFEvent, writeTagEvent, zugehoerigkeitOf };
998
+ export { AvatarArchitectApp, type AvatarArchitectAppProps, CURRENT_TAG_EVENT_VERSION, CollapsibleCard, CommandResult, CompactDropdown, type CreateFaStoreOptions, type CreatePersistenceCoordinatorOptions, type ExtractedCharacter, FaApp, type FaAppProps, type FaStore, type FaStoreState, FaToolsBadge, FeatureSliceId, FlowTextGenerationOptions, FlowWorkspacePicker, type FlowWorkspacePickerProps, GLOBAL_STYLES, Generation, HFEvent, type HFStateResult, HFStateSnapshot, HfMediaSyncTab, HistoryPanel, type InMemoryWorkspacePersistence, InspectPanel, LIBRARY_CUTOVER_MARKER, LIBRARY_SLICE_SCHEMA_VERSION, version as LIB_VERSION, LabBlend, LabCompare, LabFrame, LabFrameExtractor, type LabFrameExtractorProps, LabImagePicker, LabItem, LabLoop, LabRemix, LabServices, type LabSlotId, LabsTab, type LegacyMigrationOptions, type LegacyMigrationResult, type LegacyRecentTagRef, type LegacySourceResult, type LibraryCommandName, type LibraryCommands, type LibraryDataSource, type LibraryLegacySource, type LibraryListQuery, type LibraryPage, LibraryView, type LibraryViewItem, type LibraryViewProps, type LibraryViewTag, type LibraryWorkspaceState, ListView, LoadResult, type MediaItem, MediaLibrary, PersistedSlice, type PersistenceCoordinator, PersistenceDescriptor, PillButton, PromptTab, QueryResult, RequestContext, type RunLibraryLegacyImportOptions, type RunTagsLegacyImportOptions, SCOPE_MAP, type SaveState, SectionLabel, SelectedLabImage, SelectedTag, type SelectionValidation, ServerTab, SetupPanel, SliceContract, type SliceMeta, type SzenenLinks, TAGS_CUTOVER_MARKER, TAGS_SLICE_SCHEMA_VERSION, type TagBase, type TagBaseContext, type TagBaseEvent, type TagBaseMeta, TagBaseSection, type TagBaseSectionProps, type TagBaseTagEntry, type TagBaseTagOption, type TagBaseUser, type TagBaseWorkspaceTags, type TagCommandName, type TagCommands, type TagCreatedEvent, type TagCreatedPayload, type TagEntry, type TagEntryInput, TagManager, TagManagerPanel, type TagManagerProps, type TagManagerSelection, TagOption, type TagQueries, type TagUpdateDelta, type TagUpdatedDelta, type TagUpdatedEvent, type TagUpdatedPayload, type TagViewCategory, type TagViewModel, type TagViewOption, type TagViewScope, type TagsWorkspaceState, type UseTagBaseResult, WorkspacePersistence, WorkspaceTabId, WorkspaceTags, WriteResult, type Zugehoerigkeit, type ZugehoerigkeitEingabe, ZugehoerigkeitLinks, type ZugehoerigkeitLinksProps, type ZugehoerigkeitZiel, autoLabel, buildBlendInstruction, buildCompareInstruction, buildLoopInstruction, buildReferenceImageMediaIds, buildRemixInstruction, buildScanInstruction, createFaStore, createInMemoryLibraryDataSource, createInMemoryWorkspacePersistence, createLibraryDefault, createPersistenceCoordinator, createTagCreatedEvent, createTagUpdatedEvent, createTagsDefault, deriveTagBaseWorkspaceTags, deriveTagViewModel, formatTreeToMarkdown, frameToGeneration, getFormattedTimestamp, getHFToken, getSessionClientId, groupGenerationsToLabItems, hatNavigationsziele, hfBatchArchive, hfBootstrapFromLegacy, hfListDir, hfLoadImageAsBase64, hfUploadImage, hfUploadSmallFile, injectXMPMetadata, libraryContract, libraryReactDescriptor, listCategories, loadHFState, loadPendingEvents, loadTagBase, parseLegacyLibraryFilters, parseLegacyRecentTags, parsePromptFile, runLegacyMigration, runLibraryLegacyImport, runTagsLegacyImport, setHFToken, tagsContract, tagsReactDescriptor, tsFromEventPath, useFaSlice, useFaSliceMeta, useHFState, useKeyboardNavigation, useOnClickOutside, useTagBase, validateTagBaseSelection, writeHFEvent, writeTagEvent, zugehoerigkeitOf, zugehoerigkeitenOf };