@rslsp1/fa-app-tools 8.0.0 → 9.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.
package/dist/szenen.js CHANGED
@@ -40,6 +40,7 @@ __export(szenen_exports, {
40
40
  DERIVABLE_TYPES: () => DERIVABLE_TYPES,
41
41
  ELEMENT_VERSION_SCHEMA_FILE: () => ELEMENT_VERSION_SCHEMA_FILE,
42
42
  FLOW_EXECUTION_PATH: () => FLOW_EXECUTION_PATH,
43
+ GENERAL_POLICY_SUBTYPE: () => GENERAL_POLICY_SUBTYPE,
43
44
  MCP_CLIENT_PROVIDER: () => MCP_CLIENT_PROVIDER,
44
45
  PROBE_VERSION_ID: () => PROBE_VERSION_ID,
45
46
  PROMPT_RULE_EFFECT: () => PROMPT_RULE_EFFECT,
@@ -205,6 +206,7 @@ __export(szenen_exports, {
205
206
  recoveryStatusOf: () => recoveryStatusOf,
206
207
  reduceElementEvents: () => reduceElementEvents,
207
208
  resolveArea: () => resolveArea,
209
+ resolveGeneralScenePolicies: () => resolveGeneralScenePolicies,
208
210
  resolvePreferredHead: () => resolvePreferredHead,
209
211
  resolveScenePayload: () => resolveScenePayload,
210
212
  resolveShot: () => resolveShot,
@@ -222,6 +224,7 @@ __export(szenen_exports, {
222
224
  runStoreDifferential: () => runStoreDifferential,
223
225
  sameResponseAs: () => sameResponseAs,
224
226
  sceneOnlyCapabilities: () => sceneOnlyCapabilities,
227
+ scenePolicyFingerprint: () => scenePolicyFingerprint,
225
228
  scopeOfPath: () => scopeOfPath,
226
229
  seedFehlerText: () => seedFehlerText,
227
230
  selectPromptRuns: () => selectPromptRuns,
@@ -229,6 +232,7 @@ __export(szenen_exports, {
229
232
  showChain: () => showChain,
230
233
  siblingsOf: () => siblingsOf,
231
234
  simulatedAnswerFor: () => simulatedAnswerFor,
235
+ sortScenePolicies: () => sortScenePolicies,
232
236
  sourceOf: () => sourceOf,
233
237
  szenenSnapshotFilename: () => szenenSnapshotFilename,
234
238
  totalModelCalls: () => totalModelCalls,
@@ -4930,7 +4934,8 @@ async function resolveScenePayload(input) {
4930
4934
  sceneVersionId = "",
4931
4935
  resolver,
4932
4936
  contextChain,
4933
- userInstruction
4937
+ userInstruction,
4938
+ autoPolicies
4934
4939
  } = input;
4935
4940
  if (!isObject7(scenePayload)) {
4936
4941
  return {
@@ -4965,6 +4970,7 @@ async function resolveScenePayload(input) {
4965
4970
  resolver,
4966
4971
  contextChain,
4967
4972
  userInstruction,
4973
+ autoPolicies,
4968
4974
  assumptions,
4969
4975
  diagnostics
4970
4976
  });
@@ -4980,6 +4986,7 @@ async function komponiere(z) {
4980
4986
  resolver,
4981
4987
  contextChain,
4982
4988
  userInstruction,
4989
+ autoPolicies,
4983
4990
  assumptions,
4984
4991
  diagnostics
4985
4992
  } = z;
@@ -5142,6 +5149,11 @@ async function komponiere(z) {
5142
5149
  }
5143
5150
  const payload = resolved.version.payload;
5144
5151
  policies.push({
5152
+ // Die Herkunft steht in der aufgeloesten Version, nicht in der Referenz:
5153
+ // `element_id` gehoert zur Version und wird hier nicht aus dem `ref`
5154
+ // uebernommen, der nur eine `version_id` fuehrt.
5155
+ element_id: resolved.version.element_id,
5156
+ version_id: resolved.version.version_id,
5145
5157
  subtype: str(payload.subtype) ?? "general",
5146
5158
  rank: num(payload.rank) ?? 0,
5147
5159
  text: str(payload.text) ?? "",
@@ -5149,6 +5161,16 @@ async function komponiere(z) {
5149
5161
  });
5150
5162
  }
5151
5163
  policies.sort((a, b) => a.rank - b.rank);
5164
+ for (const auto of autoPolicies ?? []) {
5165
+ policies.push({
5166
+ element_id: auto.element_id,
5167
+ version_id: auto.version_id,
5168
+ subtype: auto.subtype,
5169
+ rank: auto.rank,
5170
+ text: auto.text,
5171
+ locale: auto.locale
5172
+ });
5173
+ }
5152
5174
  const fragments = [];
5153
5175
  for (const [i, ref] of asArray3(settings.fragment_refs).entries()) {
5154
5176
  const resolved = await refOf(
@@ -5352,6 +5374,10 @@ async function komponiere(z) {
5352
5374
  assumptions,
5353
5375
  diagnostics,
5354
5376
  capabilities: eingefroreneFaehigkeiten,
5377
+ // Die eine kanonische Stelle: die Anweisung des Aufrufers, sonst die im
5378
+ // Shot hinterlegte. Beim Szene-Direktlauf gibt es nur die erste — und
5379
+ // genau sie fehlte dem Renderer bisher (Schritt 03 §7).
5380
+ user_instruction: userInstruction ?? shotInstruction,
5355
5381
  context_chain: [...contextChain],
5356
5382
  target_model_resolution: targetModelResolution
5357
5383
  }
@@ -5550,6 +5576,24 @@ function buildSystemInstruction(input) {
5550
5576
  'Widersprechen sie einander, nenne den Widerspruch mit beiden Quellen in "notes" \u2014',
5551
5577
  "waehle nicht still eine Seite."
5552
5578
  );
5579
+ if (input.policies.length > 0) {
5580
+ zeilen.push(
5581
+ "",
5582
+ 'In "policies" stehen verbindliche Transformationsregeln fuer die Formulierung.',
5583
+ "Setze sie um, ohne ihren Wortlaut in den Prompt zu uebernehmen; sie sind",
5584
+ "Anweisung an dich, nicht Prompttext. Bei gleichem Rang gilt die Reihenfolge",
5585
+ "der Liste."
5586
+ );
5587
+ }
5588
+ if (input.user_instruction !== null && input.user_instruction !== void 0) {
5589
+ zeilen.push(
5590
+ "",
5591
+ '"user_instruction" ist eine ZUSAETZLICHE Arbeitsanweisung fuer genau diesen Lauf.',
5592
+ "Sie tritt zu den Policies hinzu und hebt keine davon auf. Widerspricht sie einer",
5593
+ 'Policy erkennbar, nenne den Widerspruch mit beiden Quellen in "feedback" bzw.',
5594
+ '"notes" \u2014 waehle nicht still eine Seite.'
5595
+ );
5596
+ }
5553
5597
  if (input.camera === null) {
5554
5598
  zeilen.push(
5555
5599
  "",
@@ -7435,6 +7479,110 @@ async function selectableTargetModels(queries, contextChain) {
7435
7479
  return { kind: "ok", value: { selectable, unselectable } };
7436
7480
  }
7437
7481
 
7482
+ // src/lib/szenen/scenePolicies.ts
7483
+ var GENERAL_POLICY_SUBTYPE = "general";
7484
+ var isObject11 = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
7485
+ var str2 = (v) => typeof v === "string" && v.trim().length > 0 ? v : null;
7486
+ var num2 = (v) => typeof v === "number" && Number.isFinite(v) ? v : null;
7487
+ function sortScenePolicies(policies) {
7488
+ return [...policies].sort((a, b) => a.rank - b.rank || a.chain_index - b.chain_index || (a.element_id < b.element_id ? -1 : a.element_id > b.element_id ? 1 : 0));
7489
+ }
7490
+ function scenePolicyFingerprint(policies) {
7491
+ return policies.map((p) => `${p.element_id}@${p.version_id}`).join(",");
7492
+ }
7493
+ function resolveGeneralScenePolicies(snapshot, contextChain) {
7494
+ if (typeof snapshot.listElements !== "function") {
7495
+ return {
7496
+ kind: "error",
7497
+ message: "Die Momentaufnahme liefert keine Elementliste. Allgemeine Kontext-Policies eines Szene-Direktlaufs lassen sich damit nicht bestimmen; eine leere Policy-Liste waere eine Behauptung ueber den Bestand, die niemand geprueft hat.",
7498
+ retryable: false
7499
+ };
7500
+ }
7501
+ const kette = contextChain.length > 0 ? contextChain : [null];
7502
+ const gesehen = /* @__PURE__ */ new Set();
7503
+ const gefunden = [];
7504
+ for (const [chainIndex, link] of kette.entries()) {
7505
+ const liste = snapshot.listElements({ contextId: link, type: "prompt_policy" });
7506
+ if (liste.kind !== "ok" || !liste.value) {
7507
+ return {
7508
+ kind: "error",
7509
+ message: liste.message ?? `Die prompt_policy-Elemente des Kontexts ${link ?? "global"} konnten nicht gelesen werden.`,
7510
+ retryable: true
7511
+ };
7512
+ }
7513
+ for (const element of liste.value) {
7514
+ if (gesehen.has(element.element_id)) continue;
7515
+ gesehen.add(element.element_id);
7516
+ const gelesen = snapshot.getElement(element.element_id);
7517
+ if (gelesen.kind !== "ok") {
7518
+ return {
7519
+ kind: "error",
7520
+ message: gelesen.message ?? `Element ${element.element_id} konnte nicht gelesen werden.`,
7521
+ retryable: true
7522
+ };
7523
+ }
7524
+ const stand = gelesen.value;
7525
+ if (!stand) {
7526
+ return {
7527
+ kind: "error",
7528
+ message: `Element ${element.element_id} steht in der Elementliste des Kontexts ${link ?? "global"}, aber nicht in derselben Momentaufnahme.`,
7529
+ retryable: false
7530
+ };
7531
+ }
7532
+ const versionen = stand.versions ?? [];
7533
+ const payloadVon = (versionId2) => {
7534
+ const payload2 = versionen.find((v) => v.version_id === versionId2)?.payload;
7535
+ return isObject11(payload2) ? payload2 : null;
7536
+ };
7537
+ const istGeneral = (versionId2) => str2(payloadVon(versionId2)?.subtype) === GENERAL_POLICY_SUBTYPE;
7538
+ const kopf = effectivePreferredHeadSafe(
7539
+ { element: stand.element, versions: versionen, preferredHeads: stand.preferredHeads },
7540
+ kette
7541
+ );
7542
+ if (kopf.kind === "dag_fehler") {
7543
+ return {
7544
+ kind: "error",
7545
+ message: `Der Versionsgraph der Policy ${element.element_id} ist nicht aufbaubar: ${kopf.message}`,
7546
+ retryable: false
7547
+ };
7548
+ }
7549
+ if (kopf.kind === "keine_version") continue;
7550
+ const resolution = kopf.outcome.resolution;
7551
+ if (resolution.kind === "fork") {
7552
+ const relevant = resolution.heads.filter(istGeneral);
7553
+ if (relevant.length === 0) continue;
7554
+ return {
7555
+ kind: "rejected",
7556
+ message: `Die Policy ${element.element_id} hat ${resolution.heads.length} veroeffentlichte Koepfe und in diesem Kontext keine greifende Auswahl. Mindestens einer davon ist eine allgemeine Regel (${relevant.join(", ")}). Welche gilt, entscheidet keine Reihenfolge (D-36) \u2014 bitte einen bevorzugten Kopf setzen. Es wurde kein Modell gerufen.`,
7557
+ element_id: element.element_id,
7558
+ heads: resolution.heads
7559
+ };
7560
+ }
7561
+ const versionId = usableHeadVersionId(resolutionOf(kopf));
7562
+ if (!versionId) continue;
7563
+ const payload = payloadVon(versionId);
7564
+ if (!payload) {
7565
+ return {
7566
+ kind: "error",
7567
+ message: `Die wirksame Version ${versionId} der Policy ${element.element_id} steht nicht mit lesbarer Payload in der Momentaufnahme.`,
7568
+ retryable: false
7569
+ };
7570
+ }
7571
+ if (str2(payload.subtype) !== GENERAL_POLICY_SUBTYPE) continue;
7572
+ gefunden.push({
7573
+ element_id: element.element_id,
7574
+ version_id: versionId,
7575
+ subtype: GENERAL_POLICY_SUBTYPE,
7576
+ rank: num2(payload.rank) ?? 0,
7577
+ text: str2(payload.text) ?? "",
7578
+ locale: str2(payload.locale),
7579
+ chain_index: chainIndex
7580
+ });
7581
+ }
7582
+ }
7583
+ return { kind: "ok", policies: sortScenePolicies(gefunden) };
7584
+ }
7585
+
7438
7586
  // src/lib/szenen/freezeDraftChain.ts
7439
7587
  function ladeKnoten(sicht, elementId, erwarteterTyp) {
7440
7588
  const gelesen = sicht.getElement(elementId);
@@ -7636,9 +7784,19 @@ async function freezeSceneWorkingState(input) {
7636
7784
  const a = await store.readSnapshot({ fresh: false });
7637
7785
  const szene = ladeSzene(a, sceneElementId, contextChain);
7638
7786
  if ("fehler" in szene) return ausfallErgebnis(szene);
7787
+ const policiesA = resolveGeneralScenePolicies(a, contextChain);
7788
+ if (policiesA.kind === "error") {
7789
+ return { kind: "error", message: policiesA.message, retryable: policiesA.retryable };
7790
+ }
7791
+ if (policiesA.kind !== "ok") return { kind: "rejected", message: policiesA.message };
7639
7792
  const b = await store.readSnapshot({ fresh: true });
7640
7793
  const erneut = ladeSzene(b, sceneElementId, contextChain);
7641
7794
  if ("fehler" in erneut) return ausfallErgebnis(erneut);
7795
+ const policiesB = resolveGeneralScenePolicies(b, contextChain);
7796
+ if (policiesB.kind === "error") {
7797
+ return { kind: "error", message: policiesB.message, retryable: policiesB.retryable };
7798
+ }
7799
+ if (policiesB.kind !== "ok") return { kind: "rejected", message: policiesB.message };
7642
7800
  if (erneut.draft_id !== szene.draft_id || erneut.revision !== szene.revision || erneut.version_id !== szene.version_id) {
7643
7801
  return {
7644
7802
  kind: "conflict",
@@ -7648,6 +7806,17 @@ async function freezeSceneWorkingState(input) {
7648
7806
  actualRevision: erneut.revision ?? 0
7649
7807
  };
7650
7808
  }
7809
+ const vorher = scenePolicyFingerprint(policiesA.policies);
7810
+ const nachher = scenePolicyFingerprint(policiesB.policies);
7811
+ if (vorher !== nachher) {
7812
+ return {
7813
+ kind: "conflict",
7814
+ message: `Die wirksamen allgemeinen Policies der Szene ${sceneElementId} haben sich waehrend des Einfrierens geaendert (erwartet [${vorher || "\u2014"}], vorhanden [${nachher || "\u2014"}]). Es wurde kein Modell gerufen.`,
7815
+ node: { type: "scene", element_id: sceneElementId, draft_id: szene.draft_id ?? "" },
7816
+ expectedRevision: szene.revision ?? 0,
7817
+ actualRevision: erneut.revision ?? 0
7818
+ };
7819
+ }
7651
7820
  const aufgeloest = await resolveScenePayload({
7652
7821
  scenePayload: szene.payload,
7653
7822
  sceneElementId: szene.element_id,
@@ -7656,7 +7825,10 @@ async function freezeSceneWorkingState(input) {
7656
7825
  sceneVersionId: szene.version_id ?? "",
7657
7826
  resolver,
7658
7827
  contextChain,
7659
- userInstruction
7828
+ userInstruction,
7829
+ // Der aus A gebildete und gegen B bestaetigte Satz — kein dritter
7830
+ // Leseweg nach dem Freeze.
7831
+ autoPolicies: policiesA.policies
7660
7832
  });
7661
7833
  if (aufgeloest.kind !== "resolved") {
7662
7834
  return {
@@ -7673,7 +7845,8 @@ async function freezeSceneWorkingState(input) {
7673
7845
  revision: szene.revision,
7674
7846
  version_id: szene.version_id
7675
7847
  },
7676
- input: aufgeloest.input
7848
+ input: aufgeloest.input,
7849
+ policies: policiesA.policies
7677
7850
  };
7678
7851
  }
7679
7852
 
@@ -8084,6 +8257,15 @@ function createHfElementStore(options) {
8084
8257
  return {
8085
8258
  getElement(elementId) {
8086
8259
  return { kind: "ok", value: state.elements.get(elementId) ?? null };
8260
+ },
8261
+ // Aus **derselben** gefalteten Sicht wie `getElement` und ohne
8262
+ // weiteren Netzzugriff: Nur so faellt die Policy-Auswahl des
8263
+ // Szene-Direktlaufs in dieselbe Konsistenzgrenze wie das Einfrieren
8264
+ // der Szene (Schritt 03 §3). Stillgelegte Elemente sind nicht dabei —
8265
+ // Stilllegen ist Ausblenden (D-04), wie bei `listElements`.
8266
+ listElements(filter) {
8267
+ const gefunden = [...state.elements.values()].map((snapshot) => snapshot.element).filter((element) => !element.retired && element.type === filter.type && (element.context_id ?? null) === (filter.contextId ?? null));
8268
+ return { kind: "ok", value: gefunden };
8087
8269
  }
8088
8270
  };
8089
8271
  } catch (error) {
@@ -8091,6 +8273,9 @@ function createHfElementStore(options) {
8091
8273
  return {
8092
8274
  getElement() {
8093
8275
  return { kind: "error", message };
8276
+ },
8277
+ listElements() {
8278
+ return { kind: "error", message };
8094
8279
  }
8095
8280
  };
8096
8281
  }
@@ -10916,11 +11101,11 @@ function findImageBatch(events, batchId) {
10916
11101
  }
10917
11102
 
10918
11103
  // src/lib/szenen/imageGenerationCapability.ts
10919
- var isObject11 = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
11104
+ var isObject12 = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
10920
11105
  var istText6 = (v) => typeof v === "string" && v.trim().length > 0;
10921
11106
  function checkImageExecutionProfile(profile) {
10922
11107
  const befunde = [];
10923
- if (!isObject11(profile)) return ["Das Ausfuehrungsprofil ist kein Objekt."];
11108
+ if (!isObject12(profile)) return ["Das Ausfuehrungsprofil ist kein Objekt."];
10924
11109
  for (const feld of ["profile_id", "execution_path", "execution_model_id"]) {
10925
11110
  if (!istText6(profile[feld])) befunde.push(`"${feld}" fehlt als nicht-leerer Text.`);
10926
11111
  }
@@ -10943,12 +11128,12 @@ function checkImageExecutionProfile(profile) {
10943
11128
  function checkImageExecutionProfiles(profiles) {
10944
11129
  const anzahlJeKennung = /* @__PURE__ */ new Map();
10945
11130
  for (const profil of profiles ?? []) {
10946
- if (!isObject11(profil) || !istText6(profil.profile_id)) continue;
11131
+ if (!isObject12(profil) || !istText6(profil.profile_id)) continue;
10947
11132
  anzahlJeKennung.set(profil.profile_id, (anzahlJeKennung.get(profil.profile_id) ?? 0) + 1);
10948
11133
  }
10949
11134
  return (profiles ?? []).map((profil) => {
10950
11135
  const befunde = [...checkImageExecutionProfile(profil)];
10951
- if (isObject11(profil) && istText6(profil.profile_id) && (anzahlJeKennung.get(profil.profile_id) ?? 0) > 1) {
11136
+ if (isObject12(profil) && istText6(profil.profile_id) && (anzahlJeKennung.get(profil.profile_id) ?? 0) > 1) {
10952
11137
  befunde.push(
10953
11138
  `Die profile_id "${profil.profile_id}" kommt in diesem Zielmodell mehrfach vor \u2014 die Auswahl waere nicht mehr eindeutig aufloesbar.`
10954
11139
  );
@@ -10973,7 +11158,7 @@ function executableImageModels(promptTargetModelKey, targets, capability) {
10973
11158
  for (const [index, roh] of (target.executionProfiles ?? []).entries()) {
10974
11159
  const befunde = profilBefunde[index] ?? [];
10975
11160
  if (befunde.length > 0) {
10976
- const kennung = isObject11(roh) && istText6(roh.profile_id) ? roh.profile_id : "(ohne profile_id)";
11161
+ const kennung = isObject12(roh) && istText6(roh.profile_id) ? roh.profile_id : "(ohne profile_id)";
10977
11162
  invalid.push(`${target.key}/${kennung}: ${befunde.join(" ")}`);
10978
11163
  continue;
10979
11164
  }
@@ -13676,13 +13861,13 @@ var VERBOTEN_JE_HERKUNFT = {
13676
13861
  function istText8(wert) {
13677
13862
  return typeof wert === "string" && wert.trim().length > 0;
13678
13863
  }
13679
- function isObject12(wert) {
13864
+ function isObject13(wert) {
13680
13865
  return typeof wert === "object" && wert !== null && !Array.isArray(wert);
13681
13866
  }
13682
13867
  var KETTEN_TYPEN = ["scene", "scene_setup", "shot"];
13683
13868
  var HERKUENFTE = ["published", "draft_chain", "scene_direct"];
13684
13869
  function pruefeLaufherkunft(quelle) {
13685
- if (!isObject12(quelle)) {
13870
+ if (!isObject13(quelle)) {
13686
13871
  return { ok: false, message: '"source" muss ein Objekt sein.' };
13687
13872
  }
13688
13873
  if (!HERKUENFTE.includes(quelle.kind)) {
@@ -13701,7 +13886,7 @@ function pruefeLaufherkunft(quelle) {
13701
13886
  }
13702
13887
  if (quelle.kind === "scene_direct") {
13703
13888
  const szene = quelle.scene;
13704
- if (!isObject12(szene)) {
13889
+ if (!isObject13(szene)) {
13705
13890
  return { ok: false, message: '"source.scene" muss ein Objekt sein.' };
13706
13891
  }
13707
13892
  if (!istText8(szene.element_id)) {
@@ -13739,7 +13924,7 @@ function pruefeLaufherkunft(quelle) {
13739
13924
  };
13740
13925
  }
13741
13926
  for (const [index, knoten] of quelle.nodes.entries()) {
13742
- if (!isObject12(knoten)) {
13927
+ if (!isObject13(knoten)) {
13743
13928
  return { ok: false, message: `"source.nodes[${index}]" ist kein Objekt.` };
13744
13929
  }
13745
13930
  if (!KETTEN_TYPEN.includes(knoten.type)) {
@@ -13782,7 +13967,7 @@ function checkPromptRunRecord(candidate) {
13782
13967
  const urteil2 = pruefeLaufherkunft(quelle);
13783
13968
  if (!urteil2.ok) return urteil2;
13784
13969
  }
13785
- const herkunft = isObject12(quelle) && typeof quelle.kind === "string" ? quelle.kind : "published";
13970
+ const herkunft = isObject13(quelle) && typeof quelle.kind === "string" ? quelle.kind : "published";
13786
13971
  for (const feld of PFLICHTFELDER) {
13787
13972
  if (!istText8(record[feld])) {
13788
13973
  return { ok: false, message: `"${feld}" fehlt oder ist leer.` };
@@ -14929,8 +15114,8 @@ function feldLabel(type, pfad, name) {
14929
15114
 
14930
15115
  // src/features/szenen/areas/SchemaFields.tsx
14931
15116
  var import_jsx_runtime = require("react/jsx-runtime");
14932
- var isObject13 = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
14933
- var istVersionRef = (v) => isObject13(v) && typeof v.element_id === "string" && typeof v.version_id === "string";
15117
+ var isObject14 = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
15118
+ var istVersionRef = (v) => isObject14(v) && typeof v.element_id === "string" && typeof v.version_id === "string";
14934
15119
  function leseJson(wert) {
14935
15120
  if (!wert || wert === NULL_MARKER) return null;
14936
15121
  try {
@@ -15158,13 +15343,13 @@ var VersionRefListeFeld = ({ port, kontextkette, feld, wert, onChange, readOnly,
15158
15343
  }
15159
15344
  const schreiben = (neu) => onChange(
15160
15345
  feld.path,
15161
- schreibListe(neu.map((eintrag, i) => isObject13(eintrag) && mitRolle ? { ...eintrag, rank: i } : eintrag))
15346
+ schreibListe(neu.map((eintrag, i) => isObject14(eintrag) && mitRolle ? { ...eintrag, rank: i } : eintrag))
15162
15347
  );
15163
15348
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "szenen-feld__reflist", "data-testid": `reflist-${feld.path}`, children: [
15164
15349
  liste.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { "data-testid": `reflist-${feld.path}-leer`, children: "Keine Eintr\xE4ge." }),
15165
15350
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ol", { children: liste.map((eintrag, index) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("li", { "data-testid": `reflist-${feld.path}-${index}`, children: [
15166
15351
  istVersionRef(eintrag) ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(RefAnzeige, { port, ref_: eintrag, testId: `reflist-${feld.path}-${index}-ref` }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", { children: JSON.stringify(eintrag) }),
15167
- mitRolle === "styleRole" && isObject13(eintrag) && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
15352
+ mitRolle === "styleRole" && isObject14(eintrag) && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
15168
15353
  "select",
15169
15354
  {
15170
15355
  "data-testid": `reflist-${feld.path}-${index}-role`,
@@ -15177,7 +15362,7 @@ var VersionRefListeFeld = ({ port, kontextkette, feld, wert, onChange, readOnly,
15177
15362
  ]
15178
15363
  }
15179
15364
  ),
15180
- mitRolle === "frei" && isObject13(eintrag) && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
15365
+ mitRolle === "frei" && isObject14(eintrag) && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
15181
15366
  "input",
15182
15367
  {
15183
15368
  "data-testid": `reflist-${feld.path}-${index}-role`,
@@ -15187,7 +15372,7 @@ var VersionRefListeFeld = ({ port, kontextkette, feld, wert, onChange, readOnly,
15187
15372
  onChange: (e) => schreiben(liste.map((x, i) => i === index ? { ...x, role: e.target.value } : x))
15188
15373
  }
15189
15374
  ),
15190
- mitGewicht && isObject13(eintrag) && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
15375
+ mitGewicht && isObject14(eintrag) && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
15191
15376
  "input",
15192
15377
  {
15193
15378
  "data-testid": `reflist-${feld.path}-${index}-weight`,
@@ -15418,7 +15603,7 @@ var KameraFeld = ({
15418
15603
  if (phase.status !== "ready" || !phase.value) return [];
15419
15604
  const cameras = valueAtPath(phase.value.payload, "camera_rig.cameras");
15420
15605
  if (!Array.isArray(cameras)) return [];
15421
- return cameras.filter(isObject13).map((c) => ({
15606
+ return cameras.filter(isObject14).map((c) => ({
15422
15607
  id: typeof c.camera_id === "string" ? c.camera_id : null,
15423
15608
  name: typeof c.name === "string" ? c.name : null
15424
15609
  })).filter((c) => c.id !== null);
@@ -15563,11 +15748,11 @@ var MediaRefListeFeld = ({ feld, wert, onChange, readOnly }) => {
15563
15748
  }
15564
15749
  const schreiben = (neu) => onChange(
15565
15750
  feld.path,
15566
- schreibListe(neu.map((e, i) => isObject13(e) ? { ...e, position: i } : e))
15751
+ schreibListe(neu.map((e, i) => isObject14(e) ? { ...e, position: i } : e))
15567
15752
  );
15568
15753
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "szenen-feld__liste", "data-testid": `feld-${feld.path}`, children: [
15569
15754
  liste.map((eintrag, index) => {
15570
- const objekt = isObject13(eintrag) ? eintrag : {};
15755
+ const objekt = isObject14(eintrag) ? eintrag : {};
15571
15756
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "szenen-feld__liste-zeile", children: [
15572
15757
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
15573
15758
  "input",
@@ -15576,7 +15761,7 @@ var MediaRefListeFeld = ({ feld, wert, onChange, readOnly }) => {
15576
15761
  value: typeof objekt.asset_id === "string" ? objekt.asset_id : "",
15577
15762
  readOnly,
15578
15763
  placeholder: "asset_id (UUID)",
15579
- onChange: (e) => schreiben(liste.map((x, i) => i === index ? { ...isObject13(x) ? x : {}, asset_id: e.target.value } : x))
15764
+ onChange: (e) => schreiben(liste.map((x, i) => i === index ? { ...isObject14(x) ? x : {}, asset_id: e.target.value } : x))
15580
15765
  }
15581
15766
  ),
15582
15767
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
@@ -15585,7 +15770,7 @@ var MediaRefListeFeld = ({ feld, wert, onChange, readOnly }) => {
15585
15770
  "data-testid": `feld-${feld.path}-${index}-rolle`,
15586
15771
  value: typeof objekt.role === "string" ? objekt.role : "",
15587
15772
  disabled: readOnly,
15588
- onChange: (e) => schreiben(liste.map((x, i) => i === index ? { ...isObject13(x) ? x : {}, role: e.target.value } : x)),
15773
+ onChange: (e) => schreiben(liste.map((x, i) => i === index ? { ...isObject14(x) ? x : {}, role: e.target.value } : x)),
15589
15774
  children: [
15590
15775
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: "", children: "(Rolle w\xE4hlen)" }),
15591
15776
  rollen.map((r) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("option", { value: r, children: r }, r))
@@ -15628,7 +15813,7 @@ var LEERES_PROFIL = {
15628
15813
  var listeAus = (text) => text.split(",").map((t) => t.trim()).filter((t) => t.length > 0);
15629
15814
  var AusfuehrungsprofileFeld = ({ feld, wert, onChange, readOnly }) => {
15630
15815
  const gelesen = leseListe(wert);
15631
- const profile = (gelesen ?? []).filter(isObject13);
15816
+ const profile = (gelesen ?? []).filter(isObject14);
15632
15817
  const unlesbar = gelesen === null;
15633
15818
  const schreibe = (neu) => onChange(feld.path, schreibListe(neu));
15634
15819
  const alleBefunde = checkImageExecutionProfiles(profile);
@@ -20514,6 +20699,7 @@ var SzenenView = ({
20514
20699
  DERIVABLE_TYPES,
20515
20700
  ELEMENT_VERSION_SCHEMA_FILE,
20516
20701
  FLOW_EXECUTION_PATH,
20702
+ GENERAL_POLICY_SUBTYPE,
20517
20703
  MCP_CLIENT_PROVIDER,
20518
20704
  PROBE_VERSION_ID,
20519
20705
  PROMPT_RULE_EFFECT,
@@ -20679,6 +20865,7 @@ var SzenenView = ({
20679
20865
  recoveryStatusOf,
20680
20866
  reduceElementEvents,
20681
20867
  resolveArea,
20868
+ resolveGeneralScenePolicies,
20682
20869
  resolvePreferredHead,
20683
20870
  resolveScenePayload,
20684
20871
  resolveShot,
@@ -20696,6 +20883,7 @@ var SzenenView = ({
20696
20883
  runStoreDifferential,
20697
20884
  sameResponseAs,
20698
20885
  sceneOnlyCapabilities,
20886
+ scenePolicyFingerprint,
20699
20887
  scopeOfPath,
20700
20888
  seedFehlerText,
20701
20889
  selectPromptRuns,
@@ -20703,6 +20891,7 @@ var SzenenView = ({
20703
20891
  showChain,
20704
20892
  siblingsOf,
20705
20893
  simulatedAnswerFor,
20894
+ sortScenePolicies,
20706
20895
  sourceOf,
20707
20896
  szenenSnapshotFilename,
20708
20897
  totalModelCalls,
package/dist/szenen.mjs CHANGED
@@ -8,6 +8,7 @@ import {
8
8
  DERIVABLE_TYPES,
9
9
  ELEMENT_VERSION_SCHEMA_FILE,
10
10
  FLOW_EXECUTION_PATH,
11
+ GENERAL_POLICY_SUBTYPE,
11
12
  MAX_PROPOSAL_TITLE_LENGTH,
12
13
  PROBE_VERSION_ID,
13
14
  PROMPT_RULE_EFFECT,
@@ -154,6 +155,7 @@ import {
154
155
  recoveryStatusOf,
155
156
  reduceElementEvents,
156
157
  resolveArea,
158
+ resolveGeneralScenePolicies,
157
159
  resolveScenePayload,
158
160
  resolveShot,
159
161
  resolveShotPayload,
@@ -165,6 +167,7 @@ import {
165
167
  runPublishChecks,
166
168
  runSceneDerivation,
167
169
  sceneOnlyCapabilities,
170
+ scenePolicyFingerprint,
168
171
  scopeOfPath,
169
172
  seedFehlerText,
170
173
  selectPromptRuns,
@@ -172,6 +175,7 @@ import {
172
175
  showChain,
173
176
  siblingsOf,
174
177
  simulatedAnswerFor,
178
+ sortScenePolicies,
175
179
  sourceOf,
176
180
  szenenSnapshotFilename,
177
181
  typAusBytes,
@@ -182,7 +186,7 @@ import {
182
186
  validateElementVersion,
183
187
  validatePayload,
184
188
  withReference
185
- } from "./chunk-VVGASAYT.mjs";
189
+ } from "./chunk-2ADFDRFX.mjs";
186
190
  import {
187
191
  ContractViolation,
188
192
  STYLE_PAYLOAD,
@@ -1797,6 +1801,7 @@ export {
1797
1801
  DERIVABLE_TYPES,
1798
1802
  ELEMENT_VERSION_SCHEMA_FILE,
1799
1803
  FLOW_EXECUTION_PATH,
1804
+ GENERAL_POLICY_SUBTYPE,
1800
1805
  MCP_CLIENT_PROVIDER,
1801
1806
  PROBE_VERSION_ID,
1802
1807
  PROMPT_RULE_EFFECT,
@@ -1962,6 +1967,7 @@ export {
1962
1967
  recoveryStatusOf,
1963
1968
  reduceElementEvents,
1964
1969
  resolveArea,
1970
+ resolveGeneralScenePolicies,
1965
1971
  resolvePreferredHead,
1966
1972
  resolveScenePayload,
1967
1973
  resolveShot,
@@ -1979,6 +1985,7 @@ export {
1979
1985
  runStoreDifferential,
1980
1986
  sameResponseAs,
1981
1987
  sceneOnlyCapabilities,
1988
+ scenePolicyFingerprint,
1982
1989
  scopeOfPath,
1983
1990
  seedFehlerText,
1984
1991
  selectPromptRuns,
@@ -1986,6 +1993,7 @@ export {
1986
1993
  showChain,
1987
1994
  siblingsOf,
1988
1995
  simulatedAnswerFor,
1996
+ sortScenePolicies,
1989
1997
  sourceOf,
1990
1998
  szenenSnapshotFilename,
1991
1999
  totalModelCalls,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rslsp1/fa-app-tools",
3
- "version": "8.0.0",
3
+ "version": "9.0.0",
4
4
  "description": "Shared tools and hooks for Fine Art flow apps",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",