atmx-web 0.125.0 → 0.126.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/atmx.es.js CHANGED
@@ -146,7 +146,7 @@ function m(e) {
146
146
  }
147
147
  function h(e) {
148
148
  if (e.wasmUrl) return e.wasmUrl;
149
- let t = `https://atmx.axiomcore.dev/${e.engineVersion || "v0.125.0"}/axiom_runtime.wasm`;
149
+ let t = `https://atmx.axiomcore.dev/${e.engineVersion || "v0.126.0"}/axiom_runtime.wasm`;
150
150
  return e.disableCacheBuster || (t += `?t=${Date.now()}`), t;
151
151
  }
152
152
  async function g(e) {
@@ -162,7 +162,7 @@ async function g(e) {
162
162
  }
163
163
  let t = window.wasm_bindgen, a = h(e);
164
164
  try {
165
- u = await t(fetch(a));
165
+ u = await t({ module_or_path: fetch(a) });
166
166
  } catch (e) {
167
167
  throw {
168
168
  stage: "ffiBoundary",
@@ -391,7 +391,7 @@ var j = 0, M = class {
391
391
  };
392
392
  }
393
393
  subscribe(e) {
394
- this.listeners.add(e), e(this.state);
394
+ return this.listeners.add(e), e(this.state), () => this.listeners.delete(e);
395
395
  }
396
396
  update(e) {
397
397
  if (this.state = {
@@ -443,7 +443,41 @@ var j = 0, M = class {
443
443
  u.axiom_wasm_call(r, c.ptr, c.len, this.route.id, l.ptr, l.len, d.ptr, d.len, h.ptr, h.len, g.ptr, g.len, f, s.length), u.axiom_free_memory(c.ptr, c.len), u.axiom_free_memory(l.ptr, l.len), u.axiom_free_memory(d.ptr, d.len), u.axiom_free_memory(h.ptr, h.len), u.axiom_free_memory(g.ptr, g.len);
444
444
  }
445
445
  }, N = /* @__PURE__ */ new Map();
446
- function P(n, r = {}, i = {}, s = {}) {
446
+ function P(e, t = {}) {
447
+ return `${e}:${JSON.stringify(t)}`;
448
+ }
449
+ function F(e, t = {}) {
450
+ let n = P(e, t), r = N.get(n);
451
+ if (r?.state.data !== null && r?.state.data !== void 0) return r.state.data;
452
+ try {
453
+ let e = sessionStorage.getItem(`atmx_cache_${n}`);
454
+ return e ? JSON.parse(e) : null;
455
+ } catch {
456
+ return null;
457
+ }
458
+ }
459
+ function I(e, t = {}) {
460
+ let n = a(e);
461
+ if (!n) throw Error(`ATMX Route not found: ${e}`);
462
+ let r = P(e, t), i = N.get(r);
463
+ i || (i = new M(r, n, t), N.set(r, i));
464
+ let o = !1, s = /* @__PURE__ */ new Set(), c = i.subscribe((e) => {
465
+ o || s.forEach((t) => t(e));
466
+ });
467
+ return i.fetch(), {
468
+ getSnapshot: () => ({ ...i.state }),
469
+ subscribe(e) {
470
+ return o ? () => {} : (s.add(e), e(i.state), () => s.delete(e));
471
+ },
472
+ refresh() {
473
+ o || i.fetch(!0);
474
+ },
475
+ dispose() {
476
+ o || (o = !0, s.clear(), c());
477
+ }
478
+ };
479
+ }
480
+ function L(n, r = {}, i = {}, s = {}) {
447
481
  return new Promise((c, l) => {
448
482
  let d = a(n);
449
483
  if (!d) return l(/* @__PURE__ */ Error(`ATMX Route not found: ${n}`));
@@ -471,7 +505,7 @@ function P(n, r = {}, i = {}, s = {}) {
471
505
  u.axiom_wasm_call(f, x.ptr, x.len, d.id, S.ptr, S.len, C.ptr, C.len, w.ptr, w.len, T.ptr, T.len, E, _.length), u.axiom_free_memory(x.ptr, x.len), u.axiom_free_memory(S.ptr, S.len), u.axiom_free_memory(C.ptr, C.len), u.axiom_free_memory(w.ptr, w.len), u.axiom_free_memory(T.ptr, T.len), E && u.axiom_free_memory(E, _.length);
472
506
  });
473
507
  }
474
- function F(e, t) {
508
+ function R(e, t) {
475
509
  let [n, r] = e.split("."), i = `atmx_cache_${e}`;
476
510
  t && Object.keys(t).length > 0 && (i += `:${JSON.stringify(t)}`), Object.keys(sessionStorage).forEach((e) => {
477
511
  (e === i || !t && e.startsWith(i + ":")) && sessionStorage.removeItem(e);
@@ -479,8 +513,8 @@ function F(e, t) {
479
513
  e.route.namespace === n && e.route.name === r && (!t || Object.keys(t).length === 0 || JSON.stringify(e.args) === JSON.stringify(t)) && e.fetch(!0);
480
514
  });
481
515
  }
482
- function I(e, t = {}, n) {
483
- let r = `${e}:${JSON.stringify(t)}`;
516
+ function z(e, t = {}, n) {
517
+ let r = P(e, t);
484
518
  try {
485
519
  sessionStorage.setItem(`atmx_cache_${r}`, JSON.stringify(n));
486
520
  } catch {}
@@ -493,27 +527,33 @@ function I(e, t = {}, n) {
493
527
  error: null
494
528
  });
495
529
  }
496
- function L(e, t = !0) {
530
+ function B(e, t = !0) {
497
531
  let n = e ? `atmx_cache_${e}.` : "atmx_cache_";
498
532
  Object.keys(sessionStorage).forEach((e) => {
499
533
  e.startsWith(n) && sessionStorage.removeItem(e);
500
- }), t && N.forEach((t) => {
501
- (!e || t.route.namespace === e) && t.fetch(!0);
534
+ }), N.forEach((n) => {
535
+ (!e || n.route.namespace === e) && (n.update({
536
+ state: "idle",
537
+ source: null,
538
+ data: null,
539
+ error: null,
540
+ isFetching: !1
541
+ }), t && n.fetch(!0));
502
542
  });
503
543
  }
504
544
  //#endregion
505
545
  //#region src/dom/lifecycle.ts
506
- var R = 0;
507
- function z(e, t) {
546
+ var V = 0;
547
+ function H(e, t) {
508
548
  let n = `ax-on:${t}`;
509
549
  e.hasAttribute(n) && C(e.getAttribute(n), O(e));
510
550
  }
511
- function B(e, t, n) {
551
+ function U(e, t, n) {
512
552
  if (!$.debug) return;
513
553
  let r = e === "OUT" ? "#7c3aed" : "#059669";
514
554
  console.groupCollapsed(`%c${e === "OUT" ? "➔ WASM CALL" : "← WASM RESP"} [#${t}]`, `color: ${r}; font-weight: bold;`), console.log("Details:", n), console.groupEnd();
515
555
  }
516
- function V(e, t) {
556
+ function W(e, t) {
517
557
  let n = t.trim().match(/^([\w\.\-]+)(?:\((.*)\))?$/);
518
558
  if (!n) return null;
519
559
  let r = n[1], i = {};
@@ -530,10 +570,10 @@ function V(e, t) {
530
570
  args: i
531
571
  };
532
572
  }
533
- function H(e) {
573
+ function G(e) {
534
574
  let t = e.getAttribute("ax-query");
535
575
  if (!t) return;
536
- let n = V(e, t);
576
+ let n = W(e, t);
537
577
  if (!n) return;
538
578
  let r = a(n.target);
539
579
  if (!r) {
@@ -545,30 +585,30 @@ function H(e) {
545
585
  }
546
586
  let i = `${n.target}:${JSON.stringify(n.args)}`, o = N.get(i);
547
587
  o || (o = new M(i, r, n.args), N.set(i, o)), e._axListener || (e._axListener = (t) => {
548
- A(e, t), (t.state === "data" || t.state === "error") && (z(e, t.state), e.dispatchEvent(new CustomEvent(`atmx:${t.state}`, {
588
+ A(e, t), (t.state === "data" || t.state === "error") && (H(e, t.state), e.dispatchEvent(new CustomEvent(`atmx:${t.state}`, {
549
589
  bubbles: !0,
550
590
  detail: t.data || t.error
551
591
  })));
552
592
  }, o.subscribe(e._axListener)), o.fetch();
553
593
  }
554
- function U(e) {
594
+ function K(e) {
555
595
  let t = e.getAttribute("ax-mutate");
556
596
  if (!t) return;
557
- let n = V(e, t);
597
+ let n = W(e, t);
558
598
  if (!n) return;
559
599
  let r = a(n.target);
560
600
  if (!r) {
561
601
  console.error(`ATMX: Mutation route not found for target '${n.target}'. Check your ax-mutate attribute.`), A(e, {
562
602
  state: "error",
563
603
  error: { message: `Route not found: ${n.target}` }
564
- }), z(e, "error");
604
+ }), H(e, "error");
565
605
  return;
566
606
  }
567
607
  A(e, {
568
608
  state: "mutating",
569
609
  error: null,
570
610
  data: null
571
- }), z(e, "mutating");
611
+ }), H(e, "mutating");
572
612
  let i = {};
573
613
  e instanceof HTMLFormElement && new FormData(e).forEach((t, n) => {
574
614
  let r = e.elements.namedItem(n), a = !1;
@@ -597,11 +637,11 @@ function U(e) {
597
637
  for (let [t, n] of Object.entries(l)) e.append(t, String(n));
598
638
  p = new TextEncoder().encode(e.toString());
599
639
  } else p = new TextEncoder().encode(JSON.stringify(l));
600
- W(e, r.namespace, r.id, r.method, s, p, r.isStream, !0, u, f);
640
+ q(e, r.namespace, r.id, r.method, s, p, r.isStream, !0, u, f);
601
641
  }
602
- function W(e, n, r, i, a, o, s, c, l = {}, d = !1) {
603
- let f = ++R;
604
- B("OUT", f, {
642
+ function q(e, n, r, i, a, o, s, c, l = {}, d = !1) {
643
+ let f = ++V;
644
+ U("OUT", f, {
605
645
  namespace: n,
606
646
  endpointId: r,
607
647
  method: i,
@@ -610,7 +650,7 @@ function W(e, n, r, i, a, o, s, c, l = {}, d = !1) {
610
650
  payload: o.length > 0 ? d ? new TextDecoder().decode(o) : JSON.parse(new TextDecoder().decode(o)) : null
611
651
  }), t.set(f, {
612
652
  isStream: s,
613
- onResponse: (t) => G(e, t, c, f),
653
+ onResponse: (t) => J(e, t, c, f),
614
654
  onComplete: () => {
615
655
  $.debug && console.log(`%c✔ Stream Complete [#${f}]`, "color: #94a3b8;");
616
656
  }
@@ -618,8 +658,8 @@ function W(e, n, r, i, a, o, s, c, l = {}, d = !1) {
618
658
  let h = m(n), g = m(i), _ = m(a), v = m(""), y = m(Object.keys(l).length > 0 ? JSON.stringify(l) : ""), b = p(o);
619
659
  u.axiom_wasm_call(f, h.ptr, h.len, r, g.ptr, g.len, _.ptr, _.len, v.ptr, v.len, y.ptr, y.len, b, o.length), u.axiom_free_memory(h.ptr, h.len), u.axiom_free_memory(g.ptr, g.len), u.axiom_free_memory(_.ptr, _.len), u.axiom_free_memory(v.ptr, v.len), u.axiom_free_memory(y.ptr, y.len), b && u.axiom_free_memory(b, o.length);
620
660
  }
621
- function G(t, n, r, i) {
622
- if (B("IN", i, {
661
+ function J(t, n, r, i) {
662
+ if (U("IN", i, {
623
663
  eventType: e[n.eventType],
624
664
  data: n.data,
625
665
  error: n.error
@@ -629,7 +669,7 @@ function G(t, n, r, i) {
629
669
  error: n.error,
630
670
  isFetching: !1,
631
671
  isMutating: !1
632
- }), z(t, "error"), t.dispatchEvent(new CustomEvent("atmx:error", {
672
+ }), H(t, "error"), t.dispatchEvent(new CustomEvent("atmx:error", {
633
673
  bubbles: !0,
634
674
  detail: n.error
635
675
  }));
@@ -655,14 +695,14 @@ function G(t, n, r, i) {
655
695
  if (n) {
656
696
  let e = S(n, O(t));
657
697
  if (e) {
658
- let n = a(V(t, t.getAttribute("ax-mutate")).target)?.namespace || "default", r = t.getAttribute("ax-token-target");
698
+ let n = a(W(t, t.getAttribute("ax-mutate")).target)?.namespace || "default", r = t.getAttribute("ax-token-target");
659
699
  (r ? r.split(",").map((e) => e.trim()) : [n]).forEach((t) => {
660
700
  $.setNamespaceAuthToken(t, e);
661
701
  });
662
702
  }
663
703
  }
664
704
  }
665
- z(t, s), t.dispatchEvent(new CustomEvent(r ? "atmx:success" : "atmx:data", {
705
+ H(t, s), t.dispatchEvent(new CustomEvent(r ? "atmx:success" : "atmx:data", {
666
706
  bubbles: !0,
667
707
  detail: n.data
668
708
  }));
@@ -670,15 +710,15 @@ function G(t, n, r, i) {
670
710
  }
671
711
  //#endregion
672
712
  //#region src/dom/scanner.ts
673
- var K = new IntersectionObserver((e) => {
713
+ var Y = new IntersectionObserver((e) => {
674
714
  e.forEach((e) => {
675
715
  if (e.isIntersecting) {
676
716
  let t = e.target;
677
- t.hasAttribute("ax-query") && H(t), K.unobserve(t);
717
+ t.hasAttribute("ax-query") && G(t), Y.unobserve(t);
678
718
  }
679
719
  });
680
720
  });
681
- function q(e) {
721
+ function X(e) {
682
722
  e.querySelectorAll("[\\:ax-query], [\\:ax-mutate]").forEach((e) => {
683
723
  if (e.hasAttribute(":ax-query")) {
684
724
  let t = S(e.getAttribute(":ax-query"), O(e));
@@ -690,11 +730,11 @@ function q(e) {
690
730
  }
691
731
  });
692
732
  }
693
- function J(e = document) {
694
- q(e), e.querySelectorAll("[ax-query]").forEach((e) => {
733
+ function ee(e = document) {
734
+ X(e), e.querySelectorAll("[ax-query]").forEach((e) => {
695
735
  let t = e, n = t.getAttribute("ax-query");
696
736
  if (!n) return;
697
- let r = V(t, n);
737
+ let r = W(t, n);
698
738
  if (r) {
699
739
  let e = `${r.target}:${JSON.stringify(r.args)}`;
700
740
  try {
@@ -709,20 +749,20 @@ function J(e = document) {
709
749
  }
710
750
  });
711
751
  }
712
- function Y(e = document) {
713
- q(e), e.querySelectorAll("[ax-query]").forEach((e) => {
752
+ function Z(e = document) {
753
+ X(e), e.querySelectorAll("[ax-query]").forEach((e) => {
714
754
  let t = e;
715
755
  A(t, {});
716
756
  let n = t.getAttribute("ax-trigger") || "load";
717
- n === "load" ? H(t) : n === "intersect" ? K.observe(t) : t.addEventListener(n, (e) => {
718
- e.preventDefault(), H(t);
757
+ n === "load" ? G(t) : n === "intersect" ? Y.observe(t) : t.addEventListener(n, (e) => {
758
+ e.preventDefault(), G(t);
719
759
  });
720
760
  }), e.querySelectorAll("[ax-mutate]").forEach((e) => {
721
761
  let t = e;
722
762
  A(t, {});
723
763
  let n = t.tagName === "FORM" ? "submit" : "click";
724
764
  t.addEventListener(n, (e) => {
725
- (t.tagName === "A" || t.tagName === "BUTTON" || t.tagName === "FORM") && e.preventDefault(), U(t);
765
+ (t.tagName === "A" || t.tagName === "BUTTON" || t.tagName === "FORM") && e.preventDefault(), K(t);
726
766
  });
727
767
  }), e.querySelectorAll("[ax-trigger=\"refresh\"]").forEach((e) => {
728
768
  let t = e;
@@ -730,20 +770,20 @@ function Y(e = document) {
730
770
  e.preventDefault();
731
771
  let n = t.closest("[ax-query]");
732
772
  if (n) {
733
- let e = V(n, n.getAttribute("ax-query"));
773
+ let e = W(n, n.getAttribute("ax-query"));
734
774
  if (e && a(e.target)) {
735
775
  let t = `${e.target}:${JSON.stringify(e.args)}`, r = N.get(t);
736
- r ? r.fetch(!0) : H(n);
776
+ r ? r.fetch(!0) : G(n);
737
777
  }
738
778
  }
739
779
  });
740
780
  });
741
781
  }
742
- function X() {
782
+ function te() {
743
783
  new MutationObserver((e) => {
744
784
  e.forEach((e) => {
745
785
  e.addedNodes.forEach((e) => {
746
- e instanceof HTMLElement && Y(e);
786
+ e instanceof HTMLElement && Z(e);
747
787
  });
748
788
  });
749
789
  }).observe(document.body, {
@@ -753,7 +793,7 @@ function X() {
753
793
  }
754
794
  //#endregion
755
795
  //#region src/dom/components/engine-status.ts
756
- var Z = class extends HTMLElement {
796
+ var ne = class extends HTMLElement {
757
797
  constructor() {
758
798
  super();
759
799
  }
@@ -774,10 +814,10 @@ var Z = class extends HTMLElement {
774
814
  }) : (this.innerText = t, this.getAttribute("class") || (this.className = `text-xs font-bold ${n}`));
775
815
  }
776
816
  };
777
- typeof window < "u" && !customElements.get("ax-engine-status") && customElements.define("ax-engine-status", Z);
817
+ typeof window < "u" && !customElements.get("ax-engine-status") && customElements.define("ax-engine-status", ne);
778
818
  //#endregion
779
819
  //#region src/index.ts
780
- var Q = "0.125.0", $ = new class {
820
+ var Q = "0.126.0", $ = new class {
781
821
  version = Q;
782
822
  initialized = !1;
783
823
  debug = !1;
@@ -788,15 +828,15 @@ var Q = "0.125.0", $ = new class {
788
828
  initDurationMs: 0
789
829
  };
790
830
  let t = await g(e);
791
- return t.ok ? (this.debug = e.debug || !1, X(), Y(document.body), this.initialized = !0, this.debug && console.log("%c🚀 ATMX Debug Mode: Enabled", "color: #2563eb; font-weight: bold;"), console.log(`✅ ATMX v${this.version} Online (${t.initDurationMs}ms). Reactive Engine Started.`), document.dispatchEvent(new CustomEvent("atmx:ready", { detail: t }))) : (console.error("❌ ATMX Initialization Failed:", t.error), document.dispatchEvent(new CustomEvent("atmx:error", { detail: t.error }))), t;
831
+ return t.ok ? (this.debug = e.debug || !1, te(), Z(document.body), this.initialized = !0, this.debug && console.log("%c🚀 ATMX Debug Mode: Enabled", "color: #2563eb; font-weight: bold;"), console.log(`✅ ATMX v${this.version} Online (${t.initDurationMs}ms). Reactive Engine Started.`), document.dispatchEvent(new CustomEvent("atmx:ready", { detail: t }))) : (console.error("❌ ATMX Initialization Failed:", t.error), document.dispatchEvent(new CustomEvent("atmx:error", { detail: t.error }))), t;
792
832
  }
793
833
  hydrate(e) {
794
834
  let t = document;
795
- e && (t = typeof e == "string" ? document.querySelector(e) : e), t && J(t);
835
+ e && (t = typeof e == "string" ? document.querySelector(e) : e), t && ee(t);
796
836
  }
797
837
  triggerQuery(e) {
798
838
  let t = typeof e == "string" ? document.querySelector(e) : e;
799
- t && t instanceof HTMLElement && t.hasAttribute("ax-query") && H(t);
839
+ t && t instanceof HTMLElement && t.hasAttribute("ax-query") && G(t);
800
840
  }
801
841
  on(e, t) {
802
842
  document.addEventListener(`atmx:${e}`, t);
@@ -817,7 +857,7 @@ var Q = "0.125.0", $ = new class {
817
857
  y(e, t);
818
858
  }
819
859
  connect(e) {
820
- let t = V(null, e);
860
+ let t = W(null, e);
821
861
  if (!t) return;
822
862
  let n = a(t.target);
823
863
  if (!n) return;
@@ -825,7 +865,7 @@ var Q = "0.125.0", $ = new class {
825
865
  i || (i = new M(r, n, t.args), N.set(r, i)), i.fetch();
826
866
  }
827
867
  disconnect(e) {
828
- let n = V(null, e);
868
+ let n = W(null, e);
829
869
  if (!n) return;
830
870
  let r = a(n.target);
831
871
  if (!r) return;
@@ -833,7 +873,7 @@ var Q = "0.125.0", $ = new class {
833
873
  o && (o.currentReqId && t.delete(o.currentReqId), N.delete(i), this.debug && console.log(`🔌 ATMX Disconnected Stream: ${e}`));
834
874
  }
835
875
  send(e, t) {
836
- let n = V(null, e);
876
+ let n = W(null, e);
837
877
  if (!n) return;
838
878
  let r = a(n.target);
839
879
  if (!r) return;
@@ -841,25 +881,31 @@ var Q = "0.125.0", $ = new class {
841
881
  o && o.currentReqId ? b(o.currentReqId, t) : console.warn(`ATMX: Cannot send message, stream not active for ${e}`);
842
882
  }
843
883
  mutate(e, t, n) {
844
- return P(e, t, n);
884
+ return L(e, t, n);
885
+ }
886
+ query(e, t = {}) {
887
+ return I(e, t);
888
+ }
889
+ getCachedQueryData(e, t = {}) {
890
+ return F(e, t);
845
891
  }
846
892
  mutateBytes(e, t, n, r = {}) {
847
- return P(e, t, {}, {
893
+ return L(e, t, {}, {
848
894
  rawBody: n,
849
895
  headers: r
850
896
  });
851
897
  }
852
898
  invalidate(e, t) {
853
- F(e, t);
899
+ R(e, t);
854
900
  }
855
901
  setQueryData(e, t, n) {
856
- I(e, t, n);
902
+ z(e, t, n);
857
903
  }
858
904
  clearCache(e) {
859
- L(e);
905
+ B(e);
860
906
  }
861
907
  purgeCache(e) {
862
- L(e, !1);
908
+ B(e, !1);
863
909
  }
864
910
  onError(e) {
865
911
  document.addEventListener("atmx:error", (t) => {
package/dist/atmx.umd.js CHANGED
@@ -822,5 +822,5 @@
822
822
 
823
823
  return Object.assign(__wbg_init, { initSync }, exports);
824
824
  })({ __proto__: null });
825
- `,d=null;function f(e){try{localStorage.removeItem(`atmx_auth_store`);let t=[...Array.isArray(e?.endpoints)?e.endpoints:Object.values(e?.endpoints||{}),...Array.isArray(e?.ir?.endpoints)?e.ir.endpoints:Object.values(e?.ir?.endpoints||{})];for(let e of t)for(let t of e?.auth?.methods||[]){let e=t?.name||t?.type;e&&localStorage.removeItem(`axiom_cache_auth_${e}`)}}catch{}}function p(e){return(e.auth?.methods||[]).filter(e=>e?.type?.toLowerCase()!==`session`).map(e=>e?.name||e?.type).filter(Boolean)}function m(e){if(e.length===0)return 0;let t=d.axiom_malloc(e.length);return new Uint8Array(d.memory.buffer).set(e,t),t}function h(e){if(!e)return{ptr:0,len:0};let t=new TextEncoder().encode(e);return{ptr:m(t),len:t.length}}function g(e){if(e.wasmUrl)return e.wasmUrl;let t=`https://atmx.axiomcore.dev/${e.engineVersion||`v0.125.0`}/axiom_runtime.wasm`;return e.disableCacheBuster||(t+=`?t=${Date.now()}`),t}async function _(e){let t=performance.now(),n={ok:!1,contracts:{},initDurationMs:0};try{if(!window.wasm_bindgen){let e=document.createElement(`script`);e.type=`text/javascript`,e.text=`${u}\nwindow.wasm_bindgen = wasm_bindgen;`,document.head.appendChild(e)}let t=window.wasm_bindgen,i=g(e);try{d=await t(fetch(i))}catch(e){throw{stage:`ffiBoundary`,category:`network`,code:`WasmFetchFailed`,message:`Failed to download WASM engine: ${e.message}`,retryable:!0}}r(d),setInterval(()=>{d&&d.axiom_process_responses()},16);let o=h(``),s=d.axiom_wasm_initialize(o.ptr,o.len);if(d.axiom_free_memory(o.ptr,o.len),s!==0)throw{stage:`runtime`,category:`server`,code:`InitFailed`,message:`Engine init failed (Code: ${s})`,retryable:!1};for(let[t,r]of Object.entries(e.contracts))try{let i=await fetch(r.contractUrl);if(!i.ok)throw Error(`HTTP ${i.status}`);let o=await i.arrayBuffer(),s=0;try{let e=new TextDecoder().decode(o),n=JSON.parse(e),r=n?.ir?.endpoints;r&&(s=Array.isArray(r)?r.length:Object.keys(r).length),f(n),a(t,n)}catch(e){console.error(`ATMX: Failed to parse .axiom contract for '${t}'`,e)}let c=new Uint8Array(o),l=m(c),u=h(t),p=h(r.baseUrl),g=d.axiom_wasm_load_contract(u.ptr,u.len,p.ptr,p.len,l,c.length,0,0,0,0);if(d.axiom_free_memory(l,c.length),d.axiom_free_memory(u.ptr,u.len),d.axiom_free_memory(p.ptr,p.len),g!==0&&g!==-1)throw Error(`Load error (Code: ${g})`);e.debug&&console.log(`%c🔒 Axiom Contract Loaded: ${t} (${s} endpoints)`,`color: #10b981; font-weight: bold;`),n.contracts[t]={loaded:!0,endpointCount:s},document.dispatchEvent(new CustomEvent(`atmx:contract-loaded`,{detail:{namespace:t,endpointCount:s}}))}catch(e){n.contracts[t]={loaded:!1,endpointCount:0,error:e.message},console.error(`ATMX: Contract failed for ${t}`,e)}n.ok=!0}catch(e){n.ok=!1,n.error=e.stage?e:{stage:`runtime`,category:`unknown`,code:`FatalError`,message:e.message||String(e),retryable:!1}}return n.initDurationMs=Math.round(performance.now()-t),n}function v(e,t,n){if(!d)return;let r=h(e),i=h(t),a=h(n);d.axiom_wasm_set_auth_token(r.ptr,r.len,i.ptr,i.len,a.ptr,a.len),d.axiom_free_memory(r.ptr,r.len),d.axiom_free_memory(i.ptr,i.len),d.axiom_free_memory(a.ptr,a.len)}function y(e,t){if(!d)return;let n=new Set(l(e).flatMap(p));for(let r of n)v(e,r,t)}function b(e,t){if(!d)return;let n=h(e),r=h(t);d.axiom_wasm_clear_auth_token(n.ptr,n.len,r.ptr,r.len),d.axiom_free_memory(n.ptr,n.len),d.axiom_free_memory(r.ptr,r.len)}function x(e,t){if(!d)return;let n=new TextEncoder().encode(JSON.stringify(t)),r=m(n);d.axiom_wasm_send_stream_message(e,r,n.length),d.axiom_free_memory(r,n.length)}function S(e){if(!d)return;let t=new Map;for(let e of c()){let n=t.get(e.namespace)||new Set;p(e).forEach(e=>n.add(e)),t.set(e.namespace,n)}for(let[n,r]of t)for(let t of r)v(n,t,e)}function C(e,t,n={}){if(e)try{let r=Object.keys(n),i=Object.values(n);return Function(`$data`,`$error`,`$state`,...r,`return (${e});`)(t.data??null,t.error??null,t,...i)}catch(t){console.error(`ATMX Eval Error: ${e}`,t);return}}function w(e,t,n={}){if(e)try{let r=Object.keys(n),i=Object.values(n);Function(`$data`,`$error`,`$state`,...r,e)(t.data??null,t.error??null,t,...i)}catch(t){console.error(`ATMX Action Error: ${e}`,t)}}function T(e,t){E(e,t,!0,{})}function E(e,t,n,r){if(!(!n&&(e.hasAttribute(`ax-query`)||e.hasAttribute(`ax-mutate`)))&&!(!n&&e.hasAttribute(`data-ax-clone-of`))){if(e.hasAttribute(`ax-for`)){D(e,t,r);return}if(e.hasAttribute(`ax-when`)&&(e.getAttribute(`ax-when`).split(`,`).map(e=>e.trim()).includes(t.state)?(e.removeAttribute(`hidden`),e.style.removeProperty(`display`)):(e.setAttribute(`hidden`,`true`),e.style.setProperty(`display`,`none`,`important`))),e.hasAttribute(`ax-if`)&&(C(e.getAttribute(`ax-if`),t,r)?(e.removeAttribute(`hidden`),e.style.removeProperty(`display`)):(e.setAttribute(`hidden`,``),e.style.setProperty(`display`,`none`,`important`))),e.hasAttribute(`ax-text`)){let n=C(e.getAttribute(`ax-text`),t,r);e.textContent=n==null?``:String(n)}if(e.hasAttribute(`ax-error-for`)){let n=e.getAttribute(`ax-error-for`),r=``;if(t.state===`error`&&t.error?.code===`ValidationError`){let e=(t.error.details||``).split(`
826
- `);for(let t of e)if(t.startsWith(n+`:`)){r=t.substring(n.length+1).trim();break}}let i=e.parentElement?.querySelector(`[name="${n}"]`);r?(e.textContent=r,e.removeAttribute(`hidden`),e.style.removeProperty(`display`),i&&(i.setAttribute(`aria-invalid`,`true`),i.classList.add(`border-red-500`,`focus:border-red-500`,`focus:ring-red-500`))):(e.setAttribute(`hidden`,``),e.style.setProperty(`display`,`none`,`important`),e.textContent=``,i&&(i.removeAttribute(`aria-invalid`),i.classList.remove(`border-red-500`,`focus:border-red-500`,`focus:ring-red-500`)))}Array.from(e.attributes).forEach(n=>{if(n.name.startsWith(`ax-bind:`)){let i=n.name.substring(8),a=C(n.value,t,r);a===!1||a==null?e.removeAttribute(i):e.setAttribute(i,a===!0?i:String(a))}}),Array.from(e.children).forEach(e=>{E(e,t,!1,r)})}}function D(e,t,n){e.style.display=`none`,e.hasAttribute(`data-ax-for-id`)||e.setAttribute(`data-ax-for-id`,Math.random().toString(36).substr(2,9));let r=e.getAttribute(`data-ax-for-id`),i=e.getAttribute(`ax-for`).match(/^\s*(?:(?:\(\s*([\w\$]+)\s*,\s*([\w\$]+)\s*\))|([\w\$]+))\s+in\s+(.+)$/);if(!i)return;let a=i[1]||i[3],o=i[2],s=i[4],c=C(s,t,n),l=e.parentElement;if(!l)return;let u=Array.from(l.querySelectorAll(`[data-ax-clone-of="${r}"]`));if(!c||!Array.isArray(c)){u.forEach(e=>e.remove());return}let d=e.getAttribute(`ax-key`),f=[];c.forEach((i,s)=>{let c={...n,[a]:i};o&&(c[o]=s);let p=String(s);d&&(p=String(C(d,t,c)));let m=u.find(e=>e.getAttribute(`data-ax-key`)===p);m||(m=e.cloneNode(!0),m.removeAttribute(`ax-for`),m.style.removeProperty(`display`),m.style.length===0&&m.removeAttribute(`style`),m.setAttribute(`data-ax-clone-of`,r),m.setAttribute(`data-ax-key`,p)),l.insertBefore(m,e),E(m,t,!0,c),f.push(m)}),u.forEach(e=>{f.includes(e)||e.remove()})}var O=new WeakMap;function k(e){return O.has(e)||O.set(e,{state:`idle`,isFetching:!1,isMutating:!1,source:null,data:null,error:null}),O.get(e)}function A(e){let t=e.parentElement;for(;t;){if(t.hasAttribute(`ax-query`)||t.hasAttribute(`ax-mutate`)){let e=O.get(t);if(e&&e.data)return e.data}t=t.parentElement}return{}}function j(e,t){let n=k(e);Object.assign(n,t),t.state===`loading`&&(n.isFetching=!0),t.state===`mutating`&&(n.isMutating=!0),(t.state===`success`||t.state===`data`&&t.isFetching===!1)&&(n.isFetching=!1,n.isMutating=!1),O.set(e,n),T(e,n)}var M=0,N=class{key;route;args;state;listeners=new Set;currentReqId=null;constructor(e,t,n){this.key=e,this.route=t,this.args=n;let r=null;try{let t=sessionStorage.getItem(`atmx_cache_${e}`);t&&(r=JSON.parse(t))}catch{}r?this.state={state:`data`,isFetching:!1,source:`cache`,data:r,error:null}:this.state={state:`idle`,isFetching:!1,source:null,data:null,error:null}}subscribe(e){this.listeners.add(e),e(this.state)}update(e){if(this.state={...this.state,...e},this.state.data)try{sessionStorage.setItem(`atmx_cache_${this.key}`,JSON.stringify(this.state.data))}catch{}this.listeners.forEach(e=>e(this.state))}fetch(e=!1){if(this.state.isFetching&&!e)return;this.update({state:this.state.data?`data`:`loading`,isFetching:!0,error:null});let r=++M;this.currentReqId=r;let{path:i,remainingArgs:a}=s(this.route,this.args),o=new Uint8Array;Object.keys(a).length>0&&(o=new TextEncoder().encode(JSON.stringify(a))),$.debug&&(console.groupCollapsed(`%c➔ WASM QUERY [#${r}]`,`color: #7c3aed; font-weight: bold;`),console.log(`Namespace:`,this.route.namespace),console.log(`Endpoint ID:`,this.route.id),console.log(`Path:`,i),console.groupEnd()),n.set(r,{isStream:this.route.isStream,onResponse:e=>{if(this.currentReqId===r){if(e.eventType===t.Error){this.update({state:`error`,error:e.error,isFetching:!1});return}if(e.data!==void 0){let n=`network`,r=!1;e.eventType===t.CacheHit?(n=`cache`,r=!1):e.eventType===t.CacheHitAndFetching?(n=`cache`,r=!0):e.eventType===t.NetworkSuccess&&(n=`network`,r=!1),this.update({state:`data`,data:e.data,source:n,isFetching:r})}}},onComplete:()=>{this.currentReqId===r&&this.update({isFetching:!1})}});let c=h(this.route.namespace),l=h(this.route.method),u=h(i),f=m(o),p=h(``),g=h(``);d.axiom_wasm_call(r,c.ptr,c.len,this.route.id,l.ptr,l.len,u.ptr,u.len,p.ptr,p.len,g.ptr,g.len,f,o.length),d.axiom_free_memory(c.ptr,c.len),d.axiom_free_memory(l.ptr,l.len),d.axiom_free_memory(u.ptr,u.len),d.axiom_free_memory(p.ptr,p.len),d.axiom_free_memory(g.ptr,g.len)}},P=new Map;function F(e,r={},i={},a={}){return new Promise((c,l)=>{let u=o(e);if(!u)return l(Error(`ATMX Route not found: ${e}`));let f=++M,{path:p,remainingArgs:g}=s(u,{...r,...i}),_=a.rawBody;if(!_){let e=g;u.bodyParam&&g[u.bodyParam]!==void 0&&typeof g[u.bodyParam]==`object`&&(e=g[u.bodyParam]),_=new Uint8Array,Object.keys(e).length>0&&(_=new TextEncoder().encode(JSON.stringify(e)))}let v=!1,y=e=>{v||(v=!0,c(e))},b=e=>{v||(v=!0,l(e))};n.set(f,{isStream:u.isStream,onResponse:e=>{e.eventType===t.Error?(document.dispatchEvent(new CustomEvent(`atmx:error`,{detail:e.error})),b(e.error)):e.data!==void 0&&y(e.data)},onComplete:()=>y(void 0)});let x=h(u.namespace),S=h(u.method),C=h(p),w=h(``),T=h(Object.keys(a.headers||{}).length>0?JSON.stringify(a.headers):``),E=m(_);d.axiom_wasm_call(f,x.ptr,x.len,u.id,S.ptr,S.len,C.ptr,C.len,w.ptr,w.len,T.ptr,T.len,E,_.length),d.axiom_free_memory(x.ptr,x.len),d.axiom_free_memory(S.ptr,S.len),d.axiom_free_memory(C.ptr,C.len),d.axiom_free_memory(w.ptr,w.len),d.axiom_free_memory(T.ptr,T.len),E&&d.axiom_free_memory(E,_.length)})}function I(e,t){let[n,r]=e.split(`.`),i=`atmx_cache_${e}`;t&&Object.keys(t).length>0&&(i+=`:${JSON.stringify(t)}`),Object.keys(sessionStorage).forEach(e=>{(e===i||!t&&e.startsWith(i+`:`))&&sessionStorage.removeItem(e)}),P.forEach((e,i)=>{e.route.namespace===n&&e.route.name===r&&(!t||Object.keys(t).length===0||JSON.stringify(e.args)===JSON.stringify(t))&&e.fetch(!0)})}function L(e,t={},n){let r=`${e}:${JSON.stringify(t)}`;try{sessionStorage.setItem(`atmx_cache_${r}`,JSON.stringify(n))}catch{}let i=P.get(r);i&&i.update({state:`data`,source:`cache`,isFetching:!1,data:n,error:null})}function R(e,t=!0){let n=e?`atmx_cache_${e}.`:`atmx_cache_`;Object.keys(sessionStorage).forEach(e=>{e.startsWith(n)&&sessionStorage.removeItem(e)}),t&&P.forEach(t=>{(!e||t.route.namespace===e)&&t.fetch(!0)})}var z=0;function B(e,t){let n=`ax-on:${t}`;e.hasAttribute(n)&&w(e.getAttribute(n),k(e))}function V(e,t,n){if(!$.debug)return;let r=e===`OUT`?`#7c3aed`:`#059669`;console.groupCollapsed(`%c${e===`OUT`?`➔ WASM CALL`:`← WASM RESP`} [#${t}]`,`color: ${r}; font-weight: bold;`),console.log(`Details:`,n),console.groupEnd()}function H(e,t){let n=t.trim().match(/^([\w\.\-]+)(?:\((.*)\))?$/);if(!n)return null;let r=n[1],i={};if(n[2]&&n[2].trim()!==``)try{if(e){let t=k(e),r=t.data||A(e);i=Function(`$data`,`$state`,`return (${n[2]});`)(r??null,t)||{}}else i=Function(`return (${n[2]});`)()||{}}catch(e){console.error(`ATMX Scope Error in "${t}":`,e)}return{target:r,args:i}}function U(e){let t=e.getAttribute(`ax-query`);if(!t)return;let n=H(e,t);if(!n)return;let r=o(n.target);if(!r){j(e,{state:`error`,error:{message:`Route not found: ${n.target}`}});return}let i=`${n.target}:${JSON.stringify(n.args)}`,a=P.get(i);a||(a=new N(i,r,n.args),P.set(i,a)),e._axListener||(e._axListener=t=>{j(e,t),(t.state===`data`||t.state===`error`)&&(B(e,t.state),e.dispatchEvent(new CustomEvent(`atmx:${t.state}`,{bubbles:!0,detail:t.data||t.error})))},a.subscribe(e._axListener)),a.fetch()}function W(e){let t=e.getAttribute(`ax-mutate`);if(!t)return;let n=H(e,t);if(!n)return;let r=o(n.target);if(!r){console.error(`ATMX: Mutation route not found for target '${n.target}'. Check your ax-mutate attribute.`),j(e,{state:`error`,error:{message:`Route not found: ${n.target}`}}),B(e,`error`);return}j(e,{state:`mutating`,error:null,data:null}),B(e,`mutating`);let i={};e instanceof HTMLFormElement&&new FormData(e).forEach((t,n)=>{let r=e.elements.namedItem(n),a=!1;r instanceof HTMLInputElement?a=r.type===`number`:r instanceof RadioNodeList&&r.length>0&&(a=r[0].type===`number`);let o=a&&t!==``?Number(t):t;if(n.includes(`.`)){let e=n.split(`.`),t=i;for(let n=0;n<e.length-1;n++)t[e[n]]||(t[e[n]]={}),t=t[e[n]];t[e[e.length-1]]=o}else i[n]=o});let{path:a,remainingArgs:c}=s(r,{...i,...n.args}),l=c;r.bodyParam&&c[r.bodyParam]!==void 0&&typeof c[r.bodyParam]==`object`&&(l=c[r.bodyParam]);let u={},d=e.getAttribute(`ax-headers`);if(d)try{u=Function(`return (`+d+`);`)()||{}}catch(e){console.error(`ATMX: Invalid ax-headers syntax`,e)}let f=Object.entries(u).some(([e,t])=>e.toLowerCase()===`content-type`&&t.includes(`application/x-www-form-urlencoded`)),p=new Uint8Array;if(Object.keys(l).length>0)if(f){let e=new URLSearchParams;for(let[t,n]of Object.entries(l))e.append(t,String(n));p=new TextEncoder().encode(e.toString())}else p=new TextEncoder().encode(JSON.stringify(l));G(e,r.namespace,r.id,r.method,a,p,r.isStream,!0,u,f)}function G(e,t,r,i,a,o,s,c,l={},u=!1){let f=++z;V(`OUT`,f,{namespace:t,endpointId:r,method:i,path:a,headers:l,payload:o.length>0?u?new TextDecoder().decode(o):JSON.parse(new TextDecoder().decode(o)):null}),n.set(f,{isStream:s,onResponse:t=>K(e,t,c,f),onComplete:()=>{$.debug&&console.log(`%c✔ Stream Complete [#${f}]`,`color: #94a3b8;`)}});let p=h(t),g=h(i),_=h(a),v=h(``),y=h(Object.keys(l).length>0?JSON.stringify(l):``),b=m(o);d.axiom_wasm_call(f,p.ptr,p.len,r,g.ptr,g.len,_.ptr,_.len,v.ptr,v.len,y.ptr,y.len,b,o.length),d.axiom_free_memory(p.ptr,p.len),d.axiom_free_memory(g.ptr,g.len),d.axiom_free_memory(_.ptr,_.len),d.axiom_free_memory(v.ptr,v.len),d.axiom_free_memory(y.ptr,y.len),b&&d.axiom_free_memory(b,o.length)}function K(e,n,r,i){if(V(`IN`,i,{eventType:t[n.eventType],data:n.data,error:n.error}),n.eventType===t.Error){j(e,{state:`error`,error:n.error,isFetching:!1,isMutating:!1}),B(e,`error`),e.dispatchEvent(new CustomEvent(`atmx:error`,{bubbles:!0,detail:n.error}));return}if(n.data!==void 0){let i=`network`,a=!1;n.eventType===t.CacheHit?i=`cache`:n.eventType===t.CacheHitAndFetching?(i=`cache`,a=!0):n.eventType===t.NetworkSuccess&&(i=`network`);let s=r?`success`:`data`;if(j(e,{state:s,data:n.data,source:i,isFetching:a,isMutating:!1}),r){let t=e.getAttribute(`ax-invalidates`);t&&t.split(`,`).map(e=>e.trim()).forEach(t=>{let n=C(`\`${t}\``,k(e))||t;$.invalidate(n)});let n=e.getAttribute(`ax-store-token`);if(n){let t=C(n,k(e));if(t){let n=o(H(e,e.getAttribute(`ax-mutate`)).target)?.namespace||`default`,r=e.getAttribute(`ax-token-target`);(r?r.split(`,`).map(e=>e.trim()):[n]).forEach(e=>{$.setNamespaceAuthToken(e,t)})}}}B(e,s),e.dispatchEvent(new CustomEvent(r?`atmx:success`:`atmx:data`,{bubbles:!0,detail:n.data}))}}var q=new IntersectionObserver(e=>{e.forEach(e=>{if(e.isIntersecting){let t=e.target;t.hasAttribute(`ax-query`)&&U(t),q.unobserve(t)}})});function J(e){e.querySelectorAll(`[\\:ax-query], [\\:ax-mutate]`).forEach(e=>{if(e.hasAttribute(`:ax-query`)){let t=C(e.getAttribute(`:ax-query`),k(e));t&&e.setAttribute(`ax-query`,String(t)),e.removeAttribute(`:ax-query`)}if(e.hasAttribute(`:ax-mutate`)){let t=C(e.getAttribute(`:ax-mutate`),k(e));t&&e.setAttribute(`ax-mutate`,String(t)),e.removeAttribute(`:ax-mutate`)}})}function Y(e=document){J(e),e.querySelectorAll(`[ax-query]`).forEach(e=>{let t=e,n=t.getAttribute(`ax-query`);if(!n)return;let r=H(t,n);if(r){let e=`${r.target}:${JSON.stringify(r.args)}`;try{let n=sessionStorage.getItem(`atmx_cache_${e}`);n&&j(t,{state:`data`,data:JSON.parse(n),source:`cache`,isFetching:!0})}catch{}}})}function X(e=document){J(e),e.querySelectorAll(`[ax-query]`).forEach(e=>{let t=e;j(t,{});let n=t.getAttribute(`ax-trigger`)||`load`;n===`load`?U(t):n===`intersect`?q.observe(t):t.addEventListener(n,e=>{e.preventDefault(),U(t)})}),e.querySelectorAll(`[ax-mutate]`).forEach(e=>{let t=e;j(t,{});let n=t.tagName===`FORM`?`submit`:`click`;t.addEventListener(n,e=>{(t.tagName===`A`||t.tagName===`BUTTON`||t.tagName===`FORM`)&&e.preventDefault(),W(t)})}),e.querySelectorAll(`[ax-trigger="refresh"]`).forEach(e=>{let t=e;t.addEventListener(`click`,e=>{e.preventDefault();let n=t.closest(`[ax-query]`);if(n){let e=H(n,n.getAttribute(`ax-query`));if(e&&o(e.target)){let t=`${e.target}:${JSON.stringify(e.args)}`,r=P.get(t);r?r.fetch(!0):U(n)}}})})}function Z(){new MutationObserver(e=>{e.forEach(e=>{e.addedNodes.forEach(e=>{e instanceof HTMLElement&&X(e)})})}).observe(document.body,{childList:!0,subtree:!0})}var ee=class extends HTMLElement{constructor(){super()}connectedCallback(){let e=this.getAttribute(`loading-text`)||`Initializing...`,t=this.getAttribute(`ready-text`)||`Online`,n=this.getAttribute(`error-text`)||`Failed to Connect`;this.renderState(`loading`,e,`text-amber-500 animate-pulse`),document.addEventListener(`atmx:ready`,()=>{this.renderState(`ready`,t,`text-green-600`)}),document.addEventListener(`atmx:error`,e=>{let t=e;t.detail&&t.detail.stage===`runtime`&&this.renderState(`error`,`${n}: ${t.detail.message}`,`text-red-600`)})}renderState(e,t,n){this.setAttribute(`data-state`,e);let r=this.querySelectorAll(`[data-ax-when]`);r.length>0?r.forEach(t=>{t.getAttribute(`data-ax-when`)===e?t.removeAttribute(`hidden`):t.setAttribute(`hidden`,``)}):(this.innerText=t,this.getAttribute(`class`)||(this.className=`text-xs font-bold ${n}`))}};typeof window<`u`&&!customElements.get(`ax-engine-status`)&&customElements.define(`ax-engine-status`,ee);var Q=`0.125.0`,$=new class{version=Q;initialized=!1;debug=!1;async init(e){if(this.initialized)return{ok:!0,contracts:{},initDurationMs:0};let t=await _(e);return t.ok?(this.debug=e.debug||!1,Z(),X(document.body),this.initialized=!0,this.debug&&console.log(`%c🚀 ATMX Debug Mode: Enabled`,`color: #2563eb; font-weight: bold;`),console.log(`✅ ATMX v${this.version} Online (${t.initDurationMs}ms). Reactive Engine Started.`),document.dispatchEvent(new CustomEvent(`atmx:ready`,{detail:t}))):(console.error(`❌ ATMX Initialization Failed:`,t.error),document.dispatchEvent(new CustomEvent(`atmx:error`,{detail:t.error}))),t}hydrate(e){let t=document;e&&(t=typeof e==`string`?document.querySelector(e):e),t&&Y(t)}triggerQuery(e){let t=typeof e==`string`?document.querySelector(e):e;t&&t instanceof HTMLElement&&t.hasAttribute(`ax-query`)&&U(t)}on(e,t){document.addEventListener(`atmx:${e}`,t)}setAuthToken(e,t,n){v(e,t,n)}setNamespaceAuthToken(e,t){y(e,t)}setGlobalAuthToken(e){S(e)}sendStreamMessage(e,t){x(e,t)}clearAuthToken(e,t){b(e,t)}connect(e){let t=H(null,e);if(!t)return;let n=o(t.target);if(!n)return;let r=`${n.namespace}:${n.id}:${JSON.stringify(t.args)}`,i=P.get(r);i||(i=new N(r,n,t.args),P.set(r,i)),i.fetch()}disconnect(e){let t=H(null,e);if(!t)return;let r=o(t.target);if(!r)return;let i=`${r.namespace}:${r.id}:${JSON.stringify(t.args)}`,a=P.get(i);a&&(a.currentReqId&&n.delete(a.currentReqId),P.delete(i),this.debug&&console.log(`🔌 ATMX Disconnected Stream: ${e}`))}send(e,t){let n=H(null,e);if(!n)return;let r=o(n.target);if(!r)return;let i=`${r.namespace}:${r.id}:${JSON.stringify(n.args)}`,a=P.get(i);a&&a.currentReqId?x(a.currentReqId,t):console.warn(`ATMX: Cannot send message, stream not active for ${e}`)}mutate(e,t,n){return F(e,t,n)}mutateBytes(e,t,n,r={}){return F(e,t,{},{rawBody:n,headers:r})}invalidate(e,t){I(e,t)}setQueryData(e,t,n){L(e,t,n)}clearCache(e){R(e)}purgeCache(e){R(e,!1)}onError(e){document.addEventListener(`atmx:error`,t=>{e(t.detail)})}};typeof window<`u`&&(window.atmx=$),e.ATMX_VERSION=Q,e.allocBytes=m,e.allocString=h,e.atmx=$,e.buildRequestPath=s,e.clearAuthToken=b,e.initWasm=_,e.pendingRequests=n,e.resolveRoute=o,e.sendStreamMessage=x,e.setAuthToken=v,e.setGlobalAuthToken=S,Object.defineProperty(e,`wasmEngine`,{enumerable:!0,get:function(){return d}})});
825
+ `,d=null;function f(e){try{localStorage.removeItem(`atmx_auth_store`);let t=[...Array.isArray(e?.endpoints)?e.endpoints:Object.values(e?.endpoints||{}),...Array.isArray(e?.ir?.endpoints)?e.ir.endpoints:Object.values(e?.ir?.endpoints||{})];for(let e of t)for(let t of e?.auth?.methods||[]){let e=t?.name||t?.type;e&&localStorage.removeItem(`axiom_cache_auth_${e}`)}}catch{}}function p(e){return(e.auth?.methods||[]).filter(e=>e?.type?.toLowerCase()!==`session`).map(e=>e?.name||e?.type).filter(Boolean)}function m(e){if(e.length===0)return 0;let t=d.axiom_malloc(e.length);return new Uint8Array(d.memory.buffer).set(e,t),t}function h(e){if(!e)return{ptr:0,len:0};let t=new TextEncoder().encode(e);return{ptr:m(t),len:t.length}}function g(e){if(e.wasmUrl)return e.wasmUrl;let t=`https://atmx.axiomcore.dev/${e.engineVersion||`v0.126.0`}/axiom_runtime.wasm`;return e.disableCacheBuster||(t+=`?t=${Date.now()}`),t}async function _(e){let t=performance.now(),n={ok:!1,contracts:{},initDurationMs:0};try{if(!window.wasm_bindgen){let e=document.createElement(`script`);e.type=`text/javascript`,e.text=`${u}\nwindow.wasm_bindgen = wasm_bindgen;`,document.head.appendChild(e)}let t=window.wasm_bindgen,i=g(e);try{d=await t({module_or_path:fetch(i)})}catch(e){throw{stage:`ffiBoundary`,category:`network`,code:`WasmFetchFailed`,message:`Failed to download WASM engine: ${e.message}`,retryable:!0}}r(d),setInterval(()=>{d&&d.axiom_process_responses()},16);let o=h(``),s=d.axiom_wasm_initialize(o.ptr,o.len);if(d.axiom_free_memory(o.ptr,o.len),s!==0)throw{stage:`runtime`,category:`server`,code:`InitFailed`,message:`Engine init failed (Code: ${s})`,retryable:!1};for(let[t,r]of Object.entries(e.contracts))try{let i=await fetch(r.contractUrl);if(!i.ok)throw Error(`HTTP ${i.status}`);let o=await i.arrayBuffer(),s=0;try{let e=new TextDecoder().decode(o),n=JSON.parse(e),r=n?.ir?.endpoints;r&&(s=Array.isArray(r)?r.length:Object.keys(r).length),f(n),a(t,n)}catch(e){console.error(`ATMX: Failed to parse .axiom contract for '${t}'`,e)}let c=new Uint8Array(o),l=m(c),u=h(t),p=h(r.baseUrl),g=d.axiom_wasm_load_contract(u.ptr,u.len,p.ptr,p.len,l,c.length,0,0,0,0);if(d.axiom_free_memory(l,c.length),d.axiom_free_memory(u.ptr,u.len),d.axiom_free_memory(p.ptr,p.len),g!==0&&g!==-1)throw Error(`Load error (Code: ${g})`);e.debug&&console.log(`%c🔒 Axiom Contract Loaded: ${t} (${s} endpoints)`,`color: #10b981; font-weight: bold;`),n.contracts[t]={loaded:!0,endpointCount:s},document.dispatchEvent(new CustomEvent(`atmx:contract-loaded`,{detail:{namespace:t,endpointCount:s}}))}catch(e){n.contracts[t]={loaded:!1,endpointCount:0,error:e.message},console.error(`ATMX: Contract failed for ${t}`,e)}n.ok=!0}catch(e){n.ok=!1,n.error=e.stage?e:{stage:`runtime`,category:`unknown`,code:`FatalError`,message:e.message||String(e),retryable:!1}}return n.initDurationMs=Math.round(performance.now()-t),n}function v(e,t,n){if(!d)return;let r=h(e),i=h(t),a=h(n);d.axiom_wasm_set_auth_token(r.ptr,r.len,i.ptr,i.len,a.ptr,a.len),d.axiom_free_memory(r.ptr,r.len),d.axiom_free_memory(i.ptr,i.len),d.axiom_free_memory(a.ptr,a.len)}function y(e,t){if(!d)return;let n=new Set(l(e).flatMap(p));for(let r of n)v(e,r,t)}function b(e,t){if(!d)return;let n=h(e),r=h(t);d.axiom_wasm_clear_auth_token(n.ptr,n.len,r.ptr,r.len),d.axiom_free_memory(n.ptr,n.len),d.axiom_free_memory(r.ptr,r.len)}function x(e,t){if(!d)return;let n=new TextEncoder().encode(JSON.stringify(t)),r=m(n);d.axiom_wasm_send_stream_message(e,r,n.length),d.axiom_free_memory(r,n.length)}function S(e){if(!d)return;let t=new Map;for(let e of c()){let n=t.get(e.namespace)||new Set;p(e).forEach(e=>n.add(e)),t.set(e.namespace,n)}for(let[n,r]of t)for(let t of r)v(n,t,e)}function C(e,t,n={}){if(e)try{let r=Object.keys(n),i=Object.values(n);return Function(`$data`,`$error`,`$state`,...r,`return (${e});`)(t.data??null,t.error??null,t,...i)}catch(t){console.error(`ATMX Eval Error: ${e}`,t);return}}function w(e,t,n={}){if(e)try{let r=Object.keys(n),i=Object.values(n);Function(`$data`,`$error`,`$state`,...r,e)(t.data??null,t.error??null,t,...i)}catch(t){console.error(`ATMX Action Error: ${e}`,t)}}function T(e,t){E(e,t,!0,{})}function E(e,t,n,r){if(!(!n&&(e.hasAttribute(`ax-query`)||e.hasAttribute(`ax-mutate`)))&&!(!n&&e.hasAttribute(`data-ax-clone-of`))){if(e.hasAttribute(`ax-for`)){D(e,t,r);return}if(e.hasAttribute(`ax-when`)&&(e.getAttribute(`ax-when`).split(`,`).map(e=>e.trim()).includes(t.state)?(e.removeAttribute(`hidden`),e.style.removeProperty(`display`)):(e.setAttribute(`hidden`,`true`),e.style.setProperty(`display`,`none`,`important`))),e.hasAttribute(`ax-if`)&&(C(e.getAttribute(`ax-if`),t,r)?(e.removeAttribute(`hidden`),e.style.removeProperty(`display`)):(e.setAttribute(`hidden`,``),e.style.setProperty(`display`,`none`,`important`))),e.hasAttribute(`ax-text`)){let n=C(e.getAttribute(`ax-text`),t,r);e.textContent=n==null?``:String(n)}if(e.hasAttribute(`ax-error-for`)){let n=e.getAttribute(`ax-error-for`),r=``;if(t.state===`error`&&t.error?.code===`ValidationError`){let e=(t.error.details||``).split(`
826
+ `);for(let t of e)if(t.startsWith(n+`:`)){r=t.substring(n.length+1).trim();break}}let i=e.parentElement?.querySelector(`[name="${n}"]`);r?(e.textContent=r,e.removeAttribute(`hidden`),e.style.removeProperty(`display`),i&&(i.setAttribute(`aria-invalid`,`true`),i.classList.add(`border-red-500`,`focus:border-red-500`,`focus:ring-red-500`))):(e.setAttribute(`hidden`,``),e.style.setProperty(`display`,`none`,`important`),e.textContent=``,i&&(i.removeAttribute(`aria-invalid`),i.classList.remove(`border-red-500`,`focus:border-red-500`,`focus:ring-red-500`)))}Array.from(e.attributes).forEach(n=>{if(n.name.startsWith(`ax-bind:`)){let i=n.name.substring(8),a=C(n.value,t,r);a===!1||a==null?e.removeAttribute(i):e.setAttribute(i,a===!0?i:String(a))}}),Array.from(e.children).forEach(e=>{E(e,t,!1,r)})}}function D(e,t,n){e.style.display=`none`,e.hasAttribute(`data-ax-for-id`)||e.setAttribute(`data-ax-for-id`,Math.random().toString(36).substr(2,9));let r=e.getAttribute(`data-ax-for-id`),i=e.getAttribute(`ax-for`).match(/^\s*(?:(?:\(\s*([\w\$]+)\s*,\s*([\w\$]+)\s*\))|([\w\$]+))\s+in\s+(.+)$/);if(!i)return;let a=i[1]||i[3],o=i[2],s=i[4],c=C(s,t,n),l=e.parentElement;if(!l)return;let u=Array.from(l.querySelectorAll(`[data-ax-clone-of="${r}"]`));if(!c||!Array.isArray(c)){u.forEach(e=>e.remove());return}let d=e.getAttribute(`ax-key`),f=[];c.forEach((i,s)=>{let c={...n,[a]:i};o&&(c[o]=s);let p=String(s);d&&(p=String(C(d,t,c)));let m=u.find(e=>e.getAttribute(`data-ax-key`)===p);m||(m=e.cloneNode(!0),m.removeAttribute(`ax-for`),m.style.removeProperty(`display`),m.style.length===0&&m.removeAttribute(`style`),m.setAttribute(`data-ax-clone-of`,r),m.setAttribute(`data-ax-key`,p)),l.insertBefore(m,e),E(m,t,!0,c),f.push(m)}),u.forEach(e=>{f.includes(e)||e.remove()})}var O=new WeakMap;function k(e){return O.has(e)||O.set(e,{state:`idle`,isFetching:!1,isMutating:!1,source:null,data:null,error:null}),O.get(e)}function ee(e){let t=e.parentElement;for(;t;){if(t.hasAttribute(`ax-query`)||t.hasAttribute(`ax-mutate`)){let e=O.get(t);if(e&&e.data)return e.data}t=t.parentElement}return{}}function A(e,t){let n=k(e);Object.assign(n,t),t.state===`loading`&&(n.isFetching=!0),t.state===`mutating`&&(n.isMutating=!0),(t.state===`success`||t.state===`data`&&t.isFetching===!1)&&(n.isFetching=!1,n.isMutating=!1),O.set(e,n),T(e,n)}var j=0,M=class{key;route;args;state;listeners=new Set;currentReqId=null;constructor(e,t,n){this.key=e,this.route=t,this.args=n;let r=null;try{let t=sessionStorage.getItem(`atmx_cache_${e}`);t&&(r=JSON.parse(t))}catch{}r?this.state={state:`data`,isFetching:!1,source:`cache`,data:r,error:null}:this.state={state:`idle`,isFetching:!1,source:null,data:null,error:null}}subscribe(e){return this.listeners.add(e),e(this.state),()=>this.listeners.delete(e)}update(e){if(this.state={...this.state,...e},this.state.data)try{sessionStorage.setItem(`atmx_cache_${this.key}`,JSON.stringify(this.state.data))}catch{}this.listeners.forEach(e=>e(this.state))}fetch(e=!1){if(this.state.isFetching&&!e)return;this.update({state:this.state.data?`data`:`loading`,isFetching:!0,error:null});let r=++j;this.currentReqId=r;let{path:i,remainingArgs:a}=s(this.route,this.args),o=new Uint8Array;Object.keys(a).length>0&&(o=new TextEncoder().encode(JSON.stringify(a))),$.debug&&(console.groupCollapsed(`%c➔ WASM QUERY [#${r}]`,`color: #7c3aed; font-weight: bold;`),console.log(`Namespace:`,this.route.namespace),console.log(`Endpoint ID:`,this.route.id),console.log(`Path:`,i),console.groupEnd()),n.set(r,{isStream:this.route.isStream,onResponse:e=>{if(this.currentReqId===r){if(e.eventType===t.Error){this.update({state:`error`,error:e.error,isFetching:!1});return}if(e.data!==void 0){let n=`network`,r=!1;e.eventType===t.CacheHit?(n=`cache`,r=!1):e.eventType===t.CacheHitAndFetching?(n=`cache`,r=!0):e.eventType===t.NetworkSuccess&&(n=`network`,r=!1),this.update({state:`data`,data:e.data,source:n,isFetching:r})}}},onComplete:()=>{this.currentReqId===r&&this.update({isFetching:!1})}});let c=h(this.route.namespace),l=h(this.route.method),u=h(i),f=m(o),p=h(``),g=h(``);d.axiom_wasm_call(r,c.ptr,c.len,this.route.id,l.ptr,l.len,u.ptr,u.len,p.ptr,p.len,g.ptr,g.len,f,o.length),d.axiom_free_memory(c.ptr,c.len),d.axiom_free_memory(l.ptr,l.len),d.axiom_free_memory(u.ptr,u.len),d.axiom_free_memory(p.ptr,p.len),d.axiom_free_memory(g.ptr,g.len)}},N=new Map;function P(e,t={}){return`${e}:${JSON.stringify(t)}`}function F(e,t={}){let n=P(e,t),r=N.get(n);if(r?.state.data!==null&&r?.state.data!==void 0)return r.state.data;try{let e=sessionStorage.getItem(`atmx_cache_${n}`);return e?JSON.parse(e):null}catch{return null}}function I(e,t={}){let n=o(e);if(!n)throw Error(`ATMX Route not found: ${e}`);let r=P(e,t),i=N.get(r);i||(i=new M(r,n,t),N.set(r,i));let a=!1,s=new Set,c=i.subscribe(e=>{a||s.forEach(t=>t(e))});return i.fetch(),{getSnapshot:()=>({...i.state}),subscribe(e){return a?()=>{}:(s.add(e),e(i.state),()=>s.delete(e))},refresh(){a||i.fetch(!0)},dispose(){a||(a=!0,s.clear(),c())}}}function L(e,r={},i={},a={}){return new Promise((c,l)=>{let u=o(e);if(!u)return l(Error(`ATMX Route not found: ${e}`));let f=++j,{path:p,remainingArgs:g}=s(u,{...r,...i}),_=a.rawBody;if(!_){let e=g;u.bodyParam&&g[u.bodyParam]!==void 0&&typeof g[u.bodyParam]==`object`&&(e=g[u.bodyParam]),_=new Uint8Array,Object.keys(e).length>0&&(_=new TextEncoder().encode(JSON.stringify(e)))}let v=!1,y=e=>{v||(v=!0,c(e))},b=e=>{v||(v=!0,l(e))};n.set(f,{isStream:u.isStream,onResponse:e=>{e.eventType===t.Error?(document.dispatchEvent(new CustomEvent(`atmx:error`,{detail:e.error})),b(e.error)):e.data!==void 0&&y(e.data)},onComplete:()=>y(void 0)});let x=h(u.namespace),S=h(u.method),C=h(p),w=h(``),T=h(Object.keys(a.headers||{}).length>0?JSON.stringify(a.headers):``),E=m(_);d.axiom_wasm_call(f,x.ptr,x.len,u.id,S.ptr,S.len,C.ptr,C.len,w.ptr,w.len,T.ptr,T.len,E,_.length),d.axiom_free_memory(x.ptr,x.len),d.axiom_free_memory(S.ptr,S.len),d.axiom_free_memory(C.ptr,C.len),d.axiom_free_memory(w.ptr,w.len),d.axiom_free_memory(T.ptr,T.len),E&&d.axiom_free_memory(E,_.length)})}function R(e,t){let[n,r]=e.split(`.`),i=`atmx_cache_${e}`;t&&Object.keys(t).length>0&&(i+=`:${JSON.stringify(t)}`),Object.keys(sessionStorage).forEach(e=>{(e===i||!t&&e.startsWith(i+`:`))&&sessionStorage.removeItem(e)}),N.forEach((e,i)=>{e.route.namespace===n&&e.route.name===r&&(!t||Object.keys(t).length===0||JSON.stringify(e.args)===JSON.stringify(t))&&e.fetch(!0)})}function z(e,t={},n){let r=P(e,t);try{sessionStorage.setItem(`atmx_cache_${r}`,JSON.stringify(n))}catch{}let i=N.get(r);i&&i.update({state:`data`,source:`cache`,isFetching:!1,data:n,error:null})}function B(e,t=!0){let n=e?`atmx_cache_${e}.`:`atmx_cache_`;Object.keys(sessionStorage).forEach(e=>{e.startsWith(n)&&sessionStorage.removeItem(e)}),N.forEach(n=>{(!e||n.route.namespace===e)&&(n.update({state:`idle`,source:null,data:null,error:null,isFetching:!1}),t&&n.fetch(!0))})}var V=0;function H(e,t){let n=`ax-on:${t}`;e.hasAttribute(n)&&w(e.getAttribute(n),k(e))}function U(e,t,n){if(!$.debug)return;let r=e===`OUT`?`#7c3aed`:`#059669`;console.groupCollapsed(`%c${e===`OUT`?`➔ WASM CALL`:`← WASM RESP`} [#${t}]`,`color: ${r}; font-weight: bold;`),console.log(`Details:`,n),console.groupEnd()}function W(e,t){let n=t.trim().match(/^([\w\.\-]+)(?:\((.*)\))?$/);if(!n)return null;let r=n[1],i={};if(n[2]&&n[2].trim()!==``)try{if(e){let t=k(e),r=t.data||ee(e);i=Function(`$data`,`$state`,`return (${n[2]});`)(r??null,t)||{}}else i=Function(`return (${n[2]});`)()||{}}catch(e){console.error(`ATMX Scope Error in "${t}":`,e)}return{target:r,args:i}}function G(e){let t=e.getAttribute(`ax-query`);if(!t)return;let n=W(e,t);if(!n)return;let r=o(n.target);if(!r){A(e,{state:`error`,error:{message:`Route not found: ${n.target}`}});return}let i=`${n.target}:${JSON.stringify(n.args)}`,a=N.get(i);a||(a=new M(i,r,n.args),N.set(i,a)),e._axListener||(e._axListener=t=>{A(e,t),(t.state===`data`||t.state===`error`)&&(H(e,t.state),e.dispatchEvent(new CustomEvent(`atmx:${t.state}`,{bubbles:!0,detail:t.data||t.error})))},a.subscribe(e._axListener)),a.fetch()}function K(e){let t=e.getAttribute(`ax-mutate`);if(!t)return;let n=W(e,t);if(!n)return;let r=o(n.target);if(!r){console.error(`ATMX: Mutation route not found for target '${n.target}'. Check your ax-mutate attribute.`),A(e,{state:`error`,error:{message:`Route not found: ${n.target}`}}),H(e,`error`);return}A(e,{state:`mutating`,error:null,data:null}),H(e,`mutating`);let i={};e instanceof HTMLFormElement&&new FormData(e).forEach((t,n)=>{let r=e.elements.namedItem(n),a=!1;r instanceof HTMLInputElement?a=r.type===`number`:r instanceof RadioNodeList&&r.length>0&&(a=r[0].type===`number`);let o=a&&t!==``?Number(t):t;if(n.includes(`.`)){let e=n.split(`.`),t=i;for(let n=0;n<e.length-1;n++)t[e[n]]||(t[e[n]]={}),t=t[e[n]];t[e[e.length-1]]=o}else i[n]=o});let{path:a,remainingArgs:c}=s(r,{...i,...n.args}),l=c;r.bodyParam&&c[r.bodyParam]!==void 0&&typeof c[r.bodyParam]==`object`&&(l=c[r.bodyParam]);let u={},d=e.getAttribute(`ax-headers`);if(d)try{u=Function(`return (`+d+`);`)()||{}}catch(e){console.error(`ATMX: Invalid ax-headers syntax`,e)}let f=Object.entries(u).some(([e,t])=>e.toLowerCase()===`content-type`&&t.includes(`application/x-www-form-urlencoded`)),p=new Uint8Array;if(Object.keys(l).length>0)if(f){let e=new URLSearchParams;for(let[t,n]of Object.entries(l))e.append(t,String(n));p=new TextEncoder().encode(e.toString())}else p=new TextEncoder().encode(JSON.stringify(l));q(e,r.namespace,r.id,r.method,a,p,r.isStream,!0,u,f)}function q(e,t,r,i,a,o,s,c,l={},u=!1){let f=++V;U(`OUT`,f,{namespace:t,endpointId:r,method:i,path:a,headers:l,payload:o.length>0?u?new TextDecoder().decode(o):JSON.parse(new TextDecoder().decode(o)):null}),n.set(f,{isStream:s,onResponse:t=>J(e,t,c,f),onComplete:()=>{$.debug&&console.log(`%c✔ Stream Complete [#${f}]`,`color: #94a3b8;`)}});let p=h(t),g=h(i),_=h(a),v=h(``),y=h(Object.keys(l).length>0?JSON.stringify(l):``),b=m(o);d.axiom_wasm_call(f,p.ptr,p.len,r,g.ptr,g.len,_.ptr,_.len,v.ptr,v.len,y.ptr,y.len,b,o.length),d.axiom_free_memory(p.ptr,p.len),d.axiom_free_memory(g.ptr,g.len),d.axiom_free_memory(_.ptr,_.len),d.axiom_free_memory(v.ptr,v.len),d.axiom_free_memory(y.ptr,y.len),b&&d.axiom_free_memory(b,o.length)}function J(e,n,r,i){if(U(`IN`,i,{eventType:t[n.eventType],data:n.data,error:n.error}),n.eventType===t.Error){A(e,{state:`error`,error:n.error,isFetching:!1,isMutating:!1}),H(e,`error`),e.dispatchEvent(new CustomEvent(`atmx:error`,{bubbles:!0,detail:n.error}));return}if(n.data!==void 0){let i=`network`,a=!1;n.eventType===t.CacheHit?i=`cache`:n.eventType===t.CacheHitAndFetching?(i=`cache`,a=!0):n.eventType===t.NetworkSuccess&&(i=`network`);let s=r?`success`:`data`;if(A(e,{state:s,data:n.data,source:i,isFetching:a,isMutating:!1}),r){let t=e.getAttribute(`ax-invalidates`);t&&t.split(`,`).map(e=>e.trim()).forEach(t=>{let n=C(`\`${t}\``,k(e))||t;$.invalidate(n)});let n=e.getAttribute(`ax-store-token`);if(n){let t=C(n,k(e));if(t){let n=o(W(e,e.getAttribute(`ax-mutate`)).target)?.namespace||`default`,r=e.getAttribute(`ax-token-target`);(r?r.split(`,`).map(e=>e.trim()):[n]).forEach(e=>{$.setNamespaceAuthToken(e,t)})}}}H(e,s),e.dispatchEvent(new CustomEvent(r?`atmx:success`:`atmx:data`,{bubbles:!0,detail:n.data}))}}var Y=new IntersectionObserver(e=>{e.forEach(e=>{if(e.isIntersecting){let t=e.target;t.hasAttribute(`ax-query`)&&G(t),Y.unobserve(t)}})});function X(e){e.querySelectorAll(`[\\:ax-query], [\\:ax-mutate]`).forEach(e=>{if(e.hasAttribute(`:ax-query`)){let t=C(e.getAttribute(`:ax-query`),k(e));t&&e.setAttribute(`ax-query`,String(t)),e.removeAttribute(`:ax-query`)}if(e.hasAttribute(`:ax-mutate`)){let t=C(e.getAttribute(`:ax-mutate`),k(e));t&&e.setAttribute(`ax-mutate`,String(t)),e.removeAttribute(`:ax-mutate`)}})}function te(e=document){X(e),e.querySelectorAll(`[ax-query]`).forEach(e=>{let t=e,n=t.getAttribute(`ax-query`);if(!n)return;let r=W(t,n);if(r){let e=`${r.target}:${JSON.stringify(r.args)}`;try{let n=sessionStorage.getItem(`atmx_cache_${e}`);n&&A(t,{state:`data`,data:JSON.parse(n),source:`cache`,isFetching:!0})}catch{}}})}function Z(e=document){X(e),e.querySelectorAll(`[ax-query]`).forEach(e=>{let t=e;A(t,{});let n=t.getAttribute(`ax-trigger`)||`load`;n===`load`?G(t):n===`intersect`?Y.observe(t):t.addEventListener(n,e=>{e.preventDefault(),G(t)})}),e.querySelectorAll(`[ax-mutate]`).forEach(e=>{let t=e;A(t,{});let n=t.tagName===`FORM`?`submit`:`click`;t.addEventListener(n,e=>{(t.tagName===`A`||t.tagName===`BUTTON`||t.tagName===`FORM`)&&e.preventDefault(),K(t)})}),e.querySelectorAll(`[ax-trigger="refresh"]`).forEach(e=>{let t=e;t.addEventListener(`click`,e=>{e.preventDefault();let n=t.closest(`[ax-query]`);if(n){let e=W(n,n.getAttribute(`ax-query`));if(e&&o(e.target)){let t=`${e.target}:${JSON.stringify(e.args)}`,r=N.get(t);r?r.fetch(!0):G(n)}}})})}function ne(){new MutationObserver(e=>{e.forEach(e=>{e.addedNodes.forEach(e=>{e instanceof HTMLElement&&Z(e)})})}).observe(document.body,{childList:!0,subtree:!0})}var re=class extends HTMLElement{constructor(){super()}connectedCallback(){let e=this.getAttribute(`loading-text`)||`Initializing...`,t=this.getAttribute(`ready-text`)||`Online`,n=this.getAttribute(`error-text`)||`Failed to Connect`;this.renderState(`loading`,e,`text-amber-500 animate-pulse`),document.addEventListener(`atmx:ready`,()=>{this.renderState(`ready`,t,`text-green-600`)}),document.addEventListener(`atmx:error`,e=>{let t=e;t.detail&&t.detail.stage===`runtime`&&this.renderState(`error`,`${n}: ${t.detail.message}`,`text-red-600`)})}renderState(e,t,n){this.setAttribute(`data-state`,e);let r=this.querySelectorAll(`[data-ax-when]`);r.length>0?r.forEach(t=>{t.getAttribute(`data-ax-when`)===e?t.removeAttribute(`hidden`):t.setAttribute(`hidden`,``)}):(this.innerText=t,this.getAttribute(`class`)||(this.className=`text-xs font-bold ${n}`))}};typeof window<`u`&&!customElements.get(`ax-engine-status`)&&customElements.define(`ax-engine-status`,re);var Q=`0.126.0`,$=new class{version=Q;initialized=!1;debug=!1;async init(e){if(this.initialized)return{ok:!0,contracts:{},initDurationMs:0};let t=await _(e);return t.ok?(this.debug=e.debug||!1,ne(),Z(document.body),this.initialized=!0,this.debug&&console.log(`%c🚀 ATMX Debug Mode: Enabled`,`color: #2563eb; font-weight: bold;`),console.log(`✅ ATMX v${this.version} Online (${t.initDurationMs}ms). Reactive Engine Started.`),document.dispatchEvent(new CustomEvent(`atmx:ready`,{detail:t}))):(console.error(`❌ ATMX Initialization Failed:`,t.error),document.dispatchEvent(new CustomEvent(`atmx:error`,{detail:t.error}))),t}hydrate(e){let t=document;e&&(t=typeof e==`string`?document.querySelector(e):e),t&&te(t)}triggerQuery(e){let t=typeof e==`string`?document.querySelector(e):e;t&&t instanceof HTMLElement&&t.hasAttribute(`ax-query`)&&G(t)}on(e,t){document.addEventListener(`atmx:${e}`,t)}setAuthToken(e,t,n){v(e,t,n)}setNamespaceAuthToken(e,t){y(e,t)}setGlobalAuthToken(e){S(e)}sendStreamMessage(e,t){x(e,t)}clearAuthToken(e,t){b(e,t)}connect(e){let t=W(null,e);if(!t)return;let n=o(t.target);if(!n)return;let r=`${n.namespace}:${n.id}:${JSON.stringify(t.args)}`,i=N.get(r);i||(i=new M(r,n,t.args),N.set(r,i)),i.fetch()}disconnect(e){let t=W(null,e);if(!t)return;let r=o(t.target);if(!r)return;let i=`${r.namespace}:${r.id}:${JSON.stringify(t.args)}`,a=N.get(i);a&&(a.currentReqId&&n.delete(a.currentReqId),N.delete(i),this.debug&&console.log(`🔌 ATMX Disconnected Stream: ${e}`))}send(e,t){let n=W(null,e);if(!n)return;let r=o(n.target);if(!r)return;let i=`${r.namespace}:${r.id}:${JSON.stringify(n.args)}`,a=N.get(i);a&&a.currentReqId?x(a.currentReqId,t):console.warn(`ATMX: Cannot send message, stream not active for ${e}`)}mutate(e,t,n){return L(e,t,n)}query(e,t={}){return I(e,t)}getCachedQueryData(e,t={}){return F(e,t)}mutateBytes(e,t,n,r={}){return L(e,t,{},{rawBody:n,headers:r})}invalidate(e,t){R(e,t)}setQueryData(e,t,n){z(e,t,n)}clearCache(e){B(e)}purgeCache(e){B(e,!1)}onError(e){document.addEventListener(`atmx:error`,t=>{e(t.detail)})}};typeof window<`u`&&(window.atmx=$),e.ATMX_VERSION=Q,e.allocBytes=m,e.allocString=h,e.atmx=$,e.buildRequestPath=s,e.clearAuthToken=b,e.initWasm=_,e.pendingRequests=n,e.resolveRoute=o,e.sendStreamMessage=x,e.setAuthToken=v,e.setGlobalAuthToken=S,Object.defineProperty(e,`wasmEngine`,{enumerable:!0,get:function(){return d}})});
@@ -2,6 +2,19 @@ import { Route } from './router';
2
2
  import { AtmxContextData } from './context';
3
3
  export declare let globalReqCounter: number;
4
4
  type Listener = (state: Partial<AtmxContextData>) => void;
5
+ export interface ProgrammaticQuery {
6
+ /** The immediately available cache snapshot, if this endpoint has one. */
7
+ getSnapshot(): Partial<AtmxContextData>;
8
+ /**
9
+ * Receives the cache value synchronously and every later revalidation
10
+ * result. The returned function is safe to call more than once.
11
+ */
12
+ subscribe(listener: Listener): () => void;
13
+ /** Revalidate while retaining the current cache value on screen. */
14
+ refresh(): void;
15
+ /** Stops receiving updates; it never clears the shared Axiom cache. */
16
+ dispose(): void;
17
+ }
5
18
  export declare class ActiveQuery {
6
19
  key: string;
7
20
  route: Route;
@@ -10,11 +23,23 @@ export declare class ActiveQuery {
10
23
  listeners: Set<Listener>;
11
24
  currentReqId: number | null;
12
25
  constructor(key: string, route: Route, args: Record<string, any>);
13
- subscribe(listener: Listener): void;
26
+ subscribe(listener: Listener): () => void;
14
27
  update(newState: Partial<AtmxContextData>): void;
15
28
  fetch(force?: boolean): void;
16
29
  }
17
30
  export declare const queryRegistry: Map<string, ActiveQuery>;
31
+ /**
32
+ * Reads only ATMX's contract cache. Applications should use this instead of
33
+ * implementing a second localStorage cache for endpoint responses.
34
+ */
35
+ export declare function getCachedQueryData(routeKey: string, args?: Record<string, any>): any | null;
36
+ /**
37
+ * Starts a programmatic contract query with the exact same cache, runtime
38
+ * policy, authentication transport, and stale-while-revalidate behaviour as
39
+ * an `ax-query` element. This is intentionally not a mutation wrapper: GET
40
+ * endpoint cache policies are now honoured for imperative dashboard code.
41
+ */
42
+ export declare function executeProgrammaticQuery(routeKey: string, args?: Record<string, any>): ProgrammaticQuery;
18
43
  export interface ProgrammaticMutationOptions {
19
44
  /** Raw request bytes for endpoints such as contract uploads. */
20
45
  rawBody?: Uint8Array;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { AtmxConfig, AxiomError, InitResult } from './core/types';
2
- export declare const ATMX_VERSION = "0.125.0";
2
+ export declare const ATMX_VERSION = "0.126.0";
3
3
  declare class ATMX {
4
4
  version: string;
5
5
  initialized: boolean;
@@ -22,6 +22,13 @@ declare class ATMX {
22
22
  disconnect(rpcCall: string): void;
23
23
  send(rpcCall: string, payload: any): void;
24
24
  mutate(rpcCall: string, args?: Record<string, any>, payload?: any): Promise<any>;
25
+ /**
26
+ * Imperative counterpart to `ax-query`. It preserves an endpoint's Axiom
27
+ * cache policy, including cache-first stale-while-revalidate rendering.
28
+ */
29
+ query(rpcCall: string, args?: Record<string, any>): import('./core/query').ProgrammaticQuery;
30
+ /** Returns the persisted ATMX cache snapshot without issuing a request. */
31
+ getCachedQueryData(rpcCall: string, args?: Record<string, any>): any;
25
32
  /**
26
33
  * Calls a contract endpoint with an opaque request body while retaining the
27
34
  * same contract-driven authentication and cookie-session transport.
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "files": [
4
4
  "dist"
5
5
  ],
6
- "version": "0.125.0",
6
+ "version": "0.126.0",
7
7
  "description": "Axiom ATMX Core Runtime for Vanilla Web",
8
8
  "type": "module",
9
9
  "main": "./dist/atmx.umd.js",