@rslsp1/fa-app-tools 3.0.0 → 4.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.mjs CHANGED
@@ -9,6 +9,7 @@ import {
9
9
  FLOW_EXECUTION_PATH,
10
10
  MAX_PROPOSAL_TITLE_LENGTH,
11
11
  PROBE_VERSION_ID,
12
+ PROMPT_RULE_EFFECT,
12
13
  REFERENCE_FIELD,
13
14
  RULES_WITHOUT_CAPABILITY_EFFECT,
14
15
  RULE_SCOPES,
@@ -42,6 +43,7 @@ import {
42
43
  checkDraftChainMeta,
43
44
  checkElementType,
44
45
  checkImageExecutionProfile,
46
+ checkImageExecutionProfiles,
45
47
  checkImageModelParameters,
46
48
  checkOptionalId,
47
49
  checkParents,
@@ -83,7 +85,10 @@ import {
83
85
  derivationPoliciesOf,
84
86
  deriveItemFromRun,
85
87
  deriveLineage,
88
+ describableContent,
86
89
  describeTargetModelFailure,
90
+ diagnosticOfFinding,
91
+ diagnosticOfSchemaError,
87
92
  draftRevisionOf,
88
93
  executableImageModels,
89
94
  findExecutableImageModel,
@@ -95,6 +100,7 @@ import {
95
100
  firstError,
96
101
  formatSchemaErrors,
97
102
  freezeDraftChain,
103
+ freezeSceneWorkingState,
98
104
  getSzenenSchemas,
99
105
  hasPlacementCapability,
100
106
  isKnownElementType,
@@ -110,19 +116,23 @@ import {
110
116
  parseDerivationResponse,
111
117
  parseRunResponse,
112
118
  preferredHeadRevisionOf,
119
+ promptDiagnosticsOf,
113
120
  publishedHeadsOf,
114
121
  recoveriesForRun,
115
122
  recoveryStatusOf,
116
123
  reduceElementEvents,
117
124
  resolveArea,
125
+ resolveScenePayload,
118
126
  resolveShot,
119
127
  resolveShotPayload,
120
128
  resolveTargetModelOver,
121
129
  resolverFromQueries,
122
130
  roundOfRun,
131
+ rulesWithoutPromptEffect,
123
132
  runPromptDerivation,
124
133
  runPublishChecks,
125
134
  runSceneDerivation,
135
+ sceneOnlyCapabilities,
126
136
  scopeOfPath,
127
137
  selectableTargetModels,
128
138
  showChain,
@@ -135,7 +145,7 @@ import {
135
145
  validateElementVersion,
136
146
  validatePayload,
137
147
  withReference
138
- } from "./chunk-TCJ3CMCK.mjs";
148
+ } from "./chunk-566GHYAT.mjs";
139
149
  import {
140
150
  ContractViolation,
141
151
  STYLE_PAYLOAD,
@@ -392,7 +402,7 @@ async function runStoreDifferential(left, right) {
392
402
  // src/lib/szenen/memoryViewPort.ts
393
403
  var MEMORY_IMAGE_CAPABILITY = {
394
404
  environment_id: "memory",
395
- execution_paths: ["memory"]
405
+ execution_paths: [{ execution_path: "memory", provider: "google" }]
396
406
  };
397
407
  function ok(value) {
398
408
  return { kind: "ok", value };
@@ -519,6 +529,44 @@ function createMemoryViewPort(options = {}) {
519
529
  return ok(laeufe.filter(
520
530
  (r) => r.source?.kind === "draft_chain" && r.source.chain_id === chainId
521
531
  ));
532
+ },
533
+ // ── Der Lauf direkt aus einer Szene (D-135) ───────────────────────────
534
+ //
535
+ // Wie beim Kettenlauf bildet der Speicherport nur die **Form** ab: ein
536
+ // Lauf mit `source.kind === 'scene_direct'`, ohne Shot und ohne
537
+ // Versionskennungen. Ob ein Arbeitsstand einfrierbar ist, entscheidet
538
+ // `clientRunPort` gegen einen echten Speicher — hier waere es eine zweite
539
+ // Wahrheit.
540
+ async startRunFromScene(input) {
541
+ const runId = ids();
542
+ const basis = (options.deriveRun ?? simulierterLauf)(
543
+ { shotVersionId: "", ...input.userInstruction ? { userInstruction: input.userInstruction } : {} },
544
+ runId
545
+ );
546
+ const lauf = {
547
+ ...basis,
548
+ shot_version_id: "",
549
+ shot_element_id: "",
550
+ scene_setup_version_id: "",
551
+ camera_id: "",
552
+ target_model_version_id: "",
553
+ source: {
554
+ kind: "scene_direct",
555
+ scene: {
556
+ element_id: input.sceneElementId,
557
+ draft_id: `draft-${input.sceneElementId}`,
558
+ revision: 1,
559
+ version_id: null
560
+ }
561
+ }
562
+ };
563
+ laeufe.push(lauf);
564
+ return done(lauf);
565
+ },
566
+ async listRunsForScene(sceneElementId) {
567
+ return ok(laeufe.filter(
568
+ (r) => r.source?.kind === "scene_direct" && r.source.scene.element_id === sceneElementId
569
+ ));
522
570
  }
523
571
  };
524
572
  const itemPort = {
@@ -996,41 +1044,83 @@ var FAILURE_CLASSES = [
996
1044
  ];
997
1045
  var PFLICHTFELDER = [
998
1046
  "run_id",
999
- "shot_version_id",
1000
- "shot_element_id",
1001
- "scene_setup_version_id",
1002
- "camera_id",
1003
- "target_model_version_id",
1004
1047
  "provider",
1005
1048
  "model_id",
1006
1049
  "system_prompt",
1007
1050
  "created_at"
1008
1051
  ];
1052
+ var TEXTFELDER = [
1053
+ "shot_version_id",
1054
+ "shot_element_id",
1055
+ "scene_setup_version_id",
1056
+ "camera_id",
1057
+ "target_model_version_id"
1058
+ ];
1059
+ var PFLICHT_JE_HERKUNFT = {
1060
+ published: ["shot_version_id", "shot_element_id", "scene_setup_version_id"],
1061
+ draft_chain: ["shot_element_id"],
1062
+ scene_direct: []
1063
+ };
1064
+ var VERBOTEN_JE_HERKUNFT = {
1065
+ published: [],
1066
+ draft_chain: ["shot_version_id", "scene_setup_version_id"],
1067
+ scene_direct: ["shot_version_id", "shot_element_id", "scene_setup_version_id", "camera_id"]
1068
+ };
1009
1069
  function istText(wert) {
1010
1070
  return typeof wert === "string" && wert.trim().length > 0;
1011
1071
  }
1012
1072
  function isObject(wert) {
1013
1073
  return typeof wert === "object" && wert !== null && !Array.isArray(wert);
1014
1074
  }
1015
- var VERSIONSFELDER = ["shot_version_id", "scene_setup_version_id"];
1016
1075
  var KETTEN_TYPEN = ["scene", "scene_setup", "shot"];
1076
+ var HERKUENFTE = ["published", "draft_chain", "scene_direct"];
1017
1077
  function pruefeLaufherkunft(quelle) {
1018
1078
  if (!isObject(quelle)) {
1019
1079
  return { ok: false, message: '"source" muss ein Objekt sein.' };
1020
1080
  }
1081
+ if (!HERKUENFTE.includes(quelle.kind)) {
1082
+ return {
1083
+ ok: false,
1084
+ message: `"source.kind" ist unbekannt: ${JSON.stringify(quelle.kind)}. Erlaubt: ${HERKUENFTE.join(", ")}.`
1085
+ };
1086
+ }
1021
1087
  if (quelle.kind === "published") {
1022
- for (const feld of VERSIONSFELDER) {
1088
+ for (const feld of ["shot_version_id", "scene_setup_version_id"]) {
1023
1089
  if (!istText(quelle[feld])) {
1024
1090
  return { ok: false, message: `"source.${feld}" fehlt oder ist leer.` };
1025
1091
  }
1026
1092
  }
1027
1093
  return { ok: true };
1028
1094
  }
1029
- if (quelle.kind !== "draft_chain") {
1030
- return {
1031
- ok: false,
1032
- message: `"source.kind" ist unbekannt: ${JSON.stringify(quelle.kind)}. Erlaubt: published, draft_chain.`
1033
- };
1095
+ if (quelle.kind === "scene_direct") {
1096
+ const szene = quelle.scene;
1097
+ if (!isObject(szene)) {
1098
+ return { ok: false, message: '"source.scene" muss ein Objekt sein.' };
1099
+ }
1100
+ if (!istText(szene.element_id)) {
1101
+ return { ok: false, message: '"source.scene.element_id" fehlt oder ist leer.' };
1102
+ }
1103
+ const ausEntwurf = istText(szene.draft_id);
1104
+ const ausVersion = istText(szene.version_id);
1105
+ if (ausEntwurf === ausVersion) {
1106
+ return {
1107
+ ok: false,
1108
+ message: ausEntwurf ? '"source.scene" nennt draft_id und version_id zugleich. Eingefroren wurde genau ein Stand (D-135).' : '"source.scene" nennt weder draft_id noch version_id. Ohne den eingefrorenen Stand ist der Lauf nicht nachvollziehbar (D-97).'
1109
+ };
1110
+ }
1111
+ if (ausEntwurf && (typeof szene.revision !== "number" || !Number.isInteger(szene.revision))) {
1112
+ return {
1113
+ ok: false,
1114
+ message: '"source.scene.revision" muss eine ganze Zahl sein \u2014 ohne sie ist der eingefrorene Entwurfsstand nicht benennbar (D-97).'
1115
+ };
1116
+ }
1117
+ if (ausVersion && szene.revision !== null && szene.revision !== void 0) {
1118
+ return {
1119
+ ok: false,
1120
+ message: '"source.scene.revision" ist bei einer veroeffentlichten Version gesetzt. Eine Version ist unveraenderlich und hat keine Revision (D-02).'
1121
+ };
1122
+ }
1123
+ return { ok: true };
1034
1124
  }
1035
1125
  if (!istText(quelle.chain_id)) {
1036
1126
  return { ok: false, message: '"source.chain_id" fehlt oder ist leer.' };
@@ -1081,25 +1171,38 @@ function checkPromptRunRecord(candidate) {
1081
1171
  }
1082
1172
  const record = candidate;
1083
1173
  const quelle = record.source;
1084
- const ausKette = isObject(quelle) && quelle.kind === "draft_chain";
1085
1174
  if (quelle !== void 0) {
1086
1175
  const urteil2 = pruefeLaufherkunft(quelle);
1087
1176
  if (!urteil2.ok) return urteil2;
1088
1177
  }
1089
- const pflicht = ausKette ? PFLICHTFELDER.filter((f) => !VERSIONSFELDER.includes(f)) : PFLICHTFELDER;
1090
- for (const feld of pflicht) {
1178
+ const herkunft = isObject(quelle) && typeof quelle.kind === "string" ? quelle.kind : "published";
1179
+ for (const feld of PFLICHTFELDER) {
1091
1180
  if (!istText(record[feld])) {
1092
1181
  return { ok: false, message: `"${feld}" fehlt oder ist leer.` };
1093
1182
  }
1094
1183
  }
1095
- if (ausKette) {
1096
- for (const feld of VERSIONSFELDER) {
1097
- if (istText(record[feld])) {
1098
- return {
1099
- ok: false,
1100
- message: `"${feld}" ist bei einem Lauf aus einer Draft-Kette gesetzt. Dort gibt es keine Versionen, und erfundene sind unzulaessig (D-98).`
1101
- };
1102
- }
1184
+ for (const feld of TEXTFELDER) {
1185
+ if (typeof record[feld] !== "string") {
1186
+ return {
1187
+ ok: false,
1188
+ message: `"${feld}" fehlt. Wo es keinen Wert gibt, gehoert eine leere Zeichenkette hin \u2014 kein fehlendes Feld (D-135).`
1189
+ };
1190
+ }
1191
+ }
1192
+ for (const feld of PFLICHT_JE_HERKUNFT[herkunft] ?? []) {
1193
+ if (!istText(record[feld])) {
1194
+ return {
1195
+ ok: false,
1196
+ message: `"${feld}" fehlt oder ist leer, wird bei Herkunft "${herkunft}" aber gebraucht.`
1197
+ };
1198
+ }
1199
+ }
1200
+ for (const feld of VERBOTEN_JE_HERKUNFT[herkunft] ?? []) {
1201
+ if (istText(record[feld])) {
1202
+ return {
1203
+ ok: false,
1204
+ message: `"${feld}" ist bei einem Lauf der Herkunft "${herkunft}" gesetzt. Dort gibt es diesen Wert nicht, und erfundene sind unzulaessig (D-98/D-135).`
1205
+ };
1103
1206
  }
1104
1207
  }
1105
1208
  if (record.status !== "succeeded" && record.status !== "failed") {
@@ -1475,6 +1578,7 @@ export {
1475
1578
  ELEMENT_VERSION_SCHEMA_FILE,
1476
1579
  FLOW_EXECUTION_PATH,
1477
1580
  PROBE_VERSION_ID,
1581
+ PROMPT_RULE_EFFECT,
1478
1582
  REFERENCE_FIELD,
1479
1583
  RULES_WITHOUT_CAPABILITY_EFFECT,
1480
1584
  RULE_SCOPES,
@@ -1511,6 +1615,7 @@ export {
1511
1615
  checkDraftChainMeta,
1512
1616
  checkElementType,
1513
1617
  checkImageExecutionProfile,
1618
+ checkImageExecutionProfiles,
1514
1619
  checkImageModelParameters,
1515
1620
  checkOptionalId,
1516
1621
  checkParents,
@@ -1559,7 +1664,10 @@ export {
1559
1664
  derivationPoliciesOf,
1560
1665
  deriveItemFromRun,
1561
1666
  deriveLineage,
1667
+ describableContent,
1562
1668
  describeTargetModelFailure,
1669
+ diagnosticOfFinding,
1670
+ diagnosticOfSchemaError,
1563
1671
  differentialSteps,
1564
1672
  draftRevisionOf,
1565
1673
  elementStoreContractChecks,
@@ -1574,6 +1682,7 @@ export {
1574
1682
  firstError,
1575
1683
  formatSchemaErrors,
1576
1684
  freezeDraftChain,
1685
+ freezeSceneWorkingState,
1577
1686
  getSzenenSchemas,
1578
1687
  hasPlacementCapability,
1579
1688
  isKnownElementType,
@@ -1590,22 +1699,26 @@ export {
1590
1699
  parseRunResponse,
1591
1700
  preferredHeadRevisionOf,
1592
1701
  preferredVersionId,
1702
+ promptDiagnosticsOf,
1593
1703
  publishedHeadsOf,
1594
1704
  recoveriesForRun,
1595
1705
  recoveryStatusOf,
1596
1706
  reduceElementEvents,
1597
1707
  resolveArea,
1598
1708
  resolvePreferredHead,
1709
+ resolveScenePayload,
1599
1710
  resolveShot,
1600
1711
  resolveShotPayload,
1601
1712
  resolveTargetModelOver,
1602
1713
  resolverFromQueries,
1603
1714
  roundOfRun,
1715
+ rulesWithoutPromptEffect,
1604
1716
  runElementStoreContract,
1605
1717
  runPromptDerivation,
1606
1718
  runPublishChecks,
1607
1719
  runSceneDerivation,
1608
1720
  runStoreDifferential,
1721
+ sceneOnlyCapabilities,
1609
1722
  scopeOfPath,
1610
1723
  selectableTargetModels,
1611
1724
  showChain,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rslsp1/fa-app-tools",
3
- "version": "3.0.0",
3
+ "version": "4.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",