atmx-web 0.103.0 → 0.106.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
@@ -128,7 +128,7 @@ function p(e) {
128
128
  };
129
129
  }
130
130
  function m(e) {
131
- let t = `https://atmx.axiomcore.dev/${e.engineVersion || "v0.103.0"}/axiom_runtime.wasm`;
131
+ let t = `https://atmx.axiomcore.dev/${e.engineVersion || "v0.106.0"}/axiom_runtime.wasm`;
132
132
  return e.disableCacheBuster || (t += `?t=${Date.now()}`), t;
133
133
  }
134
134
  async function h(e) {
@@ -294,7 +294,8 @@ function w(e, t, n, r) {
294
294
  break;
295
295
  }
296
296
  }
297
- r ? (e.textContent = r, e.removeAttribute("hidden"), e.style.removeProperty("display")) : (e.setAttribute("hidden", ""), e.style.setProperty("display", "none", "important"));
297
+ let i = e.parentElement?.querySelector(`[name="${n}"]`);
298
+ 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")));
298
299
  }
299
300
  Array.from(e.attributes).forEach((n) => {
300
301
  if (n.name.startsWith("ax-bind:")) {
@@ -412,7 +413,7 @@ var A = 0, j = class {
412
413
  let r = ++A;
413
414
  this.currentReqId = r;
414
415
  let { path: i, remainingArgs: a } = o(this.route, this.args), s = new Uint8Array();
415
- Object.keys(a).length > 0 && (s = new TextEncoder().encode(JSON.stringify(a))), J.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()), t.set(r, {
416
+ Object.keys(a).length > 0 && (s = new TextEncoder().encode(JSON.stringify(a))), Q.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()), t.set(r, {
416
417
  isStream: this.route.isStream,
417
418
  onResponse: (t) => {
418
419
  if (this.currentReqId === r) {
@@ -442,17 +443,71 @@ var A = 0, j = class {
442
443
  let c = p(this.route.namespace), l = p(this.route.method), d = p(i), m = f(s), h = p(""), g = p("");
443
444
  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, m, 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
445
  }
445
- }, M = /* @__PURE__ */ new Map(), N = 0;
446
+ }, M = /* @__PURE__ */ new Map();
447
+ function N(n, r = {}, i = {}) {
448
+ return new Promise((s, c) => {
449
+ let l = a(n);
450
+ if (!l) return c(/* @__PURE__ */ Error(`ATMX Route not found: ${n}`));
451
+ let d = ++A, { path: m, remainingArgs: h } = o(l, {
452
+ ...r,
453
+ ...i
454
+ }), g = h;
455
+ l.bodyParam && h[l.bodyParam] !== void 0 && typeof h[l.bodyParam] == "object" && (g = h[l.bodyParam]);
456
+ let _ = new Uint8Array();
457
+ Object.keys(g).length > 0 && (_ = new TextEncoder().encode(JSON.stringify(g))), t.set(d, {
458
+ isStream: l.isStream,
459
+ onResponse: (t) => {
460
+ t.eventType === e.Error ? (document.dispatchEvent(new CustomEvent("atmx:error", { detail: t.error })), c(t.error)) : t.data && s(t.data);
461
+ },
462
+ onComplete: () => {}
463
+ });
464
+ let v = p(l.namespace), y = p(l.method), b = p(m), x = p(""), S = p(""), C = f(_);
465
+ u.axiom_wasm_call(d, v.ptr, v.len, l.id, y.ptr, y.len, b.ptr, b.len, x.ptr, x.len, S.ptr, S.len, C, _.length), u.axiom_free_memory(v.ptr, v.len), u.axiom_free_memory(y.ptr, y.len), u.axiom_free_memory(b.ptr, b.len), u.axiom_free_memory(x.ptr, x.len), u.axiom_free_memory(S.ptr, S.len), C && u.axiom_free_memory(C, _.length);
466
+ });
467
+ }
446
468
  function P(e, t) {
469
+ let [n, r] = e.split("."), i = `atmx_cache_${e}`;
470
+ t && Object.keys(t).length > 0 && (i += `:${JSON.stringify(t)}`), Object.keys(sessionStorage).forEach((e) => {
471
+ (e === i || !t && e.startsWith(i + ":")) && sessionStorage.removeItem(e);
472
+ }), M.forEach((e, i) => {
473
+ e.route.namespace === n && e.route.name === r && (!t || Object.keys(t).length === 0 || JSON.stringify(e.args) === JSON.stringify(t)) && e.fetch(!0);
474
+ });
475
+ }
476
+ function F(e, t = {}, n) {
477
+ let r = `${e}:${JSON.stringify(t)}`;
478
+ try {
479
+ sessionStorage.setItem(`atmx_cache_${r}`, JSON.stringify(n));
480
+ } catch {}
481
+ let i = M.get(r);
482
+ i && i.update({
483
+ state: "data",
484
+ source: "cache",
485
+ isFetching: !1,
486
+ data: n,
487
+ error: null
488
+ });
489
+ }
490
+ function I(e) {
491
+ let t = e ? `atmx_cache_${e}.` : "atmx_cache_";
492
+ Object.keys(sessionStorage).forEach((e) => {
493
+ e.startsWith(t) && sessionStorage.removeItem(e);
494
+ }), M.forEach((t) => {
495
+ (!e || t.route.namespace === e) && t.fetch(!0);
496
+ });
497
+ }
498
+ //#endregion
499
+ //#region src/dom/lifecycle.ts
500
+ var L = 0;
501
+ function R(e, t) {
447
502
  let n = `ax-on:${t}`;
448
503
  e.hasAttribute(n) && S(e.getAttribute(n), D(e));
449
504
  }
450
- function F(e, t, n) {
451
- if (!J.debug) return;
505
+ function z(e, t, n) {
506
+ if (!Q.debug) return;
452
507
  let r = e === "OUT" ? "#7c3aed" : "#059669";
453
508
  console.groupCollapsed(`%c${e === "OUT" ? "➔ WASM CALL" : "← WASM RESP"} [#${t}]`, `color: ${r}; font-weight: bold;`), console.log("Details:", n), console.groupEnd();
454
509
  }
455
- function I(e, t) {
510
+ function B(e, t) {
456
511
  let n = t.trim().match(/^([\w\.\-]+)(?:\((.*)\))?$/);
457
512
  if (!n) return null;
458
513
  let r = n[1], i = {};
@@ -469,10 +524,10 @@ function I(e, t) {
469
524
  args: i
470
525
  };
471
526
  }
472
- function L(e) {
527
+ function V(e) {
473
528
  let t = e.getAttribute("ax-query");
474
529
  if (!t) return;
475
- let n = I(e, t);
530
+ let n = B(e, t);
476
531
  if (!n) return;
477
532
  let r = a(n.target);
478
533
  if (!r) {
@@ -484,30 +539,30 @@ function L(e) {
484
539
  }
485
540
  let i = `${n.target}:${JSON.stringify(n.args)}`, o = M.get(i);
486
541
  o || (o = new j(i, r, n.args), M.set(i, o)), e._axListener || (e._axListener = (t) => {
487
- k(e, t), (t.state === "data" || t.state === "error") && (P(e, t.state), e.dispatchEvent(new CustomEvent(`atmx:${t.state}`, {
542
+ k(e, t), (t.state === "data" || t.state === "error") && (R(e, t.state), e.dispatchEvent(new CustomEvent(`atmx:${t.state}`, {
488
543
  bubbles: !0,
489
544
  detail: t.data || t.error
490
545
  })));
491
546
  }, o.subscribe(e._axListener)), o.fetch();
492
547
  }
493
- function R(e) {
548
+ function H(e) {
494
549
  let t = e.getAttribute("ax-mutate");
495
550
  if (!t) return;
496
- let n = I(e, t);
551
+ let n = B(e, t);
497
552
  if (!n) return;
498
553
  let r = a(n.target);
499
554
  if (!r) {
500
555
  k(e, {
501
556
  state: "error",
502
557
  error: { message: `Route not found: ${n.target}` }
503
- }), P(e, "error");
558
+ }), R(e, "error");
504
559
  return;
505
560
  }
506
561
  k(e, {
507
562
  state: "mutating",
508
563
  error: null,
509
564
  data: null
510
- }), P(e, "mutating");
565
+ }), R(e, "mutating");
511
566
  let i = {};
512
567
  e instanceof HTMLFormElement && new FormData(e).forEach((t, n) => {
513
568
  let r = e.elements.namedItem(n), a = !1;
@@ -536,11 +591,11 @@ function R(e) {
536
591
  for (let [t, n] of Object.entries(l)) e.append(t, String(n));
537
592
  p = new TextEncoder().encode(e.toString());
538
593
  } else p = new TextEncoder().encode(JSON.stringify(l));
539
- z(e, r.namespace, r.id, r.method, s, p, r.isStream, !0, u, f);
594
+ U(e, r.namespace, r.id, r.method, s, p, r.isStream, !0, u, f);
540
595
  }
541
- function z(e, n, r, i, a, o, s, c, l = {}, d = !1) {
542
- let m = ++N;
543
- F("OUT", m, {
596
+ function U(e, n, r, i, a, o, s, c, l = {}, d = !1) {
597
+ let m = ++L;
598
+ z("OUT", m, {
544
599
  namespace: n,
545
600
  endpointId: r,
546
601
  method: i,
@@ -549,16 +604,16 @@ function z(e, n, r, i, a, o, s, c, l = {}, d = !1) {
549
604
  payload: o.length > 0 ? d ? new TextDecoder().decode(o) : JSON.parse(new TextDecoder().decode(o)) : null
550
605
  }), t.set(m, {
551
606
  isStream: s,
552
- onResponse: (t) => B(e, t, c, m),
607
+ onResponse: (t) => W(e, t, c, m),
553
608
  onComplete: () => {
554
- J.debug && console.log(`%c✔ Stream Complete [#${m}]`, "color: #94a3b8;");
609
+ Q.debug && console.log(`%c✔ Stream Complete [#${m}]`, "color: #94a3b8;");
555
610
  }
556
611
  });
557
612
  let h = p(n), g = p(i), _ = p(a), v = p(""), y = p(Object.keys(l).length > 0 ? JSON.stringify(l) : ""), b = f(o);
558
613
  u.axiom_wasm_call(m, 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);
559
614
  }
560
- function B(t, n, r, i) {
561
- if (F("IN", i, {
615
+ function W(t, n, r, i) {
616
+ if (z("IN", i, {
562
617
  eventType: e[n.eventType],
563
618
  data: n.data,
564
619
  error: n.error
@@ -568,7 +623,7 @@ function B(t, n, r, i) {
568
623
  error: n.error,
569
624
  isFetching: !1,
570
625
  isMutating: !1
571
- }), P(t, "error"), t.dispatchEvent(new CustomEvent("atmx:error", {
626
+ }), R(t, "error"), t.dispatchEvent(new CustomEvent("atmx:error", {
572
627
  bubbles: !0,
573
628
  detail: n.error
574
629
  }));
@@ -585,18 +640,23 @@ function B(t, n, r, i) {
585
640
  isFetching: o,
586
641
  isMutating: !1
587
642
  }), r) {
588
- let e = t.getAttribute("ax-store-token");
589
- if (e) {
590
- let n = x(e, D(t));
591
- if (n) {
592
- let e = a(I(t, t.getAttribute("ax-mutate")).target)?.namespace || "default", r = t.getAttribute("ax-token-target");
593
- (r ? r.split(",").map((e) => e.trim()) : [e]).forEach((e) => {
594
- J.setNamespaceAuthToken(e, n);
643
+ let e = t.getAttribute("ax-invalidates");
644
+ e && e.split(",").map((e) => e.trim()).forEach((e) => {
645
+ let n = x(`\`${e}\``, D(t)) || e;
646
+ Q.invalidate(n);
647
+ });
648
+ let n = t.getAttribute("ax-store-token");
649
+ if (n) {
650
+ let e = x(n, D(t));
651
+ if (e) {
652
+ let n = a(B(t, t.getAttribute("ax-mutate")).target)?.namespace || "default", r = t.getAttribute("ax-token-target");
653
+ (r ? r.split(",").map((e) => e.trim()) : [n]).forEach((t) => {
654
+ Q.setNamespaceAuthToken(t, e);
595
655
  });
596
656
  }
597
657
  }
598
658
  }
599
- P(t, s), t.dispatchEvent(new CustomEvent(r ? "atmx:success" : "atmx:data", {
659
+ R(t, s), t.dispatchEvent(new CustomEvent(r ? "atmx:success" : "atmx:data", {
600
660
  bubbles: !0,
601
661
  detail: n.data
602
662
  }));
@@ -604,15 +664,15 @@ function B(t, n, r, i) {
604
664
  }
605
665
  //#endregion
606
666
  //#region src/dom/scanner.ts
607
- var V = new IntersectionObserver((e) => {
667
+ var G = new IntersectionObserver((e) => {
608
668
  e.forEach((e) => {
609
669
  if (e.isIntersecting) {
610
670
  let t = e.target;
611
- t.hasAttribute("ax-query") && L(t), V.unobserve(t);
671
+ t.hasAttribute("ax-query") && V(t), G.unobserve(t);
612
672
  }
613
673
  });
614
674
  });
615
- function H(e) {
675
+ function K(e) {
616
676
  e.querySelectorAll("[\\:ax-query], [\\:ax-mutate]").forEach((e) => {
617
677
  if (e.hasAttribute(":ax-query")) {
618
678
  let t = x(e.getAttribute(":ax-query"), D(e));
@@ -624,11 +684,11 @@ function H(e) {
624
684
  }
625
685
  });
626
686
  }
627
- function U(e = document) {
628
- H(e), e.querySelectorAll("[ax-query]").forEach((e) => {
687
+ function q(e = document) {
688
+ K(e), e.querySelectorAll("[ax-query]").forEach((e) => {
629
689
  let t = e, n = t.getAttribute("ax-query");
630
690
  if (!n) return;
631
- let r = I(t, n);
691
+ let r = B(t, n);
632
692
  if (r) {
633
693
  let e = `${r.target}:${JSON.stringify(r.args)}`;
634
694
  try {
@@ -643,20 +703,20 @@ function U(e = document) {
643
703
  }
644
704
  });
645
705
  }
646
- function W(e = document) {
647
- H(e), e.querySelectorAll("[ax-query]").forEach((e) => {
706
+ function J(e = document) {
707
+ K(e), e.querySelectorAll("[ax-query]").forEach((e) => {
648
708
  let t = e;
649
709
  k(t, {});
650
710
  let n = t.getAttribute("ax-trigger") || "load";
651
- n === "load" ? L(t) : n === "intersect" ? V.observe(t) : t.addEventListener(n, (e) => {
652
- e.preventDefault(), L(t);
711
+ n === "load" ? V(t) : n === "intersect" ? G.observe(t) : t.addEventListener(n, (e) => {
712
+ e.preventDefault(), V(t);
653
713
  });
654
714
  }), e.querySelectorAll("[ax-mutate]").forEach((e) => {
655
715
  let t = e;
656
716
  k(t, {});
657
717
  let n = t.tagName === "FORM" ? "submit" : "click";
658
718
  t.addEventListener(n, (e) => {
659
- (t.tagName === "A" || t.tagName === "BUTTON" || t.tagName === "FORM") && e.preventDefault(), R(t);
719
+ (t.tagName === "A" || t.tagName === "BUTTON" || t.tagName === "FORM") && e.preventDefault(), H(t);
660
720
  });
661
721
  }), e.querySelectorAll("[ax-trigger=\"refresh\"]").forEach((e) => {
662
722
  let t = e;
@@ -664,20 +724,20 @@ function W(e = document) {
664
724
  e.preventDefault();
665
725
  let n = t.closest("[ax-query]");
666
726
  if (n) {
667
- let e = I(n, n.getAttribute("ax-query"));
727
+ let e = B(n, n.getAttribute("ax-query"));
668
728
  if (e && a(e.target)) {
669
729
  let t = `${e.target}:${JSON.stringify(e.args)}`, r = M.get(t);
670
- r ? r.fetch(!0) : L(n);
730
+ r ? r.fetch(!0) : V(n);
671
731
  }
672
732
  }
673
733
  });
674
734
  });
675
735
  }
676
- function G() {
736
+ function Y() {
677
737
  new MutationObserver((e) => {
678
738
  e.forEach((e) => {
679
739
  e.addedNodes.forEach((e) => {
680
- e instanceof HTMLElement && W(e);
740
+ e instanceof HTMLElement && J(e);
681
741
  });
682
742
  });
683
743
  }).observe(document.body, {
@@ -687,7 +747,7 @@ function G() {
687
747
  }
688
748
  //#endregion
689
749
  //#region src/dom/components/engine-status.ts
690
- var K = class extends HTMLElement {
750
+ var X = class extends HTMLElement {
691
751
  constructor() {
692
752
  super();
693
753
  }
@@ -708,11 +768,11 @@ var K = class extends HTMLElement {
708
768
  }) : (this.innerText = t, this.getAttribute("class") || (this.className = `text-xs font-bold ${n}`));
709
769
  }
710
770
  };
711
- typeof window < "u" && !customElements.get("ax-engine-status") && customElements.define("ax-engine-status", K);
771
+ typeof window < "u" && !customElements.get("ax-engine-status") && customElements.define("ax-engine-status", X);
712
772
  //#endregion
713
773
  //#region src/index.ts
714
- var q = "0.103.0", J = new class {
715
- version = q;
774
+ var Z = "0.106.0", Q = new class {
775
+ version = Z;
716
776
  initialized = !1;
717
777
  debug = !1;
718
778
  async init(e) {
@@ -722,15 +782,15 @@ var q = "0.103.0", J = new class {
722
782
  initDurationMs: 0
723
783
  };
724
784
  let t = await h(e);
725
- return t.ok ? (this.debug = e.debug || !1, G(), W(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;
785
+ return t.ok ? (this.debug = e.debug || !1, Y(), J(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;
726
786
  }
727
787
  hydrate(e) {
728
788
  let t = document;
729
- e && (t = typeof e == "string" ? document.querySelector(e) : e), t && U(t);
789
+ e && (t = typeof e == "string" ? document.querySelector(e) : e), t && q(t);
730
790
  }
731
791
  triggerQuery(e) {
732
792
  let t = typeof e == "string" ? document.querySelector(e) : e;
733
- t && t instanceof HTMLElement && t.hasAttribute("ax-query") && L(t);
793
+ t && t instanceof HTMLElement && t.hasAttribute("ax-query") && V(t);
734
794
  }
735
795
  on(e, t) {
736
796
  document.addEventListener(`atmx:${e}`, t);
@@ -751,7 +811,7 @@ var q = "0.103.0", J = new class {
751
811
  v(e, t);
752
812
  }
753
813
  connect(e) {
754
- let t = I(null, e);
814
+ let t = B(null, e);
755
815
  if (!t) return;
756
816
  let n = a(t.target);
757
817
  if (!n) return;
@@ -759,7 +819,7 @@ var q = "0.103.0", J = new class {
759
819
  i || (i = new j(r, n, t.args), M.set(r, i)), i.fetch();
760
820
  }
761
821
  disconnect(e) {
762
- let n = I(null, e);
822
+ let n = B(null, e);
763
823
  if (!n) return;
764
824
  let r = a(n.target);
765
825
  if (!r) return;
@@ -767,14 +827,31 @@ var q = "0.103.0", J = new class {
767
827
  o && (o.currentReqId && t.delete(o.currentReqId), M.delete(i), this.debug && console.log(`🔌 ATMX Disconnected Stream: ${e}`));
768
828
  }
769
829
  send(e, t) {
770
- let n = I(null, e);
830
+ let n = B(null, e);
771
831
  if (!n) return;
772
832
  let r = a(n.target);
773
833
  if (!r) return;
774
834
  let i = `${r.namespace}:${r.id}:${JSON.stringify(n.args)}`, o = M.get(i);
775
835
  o && o.currentReqId ? y(o.currentReqId, t) : console.warn(`ATMX: Cannot send message, stream not active for ${e}`);
776
836
  }
837
+ mutate(e, t, n) {
838
+ return N(e, t, n);
839
+ }
840
+ invalidate(e, t) {
841
+ P(e, t);
842
+ }
843
+ setQueryData(e, t, n) {
844
+ F(e, t, n);
845
+ }
846
+ clearCache(e) {
847
+ I(e);
848
+ }
849
+ onError(e) {
850
+ document.addEventListener("atmx:error", (t) => {
851
+ e(t.detail);
852
+ });
853
+ }
777
854
  }();
778
- typeof window < "u" && (window.atmx = J);
855
+ typeof window < "u" && (window.atmx = Q);
779
856
  //#endregion
780
- export { q as ATMX_VERSION, f as allocBytes, p as allocString, J as atmx, o as buildRequestPath, v as clearAuthToken, h as initWasm, t as pendingRequests, a as resolveRoute, y as sendStreamMessage, g as setAuthToken, b as setGlobalAuthToken, u as wasmEngine };
857
+ export { Z as ATMX_VERSION, f as allocBytes, p as allocString, Q as atmx, o as buildRequestPath, v as clearAuthToken, h as initWasm, t as pendingRequests, a as resolveRoute, y as sendStreamMessage, g as setAuthToken, b as setGlobalAuthToken, u as wasmEngine };
package/dist/atmx.umd.js CHANGED
@@ -825,5 +825,5 @@
825
825
 
826
826
  return Object.assign(__wbg_init, { initSync }, exports);
827
827
  })({ __proto__: null });
828
- `,d=null,f=`atmx_auth_store`;function p(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 m(e){if(!e)return{ptr:0,len:0};let t=new TextEncoder().encode(e);return{ptr:p(t),len:t.length}}function h(e){let t=`https://atmx.axiomcore.dev/${e.engineVersion||`v0.103.0`}/axiom_runtime.wasm`;return e.disableCacheBuster||(t+=`?t=${Date.now()}`),t}async function g(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=h(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=m(``),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};try{let e=JSON.parse(localStorage.getItem(f)||`{}`);for(let[t,n]of Object.entries(e))for(let[e,r]of Object.entries(n))_(t,e,r,!1)}catch(e){console.warn(`ATMX: Failed to hydrate auth tokens`,e)}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),a(t,n)}catch(e){console.error(`ATMX: Failed to parse .axiom contract for '${t}'`,e)}let c=new Uint8Array(o),l=p(c),u=m(t),f=m(r.baseUrl),h=d.axiom_wasm_load_contract(u.ptr,u.len,f.ptr,f.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(f.ptr,f.len),h!==0&&h!==-1)throw Error(`Load error (Code: ${h})`);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 _(e,t,n,r=!0){if(!d)return;if(r)try{let r=JSON.parse(localStorage.getItem(f)||`{}`);r[e]||(r[e]={}),r[e][t]=n,localStorage.setItem(f,JSON.stringify(r))}catch{}let i=m(e),a=m(t),o=m(n);d.axiom_wasm_set_auth_token(i.ptr,i.len,a.ptr,a.len,o.ptr,o.len),d.axiom_free_memory(i.ptr,i.len),d.axiom_free_memory(a.ptr,a.len),d.axiom_free_memory(o.ptr,o.len)}function v(e,t,n=!0){if(!d)return;let r=l(e),i=n?JSON.parse(localStorage.getItem(f)||`{}`):{};n&&!i[e]&&(i[e]={});for(let a of r){let r=m(a.namespace),o=m(a.name),s=m(t);d.axiom_wasm_set_auth_token(r.ptr,r.len,o.ptr,o.len,s.ptr,s.len),d.axiom_free_memory(r.ptr,r.len),d.axiom_free_memory(o.ptr,o.len),d.axiom_free_memory(s.ptr,s.len),n&&(i[e][a.name]=t)}n&&localStorage.setItem(f,JSON.stringify(i))}function y(e,t){if(!d)return;try{let n=JSON.parse(localStorage.getItem(f)||`{}`);n[e]&&(delete n[e][t],localStorage.setItem(f,JSON.stringify(n)))}catch{}let n=m(e),r=m(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 b(e,t){if(!d)return;let n=new TextEncoder().encode(JSON.stringify(t)),r=p(n);d.axiom_wasm_send_stream_message(e,r,n.length),d.axiom_free_memory(r,n.length)}function x(e,t=!0){if(!d)return;let n=c(),r=t?JSON.parse(localStorage.getItem(f)||`{}`):{};for(let i of n){let n=m(i.namespace),a=m(i.name),o=m(e);d.axiom_wasm_set_auth_token(n.ptr,n.len,a.ptr,a.len,o.ptr,o.len),d.axiom_free_memory(n.ptr,n.len),d.axiom_free_memory(a.ptr,a.len),d.axiom_free_memory(o.ptr,o.len),t&&(r[i.namespace]||(r[i.namespace]={}),r[i.namespace][i.name]=e)}t&&localStorage.setItem(f,JSON.stringify(r))}function S(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 C(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 w(e,t){T(e,t,!0,{})}function T(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`)){E(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`)&&(S(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=S(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(`
829
- `);for(let t of e)if(t.startsWith(n+`:`)){r=t.substring(n.length+1).trim();break}}r?(e.textContent=r,e.removeAttribute(`hidden`),e.style.removeProperty(`display`)):(e.setAttribute(`hidden`,``),e.style.setProperty(`display`,`none`,`important`))}Array.from(e.attributes).forEach(n=>{if(n.name.startsWith(`ax-bind:`)){let i=n.name.substring(8),a=S(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=>{T(e,t,!1,r)})}}function E(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=S(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(S(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),T(m,t,!0,c),f.push(m)}),u.forEach(e=>{f.includes(e)||e.remove()})}var D=new WeakMap;function O(e){return D.has(e)||D.set(e,{state:`idle`,isFetching:!1,isMutating:!1,source:null,data:null,error:null}),D.get(e)}function k(e){let t=e.parentElement;for(;t;){if(t.hasAttribute(`ax-query`)||t.hasAttribute(`ax-mutate`)){let e=D.get(t);if(e&&e.data)return e.data}t=t.parentElement}return{}}function A(e,t){let n=O(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),D.set(e,n),w(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){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=++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))),Y.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){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=m(this.route.namespace),l=m(this.route.method),u=m(i),f=p(o),h=m(``),g=m(``);d.axiom_wasm_call(r,c.ptr,c.len,this.route.id,l.ptr,l.len,u.ptr,u.len,h.ptr,h.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(h.ptr,h.len),d.axiom_free_memory(g.ptr,g.len)}},N=new Map,P=0;function F(e,t){let n=`ax-on:${t}`;e.hasAttribute(n)&&C(e.getAttribute(n),O(e))}function I(e,t,n){if(!Y.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 L(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=O(e),r=t.data||k(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 R(e){let t=e.getAttribute(`ax-query`);if(!t)return;let n=L(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`)&&(F(e,t.state),e.dispatchEvent(new CustomEvent(`atmx:${t.state}`,{bubbles:!0,detail:t.data||t.error})))},a.subscribe(e._axListener)),a.fetch()}function z(e){let t=e.getAttribute(`ax-mutate`);if(!t)return;let n=L(e,t);if(!n)return;let r=o(n.target);if(!r){A(e,{state:`error`,error:{message:`Route not found: ${n.target}`}}),F(e,`error`);return}A(e,{state:`mutating`,error:null,data:null}),F(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));B(e,r.namespace,r.id,r.method,a,p,r.isStream,!0,u,f)}function B(e,t,r,i,a,o,s,c,l={},u=!1){let f=++P;I(`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=>V(e,t,c,f),onComplete:()=>{Y.debug&&console.log(`%c✔ Stream Complete [#${f}]`,`color: #94a3b8;`)}});let h=m(t),g=m(i),_=m(a),v=m(``),y=m(Object.keys(l).length>0?JSON.stringify(l):``),b=p(o);d.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),d.axiom_free_memory(h.ptr,h.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 V(e,n,r,i){if(I(`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}),F(e,`error`),e.dispatchEvent(new CustomEvent(`atmx:error`,{bubbles:!0,detail:n.error}));return}if(n.data){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-store-token`);if(t){let n=S(t,O(e));if(n){let t=o(L(e,e.getAttribute(`ax-mutate`)).target)?.namespace||`default`,r=e.getAttribute(`ax-token-target`);(r?r.split(`,`).map(e=>e.trim()):[t]).forEach(e=>{Y.setNamespaceAuthToken(e,n)})}}}F(e,s),e.dispatchEvent(new CustomEvent(r?`atmx:success`:`atmx:data`,{bubbles:!0,detail:n.data}))}}var H=new IntersectionObserver(e=>{e.forEach(e=>{if(e.isIntersecting){let t=e.target;t.hasAttribute(`ax-query`)&&R(t),H.unobserve(t)}})});function U(e){e.querySelectorAll(`[\\:ax-query], [\\:ax-mutate]`).forEach(e=>{if(e.hasAttribute(`:ax-query`)){let t=S(e.getAttribute(`:ax-query`),O(e));t&&e.setAttribute(`ax-query`,String(t)),e.removeAttribute(`:ax-query`)}if(e.hasAttribute(`:ax-mutate`)){let t=S(e.getAttribute(`:ax-mutate`),O(e));t&&e.setAttribute(`ax-mutate`,String(t)),e.removeAttribute(`:ax-mutate`)}})}function W(e=document){U(e),e.querySelectorAll(`[ax-query]`).forEach(e=>{let t=e,n=t.getAttribute(`ax-query`);if(!n)return;let r=L(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 G(e=document){U(e),e.querySelectorAll(`[ax-query]`).forEach(e=>{let t=e;A(t,{});let n=t.getAttribute(`ax-trigger`)||`load`;n===`load`?R(t):n===`intersect`?H.observe(t):t.addEventListener(n,e=>{e.preventDefault(),R(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(),z(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=L(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):R(n)}}})})}function K(){new MutationObserver(e=>{e.forEach(e=>{e.addedNodes.forEach(e=>{e instanceof HTMLElement&&G(e)})})}).observe(document.body,{childList:!0,subtree:!0})}var q=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`,q);var J=`0.103.0`,Y=new class{version=J;initialized=!1;debug=!1;async init(e){if(this.initialized)return{ok:!0,contracts:{},initDurationMs:0};let t=await g(e);return t.ok?(this.debug=e.debug||!1,K(),G(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&&W(t)}triggerQuery(e){let t=typeof e==`string`?document.querySelector(e):e;t&&t instanceof HTMLElement&&t.hasAttribute(`ax-query`)&&R(t)}on(e,t){document.addEventListener(`atmx:${e}`,t)}setAuthToken(e,t,n){_(e,t,n)}setNamespaceAuthToken(e,t,n=!0){v(e,t,n)}setGlobalAuthToken(e){x(e)}sendStreamMessage(e,t){b(e,t)}clearAuthToken(e,t){y(e,t)}connect(e){let t=L(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=L(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=L(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?b(a.currentReqId,t):console.warn(`ATMX: Cannot send message, stream not active for ${e}`)}};typeof window<`u`&&(window.atmx=Y),e.ATMX_VERSION=J,e.allocBytes=p,e.allocString=m,e.atmx=Y,e.buildRequestPath=s,e.clearAuthToken=y,e.initWasm=g,e.pendingRequests=n,e.resolveRoute=o,e.sendStreamMessage=b,e.setAuthToken=_,e.setGlobalAuthToken=x,Object.defineProperty(e,`wasmEngine`,{enumerable:!0,get:function(){return d}})});
828
+ `,d=null,f=`atmx_auth_store`;function p(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 m(e){if(!e)return{ptr:0,len:0};let t=new TextEncoder().encode(e);return{ptr:p(t),len:t.length}}function h(e){let t=`https://atmx.axiomcore.dev/${e.engineVersion||`v0.106.0`}/axiom_runtime.wasm`;return e.disableCacheBuster||(t+=`?t=${Date.now()}`),t}async function g(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=h(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=m(``),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};try{let e=JSON.parse(localStorage.getItem(f)||`{}`);for(let[t,n]of Object.entries(e))for(let[e,r]of Object.entries(n))_(t,e,r,!1)}catch(e){console.warn(`ATMX: Failed to hydrate auth tokens`,e)}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),a(t,n)}catch(e){console.error(`ATMX: Failed to parse .axiom contract for '${t}'`,e)}let c=new Uint8Array(o),l=p(c),u=m(t),f=m(r.baseUrl),h=d.axiom_wasm_load_contract(u.ptr,u.len,f.ptr,f.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(f.ptr,f.len),h!==0&&h!==-1)throw Error(`Load error (Code: ${h})`);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 _(e,t,n,r=!0){if(!d)return;if(r)try{let r=JSON.parse(localStorage.getItem(f)||`{}`);r[e]||(r[e]={}),r[e][t]=n,localStorage.setItem(f,JSON.stringify(r))}catch{}let i=m(e),a=m(t),o=m(n);d.axiom_wasm_set_auth_token(i.ptr,i.len,a.ptr,a.len,o.ptr,o.len),d.axiom_free_memory(i.ptr,i.len),d.axiom_free_memory(a.ptr,a.len),d.axiom_free_memory(o.ptr,o.len)}function v(e,t,n=!0){if(!d)return;let r=l(e),i=n?JSON.parse(localStorage.getItem(f)||`{}`):{};n&&!i[e]&&(i[e]={});for(let a of r){let r=m(a.namespace),o=m(a.name),s=m(t);d.axiom_wasm_set_auth_token(r.ptr,r.len,o.ptr,o.len,s.ptr,s.len),d.axiom_free_memory(r.ptr,r.len),d.axiom_free_memory(o.ptr,o.len),d.axiom_free_memory(s.ptr,s.len),n&&(i[e][a.name]=t)}n&&localStorage.setItem(f,JSON.stringify(i))}function y(e,t){if(!d)return;try{let n=JSON.parse(localStorage.getItem(f)||`{}`);n[e]&&(delete n[e][t],localStorage.setItem(f,JSON.stringify(n)))}catch{}let n=m(e),r=m(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 b(e,t){if(!d)return;let n=new TextEncoder().encode(JSON.stringify(t)),r=p(n);d.axiom_wasm_send_stream_message(e,r,n.length),d.axiom_free_memory(r,n.length)}function x(e,t=!0){if(!d)return;let n=c(),r=t?JSON.parse(localStorage.getItem(f)||`{}`):{};for(let i of n){let n=m(i.namespace),a=m(i.name),o=m(e);d.axiom_wasm_set_auth_token(n.ptr,n.len,a.ptr,a.len,o.ptr,o.len),d.axiom_free_memory(n.ptr,n.len),d.axiom_free_memory(a.ptr,a.len),d.axiom_free_memory(o.ptr,o.len),t&&(r[i.namespace]||(r[i.namespace]={}),r[i.namespace][i.name]=e)}t&&localStorage.setItem(f,JSON.stringify(r))}function S(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 C(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 w(e,t){T(e,t,!0,{})}function T(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`)){E(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`)&&(S(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=S(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(`
829
+ `);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=S(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=>{T(e,t,!1,r)})}}function E(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=S(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(S(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),T(m,t,!0,c),f.push(m)}),u.forEach(e=>{f.includes(e)||e.remove()})}var D=new WeakMap;function O(e){return D.has(e)||D.set(e,{state:`idle`,isFetching:!1,isMutating:!1,source:null,data:null,error:null}),D.get(e)}function k(e){let t=e.parentElement;for(;t;){if(t.hasAttribute(`ax-query`)||t.hasAttribute(`ax-mutate`)){let e=D.get(t);if(e&&e.data)return e.data}t=t.parentElement}return{}}function A(e,t){let n=O(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),D.set(e,n),w(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){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=++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){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=m(this.route.namespace),l=m(this.route.method),u=m(i),f=p(o),h=m(``),g=m(``);d.axiom_wasm_call(r,c.ptr,c.len,this.route.id,l.ptr,l.len,u.ptr,u.len,h.ptr,h.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(h.ptr,h.len),d.axiom_free_memory(g.ptr,g.len)}},N=new Map;function P(e,r={},i={}){return new Promise((a,c)=>{let l=o(e);if(!l)return c(Error(`ATMX Route not found: ${e}`));let u=++j,{path:f,remainingArgs:h}=s(l,{...r,...i}),g=h;l.bodyParam&&h[l.bodyParam]!==void 0&&typeof h[l.bodyParam]==`object`&&(g=h[l.bodyParam]);let _=new Uint8Array;Object.keys(g).length>0&&(_=new TextEncoder().encode(JSON.stringify(g))),n.set(u,{isStream:l.isStream,onResponse:e=>{e.eventType===t.Error?(document.dispatchEvent(new CustomEvent(`atmx:error`,{detail:e.error})),c(e.error)):e.data&&a(e.data)},onComplete:()=>{}});let v=m(l.namespace),y=m(l.method),b=m(f),x=m(``),S=m(``),C=p(_);d.axiom_wasm_call(u,v.ptr,v.len,l.id,y.ptr,y.len,b.ptr,b.len,x.ptr,x.len,S.ptr,S.len,C,_.length),d.axiom_free_memory(v.ptr,v.len),d.axiom_free_memory(y.ptr,y.len),d.axiom_free_memory(b.ptr,b.len),d.axiom_free_memory(x.ptr,x.len),d.axiom_free_memory(S.ptr,S.len),C&&d.axiom_free_memory(C,_.length)})}function F(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 I(e,t={},n){let r=`${e}:${JSON.stringify(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 L(e){let t=e?`atmx_cache_${e}.`:`atmx_cache_`;Object.keys(sessionStorage).forEach(e=>{e.startsWith(t)&&sessionStorage.removeItem(e)}),N.forEach(t=>{(!e||t.route.namespace===e)&&t.fetch(!0)})}var R=0;function z(e,t){let n=`ax-on:${t}`;e.hasAttribute(n)&&C(e.getAttribute(n),O(e))}function B(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 V(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=O(e),r=t.data||k(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 H(e){let t=e.getAttribute(`ax-query`);if(!t)return;let n=V(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`)&&(z(e,t.state),e.dispatchEvent(new CustomEvent(`atmx:${t.state}`,{bubbles:!0,detail:t.data||t.error})))},a.subscribe(e._axListener)),a.fetch()}function U(e){let t=e.getAttribute(`ax-mutate`);if(!t)return;let n=V(e,t);if(!n)return;let r=o(n.target);if(!r){A(e,{state:`error`,error:{message:`Route not found: ${n.target}`}}),z(e,`error`);return}A(e,{state:`mutating`,error:null,data:null}),z(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));W(e,r.namespace,r.id,r.method,a,p,r.isStream,!0,u,f)}function W(e,t,r,i,a,o,s,c,l={},u=!1){let f=++R;B(`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=>G(e,t,c,f),onComplete:()=>{$.debug&&console.log(`%c✔ Stream Complete [#${f}]`,`color: #94a3b8;`)}});let h=m(t),g=m(i),_=m(a),v=m(``),y=m(Object.keys(l).length>0?JSON.stringify(l):``),b=p(o);d.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),d.axiom_free_memory(h.ptr,h.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 G(e,n,r,i){if(B(`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}),z(e,`error`),e.dispatchEvent(new CustomEvent(`atmx:error`,{bubbles:!0,detail:n.error}));return}if(n.data){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=S(`\`${t}\``,O(e))||t;$.invalidate(n)});let n=e.getAttribute(`ax-store-token`);if(n){let t=S(n,O(e));if(t){let n=o(V(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)})}}}z(e,s),e.dispatchEvent(new CustomEvent(r?`atmx:success`:`atmx:data`,{bubbles:!0,detail:n.data}))}}var K=new IntersectionObserver(e=>{e.forEach(e=>{if(e.isIntersecting){let t=e.target;t.hasAttribute(`ax-query`)&&H(t),K.unobserve(t)}})});function q(e){e.querySelectorAll(`[\\:ax-query], [\\:ax-mutate]`).forEach(e=>{if(e.hasAttribute(`:ax-query`)){let t=S(e.getAttribute(`:ax-query`),O(e));t&&e.setAttribute(`ax-query`,String(t)),e.removeAttribute(`:ax-query`)}if(e.hasAttribute(`:ax-mutate`)){let t=S(e.getAttribute(`:ax-mutate`),O(e));t&&e.setAttribute(`ax-mutate`,String(t)),e.removeAttribute(`:ax-mutate`)}})}function J(e=document){q(e),e.querySelectorAll(`[ax-query]`).forEach(e=>{let t=e,n=t.getAttribute(`ax-query`);if(!n)return;let r=V(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 Y(e=document){q(e),e.querySelectorAll(`[ax-query]`).forEach(e=>{let t=e;A(t,{});let n=t.getAttribute(`ax-trigger`)||`load`;n===`load`?H(t):n===`intersect`?K.observe(t):t.addEventListener(n,e=>{e.preventDefault(),H(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(),U(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=V(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):H(n)}}})})}function X(){new MutationObserver(e=>{e.forEach(e=>{e.addedNodes.forEach(e=>{e instanceof HTMLElement&&Y(e)})})}).observe(document.body,{childList:!0,subtree:!0})}var Z=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`,Z);var Q=`0.106.0`,$=new class{version=Q;initialized=!1;debug=!1;async init(e){if(this.initialized)return{ok:!0,contracts:{},initDurationMs:0};let t=await g(e);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}hydrate(e){let t=document;e&&(t=typeof e==`string`?document.querySelector(e):e),t&&J(t)}triggerQuery(e){let t=typeof e==`string`?document.querySelector(e):e;t&&t instanceof HTMLElement&&t.hasAttribute(`ax-query`)&&H(t)}on(e,t){document.addEventListener(`atmx:${e}`,t)}setAuthToken(e,t,n){_(e,t,n)}setNamespaceAuthToken(e,t,n=!0){v(e,t,n)}setGlobalAuthToken(e){x(e)}sendStreamMessage(e,t){b(e,t)}clearAuthToken(e,t){y(e,t)}connect(e){let t=V(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=V(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=V(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?b(a.currentReqId,t):console.warn(`ATMX: Cannot send message, stream not active for ${e}`)}mutate(e,t,n){return P(e,t,n)}invalidate(e,t){F(e,t)}setQueryData(e,t,n){I(e,t,n)}clearCache(e){L(e)}onError(e){document.addEventListener(`atmx:error`,t=>{e(t.detail)})}};typeof window<`u`&&(window.atmx=$),e.ATMX_VERSION=Q,e.allocBytes=p,e.allocString=m,e.atmx=$,e.buildRequestPath=s,e.clearAuthToken=y,e.initWasm=g,e.pendingRequests=n,e.resolveRoute=o,e.sendStreamMessage=b,e.setAuthToken=_,e.setGlobalAuthToken=x,Object.defineProperty(e,`wasmEngine`,{enumerable:!0,get:function(){return d}})});
@@ -1,5 +1,6 @@
1
1
  import { Route } from './router';
2
2
  import { AtmxContextData } from './context';
3
+ export declare let globalReqCounter: number;
3
4
  type Listener = (state: Partial<AtmxContextData>) => void;
4
5
  export declare class ActiveQuery {
5
6
  key: string;
@@ -14,4 +15,14 @@ export declare class ActiveQuery {
14
15
  fetch(force?: boolean): void;
15
16
  }
16
17
  export declare const queryRegistry: Map<string, ActiveQuery>;
18
+ /**
19
+ * IMPROVEMENT 1: Programmatic Mutations
20
+ */
21
+ export declare function executeProgrammaticMutation(routeKey: string, args?: Record<string, any>, payloadObj?: Record<string, any>): Promise<any>;
22
+ /**
23
+ * IMPROVEMENT 3: Cache Invalidation
24
+ */
25
+ export declare function invalidateQuery(routeKey: string, args?: Record<string, any>): void;
26
+ export declare function setQueryData(routeKey: string, args: Record<string, any> | undefined, newData: any): void;
27
+ export declare function clearAllCaches(namespace?: string): void;
17
28
  export {};
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { AtmxConfig, InitResult } from './core/types';
2
- export declare const ATMX_VERSION = "0.103.0";
1
+ import { AtmxConfig, AxiomError, InitResult } from './core/types';
2
+ export declare const ATMX_VERSION = "0.106.0";
3
3
  declare class ATMX {
4
4
  version: string;
5
5
  initialized: boolean;
@@ -16,6 +16,11 @@ declare class ATMX {
16
16
  connect(rpcCall: string): void;
17
17
  disconnect(rpcCall: string): void;
18
18
  send(rpcCall: string, payload: any): void;
19
+ mutate(rpcCall: string, args?: Record<string, any>, payload?: any): Promise<any>;
20
+ invalidate(rpcCall: string, args?: Record<string, any>): void;
21
+ setQueryData(rpcCall: string, args: Record<string, any>, data: any): void;
22
+ clearCache(namespace?: string): void;
23
+ onError(callback: (error: AxiomError) => void): void;
19
24
  }
20
25
  export declare const atmx: ATMX;
21
26
  export { initWasm, wasmEngine, allocBytes, allocString, setAuthToken, clearAuthToken, setGlobalAuthToken, sendStreamMessage, } from './core/wasm';
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "files": [
4
4
  "dist"
5
5
  ],
6
- "version": "0.103.0",
6
+ "version": "0.106.0",
7
7
  "description": "Axiom ATMX Core Runtime for Vanilla Web",
8
8
  "type": "module",
9
9
  "main": "./dist/atmx.umd.js",