@qaecy/cue-sdk 0.0.28 → 0.0.30

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.
@@ -1,8 +1,8 @@
1
1
  import { getApps as be, initializeApp as ve } from "firebase/app";
2
- import { ref as _, getDownloadURL as K, getMetadata as M, getBlob as re, updateMetadata as _e, uploadBytesResumable as ft, uploadBytes as st, StringFormat as ke, uploadString as Ee, listAll as z, getStorage as T, connectStorageEmulator as Q } from "firebase/storage";
2
+ import { ref as _, getDownloadURL as K, getMetadata as z, getBlob as re, updateMetadata as _e, uploadBytesResumable as ft, uploadBytes as st, StringFormat as ke, uploadString as Ee, listAll as $, getStorage as S, connectStorageEmulator as X } from "firebase/storage";
3
3
  import { Writer as xe, DataFactory as j } from "n3";
4
- import { getFirestore as Ie, connectFirestoreEmulator as Ce, collection as yt, getDocs as Te, query as Se, where as Re, limit as Ae, doc as bt, getDoc as Pe, setDoc as Oe, serverTimestamp as De, increment as Le } from "firebase/firestore";
5
- import { getAuth as qe, connectAuthEmulator as je, onIdTokenChanged as Ue, getIdTokenResult as at, signInWithEmailAndPassword as Me, GoogleAuthProvider as it, OAuthProvider as nt, signInWithPopup as ze, signInWithRedirect as Ne, getRedirectResult as $e, signInWithCustomToken as vt, signOut as Fe, onAuthStateChanged as Be, fetchSignInMethodsForEmail as Ge, linkWithPopup as He, unlink as We, reauthenticateWithCredential as _t, EmailAuthProvider as X, updatePassword as Ve, linkWithCredential as Ke, verifyBeforeUpdateEmail as Qe, sendEmailVerification as Xe } from "firebase/auth";
4
+ import { getFirestore as Ie, connectFirestoreEmulator as Ce, collection as yt, getDocs as Se, query as Te, where as Re, limit as Ae, doc as bt, getDoc as Pe, setDoc as Oe, serverTimestamp as De, increment as Le } from "firebase/firestore";
5
+ import { getAuth as qe, connectAuthEmulator as je, onIdTokenChanged as Ue, getIdTokenResult as at, signInWithEmailAndPassword as ze, GoogleAuthProvider as it, OAuthProvider as nt, signInWithPopup as $e, signInWithRedirect as Me, getRedirectResult as Ne, signInWithCustomToken as vt, signOut as Fe, onAuthStateChanged as Be, fetchSignInMethodsForEmail as Ge, linkWithPopup as He, unlink as We, reauthenticateWithCredential as _t, EmailAuthProvider as Q, updatePassword as Ve, linkWithCredential as Ke, verifyBeforeUpdateEmail as Xe, sendEmailVerification as Qe } from "firebase/auth";
6
6
  import { v5 as Ye } from "uuid";
7
7
  import "spark-md5";
8
8
  import { getFunctions as se, connectFunctionsEmulator as ae, httpsCallable as F } from "firebase/functions";
@@ -342,7 +342,7 @@ class kt {
342
342
  if (this._knownMissing.has(o)) return;
343
343
  const r = _(this._bucket(t), e);
344
344
  try {
345
- const s = await M(r);
345
+ const s = await z(r);
346
346
  return `${await K(r)}&t=${encodeURIComponent(s.updated)}`;
347
347
  } catch (s) {
348
348
  if (s?.code === "storage/object-not-found" || s?.status === 404) {
@@ -383,7 +383,7 @@ class kt {
383
383
  try {
384
384
  const [a, n] = await Promise.all([
385
385
  s(K(e)),
386
- s(M(e))
386
+ s(z(e))
387
387
  ]), p = `${a}&t=${encodeURIComponent(n.updated)}`, c = await fetch(p, { signal: o.signal });
388
388
  if (!c.ok) throw new Error(`HTTP ${c.status}`);
389
389
  return c.text();
@@ -399,7 +399,7 @@ class kt {
399
399
  async getMetadata(t, e) {
400
400
  const o = _(this._bucket(t), e);
401
401
  try {
402
- const r = await M(o);
402
+ const r = await z(o);
403
403
  return {
404
404
  updated: r.updated,
405
405
  contentType: r.contentType,
@@ -454,7 +454,7 @@ class kt {
454
454
  /** List all item names directly under `prefix` in the given bucket. */
455
455
  async listFiles(t, e) {
456
456
  const o = _(this._bucket(t), e);
457
- return (await z(o)).items.map((s) => s.name);
457
+ return (await $(o)).items.map((s) => s.name);
458
458
  }
459
459
  /**
460
460
  * Recursively list all file full-paths under `prefix` in the given bucket.
@@ -462,7 +462,7 @@ class kt {
462
462
  */
463
463
  async listFilesRecursive(t, e) {
464
464
  const o = this._bucket(t), r = async (s) => {
465
- const a = await z(_(o, s));
465
+ const a = await $(_(o, s));
466
466
  let n = a.items.map((p) => p.fullPath);
467
467
  for (const p of a.prefixes)
468
468
  n = n.concat(await r(p.fullPath));
@@ -478,7 +478,7 @@ class kt {
478
478
  const { deleteObject: o } = await import("firebase/storage"), r = this._bucket(t);
479
479
  let s = 0;
480
480
  const a = async (n) => {
481
- const p = await z(_(r, n));
481
+ const p = await $(_(r, n));
482
482
  for (const c of p.items)
483
483
  await o(c), s++;
484
484
  for (const c of p.prefixes)
@@ -499,22 +499,22 @@ class kt {
499
499
  d(new DOMException("Upload cancelled", "AbortError"));
500
500
  return;
501
501
  }
502
- const g = ft(n, e, { customMetadata: o }), w = () => {
502
+ const g = ft(n, e, { customMetadata: o }), u = () => {
503
503
  g.cancel(), d(new DOMException("Upload cancelled", "AbortError"));
504
504
  };
505
- s?.addEventListener("abort", w, { once: !0 }), g.on(
505
+ s?.addEventListener("abort", u, { once: !0 }), g.on(
506
506
  "state_changed",
507
- (u) => {
507
+ (m) => {
508
508
  if (a) {
509
- const f = Math.round(u.bytesTransferred / u.totalBytes * 100);
509
+ const f = Math.round(m.bytesTransferred / m.totalBytes * 100);
510
510
  a(f);
511
511
  }
512
512
  },
513
- (u) => {
514
- s?.removeEventListener("abort", w), d(u);
513
+ (m) => {
514
+ s?.removeEventListener("abort", u), d(m);
515
515
  },
516
516
  () => {
517
- s?.removeEventListener("abort", w), h();
517
+ s?.removeEventListener("abort", u), h();
518
518
  }
519
519
  );
520
520
  });
@@ -532,12 +532,12 @@ class kt {
532
532
  */
533
533
  async uploadProcessed(t, e, o) {
534
534
  const r = _(this.options.storageProcessed, t);
535
- return await M(r).catch(() => null) ? !1 : (await st(r, e, { customMetadata: o }), !0);
535
+ return await z(r).catch(() => null) ? !1 : (await st(r, e, { customMetadata: o }), !0);
536
536
  }
537
537
  /** List all blob names directly under `prefix` in the raw bucket. */
538
538
  async listRaw(t) {
539
539
  const e = _(this.options.storageRaw, t);
540
- return (await z(e)).items.map((r) => r.name);
540
+ return (await $(e)).items.map((r) => r.name);
541
541
  }
542
542
  }
543
543
  const Et = {
@@ -646,7 +646,7 @@ const Z = {
646
646
  apiKey: "AIzaSyAiW42QBx9HS4Khu88pCW7MV66IhBAQul0",
647
647
  appId: "1:151132927589:web:d2ffdb377dfadfd23ab88c",
648
648
  measurementId: "G-YT4PK6HGZD"
649
- }, xt = "qaecy-mvp-406413", oo = "734737865998", ie = "europe-west6", It = "projects", Ct = "spaces_chats_eu_west6", Tt = "spaces_raw_eu_west6", St = "spaces_processed_eu_west6", Rt = "spaces_logs_eu_west6", At = "cue_public_eu_west6", Pt = "db_persistence_eu_west6", ro = "/data-views/admin/consumption", so = "/data-views/admin/profile/organizations", Ot = "/data-views/admin/profile/api-keys", Dt = "/commands/admin/profile/api-keys", ao = "/commands/admin/profile/terms", io = (i) => `/data-views/admin/organizations/${i}/members`, no = "/commands/admin/project", po = (i) => `/commands/admin/project/${i}`, lo = "/assistant/search", ne = "/triplestore/query", co = "/triplestore/update", ho = "/triplestore/shacl", pe = "/qlever-server/qlever/query", go = "/qlever-server/qlever/update", uo = "/qlever-server/qlever/shacl", Lt = "/commands/file-system-structure/batch", qt = "microsoft.com", jt = "superadmin", ut = "https://cue.qaecy.com/r/";
649
+ }, xt = "qaecy-mvp-406413", oo = "734737865998", ie = "europe-west6", It = "projects", Ct = "spaces_chats_eu_west6", St = "spaces_raw_eu_west6", Tt = "spaces_processed_eu_west6", Rt = "spaces_logs_eu_west6", At = "cue_public_eu_west6", Pt = "db_persistence_eu_west6", ro = "/data-views/admin/consumption", so = "/data-views/admin/profile/organizations", Ot = "/data-views/admin/profile/api-keys", Dt = "/commands/admin/profile/api-keys", ao = "/commands/admin/profile/terms", io = (i) => `/data-views/admin/organizations/${i}/members`, no = "/commands/admin/project", po = (i) => `/commands/admin/project/${i}`, lo = "/assistant/search", ne = "/triplestore/query", co = "/triplestore/update", ho = "/triplestore/shacl", pe = "/qlever-server/qlever/query", go = "/qlever-server/qlever/update", uo = "/qlever-server/qlever/shacl", Lt = "/commands/file-system-structure/batch", qt = "microsoft.com", jt = "superadmin", ut = "https://cue.qaecy.com/r/";
650
650
  class Ut {
651
651
  _auth;
652
652
  _endpoints;
@@ -689,14 +689,14 @@ class Ut {
689
689
  if (t === "password") {
690
690
  if (!e)
691
691
  throw new Error("credentials are required for password sign-in");
692
- return (await Me(
692
+ return (await ze(
693
693
  this._auth,
694
694
  e.email,
695
695
  e.password
696
696
  )).user;
697
697
  }
698
698
  const o = t === "google" ? new it() : new nt(qt);
699
- return (await ze(this._auth, o)).user;
699
+ return (await $e(this._auth, o)).user;
700
700
  }
701
701
  /**
702
702
  * Initiate a redirect-based sign-in (mobile / iframe contexts where popups
@@ -705,7 +705,7 @@ class Ut {
705
705
  */
706
706
  async signInWithRedirect(t) {
707
707
  const e = t === "google" ? new it() : new nt(qt);
708
- await Ne(this._auth, e);
708
+ await Me(this._auth, e);
709
709
  }
710
710
  /**
711
711
  * Retrieve the result of a redirect sign-in. Returns the signed-in `User`
@@ -713,7 +713,7 @@ class Ut {
713
713
  * Call this once on app startup before showing a sign-in UI.
714
714
  */
715
715
  async checkRedirectResult() {
716
- return (await $e(this._auth))?.user ?? null;
716
+ return (await Ne(this._auth))?.user ?? null;
717
717
  }
718
718
  /**
719
719
  * One-shot async check — returns `true` if the current user has the
@@ -805,7 +805,7 @@ class Ut {
805
805
  return this._auth;
806
806
  }
807
807
  }
808
- class Mt {
808
+ class zt {
809
809
  constructor(t) {
810
810
  this._blob = t;
811
811
  }
@@ -919,7 +919,7 @@ class bo {
919
919
  return { jsonld: await r.json() };
920
920
  }
921
921
  }
922
- class zt {
922
+ class $t {
923
923
  constructor(t, e, o, r) {
924
924
  this._auth = t, this._gatewayUrl = e, this.projects = o, this.sync = r, this.tables = new fo(t, e), this.extraction = new bo(t, e);
925
925
  }
@@ -1146,7 +1146,7 @@ const pt = [
1146
1146
  preferredColor: "#db2777"
1147
1147
  }
1148
1148
  };
1149
- function S(i) {
1149
+ function T(i) {
1150
1150
  return vo[i];
1151
1151
  }
1152
1152
  const _o = {
@@ -1177,7 +1177,7 @@ const _o = {
1177
1177
  "nature-landscape-plan": "#16a34a"
1178
1178
  // dark-green – Natur- und Landschaftsschutz
1179
1179
  };
1180
- function N(i, t) {
1180
+ function M(i, t) {
1181
1181
  return i[0] < t[2] && i[2] > t[0] && i[1] < t[3] && i[3] > t[1];
1182
1182
  }
1183
1183
  const ko = "https://nominatim.openstreetmap.org", Eo = "cue-gis/0.0.1", xo = {
@@ -1196,7 +1196,7 @@ function B(i) {
1196
1196
  return `${L}:${i}`;
1197
1197
  }
1198
1198
  function Io(i) {
1199
- const t = S(i);
1199
+ const t = T(i);
1200
1200
  return {
1201
1201
  id: B(i),
1202
1202
  sourceId: L,
@@ -1226,7 +1226,7 @@ class Co {
1226
1226
  })
1227
1227
  )).filter(
1228
1228
  (o) => o.status === "fulfilled" && o.value.hasResults
1229
- ).map((o) => S(o.value.category));
1229
+ ).map((o) => T(o.value.category));
1230
1230
  }
1231
1231
  async listAvailableLayers(t) {
1232
1232
  return (await this.listFeatureCategoryDescriptors(t)).map((o) => Io(o.category));
@@ -1270,7 +1270,7 @@ class Co {
1270
1270
  return (await h.json()).map((g) => this.toGisFeature(g, e));
1271
1271
  }
1272
1272
  toGisFeature(t, e) {
1273
- const [o, r, s, a] = t.boundingbox, n = e ?? t.category, p = S(n);
1273
+ const [o, r, s, a] = t.boundingbox, n = e ?? t.category, p = T(n);
1274
1274
  return {
1275
1275
  id: `${t.osm_type}/${t.osm_id}`,
1276
1276
  sourceId: L,
@@ -1289,7 +1289,7 @@ class Co {
1289
1289
  };
1290
1290
  }
1291
1291
  }
1292
- const Nt = {
1292
+ const Mt = {
1293
1293
  // 100s – Residential
1294
1294
  110: "residential",
1295
1295
  120: "residential",
@@ -1368,7 +1368,7 @@ const Nt = {
1368
1368
  960: "agricultural",
1369
1369
  970: "agricultural",
1370
1370
  990: "other"
1371
- }, $t = {
1371
+ }, Nt = {
1372
1372
  1010: "residential",
1373
1373
  1020: "mixed",
1374
1374
  1030: "residential",
@@ -1398,7 +1398,7 @@ const Nt = {
1398
1398
  1281: "infrastructure",
1399
1399
  1282: "infrastructure",
1400
1400
  9999: "other"
1401
- }, To = {
1401
+ }, So = {
1402
1402
  // Residential
1403
1403
  1110: "residential",
1404
1404
  // Einfamilienhaus
@@ -1460,7 +1460,7 @@ const Nt = {
1460
1460
  // Empfangsgebäude Bahn/Bus
1461
1461
  1282: "infrastructure"
1462
1462
  // Parkhaus, Garage
1463
- }, So = [
1463
+ }, To = [
1464
1464
  // "Gebäude" is the Swiss AV BoFlaeche land-cover label for a building footprint.
1465
1465
  // It does not encode the actual use type, so map it to 'other' as a safe fallback.
1466
1466
  [/^geb[äa]ude$/i, "other"],
@@ -1474,13 +1474,13 @@ const Nt = {
1474
1474
  [/gemischt|mixed|blandet/i, "mixed"]
1475
1475
  ];
1476
1476
  function O(i) {
1477
- for (const [t, e] of So)
1477
+ for (const [t, e] of To)
1478
1478
  if (t.test(i)) return e;
1479
1479
  }
1480
1480
  function Ro(i, t) {
1481
1481
  if (i == null) return;
1482
1482
  const e = String(i).trim();
1483
- return t === "swiss-gwr" ? To[e] ?? O(e) : t === "danish-matrikel" ? Nt[e] ?? O(e) : t === "zurich-wfs" || t === "swiss-av-wfs" ? $t[e] ?? O(e) : $t[e] ?? Nt[e] ?? O(e);
1483
+ return t === "swiss-gwr" ? So[e] ?? O(e) : t === "danish-matrikel" ? Mt[e] ?? O(e) : t === "zurich-wfs" || t === "swiss-av-wfs" ? Nt[e] ?? O(e) : Nt[e] ?? Mt[e] ?? O(e);
1484
1484
  }
1485
1485
  function Ao(i, t) {
1486
1486
  if (i != null)
@@ -1641,20 +1641,20 @@ function Uo(i) {
1641
1641
  return [0, 0];
1642
1642
  }
1643
1643
  }
1644
- function Mo(i, t) {
1644
+ function zo(i, t) {
1645
1645
  if (!i) return t;
1646
1646
  for (const e of ["plannavn", "bezeichnung", "name", "strassenname", "objektname", "title", "label"])
1647
1647
  if (typeof i[e] == "string" && i[e]) return i[e];
1648
1648
  return t;
1649
1649
  }
1650
- function zo(i, t, e) {
1650
+ function $o(i, t, e) {
1651
1651
  return e ? `${i}:${t}[${e}]` : `${i}:${t}`;
1652
1652
  }
1653
- const No = /* @__PURE__ */ new Set(["building", "cadastre", "greenspace", "paved", "zone"]);
1653
+ const Mo = /* @__PURE__ */ new Set(["building", "cadastre", "greenspace", "paved", "zone"]);
1654
1654
  function et(i, t, e, o) {
1655
- const r = e.replace(/^ms:/, ""), s = S(t), a = No.has(t) ? "priority" : "raw";
1655
+ const r = e.replace(/^ms:/, ""), s = T(t), a = Mo.has(t) ? "priority" : "raw";
1656
1656
  return {
1657
- id: zo(i, e, o),
1657
+ id: $o(i, e, o),
1658
1658
  sourceId: i,
1659
1659
  sourceLayerId: e,
1660
1660
  category: t,
@@ -1666,7 +1666,7 @@ function et(i, t, e, o) {
1666
1666
  descriptionKey: `gis.layer.${i}.${r}.description`
1667
1667
  };
1668
1668
  }
1669
- function $o(i, t) {
1669
+ function No(i, t) {
1670
1670
  if (!i) return { featureType: "building" };
1671
1671
  const e = i.grundflaeche ?? i.gbf ?? i.gebaeudegrundrissflaeche ?? i.flaeche ?? void 0, o = i.vollgeschosse ?? i.geschossanzahl ?? i.anzahl_geschosse ?? void 0, r = i.gebaeudefunktion ?? i.gfkode ?? i.art ?? i.objektart ?? void 0, s = i.baujahr ?? i.bauperiode ?? void 0, a = String(i.egid ?? i.gwr_egid ?? i.egris_egid ?? "").trim() || void 0;
1672
1672
  return {
@@ -1711,7 +1711,7 @@ function Go(i) {
1711
1711
  }
1712
1712
  function Ho(i) {
1713
1713
  if (!i) return { featureType: "zone" };
1714
- const t = i.plannavn ?? i.bezeichnung ?? i.typ_bezeichnung ?? i.art ?? void 0, e = i.planid ?? i.plannummer ?? void 0, o = i.artcode ?? i.typ_code ?? i.abkuerzung ?? e ?? void 0, r = i.rechtsstatus ?? i.status ?? void 0, s = he(r), a = i.typ_gde_bezeichnung ?? void 0, n = de(a), p = i.dagsordenpunkt_url ?? i.dokument_url ?? i.link ?? void 0, c = i.auflagedatum ?? void 0, h = i.festsetzungsdatum ?? void 0, d = i.genehmigungsdatum ?? void 0, g = i.inkraftsetzungsdatum ?? void 0, w = i.flaeche ?? i.flaeche_m2 ?? void 0;
1714
+ const t = i.plannavn ?? i.bezeichnung ?? i.typ_bezeichnung ?? i.art ?? void 0, e = i.planid ?? i.plannummer ?? void 0, o = i.artcode ?? i.typ_code ?? i.abkuerzung ?? e ?? void 0, r = i.rechtsstatus ?? i.status ?? void 0, s = he(r), a = i.typ_gde_bezeichnung ?? void 0, n = de(a), p = i.dagsordenpunkt_url ?? i.dokument_url ?? i.link ?? void 0, c = i.auflagedatum ?? void 0, h = i.festsetzungsdatum ?? void 0, d = i.genehmigungsdatum ?? void 0, g = i.inkraftsetzungsdatum ?? void 0, u = i.flaeche ?? i.flaeche_m2 ?? void 0;
1715
1715
  return {
1716
1716
  featureType: "zone",
1717
1717
  zoneType: t ? String(t) : void 0,
@@ -1724,7 +1724,7 @@ function Ho(i) {
1724
1724
  fixingDate: h ?? void 0,
1725
1725
  approvalDate: d ?? void 0,
1726
1726
  effectiveFrom: g ?? void 0,
1727
- areaM2: typeof w == "number" ? w : void 0
1727
+ areaM2: typeof u == "number" ? u : void 0
1728
1728
  };
1729
1729
  }
1730
1730
  function Wo(i) {
@@ -1752,7 +1752,7 @@ class ot {
1752
1752
  }
1753
1753
  async listFeatureCategoryDescriptors(t) {
1754
1754
  const e = await this.listAvailableLayers(t);
1755
- return [...new Map(e.map((o) => [o.category, S(o.category)])).values()];
1755
+ return [...new Map(e.map((o) => [o.category, T(o.category)])).values()];
1756
1756
  }
1757
1757
  async listAvailableLayers(t) {
1758
1758
  const e = Object.entries(this.categoryMap);
@@ -1821,7 +1821,7 @@ class ot {
1821
1821
  return g.json();
1822
1822
  }
1823
1823
  toGisFeature(t, e, o) {
1824
- const [r, s] = Uo(t.geometry), a = Mo(t.properties, `${e.sourceLayerId}[${o}]`), n = t.bbox ? [t.bbox[0], t.bbox[1], t.bbox[2], t.bbox[3]] : void 0, p = e.tier, c = p === "priority" ? this._extractNormalisedProperties(t, e) : void 0;
1824
+ const [r, s] = Uo(t.geometry), a = zo(t.properties, `${e.sourceLayerId}[${o}]`), n = t.bbox ? [t.bbox[0], t.bbox[1], t.bbox[2], t.bbox[3]] : void 0, p = e.tier, c = p === "priority" ? this._extractNormalisedProperties(t, e) : void 0;
1825
1825
  return {
1826
1826
  id: t.id ?? `${e.sourceLayerId}/${o}`,
1827
1827
  preferredColor: e.preferredColor,
@@ -1842,7 +1842,7 @@ class ot {
1842
1842
  };
1843
1843
  }
1844
1844
  _extractNormalisedProperties(t, e) {
1845
- return e.category === "building" ? $o(t.properties, this.sourceId) : e.category === "greenspace" ? Bo(t.properties) : e.category === "paved" ? Go(t.properties) : e.category === "zone" ? Ho(t.properties) : Fo(t.properties, this.sourceId);
1845
+ return e.category === "building" ? No(t.properties, this.sourceId) : e.category === "greenspace" ? Bo(t.properties) : e.category === "paved" ? Go(t.properties) : e.category === "zone" ? Ho(t.properties) : Fo(t.properties, this.sourceId);
1846
1846
  }
1847
1847
  }
1848
1848
  const ge = [8, 54.5, 15.2, 57.8], ue = {
@@ -1888,14 +1888,14 @@ function Ko(i, t) {
1888
1888
  if (typeof i[e] == "string" && i[e]) return i[e];
1889
1889
  return t;
1890
1890
  }
1891
- function Qo(i, t, e) {
1891
+ function Xo(i, t, e) {
1892
1892
  return `${i}:${t}:${e}`;
1893
1893
  }
1894
- const Xo = /* @__PURE__ */ new Set(["building", "cadastre", "zone"]);
1894
+ const Qo = /* @__PURE__ */ new Set(["building", "cadastre", "zone"]);
1895
1895
  function rt(i, t, e) {
1896
- const o = e.typename.replace(/^[^:]+:/, ""), r = S(t), s = Xo.has(t) ? "priority" : "raw";
1896
+ const o = e.typename.replace(/^[^:]+:/, ""), r = T(t), s = Qo.has(t) ? "priority" : "raw";
1897
1897
  return {
1898
- id: Qo(i, e.source, e.typename),
1898
+ id: Xo(i, e.source, e.typename),
1899
1899
  sourceId: i,
1900
1900
  sourceLayerId: e.typename,
1901
1901
  category: t,
@@ -1955,7 +1955,7 @@ class Zo {
1955
1955
  const e = await this.listAvailableLayers(t);
1956
1956
  return [
1957
1957
  ...new Map(
1958
- e.map((o) => [o.category, S(o.category)])
1958
+ e.map((o) => [o.category, T(o.category)])
1959
1959
  ).values()
1960
1960
  ];
1961
1961
  }
@@ -2174,14 +2174,14 @@ class tr {
2174
2174
  * @param bbox [west, south, east, north] in WGS-84 decimal degrees
2175
2175
  */
2176
2176
  async listFeatureCategoryDescriptors(t) {
2177
- const e = this.regions.filter((r) => N(r.coverageBBox, t) && r.supportedCategories).sort((r, s) => (s.priority ?? 0) - (r.priority ?? 0));
2177
+ const e = this.regions.filter((r) => M(r.coverageBBox, t) && r.supportedCategories).sort((r, s) => (s.priority ?? 0) - (r.priority ?? 0));
2178
2178
  if (e.length > 0) {
2179
2179
  const r = /* @__PURE__ */ new Set(), s = [];
2180
2180
  for (const a of e)
2181
2181
  for (const n of a.supportedCategories ?? [])
2182
- r.has(n) || (r.add(n), s.push(S(n)));
2182
+ r.has(n) || (r.add(n), s.push(T(n)));
2183
2183
  for (const a of le)
2184
- r.has(a) || s.push(S(a));
2184
+ r.has(a) || s.push(T(a));
2185
2185
  return Bt(s);
2186
2186
  }
2187
2187
  const o = await this._adapterFor(t).listFeatureCategoryDescriptors(t);
@@ -2235,7 +2235,7 @@ class tr {
2235
2235
  console.log(" • Nominatim (OSM) bbox=[global] priority=-1");
2236
2236
  const r = [
2237
2237
  ...this.regions.filter(
2238
- (n) => N(n.coverageBBox, t) && (!n.supportedCategories || n.supportedCategories.includes(e))
2238
+ (n) => M(n.coverageBBox, t) && (!n.supportedCategories || n.supportedCategories.includes(e))
2239
2239
  ).map((n) => ({
2240
2240
  name: n.name,
2241
2241
  adapter: n.adapter,
@@ -2279,7 +2279,7 @@ class tr {
2279
2279
  async getFeaturesOfCategory(t, e) {
2280
2280
  const r = [
2281
2281
  ...this.regions.filter(
2282
- (d) => N(d.coverageBBox, t) && (!d.supportedCategories || d.supportedCategories.includes(e))
2282
+ (d) => M(d.coverageBBox, t) && (!d.supportedCategories || d.supportedCategories.includes(e))
2283
2283
  ).map((d) => ({ name: d.name, adapter: d.adapter, isNominatim: !1 })),
2284
2284
  { name: "Nominatim (OSM)", adapter: this.nominatim, isNominatim: !0 }
2285
2285
  ], s = await Promise.allSettled(
@@ -2294,8 +2294,8 @@ class tr {
2294
2294
  d.status === "fulfilled" && (d.value.isNominatim ? n.push(...d.value.features) : a.push(...d.value.features));
2295
2295
  const p = rr(a, n), c = /* @__PURE__ */ new Map(), h = [];
2296
2296
  for (const d of p) {
2297
- const g = Gt(d), w = W(d), u = c.get(g);
2298
- (u === void 0 || w > u) && (c.set(g, w), h.push(d));
2297
+ const g = Gt(d), u = W(d), m = c.get(g);
2298
+ (m === void 0 || u > m) && (c.set(g, u), h.push(d));
2299
2299
  }
2300
2300
  return h;
2301
2301
  }
@@ -2305,7 +2305,7 @@ class tr {
2305
2305
  }
2306
2306
  /** Resolve the best adapter for a query bbox (legacy single-adapter routing). */
2307
2307
  _adapterFor(t) {
2308
- return this.regions.filter((o) => N(o.coverageBBox, t)).sort((o, r) => (r.priority ?? 0) - (o.priority ?? 0))[0]?.adapter ?? this.nominatim;
2308
+ return this.regions.filter((o) => M(o.coverageBBox, t)).sort((o, r) => (r.priority ?? 0) - (o.priority ?? 0))[0]?.adapter ?? this.nominatim;
2309
2309
  }
2310
2310
  }
2311
2311
  function W(i) {
@@ -2525,7 +2525,7 @@ class Ht {
2525
2525
  */
2526
2526
  async listProjects() {
2527
2527
  const t = this._requireUser(), e = yt(this._db, It);
2528
- return (await Te(Se(e, Re("members", "array-contains", t), Ae(100)))).docs.map((r) => r.data());
2528
+ return (await Se(Te(e, Re("members", "array-contains", t), Ae(100)))).docs.map((r) => r.data());
2529
2529
  }
2530
2530
  /** Fetch a single project by ID. Returns null if not found. */
2531
2531
  async getProject(t) {
@@ -2626,14 +2626,14 @@ class Wt {
2626
2626
  if (!o.email) throw new Error("User has no e-mail");
2627
2627
  await _t(
2628
2628
  o,
2629
- X.credential(o.email, t)
2629
+ Q.credential(o.email, t)
2630
2630
  ), await Ve(o, e);
2631
2631
  }
2632
2632
  /** Adds (sets) a password for an account that currently only uses SSO. */
2633
2633
  async addPassword(t) {
2634
2634
  const e = this._requireUser();
2635
2635
  if (!e.email) throw new Error("User has no e-mail");
2636
- await Ke(e, X.credential(e.email, t));
2636
+ await Ke(e, Q.credential(e.email, t));
2637
2637
  }
2638
2638
  /** Requests an e-mail change. Sends a verification e-mail to the new address. */
2639
2639
  async updateEmail(t, e) {
@@ -2641,8 +2641,8 @@ class Wt {
2641
2641
  if (!o.email) throw new Error("User e-mail not available");
2642
2642
  await _t(
2643
2643
  o,
2644
- X.credential(o.email, e)
2645
- ), await Qe(o, t), await Xe(o);
2644
+ Q.credential(o.email, e)
2645
+ ), await Xe(o, t), await Qe(o);
2646
2646
  }
2647
2647
  /** Creates a new API key for the current user. */
2648
2648
  async createAPIKey(t) {
@@ -2741,7 +2741,7 @@ function nr() {
2741
2741
  viewEntities: !1
2742
2742
  };
2743
2743
  }
2744
- class Qt {
2744
+ class Xt {
2745
2745
  constructor(t) {
2746
2746
  this._isSuperAdmin = t, this._projectRoles = new k([]), this._orgRole = new k(null), this.privileges = dt(
2747
2747
  [this._projectRoles, this._orgRole, t],
@@ -2790,7 +2790,7 @@ class Qt {
2790
2790
  return o.createProject = e || this._orgRole.get() === "admin", o;
2791
2791
  }
2792
2792
  }
2793
- class Xt {
2793
+ class Qt {
2794
2794
  constructor(t) {
2795
2795
  this._storage = t;
2796
2796
  }
@@ -2829,10 +2829,10 @@ class Xt {
2829
2829
  let c = await n.read();
2830
2830
  for (; !c.done; )
2831
2831
  p.push(c.value), c = await n.read();
2832
- const h = p.reduce((w, u) => w + u.length, 0), d = new Uint8Array(h);
2832
+ const h = p.reduce((u, m) => u + m.length, 0), d = new Uint8Array(h);
2833
2833
  let g = 0;
2834
- for (const w of p)
2835
- d.set(w, g), g += w.length;
2834
+ for (const u of p)
2835
+ d.set(u, g), g += u.length;
2836
2836
  return JSON.parse(new TextDecoder().decode(d));
2837
2837
  } catch (o) {
2838
2838
  if (pr(o)) return;
@@ -2846,10 +2846,10 @@ class Xt {
2846
2846
  let c = await n.read();
2847
2847
  for (; !c.done; )
2848
2848
  p.push(c.value), c = await n.read();
2849
- const h = p.reduce((w, u) => w + u.length, 0), d = new Uint8Array(h);
2849
+ const h = p.reduce((u, m) => u + m.length, 0), d = new Uint8Array(h);
2850
2850
  let g = 0;
2851
- for (const w of p)
2852
- d.set(w, g), g += w.length;
2851
+ for (const u of p)
2852
+ d.set(u, g), g += u.length;
2853
2853
  await st(
2854
2854
  _(this._storage, `${t}/${e}.json.gz`),
2855
2855
  d,
@@ -6270,15 +6270,16 @@ GROUP BY ?iri ?parent`;
6270
6270
  }
6271
6271
  const cr = "https://qlever.dev/api/osm-planet";
6272
6272
  class we {
6273
- constructor(t, e, o = ut, r, s) {
6274
- this._api = t, this._projectId = e, this._queryCache = r, this._graphType = s, this.baseURL = `${o}${e}/`, this.entityInfoMap = this._entityInfoMapComputed, this.entityGraph = this._entityGraph.asReadonly(), this._entityOSMMap.subscribe(() => this._checkPendingOSMFetches()), this._fetchEntityGraph().catch(
6275
- (a) => console.error("[CueProjectEntities] Entity graph fetch failed:", a)
6273
+ constructor(t, e, o = ut, r, s, a = !1) {
6274
+ this._api = t, this._projectId = e, this._queryCache = r, this._graphType = s, this._verbose = a, this.baseURL = `${o}${e}/`, this.entityInfoMap = this._entityInfoMapComputed, this.entityGraph = this._entityGraph.asReadonly(), this._entityOSMMap.subscribe(() => this._checkPendingOSMFetches()), this._fetchEntityGraph().catch(
6275
+ (n) => console.error("[CueProjectEntities] Entity graph fetch failed:", n)
6276
6276
  );
6277
6277
  }
6278
6278
  _api;
6279
6279
  _projectId;
6280
6280
  _queryCache;
6281
6281
  _graphType;
6282
+ _verbose;
6282
6283
  /** Full RDF base URL for this project, e.g. `https://cue.qaecy.com/r/{pid}/` */
6283
6284
  baseURL;
6284
6285
  // ── Internal writable slices ───────────────────────────────────────────────
@@ -6290,6 +6291,8 @@ class we {
6290
6291
  _entityOSMMap = new k({});
6291
6292
  _osmWKTMap = new k({});
6292
6293
  _fetchingOSMIds = /* @__PURE__ */ new Set();
6294
+ /** Cumulative unique entity UUIDs ever passed to request methods (survives cache hits). */
6295
+ _seenIds = /* @__PURE__ */ new Set();
6293
6296
  _entityGraph = new k(void 0);
6294
6297
  // ── Derived signals ────────────────────────────────────────────────────────
6295
6298
  _entityInfoMapComputed = dt(
@@ -6314,12 +6317,19 @@ class we {
6314
6317
  entityIri(t) {
6315
6318
  return `${this.baseURL}${t}`;
6316
6319
  }
6320
+ /** @internal Builds a full resource IRI from a UUID without a SPARQL round-trip. */
6321
+ _resourceIri(t) {
6322
+ return `${this.baseURL}${t}`;
6323
+ }
6324
+ _log(t) {
6325
+ this._verbose && console.debug(`[CueProjectEntities pid=${this._projectId}] ${t}`);
6326
+ }
6317
6327
  /**
6318
6328
  * Resets all entity state and re-fetches the entity graph.
6319
6329
  * Call when the active project changes.
6320
6330
  */
6321
6331
  reset() {
6322
- this._entityDetails.set({}), this._entityDocuments.set({}), this._entityRelationships.set({}), this._entityOSMMap.set({}), this._osmWKTMap.set({}), this._entityGraph.set(void 0), this._fetchingOSMIds.clear(), this._fetchEntityGraph().catch(
6332
+ this._entityDetails.set({}), this._entityDocuments.set({}), this._entityRelationships.set({}), this._entityOSMMap.set({}), this._osmWKTMap.set({}), this._entityGraph.set(void 0), this._fetchingOSMIds.clear(), this._seenIds.clear(), this._fetchEntityGraph().catch(
6323
6333
  (t) => console.error(
6324
6334
  "[CueProjectEntities] Entity graph fetch failed after reset:",
6325
6335
  t
@@ -6334,10 +6344,12 @@ class we {
6334
6344
  * Data is merged into `entityInfoMap` once the SPARQL response arrives.
6335
6345
  */
6336
6346
  requestEntityData(t, e = !1) {
6347
+ for (const a of t) this._seenIds.add(a);
6337
6348
  const o = t.filter(
6338
6349
  (a) => this._entityDetails.get()[a] === void 0
6339
6350
  );
6340
6351
  if (o.length === 0) return;
6352
+ this._log(`requestEntityData: ${o.length} new / ${t.length} requested | cumulative: ${this._seenIds.size} seen`);
6341
6353
  const r = o.map((a) => `r:${a}`).join(" "), s = `PREFIX qcy: <${y.qcy}>
6342
6354
  PREFIX r: <${this.baseURL}>
6343
6355
  SELECT ?id (SAMPLE(?val) AS ?value) (GROUP_CONCAT(DISTINCT STR(?cat); SEPARATOR=";") AS ?categories) ?mentionCount
@@ -6362,7 +6374,7 @@ GROUP BY ?id ?mentionCount`;
6362
6374
  categories: c.categories?.value?.split(";").filter(Boolean) ?? [],
6363
6375
  mentionCount: c.mentionCount ? parseInt(c.mentionCount.value, 10) : void 0
6364
6376
  };
6365
- }), this._entityDetails.set(p);
6377
+ }), this._entityDetails.set(p), this._log(`entityDetails: ${Object.keys(p).length} with metadata / ${this._seenIds.size} seen (cumulative)`);
6366
6378
  }).catch(
6367
6379
  (a) => console.error("[CueProjectEntities] requestEntityData failed:", a)
6368
6380
  );
@@ -6379,6 +6391,8 @@ GROUP BY ?id ?mentionCount`;
6379
6391
  (p) => this._entityOSMMap.get()[p] === void 0
6380
6392
  );
6381
6393
  if (e.length === 0) return;
6394
+ for (const p of t) this._seenIds.add(p);
6395
+ this._log(`requestEntityLocations: ${e.length} new / ${t.length} requested | cumulative: ${this._seenIds.size} seen`);
6382
6396
  const o = { ...this._entityOSMMap.get() };
6383
6397
  for (const p of e) o[p] = { direct: [], indirect: [] };
6384
6398
  this._entityOSMMap.set(o);
@@ -6416,9 +6430,9 @@ WHERE {
6416
6430
  ), n = { ...this._entityOSMMap.get() };
6417
6431
  a.results.bindings.forEach((p) => {
6418
6432
  if (!p.id || !p.osm) return;
6419
- const c = p.id.value, h = p.osm.value, d = p.direct?.value === "true", g = p.rels?.value?.split(";").filter(Boolean) ?? [], w = p.entityUUID?.value, u = n[c] ?? { direct: [], indirect: [] };
6420
- d ? u.direct.push(h) : w && u.indirect.push({ osm: h, viaRels: g, entityUUID: w }), n[c] = u;
6421
- }), this._entityOSMMap.set(n);
6433
+ const c = p.id.value, h = p.osm.value, d = p.direct?.value === "true", g = p.rels?.value?.split(";").filter(Boolean) ?? [], u = p.entityUUID?.value, m = n[c] ?? { direct: [], indirect: [] };
6434
+ d ? m.direct.push(h) : u && m.indirect.push({ osm: h, viaRels: g, entityUUID: u }), n[c] = m;
6435
+ }), this._entityOSMMap.set(n), this._log(`entityOSMMap: ${Object.keys(n).length} with OSM / ${this._seenIds.size} seen (cumulative)`);
6422
6436
  }
6423
6437
  /**
6424
6438
  * Fetches incoming and outgoing relationships for a single entity IRI.
@@ -6500,41 +6514,38 @@ ORDER BY ${t ? "DESC(?count)" : "ASC(?label)"}`;
6500
6514
  async entitiesByCategory(t, e = !1) {
6501
6515
  if (t.length === 0) return [];
6502
6516
  const o = V.getInstance(), r = (p) => p.startsWith("http://") || p.startsWith("https://") ? p : o.expandIRI(p), s = t.map((p) => `<${r(p)}>`).join(" "), a = e ? `PREFIX qcy: <${y.qcy}>
6503
- SELECT ?iri ?id (SAMPLE(?val) AS ?value) (GROUP_CONCAT(DISTINCT STR(?allCat); SEPARATOR=";") AS ?categories)
6517
+ SELECT ?id (SAMPLE(?val) AS ?value) (GROUP_CONCAT(DISTINCT STR(?allCat); SEPARATOR=";") AS ?categories)
6504
6518
  WHERE {
6505
6519
  VALUES ?filterCat { ${s} }
6506
6520
  ?iri a qcy:CanonicalEntity ;
6507
6521
  qcy:hasEntityCategory ?filterCat ;
6508
6522
  qcy:value ?val ;
6509
6523
  qcy:hasEntityCategory ?allCat .
6510
- BIND(REPLACE(STR(?iri), "^.*/([^/]*)$", "$1") AS ?id)
6524
+ BIND(REPLACE(STR(?iri), "^.*/", "") AS ?id)
6511
6525
  }
6512
- GROUP BY ?iri ?id` : `PREFIX qcy: <${y.qcy}>
6513
- SELECT DISTINCT ?iri ?id
6526
+ GROUP BY ?id` : `PREFIX qcy: <${y.qcy}>
6527
+ SELECT DISTINCT ?id
6514
6528
  WHERE {
6515
6529
  VALUES ?filterCat { ${s} }
6516
6530
  ?iri a qcy:CanonicalEntity ;
6517
6531
  qcy:hasEntityCategory ?filterCat .
6518
- BIND(REPLACE(STR(?iri), "^.*/([^/]*)$", "$1") AS ?id)
6532
+ BIND(REPLACE(STR(?iri), "^.*/", "") AS ?id)
6519
6533
  }`;
6520
6534
  return (await this._api.sparql(
6521
6535
  a,
6522
6536
  this._projectId,
6523
6537
  this._graphType
6524
- )).results.bindings.filter((p) => p.iri && p.id).map(
6525
- (p) => e ? {
6526
- iri: p.iri.value,
6527
- uuid: p.id.value,
6538
+ )).results.bindings.filter((p) => p.id).map((p) => {
6539
+ const c = p.id.value, h = { iri: this._resourceIri(c), uuid: c };
6540
+ return e ? {
6541
+ ...h,
6528
6542
  value: p.value?.value ?? "",
6529
6543
  categories: p.categories?.value?.split(";").filter(Boolean) ?? []
6530
- } : {
6531
- iri: p.iri.value,
6532
- uuid: p.id.value
6533
- }
6534
- );
6544
+ } : h;
6545
+ });
6535
6546
  }
6536
- async buildSummaryGraph(t) {
6537
- const e = `PREFIX qcy: <${y.qcy}>
6547
+ async buildSummaryGraph(t, e) {
6548
+ const o = V.getInstance(), r = e ? e.includes("://") ? e : o.expandIRI(e) : void 0, s = r ? ` FILTER(?sourceCat = <${r}> || ?targetCat = <${r}>)` : "", a = `PREFIX qcy: <${y.qcy}>
6538
6549
  SELECT
6539
6550
  ?sourceCat
6540
6551
  ?predicate
@@ -6548,41 +6559,42 @@ WHERE {
6548
6559
  ?s ?predicate ?o .
6549
6560
  FILTER(isIRI(?s) && isIRI(?o))
6550
6561
  FILTER(?predicate != qcy:relatedEntity)
6562
+ ${s}
6551
6563
  }
6552
6564
  GROUP BY ?sourceCat ?predicate ?targetCat
6553
- ORDER BY DESC(?weight)`, o = await this._api.sparql(
6554
- e,
6565
+ ORDER BY DESC(?weight)`, n = await this._api.sparql(
6566
+ a,
6555
6567
  this._projectId,
6556
6568
  this._graphType
6557
- ), r = o.results.bindings.filter(
6558
- (s) => s.sourceCat && s.predicate && s.targetCat
6569
+ ), p = n.results.bindings.filter(
6570
+ (c) => c.sourceCat && c.predicate && c.targetCat
6559
6571
  );
6560
6572
  if (t === "graph") {
6561
- const s = /* @__PURE__ */ new Set(), a = [];
6562
- for (const n of r) {
6563
- const p = n.sourceCat.value, c = n.predicate.value, h = n.targetCat.value, d = parseInt(n.weight.value, 10);
6564
- s.add(p), s.add(h), a.push({ sourceID: p, predicate: c, targetID: h, weight: d });
6573
+ const c = /* @__PURE__ */ new Set(), h = [];
6574
+ for (const d of p) {
6575
+ const g = d.sourceCat.value, u = d.predicate.value, m = d.targetCat.value, f = parseInt(d.weight.value, 10);
6576
+ c.add(g), c.add(m), h.push({ sourceID: g, predicate: u, targetID: m, weight: f });
6565
6577
  }
6566
6578
  return {
6567
- entities: Array.from(s).map((n) => ({ iri: n })),
6568
- relations: a
6579
+ entities: Array.from(c).map((d) => ({ iri: d })),
6580
+ relations: h
6569
6581
  };
6570
6582
  }
6571
6583
  if (t === "md") {
6572
- const s = V.getInstance(), a = r.map((h) => ({
6573
- src: s.compactIRI(h.sourceCat.value),
6574
- pred: s.compactIRI(h.predicate.value),
6575
- tgt: s.compactIRI(h.targetCat.value),
6576
- weight: parseInt(h.weight.value, 10)
6584
+ const c = p.map((u) => ({
6585
+ src: o.compactIRI(u.sourceCat.value),
6586
+ pred: o.compactIRI(u.predicate.value),
6587
+ tgt: o.compactIRI(u.targetCat.value),
6588
+ weight: parseInt(u.weight.value, 10)
6577
6589
  }));
6578
- if (a.length === 0) return "(no results)";
6579
- const n = Math.max(...a.map((h) => h.src.length)), p = Math.max(...a.map((h) => h.pred.length)), c = Math.max(...a.map((h) => h.tgt.length));
6580
- return a.map(
6581
- (h) => `${h.src.padEnd(n)} -> ${h.pred.padEnd(p)} -> ${h.tgt.padEnd(c)} (${h.weight})`
6590
+ if (c.length === 0) return "(no results)";
6591
+ const h = Math.max(...c.map((u) => u.src.length)), d = Math.max(...c.map((u) => u.pred.length)), g = Math.max(...c.map((u) => u.tgt.length));
6592
+ return c.map(
6593
+ (u) => `${u.src.padEnd(h)} -> ${u.pred.padEnd(d)} -> ${u.tgt.padEnd(g)} (${u.weight})`
6582
6594
  ).join(`
6583
6595
  `);
6584
6596
  }
6585
- return o;
6597
+ return n;
6586
6598
  }
6587
6599
  // ── Private helpers ────────────────────────────────────────────────────────
6588
6600
  _computeEntityInfoMap() {
@@ -6597,24 +6609,24 @@ ORDER BY DESC(?weight)`, o = await this._api.sparql(
6597
6609
  const c = t[p], h = r[p];
6598
6610
  let d, g;
6599
6611
  if (h) {
6600
- const w = /* @__PURE__ */ new Set();
6612
+ const u = /* @__PURE__ */ new Set();
6601
6613
  d = h.direct.filter(
6602
- (f) => s[f] !== void 0 && !w.has(f) && !!w.add(f)
6614
+ (f) => s[f] !== void 0 && !u.has(f) && !!u.add(f)
6603
6615
  ).map((f) => ({ osmIRI: f, wkt: s[f] }));
6604
- const u = /* @__PURE__ */ new Map();
6605
- for (const { osm: f, viaRels: E, entityUUID: m } of h.indirect) {
6616
+ const m = /* @__PURE__ */ new Map();
6617
+ for (const { osm: f, viaRels: E, entityUUID: w } of h.indirect) {
6606
6618
  const x = s[f];
6607
6619
  if (x)
6608
6620
  for (const I of E) {
6609
- const v = `${I}:${m}`, b = u.get(v) ?? { geometries: [], entityUUID: m };
6610
- b.geometries.some((C) => C.osmIRI === f) || (b.geometries.push({ osmIRI: f, wkt: x }), u.set(v, b));
6621
+ const v = `${I}:${w}`, b = m.get(v) ?? { geometries: [], entityUUID: w };
6622
+ b.geometries.some((C) => C.osmIRI === f) || (b.geometries.push({ osmIRI: f, wkt: x }), m.set(v, b));
6611
6623
  }
6612
6624
  }
6613
- u.size > 0 && (g = Array.from(u.entries()).map(
6614
- ([f, { geometries: E, entityUUID: m }]) => ({
6625
+ m.size > 0 && (g = Array.from(m.entries()).map(
6626
+ ([f, { geometries: E, entityUUID: w }]) => ({
6615
6627
  rel: f.split(":")[0],
6616
6628
  geometries: E,
6617
- entityUUID: m
6629
+ entityUUID: w
6618
6630
  })
6619
6631
  ));
6620
6632
  }
@@ -7620,18 +7632,21 @@ const lt = {
7620
7632
  };
7621
7633
  l.AUDIO + "", l.VIDEO + "", l.IMAGE + "", l.TEXT + "", l.MARKUP + "", l.SCRIPT + "", l.DATA + "", l.ARCHIVE + "", l.INSTALLER + "", l.BINARY + "", l.BACKUP + "", l.AUTOMATION + "", l.PRESENTATION + "", l.SPREADSHEET + "", l.FONT + "", l.GEOSPATIAL + "", l.THREE_D + "", l.CAD + "", l.BIM + "", l.PLANNING + "", l.EMAIL + "", l.MULTIMEDIA + "", l.UNKNOWN + "";
7622
7634
  class ct {
7623
- constructor(t, e, o, r = ut, s, a) {
7624
- this._api = t, this._projectId = e, this._queryCache = s, this._graphType = a, this.baseURL = `${r}${e}/`, this._currentLang = o ?? this._api.language, this.documentInfoMap = this._documentInfoMap.asReadonly(), this.projectDocumentsData = this._projectDocumentsData.asReadonly();
7635
+ constructor(t, e, o, r = ut, s, a, n = !1) {
7636
+ this._api = t, this._projectId = e, this._queryCache = s, this._graphType = a, this._verbose = n, this.baseURL = `${r}${e}/`, this._currentLang = o ?? this._api.language, this.documentInfoMap = this._documentInfoMap.asReadonly(), this.projectDocumentsData = this._projectDocumentsData.asReadonly();
7625
7637
  }
7626
7638
  _api;
7627
7639
  _projectId;
7628
7640
  _queryCache;
7629
7641
  _graphType;
7642
+ _verbose;
7630
7643
  /** Full RDF base URL for this project, e.g. `https://cue.qaecy.com/r/{pid}/` */
7631
7644
  baseURL;
7632
7645
  /** Tracks the language for which `_documentInfoMap` is currently populated. */
7633
7646
  _currentLang;
7634
7647
  _documentInfoMap = new k({});
7648
+ /** Cumulative unique document UUIDs ever passed to request methods (survives cache hits). */
7649
+ _seenIds = /* @__PURE__ */ new Set();
7635
7650
  _projectDocumentsData = new k({
7636
7651
  duplicateCount: 0,
7637
7652
  documentsBySuffix: {},
@@ -7647,7 +7662,7 @@ class ct {
7647
7662
  * Follow with `fetchOverview()` once the triplestore is ready.
7648
7663
  */
7649
7664
  reset() {
7650
- this._documentInfoMap.set({}), this._projectDocumentsData.set({
7665
+ this._documentInfoMap.set({}), this._seenIds.clear(), this._projectDocumentsData.set({
7651
7666
  duplicateCount: 0,
7652
7667
  documentsBySuffix: {},
7653
7668
  documentsByContentCategory: {}
@@ -7694,10 +7709,11 @@ class ct {
7694
7709
  * once the SPARQL response arrives.
7695
7710
  */
7696
7711
  requestDocumentData(t) {
7712
+ for (const o of t) this._seenIds.add(o);
7697
7713
  const e = t.filter((o) => this._documentInfoMap.get()[o] === void 0);
7698
- e.length !== 0 && this._fetchDocumentInfoBatch(e).catch(
7714
+ e.length !== 0 && (this._log(`requestDocumentData: ${e.length} new / ${t.length} requested | cumulative: ${this._seenIds.size} seen`), this._fetchDocumentInfoBatch(e).catch(
7699
7715
  (o) => console.error("[CueProjectDocuments] requestDocumentData failed:", o)
7700
- );
7716
+ ));
7701
7717
  }
7702
7718
  /**
7703
7719
  * Promise-based alternative to {@link requestDocumentData} for non-reactive contexts.
@@ -7717,6 +7733,7 @@ class ct {
7717
7733
  */
7718
7734
  async fetchDocumentData(t) {
7719
7735
  const e = this._documentInfoMap.get(), o = t.filter((s) => e[s] === void 0);
7736
+ for (const s of t) this._seenIds.add(s);
7720
7737
  o.length > 0 && await this._fetchDocumentInfoBatch(o);
7721
7738
  const r = this._documentInfoMap.get();
7722
7739
  return Object.fromEntries(
@@ -7734,6 +7751,7 @@ class ct {
7734
7751
  */
7735
7752
  async fetchDocumentDataSimple(t) {
7736
7753
  const e = this._documentInfoMap.get(), o = t.filter((s) => e[s] === void 0);
7754
+ for (const s of t) this._seenIds.add(s);
7737
7755
  o.length > 0 && await this._fetchSimpleDocumentInfoBatch(o);
7738
7756
  const r = this._documentInfoMap.get();
7739
7757
  return Object.fromEntries(
@@ -7801,7 +7819,7 @@ LIMIT 1`;
7801
7819
  const r = t.map(
7802
7820
  (n) => (n.startsWith(".") ? n : `.${n}`).toLowerCase()
7803
7821
  ).map((n) => `"${n}"`).join(" "), s = e ? `PREFIX qcy: <${y.qcy}>
7804
- SELECT ?iri ?id (SAMPLE(?fp) AS ?path) ?suffix (MAX(?sz) AS ?size)
7822
+ SELECT ?id (SAMPLE(?fp) AS ?path) ?suffix (MAX(?sz) AS ?size)
7805
7823
  WHERE {
7806
7824
  VALUES ?suffix { ${r} }
7807
7825
  ?iri a qcy:FileContent ;
@@ -7810,45 +7828,83 @@ WHERE {
7810
7828
  ?loc qcy:suffix ?suffix ;
7811
7829
  qcy:filePath ?fp .
7812
7830
  FILTER NOT EXISTS { ?x qcy:alternativeRepresentation ?iri }
7813
- BIND(REPLACE(STR(?iri), "^.*/([^/]*)$", "$1") AS ?id)
7831
+ BIND(REPLACE(STR(?iri), "^.*/", "") AS ?id)
7814
7832
  }
7815
- GROUP BY ?iri ?id ?suffix` : `PREFIX qcy: <${y.qcy}>
7816
- SELECT DISTINCT ?iri ?id
7833
+ GROUP BY ?id ?suffix` : `PREFIX qcy: <${y.qcy}>
7834
+ SELECT DISTINCT ?id
7817
7835
  WHERE {
7818
7836
  VALUES ?suffix { ${r} }
7819
7837
  ?iri a qcy:FileContent ;
7820
7838
  qcy:hasFileLocation/qcy:suffix ?suffix .
7821
7839
  FILTER NOT EXISTS { ?x qcy:alternativeRepresentation ?iri }
7822
- BIND(REPLACE(STR(?iri), "^.*/([^/]*)$", "$1") AS ?id)
7840
+ BIND(REPLACE(STR(?iri), "^.*/", "") AS ?id)
7823
7841
  }`;
7824
- return (await this._api.sparql(s, this._projectId, this._graphType)).results.bindings.filter((n) => n.iri && n.id).map(
7825
- (n) => e ? {
7826
- iri: n.iri.value,
7827
- uuid: n.id.value,
7842
+ return (await this._api.sparql(s, this._projectId, this._graphType)).results.bindings.filter((n) => n.id).map((n) => {
7843
+ const p = n.id.value, c = { iri: this._resourceIri(p), uuid: p };
7844
+ return e ? {
7845
+ ...c,
7828
7846
  path: n.path?.value ?? "",
7829
7847
  suffix: n.suffix?.value ?? "",
7830
7848
  size: n.size ? parseInt(n.size.value, 10) : 0
7831
- } : {
7832
- iri: n.iri.value,
7833
- uuid: n.id.value
7834
- }
7835
- );
7849
+ } : c;
7850
+ });
7836
7851
  }
7837
7852
  documentsByFileType(t, e = !1) {
7838
7853
  const o = new Set(t), r = Object.values(lt).filter((s) => o.has(s.type)).map((s) => s.suffix);
7839
7854
  return this.documentsBySuffix(r, e);
7840
7855
  }
7856
+ async documentsByContentCategory(t, e = !1) {
7857
+ if (t.length === 0) return [];
7858
+ const o = t.map((a) => `<${a}>`).join(" "), r = e ? `PREFIX qcy: <${y.qcy}>
7859
+ SELECT ?id (SAMPLE(?fp) AS ?path) ?suffix (MAX(?sz) AS ?size)
7860
+ WHERE {
7861
+ VALUES ?cat { ${o} }
7862
+ ?iri a qcy:FileContent ;
7863
+ qcy:hasContentCategory ?cat ;
7864
+ qcy:sizeBytes ?sz ;
7865
+ qcy:hasFileLocation ?loc .
7866
+ ?loc qcy:suffix ?suffix ;
7867
+ qcy:filePath ?fp .
7868
+ FILTER NOT EXISTS { ?x qcy:alternativeRepresentation ?iri }
7869
+ BIND(REPLACE(STR(?iri), "^.*/", "") AS ?id)
7870
+ }
7871
+ GROUP BY ?id ?suffix` : `PREFIX qcy: <${y.qcy}>
7872
+ SELECT DISTINCT ?id
7873
+ WHERE {
7874
+ VALUES ?cat { ${o} }
7875
+ ?iri a qcy:FileContent ;
7876
+ qcy:hasContentCategory ?cat .
7877
+ FILTER NOT EXISTS { ?x qcy:alternativeRepresentation ?iri }
7878
+ BIND(REPLACE(STR(?iri), "^.*/", "") AS ?id)
7879
+ }`;
7880
+ return (await this._api.sparql(r, this._projectId, this._graphType)).results.bindings.filter((a) => a.id).map((a) => {
7881
+ const n = a.id.value, p = { iri: this._resourceIri(n), uuid: n };
7882
+ return e ? {
7883
+ ...p,
7884
+ path: a.path?.value ?? "",
7885
+ suffix: a.suffix?.value ?? "",
7886
+ size: a.size ? parseInt(a.size.value, 10) : 0
7887
+ } : p;
7888
+ });
7889
+ }
7841
7890
  documentsByMime(t, e = !1) {
7842
7891
  const o = new Set(t), r = Object.values(lt).filter((s) => o.has(s.mime)).map((s) => s.suffix);
7843
7892
  return this.documentsBySuffix(r, e);
7844
7893
  }
7845
7894
  // ── Private helpers ────────────────────────────────────────────────────────
7895
+ /** Builds a full resource IRI from a UUID without a SPARQL round-trip. */
7896
+ _resourceIri(t) {
7897
+ return `${this.baseURL}${t}`;
7898
+ }
7899
+ _log(t) {
7900
+ this._verbose && console.debug(`[CueProjectDocuments pid=${this._projectId}] ${t}`);
7901
+ }
7846
7902
  /** Executes the document-info SPARQL query for the given UUIDs, merges results
7847
7903
  * into `documentInfoMap`, and returns the newly fetched entries. */
7848
7904
  async _fetchDocumentInfoBatch(t) {
7849
7905
  const e = t.map((p) => `r:${p}`).join(" "), o = this._api.language, r = `PREFIX qcy: <${y.qcy}>
7850
7906
  PREFIX r: <${this.baseURL}>
7851
- SELECT ?id ?contentIRI ?suffix ?size ?subject ?summary
7907
+ SELECT ?id ?suffix ?size ?subject ?summary
7852
7908
  (SAMPLE(?fp) AS ?path)
7853
7909
  (GROUP_CONCAT(DISTINCT ?tag; SEPARATOR=";") AS ?tags)
7854
7910
  (GROUP_CONCAT(DISTINCT STR(?cat); SEPARATOR=";") AS ?categories)
@@ -7870,14 +7926,14 @@ WHERE {
7870
7926
  OPTIONAL { ?contentIRI qcy:textSummary ?no_lang_summary }
7871
7927
  BIND(COALESCE(?lang_summary, ?no_lang_summary) AS ?summary)
7872
7928
 
7873
- BIND(REPLACE(STR(?contentIRI), "^.*/([^/]*)$", "$1") AS ?id)
7929
+ BIND(REPLACE(STR(?contentIRI), "^.*/", "") AS ?id)
7874
7930
  }
7875
- GROUP BY ?id ?contentIRI ?suffix ?size ?subject ?summary`, s = await this._api.sparql(r, this._projectId), a = { ...this._documentInfoMap.get() }, n = {};
7931
+ GROUP BY ?id ?suffix ?size ?subject ?summary`, s = await this._api.sparql(r, this._projectId), a = { ...this._documentInfoMap.get() }, n = {};
7876
7932
  return s.results.bindings.forEach((p) => {
7877
- if (!p.id || !p.contentIRI) return;
7933
+ if (!p.id) return;
7878
7934
  const c = p.id.value, h = {
7879
7935
  id: c,
7880
- contentIRI: p.contentIRI.value,
7936
+ contentIRI: this._resourceIri(c),
7881
7937
  path: p.path?.value ?? "",
7882
7938
  suffix: p.suffix?.value ?? "",
7883
7939
  size: p.size ? parseInt(p.size.value, 10) : 0,
@@ -7888,28 +7944,28 @@ GROUP BY ?id ?contentIRI ?suffix ?size ?subject ?summary`, s = await this._api.s
7888
7944
  providerId: p.pid?.value
7889
7945
  };
7890
7946
  a[c] = h, n[c] = h;
7891
- }), this._documentInfoMap.set(a), n;
7947
+ }), this._documentInfoMap.set(a), this._log(`fetchDocumentInfoBatch: ${Object.keys(n).length} fetched | cumulative: ${Object.keys(a).length} with metadata / ${this._seenIds.size} seen`), n;
7892
7948
  }
7893
7949
  /** Executes a reduced document-info query (id/path/suffix/size only), merges
7894
7950
  * into `documentInfoMap`, and returns newly fetched entries. */
7895
7951
  async _fetchSimpleDocumentInfoBatch(t) {
7896
7952
  const e = t.map((n) => `r:${n}`).join(" "), o = `PREFIX qcy: <${y.qcy}>
7897
7953
  PREFIX r: <${this.baseURL}>
7898
- SELECT ?id ?contentIRI ?suffix ?size (SAMPLE(?fp) AS ?path)
7954
+ SELECT ?id ?suffix ?size (SAMPLE(?fp) AS ?path)
7899
7955
  WHERE {
7900
7956
  VALUES ?contentIRI { ${e} }
7901
7957
  ?contentIRI qcy:sizeBytes ?size ;
7902
7958
  qcy:hasFileLocation ?loc .
7903
7959
  ?loc qcy:filePath ?fp ;
7904
7960
  qcy:suffix ?suffix .
7905
- BIND(REPLACE(STR(?contentIRI), "^.*/([^/]*)$", "$1") AS ?id)
7961
+ BIND(REPLACE(STR(?contentIRI), "^.*/", "") AS ?id)
7906
7962
  }
7907
- GROUP BY ?id ?contentIRI ?suffix ?size`, r = await this._api.sparql(o, this._projectId, this._graphType), s = { ...this._documentInfoMap.get() }, a = {};
7963
+ GROUP BY ?id ?suffix ?size`, r = await this._api.sparql(o, this._projectId, this._graphType), s = { ...this._documentInfoMap.get() }, a = {};
7908
7964
  return r.results.bindings.forEach((n) => {
7909
7965
  if (!n.id) return;
7910
7966
  const p = n.id.value, c = s[p], h = {
7911
7967
  id: p,
7912
- contentIRI: n.contentIRI?.value ?? c?.contentIRI ?? p,
7968
+ contentIRI: this._resourceIri(p),
7913
7969
  path: n.path?.value ?? c?.path ?? p,
7914
7970
  suffix: n.suffix?.value ?? c?.suffix ?? "",
7915
7971
  size: n.size ? parseInt(n.size.value, 10) : c?.size ?? 0,
@@ -7920,7 +7976,7 @@ GROUP BY ?id ?contentIRI ?suffix ?size`, r = await this._api.sparql(o, this._pro
7920
7976
  providerId: c?.providerId
7921
7977
  };
7922
7978
  s[p] = h, a[p] = h;
7923
- }), this._documentInfoMap.set(s), a;
7979
+ }), this._documentInfoMap.set(s), this._log(`fetchSimpleDocumentInfoBatch: ${Object.keys(a).length} fetched | cumulative: ${Object.keys(s).length} with metadata / ${this._seenIds.size} seen`), a;
7924
7980
  }
7925
7981
  async _fetchDocumentsBySuffix() {
7926
7982
  return this._runDocumentsBySuffixQuery(this._buildDocumentsBySuffixQuery());
@@ -8003,8 +8059,8 @@ WHERE {
8003
8059
  }
8004
8060
  }
8005
8061
  class hr {
8006
- constructor(t, e, { language: o, queryCache: r, rdfBase: s = ut, graphType: a }) {
8007
- this._api = t, this._projectId = e, this.schema = new lr(t, e, o, r, a), this.entities = new we(t, e, s, r, a), this.documents = new ct(t, e, o, s, r, a), this.availableContentCategories = this.schema.availableContentCategories, this.availableEntityCategories = this.schema.availableEntityCategories, this.availableEntityRelationships = this.schema.availableEntityRelationships, this.schemaReady = this.schema.ready, this.entityInfoMap = this.entities.entityInfoMap, this.entityGraph = this.entities.entityGraph, this.documentInfoMap = this.documents.documentInfoMap, this.projectDocumentsData = this.documents.projectDocumentsData, this.searchResults = this._searchResults.asReadonly(), this.documents.fetchOverview().catch((n) => console.error("[CueProjectView] fetchOverview failed:", n));
8062
+ constructor(t, e, { language: o, queryCache: r, rdfBase: s = ut, graphType: a, verbose: n }) {
8063
+ this._api = t, this._projectId = e, this.schema = new lr(t, e, o, r, a), this.entities = new we(t, e, s, r, a, n), this.documents = new ct(t, e, o, s, r, a, n), this.availableContentCategories = this.schema.availableContentCategories, this.availableEntityCategories = this.schema.availableEntityCategories, this.availableEntityRelationships = this.schema.availableEntityRelationships, this.schemaReady = this.schema.ready, this.entityInfoMap = this.entities.entityInfoMap, this.entityGraph = this.entities.entityGraph, this.documentInfoMap = this.documents.documentInfoMap, this.projectDocumentsData = this.documents.projectDocumentsData, this.searchResults = this._searchResults.asReadonly(), this.documents.fetchOverview().catch((p) => console.error("[CueProjectView] fetchOverview failed:", p));
8008
8064
  }
8009
8065
  _api;
8010
8066
  _projectId;
@@ -8125,24 +8181,24 @@ class hr {
8125
8181
  function Yt(i, t) {
8126
8182
  return new Promise((e) => {
8127
8183
  const o = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map();
8128
- for (const m of i)
8129
- o.has(m.contentUUID) || o.set(m.contentUUID, []), o.get(m.contentUUID)?.push(m), r.set(m.locationUUID, m);
8184
+ for (const w of i)
8185
+ o.has(w.contentUUID) || o.set(w.contentUUID, []), o.get(w.contentUUID)?.push(w), r.set(w.locationUUID, w);
8130
8186
  const s = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Map();
8131
- for (const m of t)
8132
- s.has(m.contentUUID) || s.set(m.contentUUID, []), s.get(m.contentUUID)?.push(m), m.locationUUID && a.set(m.locationUUID, m);
8187
+ for (const w of t)
8188
+ s.has(w.contentUUID) || s.set(w.contentUUID, []), s.get(w.contentUUID)?.push(w), w.locationUUID && a.set(w.locationUUID, w);
8133
8189
  const n = [], p = [];
8134
- for (const m of i)
8135
- s.has(m.contentUUID) ? (s.get(m.contentUUID) || []).some((v) => v.locationUUID === m.locationUUID) || p.push(m) : n.push(m);
8190
+ for (const w of i)
8191
+ s.has(w.contentUUID) ? (s.get(w.contentUUID) || []).some((v) => v.locationUUID === w.locationUUID) || p.push(w) : n.push(w);
8136
8192
  const c = [], h = [];
8137
- for (const m of t) {
8138
- const x = o.get(m.contentUUID);
8139
- x ? x.some((v) => v.locationUUID === m.locationUUID) || h.push(m) : c.push(m);
8193
+ for (const w of t) {
8194
+ const x = o.get(w.contentUUID);
8195
+ x ? x.some((v) => v.locationUUID === w.locationUUID) || h.push(w) : c.push(w);
8140
8196
  }
8141
- const d = i.length - n.length - p.length, g = i.length, w = g > 0 ? d / g : 1;
8142
- let u = 0, f = 0;
8143
- for (const m of i)
8144
- f += m.size || 0, (s.get(m.contentUUID) || []).some((v) => v.locationUUID === m.locationUUID) && (u += m.size || 0);
8145
- const E = f > 0 ? u / f : 1;
8197
+ const d = i.length - n.length - p.length, g = i.length, u = g > 0 ? d / g : 1;
8198
+ let m = 0, f = 0;
8199
+ for (const w of i)
8200
+ f += w.size || 0, (s.get(w.contentUUID) || []).some((v) => v.locationUUID === w.locationUUID) && (m += w.size || 0);
8201
+ const E = f > 0 ? m / f : 1;
8146
8202
  e({
8147
8203
  localNotOnRemote: n,
8148
8204
  localNotOnRemotePathOnly: p,
@@ -8150,10 +8206,10 @@ function Yt(i, t) {
8150
8206
  remoteNotOnLocalPathOnly: h,
8151
8207
  syncCount: d,
8152
8208
  totalCount: g,
8153
- syncSize: u,
8209
+ syncSize: m,
8154
8210
  totalSize: f,
8155
8211
  synctPctSize: E,
8156
- synctPctCount: w
8212
+ synctPctCount: u
8157
8213
  });
8158
8214
  });
8159
8215
  }
@@ -8232,7 +8288,7 @@ async function fr() {
8232
8288
  await a.default({ module_or_path: r }), q = a.scan;
8233
8289
  }
8234
8290
  }
8235
- const yr = "qlever", $ = 1e3, mt = "cue:pending:";
8291
+ const yr = "qlever", N = 1e3, mt = "cue:pending:";
8236
8292
  async function wt(i) {
8237
8293
  const { tmpdir: t } = await import(
8238
8294
  /* webpackIgnore: true */
@@ -8318,8 +8374,8 @@ class vr {
8318
8374
  providerId: e.providerId,
8319
8375
  fileContentExists: !1
8320
8376
  }));
8321
- for (let r = 0; r < o.length; r += $)
8322
- await this._postFssBatch(o.slice(r, r + $), e.spaceId);
8377
+ for (let r = 0; r < o.length; r += N)
8378
+ await this._postFssBatch(o.slice(r, r + N), e.spaceId);
8323
8379
  e.verbose && console.info(`Pushed metadata for ${o.length} file(s) ✅`);
8324
8380
  }
8325
8381
  /**
@@ -8347,26 +8403,26 @@ class vr {
8347
8403
  async previewSync(t, e) {
8348
8404
  const { spaceId: o, providerId: r, verbose: s } = e, a = await this._auth.getToken();
8349
8405
  if (!a) throw new Error("Not authenticated. Call cue.auth.signIn() first.");
8350
- const n = await this._getOrCreateGraph(o, a), c = (await this._projects.getProject(o))?.projectSettings?.tier ?? "l", [h, d, g, w] = await Promise.all([
8406
+ const n = await this._getOrCreateGraph(o, a), c = (await this._projects.getProject(o))?.projectSettings?.tier ?? "l", [h, d, g, u] = await Promise.all([
8351
8407
  this._listRemoteFiles(n, o, r, s),
8352
8408
  this._api?.getConsumption(o) ?? Promise.reject(new Error("CueSyncApi is not bound to a CueApi instance")),
8353
8409
  this._fetchUnitCreditMap(s),
8354
8410
  this._fetchTierNames()
8355
8411
  ]), f = (await Yt(t, h)).localNotOnRemote ?? [], E = f.length > 0 ? await this.scanCost(f) : [];
8356
- let m = 0, x = 0;
8412
+ let w = 0, x = 0;
8357
8413
  for (const v of E) {
8358
- m += v.units;
8414
+ w += v.units;
8359
8415
  const b = g[c], C = b?.[v.ext] ?? 1;
8360
8416
  s && b && !(v.ext in b) && console.info(` Unknown format: .${v.ext} (using default rate of 1 credit/unit)`);
8361
8417
  const P = v.units * C;
8362
8418
  x += P, v.credits = Math.round(P);
8363
8419
  }
8364
- const I = w[c] ?? c;
8420
+ const I = u[c] ?? c;
8365
8421
  return {
8366
8422
  costRecords: E,
8367
8423
  tier: c,
8368
8424
  tierName: I,
8369
- unitsToConsume: m,
8425
+ unitsToConsume: w,
8370
8426
  creditsToConsume: Math.round(x),
8371
8427
  creditsAvailable: d.creditsAvailable,
8372
8428
  unitsAvailable: d.unitsAvailable,
@@ -8384,17 +8440,17 @@ class vr {
8384
8440
  const [d, g] = await Promise.all([
8385
8441
  this._listRemoteFiles(h, o, r, a),
8386
8442
  this._api?.getConsumption(o) ?? Promise.reject(new Error("CueSyncApi is not bound to a CueApi instance"))
8387
- ]), { unitsAvailable: w } = g, u = await Yt(t, d);
8443
+ ]), { unitsAvailable: u } = g, m = await Yt(t, d);
8388
8444
  a && (console.info(`Total local files: ${t.length}`), console.info(`Total remote files: ${d.length}`), console.info(
8389
- `Total files to sync: ${(u.localNotOnRemote?.length ?? 0) + u.localNotOnRemotePathOnly.length}`
8445
+ `Total files to sync: ${(m.localNotOnRemote?.length ?? 0) + m.localNotOnRemotePathOnly.length}`
8390
8446
  ));
8391
- let f = u.syncCount, E = u.syncSize, m = 0, x = !1;
8392
- const I = u.localNotOnRemote ?? [];
8447
+ let f = m.syncCount, E = m.syncSize, w = 0, x = !1;
8448
+ const I = m.localNotOnRemote ?? [];
8393
8449
  if (I.length > 0) {
8394
8450
  const C = (await this.scanCost(I)).reduce((P, ye) => P + ye.units, 0);
8395
- if (C > w)
8451
+ if (C > u)
8396
8452
  throw new Error(
8397
- `Insufficient units: ${C} units required but only ${w} available.`
8453
+ `Insufficient units: ${C} units required but only ${u} available.`
8398
8454
  );
8399
8455
  }
8400
8456
  await this._initPendingBatch(o, a), a && I.length && console.info("Syncing missing files ⏳");
@@ -8419,27 +8475,27 @@ class vr {
8419
8475
  size: b.size,
8420
8476
  providerId: r,
8421
8477
  fileContentExists: !1
8422
- }), x = !0, f += 1, E += b.size || 0, this._logProgress(f, u.totalCount, E, u.totalSize, n);
8478
+ }), x = !0, f += 1, E += b.size || 0, this._logProgress(f, m.totalCount, E, m.totalSize, n);
8423
8479
  } catch (C) {
8424
- m += 1, console.error(`[CueSyncApi] Failed to upload file: ${b.fullPath}`), a && console.error("[CueSyncApi] Upload error details:", C);
8480
+ w += 1, console.error(`[CueSyncApi] Failed to upload file: ${b.fullPath}`), a && console.error("[CueSyncApi] Upload error details:", C);
8425
8481
  }
8426
- a && u.localNotOnRemotePathOnly.length && console.info(`Syncing missing file locations (on provider "${r}") ⏳`);
8427
- for (const b of u.localNotOnRemotePathOnly)
8482
+ a && m.localNotOnRemotePathOnly.length && console.info(`Syncing missing file locations (on provider "${r}") ⏳`);
8483
+ for (const b of m.localNotOnRemotePathOnly)
8428
8484
  await this._queueFileLocation({
8429
8485
  relativePath: b.relativePath,
8430
8486
  md5: b.md5,
8431
8487
  size: b.size,
8432
8488
  providerId: r,
8433
8489
  fileContentExists: !0
8434
- }), x = !0, f += 1, E += b.size || 0, this._logProgress(f, u.totalCount, E, u.totalSize, n);
8490
+ }), x = !0, f += 1, E += b.size || 0, this._logProgress(f, m.totalCount, E, m.totalSize, n);
8435
8491
  await this._drainPending(a), this._stopFlushTimer();
8436
8492
  const v = await (this._api?.getConsumption(o) ?? Promise.resolve({ creditsAvailable: 0 }));
8437
8493
  return {
8438
8494
  syncCount: f,
8439
8495
  syncSize: E,
8440
- failedUploads: m,
8441
- totalCount: u.totalCount,
8442
- totalSize: u.totalSize,
8496
+ failedUploads: w,
8497
+ totalCount: m.totalCount,
8498
+ totalSize: m.totalSize,
8443
8499
  rdfWritten: x,
8444
8500
  creditsAvailable: v.creditsAvailable
8445
8501
  };
@@ -8551,8 +8607,8 @@ WHERE {
8551
8607
  const r = [...t];
8552
8608
  this._pendingSpaceId === e && (this._pendingItems = []), await br(e);
8553
8609
  try {
8554
- for (let s = 0; s < r.length; s += $)
8555
- await this._postFssBatch(r.slice(s, s + $), e);
8610
+ for (let s = 0; s < r.length; s += N)
8611
+ await this._postFssBatch(r.slice(s, s + N), e);
8556
8612
  o && console.info(`Wrote ${r.length} file location(s) to commands API ✅`);
8557
8613
  } catch (s) {
8558
8614
  const a = [...r, ...this._pendingItems];
@@ -8629,7 +8685,7 @@ WHERE {
8629
8685
  console.info(`[computeCredits] all resolved — ${p.length} ext(s), creditsAvailable: ${h.creditsAvailable}`);
8630
8686
  let d = 0;
8631
8687
  for (const g of p) {
8632
- const u = c[r]?.[g.ext] ?? 1, f = g.units * u;
8688
+ const m = c[r]?.[g.ext] ?? 1, f = g.units * m;
8633
8689
  d += f, g.credits = Math.round(f);
8634
8690
  }
8635
8691
  return {
@@ -8736,6 +8792,7 @@ class fe {
8736
8792
  _storageProcessed;
8737
8793
  _gis = null;
8738
8794
  _projectDocuments = /* @__PURE__ */ new Map();
8795
+ _verbose;
8739
8796
  /**
8740
8797
  * Reactive GIS service. Lazily constructed on first access.
8741
8798
  *
@@ -8758,16 +8815,16 @@ class fe {
8758
8815
  "Using default SDK app settings. Contact QAECY for your own configuration for any production code."
8759
8816
  );
8760
8817
  const o = t.apiKey ?? Z.apiKey, r = t.appId ?? Z.appId, s = t.measurementId ?? Z.measurementId, a = t.environment ?? "production";
8761
- this._endpoints = { ...oe[a], ...t.endpoints }, this._isEmulator = a === "emulator", this._app = be().find((g) => g.name === "[DEFAULT]") ?? ve({
8818
+ this._endpoints = { ...oe[a], ...t.endpoints }, this._isEmulator = a === "emulator", this._verbose = t.verbose ?? !1, this._app = be().find((g) => g.name === "[DEFAULT]") ?? ve({
8762
8819
  apiKey: o,
8763
8820
  appId: r,
8764
8821
  measurementId: s,
8765
8822
  authDomain: `${xt}.firebaseapp.com`,
8766
8823
  projectId: xt,
8767
8824
  messagingSenderId: oo
8768
- }), this.auth = new Ut(this._app, this._isEmulator, this._endpoints), this.projects = new Ht(this.auth, this._app, this._isEmulator, this._endpoints), this._storageRaw = T(this._app, Tt), this._storageProcessed = T(this._app, St);
8769
- const n = T(this._app, At), p = T(this._app, Rt), c = T(this._app, Ct), h = T(this._app, Pt);
8770
- this._isEmulator && (Q(this._storageRaw, this._endpoints.storageEmulatorHost, this._endpoints.storageEmulatorPort), Q(this._storageProcessed, this._endpoints.storageEmulatorHost, this._endpoints.storageEmulatorPort)), this.api = this._buildApi(this.projects);
8825
+ }), this.auth = new Ut(this._app, this._isEmulator, this._endpoints), this.projects = new Ht(this.auth, this._app, this._isEmulator, this._endpoints), this._storageRaw = S(this._app, St), this._storageProcessed = S(this._app, Tt);
8826
+ const n = S(this._app, At), p = S(this._app, Rt), c = S(this._app, Ct), h = S(this._app, Pt);
8827
+ this._isEmulator && (X(this._storageRaw, this._endpoints.storageEmulatorHost, this._endpoints.storageEmulatorPort), X(this._storageProcessed, this._endpoints.storageEmulatorHost, this._endpoints.storageEmulatorPort)), this.api = this._buildApi(this.projects);
8771
8828
  const d = new kt({
8772
8829
  storageRaw: this._storageRaw,
8773
8830
  storageProcessed: this._storageProcessed,
@@ -8776,12 +8833,12 @@ class fe {
8776
8833
  storageChatSessions: c,
8777
8834
  storagePersistence: h
8778
8835
  });
8779
- this.storage = new Mt(d), this.profile = new Wt(
8836
+ this.storage = new zt(d), this.profile = new Wt(
8780
8837
  this.auth,
8781
8838
  this._app,
8782
8839
  this._isEmulator,
8783
8840
  this._endpoints.gatewayUrl
8784
- ), this.privileges = new Qt(this.auth.isSuperAdmin), this._isEmulator && Q(h, this._endpoints.storageEmulatorHost, this._endpoints.storageEmulatorPort), this.cache = new Xt(h);
8841
+ ), this.privileges = new Xt(this.auth.isSuperAdmin), this._isEmulator && X(h, this._endpoints.storageEmulatorHost, this._endpoints.storageEmulatorPort), this.cache = new Qt(h);
8785
8842
  }
8786
8843
  /**
8787
8844
  * Create a `Cue` instance from an already-initialized Firebase app.
@@ -8800,17 +8857,17 @@ class fe {
8800
8857
  * });
8801
8858
  */
8802
8859
  static fromApp(t, e = {}) {
8803
- const o = e.environment ?? "production", r = { ...oe[o], ...e.endpoints }, s = new Ut(t, !1, r), a = new Ht(s, t, !1, r), n = T(t, Tt), p = T(t, St), c = T(t, At), h = T(t, Rt), d = T(t, Ct), g = T(t, Pt), w = new kt({
8860
+ const o = e.environment ?? "production", r = { ...oe[o], ...e.endpoints }, s = new Ut(t, !1, r), a = new Ht(s, t, !1, r), n = S(t, St), p = S(t, Tt), c = S(t, At), h = S(t, Rt), d = S(t, Ct), g = S(t, Pt), u = new kt({
8804
8861
  storageRaw: n,
8805
8862
  storageProcessed: p,
8806
8863
  storagePublic: c,
8807
8864
  storageLogs: h,
8808
8865
  storageChatSessions: d,
8809
8866
  storagePersistence: g
8810
- }), u = new vr(s, a, w, r.gatewayUrl), f = new zt(s, r.gatewayUrl, a, u);
8811
- u._bindApi(f);
8812
- const E = new Wt(s, t, !1, r.gatewayUrl), m = Object.create(fe.prototype), x = new Qt(s.isSuperAdmin), I = new Xt(g), v = new Mt(w);
8813
- return Object.assign(m, {
8867
+ }), m = new vr(s, a, u, r.gatewayUrl), f = new $t(s, r.gatewayUrl, a, m);
8868
+ m._bindApi(f);
8869
+ const E = new Wt(s, t, !1, r.gatewayUrl), w = Object.create(fe.prototype), x = new Xt(s.isSuperAdmin), I = new Qt(g), v = new zt(u);
8870
+ return Object.assign(w, {
8814
8871
  _app: t,
8815
8872
  _endpoints: r,
8816
8873
  _isEmulator: o === "emulator",
@@ -8823,11 +8880,11 @@ class fe {
8823
8880
  privileges: x,
8824
8881
  cache: I,
8825
8882
  storage: v
8826
- }), m;
8883
+ }), w;
8827
8884
  }
8828
8885
  /** Override in subclasses to provide a custom CueApi (e.g. with sync). */
8829
8886
  _buildApi(t) {
8830
- return new zt(this.auth, this._endpoints.gatewayUrl, t);
8887
+ return new $t(this.auth, this._endpoints.gatewayUrl, t);
8831
8888
  }
8832
8889
  /** Convenience: get the current user's Firebase ID token */
8833
8890
  getToken(t = !1) {
@@ -8852,7 +8909,7 @@ class fe {
8852
8909
  get: (r) => this.cache.getQueryCache(t, r).then((s) => s?.results),
8853
8910
  set: (r, s) => this.cache.setQueryCache(t, r, { query: r, results: s })
8854
8911
  };
8855
- return new hr(this.api, t, { ...e, queryCache: o });
8912
+ return new hr(this.api, t, { verbose: this._verbose, ...e, queryCache: o });
8856
8913
  }
8857
8914
  /**
8858
8915
  * Creates a `CueProjectEntities` instance for the given project, with the
@@ -8881,7 +8938,8 @@ class fe {
8881
8938
  t,
8882
8939
  e?.rdfBase,
8883
8940
  o,
8884
- e?.graphType
8941
+ e?.graphType,
8942
+ e?.verbose ?? this._verbose
8885
8943
  );
8886
8944
  }
8887
8945
  /**
@@ -8912,7 +8970,8 @@ class fe {
8912
8970
  this.api.language,
8913
8971
  void 0,
8914
8972
  a,
8915
- void 0
8973
+ void 0,
8974
+ e?.verbose ?? this._verbose
8916
8975
  );
8917
8976
  return this._projectDocuments.set(t, n), n;
8918
8977
  }
@@ -8926,7 +8985,8 @@ class fe {
8926
8985
  e?.language ?? this.api.language,
8927
8986
  e?.rdfBase,
8928
8987
  r,
8929
- e?.graphType
8988
+ e?.graphType,
8989
+ e?.verbose ?? this._verbose
8930
8990
  );
8931
8991
  }
8932
8992
  }
@@ -8934,12 +8994,12 @@ export {
8934
8994
  Ct as B,
8935
8995
  fe as C,
8936
8996
  Kt as R,
8937
- zt as a,
8997
+ $t as a,
8938
8998
  Ut as b,
8939
- Xt as c,
8999
+ Qt as c,
8940
9000
  bo as d,
8941
9001
  ir as e,
8942
- Qt as f,
9002
+ Xt as f,
8943
9003
  Wt as g,
8944
9004
  ct as h,
8945
9005
  we as i,
@@ -8947,7 +9007,7 @@ export {
8947
9007
  hr as k,
8948
9008
  Ht as l,
8949
9009
  k as m,
8950
- Mt as n,
9010
+ zt as n,
8951
9011
  vr as o,
8952
9012
  fo as p,
8953
9013
  Lr as q,