@puzzmo/sdk 1.0.6 → 1.0.8

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.
@@ -541,7 +541,7 @@ var S = "simulator-saved-states";
541
541
  /**
542
542
  * Find thumbnail function on globalThis (looks for functions ending in "Thumbnail")
543
543
  */
544
- function ie() {
544
+ function C() {
545
545
  let e = globalThis;
546
546
  for (let t of Object.keys(e)) if (t.endsWith("Thumbnail") && typeof e[t] == "function") return {
547
547
  name: t,
@@ -552,8 +552,8 @@ function ie() {
552
552
  /**
553
553
  * Generate a small thumbnail SVG for a given input string
554
554
  */
555
- function C(e, t) {
556
- let n = ie();
555
+ function w(e, t) {
556
+ let n = C();
557
557
  if (!n) return "";
558
558
  try {
559
559
  let r = e.state.puzzleData ? JSON.stringify(e.state.puzzleData) : "", i = {
@@ -567,14 +567,14 @@ function C(e, t) {
567
567
  return "";
568
568
  }
569
569
  }
570
- var w = [];
571
- function T(e, t = 8) {
570
+ var T = [];
571
+ function E(e, t = 8) {
572
572
  let n = 14 * t + 8 + 4;
573
573
  e.style.height = "auto";
574
574
  let r = Math.min(Math.max(e.scrollHeight, 40), n);
575
575
  e.style.height = `${r}px`;
576
576
  }
577
- function ae() {
577
+ function ie() {
578
578
  let e = "", t = "";
579
579
  return {
580
580
  id: "data",
@@ -592,22 +592,22 @@ function ae() {
592
592
  let i = n.getElement(".data-view-container");
593
593
  i == null || i.querySelectorAll(".data-subtab-content").forEach((e) => {
594
594
  e.classList.toggle("active", e.id === `data-subtab-${t}`);
595
- }), t === "edit" ? A(n) : t === "history" ? D(n) : t === "saves" && O(n);
595
+ }), t === "edit" ? j(n) : t === "history" ? O(n) : t === "saves" && k(n);
596
596
  });
597
597
  });
598
598
  let i = n.getElement("#simulator-puzzle"), a = n.getElement("#simulator-input"), o = n.getElement("#simulator-puzzle-reset"), s = n.getElement("#simulator-puzzle-apply"), c = n.getElement("#simulator-input-reset"), l = n.getElement("#simulator-input-apply"), u = n.getElement("#simulator-start"), d = n.getElement("#simulator-pause");
599
599
  setTimeout(() => {
600
- i && n.state.originalPuzzle && (i.value = n.state.originalPuzzle, e = n.state.originalPuzzle, T(i)), a && n.state.currentInputStr && (a.value = n.state.currentInputStr, t = n.state.currentInputStr, T(a));
600
+ i && n.state.originalPuzzle && (i.value = n.state.originalPuzzle, e = n.state.originalPuzzle, E(i)), a && n.state.currentInputStr && (a.value = n.state.currentInputStr, t = n.state.currentInputStr, E(a));
601
601
  }, 0), i == null || i.addEventListener("input", () => {
602
- T(i);
602
+ E(i);
603
603
  let t = i.value !== e;
604
604
  s && (s.disabled = !t);
605
605
  }), a == null || a.addEventListener("input", () => {
606
- T(a);
606
+ E(a);
607
607
  let e = a.value !== t;
608
608
  l && (l.disabled = !e);
609
609
  }), o == null || o.addEventListener("click", () => {
610
- i && (i.value = n.state.originalPuzzle, e = n.state.originalPuzzle, T(i), s && (s.disabled = !0));
610
+ i && (i.value = n.state.originalPuzzle, e = n.state.originalPuzzle, E(i), s && (s.disabled = !0));
611
611
  }), s == null || s.addEventListener("click", () => {
612
612
  if (i) try {
613
613
  let t = JSON.parse(i.value);
@@ -616,47 +616,47 @@ function ae() {
616
616
  console.error("Simulator: Invalid puzzle JSON", e), n.updateStatus("Invalid JSON", "paused");
617
617
  }
618
618
  }), c == null || c.addEventListener("click", () => {
619
- a && (a.value = t, T(a), l && (l.disabled = !0));
619
+ a && (a.value = t, E(a), l && (l.disabled = !0));
620
620
  }), l == null || l.addEventListener("click", () => {
621
621
  a && (n.state.currentInputStr = a.value, t = a.value, console.log("Simulator: Input string updated (game restart required to apply)"), n.updateStatus("Input stored", "ready"), l.disabled = !0);
622
622
  });
623
623
  let f = n.getElement("#simulator-history-clear");
624
624
  f == null || f.addEventListener("click", () => {
625
- w = [], D(n);
625
+ T = [], O(n);
626
626
  });
627
627
  let p = n.getElement("#simulator-save-name"), m = n.getElement("#simulator-save-btn");
628
628
  m == null || m.addEventListener("click", () => {
629
629
  if (!p || !p.value.trim()) return;
630
- let e = E(), t = {
630
+ let e = D(), t = {
631
631
  name: p.value.trim(),
632
632
  puzzleStr: n.state.originalPuzzle,
633
633
  inputStr: n.state.currentInputStr,
634
634
  timestamp: Date.now()
635
635
  };
636
- e.push(t), localStorage.setItem(S, JSON.stringify(e)), p.value = "", O(n);
637
- }), O(n);
636
+ e.push(t), localStorage.setItem(S, JSON.stringify(e)), p.value = "", k(n);
637
+ }), k(n);
638
638
  },
639
639
  onActivate(n) {
640
- e = n.state.originalPuzzle, t = n.state.currentInputStr, A(n), D(n);
640
+ e = n.state.originalPuzzle, t = n.state.currentInputStr, j(n), O(n);
641
641
  },
642
642
  onMessage(e, n, r) {
643
643
  var i, a;
644
644
  let o = r.getElement("#simulator-input"), s = r.getElement("#simulator-input-apply"), c = (i = n == null || (a = n.input) == null ? void 0 : a.boardState) == null ? n == null ? void 0 : n.boardState : i;
645
645
  if (e === "UPLOAD_NEW_GAME_STATE" && c) {
646
- if (r.state.currentInputStr = c, w.length === 0 || w[w.length - 1].value !== c) {
647
- w.push({
646
+ if (r.state.currentInputStr = c, T.length === 0 || T[T.length - 1].value !== c) {
647
+ T.push({
648
648
  value: c,
649
649
  timestamp: Date.now()
650
- }), w.length > 100 && (w = w.slice(-100));
650
+ }), T.length > 100 && (T = T.slice(-100));
651
651
  let e = r.getElement("#data-subtab-history");
652
- e != null && e.classList.contains("active") && D(r);
652
+ e != null && e.classList.contains("active") && O(r);
653
653
  }
654
- o && (o.value = r.state.currentInputStr, t = r.state.currentInputStr, T(o), s && (s.disabled = !0));
654
+ o && (o.value = r.state.currentInputStr, t = r.state.currentInputStr, E(o), s && (s.disabled = !0));
655
655
  }
656
656
  }
657
657
  };
658
658
  }
659
- function E() {
659
+ function D() {
660
660
  try {
661
661
  let e = localStorage.getItem(S);
662
662
  return e ? JSON.parse(e) : [];
@@ -664,35 +664,35 @@ function E() {
664
664
  return [];
665
665
  }
666
666
  }
667
- function D(e) {
667
+ function O(e) {
668
668
  let t = e.getElement("#simulator-history-list");
669
669
  if (t) {
670
- if (t.style.setProperty("--history-thumb-bg", e.state.selectedTheme.a_bg), w.length === 0) {
670
+ if (t.style.setProperty("--history-thumb-bg", e.state.selectedTheme.a_bg), T.length === 0) {
671
671
  t.innerHTML = "<div class=\"simulator-empty\">No history yet</div>";
672
672
  return;
673
673
  }
674
- t.innerHTML = [...w].reverse().map((t, n) => {
675
- let r = w.length - 1 - n, i = new Date(t.timestamp).toLocaleTimeString(), a = t.value.length > 60 ? t.value.slice(0, 60) + "..." : t.value;
674
+ t.innerHTML = [...T].reverse().map((t, n) => {
675
+ let r = T.length - 1 - n, i = new Date(t.timestamp).toLocaleTimeString(), a = t.value.length > 60 ? t.value.slice(0, 60) + "..." : t.value;
676
676
  return `
677
677
  <div class="history-item" data-history-idx="${r}">
678
- <div class="history-item-thumb">${C(e, t.value)}</div>
678
+ <div class="history-item-thumb">${w(e, t.value)}</div>
679
679
  <div class="history-item-content">
680
680
  <div class="history-item-header">
681
681
  <span class="history-item-num">#${r + 1}</span>
682
682
  <span class="history-item-time">${i}</span>
683
683
  <button class="simulator-btn tiny history-restore-btn" data-history-idx="${r}">Restore</button>
684
684
  </div>
685
- <div class="history-item-preview">${k(a)}</div>
685
+ <div class="history-item-preview">${A(a)}</div>
686
686
  </div>
687
687
  </div>
688
688
  `;
689
689
  }).join(""), t.querySelectorAll(".history-restore-btn").forEach((t) => {
690
690
  t.addEventListener("click", (t) => {
691
- let n = parseInt(t.target.getAttribute("data-history-idx") || "0"), r = w[n];
691
+ let n = parseInt(t.target.getAttribute("data-history-idx") || "0"), r = T[n];
692
692
  if (r) {
693
693
  e.state.currentInputStr = r.value;
694
694
  let t = e.getElement("#simulator-input");
695
- t && (t.value = r.value, T(t)), e.updateStatus("Input restored from history", "ready");
695
+ t && (t.value = r.value, E(t)), e.updateStatus("Input restored from history", "ready");
696
696
  let n = e.getElement(".data-subtab[data-subtab=\"edit\"]");
697
697
  n == null || n.click();
698
698
  }
@@ -700,10 +700,10 @@ function D(e) {
700
700
  });
701
701
  }
702
702
  }
703
- function O(e) {
703
+ function k(e) {
704
704
  let t = e.getElement("#simulator-saves-list");
705
705
  if (!t) return;
706
- let n = E();
706
+ let n = D();
707
707
  if (n.length === 0) {
708
708
  t.innerHTML = "<div class=\"simulator-empty\">No saved states</div>";
709
709
  return;
@@ -713,7 +713,7 @@ function O(e) {
713
713
  return `
714
714
  <div class="save-item">
715
715
  <div class="save-item-header">
716
- <span class="save-item-name">${k(e.name)}</span>
716
+ <span class="save-item-name">${A(e.name)}</span>
717
717
  <span class="save-item-time">${i} ${a}</span>
718
718
  </div>
719
719
  <div class="save-item-actions">
@@ -733,7 +733,7 @@ function O(e) {
733
733
  }
734
734
  e.state.currentInputStr = r.inputStr;
735
735
  let t = e.getElement("#simulator-puzzle"), n = e.getElement("#simulator-input");
736
- t && (t.value = r.puzzleStr, T(t)), n && (n.value = r.inputStr, T(n)), e.updateStatus(`Loaded: ${r.name}`, "ready");
736
+ t && (t.value = r.puzzleStr, E(t)), n && (n.value = r.inputStr, E(n)), e.updateStatus(`Loaded: ${r.name}`, "ready");
737
737
  let i = e.getElement(".data-subtab[data-subtab=\"edit\"]");
738
738
  i == null || i.click();
739
739
  }
@@ -741,21 +741,21 @@ function O(e) {
741
741
  }), t.querySelectorAll(".save-delete-btn").forEach((t) => {
742
742
  t.addEventListener("click", (t) => {
743
743
  let r = parseInt(t.target.getAttribute("data-save-idx") || "0"), i = n.filter((e, t) => t !== r);
744
- localStorage.setItem(S, JSON.stringify(i)), O(e);
744
+ localStorage.setItem(S, JSON.stringify(i)), k(e);
745
745
  });
746
746
  });
747
747
  }
748
- function k(e) {
748
+ function A(e) {
749
749
  return e.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
750
750
  }
751
- function A(e) {
751
+ function j(e) {
752
752
  let t = e.getElement("#simulator-puzzle"), n = e.getElement("#simulator-input"), r = e.getElement("#simulator-puzzle-apply"), i = e.getElement("#simulator-input-apply");
753
- t && e.state.originalPuzzle && (t.value = e.state.originalPuzzle, T(t), r && (r.disabled = !0)), n && (n.value = e.state.currentInputStr, T(n), i && (i.disabled = !0));
753
+ t && e.state.originalPuzzle && (t.value = e.state.originalPuzzle, E(t), r && (r.disabled = !0)), n && (n.value = e.state.currentInputStr, E(n), i && (i.disabled = !0));
754
754
  }
755
- function j(e) {
755
+ function M(e) {
756
756
  return e.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
757
757
  }
758
- function oe() {
758
+ function ae() {
759
759
  let e = 0;
760
760
  return {
761
761
  id: "msgs",
@@ -782,7 +782,7 @@ function oe() {
782
782
  <span class="simulator-msg-type">${t.direction === "out" ? "→" : "←"} ${t.type}</span>
783
783
  <span class="simulator-msg-time">${t.time}</span>
784
784
  </div>
785
- ${a ? `<div class="simulator-msg-data">${j(a)}</div>` : ""}
785
+ ${a ? `<div class="simulator-msg-data">${M(a)}</div>` : ""}
786
786
  `;
787
787
  let o = i.querySelector(".simulator-msg-data");
788
788
  for (o && o.addEventListener("click", () => {
@@ -793,7 +793,7 @@ function oe() {
793
793
  }
794
794
  };
795
795
  }
796
- function se() {
796
+ function oe() {
797
797
  return {
798
798
  id: "done",
799
799
  label: "Done",
@@ -826,7 +826,7 @@ function se() {
826
826
  }
827
827
  };
828
828
  }
829
- function ce() {
829
+ function se() {
830
830
  let e = [], t = () => (/* @__PURE__ */ new Date()).toLocaleTimeString("en-US", { hour12: !1 }), n = (e) => {
831
831
  let { checkpointName: t, augConfig: n, time: r } = e, i = n == null ? void 0 : n.deeds;
832
832
  return `
@@ -879,7 +879,7 @@ function ce() {
879
879
  /**
880
880
  * Find thumbnail function on globalThis (looks for functions ending in "Thumbnail")
881
881
  */
882
- function M() {
882
+ function N() {
883
883
  let e = globalThis;
884
884
  for (let t of Object.keys(e)) if (t.endsWith("Thumbnail") && typeof e[t] == "function") return {
885
885
  name: t,
@@ -887,7 +887,7 @@ function M() {
887
887
  };
888
888
  return null;
889
889
  }
890
- function le() {
890
+ function ce() {
891
891
  return {
892
892
  id: "thumb",
893
893
  label: "Thumb",
@@ -912,7 +912,7 @@ function le() {
912
912
  updatePreview: (e) => {
913
913
  let t = e.getElement("#simulator-thumb-preview"), n = e.getElement("#simulator-thumb-fn");
914
914
  t == null || t.style.setProperty("--sim-thumb-bg", e.state.selectedTheme.g_bg);
915
- let r = M();
915
+ let r = N();
916
916
  if (!r) {
917
917
  t && (t.innerHTML = "<span class=\"simulator-empty\">No thumbnail function found</span>"), n && (n.textContent = "");
918
918
  return;
@@ -936,7 +936,7 @@ function le() {
936
936
  /**
937
937
  * Generate theme preview HTML showing key colors
938
938
  */
939
- function N(e) {
939
+ function P(e) {
940
940
  let t = [
941
941
  e.key,
942
942
  e.subBrand,
@@ -947,7 +947,7 @@ function N(e) {
947
947
  ].map((e) => `<div class="simulator-theme-preview-cell" style="background: ${e}"></div>`).join("");
948
948
  return `<div class="simulator-theme-preview" style="background: ${e.g_bg}">${t}</div>`;
949
949
  }
950
- function ue() {
950
+ function le() {
951
951
  return {
952
952
  id: "theme",
953
953
  label: "Theme",
@@ -959,7 +959,7 @@ function ue() {
959
959
  t && n.forEach((n) => {
960
960
  let r = document.createElement("div");
961
961
  r.className = `simulator-theme-item${n.name === e.state.selectedTheme.name ? " selected" : ""}`, r.innerHTML = `
962
- ${N(n)}
962
+ ${P(n)}
963
963
  <div class="simulator-theme-name">${n.name}</div>
964
964
  <div class="simulator-theme-type">${n.type}</div>
965
965
  `, r.addEventListener("click", () => {
@@ -969,42 +969,42 @@ function ue() {
969
969
  }
970
970
  };
971
971
  }
972
- var P = "puzzmo_sim_api_mode", F = "http://localhost:8911", I = "https://api.puzzmo.com", L = () => localStorage.getItem(P) === "dev" ? "dev" : "prod", R = (e) => {
973
- localStorage.setItem(P, e);
974
- }, z = null, B = function() {
972
+ var F = "puzzmo_sim_api_mode", I = "http://localhost:8911", L = "https://api.puzzmo.com", R = () => localStorage.getItem(F) === "dev" ? "dev" : "prod", z = (e) => {
973
+ localStorage.setItem(F, e);
974
+ }, B = null, V = function() {
975
975
  var t = e(function* () {
976
- if (z !== null) return z;
976
+ if (B !== null) return B;
977
977
  try {
978
- let e = new AbortController(), t = setTimeout(() => e.abort(), 1e3), n = yield fetch(`${F}/healthz`, { signal: e.signal });
979
- return clearTimeout(t), z = n.ok, z;
978
+ let e = new AbortController(), t = setTimeout(() => e.abort(), 1e3), n = yield fetch(`${I}/healthz`, { signal: e.signal });
979
+ return clearTimeout(t), B = n.ok, B;
980
980
  } catch (e) {
981
- return z = !1, !1;
981
+ return B = !1, !1;
982
982
  }
983
983
  });
984
984
  return function() {
985
985
  return t.apply(this, arguments);
986
986
  };
987
- }(), V = () => ({
988
- apiURL: L() === "dev" ? F : I,
987
+ }(), H = () => ({
988
+ apiURL: R() === "dev" ? I : L,
989
989
  clientID: "protosdk:oauthclient",
990
990
  redirectUri: `${window.location.origin}/oauth/callback`
991
- }), H = () => {
991
+ }), U = () => {
992
992
  let e = new Uint8Array(32);
993
993
  return crypto.getRandomValues(e), Array.from(e, (e) => e.toString(16).padStart(2, "0")).join("");
994
- }, U = "puzzmo_sim_oauth_token", W = "puzzmo_sim_oauth_refresh_token", G = (e) => localStorage.setItem(U, e), de = (e) => localStorage.setItem(W, e), K = () => {
995
- let e = localStorage.getItem(U);
994
+ }, W = "puzzmo_sim_oauth_token", G = "puzzmo_sim_oauth_refresh_token", K = (e) => localStorage.setItem(W, e), ue = (e) => localStorage.setItem(G, e), q = () => {
995
+ let e = localStorage.getItem(W);
996
996
  return console.log("[AuthView] getAccessToken:", {
997
- TOKEN_KEY: U,
997
+ TOKEN_KEY: W,
998
998
  token: e ? `${e.substring(0, 20)}...` : null
999
999
  }), e;
1000
- }, q = () => localStorage.getItem(W), J = () => {
1001
- localStorage.removeItem(U), localStorage.removeItem(W);
1002
- }, fe = () => {
1003
- let e = V(), t = H();
1000
+ }, J = () => localStorage.getItem(G), Y = () => {
1001
+ localStorage.removeItem(W), localStorage.removeItem(G);
1002
+ }, de = () => {
1003
+ let e = H(), t = U();
1004
1004
  sessionStorage.setItem("oauth_state", t), sessionStorage.setItem("oauth_return_url", window.location.href);
1005
1005
  let n = new URL(`${e.apiURL}/oauth/auth`);
1006
1006
  n.searchParams.set("client_id", e.clientID), n.searchParams.set("response_type", "code"), n.searchParams.set("redirect_uri", e.redirectUri), n.searchParams.set("state", t), window.location.href = n.toString();
1007
- }, pe = (e) => {
1007
+ }, fe = (e) => {
1008
1008
  try {
1009
1009
  let t = e.split(".");
1010
1010
  if (t.length !== 3) return !0;
@@ -1013,11 +1013,11 @@ var P = "puzzmo_sim_api_mode", F = "http://localhost:8911", I = "https://api.puz
1013
1013
  } catch (e) {
1014
1014
  return !0;
1015
1015
  }
1016
- }, me = function() {
1016
+ }, pe = function() {
1017
1017
  var t = e(function* () {
1018
- let e = q();
1018
+ let e = J();
1019
1019
  if (!e) return console.log("[AuthView] No refresh token available"), !1;
1020
- let t = V();
1020
+ let t = H();
1021
1021
  try {
1022
1022
  let n = new URLSearchParams({
1023
1023
  grant_type: "refresh_token",
@@ -1031,9 +1031,9 @@ var P = "puzzmo_sim_api_mode", F = "http://localhost:8911", I = "https://api.puz
1031
1031
  if (!r.ok) return console.error("[AuthView] Failed to refresh token:", r.statusText), !1;
1032
1032
  let i = yield r.json(), a = i.access_token || i.accessToken;
1033
1033
  if (!a) return console.error("[AuthView] No access token in refresh response"), !1;
1034
- G(a);
1034
+ K(a);
1035
1035
  let o = i.refresh_token || i.refreshToken;
1036
- return o && de(o), console.log("[AuthView] Successfully refreshed access token"), !0;
1036
+ return o && ue(o), console.log("[AuthView] Successfully refreshed access token"), !0;
1037
1037
  } catch (e) {
1038
1038
  return console.error("[AuthView] Error refreshing token:", e), !1;
1039
1039
  }
@@ -1041,9 +1041,9 @@ var P = "puzzmo_sim_api_mode", F = "http://localhost:8911", I = "https://api.puz
1041
1041
  return function() {
1042
1042
  return t.apply(this, arguments);
1043
1043
  };
1044
- }(), he = function() {
1044
+ }(), me = function() {
1045
1045
  var t = e(function* (e, t) {
1046
- let n = V(), r = sessionStorage.getItem("oauth_state");
1046
+ let n = H(), r = sessionStorage.getItem("oauth_state");
1047
1047
  if (!r || r !== t) return console.error("OAuth state mismatch - possible CSRF attack"), null;
1048
1048
  sessionStorage.removeItem("oauth_state");
1049
1049
  try {
@@ -1065,13 +1065,13 @@ var P = "puzzmo_sim_api_mode", F = "http://localhost:8911", I = "https://api.puz
1065
1065
  return function(e, n) {
1066
1066
  return t.apply(this, arguments);
1067
1067
  };
1068
- }(), ge = function() {
1068
+ }(), he = function() {
1069
1069
  var t = e(function* (e, t = {}) {
1070
- let n = V(), r = K();
1070
+ let n = H(), r = q();
1071
1071
  if (!r) throw Error("Not authenticated");
1072
- if (pe(r)) if (console.log("[AuthView] Access token expired, attempting refresh..."), yield me()) {
1073
- if (r = K(), !r) throw Error("Token refresh succeeded but no token available");
1074
- } else throw J(), Error("Session expired. Please log in again.");
1072
+ if (fe(r)) if (console.log("[AuthView] Access token expired, attempting refresh..."), yield pe()) {
1073
+ if (r = q(), !r) throw Error("Token refresh succeeded but no token available");
1074
+ } else throw Y(), Error("Session expired. Please log in again.");
1075
1075
  let i = yield fetch(`${n.apiURL}/graphql`, {
1076
1076
  method: "POST",
1077
1077
  headers: {
@@ -1090,7 +1090,7 @@ var P = "puzzmo_sim_api_mode", F = "http://localhost:8911", I = "https://api.puz
1090
1090
  return function(e) {
1091
1091
  return t.apply(this, arguments);
1092
1092
  };
1093
- }(), _e = (e) => {
1093
+ }(), ge = (e) => {
1094
1094
  try {
1095
1095
  console.log("[AuthView] decodeJWT input:", e);
1096
1096
  let t = e.split(".");
@@ -1101,15 +1101,15 @@ var P = "puzzmo_sim_api_mode", F = "http://localhost:8911", I = "https://api.puz
1101
1101
  return console.error("[AuthView] decodeJWT error:", e), null;
1102
1102
  }
1103
1103
  };
1104
- function ve() {
1104
+ function _e() {
1105
1105
  let t = !1;
1106
1106
  return {
1107
1107
  id: "auth",
1108
1108
  label: "Auth",
1109
1109
  render() {
1110
- let e = K(), t = !!e, n = L(), r = n === "dev" ? F : I, i = `<button class="simulator-btn tiny" id="auth-dev-toggle" style="display: none;">${n === "dev" ? "Using Dev" : "Dev"}</button>`;
1110
+ let e = q(), t = !!e, n = R(), r = n === "dev" ? I : L, i = `<button class="simulator-btn tiny" id="auth-dev-toggle" style="display: none;">${n === "dev" ? "Using Dev" : "Dev"}</button>`;
1111
1111
  if (t) {
1112
- let t = _e(e), n = t != null && t.exp ? (/* @__PURE__ */ new Date(t.exp * 1e3)).toLocaleString() : "Unknown", a = !!q(), o = a ? _e(q()) : null, s = o != null && o.exp ? (/* @__PURE__ */ new Date(o.exp * 1e3)).toLocaleString() : null;
1112
+ let t = ge(e), n = t != null && t.exp ? (/* @__PURE__ */ new Date(t.exp * 1e3)).toLocaleString() : "Unknown", a = !!J(), o = a ? ge(J()) : null, s = o != null && o.exp ? (/* @__PURE__ */ new Date(o.exp * 1e3)).toLocaleString() : null;
1113
1113
  return console.log({ decoded: t }), `
1114
1114
  <div class="simulator-section">
1115
1115
  <div class="simulator-section-title auth-title-row">
@@ -1150,7 +1150,7 @@ function ve() {
1150
1150
  </div>
1151
1151
  <p class="auth-description">
1152
1152
  Login with your Puzzmo account to make authenticated API requests.
1153
- ${n === "dev" ? `<br><strong>Using local dev server:</strong> ${F}` : ""}
1153
+ ${n === "dev" ? `<br><strong>Using local dev server:</strong> ${I}` : ""}
1154
1154
  </p>
1155
1155
  <div class="simulator-row">
1156
1156
  <button class="simulator-btn primary" id="auth-login">Login with Puzzmo</button>
@@ -1161,21 +1161,21 @@ function ve() {
1161
1161
  },
1162
1162
  bind(n) {
1163
1163
  let r = n.getElement("#auth-login"), i = n.getElement("#auth-logout"), a = n.getElement("#auth-refresh"), o = n.getElement("#auth-test-api"), s = n.getElement("#auth-api-result"), c = n.getElement("#auth-dev-toggle");
1164
- t ? z && c && (c.style.display = "", L() === "dev" && c.classList.add("active")) : (t = !0, B().then((e) => {
1165
- e && c && (c.style.display = "", L() === "dev" && c.classList.add("active"));
1164
+ t ? B && c && (c.style.display = "", R() === "dev" && c.classList.add("active")) : (t = !0, V().then((e) => {
1165
+ e && c && (c.style.display = "", R() === "dev" && c.classList.add("active"));
1166
1166
  })), c == null || c.addEventListener("click", () => {
1167
- R(L() === "dev" ? "prod" : "dev"), J(), window.location.reload();
1167
+ z(R() === "dev" ? "prod" : "dev"), Y(), window.location.reload();
1168
1168
  }), r == null || r.addEventListener("click", () => {
1169
- fe();
1169
+ de();
1170
1170
  }), i == null || i.addEventListener("click", () => {
1171
- J(), window.location.reload();
1171
+ Y(), window.location.reload();
1172
1172
  }), a == null || a.addEventListener("click", e(function* () {
1173
- a.disabled = !0, a.textContent = "Refreshing...", (yield me()) ? window.location.reload() : (a.textContent = "Refresh Failed", a.disabled = !1);
1173
+ a.disabled = !0, a.textContent = "Refreshing...", (yield pe()) ? window.location.reload() : (a.textContent = "Refresh Failed", a.disabled = !1);
1174
1174
  })), o == null || o.addEventListener("click", e(function* () {
1175
1175
  if (s) {
1176
1176
  s.innerHTML = "<div class=\"loading\">Loading...</div>";
1177
1177
  try {
1178
- let t = yield ge("\n query {\n currentUser {\n id\n username\n usernameID\n name\n }\n }\n ");
1178
+ let t = yield he("\n query {\n currentUser {\n id\n username\n usernameID\n name\n }\n }\n ");
1179
1179
  if (t.errors) {
1180
1180
  var e;
1181
1181
  s.innerHTML = `<div class="error">Error: ${((e = t.errors[0]) == null ? void 0 : e.message) || "Unknown error"}</div>`;
@@ -1197,13 +1197,13 @@ function ve() {
1197
1197
  if (n && r) {
1198
1198
  let e = t.getElement("#auth-status");
1199
1199
  e && (e.innerHTML = "<span class=\"indicator waiting\"></span><span>Exchanging code...</span>");
1200
- let i = yield he(n, r);
1200
+ let i = yield me(n, r);
1201
1201
  if (window.history.replaceState({}, "", window.location.pathname), i) {
1202
1202
  let e = i.access_token || i.accessToken;
1203
1203
  if (e) {
1204
- G(e);
1204
+ K(e);
1205
1205
  let t = i.refresh_token || i.refreshToken;
1206
- t && de(t);
1206
+ t && ue(t);
1207
1207
  }
1208
1208
  window.location.reload();
1209
1209
  } else {
@@ -1215,9 +1215,9 @@ function ve() {
1215
1215
  }
1216
1216
  };
1217
1217
  }
1218
- var ye = "puzzmo_sim_api_mode", be = "http://localhost:8911", xe = "https://api.puzzmo.com", Y = "puzzmo_sim_oauth_token", X = "puzzmo_sim_oauth_refresh_token", Se = () => localStorage.getItem(ye) === "dev" ? "dev" : "prod", Z = () => localStorage.getItem(Y), Ce = () => localStorage.getItem(X), we = (e) => localStorage.setItem(Y, e), Te = (e) => localStorage.setItem(X, e), Ee = () => {
1219
- localStorage.removeItem(Y), localStorage.removeItem(X);
1220
- }, De = (e) => {
1218
+ var ve = "puzzmo_sim_api_mode", ye = "http://localhost:8911", be = "https://api.puzzmo.com", X = "puzzmo_sim_oauth_token", Z = "puzzmo_sim_oauth_refresh_token", xe = () => localStorage.getItem(ve) === "dev" ? "dev" : "prod", Q = () => localStorage.getItem(X), Se = () => localStorage.getItem(Z), Ce = (e) => localStorage.setItem(X, e), we = (e) => localStorage.setItem(Z, e), Te = () => {
1219
+ localStorage.removeItem(X), localStorage.removeItem(Z);
1220
+ }, Ee = (e) => {
1221
1221
  try {
1222
1222
  let t = e.split(".");
1223
1223
  if (t.length !== 3) return !0;
@@ -1226,11 +1226,11 @@ var ye = "puzzmo_sim_api_mode", be = "http://localhost:8911", xe = "https://api.
1226
1226
  } catch (e) {
1227
1227
  return !0;
1228
1228
  }
1229
- }, Oe = function() {
1229
+ }, De = function() {
1230
1230
  var t = e(function* () {
1231
- let e = Ce();
1231
+ let e = Se();
1232
1232
  if (!e) return !1;
1233
- let t = Se() === "dev" ? be : xe;
1233
+ let t = xe() === "dev" ? ye : be;
1234
1234
  try {
1235
1235
  let n = new URLSearchParams({
1236
1236
  grant_type: "refresh_token",
@@ -1244,9 +1244,9 @@ var ye = "puzzmo_sim_api_mode", be = "http://localhost:8911", xe = "https://api.
1244
1244
  if (!r.ok) return !1;
1245
1245
  let i = yield r.json(), a = i.access_token || i.accessToken;
1246
1246
  if (!a) return !1;
1247
- we(a);
1247
+ Ce(a);
1248
1248
  let o = i.refresh_token || i.refreshToken;
1249
- return o && Te(o), !0;
1249
+ return o && we(o), !0;
1250
1250
  } catch (e) {
1251
1251
  return !1;
1252
1252
  }
@@ -1254,13 +1254,13 @@ var ye = "puzzmo_sim_api_mode", be = "http://localhost:8911", xe = "https://api.
1254
1254
  return function() {
1255
1255
  return t.apply(this, arguments);
1256
1256
  };
1257
- }(), ke = function() {
1257
+ }(), Oe = function() {
1258
1258
  var t = e(function* (e, t = {}) {
1259
- let n = Se() === "dev" ? be : xe, r = Z();
1259
+ let n = xe() === "dev" ? ye : be, r = Q();
1260
1260
  if (!r) throw Error("Not authenticated");
1261
- if (De(r)) if (yield Oe()) {
1262
- if (r = Z(), !r) throw Error("Token refresh succeeded but no token available");
1263
- } else throw Ee(), Error("Session expired. Please log in again.");
1261
+ if (Ee(r)) if (yield De()) {
1262
+ if (r = Q(), !r) throw Error("Token refresh succeeded but no token available");
1263
+ } else throw Te(), Error("Session expired. Please log in again.");
1264
1264
  let i = yield fetch(`${n}/graphql`, {
1265
1265
  method: "POST",
1266
1266
  headers: {
@@ -1279,19 +1279,19 @@ var ye = "puzzmo_sim_api_mode", be = "http://localhost:8911", xe = "https://api.
1279
1279
  return function(e) {
1280
1280
  return t.apply(this, arguments);
1281
1281
  };
1282
- }(), Ae = "\n query GameFeaturesQuery($slug: ID!) {\n game(id: $slug) {\n id\n slug\n displayName\n featuresArr\n gameFeatures {\n slug\n title\n features {\n featureID\n title\n isEnabled\n }\n }\n }\n }\n", je = "\n mutation ToggleFeatureMutation($gameSlug: ID!, $input: UpdateGameInput!) {\n updateGame(id: $gameSlug, input: $input) {\n id\n featuresArr\n gameFeatures {\n slug\n title\n features {\n featureID\n title\n isEnabled\n }\n }\n }\n }\n", Me = (e, t) => {
1282
+ }(), ke = "\n query GameFeaturesQuery($slug: ID!) {\n game(id: $slug) {\n id\n slug\n displayName\n featuresArr\n gameFeatures {\n slug\n title\n features {\n featureID\n title\n isEnabled\n }\n }\n }\n }\n", Ae = "\n mutation ToggleFeatureMutation($gameSlug: ID!, $input: UpdateGameInput!) {\n updateGame(id: $gameSlug, input: $input) {\n id\n featuresArr\n gameFeatures {\n slug\n title\n features {\n featureID\n title\n isEnabled\n }\n }\n }\n }\n", je = (e, t) => {
1283
1283
  let n = t - 1, r = Math.floor(n / 31), i = n % 31, a = [...e];
1284
1284
  for (; a.length <= r;) a.push(0);
1285
1285
  return a[r] = a[r] ^ 1 << i, a;
1286
1286
  };
1287
- const Q = () => !!Z();
1287
+ const Me = () => !!Q();
1288
1288
  function Ne() {
1289
1289
  let n = null, r = !1, i = null, a = function() {
1290
1290
  var t = e(function* (e) {
1291
1291
  r = !0, i = null;
1292
1292
  try {
1293
1293
  var t;
1294
- let r = yield ke(Ae, { slug: e });
1294
+ let r = yield Oe(ke, { slug: e });
1295
1295
  if (r.errors) {
1296
1296
  var a;
1297
1297
  i = ((a = r.errors[0]) == null ? void 0 : a.message) || "Unknown error", n = null;
@@ -1308,10 +1308,10 @@ function Ne() {
1308
1308
  }(), o = function() {
1309
1309
  var r = e(function* (e) {
1310
1310
  if (!n) return;
1311
- let r = Me(n.featuresArr, e);
1311
+ let r = je(n.featuresArr, e);
1312
1312
  try {
1313
1313
  var i;
1314
- let e = yield ke(je, {
1314
+ let e = yield Oe(Ae, {
1315
1315
  gameSlug: n.slug,
1316
1316
  input: { featuresArr: r }
1317
1317
  });
@@ -1359,7 +1359,7 @@ function Ne() {
1359
1359
  id: "features",
1360
1360
  label: "Features",
1361
1361
  render() {
1362
- return Q() ? `
1362
+ return Me() ? `
1363
1363
  <div class="features-view-container">
1364
1364
  <div class="simulator-section">
1365
1365
  <div class="simulator-section-title">Game Features</div>
@@ -1400,7 +1400,7 @@ function Ne() {
1400
1400
  e && (yield d(e));
1401
1401
  })), i == null || i.addEventListener("keypress", (e) => {
1402
1402
  e.key === "Enter" && (r == null || r.click());
1403
- }), console.log("[FeaturesView] bind called, ctx.gameSlug:", t.gameSlug, "slugInput:", i), t.gameSlug && i && (i.value = t.gameSlug, Q() && !n && d(t.gameSlug)), u();
1403
+ }), console.log("[FeaturesView] bind called, ctx.gameSlug:", t.gameSlug, "slugInput:", i), t.gameSlug && i && (i.value = t.gameSlug, Me() && !n && d(t.gameSlug)), u();
1404
1404
  },
1405
1405
  onActivate(e) {
1406
1406
  let t = e.getElement("#simulator-tab-features");
@@ -1408,36 +1408,36 @@ function Ne() {
1408
1408
  }
1409
1409
  };
1410
1410
  }
1411
- var Pe = "./sample-puzzle.json", $ = null;
1411
+ var $ = null;
1412
1412
  /**
1413
1413
  * Creates the Simulator UI and message handling.
1414
1414
  * If called multiple times, updates the existing instance with new settings (e.g., fixtures).
1415
1415
  */
1416
- function Fe(t = {}) {
1417
- var n, r, i;
1416
+ function Pe(t = {}) {
1417
+ var n, r;
1418
1418
  if (console.log("[Simulator] createSimulator called with config:", {
1419
1419
  slug: t.slug,
1420
1420
  hasFixtures: !!t.fixtures
1421
1421
  }), $) return t.fixtures && (console.log("[Simulator] Instance already exists, updating fixtures"), $.updateFixtures(t.fixtures)), $;
1422
- let a = (n = t.puzzlePath) == null ? Pe : n, o = (r = t.autoStart) == null ? !0 : r, s = t.fixtures ? v(t.fixtures) : null, c = s ? Array.from(s.keys()).sort() : [], f = oe(), p = le(), m = [
1422
+ let i = (n = t.autoStart) == null ? !0 : n, a = t.fixtures ? v(t.fixtures) : null, o = a ? Array.from(a.keys()).sort() : [], s = ae(), c = ce(), f = [
1423
1423
  re(),
1424
- ae(),
1425
- f,
1424
+ ie(),
1425
+ s,
1426
+ oe(),
1426
1427
  se(),
1427
- ce(),
1428
- p,
1429
- ue(),
1430
- ve(),
1428
+ c,
1429
+ le(),
1430
+ _e(),
1431
1431
  Ne()
1432
- ], h = m.map((e) => e.id), g = l(t, c, h), _ = {
1432
+ ], p = f.map((e) => e.id), m = l(t, o, p), h = {
1433
1433
  pause: "<svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\"><rect x=\"1\" y=\"1\" width=\"3\" height=\"8\"/><rect x=\"6\" y=\"1\" width=\"3\" height=\"8\"/></svg>",
1434
1434
  play: "<svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\"><polygon points=\"2,1 9,5 2,9\"/></svg>",
1435
1435
  retry: "<svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\"><path d=\"M5 1C2.8 1 1 2.8 1 5s1.8 4 4 4c1.8 0 3.3-1.2 3.8-2.8H7.5c-.4.9-1.3 1.5-2.5 1.5-1.5 0-2.7-1.2-2.7-2.7S3.5 2.3 5 2.3c.7 0 1.4.3 1.9.8L5.5 4.5H9V1L7.6 2.4C6.9 1.5 5.9 1 5 1z\"/></svg>",
1436
1436
  cog: "<svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\"><path d=\"M9.5 5.8l-.8-.5c0-.2.1-.5.1-.8s0-.5-.1-.8l.8-.5c.1-.1.2-.2.1-.4l-.8-1.4c-.1-.1-.2-.2-.4-.1l-1 .3c-.3-.3-.7-.5-1.1-.6L6.1.2C6.1.1 6 0 5.8 0H4.2c-.2 0-.3.1-.3.2l-.2 1c-.4.1-.7.3-1.1.6l-1-.3c-.2 0-.3 0-.4.1l-.8 1.4c-.1.2 0 .3.1.4l.8.5c0 .2-.1.5-.1.8s0 .5.1.8l-.8.5c-.1.1-.2.2-.1.4l.8 1.4c.1.1.2.2.4.1l1-.3c.3.3.7.5 1.1.6l.2 1c0 .1.1.2.3.2h1.6c.2 0 .3-.1.3-.2l.2-1c.4-.1.7-.3 1.1-.6l1 .3c.2 0 .3 0 .4-.1l.8-1.4c.1-.2 0-.3-.1-.4zM5 6.5c-.8 0-1.5-.7-1.5-1.5S4.2 3.5 5 3.5 6.5 4.2 6.5 5 5.8 6.5 5 6.5z\"/></svg>",
1437
1437
  minimize: "<svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"currentColor\"><rect x=\"1\" y=\"4\" width=\"8\" height=\"2\"/></svg>",
1438
1438
  expand: "<svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"currentColor\"><polygon points=\"1,1 7,4 1,7\"/></svg>"
1439
- }, y = document.createElement("div");
1440
- y.id = "simulator", y.innerHTML = `
1439
+ }, g = document.createElement("div");
1440
+ g.id = "simulator", g.innerHTML = `
1441
1441
  <style>
1442
1442
  :root {
1443
1443
  --sim-bg: #1a1a2e;
@@ -2512,15 +2512,15 @@ function Fe(t = {}) {
2512
2512
  font-size: 9px;
2513
2513
  }
2514
2514
  </style>
2515
- <div id="simulator-panel" class="${g.isCollapsed ? "collapsed" : ""}">
2515
+ <div id="simulator-panel" class="${m.isCollapsed ? "collapsed" : ""}">
2516
2516
  <div id="simulator-header">
2517
2517
  <span id="simulator-title">PUZZMO SIMULATOR</span>
2518
2518
  <span class="header-sep">|</span>
2519
2519
  <div id="simulator-timer">--:--</div>
2520
2520
  <span class="header-sep">|</span>
2521
2521
  <div id="simulator-header-controls">
2522
- <button id="simulator-header-pause" class="header-icon-btn" title="Pause" disabled>${_.pause}</button>
2523
- <button id="simulator-header-retry" class="header-icon-btn" title="Retry" disabled>${_.retry}</button>
2522
+ <button id="simulator-header-pause" class="header-icon-btn" title="Pause" disabled>${h.pause}</button>
2523
+ <button id="simulator-header-retry" class="header-icon-btn" title="Retry" disabled>${h.retry}</button>
2524
2524
  </div>
2525
2525
  <span class="header-sep">|</span>
2526
2526
  <div id="simulator-header-status">
@@ -2528,101 +2528,104 @@ function Fe(t = {}) {
2528
2528
  <span id="simulator-header-status-text">Waiting...</span>
2529
2529
  </div>
2530
2530
  <span class="header-spacer"></span>
2531
- <button id="simulator-header-settings" class="header-icon-btn" title="Settings">${_.cog}</button>
2532
- <button id="simulator-toggle" class="header-icon-btn" title="Minimize">${_.minimize}</button>
2531
+ <button id="simulator-header-settings" class="header-icon-btn" title="Settings">${h.cog}</button>
2532
+ <button id="simulator-toggle" class="header-icon-btn" title="Minimize">${h.minimize}</button>
2533
2533
  </div>
2534
2534
  <div id="simulator-body">
2535
2535
  <div id="simulator-tabs">
2536
- ${m.filter((e) => e.id !== "auth").map((e) => `<button class="simulator-tab" data-tab="${e.id}">${e.label}<span class="simulator-tab-badge" data-badge="${e.id}"></span></button>`).join("")}
2536
+ ${f.filter((e) => e.id !== "auth").map((e) => `<button class="simulator-tab" data-tab="${e.id}">${e.label}<span class="simulator-tab-badge" data-badge="${e.id}"></span></button>`).join("")}
2537
2537
  </div>
2538
2538
  <div id="simulator-content" class="hidden">
2539
- ${m.map((e) => `<div id="simulator-tab-${e.id}" class="simulator-tab-content">${e.render()}</div>`).join("")}
2539
+ ${f.map((e) => `<div id="simulator-tab-${e.id}" class="simulator-tab-content">${e.render()}</div>`).join("")}
2540
2540
  </div>
2541
2541
  </div>
2542
2542
  </div>
2543
- `, document.body.appendChild(y);
2544
- let b = y.querySelector("#simulator-panel"), x = y.querySelector("#simulator-header"), S = y.querySelector("#simulator-header-indicator"), ie = y.querySelector("#simulator-header-status-text"), C = y.querySelector("#simulator-header-pause"), w = y.querySelector("#simulator-header-retry"), T = y.querySelector("#simulator-header-settings"), E = y.querySelector("#simulator-toggle"), D = y.querySelector("#simulator-timer"), O = y.querySelector("#simulator-tabs"), k = y.querySelector("#simulator-content"), A = (e) => y.querySelector(e), j = (e) => {
2545
- C.innerHTML = e ? _.play : _.pause, C.title = e ? "Resume" : "Pause";
2543
+ `, document.body.appendChild(g);
2544
+ let _ = g.querySelector("#simulator-panel"), y = g.querySelector("#simulator-header"), b = g.querySelector("#simulator-header-indicator"), x = g.querySelector("#simulator-header-status-text"), S = g.querySelector("#simulator-header-pause"), C = g.querySelector("#simulator-header-retry"), w = g.querySelector("#simulator-header-settings"), T = g.querySelector("#simulator-toggle"), E = g.querySelector("#simulator-timer"), D = g.querySelector("#simulator-tabs"), O = g.querySelector("#simulator-content"), k = (e) => g.querySelector(e), A = (e) => {
2545
+ S.innerHTML = e ? h.play : h.pause, S.title = e ? "Resume" : "Pause";
2546
+ }, j = (e, t) => {
2547
+ let n = k("#simulator-status .text"), r = k("#simulator-status .indicator");
2548
+ n && (n.textContent = e), r && (r.className = `indicator ${t}`), b.className = t, x.textContent = e;
2546
2549
  }, M = (e, t) => {
2547
- let n = A("#simulator-status .text"), r = A("#simulator-status .indicator");
2548
- n && (n.textContent = e), r && (r.className = `indicator ${t}`), S.className = t, ie.textContent = e;
2549
- }, N = (e, t) => {
2550
- t && t !== "0" ? D.innerHTML = `${e}<span class="penalty">+${t}</span>` : D.textContent = e;
2551
- }, P = (e) => {
2550
+ t && t !== "0" ? E.innerHTML = `${e}<span class="penalty">+${t}</span>` : E.textContent = e;
2551
+ }, N = (e) => {
2552
2552
  var t;
2553
- g.activeTab = e, k.classList.remove("hidden"), d(e), O.querySelectorAll(".simulator-tab").forEach((t) => {
2553
+ m.activeTab = e, O.classList.remove("hidden"), d(e), D.querySelectorAll(".simulator-tab").forEach((t) => {
2554
2554
  t.classList.toggle("active", t.getAttribute("data-tab") === e);
2555
- }), y.querySelectorAll(".simulator-tab-content").forEach((t) => {
2555
+ }), g.querySelectorAll(".simulator-tab-content").forEach((t) => {
2556
2556
  t.classList.toggle("active", t.id === `simulator-tab-${e}`);
2557
- }), T.classList.toggle("active", e === "auth");
2558
- let n = m.find((t) => t.id === e);
2559
- n == null || (t = n.onActivate) == null || t.call(n, V);
2560
- }, F = (e) => {
2561
- g.isCollapsed = e, b.classList.toggle("collapsed", e), u(e), e ? (k.classList.add("hidden"), O.querySelectorAll(".simulator-tab").forEach((e) => e.classList.remove("active"))) : P(g.activeTab);
2562
- }, I = () => {
2563
- p.updatePreview(V);
2564
- }, L = function() {
2557
+ }), w.classList.toggle("active", e === "auth");
2558
+ let n = f.find((t) => t.id === e);
2559
+ n == null || (t = n.onActivate) == null || t.call(n, B);
2560
+ }, P = (e) => {
2561
+ m.isCollapsed = e, _.classList.toggle("collapsed", e), u(e), e ? (O.classList.add("hidden"), D.querySelectorAll(".simulator-tab").forEach((e) => e.classList.remove("active"))) : N(m.activeTab);
2562
+ }, F = () => {
2563
+ c.updatePreview(B);
2564
+ }, I = function() {
2565
2565
  var t = e(function* () {
2566
- if (g.puzzleData) return g.puzzleData;
2567
- try {
2568
- let e = yield fetch(a);
2569
- if (!e.ok) throw Error(`Failed to load puzzle from ${a}`);
2570
- g.puzzleData = yield e.json(), console.log("Simulator: Puzzle loaded", g.puzzleData), g.originalPuzzle = JSON.stringify(g.puzzleData, null, 2);
2571
- let t = A("#simulator-puzzle");
2572
- return t && (t.value = g.originalPuzzle), g.activeTab === "thumb" && I(), g.puzzleData;
2573
- } catch (e) {
2574
- throw console.error("Simulator: Failed to load puzzle", e), e;
2575
- }
2566
+ var e, t;
2567
+ if (m.puzzleData) return m.puzzleData;
2568
+ if (!a || a.size === 0) throw Error("No fixtures configured. Add puzzle JSON files to a fixtures directory and pass fixturesGlob to the simulator.");
2569
+ let n = (e = m.selectedCategory) == null ? o[0] : e, r = n ? a.get(n) : void 0;
2570
+ if (!r || r.size === 0) throw Error(`No puzzles found in fixture category "${n}"`);
2571
+ let i = (t = m.selectedPuzzle) == null ? r.keys().next().value : t, s = i ? r.get(i) : void 0;
2572
+ if (!s) throw Error(`Puzzle "${i}" not found in category "${n}"`);
2573
+ m.puzzleData = s, console.log("Simulator: Puzzle loaded from fixtures", {
2574
+ category: n,
2575
+ puzzle: i
2576
+ }), m.originalPuzzle = JSON.stringify(m.puzzleData, null, 2);
2577
+ let c = k("#simulator-puzzle");
2578
+ return c && (c.value = m.originalPuzzle), m.activeTab === "thumb" && F(), m.puzzleData;
2576
2579
  });
2577
2580
  return function() {
2578
2581
  return t.apply(this, arguments);
2579
2582
  };
2580
- }(), R = ee((e) => {
2581
- f.addLogEntry(e, V);
2582
- }), z = (e, t) => {
2583
- te(e, t, R);
2584
- }, B = (e, t) => {
2585
- let n = y.querySelector(`[data-badge="${e}"]`);
2583
+ }(), L = ee((e) => {
2584
+ s.addLogEntry(e, B);
2585
+ }), R = (e, t) => {
2586
+ te(e, t, L);
2587
+ }, z = (e, t) => {
2588
+ let n = g.querySelector(`[data-badge="${e}"]`);
2586
2589
  n && (n.textContent = t && t > 0 ? String(t) : "");
2587
- }, V = {
2588
- state: g,
2589
- getElement: A,
2590
- sendToGame: z,
2591
- logMessage: R.log,
2592
- loadPuzzle: L,
2593
- updateStatus: M,
2594
- updateTimer: N,
2595
- setCollapsed: F,
2596
- switchTab: P,
2597
- updateThumbnail: I,
2598
- updateBadge: B,
2599
- fixtures: s,
2600
- fixtureCategories: c,
2601
- gameSlug: (i = t.slug) == null ? null : i
2590
+ }, B = {
2591
+ state: m,
2592
+ getElement: k,
2593
+ sendToGame: R,
2594
+ logMessage: L.log,
2595
+ loadPuzzle: I,
2596
+ updateStatus: j,
2597
+ updateTimer: M,
2598
+ setCollapsed: P,
2599
+ switchTab: N,
2600
+ updateThumbnail: F,
2601
+ updateBadge: z,
2602
+ fixtures: a,
2603
+ fixtureCategories: o,
2604
+ gameSlug: (r = t.slug) == null ? null : r
2602
2605
  };
2603
- console.log("[Simulator] Context created with gameSlug:", V.gameSlug), m.forEach((e) => e.bind(V)), O.querySelectorAll(".simulator-tab").forEach((e) => {
2606
+ console.log("[Simulator] Context created with gameSlug:", B.gameSlug), f.forEach((e) => e.bind(B)), D.querySelectorAll(".simulator-tab").forEach((e) => {
2604
2607
  e.addEventListener("click", () => {
2605
2608
  let t = e.getAttribute("data-tab");
2606
- P(t), B(t, 0);
2609
+ N(t), z(t, 0);
2607
2610
  });
2608
- }), E.addEventListener("click", (e) => {
2609
- e.stopPropagation(), F(!0);
2611
+ }), T.addEventListener("click", (e) => {
2612
+ e.stopPropagation(), P(!0);
2613
+ }), S.addEventListener("click", (e) => {
2614
+ e.stopPropagation(), m.isPaused ? (R("RESUME_GAME", {}), m.isPaused = !1, A(!1), j("Running", "ready")) : (R("PAUSE_GAME", {}), m.isPaused = !0, A(!0), j("Paused", "paused"));
2615
+ let t = k("#simulator-pause");
2616
+ t && (t.textContent = m.isPaused ? "Resume" : "Pause");
2610
2617
  }), C.addEventListener("click", (e) => {
2611
- e.stopPropagation(), g.isPaused ? (z("RESUME_GAME", {}), g.isPaused = !1, j(!1), M("Running", "ready")) : (z("PAUSE_GAME", {}), g.isPaused = !0, j(!0), M("Paused", "paused"));
2612
- let t = A("#simulator-pause");
2613
- t && (t.textContent = g.isPaused ? "Resume" : "Pause");
2614
- }), w.addEventListener("click", (e) => {
2615
- e.stopPropagation(), z("RETRY_PUZZLE", {}), g.hasStarted = !1, g.isPaused = !1, j(!1), C.disabled = !0, M("Ready to retry", "ready");
2616
- let t = A("#simulator-pause"), n = A("#simulator-start");
2618
+ e.stopPropagation(), R("RETRY_PUZZLE", {}), m.hasStarted = !1, m.isPaused = !1, A(!1), S.disabled = !0, j("Ready to retry", "ready");
2619
+ let t = k("#simulator-pause"), n = k("#simulator-start");
2617
2620
  t && (t.disabled = !0, t.textContent = "Pause"), n && (n.textContent = "Start");
2618
- }), T.addEventListener("click", (e) => {
2619
- e.stopPropagation(), g.isCollapsed && F(!1), P("auth");
2620
- }), x.addEventListener("click", (e) => {
2621
- g.isCollapsed && e.target !== E && F(!1);
2622
- }), g.isCollapsed || P(g.activeTab);
2623
- let H = new URLSearchParams(window.location.search);
2624
- (H.has("code") || H.has("error")) && (F(!1), P("auth"));
2625
- let U = (e) => ({
2621
+ }), w.addEventListener("click", (e) => {
2622
+ e.stopPropagation(), m.isCollapsed && P(!1), N("auth");
2623
+ }), y.addEventListener("click", (e) => {
2624
+ m.isCollapsed && e.target !== T && P(!1);
2625
+ }), m.isCollapsed || N(m.activeTab);
2626
+ let V = new URLSearchParams(window.location.search);
2627
+ (V.has("code") || V.has("error")) && (P(!1), N("auth"));
2628
+ let H = (e) => ({
2626
2629
  userState: {
2627
2630
  gameSettings: {},
2628
2631
  id: "simulator-user",
@@ -2632,7 +2635,7 @@ function Fe(t = {}) {
2632
2635
  currentUser: null,
2633
2636
  startOrFindGameplay: { gamePlayed: {
2634
2637
  additionalTimeAddedSecs: 0,
2635
- boardState: g.currentInputStr,
2638
+ boardState: m.currentInputStr,
2636
2639
  cheatsUsed: 0,
2637
2640
  combinedTimeSecs: 0,
2638
2641
  completed: !1,
@@ -2665,36 +2668,36 @@ function Fe(t = {}) {
2665
2668
  }
2666
2669
  }
2667
2670
  } },
2668
- theme: g.selectedTheme,
2671
+ theme: m.selectedTheme,
2669
2672
  hostFlags: [],
2670
2673
  hostContext: [],
2671
2674
  appRuntimeContract: "1.0"
2672
- }), W = function() {
2675
+ }), U = function() {
2673
2676
  var t = e(function* () {
2674
- M("Loading puzzle...", "waiting");
2677
+ j("Loading puzzle...", "waiting");
2675
2678
  try {
2676
- let e = U(yield L());
2677
- M("Sending READY_DATA...", "waiting"), z("READY_DATA", e), M("Waiting for game to load...", "waiting");
2679
+ let e = H(yield I());
2680
+ j("Sending READY_DATA...", "waiting"), R("READY_DATA", e), j("Waiting for game to load...", "waiting");
2678
2681
  } catch (e) {
2679
- M(`Error: ${e}`, "paused");
2682
+ j(`Error: ${e}`, "paused");
2680
2683
  }
2681
2684
  });
2682
2685
  return function() {
2683
2686
  return t.apply(this, arguments);
2684
2687
  };
2685
- }(), G = () => {
2686
- console.log("Simulator: Game loaded, ready to start"), w.disabled = !1, m.forEach((e) => {
2688
+ }(), W = () => {
2689
+ console.log("Simulator: Game loaded, ready to start"), C.disabled = !1, f.forEach((e) => {
2687
2690
  var t;
2688
- return (t = e.onMessage) == null ? void 0 : t.call(e, "READY_GAME_LOADED", void 0, V);
2689
- }), o && !g.hasStarted && setTimeout(() => {
2690
- let e = A("#simulator-start");
2691
- e == null || e.click(), C.disabled = !1, g.hasStarted = !0, M("Running", "ready");
2691
+ return (t = e.onMessage) == null ? void 0 : t.call(e, "READY_GAME_LOADED", void 0, B);
2692
+ }), i && !m.hasStarted && setTimeout(() => {
2693
+ let e = k("#simulator-start");
2694
+ e == null || e.click(), S.disabled = !1, m.hasStarted = !0, j("Running", "ready");
2692
2695
  }, 100);
2693
2696
  };
2694
2697
  return ne((e, t) => {
2695
2698
  var n, r;
2696
2699
  if (e === "READY") {
2697
- console.log("Simulator: Received READY from game"), W();
2700
+ console.log("Simulator: Received READY from game"), U();
2698
2701
  return;
2699
2702
  }
2700
2703
  if (e === "INITIALIZE_SETTINGS") {
@@ -2702,13 +2705,13 @@ function Fe(t = {}) {
2702
2705
  return;
2703
2706
  }
2704
2707
  if (e === "READY_GAME_LOADED") {
2705
- G();
2708
+ W();
2706
2709
  return;
2707
2710
  }
2708
2711
  if (e === "TIMER_TICK") {
2709
2712
  if (t != null && t.display) {
2710
2713
  let [e, n] = t.display;
2711
- N(e, n);
2714
+ M(e, n);
2712
2715
  }
2713
2716
  return;
2714
2717
  }
@@ -2721,30 +2724,30 @@ function Fe(t = {}) {
2721
2724
  console.log("Simulator: Sidebar update", t);
2722
2725
  return;
2723
2726
  }
2724
- m.forEach((n) => {
2727
+ f.forEach((n) => {
2725
2728
  var r;
2726
- return (r = n.onMessage) == null ? void 0 : r.call(n, e, t, V);
2729
+ return (r = n.onMessage) == null ? void 0 : r.call(n, e, t, B);
2727
2730
  });
2728
2731
  let i = (n = t == null || (r = t.input) == null ? void 0 : r.boardState) == null ? t == null ? void 0 : t.boardState : n;
2729
- e === "UPLOAD_NEW_GAME_STATE" && i && (g.currentInputStr = i, g.activeTab === "thumb" && I(), console.log("Simulator: Game state uploaded", t)), e === "GAME_COMPLETED" && (console.log("Simulator: Game completed!", t), C.disabled = !0, g.hasStarted = !1, M("Completed!", "ready"));
2730
- }, R), console.log("Simulator initialized"), $ = {
2732
+ e === "UPLOAD_NEW_GAME_STATE" && i && (m.currentInputStr = i, m.activeTab === "thumb" && F(), console.log("Simulator: Game state uploaded", t)), e === "GAME_COMPLETED" && (console.log("Simulator: Game completed!", t), S.disabled = !0, m.hasStarted = !1, j("Completed!", "ready"));
2733
+ }, L), console.log("Simulator initialized"), $ = {
2731
2734
  updateFixtures: (e) => {
2732
- s = v(e), c = Array.from(s.keys()).sort(), V.fixtures = s, V.fixtureCategories = c;
2735
+ a = v(e), o = Array.from(a.keys()).sort(), B.fixtures = a, B.fixtureCategories = o;
2733
2736
  let t = localStorage.getItem("simulator-fixture-category");
2734
- if (!g.selectedCategory || !c.includes(g.selectedCategory)) {
2737
+ if (!m.selectedCategory || !o.includes(m.selectedCategory)) {
2735
2738
  var n;
2736
- g.selectedCategory = t && c.includes(t) ? t : (n = c[0]) == null ? null : n;
2739
+ m.selectedCategory = t && o.includes(t) ? t : (n = o[0]) == null ? null : n;
2737
2740
  }
2738
- let r = m.find((e) => e.id === "ctrl");
2739
- r == null || r.bind(V), console.log("Simulator: Fixtures updated", {
2740
- categories: c,
2741
- selectedCategory: g.selectedCategory
2741
+ let r = f.find((e) => e.id === "ctrl");
2742
+ r == null || r.bind(B), console.log("Simulator: Fixtures updated", {
2743
+ categories: o,
2744
+ selectedCategory: m.selectedCategory
2742
2745
  });
2743
2746
  },
2744
- sendToGame: z,
2745
- loadPuzzle: L
2747
+ sendToGame: R,
2748
+ loadPuzzle: I
2746
2749
  }, $;
2747
2750
  }
2748
- export { Fe as t };
2751
+ export { Pe as t };
2749
2752
 
2750
- //# sourceMappingURL=createSimulator-BZYymqOG.js.map
2753
+ //# sourceMappingURL=createSimulator-D4oY1VzY.js.map