@rslsp1/fa-app-tools 4.0.0 → 5.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/{chunk-566GHYAT.mjs → chunk-TW4IDHAN.mjs} +255 -30
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +253 -32
- package/dist/index.mjs +9 -8
- package/dist/szenen.d.mts +147 -7
- package/dist/szenen.d.ts +147 -7
- package/dist/szenen.js +267 -30
- package/dist/szenen.mjs +32 -5
- package/package.json +1 -1
|
@@ -5225,6 +5225,29 @@ function findPromptRun(events, runId) {
|
|
|
5225
5225
|
return collectPromptRuns(events).find((run) => run.run_id === runId) ?? null;
|
|
5226
5226
|
}
|
|
5227
5227
|
|
|
5228
|
+
// src/lib/szenen/bildVorschau.ts
|
|
5229
|
+
async function ladeVorschauen(port, mediaRefs, fertig, optionen = {}) {
|
|
5230
|
+
const laden = port.loadPreview;
|
|
5231
|
+
if (!laden) return;
|
|
5232
|
+
const parallel = Math.max(1, optionen.parallel ?? 4);
|
|
5233
|
+
const lauf = optionen.lauf;
|
|
5234
|
+
const offen = mediaRefs.filter((ref) => !(optionen.hat?.(ref) ?? false));
|
|
5235
|
+
let naechster = 0;
|
|
5236
|
+
async function arbeiter() {
|
|
5237
|
+
while (naechster < offen.length) {
|
|
5238
|
+
if (lauf?.abgebrochen) return;
|
|
5239
|
+
const ref = offen[naechster];
|
|
5240
|
+
naechster += 1;
|
|
5241
|
+
const ergebnis = await laden.call(port, ref);
|
|
5242
|
+
if (lauf?.abgebrochen) return;
|
|
5243
|
+
if (ergebnis.kind === "ok") fertig(ref, ergebnis.value);
|
|
5244
|
+
}
|
|
5245
|
+
}
|
|
5246
|
+
await Promise.all(
|
|
5247
|
+
Array.from({ length: Math.min(parallel, offen.length) }, () => arbeiter())
|
|
5248
|
+
);
|
|
5249
|
+
}
|
|
5250
|
+
|
|
5228
5251
|
// src/lib/szenen/textGenerationPort.ts
|
|
5229
5252
|
function simulatedAnswerFor(request) {
|
|
5230
5253
|
let input;
|
|
@@ -6183,7 +6206,7 @@ async function runSceneDerivation(input, port, userPrompt) {
|
|
|
6183
6206
|
}
|
|
6184
6207
|
|
|
6185
6208
|
// src/features/szenen/SzenenView.tsx
|
|
6186
|
-
import { useMemo as
|
|
6209
|
+
import { useMemo as useMemo4, useState as useState16 } from "react";
|
|
6187
6210
|
|
|
6188
6211
|
// src/features/szenen/areas/ElementsArea.tsx
|
|
6189
6212
|
import { useState as useState11 } from "react";
|
|
@@ -9973,7 +9996,7 @@ var MediaArea = ({ port }) => {
|
|
|
9973
9996
|
};
|
|
9974
9997
|
|
|
9975
9998
|
// src/features/szenen/areas/DeriveArea.tsx
|
|
9976
|
-
import { useRef as useRef2, useState as useState15 } from "react";
|
|
9999
|
+
import { useEffect as useEffect5, useMemo as useMemo3, useRef as useRef2, useState as useState15 } from "react";
|
|
9977
10000
|
|
|
9978
10001
|
// src/features/szenen/areas/RecoveryPanel.tsx
|
|
9979
10002
|
import { useState as useState13 } from "react";
|
|
@@ -10341,14 +10364,64 @@ function readAsBase642(datei) {
|
|
|
10341
10364
|
leser.readAsDataURL(datei);
|
|
10342
10365
|
});
|
|
10343
10366
|
}
|
|
10367
|
+
function useVorschauen(port, mediaRefs) {
|
|
10368
|
+
const [quellen, setQuellen] = useState15(() => /* @__PURE__ */ new Map());
|
|
10369
|
+
const gehalten = useRef2(/* @__PURE__ */ new Map());
|
|
10370
|
+
const schluessel = mediaRefs.join(" ");
|
|
10371
|
+
useEffect5(() => {
|
|
10372
|
+
const bestand = port.imageLibrary;
|
|
10373
|
+
if (!bestand?.loadPreview) return void 0;
|
|
10374
|
+
const refs = schluessel ? schluessel.split(" ") : [];
|
|
10375
|
+
const lauf = { abgebrochen: false };
|
|
10376
|
+
void ladeVorschauen(
|
|
10377
|
+
bestand,
|
|
10378
|
+
refs,
|
|
10379
|
+
(mediaRef, quelle) => {
|
|
10380
|
+
gehalten.current.set(mediaRef, quelle);
|
|
10381
|
+
setQuellen(new Map(gehalten.current));
|
|
10382
|
+
},
|
|
10383
|
+
{ parallel: 4, hat: (ref) => gehalten.current.has(ref), lauf }
|
|
10384
|
+
);
|
|
10385
|
+
return () => {
|
|
10386
|
+
lauf.abgebrochen = true;
|
|
10387
|
+
};
|
|
10388
|
+
}, [port, schluessel]);
|
|
10389
|
+
return quellen;
|
|
10390
|
+
}
|
|
10391
|
+
var Kachel = ({ quelle, alt }) => /* @__PURE__ */ jsx17("span", { className: "szenen-bildkachel", children: quelle ? /* @__PURE__ */ jsx17("img", { src: quelle, alt, loading: "lazy" }) : /* @__PURE__ */ jsx17("span", { className: "szenen-bildkachel__leer", "aria-hidden": "true" }) });
|
|
10344
10392
|
var BildWaehler = ({ port, gewaehlt, onWaehlen, onEntfernen }) => {
|
|
10345
10393
|
const [suche, setSuche] = useState15("");
|
|
10346
|
-
const [
|
|
10347
|
-
|
|
10394
|
+
const [offenesWerk, setOffenesWerk] = useState15(null);
|
|
10395
|
+
const [items] = usePortQuery(
|
|
10396
|
+
() => port.imageLibrary.listItems({ search: suche.trim() || void 0, limit: 60 }),
|
|
10348
10397
|
[port, suche]
|
|
10349
10398
|
);
|
|
10399
|
+
const werk = items.status === "ready" ? items.value.find((i) => i.itemRef === offenesWerk) ?? null : null;
|
|
10400
|
+
const sichtbar = useMemo3(() => {
|
|
10401
|
+
const refs = werk ? werk.images.map((b) => b.mediaRef) : items.status === "ready" ? items.value.map((i) => i.images[0]?.mediaRef).filter((r) => Boolean(r)) : [];
|
|
10402
|
+
return [.../* @__PURE__ */ new Set([...refs, ...gewaehlt.map((b) => b.mediaRef)])];
|
|
10403
|
+
}, [items, werk, gewaehlt]);
|
|
10404
|
+
const quellen = useVorschauen(port, sichtbar);
|
|
10405
|
+
const quelleVon = (bild) => bild.thumbUrl || quellen.get(bild.mediaRef) || null;
|
|
10350
10406
|
return /* @__PURE__ */ jsxs17("div", { className: "szenen-bildwahl", "data-testid": "bildwahl", children: [
|
|
10351
|
-
/* @__PURE__ */ jsxs17("
|
|
10407
|
+
werk ? /* @__PURE__ */ jsxs17("div", { className: "szenen-bildwahl__kopf", children: [
|
|
10408
|
+
/* @__PURE__ */ jsx17(
|
|
10409
|
+
"button",
|
|
10410
|
+
{
|
|
10411
|
+
type: "button",
|
|
10412
|
+
className: "szenen-bildwahl__zurueck",
|
|
10413
|
+
onClick: () => setOffenesWerk(null),
|
|
10414
|
+
"data-testid": "bildwahl-zurueck",
|
|
10415
|
+
children: "Zurueck zur Auswahl"
|
|
10416
|
+
}
|
|
10417
|
+
),
|
|
10418
|
+
/* @__PURE__ */ jsxs17("span", { className: "szenen-bildwahl__werktitel", "data-testid": "bildwahl-werktitel", children: [
|
|
10419
|
+
werk.title,
|
|
10420
|
+
" \xB7 ",
|
|
10421
|
+
werk.images.length,
|
|
10422
|
+
" Bilder"
|
|
10423
|
+
] })
|
|
10424
|
+
] }) : /* @__PURE__ */ jsxs17("label", { className: "szenen-field", children: [
|
|
10352
10425
|
/* @__PURE__ */ jsx17("span", { children: "Bild aus dem Bestand" }),
|
|
10353
10426
|
/* @__PURE__ */ jsx17(
|
|
10354
10427
|
"input",
|
|
@@ -10356,31 +10429,70 @@ var BildWaehler = ({ port, gewaehlt, onWaehlen, onEntfernen }) => {
|
|
|
10356
10429
|
type: "search",
|
|
10357
10430
|
value: suche,
|
|
10358
10431
|
onChange: (e) => setSuche(e.target.value),
|
|
10432
|
+
onKeyDown: (e) => {
|
|
10433
|
+
if (e.key === "Enter") e.preventDefault();
|
|
10434
|
+
},
|
|
10359
10435
|
placeholder: "Suchen \u2026",
|
|
10360
10436
|
"data-testid": "bild-suche"
|
|
10361
10437
|
}
|
|
10362
10438
|
)
|
|
10363
10439
|
] }),
|
|
10364
|
-
|
|
10365
|
-
|
|
10440
|
+
items.status === "loading" && /* @__PURE__ */ jsx17("p", { children: "Bilder werden geladen \u2026" }),
|
|
10441
|
+
items.status === "error" && /* @__PURE__ */ jsxs17("p", { className: "szenen-error", role: "alert", children: [
|
|
10366
10442
|
"Der Bildbestand ist nicht lesbar: ",
|
|
10367
|
-
|
|
10443
|
+
items.message
|
|
10368
10444
|
] }),
|
|
10369
|
-
|
|
10370
|
-
|
|
10445
|
+
items.status === "ready" && items.value.length === 0 && /* @__PURE__ */ jsx17("p", { className: "szenen-empty", "data-testid": "bildwahl-leer", children: "Zu dieser Suche gibt es kein Bild. Ohne Treffer bleibt der Upload." }),
|
|
10446
|
+
werk && /* @__PURE__ */ jsx17("ul", { className: "szenen-bildwahl__raster", "data-testid": "bildwahl-galerie", children: werk.images.map((bild, position) => /* @__PURE__ */ jsx17("li", { children: /* @__PURE__ */ jsxs17(
|
|
10371
10447
|
"button",
|
|
10372
10448
|
{
|
|
10373
10449
|
type: "button",
|
|
10374
|
-
onClick: () =>
|
|
10450
|
+
onClick: () => {
|
|
10451
|
+
onWaehlen(bild);
|
|
10452
|
+
setOffenesWerk(null);
|
|
10453
|
+
},
|
|
10375
10454
|
"data-testid": `bild-waehlen-${bild.mediaRef}`,
|
|
10455
|
+
title: bild.title,
|
|
10376
10456
|
children: [
|
|
10377
|
-
|
|
10378
|
-
/* @__PURE__ */
|
|
10457
|
+
/* @__PURE__ */ jsx17(Kachel, { quelle: quelleVon(bild), alt: bild.title }),
|
|
10458
|
+
/* @__PURE__ */ jsxs17("span", { className: "szenen-bildwahl__nummer", children: [
|
|
10459
|
+
"#",
|
|
10460
|
+
position + 1
|
|
10461
|
+
] })
|
|
10379
10462
|
]
|
|
10380
10463
|
}
|
|
10381
10464
|
) }, bild.mediaRef)) }),
|
|
10465
|
+
!werk && items.status === "ready" && items.value.length > 0 && /* @__PURE__ */ jsx17("ul", { className: "szenen-bildwahl__raster", "data-testid": "bildwahl-werke", children: items.value.map((item) => {
|
|
10466
|
+
const deckbild = item.images[0];
|
|
10467
|
+
if (!deckbild) return null;
|
|
10468
|
+
return /* @__PURE__ */ jsx17("li", { children: /* @__PURE__ */ jsxs17(
|
|
10469
|
+
"button",
|
|
10470
|
+
{
|
|
10471
|
+
type: "button",
|
|
10472
|
+
onClick: () => item.images.length === 1 ? onWaehlen(deckbild) : setOffenesWerk(item.itemRef),
|
|
10473
|
+
"data-testid": `item-waehlen-${item.itemRef}`,
|
|
10474
|
+
title: item.title,
|
|
10475
|
+
children: [
|
|
10476
|
+
/* @__PURE__ */ jsx17(Kachel, { quelle: quelleVon(deckbild), alt: item.title }),
|
|
10477
|
+
item.images.length > 1 && /* @__PURE__ */ jsxs17(
|
|
10478
|
+
"span",
|
|
10479
|
+
{
|
|
10480
|
+
className: "szenen-bildwahl__anzahl",
|
|
10481
|
+
"data-testid": `item-anzahl-${item.itemRef}`,
|
|
10482
|
+
children: [
|
|
10483
|
+
item.images.length,
|
|
10484
|
+
"x"
|
|
10485
|
+
]
|
|
10486
|
+
}
|
|
10487
|
+
),
|
|
10488
|
+
/* @__PURE__ */ jsx17("span", { className: "szenen-bildwahl__titel", children: item.title })
|
|
10489
|
+
]
|
|
10490
|
+
}
|
|
10491
|
+
) }, item.itemRef);
|
|
10492
|
+
}) }),
|
|
10382
10493
|
gewaehlt.length > 0 && /* @__PURE__ */ jsx17("ul", { className: "szenen-bildwahl__gewaehlt", "data-testid": "bilder-gewaehlt", children: gewaehlt.map((bild) => /* @__PURE__ */ jsxs17("li", { children: [
|
|
10383
|
-
bild.title,
|
|
10494
|
+
/* @__PURE__ */ jsx17(Kachel, { quelle: quelleVon(bild), alt: bild.title }),
|
|
10495
|
+
/* @__PURE__ */ jsx17("span", { className: "szenen-bildwahl__titel", children: bild.title }),
|
|
10384
10496
|
/* @__PURE__ */ jsx17(
|
|
10385
10497
|
"button",
|
|
10386
10498
|
{
|
|
@@ -10419,7 +10531,10 @@ var DeriveArea = ({ port, contextId }) => {
|
|
|
10419
10531
|
);
|
|
10420
10532
|
const gewaehlt = regeln.status === "ready" ? regeln.value.find((r) => r.versionId === policyVersionId) ?? null : null;
|
|
10421
10533
|
async function starten(folgt) {
|
|
10422
|
-
if (!gewaehlt)
|
|
10534
|
+
if (!gewaehlt) {
|
|
10535
|
+
setMeldung("Bitte zuerst eine Rekonstruktionsregel waehlen \u2014 ohne sie ist kein Lauf reproduzierbar (D-03).");
|
|
10536
|
+
return;
|
|
10537
|
+
}
|
|
10423
10538
|
setLaeuft(true);
|
|
10424
10539
|
setMeldung(null);
|
|
10425
10540
|
setLauf(null);
|
|
@@ -10796,8 +10911,8 @@ var SzenenView = ({
|
|
|
10796
10911
|
initialArea,
|
|
10797
10912
|
onAreaChange
|
|
10798
10913
|
}) => {
|
|
10799
|
-
const bereiche =
|
|
10800
|
-
const faehig =
|
|
10914
|
+
const bereiche = useMemo4(() => areasFor(port), [port]);
|
|
10915
|
+
const faehig = useMemo4(() => capabilitiesOf(port), [port]);
|
|
10801
10916
|
const [aktiv, setAktiv] = useState16(() => resolveArea(port, initialArea));
|
|
10802
10917
|
const wechsle = (id) => {
|
|
10803
10918
|
setAktiv(id);
|
|
@@ -10853,6 +10968,17 @@ var SzenenView = ({
|
|
|
10853
10968
|
};
|
|
10854
10969
|
|
|
10855
10970
|
// src/lib/szenen/flowTextGenerationPort.ts
|
|
10971
|
+
function alsFlowTextZugang(sdk) {
|
|
10972
|
+
return async (prompt, options) => {
|
|
10973
|
+
const antwort = await sdk(prompt, options);
|
|
10974
|
+
if (typeof antwort?.text !== "string") {
|
|
10975
|
+
throw new Error(
|
|
10976
|
+
`Flow.generate.text lieferte kein { text: string }, sondern ${antwort === null || antwort === void 0 ? String(antwort) : typeof antwort}: ${JSON.stringify(antwort)?.slice(0, 200)}`
|
|
10977
|
+
);
|
|
10978
|
+
}
|
|
10979
|
+
return antwort.text;
|
|
10980
|
+
};
|
|
10981
|
+
}
|
|
10856
10982
|
function createFlowTextGenerationPort(generateText, options = {}) {
|
|
10857
10983
|
const provider = options.provider ?? "flow";
|
|
10858
10984
|
const modelId = options.modelId ?? "flow.generate.text";
|
|
@@ -13962,6 +14088,7 @@ function createHfImageStore(options) {
|
|
|
13962
14088
|
const basisMs = options.leseBasisMs ?? 400;
|
|
13963
14089
|
const schlafen = options.schlafen ?? warten;
|
|
13964
14090
|
const abgelegt = /* @__PURE__ */ new Map();
|
|
14091
|
+
const vorschauen = /* @__PURE__ */ new Map();
|
|
13965
14092
|
const bekanntePfade = /* @__PURE__ */ new Set();
|
|
13966
14093
|
let gefalteterBestand = null;
|
|
13967
14094
|
let laufenderAbgleich = null;
|
|
@@ -13985,7 +14112,7 @@ function createHfImageStore(options) {
|
|
|
13985
14112
|
}
|
|
13986
14113
|
return laufenderAbgleich;
|
|
13987
14114
|
}
|
|
13988
|
-
|
|
14115
|
+
const speicher = {
|
|
13989
14116
|
bestand: bestandAbgleichen,
|
|
13990
14117
|
async putWithId(id, base64, mimeType, titel) {
|
|
13991
14118
|
const echterTyp = typAusBytes(base64, mimeType);
|
|
@@ -14004,6 +14131,38 @@ function createHfImageStore(options) {
|
|
|
14004
14131
|
}, []);
|
|
14005
14132
|
abgelegt.set(id, { data: base64, mimeType: echterTyp });
|
|
14006
14133
|
},
|
|
14134
|
+
async preview(id) {
|
|
14135
|
+
const bekannt = vorschauen.get(id);
|
|
14136
|
+
if (bekannt) return bekannt;
|
|
14137
|
+
const eben = abgelegt.get(id);
|
|
14138
|
+
if (eben) {
|
|
14139
|
+
const quelle2 = `data:${eben.mimeType};base64,${eben.data}`;
|
|
14140
|
+
vorschauen.set(id, quelle2);
|
|
14141
|
+
return quelle2;
|
|
14142
|
+
}
|
|
14143
|
+
const zustand = await bestandAbgleichen();
|
|
14144
|
+
const eintrag = zustand.metadata.find((e) => e.id === id);
|
|
14145
|
+
if (eintrag?.hasThumb && eintrag.filename) {
|
|
14146
|
+
const klein = await hfLoadImageAsBase64(
|
|
14147
|
+
id,
|
|
14148
|
+
token,
|
|
14149
|
+
void 0,
|
|
14150
|
+
eintrag.filename,
|
|
14151
|
+
void 0,
|
|
14152
|
+
eintrag.mimeType,
|
|
14153
|
+
true
|
|
14154
|
+
);
|
|
14155
|
+
if (klein) {
|
|
14156
|
+
const quelle2 = `data:${eintrag.mimeType || "image/jpeg"};base64,${klein}`;
|
|
14157
|
+
vorschauen.set(id, quelle2);
|
|
14158
|
+
return quelle2;
|
|
14159
|
+
}
|
|
14160
|
+
}
|
|
14161
|
+
const voll = await speicher.resolve(id);
|
|
14162
|
+
const quelle = `data:${voll.mimeType};base64,${voll.data}`;
|
|
14163
|
+
vorschauen.set(id, quelle);
|
|
14164
|
+
return quelle;
|
|
14165
|
+
},
|
|
14007
14166
|
async resolve(id, mimeType) {
|
|
14008
14167
|
const eben = abgelegt.get(id);
|
|
14009
14168
|
if (eben) return eben;
|
|
@@ -14041,6 +14200,47 @@ function createHfImageStore(options) {
|
|
|
14041
14200
|
);
|
|
14042
14201
|
}
|
|
14043
14202
|
};
|
|
14203
|
+
return speicher;
|
|
14204
|
+
}
|
|
14205
|
+
|
|
14206
|
+
// src/lib/szenen/libraryItems.ts
|
|
14207
|
+
var LOCATOR = /^(.+)-(\d+)$/;
|
|
14208
|
+
function locatorTeile(mediaRef) {
|
|
14209
|
+
const treffer = LOCATOR.exec(mediaRef);
|
|
14210
|
+
if (!treffer) return { stamm: mediaRef, position: null };
|
|
14211
|
+
return { stamm: treffer[1], position: Number(treffer[2]) };
|
|
14212
|
+
}
|
|
14213
|
+
function gruppiereZuItems(bilder) {
|
|
14214
|
+
const gruppen = /* @__PURE__ */ new Map();
|
|
14215
|
+
for (const bild of bilder) {
|
|
14216
|
+
const { stamm } = locatorTeile(bild.mediaRef);
|
|
14217
|
+
const vorhanden = gruppen.get(stamm);
|
|
14218
|
+
if (vorhanden) vorhanden.push(bild);
|
|
14219
|
+
else gruppen.set(stamm, [bild]);
|
|
14220
|
+
}
|
|
14221
|
+
const items = [...gruppen.entries()].map(([stamm, mitglieder]) => {
|
|
14222
|
+
const sortiert = [...mitglieder].sort((a, b) => {
|
|
14223
|
+
const pa = locatorTeile(a.mediaRef).position ?? 0;
|
|
14224
|
+
const pb = locatorTeile(b.mediaRef).position ?? 0;
|
|
14225
|
+
return pa - pb;
|
|
14226
|
+
});
|
|
14227
|
+
const erstes = sortiert[0];
|
|
14228
|
+
const itemRef = sortiert.length === 1 ? erstes.mediaRef : stamm;
|
|
14229
|
+
const juengstes = sortiert.reduce(
|
|
14230
|
+
(max, b) => Math.max(max, b.timestamp ?? 0),
|
|
14231
|
+
0
|
|
14232
|
+
);
|
|
14233
|
+
return {
|
|
14234
|
+
item: {
|
|
14235
|
+
itemRef,
|
|
14236
|
+
title: erstes.itemTitle?.trim() || erstes.title || itemRef,
|
|
14237
|
+
images: sortiert.map(({ timestamp: _t, itemTitle: _i, ...bild }) => bild)
|
|
14238
|
+
},
|
|
14239
|
+
juengstes
|
|
14240
|
+
};
|
|
14241
|
+
});
|
|
14242
|
+
items.sort((a, b) => b.juengstes - a.juengstes);
|
|
14243
|
+
return items.map((e) => e.item);
|
|
14044
14244
|
}
|
|
14045
14245
|
|
|
14046
14246
|
// src/lib/szenen/hfImageLibrary.ts
|
|
@@ -14048,13 +14248,22 @@ function fehler2(nachricht, retryable = false) {
|
|
|
14048
14248
|
return { kind: "error", message: nachricht, retryable };
|
|
14049
14249
|
}
|
|
14050
14250
|
function alsBild(eintrag) {
|
|
14251
|
+
const { position } = locatorTeile(eintrag.id);
|
|
14252
|
+
const werk = eintrag.prompt?.trim() || "";
|
|
14051
14253
|
return {
|
|
14052
14254
|
mediaRef: eintrag.id,
|
|
14053
|
-
//
|
|
14054
|
-
//
|
|
14055
|
-
|
|
14255
|
+
// Innerhalb eines mehrbildigen Werkes tragen alle Einträge denselben
|
|
14256
|
+
// Prompt — der Abgleich schreibt ihn je Bild aus derselben Library-Zeile.
|
|
14257
|
+
// Deshalb bekommt die Kachel dort die Position dazu, sonst stünde
|
|
14258
|
+
// vierzehnmal derselbe Satz.
|
|
14259
|
+
title: position === null ? werk || eintrag.id : `${werk || eintrag.id} \xB7 Bild ${position + 1}`,
|
|
14056
14260
|
mimeType: eintrag.mimeType || "image/jpeg",
|
|
14057
|
-
thumbUrl
|
|
14261
|
+
// Kein `thumbUrl`: Die Datei liegt auf HF hinter einem Token, und ein
|
|
14262
|
+
// `<img src>` käme dort nicht durch. Die Quelle entsteht über
|
|
14263
|
+
// `loadPreview()` — und nur für die Kacheln, die wirklich gezeigt werden.
|
|
14264
|
+
thumbUrl: null,
|
|
14265
|
+
itemTitle: werk || null,
|
|
14266
|
+
...typeof eintrag.timestamp === "number" ? { timestamp: eintrag.timestamp } : {}
|
|
14058
14267
|
};
|
|
14059
14268
|
}
|
|
14060
14269
|
function createHfImageLibrary(options) {
|
|
@@ -14065,15 +14274,14 @@ function createHfImageLibrary(options) {
|
|
|
14065
14274
|
...options.now ? { now: options.now } : {}
|
|
14066
14275
|
});
|
|
14067
14276
|
return {
|
|
14068
|
-
async
|
|
14277
|
+
async listItems(query) {
|
|
14069
14278
|
try {
|
|
14070
14279
|
const zustand = await store.bestand();
|
|
14071
14280
|
const eintraege = zustand?.metadata ?? [];
|
|
14281
|
+
const items = gruppiereZuItems(eintraege.map(alsBild));
|
|
14072
14282
|
const gesucht = query?.search?.trim().toLowerCase();
|
|
14073
|
-
const gefiltert = gesucht ?
|
|
14074
|
-
|
|
14075
|
-
const begrenzt = query?.limit ? sortiert.slice(0, query.limit) : sortiert;
|
|
14076
|
-
return { kind: "ok", value: begrenzt.map(alsBild) };
|
|
14283
|
+
const gefiltert = gesucht ? items.filter((i) => i.title.toLowerCase().includes(gesucht) || i.itemRef.toLowerCase().includes(gesucht)) : items;
|
|
14284
|
+
return { kind: "ok", value: query?.limit ? gefiltert.slice(0, query.limit) : gefiltert };
|
|
14077
14285
|
} catch (error) {
|
|
14078
14286
|
return fehler2(
|
|
14079
14287
|
`Der Bildbestand konnte nicht gelesen werden: ${error instanceof Error ? error.message : String(error)}`,
|
|
@@ -14081,6 +14289,16 @@ function createHfImageLibrary(options) {
|
|
|
14081
14289
|
);
|
|
14082
14290
|
}
|
|
14083
14291
|
},
|
|
14292
|
+
async loadPreview(mediaRef) {
|
|
14293
|
+
try {
|
|
14294
|
+
return { kind: "ok", value: await store.preview(mediaRef) };
|
|
14295
|
+
} catch (error) {
|
|
14296
|
+
return fehler2(
|
|
14297
|
+
`Die Vorschau von ${mediaRef} ist nicht ladbar: ${error instanceof Error ? error.message : String(error)}`,
|
|
14298
|
+
true
|
|
14299
|
+
);
|
|
14300
|
+
}
|
|
14301
|
+
},
|
|
14084
14302
|
async resolveImage(mediaRef, mimeTypeHinweis) {
|
|
14085
14303
|
try {
|
|
14086
14304
|
const bild = await store.resolve(mediaRef, mimeTypeHinweis);
|
|
@@ -14093,10 +14311,13 @@ function createHfImageLibrary(options) {
|
|
|
14093
14311
|
const id = newImageId();
|
|
14094
14312
|
try {
|
|
14095
14313
|
await store.putWithId(id, input.data, input.mime_type, input.title);
|
|
14096
|
-
|
|
14097
|
-
|
|
14098
|
-
|
|
14314
|
+
const abgelegt = {
|
|
14315
|
+
mediaRef: id,
|
|
14316
|
+
title: input.title,
|
|
14317
|
+
mimeType: input.mime_type,
|
|
14318
|
+
thumbUrl: null
|
|
14099
14319
|
};
|
|
14320
|
+
return { kind: "ok", value: abgelegt };
|
|
14100
14321
|
} catch (error) {
|
|
14101
14322
|
return fehler2(
|
|
14102
14323
|
`Das Bild konnte nicht abgelegt werden: ${error instanceof Error ? error.message : String(error)}`,
|
|
@@ -14824,6 +15045,7 @@ export {
|
|
|
14824
15045
|
preferredHeadRevisionOf,
|
|
14825
15046
|
collectPromptRuns,
|
|
14826
15047
|
findPromptRun,
|
|
15048
|
+
ladeVorschauen,
|
|
14827
15049
|
simulatedAnswerFor,
|
|
14828
15050
|
SIMULATION_PROVIDER,
|
|
14829
15051
|
createSimulationTextGenerationPort,
|
|
@@ -14844,6 +15066,7 @@ export {
|
|
|
14844
15066
|
createSimulationSceneDerivationPort,
|
|
14845
15067
|
runSceneDerivation,
|
|
14846
15068
|
SzenenView,
|
|
15069
|
+
alsFlowTextZugang,
|
|
14847
15070
|
createFlowTextGenerationPort,
|
|
14848
15071
|
CATALOGUE_TYPES,
|
|
14849
15072
|
publishedHeadsOf,
|
|
@@ -14896,6 +15119,8 @@ export {
|
|
|
14896
15119
|
bildPfad,
|
|
14897
15120
|
typAusBytes,
|
|
14898
15121
|
createHfImageStore,
|
|
15122
|
+
locatorTeile,
|
|
15123
|
+
gruppiereZuItems,
|
|
14899
15124
|
createHfImageLibrary,
|
|
14900
15125
|
FLOW_EXECUTION_PATH,
|
|
14901
15126
|
createFlowImageProvider,
|
package/dist/index.d.mts
CHANGED
|
@@ -6,7 +6,7 @@ import { Node, Edge } from '@xyflow/react';
|
|
|
6
6
|
import * as zustand_vanilla from 'zustand/vanilla';
|
|
7
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';
|
|
8
8
|
|
|
9
|
-
var version = "
|
|
9
|
+
var version = "5.0.0";
|
|
10
10
|
|
|
11
11
|
declare function useOnClickOutside(ref: RefObject<HTMLElement | null>, handler: (e: MouseEvent | TouchEvent) => void): void;
|
|
12
12
|
|
package/dist/index.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { Node, Edge } from '@xyflow/react';
|
|
|
6
6
|
import * as zustand_vanilla from 'zustand/vanilla';
|
|
7
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';
|
|
8
8
|
|
|
9
|
-
var version = "
|
|
9
|
+
var version = "5.0.0";
|
|
10
10
|
|
|
11
11
|
declare function useOnClickOutside(ref: RefObject<HTMLElement | null>, handler: (e: MouseEvent | TouchEvent) => void): void;
|
|
12
12
|
|