@rslsp1/fa-app-tools 9.1.0 → 10.0.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.
@@ -978,7 +978,220 @@ declare function checkChainTargets(meta: DraftChainMeta, targets: readonly Chain
978
978
  /** Der Link eines Feldes, oder `null`. */
979
979
  declare function linkFor(meta: DraftChainMeta | null | undefined, field: ChainLinkField): DraftChainLink | null;
980
980
 
981
+ /** Wie viele Eintraege eine Seite traegt, wenn niemand etwas anderes sagt. */
982
+ declare const LOAD_MORE_PAGE_SIZE = 10;
983
+ interface PageRequest {
984
+ /** Hoechstzahl der Eintraege dieser Seite. Muss groesser als 0 sein. */
985
+ limit: number;
986
+ /**
987
+ * Kennung des **letzten bereits geladenen** Eintrags, oder `null`/weggelassen
988
+ * fuer die erste Seite. Geliefert wird, was danach kommt.
989
+ */
990
+ after?: string | null;
991
+ }
992
+ interface Page<T> {
993
+ /** Die Eintraege dieser Seite, in der Reihenfolge der Eingabe. */
994
+ items: readonly T[];
995
+ /** Ob nach dieser Seite noch etwas kommt. */
996
+ hasMore: boolean;
997
+ /** Was als `after` der naechsten Seite mitzugeben ist. `null` am Ende. */
998
+ nextCursor: string | null;
999
+ /** Gesamtzahl der Eintraege **nach** Filter, **vor** dem Seitenschnitt. */
1000
+ total: number;
1001
+ }
1002
+ /**
1003
+ * Schneidet eine Seite aus einer bereits geordneten und gefilterten Liste.
1004
+ *
1005
+ * @param alle Alle Eintraege in Anzeigereihenfolge.
1006
+ * @param idOf Stabile Kennung eines Eintrags — sie ist der Cursor.
1007
+ * @param request Seitenwunsch. Ohne Angabe wird **nicht** geschnitten; die
1008
+ * Antwort traegt dann alles und `hasMore: false`. Das ist der bestehende
1009
+ * Vertrag jeder Operation, die diesen Schnitt nur optional anbietet.
1010
+ * @throws Wenn `after` in `alle` nicht vorkommt.
1011
+ */
1012
+ declare function pageOf<T>(alle: readonly T[], idOf: (eintrag: T) => string, request?: PageRequest | null): Page<T>;
1013
+ /**
1014
+ * Liest einen Seitenwunsch aus Abfrageparametern — die eine Stelle, an der aus
1015
+ * `limit`/`after` ein `PageRequest` wird.
1016
+ *
1017
+ * Ohne `limit` gibt es **keinen** Seitenschnitt (`null`): Eine Voreinstellung
1018
+ * wuerde bestehende Aufrufer stillschweigend beschneiden. Ein unbrauchbares
1019
+ * `limit` ist ein Fehler, keine Vorgabe.
1020
+ */
1021
+ declare function pageRequestFrom(roh: {
1022
+ limit?: unknown;
1023
+ after?: unknown;
1024
+ } | null | undefined): PageRequest | null;
1025
+
1026
+ /**
1027
+ * Ein Tag in der Form, in der die Library ihn fuehrt.
1028
+ *
1029
+ * `l` ist das Label und die Identitaet — dieselbe, gegen die
1030
+ * `resolveTagLabels` prueft. `v` und `cat` sind die aufgeloeste Vokabel und
1031
+ * werden mitgefuehrt, nicht neu erfunden.
1032
+ */
1033
+ interface LibraryTagRef {
1034
+ l: string;
1035
+ v?: string | null;
1036
+ cat?: string | null;
1037
+ }
1038
+ /** Nutzlast von `szenen.prompt_run_tags_set` — der vollstaendige Tagsatz eines Laufs. */
1039
+ interface PromptRunTagsSetPayload {
1040
+ run_id: string;
1041
+ /** Der **ganze** Satz, nicht ein Delta: Entfernen ist ein kuerzerer Satz. */
1042
+ tags: readonly LibraryTagRef[];
1043
+ set_at: string;
1044
+ }
1045
+ /** Woher ein angezeigter Tag kommt. */
1046
+ type TagHerkunft = 'prompt' | 'library';
1047
+ /** Ein Tag, wie die Promptanzeige ihn zeigt — mit seiner Herkunft. */
1048
+ interface AngezeigterTag {
1049
+ label: string;
1050
+ value: string | null;
1051
+ category: string | null;
1052
+ /**
1053
+ * Alle Herkuenfte dieses Labels, in der Reihenfolge `prompt` vor `library`.
1054
+ *
1055
+ * Ein Tag kann **beides** sein. Genau dieser Fall entscheidet die
1056
+ * Bearbeitung: Nur `prompt` darf am Lauf entfernt werden, `library` nicht —
1057
+ * und ein Tag, der beides ist, verliert beim Entfernen nur seine
1058
+ * Prompt-Zuordnung, nicht seine Library-Herkunft.
1059
+ */
1060
+ herkunft: readonly TagHerkunft[];
1061
+ }
1062
+ /**
1063
+ * Liest eine Tagliste, wie sie in `user_library.tags` oder in einem
1064
+ * Tag-Ereignis steht.
1065
+ *
1066
+ * Fail loud (Regel 4): Ein Eintrag ohne brauchbares Label ist ein Datenfehler
1067
+ * und wird benannt, nicht uebersprungen. Ein uebersprungener Tag saehe aus wie
1068
+ * „dieses Item hat den Tag nicht" und waere von der Wahrheit nicht zu
1069
+ * unterscheiden.
1070
+ *
1071
+ * @param quelle Woher die Liste stammt — steht in der Fehlermeldung.
1072
+ */
1073
+ declare function tagRefsAus(roh: unknown, quelle: string): readonly LibraryTagRef[];
1074
+ /**
1075
+ * Die direkten Tags **jedes** Laufs aus dem Ereignislog.
1076
+ *
1077
+ * Der letzte Satz je `run_id` gilt. Anders als bei `collectPromptRuns` gewinnt
1078
+ * hier nicht der erste: Ein Lauf ist unveraenderlich, seine Beschlagwortung ist
1079
+ * es ausdruecklich nicht — sie ist eine Auswahl, die revidiert werden darf.
1080
+ */
1081
+ declare function collectPromptRunTags(events: readonly ElementEvent[]): ReadonlyMap<string, readonly LibraryTagRef[]>;
1082
+ /** Die direkten Tags genau eines Laufs. */
1083
+ declare function promptRunTagsOf(events: readonly ElementEvent[], runId: string): readonly LibraryTagRef[];
1084
+ /**
1085
+ * Die gemeinsame sichtbare Tag-Menge eines Prompts.
1086
+ *
1087
+ * Reihenfolge: erst die Prompt-Tags in ihrer gespeicherten Reihenfolge, dann
1088
+ * die Library-Tags, die noch nicht dabei waren. Dubletten werden ueber das
1089
+ * **Label** zusammengefuehrt — es ist die Identitaet eines Tags in der
1090
+ * Vokabel-Tabelle (`resolveTagLabels` sucht ueber `label`).
1091
+ *
1092
+ * Zusammengefuehrt wird nur die Anzeige. Welcher Tag am Prompt haengt, bleibt
1093
+ * an `herkunft` ablesbar; die Bearbeitung liest genau dieses Feld.
1094
+ */
1095
+ declare function mergeRunTags(promptTags: readonly LibraryTagRef[], libraryTags: readonly LibraryTagRef[]): readonly AngezeigterTag[];
1096
+ /** Nur die Labels — die Form, in der der Schreibweg Tags entgegennimmt. */
1097
+ declare function labelsOf(tags: readonly LibraryTagRef[]): readonly string[];
1098
+
1099
+ /** Das Vorschaubild einer Promptkarte — ein Locator, keine Bilddaten. */
1100
+ interface PromptRunPreviewImage {
1101
+ /** Derselbe Locator wie im Batch (D-118) — aufgeloest ueber den Bildbestand. */
1102
+ media_ref: string;
1103
+ /** Soweit der Nachweis ihn fuehrt; aeltere Batches tragen ihn nicht. */
1104
+ mime_type: string | null;
1105
+ }
1106
+ /**
1107
+ * Was die Karte ueber die Ergebnisse eines Laufs weiss.
1108
+ *
1109
+ * `imageCount: 0` heisst **belegt keine Bilder** — nicht „unbekannt". Die
1110
+ * Unterscheidung traegt das Feld nicht, sondern die Anwesenheit der Annotation
1111
+ * selbst: Ein Host, der den Bestand nicht lesen kann, liefert sie nicht
1112
+ * (D-75).
1113
+ */
1114
+ interface PromptRunAnnotation {
1115
+ /** Wie viele Bilder dem Lauf ueber seine Batches zugeordnet sind. */
1116
+ imageCount: number;
1117
+ /** Ein Bild als Vorschau, oder `null` — bei `imageCount === 0` immer `null`. */
1118
+ previewImage: PromptRunPreviewImage | null;
1119
+ /**
1120
+ * Die Library-Items dieses Laufs. Sie stehen hier, weil die Tag-Herkunft
1121
+ * daran haengt und der Host sonst nicht wuesste, welche Items er nachschlagen
1122
+ * soll.
1123
+ */
1124
+ itemIds: readonly string[];
1125
+ /**
1126
+ * Die Tags dieser Items — **abgeleitet**, nie am Lauf gespeichert.
1127
+ *
1128
+ * Leer, wenn die Items keine Tags haben **oder** der Host sie nicht lesen
1129
+ * konnte. Diese beiden Faelle zu trennen waere hier eine Erfindung: Der
1130
+ * Aufrufer weiss, ob er die Vokabel gefragt hat.
1131
+ */
1132
+ libraryTags: readonly LibraryTagRef[];
1133
+ }
1134
+ interface AnnotateRunsOptions {
1135
+ /**
1136
+ * Tags je `item_id`, soweit der Host sie lesen kann.
1137
+ *
1138
+ * Fehlt die Angabe, tragen alle Annotationen `libraryTags: []`. Die Bilder
1139
+ * stimmen trotzdem — sie kommen aus dem Log.
1140
+ */
1141
+ libraryTagsByItem?: ReadonlyMap<string, readonly LibraryTagRef[]>;
1142
+ }
1143
+ /**
1144
+ * Die Annotationen **aller** Laeufe, die im Log ein Batch haben.
1145
+ *
1146
+ * Ein einziger Durchlauf ueber `collectImageBatches()`. Ein Lauf ohne Batch
1147
+ * kommt nicht vor — der Aufrufer liest das als „null Bilder", und die Karte
1148
+ * zeigt dann keine leere Bildflaeche, sondern nur die Zahl.
1149
+ *
1150
+ * Die Vorschau ist das Bild mit der kleinsten `position` im **ersten** Batch
1151
+ * des Laufs. Stabil gewaehlt und nicht geraten: Dieselbe Karte zeigt morgen
1152
+ * dasselbe Bild, auch wenn spaeter Batches dazukommen (D-113 — ein Lauf bleibt
1153
+ * ein Item, weitere Batches werden angehaengt).
1154
+ */
1155
+ declare function annotateRunsFromEvents(events: readonly ElementEvent[], options?: AnnotateRunsOptions): ReadonlyMap<string, PromptRunAnnotation>;
1156
+ /** Die Annotation eines Laufs, oder die leere Aussage „keine Bilder". */
1157
+ declare const KEINE_BILDER: PromptRunAnnotation;
1158
+ /** Was eine Elementkarte ueber die Ergebnisse ihres Elements weiss. */
1159
+ interface ElementAnnotation {
1160
+ /** Bilder ueber **alle** Laeufe dieses Elements. */
1161
+ imageCount: number;
1162
+ /** Das Deckbild, oder `null`. */
1163
+ previewImage: PromptRunPreviewImage | null;
1164
+ /** Die Library-Items aller Laeufe — der Nachschlagepunkt fuer die Tags. */
1165
+ itemIds: readonly string[];
1166
+ /** Die direkten Tags der Laeufe, zusammengefuehrt ueber das Label. */
1167
+ promptTags: readonly LibraryTagRef[];
1168
+ /** Die Tags der zugeordneten Library-Items, ebenso zusammengefuehrt. */
1169
+ libraryTags: readonly LibraryTagRef[];
1170
+ }
1171
+ /**
1172
+ * Die Annotationen **aller** Elemente, die mindestens einen Lauf haben.
1173
+ *
1174
+ * Ein Durchgang ueber die Laeufe in Logreihenfolge. Welches Element zu einem
1175
+ * Lauf gehoert, entscheidet `namingElementOf()` — dieselbe Funktion, aus der
1176
+ * die Laufliste ihren Titel holt. Zwei Zuordnungsregeln waeren zwei
1177
+ * Wahrheiten darueber, wessen Lauf das ist.
1178
+ *
1179
+ * Das Deckbild ist die Vorschau des **juengsten** Laufs mit Bildern. Anders
1180
+ * als bei der Promptkarte, die ihr erstes Bild behaelt: Eine Szene wird
1181
+ * weiterbearbeitet, und ihr Deckbild soll den aktuellen Stand zeigen, nicht
1182
+ * den ersten Versuch. Deterministisch bleibt es trotzdem — dieselben
1183
+ * Ereignisse ergeben dasselbe Bild.
1184
+ */
1185
+ declare function annotateElementsFromEvents(events: readonly ElementEvent[], options?: AnnotateRunsOptions): ReadonlyMap<string, ElementAnnotation>;
1186
+
981
1187
  /** Element-Stammsatz (`elements`, §2.1). Nach Anlage unveränderlich: `id`, `type`. */
1188
+ /** Der Filter beider Elementlisten — ein Typ, damit sie nicht auseinanderlaufen. */
1189
+ interface ElementListFilter {
1190
+ contextId?: string | null;
1191
+ type?: SzenenElementType;
1192
+ types?: readonly SzenenElementType[];
1193
+ includeRetired?: boolean;
1194
+ }
982
1195
  interface ElementRecord {
983
1196
  element_id: string;
984
1197
  /** Lesbarer Stammtitel fuer Listen und Auswahlen; kein Versionsinhalt (D-35). */
@@ -1088,12 +1301,23 @@ type SzenenCommandResult<T, C = T> = CommandResult<T> | WriteConflict<C> | Publi
1088
1301
  /** Lesezugriffe auf den Elementspeicher. */
1089
1302
  interface SzenenQueries {
1090
1303
  /** Alle Elemente eines Kontexts, optional nach einem Typ oder einer Typmenge gefiltert. */
1091
- listElements(filter?: {
1092
- contextId?: string | null;
1093
- type?: SzenenElementType;
1094
- types?: readonly SzenenElementType[];
1095
- includeRetired?: boolean;
1096
- }): Promise<QueryResult<readonly ElementRecord[]>>;
1304
+ listElements(filter?: ElementListFilter): Promise<QueryResult<readonly ElementRecord[]>>;
1305
+ /**
1306
+ * **Eine Seite** Elemente, neueste zuerst — Kette `szenen-listen-pagination`.
1307
+ *
1308
+ * Derselbe Speicher, derselbe Filter, dieselbe Sichtbarkeitsregel wie
1309
+ * `listElements`; nur wird nicht alles uebertragen. „Neueste zuerst" ist die
1310
+ * umgekehrte Reihenfolge des Ereignislogs — ein Element traegt keinen
1311
+ * Zeitstempel, und einen zu erfinden waere eine Aussage ohne Beleg (D-75).
1312
+ *
1313
+ * `listElements` bleibt unveraendert: Die Zielmodellauflösung, die
1314
+ * Kontextsichtbarkeit und die Policy-Suche brauchen **alle** Kandidaten und
1315
+ * duerfen keine Seite bekommen.
1316
+ *
1317
+ * Optional, damit kein bestehender Implementierer der oeffentlichen
1318
+ * Schnittstelle bricht. Fehlt sie, laedt die Ansicht vollstaendig weiter.
1319
+ */
1320
+ listElementsPage?(filter?: ElementListFilter, page?: PageRequest | null): Promise<QueryResult<ElementPage>>;
1097
1321
  /** Vollständiger Stand eines Elements, oder `null`, wenn unbekannt. */
1098
1322
  getElement(elementId: string): Promise<QueryResult<ElementSnapshot | null>>;
1099
1323
  /**
@@ -1149,6 +1373,32 @@ interface ContextChainPort {
1149
1373
  */
1150
1374
  chainFor(contextId: string | null): Promise<QueryResult<readonly (string | null)[]>>;
1151
1375
  }
1376
+ /**
1377
+ * `listElementsPage` aus einem vorhandenen `listElements` — die eine
1378
+ * Implementierung fuer alle Speicher.
1379
+ *
1380
+ * Warum als Adapter und nicht in jedem Speicher neu: Der Filter, die
1381
+ * Sichtbarkeitsregel (D-04) und die Reihenfolge stehen damit weiterhin genau
1382
+ * einmal — im jeweiligen `listElements`. Dieser Adapter dreht und schneidet,
1383
+ * er entscheidet nichts.
1384
+ *
1385
+ * **Neueste zuerst** ist die umgekehrte Reihenfolge des Ereignislogs. Ein
1386
+ * Element traegt keinen Zeitstempel (`ElementRecord`); die Anlagereihenfolge
1387
+ * ist das, was belegbar ist. Einen Zeitstempel zu erfinden oder nach Titel zu
1388
+ * sortieren waere eine andere Aussage als „neueste zuerst".
1389
+ */
1390
+ /**
1391
+ * Eine Seite Elemente, dazu was ihre Laeufe hergeben — Kette
1392
+ * `szenen-prompt-anzeige-bilder-tags`.
1393
+ *
1394
+ * `annotations` fehlt, wo der Host den Laufbestand nicht lesen kann. Das ist
1395
+ * eine andere Aussage als „keine Bilder" und wird deshalb nicht mit Nullen
1396
+ * gefuellt (D-75).
1397
+ */
1398
+ interface ElementPage extends Page<ElementRecord> {
1399
+ annotations?: Readonly<Record<string, ElementAnnotation>>;
1400
+ }
1401
+ declare function listElementsPageOver(liste: (filter?: ElementListFilter) => Promise<QueryResult<readonly ElementRecord[]>>, filter?: ElementListFilter, page?: PageRequest | null): Promise<QueryResult<Page<ElementRecord>>>;
1152
1402
  /**
1153
1403
  * Macht aus einem Lese-Port den `ReferenceResolver` der Publish-Prüfungen.
1154
1404
  *
@@ -1324,6 +1574,292 @@ declare const isOk: <T, C>(result: SzenenCommandResult<T, C>) => result is {
1324
1574
  value: T;
1325
1575
  };
1326
1576
 
1577
+ /** Präfix aller Events dieser Domain im gemeinsamen HF-Event-Kanal. */
1578
+ declare const SZENEN_EVENT_PREFIX = "szenen.";
1579
+ declare const SZENEN_EVENT_TYPES: {
1580
+ readonly elementCreated: "szenen.element_created";
1581
+ readonly elementRetired: "szenen.element_retired";
1582
+ readonly metadataRevised: "szenen.element_metadata_revised";
1583
+ readonly draftWritten: "szenen.element_draft_written";
1584
+ readonly versionPublished: "szenen.element_version_published";
1585
+ readonly preferredHeadSelected: "szenen.element_preferred_head_selected";
1586
+ /**
1587
+ * Ein Prompt-Ableitungslauf — Stufe 3, S6 (E-3b).
1588
+ *
1589
+ * Ein Lauf ist **kein Element**: keine Version, kein DAG, nicht
1590
+ * referenzierbar. Er liegt trotzdem im selben autoritativen Log, weil er
1591
+ * append-only und unveränderlich ist — genau die Form, die ein Ereignislog
1592
+ * nativ trägt — und weil MySQL sonst zu einem zweiten fachlichen Speicher
1593
+ * würde, den D-62 abgeschafft hat.
1594
+ *
1595
+ * Der Elementreducer ignoriert diesen Typ (`default:`-Zweig); die Läufe
1596
+ * werden mit `collectPromptRuns` gelesen.
1597
+ */
1598
+ readonly promptRunRecorded: "szenen.prompt_run_recorded";
1599
+ /**
1600
+ * Ein Szenen-Rekonstruktionslauf — Stufe 6.5 (D-71).
1601
+ *
1602
+ * Derselbe Bauplan und dieselbe Begründung wie beim Prompt-Lauf: append-only,
1603
+ * unveränderlich, **kein Element** — keine Version, kein DAG, nicht
1604
+ * referenzierbar. Er liegt im autoritativen Log, weil er genau die Form hat,
1605
+ * die ein Ereignislog nativ trägt.
1606
+ *
1607
+ * Bewusst ein zweiter Lauftyp und **kein** gemeinsamer: Ein Prompt-Lauf geht
1608
+ * von einer veröffentlichten Shot-Version aus, ein Rekonstruktionslauf von
1609
+ * einer Referenz, die noch zu gar keinem Element gehört. Sie in einen Typ zu
1610
+ * zwingen hieße, beiden ihre Herkunftsfelder zu nehmen.
1611
+ *
1612
+ * Der Elementreducer ignoriert auch diesen Typ (`default:`-Zweig).
1613
+ */
1614
+ readonly sceneDerivationRecorded: "szenen.scene_derivation_recorded";
1615
+ /**
1616
+ * Ein ausdrücklich ausgelöster Lauf gegen den **echten** Provider.
1617
+ *
1618
+ * Er kostet Geld und wird deshalb nie beiläufig gefahren. Das Ereignis hält
1619
+ * fest, was tatsächlich bezahlt wurde: wie viele Modellaufrufe, mit welchem
1620
+ * Ausgang, in welcher Umgebung und von wem ausgelöst.
1621
+ *
1622
+ * Es ersetzt **nicht** die einzelnen Läufe — die werden regulär als
1623
+ * `prompt_run_recorded` bzw. `scene_derivation_recorded` protokolliert. Es
1624
+ * ist die Klammer darüber und der Grund, warum jemand später nachlesen kann,
1625
+ * ob der Durchstich stattgefunden hat, ohne ihn erneut zu bezahlen.
1626
+ */
1627
+ readonly providerCheckRecorded: "szenen.provider_check_recorded";
1628
+ /**
1629
+ * Eine geprüfte Arbeitsfassung eines fehlgeschlagenen Rekonstruktionslaufs —
1630
+ * Stufe 6.6 (D-99).
1631
+ *
1632
+ * Sie ist **kein Lauf**: kein Provideraufruf, keine Kosten, kein Zielmodell.
1633
+ * Sie ist die lokal geprüfte Korrektur eines bereits bezahlten Ergebnisses
1634
+ * und zeigt über `run_id` auf ihren Ursprung. Der `raw_output` jenes Laufs
1635
+ * bleibt unangetastet — deshalb ein eigenes Ereignis statt einer Änderung am
1636
+ * bestehenden, das es ohnehin nicht geben dürfte (D-71).
1637
+ *
1638
+ * Mehrere Rettungen zum selben Lauf sind zulässig und erwartet: Jede
1639
+ * Korrekturrunde ist nachvollziehbare Arbeit, kein Update der vorigen.
1640
+ *
1641
+ * Der Elementreducer ignoriert auch diesen Typ (`default:`-Zweig).
1642
+ */
1643
+ readonly sceneDerivationRecoveryRecorded: "szenen.scene_derivation_recovery_recorded";
1644
+ /**
1645
+ * Ein bezahlter Bildgenerierungsauftrag beginnt — Stufe 6.7 (D-119).
1646
+ *
1647
+ * Append-only wie jedes andere Ereignis dieser Domain, geschrieben **vor**
1648
+ * dem Provideraufruf. Es traegt **keine Bilddaten** — nur die Kennung, mit
1649
+ * der die spaetere kanonische Batch-Persistenz (`saveGeneratedAssetBatch`,
1650
+ * Teil C) wiedergefunden wird. Ein Crash zwischen diesem Ereignis und
1651
+ * `imageGenerationFinished` loescht den Auftrag nicht: Er bleibt lesbar,
1652
+ * ohne dass irgendein automatischer Retry darauf reagiert.
1653
+ *
1654
+ * Gilt nur fuer `generated_in_app` — ein externer Import (D-108/D-117)
1655
+ * ruft keinen Provider und braucht deshalb kein `started`; sein Nachweis
1656
+ * ist das gespeicherte Library-Item selbst.
1657
+ *
1658
+ * Der Elementreducer ignoriert auch diesen Typ (`default:`-Zweig); gelesen
1659
+ * wird mit `collectImageGenerationOrders`.
1660
+ */
1661
+ readonly imageGenerationStarted: "szenen.image_generation_started";
1662
+ /**
1663
+ * Derselbe Bildgenerierungsauftrag endet — Stufe 6.7 (D-119).
1664
+ *
1665
+ * Erscheint erst **nach** der kanonischen Batch-Persistenz: Ein technischer
1666
+ * Fehler zwischen Provideraufruf und Speichern darf nie als `succeeded`
1667
+ * protokolliert werden, nur weil der Provider geantwortet hat. Traegt
1668
+ * ebenfalls keine Bilddaten — nur Status, Zaehlung und die Item-Kennung,
1669
+ * falls eine entstand.
1670
+ */
1671
+ readonly imageGenerationFinished: "szenen.image_generation_finished";
1672
+ /**
1673
+ * Ein Bild-Batch ist kanonisch gespeichert — Stufe 6.9.2, Gate D
1674
+ * (D-6.9.2-6).
1675
+ *
1676
+ * Erscheint erst, **nachdem** jedes Bild des Batches im Bildbestand liegt
1677
+ * (`hfUploadImage` + `image_added`, dieselbe Reihenfolge wie
1678
+ * `hfImageLibrary.putImage`) — kein Bild gilt als vorhanden, bevor sein
1679
+ * Upload bestätigt ist (R3). Trägt bewusst **keine Bilddaten**, nur den
1680
+ * vollständigen Metadatennachweis, den `listBatchesForPromptRun()` /
1681
+ * `getBatch()` ohne MySQL rekonstruieren können müssen: `item_id`,
1682
+ * `prompt_run_id`, `generation_batch_id`, `source_kind`, je Bild
1683
+ * `position`, `media_ref`, `asset_id`, `model`, `seed`, `width`/`height`.
1684
+ *
1685
+ * Additiv wie jedes Ereignis dieser Domain: ein zweiter Batch desselben
1686
+ * Laufs ist ein **weiteres** Ereignis mit derselben `item_id`, nicht eine
1687
+ * Änderung am ersten (D-113/D-121 — ein Lauf bleibt ein Item). Gilt für
1688
+ * `generated_in_app` **und** `external_import` — nur `source_kind`
1689
+ * unterscheidet die beiden Schreiber (D-116/D-117/D-120).
1690
+ *
1691
+ * Der Elementreducer ignoriert auch diesen Typ (`default:`-Zweig); gelesen
1692
+ * wird mit `collectImageBatches` (`imageBatchStore.ts`).
1693
+ */
1694
+ readonly imageBatchPersisted: "szenen.image_batch_persisted";
1695
+ /**
1696
+ * Ein vorbereiteter Promptvorgang — der Durchstich „Szene → ChatGPT → Lauf".
1697
+ *
1698
+ * Der bestehende Promptpfad ruft das Modell selbst
1699
+ * (`runPromptDerivation()`); ein aufrufendes Chatmodell formuliert dagegen
1700
+ * **zwischen** zwei Werkzeugaufrufen. Damit zerfaellt der eine Vorgang in
1701
+ * zwei, und der zweite braucht genau den Stand, den der erste eingefroren
1702
+ * hat — sonst loeste der Abschluss die inzwischen geaenderte Szene neu auf
1703
+ * und der Lauf behauptete eine Herkunft, die er nicht hat (D-22).
1704
+ *
1705
+ * Deshalb ein eigenes Ereignis und **kein** fluechtiger Prozesszustand: Der
1706
+ * Snapshot ueberlebt Neustart, Hostwechsel und Sitzungsende, weil er im
1707
+ * selben autoritativen Log liegt wie der Lauf, der daraus entsteht.
1708
+ *
1709
+ * Der Elementreducer ignoriert diesen Typ (`default:`-Zweig); gelesen wird
1710
+ * mit `collectPromptOperations` (`scenePromptOperation.ts`).
1711
+ */
1712
+ readonly promptOperationPrepared: "szenen.prompt_operation_prepared";
1713
+ /**
1714
+ * Ein Bildauftrag wartet auf einen ausfuehrenden Flow-Host.
1715
+ *
1716
+ * Die vorhandene Auftragshistorie (`imageGenerationStarted`) beginnt
1717
+ * **unmittelbar vor** dem Provideraufruf und kennt deshalb keinen wartenden
1718
+ * Auftrag. Genau der entsteht hier: Ein Chatmodell beauftragt ueber MCP ein
1719
+ * Bild, der Auftrag wird dauerhaft abgelegt, und der Werkzeugaufruf endet
1720
+ * sofort mit seiner Kennung — er haelt keine Antwort minutenlang offen.
1721
+ *
1722
+ * Traegt **keinen** Prompt: Der steht im referenzierten Lauf, und ihn hier
1723
+ * zu kopieren waere eine zweite Wahrheit ueber denselben eingefrorenen Text
1724
+ * (D-103).
1725
+ */
1726
+ readonly imageJobRequested: "szenen.image_job_requested";
1727
+ /**
1728
+ * Ein Flow-Host beansprucht einen wartenden Bildauftrag.
1729
+ *
1730
+ * Ein append-only Log kennt kein Lock: Zwei Tabs koennen beide anhaengen.
1731
+ * Deshalb ist die Uebernahme **nicht** der Append, sondern das Ergebnis
1732
+ * einer deterministischen Schiedsregel darueber (`winningClaimOf`) — der
1733
+ * erste Anspruch in Logreihenfolge gewinnt, und jeder Host liest nach
1734
+ * seinem Append erneut, bevor er einen bezahlten Provideraufruf startet.
1735
+ * Ein unterlegener Anspruch bleibt sichtbar stehen; er wird nicht geloescht,
1736
+ * weil das Log das nicht kann und weil der Versuch ein Beleg ist.
1737
+ */
1738
+ readonly imageJobClaimed: "szenen.image_job_claimed";
1739
+ /**
1740
+ * Der Bildauftrag ist erledigt — mit dem Ausgang, den der Host gesehen hat.
1741
+ *
1742
+ * Getrennt von `imageGenerationFinished`: Jenes gehoert zum bezahlten
1743
+ * Provideraufruf, dieses zur Zustellung. Ein Auftrag kann fehlschlagen,
1744
+ * **bevor** ein Provider gerufen wurde (abgelehntes Profil), und dann gibt
1745
+ * es kein `imageGenerationFinished`, das den Wartenden erloesen wuerde.
1746
+ */
1747
+ readonly imageJobSettled: "szenen.image_job_settled";
1748
+ /**
1749
+ * Die direkten Tags eines Prompt-Laufs — Kette
1750
+ * `szenen-prompt-anzeige-bilder-tags`.
1751
+ *
1752
+ * Ein eigener Typ, **kein** Feld am Lauf: Ein Lauf ist unveraenderlich
1753
+ * (E-3b), seine Beschlagwortung ist es ausdruecklich nicht. Die Nutzlast
1754
+ * traegt jedes Mal den **vollstaendigen** Satz; Entfernen ist ein kuerzerer
1755
+ * Satz, kein Loeschereignis, weil ein append-only Log nichts zuruecknehmen
1756
+ * kann und ein Delta-Paar (`added`/`removed`) beim ersten verlorenen
1757
+ * Ereignis auseinanderliefe.
1758
+ *
1759
+ * Die Tags sind Library-Vokabeln in der Library-Form `{ l, v, cat }` und
1760
+ * werden auf dem Schreibweg gegen `tags` aufgeloest — es gibt kein zweites
1761
+ * Tag-Vokabular fuer Prompts. Tags **zugeordneter Library-Items** stehen
1762
+ * nie hier: Sie sind ueber die Relation Lauf → Item ableitbar, und eine
1763
+ * Kopie waere ab dem naechsten Library-Edit falsch.
1764
+ *
1765
+ * Der Elementreducer ignoriert diesen Typ (`default:`-Zweig); gelesen wird
1766
+ * mit `collectPromptRunTags` (`promptRunTags.ts`).
1767
+ */
1768
+ readonly promptRunTagsSet: "szenen.prompt_run_tags_set";
1769
+ };
1770
+ /** Ein einzelnes Bild innerhalb von `ImageBatchPersistedPayload` (D-6.9.2-6). */
1771
+ interface ImageBatchPersistedImage {
1772
+ position: number;
1773
+ /** Im aktuellen Host auflösbarer Locator — hier die HF-Bildkennung (D-93). */
1774
+ media_ref: string;
1775
+ /** Fachlich stabile Identität, soweit bekannt — hier identisch mit `media_ref` (D-118). */
1776
+ asset_id?: string;
1777
+ /**
1778
+ * Der **bestätigte** MIME-Typ der abgelegten Datei — Review 2026-08-18 §5 P2.
1779
+ *
1780
+ * Additiv nachgetragen, weil der Batch ihn beim Schreiben kennt, ihn aber
1781
+ * nicht führte: Der Lesepfad musste die Dateiendung deshalb über zwei
1782
+ * Varianten erraten. Geraten wird nichts mehr — der Typ stammt aus den
1783
+ * tatsächlichen Bildbytes (`typAusBytes`), nicht aus einer Annahme, und
1784
+ * bestimmt den Pfad `images/<id>.<ext>`, unter dem die Datei liegt.
1785
+ *
1786
+ * Optional, weil ältere Ereignisse ihn nicht tragen; für die fällt der
1787
+ * Lesepfad auf den Bestandseintrag zurück.
1788
+ */
1789
+ mime_type?: string | null;
1790
+ model?: string | null;
1791
+ /** Nur gesetzt, wenn der Provider ihn tatsächlich zurückliefert (D-107). */
1792
+ seed?: number | null;
1793
+ width?: number | null;
1794
+ height?: number | null;
1795
+ }
1796
+ /** Nutzlast von `imageBatchPersisted` — geschrieben nach bestätigtem Bild-Upload. */
1797
+ interface ImageBatchPersistedPayload {
1798
+ item_id: string;
1799
+ prompt_run_id: string;
1800
+ generation_batch_id: string;
1801
+ source_kind: 'generated_in_app' | 'external_import';
1802
+ title: string;
1803
+ images: readonly ImageBatchPersistedImage[];
1804
+ created_at: string;
1805
+ }
1806
+ /**
1807
+ * Ein Event, wie der Reducer es sieht.
1808
+ *
1809
+ * Nur `type`, `payload` und `clientId` sind fachlich. `ts` dient allein der
1810
+ * **Lesereihenfolge** des Logs und darf nie eine fachliche Vorrangfrage
1811
+ * entscheiden — sonst wäre es `MAX(ts)` durch die Hintertür (§2.5, R-3).
1812
+ */
1813
+ interface ElementEvent<P = unknown> {
1814
+ type: string;
1815
+ payload: P;
1816
+ clientId: string;
1817
+ ts: number;
1818
+ }
1819
+ /** Ein Befund beim Falten: etwas ist widersprüchlich, aber der Zustand bleibt lesbar. */
1820
+ interface ReducerFinding {
1821
+ code: 'unbekanntes_element' | 'version_doppelt' | 'version_veraendert' | 'draft_fork' | 'metadata_fork' | 'preferred_head_fork' | 'element_doppelt';
1822
+ element_id: string;
1823
+ message: string;
1824
+ }
1825
+ /** Abgeleiteter Zustand über alle Elemente. */
1826
+ interface ElementStoreState {
1827
+ elements: ReadonlyMap<string, ElementSnapshot>;
1828
+ findings: readonly ReducerFinding[];
1829
+ }
1830
+ /**
1831
+ * Faltet den Event-Log zum Elementzustand.
1832
+ *
1833
+ * Der Reducer ist rein: gleiche Events, gleicher Zustand — unabhängig von der
1834
+ * Eingabereihenfolge.
1835
+ *
1836
+ * @param events Alle bekannten Szenen-Events; fremde Typen werden übergangen.
1837
+ */
1838
+ declare function reduceElementEvents(events: readonly ElementEvent[]): ElementStoreState;
1839
+ /** Aktuelle Revision des Entwurfs. `0`, wenn keiner existiert. */
1840
+ declare function draftRevisionOf(snapshot: ElementSnapshot | null | undefined): number;
1841
+ /**
1842
+ * Quellrevision eines gelesenen Event-Logs (D-62 §2.4, D-63 §1.1.2).
1843
+ *
1844
+ * Die Projektion darf sich nur dann `current` nennen, wenn sie belegen kann,
1845
+ * **bis wohin** sie reicht. Dieser Beleg ist die Quellrevision, und sie muss
1846
+ * zwei Eigenschaften haben: aus dem Log allein berechenbar (sonst wäre sie eine
1847
+ * zweite Buchführung) und für zwei verschiedene Logstände verschieden.
1848
+ *
1849
+ * Beides leistet `Anzahl@größter-Zeitstempel`. Der Log ist append-only — es
1850
+ * verschwindet nie ein Event —, also wächst die Anzahl bei jedem Schreibvorgang.
1851
+ * Der Zeitstempel kommt dazu, weil er den Stand für einen Menschen lesbar macht;
1852
+ * entscheidend ist die Anzahl.
1853
+ *
1854
+ * Bewusst **kein** Hash über die Payloads: der wäre teurer und würde
1855
+ * Gleichheit über die Zeit versprechen, die der Log ohnehin schon garantiert.
1856
+ * Und bewusst hier, nicht im Server: der Projektor rechnet damit, und wer den
1857
+ * Stand prüfen will, soll dieselbe Rechnung fahren (R-2).
1858
+ */
1859
+ declare function logRevisionOf(events: readonly ElementEvent[]): string;
1860
+ /** Aktuelle Revision der Preferred-Head-Auswahl eines Kontexts. `0`, wenn keine existiert. */
1861
+ declare function preferredHeadRevisionOf(events: readonly ElementEvent[], elementId: string, contextId: string): number;
1862
+
1327
1863
  /** Optionale Kommandos, ohne die einzelne Prüfungen entfallen. */
1328
1864
  type OptionalCommand = 'setPreferredHead' | 'reviseMetadata' | 'retireElement';
1329
1865
  /** Eine einzelne Vertragsprüfung. */
@@ -1392,4 +1928,4 @@ interface ContractRunResult {
1392
1928
  */
1393
1929
  declare function runElementStoreContract(harness: ElementStoreContractHarness): Promise<ContractRunResult>;
1394
1930
 
1395
- export { type PublishVersionInput as $, ALL_PUBLISH_RULES as A, type DraftChainMeta as B, CHAIN_EDGES as C, DERIVABLE_TYPES as D, type DraftFork as E, type DraftRecord as F, type ElementMetadata as G, type ElementRecord as H, type ElementSnapshot as I, type ElementStoreContractHarness as J, type ElementVersionValidation as K, type FindingSeverity as L, type ImageProvenance as M, type NotDerivable as N, type OptionalCommand as O, PROBE_VERSION_ID as P, type ParentRelation as Q, type PreferredHeadOutcome as R, type PreferredHeadResolution as S, type PreferredHeadSelection as T, type PreferredHeadSource as U, type ProjectionState as V, type ProjectionStatus as W, type PublishCheckInput as X, type PublishCheckResult as Y, type PublishFinding as Z, type PublishRejected as _, type AuthoritativeSzenenStore as a, validatePayload as a$, type PublishedVersion as a0, REFERENCE_FIELD as a1, type ReferenceResolver as a2, type ResolvePreferredHeadOptions as a3, type ResolvedVersion as a4, type ReviseMetadataInput as a5, STYLE_PAYLOAD as a6, STYLE_PAYLOAD_V2 as a7, SZENEN_ELEMENT_TYPES as a8, type SceneDerivationInput as a9, buildUserPrompt as aA, buildVersionDag as aB, checkChainTargets as aC, checkDerivationResponse as aD, checkDraftChainMeta as aE, collectVersionRefs as aF, compileSchemas as aG, createSimulationSceneDerivationPort as aH, describeTargetModelFailure as aI, elementStoreContractChecks as aJ, formatSchemaErrors as aK, getSzenenSchemas as aL, isOk as aM, isProjectionCurrent as aN, linkFor as aO, parseDerivationResponse as aP, preferredVersionId as aQ, resolvePreferredHead as aR, resolveTargetModelOver as aS, resolverFromQueries as aT, runElementStoreContract as aU, runPublishChecks as aV, runSceneDerivation as aW, showChain as aX, validateAgainst as aY, validateDerivationInput as aZ, validateElementVersion as a_, type SceneDerivationOutcome as aa, type SceneDerivationOutput as ab, type SchemaError as ac, type SchemaValidationResult as ad, type SetPreferredHeadInput as ae, type StoreAuthority as af, type SzenenCommandResult as ag, type SzenenCommands as ah, type SzenenElementStore as ai, type SzenenElementType as aj, type SzenenProjection as ak, type SzenenQueries as al, type TargetModelCandidate as am, type TargetModelQueries as an, type TargetModelQuery as ao, type TargetModelResolution as ap, UnsupportedSchemaError as aq, type UnusableProposal as ar, type VersionDag as as, VersionDagError as at, type VersionNode as au, type VersionParentLink as av, type WriteConflict as aw, type WriteDraftInput as ax, assessDerivationResponse as ay, buildSystemInstruction as az, CHAIN_LINK_FIELDS as b, withReference as b0, type CatalogueEntry as c, type ChainLinkField as d, type ChainTarget as e, type ChainVerdict as f, type CompiledSchemas as g, type ContextChainPort as h, type ContractCheck as i, type ContractCheckResult as j, type ContractRunResult as k, ContractViolation as l, type CreateElementInput as m, type DerivableType as n, type DerivationAssessment as o, type DerivationConflict as p, type DerivationDiagnostic as q, type DerivationEnvelope as r, type DerivationFailure as s, type DerivationFailureClass as t, type DerivationFollowUp as u, type DerivationImage as v, type DerivationInputMode as w, type DerivationPolicyPayload as x, type DerivationProposal as y, type DraftChainLink as z };
1931
+ export { type Page as $, ALL_PUBLISH_RULES as A, type DerivationProposal as B, CHAIN_EDGES as C, DERIVABLE_TYPES as D, type DraftChainLink as E, type DraftChainMeta as F, type DraftFork as G, type DraftRecord as H, type ElementAnnotation as I, type ElementEvent as J, type ElementListFilter as K, type ElementMetadata as L, type ElementRecord as M, type ElementSnapshot as N, type ElementStoreContractHarness as O, type ElementStoreState as P, type ElementVersionValidation as Q, type FindingSeverity as R, type ImageBatchPersistedImage as S, type ImageBatchPersistedPayload as T, type ImageProvenance as U, KEINE_BILDER as V, LOAD_MORE_PAGE_SIZE as W, type LibraryTagRef as X, type NotDerivable as Y, type OptionalCommand as Z, PROBE_VERSION_ID as _, type AngezeigterTag as a, collectPromptRunTags as a$, type PageRequest as a0, type ParentRelation as a1, type PreferredHeadOutcome as a2, type PreferredHeadResolution as a3, type PreferredHeadSelection as a4, type PreferredHeadSource as a5, type ProjectionState as a6, type ProjectionStatus as a7, type PromptRunAnnotation as a8, type PromptRunPreviewImage as a9, type SzenenCommands as aA, type SzenenElementStore as aB, type SzenenElementType as aC, type SzenenProjection as aD, type SzenenQueries as aE, type TagHerkunft as aF, type TargetModelCandidate as aG, type TargetModelQueries as aH, type TargetModelQuery as aI, type TargetModelResolution as aJ, UnsupportedSchemaError as aK, type UnusableProposal as aL, type VersionDag as aM, VersionDagError as aN, type VersionNode as aO, type VersionParentLink as aP, type WriteConflict as aQ, type WriteDraftInput as aR, annotateElementsFromEvents as aS, annotateRunsFromEvents as aT, assessDerivationResponse as aU, buildSystemInstruction as aV, buildUserPrompt as aW, buildVersionDag as aX, checkChainTargets as aY, checkDerivationResponse as aZ, checkDraftChainMeta as a_, type PromptRunTagsSetPayload as aa, type PublishCheckInput as ab, type PublishCheckResult as ac, type PublishFinding as ad, type PublishRejected as ae, type PublishVersionInput as af, type PublishedVersion as ag, REFERENCE_FIELD as ah, type ReducerFinding as ai, type ReferenceResolver as aj, type ResolvePreferredHeadOptions as ak, type ResolvedVersion as al, type ReviseMetadataInput as am, STYLE_PAYLOAD as an, STYLE_PAYLOAD_V2 as ao, SZENEN_ELEMENT_TYPES as ap, SZENEN_EVENT_PREFIX as aq, SZENEN_EVENT_TYPES as ar, type SceneDerivationInput as as, type SceneDerivationOutcome as at, type SceneDerivationOutput as au, type SchemaError as av, type SchemaValidationResult as aw, type SetPreferredHeadInput as ax, type StoreAuthority as ay, type SzenenCommandResult as az, type AnnotateRunsOptions as b, collectVersionRefs as b0, compileSchemas as b1, createSimulationSceneDerivationPort as b2, describeTargetModelFailure as b3, draftRevisionOf as b4, elementStoreContractChecks as b5, formatSchemaErrors as b6, getSzenenSchemas as b7, isOk as b8, isProjectionCurrent as b9, labelsOf as ba, linkFor as bb, listElementsPageOver as bc, logRevisionOf as bd, mergeRunTags as be, pageOf as bf, pageRequestFrom as bg, parseDerivationResponse as bh, preferredHeadRevisionOf as bi, preferredVersionId as bj, promptRunTagsOf as bk, reduceElementEvents as bl, resolvePreferredHead as bm, resolveTargetModelOver as bn, resolverFromQueries as bo, runElementStoreContract as bp, runPublishChecks as bq, runSceneDerivation as br, showChain as bs, tagRefsAus as bt, validateAgainst as bu, validateDerivationInput as bv, validateElementVersion as bw, validatePayload as bx, withReference as by, type AuthoritativeSzenenStore as c, CHAIN_LINK_FIELDS as d, type CatalogueEntry as e, type ChainLinkField as f, type ChainTarget as g, type ChainVerdict as h, type CompiledSchemas as i, type ContextChainPort as j, type ContractCheck as k, type ContractCheckResult as l, type ContractRunResult as m, ContractViolation as n, type CreateElementInput as o, type DerivableType as p, type DerivationAssessment as q, type DerivationConflict as r, type DerivationDiagnostic as s, type DerivationEnvelope as t, type DerivationFailure as u, type DerivationFailureClass as v, type DerivationFollowUp as w, type DerivationImage as x, type DerivationInputMode as y, type DerivationPolicyPayload as z };
@@ -1,4 +1,4 @@
1
- import { J as ElementStoreContractHarness } from './storeContract-5vApx6VA.mjs';
1
+ import { O as ElementStoreContractHarness } from './storeContract-CJi0fpCA.mjs';
2
2
  import './contracts-DdYOMBl9.mjs';
3
3
 
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { J as ElementStoreContractHarness } from './storeContract-DNggXiZl.js';
1
+ import { O as ElementStoreContractHarness } from './storeContract-gc2dxews.js';
2
2
  import './contracts-DdYOMBl9.js';
3
3
 
4
4
  /**