@korajs/devtools 0.0.0-canary-20261008174129

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.
Files changed (46) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +49 -0
  3. package/dist/chunk-LQFL4TWM.js +999 -0
  4. package/dist/chunk-LQFL4TWM.js.map +1 -0
  5. package/dist/embed-overlay-Dwys5PYM.d.cts +170 -0
  6. package/dist/embed-overlay-Dwys5PYM.d.ts +170 -0
  7. package/dist/extension/background.cjs +65 -0
  8. package/dist/extension/background.cjs.map +1 -0
  9. package/dist/extension/background.d.cts +2 -0
  10. package/dist/extension/background.d.ts +2 -0
  11. package/dist/extension/background.js +63 -0
  12. package/dist/extension/background.js.map +1 -0
  13. package/dist/extension/content-script.cjs +18 -0
  14. package/dist/extension/content-script.cjs.map +1 -0
  15. package/dist/extension/content-script.d.cts +2 -0
  16. package/dist/extension/content-script.d.ts +2 -0
  17. package/dist/extension/content-script.js +16 -0
  18. package/dist/extension/content-script.js.map +1 -0
  19. package/dist/extension/devtools-page.html +45 -0
  20. package/dist/extension/devtools.cjs +8 -0
  21. package/dist/extension/devtools.cjs.map +1 -0
  22. package/dist/extension/devtools.d.cts +2 -0
  23. package/dist/extension/devtools.d.ts +2 -0
  24. package/dist/extension/devtools.html +599 -0
  25. package/dist/extension/devtools.js +6 -0
  26. package/dist/extension/devtools.js.map +1 -0
  27. package/dist/extension/manifest.json +20 -0
  28. package/dist/extension/panel.cjs +1311 -0
  29. package/dist/extension/panel.cjs.map +1 -0
  30. package/dist/extension/panel.d.cts +2 -0
  31. package/dist/extension/panel.d.ts +2 -0
  32. package/dist/extension/panel.js +1309 -0
  33. package/dist/extension/panel.js.map +1 -0
  34. package/dist/index.cjs +1353 -0
  35. package/dist/index.cjs.map +1 -0
  36. package/dist/index.d.cts +107 -0
  37. package/dist/index.d.ts +107 -0
  38. package/dist/index.js +326 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/overlay.cjs +1027 -0
  41. package/dist/overlay.cjs.map +1 -0
  42. package/dist/overlay.d.cts +2 -0
  43. package/dist/overlay.d.ts +2 -0
  44. package/dist/overlay.js +7 -0
  45. package/dist/overlay.js.map +1 -0
  46. package/package.json +55 -0
@@ -0,0 +1,1311 @@
1
+ "use strict";
2
+
3
+ // ../../node_modules/.pnpm/htm@3.1.1/node_modules/htm/dist/htm.mjs
4
+ var n = function(t4, s3, r3, e3) {
5
+ var u3;
6
+ s3[0] = 0;
7
+ for (var h3 = 1; h3 < s3.length; h3++) {
8
+ var p3 = s3[h3++], a3 = s3[h3] ? (s3[0] |= p3 ? 1 : 2, r3[s3[h3++]]) : s3[++h3];
9
+ 3 === p3 ? e3[0] = a3 : 4 === p3 ? e3[1] = Object.assign(e3[1] || {}, a3) : 5 === p3 ? (e3[1] = e3[1] || {})[s3[++h3]] = a3 : 6 === p3 ? e3[1][s3[++h3]] += a3 + "" : p3 ? (u3 = t4.apply(a3, n(t4, a3, r3, ["", null])), e3.push(u3), a3[0] ? s3[0] |= 2 : (s3[h3 - 2] = 0, s3[h3] = u3)) : e3.push(a3);
10
+ }
11
+ return e3;
12
+ };
13
+ var t = /* @__PURE__ */ new Map();
14
+ function htm_default(s3) {
15
+ var r3 = t.get(this);
16
+ return r3 || (r3 = /* @__PURE__ */ new Map(), t.set(this, r3)), (r3 = n(this, r3.get(s3) || (r3.set(s3, r3 = (function(n3) {
17
+ for (var t4, s4, r4 = 1, e3 = "", u3 = "", h3 = [0], p3 = function(n4) {
18
+ 1 === r4 && (n4 || (e3 = e3.replace(/^\s*\n\s*|\s*\n\s*$/g, ""))) ? h3.push(0, n4, e3) : 3 === r4 && (n4 || e3) ? (h3.push(3, n4, e3), r4 = 2) : 2 === r4 && "..." === e3 && n4 ? h3.push(4, n4, 0) : 2 === r4 && e3 && !n4 ? h3.push(5, 0, true, e3) : r4 >= 5 && ((e3 || !n4 && 5 === r4) && (h3.push(r4, 0, e3, s4), r4 = 6), n4 && (h3.push(r4, n4, 0, s4), r4 = 6)), e3 = "";
19
+ }, a3 = 0; a3 < n3.length; a3++) {
20
+ a3 && (1 === r4 && p3(), p3(a3));
21
+ for (var l3 = 0; l3 < n3[a3].length; l3++) t4 = n3[a3][l3], 1 === r4 ? "<" === t4 ? (p3(), h3 = [h3], r4 = 3) : e3 += t4 : 4 === r4 ? "--" === e3 && ">" === t4 ? (r4 = 1, e3 = "") : e3 = t4 + e3[0] : u3 ? t4 === u3 ? u3 = "" : e3 += t4 : '"' === t4 || "'" === t4 ? u3 = t4 : ">" === t4 ? (p3(), r4 = 1) : r4 && ("=" === t4 ? (r4 = 5, s4 = e3, e3 = "") : "/" === t4 && (r4 < 5 || ">" === n3[a3][l3 + 1]) ? (p3(), 3 === r4 && (h3 = h3[0]), r4 = h3, (h3 = h3[0]).push(2, 0, r4), r4 = 0) : " " === t4 || " " === t4 || "\n" === t4 || "\r" === t4 ? (p3(), r4 = 2) : e3 += t4), 3 === r4 && "!--" === e3 && (r4 = 4, h3 = h3[0]);
22
+ }
23
+ return p3(), h3;
24
+ })(s3)), r3), arguments, [])).length > 1 ? r3 : r3[0];
25
+ }
26
+
27
+ // ../../node_modules/.pnpm/preact@10.29.1/node_modules/preact/dist/preact.mjs
28
+ var n2;
29
+ var l;
30
+ var u;
31
+ var t2;
32
+ var i;
33
+ var r;
34
+ var o;
35
+ var e;
36
+ var f;
37
+ var c;
38
+ var s;
39
+ var a;
40
+ var h;
41
+ var p;
42
+ var v;
43
+ var y;
44
+ var d = {};
45
+ var w = [];
46
+ var _ = /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;
47
+ var g = Array.isArray;
48
+ function m(n3, l3) {
49
+ for (var u3 in l3) n3[u3] = l3[u3];
50
+ return n3;
51
+ }
52
+ function b(n3) {
53
+ n3 && n3.parentNode && n3.parentNode.removeChild(n3);
54
+ }
55
+ function k(l3, u3, t4) {
56
+ var i3, r3, o3, e3 = {};
57
+ for (o3 in u3) "key" == o3 ? i3 = u3[o3] : "ref" == o3 ? r3 = u3[o3] : e3[o3] = u3[o3];
58
+ if (arguments.length > 2 && (e3.children = arguments.length > 3 ? n2.call(arguments, 2) : t4), "function" == typeof l3 && null != l3.defaultProps) for (o3 in l3.defaultProps) void 0 === e3[o3] && (e3[o3] = l3.defaultProps[o3]);
59
+ return x(l3, e3, i3, r3, null);
60
+ }
61
+ function x(n3, t4, i3, r3, o3) {
62
+ var e3 = { type: n3, props: t4, key: i3, ref: r3, __k: null, __: null, __b: 0, __e: null, __c: null, constructor: void 0, __v: null == o3 ? ++u : o3, __i: -1, __u: 0 };
63
+ return null == o3 && null != l.vnode && l.vnode(e3), e3;
64
+ }
65
+ function S(n3) {
66
+ return n3.children;
67
+ }
68
+ function C(n3, l3) {
69
+ this.props = n3, this.context = l3;
70
+ }
71
+ function $(n3, l3) {
72
+ if (null == l3) return n3.__ ? $(n3.__, n3.__i + 1) : null;
73
+ for (var u3; l3 < n3.__k.length; l3++) if (null != (u3 = n3.__k[l3]) && null != u3.__e) return u3.__e;
74
+ return "function" == typeof n3.type ? $(n3) : null;
75
+ }
76
+ function I(n3) {
77
+ if (n3.__P && n3.__d) {
78
+ var u3 = n3.__v, t4 = u3.__e, i3 = [], r3 = [], o3 = m({}, u3);
79
+ o3.__v = u3.__v + 1, l.vnode && l.vnode(o3), q(n3.__P, o3, u3, n3.__n, n3.__P.namespaceURI, 32 & u3.__u ? [t4] : null, i3, null == t4 ? $(u3) : t4, !!(32 & u3.__u), r3), o3.__v = u3.__v, o3.__.__k[o3.__i] = o3, D(i3, o3, r3), u3.__e = u3.__ = null, o3.__e != t4 && P(o3);
80
+ }
81
+ }
82
+ function P(n3) {
83
+ if (null != (n3 = n3.__) && null != n3.__c) return n3.__e = n3.__c.base = null, n3.__k.some(function(l3) {
84
+ if (null != l3 && null != l3.__e) return n3.__e = n3.__c.base = l3.__e;
85
+ }), P(n3);
86
+ }
87
+ function A(n3) {
88
+ (!n3.__d && (n3.__d = true) && i.push(n3) && !H.__r++ || r != l.debounceRendering) && ((r = l.debounceRendering) || o)(H);
89
+ }
90
+ function H() {
91
+ try {
92
+ for (var n3, l3 = 1; i.length; ) i.length > l3 && i.sort(e), n3 = i.shift(), l3 = i.length, I(n3);
93
+ } finally {
94
+ i.length = H.__r = 0;
95
+ }
96
+ }
97
+ function L(n3, l3, u3, t4, i3, r3, o3, e3, f3, c3, s3) {
98
+ var a3, h3, p3, v3, y2, _2, g2, m3 = t4 && t4.__k || w, b2 = l3.length;
99
+ for (f3 = T(u3, l3, m3, f3, b2), a3 = 0; a3 < b2; a3++) null != (p3 = u3.__k[a3]) && (h3 = -1 != p3.__i && m3[p3.__i] || d, p3.__i = a3, _2 = q(n3, p3, h3, i3, r3, o3, e3, f3, c3, s3), v3 = p3.__e, p3.ref && h3.ref != p3.ref && (h3.ref && J(h3.ref, null, p3), s3.push(p3.ref, p3.__c || v3, p3)), null == y2 && null != v3 && (y2 = v3), (g2 = !!(4 & p3.__u)) || h3.__k === p3.__k ? (f3 = j(p3, f3, n3, g2), g2 && h3.__e && (h3.__e = null)) : "function" == typeof p3.type && void 0 !== _2 ? f3 = _2 : v3 && (f3 = v3.nextSibling), p3.__u &= -7);
100
+ return u3.__e = y2, f3;
101
+ }
102
+ function T(n3, l3, u3, t4, i3) {
103
+ var r3, o3, e3, f3, c3, s3 = u3.length, a3 = s3, h3 = 0;
104
+ for (n3.__k = new Array(i3), r3 = 0; r3 < i3; r3++) null != (o3 = l3[r3]) && "boolean" != typeof o3 && "function" != typeof o3 ? ("string" == typeof o3 || "number" == typeof o3 || "bigint" == typeof o3 || o3.constructor == String ? o3 = n3.__k[r3] = x(null, o3, null, null, null) : g(o3) ? o3 = n3.__k[r3] = x(S, { children: o3 }, null, null, null) : void 0 === o3.constructor && o3.__b > 0 ? o3 = n3.__k[r3] = x(o3.type, o3.props, o3.key, o3.ref ? o3.ref : null, o3.__v) : n3.__k[r3] = o3, f3 = r3 + h3, o3.__ = n3, o3.__b = n3.__b + 1, e3 = null, -1 != (c3 = o3.__i = O(o3, u3, f3, a3)) && (a3--, (e3 = u3[c3]) && (e3.__u |= 2)), null == e3 || null == e3.__v ? (-1 == c3 && (i3 > s3 ? h3-- : i3 < s3 && h3++), "function" != typeof o3.type && (o3.__u |= 4)) : c3 != f3 && (c3 == f3 - 1 ? h3-- : c3 == f3 + 1 ? h3++ : (c3 > f3 ? h3-- : h3++, o3.__u |= 4))) : n3.__k[r3] = null;
105
+ if (a3) for (r3 = 0; r3 < s3; r3++) null != (e3 = u3[r3]) && 0 == (2 & e3.__u) && (e3.__e == t4 && (t4 = $(e3)), K(e3, e3));
106
+ return t4;
107
+ }
108
+ function j(n3, l3, u3, t4) {
109
+ var i3, r3;
110
+ if ("function" == typeof n3.type) {
111
+ for (i3 = n3.__k, r3 = 0; i3 && r3 < i3.length; r3++) i3[r3] && (i3[r3].__ = n3, l3 = j(i3[r3], l3, u3, t4));
112
+ return l3;
113
+ }
114
+ n3.__e != l3 && (t4 && (l3 && n3.type && !l3.parentNode && (l3 = $(n3)), u3.insertBefore(n3.__e, l3 || null)), l3 = n3.__e);
115
+ do {
116
+ l3 = l3 && l3.nextSibling;
117
+ } while (null != l3 && 8 == l3.nodeType);
118
+ return l3;
119
+ }
120
+ function O(n3, l3, u3, t4) {
121
+ var i3, r3, o3, e3 = n3.key, f3 = n3.type, c3 = l3[u3], s3 = null != c3 && 0 == (2 & c3.__u);
122
+ if (null === c3 && null == e3 || s3 && e3 == c3.key && f3 == c3.type) return u3;
123
+ if (t4 > (s3 ? 1 : 0)) {
124
+ for (i3 = u3 - 1, r3 = u3 + 1; i3 >= 0 || r3 < l3.length; ) if (null != (c3 = l3[o3 = i3 >= 0 ? i3-- : r3++]) && 0 == (2 & c3.__u) && e3 == c3.key && f3 == c3.type) return o3;
125
+ }
126
+ return -1;
127
+ }
128
+ function z(n3, l3, u3) {
129
+ "-" == l3[0] ? n3.setProperty(l3, null == u3 ? "" : u3) : n3[l3] = null == u3 ? "" : "number" != typeof u3 || _.test(l3) ? u3 : u3 + "px";
130
+ }
131
+ function N(n3, l3, u3, t4, i3) {
132
+ var r3, o3;
133
+ n: if ("style" == l3) if ("string" == typeof u3) n3.style.cssText = u3;
134
+ else {
135
+ if ("string" == typeof t4 && (n3.style.cssText = t4 = ""), t4) for (l3 in t4) u3 && l3 in u3 || z(n3.style, l3, "");
136
+ if (u3) for (l3 in u3) t4 && u3[l3] == t4[l3] || z(n3.style, l3, u3[l3]);
137
+ }
138
+ else if ("o" == l3[0] && "n" == l3[1]) r3 = l3 != (l3 = l3.replace(a, "$1")), o3 = l3.toLowerCase(), l3 = o3 in n3 || "onFocusOut" == l3 || "onFocusIn" == l3 ? o3.slice(2) : l3.slice(2), n3.l || (n3.l = {}), n3.l[l3 + r3] = u3, u3 ? t4 ? u3[s] = t4[s] : (u3[s] = h, n3.addEventListener(l3, r3 ? v : p, r3)) : n3.removeEventListener(l3, r3 ? v : p, r3);
139
+ else {
140
+ if ("http://www.w3.org/2000/svg" == i3) l3 = l3.replace(/xlink(H|:h)/, "h").replace(/sName$/, "s");
141
+ else if ("width" != l3 && "height" != l3 && "href" != l3 && "list" != l3 && "form" != l3 && "tabIndex" != l3 && "download" != l3 && "rowSpan" != l3 && "colSpan" != l3 && "role" != l3 && "popover" != l3 && l3 in n3) try {
142
+ n3[l3] = null == u3 ? "" : u3;
143
+ break n;
144
+ } catch (n4) {
145
+ }
146
+ "function" == typeof u3 || (null == u3 || false === u3 && "-" != l3[4] ? n3.removeAttribute(l3) : n3.setAttribute(l3, "popover" == l3 && 1 == u3 ? "" : u3));
147
+ }
148
+ }
149
+ function V(n3) {
150
+ return function(u3) {
151
+ if (this.l) {
152
+ var t4 = this.l[u3.type + n3];
153
+ if (null == u3[c]) u3[c] = h++;
154
+ else if (u3[c] < t4[s]) return;
155
+ return t4(l.event ? l.event(u3) : u3);
156
+ }
157
+ };
158
+ }
159
+ function q(n3, u3, t4, i3, r3, o3, e3, f3, c3, s3) {
160
+ var a3, h3, p3, v3, y2, d3, _2, k3, x2, M, $2, I2, P2, A2, H2, T3 = u3.type;
161
+ if (void 0 !== u3.constructor) return null;
162
+ 128 & t4.__u && (c3 = !!(32 & t4.__u), o3 = [f3 = u3.__e = t4.__e]), (a3 = l.__b) && a3(u3);
163
+ n: if ("function" == typeof T3) try {
164
+ if (k3 = u3.props, x2 = T3.prototype && T3.prototype.render, M = (a3 = T3.contextType) && i3[a3.__c], $2 = a3 ? M ? M.props.value : a3.__ : i3, t4.__c ? _2 = (h3 = u3.__c = t4.__c).__ = h3.__E : (x2 ? u3.__c = h3 = new T3(k3, $2) : (u3.__c = h3 = new C(k3, $2), h3.constructor = T3, h3.render = Q), M && M.sub(h3), h3.state || (h3.state = {}), h3.__n = i3, p3 = h3.__d = true, h3.__h = [], h3._sb = []), x2 && null == h3.__s && (h3.__s = h3.state), x2 && null != T3.getDerivedStateFromProps && (h3.__s == h3.state && (h3.__s = m({}, h3.__s)), m(h3.__s, T3.getDerivedStateFromProps(k3, h3.__s))), v3 = h3.props, y2 = h3.state, h3.__v = u3, p3) x2 && null == T3.getDerivedStateFromProps && null != h3.componentWillMount && h3.componentWillMount(), x2 && null != h3.componentDidMount && h3.__h.push(h3.componentDidMount);
165
+ else {
166
+ if (x2 && null == T3.getDerivedStateFromProps && k3 !== v3 && null != h3.componentWillReceiveProps && h3.componentWillReceiveProps(k3, $2), u3.__v == t4.__v || !h3.__e && null != h3.shouldComponentUpdate && false === h3.shouldComponentUpdate(k3, h3.__s, $2)) {
167
+ u3.__v != t4.__v && (h3.props = k3, h3.state = h3.__s, h3.__d = false), u3.__e = t4.__e, u3.__k = t4.__k, u3.__k.some(function(n4) {
168
+ n4 && (n4.__ = u3);
169
+ }), w.push.apply(h3.__h, h3._sb), h3._sb = [], h3.__h.length && e3.push(h3);
170
+ break n;
171
+ }
172
+ null != h3.componentWillUpdate && h3.componentWillUpdate(k3, h3.__s, $2), x2 && null != h3.componentDidUpdate && h3.__h.push(function() {
173
+ h3.componentDidUpdate(v3, y2, d3);
174
+ });
175
+ }
176
+ if (h3.context = $2, h3.props = k3, h3.__P = n3, h3.__e = false, I2 = l.__r, P2 = 0, x2) h3.state = h3.__s, h3.__d = false, I2 && I2(u3), a3 = h3.render(h3.props, h3.state, h3.context), w.push.apply(h3.__h, h3._sb), h3._sb = [];
177
+ else do {
178
+ h3.__d = false, I2 && I2(u3), a3 = h3.render(h3.props, h3.state, h3.context), h3.state = h3.__s;
179
+ } while (h3.__d && ++P2 < 25);
180
+ h3.state = h3.__s, null != h3.getChildContext && (i3 = m(m({}, i3), h3.getChildContext())), x2 && !p3 && null != h3.getSnapshotBeforeUpdate && (d3 = h3.getSnapshotBeforeUpdate(v3, y2)), A2 = null != a3 && a3.type === S && null == a3.key ? E(a3.props.children) : a3, f3 = L(n3, g(A2) ? A2 : [A2], u3, t4, i3, r3, o3, e3, f3, c3, s3), h3.base = u3.__e, u3.__u &= -161, h3.__h.length && e3.push(h3), _2 && (h3.__E = h3.__ = null);
181
+ } catch (n4) {
182
+ if (u3.__v = null, c3 || null != o3) if (n4.then) {
183
+ for (u3.__u |= c3 ? 160 : 128; f3 && 8 == f3.nodeType && f3.nextSibling; ) f3 = f3.nextSibling;
184
+ o3[o3.indexOf(f3)] = null, u3.__e = f3;
185
+ } else {
186
+ for (H2 = o3.length; H2--; ) b(o3[H2]);
187
+ B(u3);
188
+ }
189
+ else u3.__e = t4.__e, u3.__k = t4.__k, n4.then || B(u3);
190
+ l.__e(n4, u3, t4);
191
+ }
192
+ else null == o3 && u3.__v == t4.__v ? (u3.__k = t4.__k, u3.__e = t4.__e) : f3 = u3.__e = G(t4.__e, u3, t4, i3, r3, o3, e3, c3, s3);
193
+ return (a3 = l.diffed) && a3(u3), 128 & u3.__u ? void 0 : f3;
194
+ }
195
+ function B(n3) {
196
+ n3 && (n3.__c && (n3.__c.__e = true), n3.__k && n3.__k.some(B));
197
+ }
198
+ function D(n3, u3, t4) {
199
+ for (var i3 = 0; i3 < t4.length; i3++) J(t4[i3], t4[++i3], t4[++i3]);
200
+ l.__c && l.__c(u3, n3), n3.some(function(u4) {
201
+ try {
202
+ n3 = u4.__h, u4.__h = [], n3.some(function(n4) {
203
+ n4.call(u4);
204
+ });
205
+ } catch (n4) {
206
+ l.__e(n4, u4.__v);
207
+ }
208
+ });
209
+ }
210
+ function E(n3) {
211
+ return "object" != typeof n3 || null == n3 || n3.__b > 0 ? n3 : g(n3) ? n3.map(E) : m({}, n3);
212
+ }
213
+ function G(u3, t4, i3, r3, o3, e3, f3, c3, s3) {
214
+ var a3, h3, p3, v3, y2, w3, _2, m3 = i3.props || d, k3 = t4.props, x2 = t4.type;
215
+ if ("svg" == x2 ? o3 = "http://www.w3.org/2000/svg" : "math" == x2 ? o3 = "http://www.w3.org/1998/Math/MathML" : o3 || (o3 = "http://www.w3.org/1999/xhtml"), null != e3) {
216
+ for (a3 = 0; a3 < e3.length; a3++) if ((y2 = e3[a3]) && "setAttribute" in y2 == !!x2 && (x2 ? y2.localName == x2 : 3 == y2.nodeType)) {
217
+ u3 = y2, e3[a3] = null;
218
+ break;
219
+ }
220
+ }
221
+ if (null == u3) {
222
+ if (null == x2) return document.createTextNode(k3);
223
+ u3 = document.createElementNS(o3, x2, k3.is && k3), c3 && (l.__m && l.__m(t4, e3), c3 = false), e3 = null;
224
+ }
225
+ if (null == x2) m3 === k3 || c3 && u3.data == k3 || (u3.data = k3);
226
+ else {
227
+ if (e3 = e3 && n2.call(u3.childNodes), !c3 && null != e3) for (m3 = {}, a3 = 0; a3 < u3.attributes.length; a3++) m3[(y2 = u3.attributes[a3]).name] = y2.value;
228
+ for (a3 in m3) y2 = m3[a3], "dangerouslySetInnerHTML" == a3 ? p3 = y2 : "children" == a3 || a3 in k3 || "value" == a3 && "defaultValue" in k3 || "checked" == a3 && "defaultChecked" in k3 || N(u3, a3, null, y2, o3);
229
+ for (a3 in k3) y2 = k3[a3], "children" == a3 ? v3 = y2 : "dangerouslySetInnerHTML" == a3 ? h3 = y2 : "value" == a3 ? w3 = y2 : "checked" == a3 ? _2 = y2 : c3 && "function" != typeof y2 || m3[a3] === y2 || N(u3, a3, y2, m3[a3], o3);
230
+ if (h3) c3 || p3 && (h3.__html == p3.__html || h3.__html == u3.innerHTML) || (u3.innerHTML = h3.__html), t4.__k = [];
231
+ else if (p3 && (u3.innerHTML = ""), L("template" == t4.type ? u3.content : u3, g(v3) ? v3 : [v3], t4, i3, r3, "foreignObject" == x2 ? "http://www.w3.org/1999/xhtml" : o3, e3, f3, e3 ? e3[0] : i3.__k && $(i3, 0), c3, s3), null != e3) for (a3 = e3.length; a3--; ) b(e3[a3]);
232
+ c3 || (a3 = "value", "progress" == x2 && null == w3 ? u3.removeAttribute("value") : null != w3 && (w3 !== u3[a3] || "progress" == x2 && !w3 || "option" == x2 && w3 != m3[a3]) && N(u3, a3, w3, m3[a3], o3), a3 = "checked", null != _2 && _2 != u3[a3] && N(u3, a3, _2, m3[a3], o3));
233
+ }
234
+ return u3;
235
+ }
236
+ function J(n3, u3, t4) {
237
+ try {
238
+ if ("function" == typeof n3) {
239
+ var i3 = "function" == typeof n3.__u;
240
+ i3 && n3.__u(), i3 && null == u3 || (n3.__u = n3(u3));
241
+ } else n3.current = u3;
242
+ } catch (n4) {
243
+ l.__e(n4, t4);
244
+ }
245
+ }
246
+ function K(n3, u3, t4) {
247
+ var i3, r3;
248
+ if (l.unmount && l.unmount(n3), (i3 = n3.ref) && (i3.current && i3.current != n3.__e || J(i3, null, u3)), null != (i3 = n3.__c)) {
249
+ if (i3.componentWillUnmount) try {
250
+ i3.componentWillUnmount();
251
+ } catch (n4) {
252
+ l.__e(n4, u3);
253
+ }
254
+ i3.base = i3.__P = null;
255
+ }
256
+ if (i3 = n3.__k) for (r3 = 0; r3 < i3.length; r3++) i3[r3] && K(i3[r3], u3, t4 || "function" != typeof n3.type);
257
+ t4 || b(n3.__e), n3.__c = n3.__ = n3.__e = void 0;
258
+ }
259
+ function Q(n3, l3, u3) {
260
+ return this.constructor(n3, u3);
261
+ }
262
+ function R(u3, t4, i3) {
263
+ var r3, o3, e3, f3;
264
+ t4 == document && (t4 = document.documentElement), l.__ && l.__(u3, t4), o3 = (r3 = "function" == typeof i3) ? null : i3 && i3.__k || t4.__k, e3 = [], f3 = [], q(t4, u3 = (!r3 && i3 || t4).__k = k(S, null, [u3]), o3 || d, d, t4.namespaceURI, !r3 && i3 ? [i3] : o3 ? null : t4.firstChild ? n2.call(t4.childNodes) : null, e3, !r3 && i3 ? i3 : o3 ? o3.__e : t4.firstChild, r3, f3), D(e3, u3, f3);
265
+ }
266
+ n2 = w.slice, l = { __e: function(n3, l3, u3, t4) {
267
+ for (var i3, r3, o3; l3 = l3.__; ) if ((i3 = l3.__c) && !i3.__) try {
268
+ if ((r3 = i3.constructor) && null != r3.getDerivedStateFromError && (i3.setState(r3.getDerivedStateFromError(n3)), o3 = i3.__d), null != i3.componentDidCatch && (i3.componentDidCatch(n3, t4 || {}), o3 = i3.__d), o3) return i3.__E = i3;
269
+ } catch (l4) {
270
+ n3 = l4;
271
+ }
272
+ throw n3;
273
+ } }, u = 0, t2 = function(n3) {
274
+ return null != n3 && void 0 === n3.constructor;
275
+ }, C.prototype.setState = function(n3, l3) {
276
+ var u3;
277
+ u3 = null != this.__s && this.__s != this.state ? this.__s : this.__s = m({}, this.state), "function" == typeof n3 && (n3 = n3(m({}, u3), this.props)), n3 && m(u3, n3), null != n3 && this.__v && (l3 && this._sb.push(l3), A(this));
278
+ }, C.prototype.forceUpdate = function(n3) {
279
+ this.__v && (this.__e = true, n3 && this.__h.push(n3), A(this));
280
+ }, C.prototype.render = S, i = [], o = "function" == typeof Promise ? Promise.prototype.then.bind(Promise.resolve()) : setTimeout, e = function(n3, l3) {
281
+ return n3.__v.__b - l3.__v.__b;
282
+ }, H.__r = 0, f = Math.random().toString(8), c = "__d" + f, s = "__a" + f, a = /(PointerCapture)$|Capture$/i, h = 0, p = V(false), v = V(true), y = 0;
283
+
284
+ // ../../node_modules/.pnpm/preact@10.29.1/node_modules/preact/hooks/dist/hooks.mjs
285
+ var t3;
286
+ var r2;
287
+ var u2;
288
+ var i2;
289
+ var o2 = 0;
290
+ var f2 = [];
291
+ var c2 = l;
292
+ var e2 = c2.__b;
293
+ var a2 = c2.__r;
294
+ var v2 = c2.diffed;
295
+ var l2 = c2.__c;
296
+ var m2 = c2.unmount;
297
+ var s2 = c2.__;
298
+ function p2(n3, t4) {
299
+ c2.__h && c2.__h(r2, n3, o2 || t4), o2 = 0;
300
+ var u3 = r2.__H || (r2.__H = { __: [], __h: [] });
301
+ return n3 >= u3.__.length && u3.__.push({}), u3.__[n3];
302
+ }
303
+ function d2(n3) {
304
+ return o2 = 1, h2(D2, n3);
305
+ }
306
+ function h2(n3, u3, i3) {
307
+ var o3 = p2(t3++, 2);
308
+ if (o3.t = n3, !o3.__c && (o3.__ = [i3 ? i3(u3) : D2(void 0, u3), function(n4) {
309
+ var t4 = o3.__N ? o3.__N[0] : o3.__[0], r3 = o3.t(t4, n4);
310
+ t4 !== r3 && (o3.__N = [r3, o3.__[1]], o3.__c.setState({}));
311
+ }], o3.__c = r2, !r2.__f)) {
312
+ var f3 = function(n4, t4, r3) {
313
+ if (!o3.__c.__H) return true;
314
+ var u4 = o3.__c.__H.__.filter(function(n5) {
315
+ return n5.__c;
316
+ });
317
+ if (u4.every(function(n5) {
318
+ return !n5.__N;
319
+ })) return !c3 || c3.call(this, n4, t4, r3);
320
+ var i4 = o3.__c.props !== n4;
321
+ return u4.some(function(n5) {
322
+ if (n5.__N) {
323
+ var t5 = n5.__[0];
324
+ n5.__ = n5.__N, n5.__N = void 0, t5 !== n5.__[0] && (i4 = true);
325
+ }
326
+ }), c3 && c3.call(this, n4, t4, r3) || i4;
327
+ };
328
+ r2.__f = true;
329
+ var c3 = r2.shouldComponentUpdate, e3 = r2.componentWillUpdate;
330
+ r2.componentWillUpdate = function(n4, t4, r3) {
331
+ if (this.__e) {
332
+ var u4 = c3;
333
+ c3 = void 0, f3(n4, t4, r3), c3 = u4;
334
+ }
335
+ e3 && e3.call(this, n4, t4, r3);
336
+ }, r2.shouldComponentUpdate = f3;
337
+ }
338
+ return o3.__N || o3.__;
339
+ }
340
+ function T2(n3, r3) {
341
+ var u3 = p2(t3++, 7);
342
+ return C2(u3.__H, r3) && (u3.__ = n3(), u3.__H = r3, u3.__h = n3), u3.__;
343
+ }
344
+ function q2(n3, t4) {
345
+ return o2 = 8, T2(function() {
346
+ return n3;
347
+ }, t4);
348
+ }
349
+ function j2() {
350
+ for (var n3; n3 = f2.shift(); ) {
351
+ var t4 = n3.__H;
352
+ if (n3.__P && t4) try {
353
+ t4.__h.some(z2), t4.__h.some(B2), t4.__h = [];
354
+ } catch (r3) {
355
+ t4.__h = [], c2.__e(r3, n3.__v);
356
+ }
357
+ }
358
+ }
359
+ c2.__b = function(n3) {
360
+ r2 = null, e2 && e2(n3);
361
+ }, c2.__ = function(n3, t4) {
362
+ n3 && t4.__k && t4.__k.__m && (n3.__m = t4.__k.__m), s2 && s2(n3, t4);
363
+ }, c2.__r = function(n3) {
364
+ a2 && a2(n3), t3 = 0;
365
+ var i3 = (r2 = n3.__c).__H;
366
+ i3 && (u2 === r2 ? (i3.__h = [], r2.__h = [], i3.__.some(function(n4) {
367
+ n4.__N && (n4.__ = n4.__N), n4.u = n4.__N = void 0;
368
+ })) : (i3.__h.some(z2), i3.__h.some(B2), i3.__h = [], t3 = 0)), u2 = r2;
369
+ }, c2.diffed = function(n3) {
370
+ v2 && v2(n3);
371
+ var t4 = n3.__c;
372
+ t4 && t4.__H && (t4.__H.__h.length && (1 !== f2.push(t4) && i2 === c2.requestAnimationFrame || ((i2 = c2.requestAnimationFrame) || w2)(j2)), t4.__H.__.some(function(n4) {
373
+ n4.u && (n4.__H = n4.u), n4.u = void 0;
374
+ })), u2 = r2 = null;
375
+ }, c2.__c = function(n3, t4) {
376
+ t4.some(function(n4) {
377
+ try {
378
+ n4.__h.some(z2), n4.__h = n4.__h.filter(function(n5) {
379
+ return !n5.__ || B2(n5);
380
+ });
381
+ } catch (r3) {
382
+ t4.some(function(n5) {
383
+ n5.__h && (n5.__h = []);
384
+ }), t4 = [], c2.__e(r3, n4.__v);
385
+ }
386
+ }), l2 && l2(n3, t4);
387
+ }, c2.unmount = function(n3) {
388
+ m2 && m2(n3);
389
+ var t4, r3 = n3.__c;
390
+ r3 && r3.__H && (r3.__H.__.some(function(n4) {
391
+ try {
392
+ z2(n4);
393
+ } catch (n5) {
394
+ t4 = n5;
395
+ }
396
+ }), r3.__H = void 0, t4 && c2.__e(t4, r3.__v));
397
+ };
398
+ var k2 = "function" == typeof requestAnimationFrame;
399
+ function w2(n3) {
400
+ var t4, r3 = function() {
401
+ clearTimeout(u3), k2 && cancelAnimationFrame(t4), setTimeout(n3);
402
+ }, u3 = setTimeout(r3, 35);
403
+ k2 && (t4 = requestAnimationFrame(r3));
404
+ }
405
+ function z2(n3) {
406
+ var t4 = r2, u3 = n3.__c;
407
+ "function" == typeof u3 && (n3.__c = void 0, u3()), r2 = t4;
408
+ }
409
+ function B2(n3) {
410
+ var t4 = r2;
411
+ n3.__c = n3.__(), r2 = t4;
412
+ }
413
+ function C2(n3, t4) {
414
+ return !n3 || n3.length !== t4.length || t4.some(function(t5, r3) {
415
+ return t5 !== n3[r3];
416
+ });
417
+ }
418
+ function D2(n3, t4) {
419
+ return "function" == typeof t4 ? t4(n3) : t4;
420
+ }
421
+
422
+ // src/types.ts
423
+ var EVENT_TYPE_CATEGORIES = {
424
+ "operation:created": "operation",
425
+ "operation:applied": "operation",
426
+ "merge:started": "merge",
427
+ "merge:completed": "merge",
428
+ "merge:conflict": "merge",
429
+ "constraint:violated": "merge",
430
+ "sync:connected": "sync",
431
+ "sync:disconnected": "sync",
432
+ "sync:auth-failed": "sync",
433
+ "sync:suspended": "sync",
434
+ "sync:clock-skew": "sync",
435
+ "encryption:status": "sync",
436
+ "sync:node-id-rotated": "sync",
437
+ "sync:local-node": "sync",
438
+ "sync:clock-rebase": "sync",
439
+ "sync:schema-mismatch": "sync",
440
+ "sync:protocol-deprecated": "sync",
441
+ "sync:unverified-legacy-operation": "sync",
442
+ "sync:forged-duplicate": "sync",
443
+ "sync:apply-failed": "sync",
444
+ "sync:apply-blocked": "sync",
445
+ "sync:apply-retrying": "sync",
446
+ "sync:apply-recovered": "sync",
447
+ "sync:apply-abandoned": "sync",
448
+ "sync:operation-rejected": "sync",
449
+ "sync:sent": "sync",
450
+ "sync:received": "sync",
451
+ "sync:acknowledged": "sync",
452
+ "sync:scope-retracted": "sync",
453
+ "query:subscribed": "query",
454
+ "query:invalidated": "query",
455
+ "query:executed": "query",
456
+ "query:error": "query",
457
+ "storage:persistence": "connection",
458
+ "connection:quality": "connection",
459
+ "sync:diagnostics": "sync",
460
+ "sync:bandwidth": "sync",
461
+ "sync:initial-sync-progress": "sync",
462
+ "sync:delivery-gap": "sync",
463
+ "sync:delivery-stalled": "sync",
464
+ "sync:durability-degraded": "connection",
465
+ "sync:durability-restored": "connection",
466
+ "awareness:updated": "sync",
467
+ "state-machine:transition": "operation",
468
+ "state-machine:rejected": "operation",
469
+ "store:persistence-error": "connection",
470
+ "store:quota-exceeded": "connection",
471
+ "store:log-integrity": "operation",
472
+ "store:rematerialized": "operation",
473
+ "store:storage-fallback": "connection",
474
+ "store:opfs-unavailable": "connection",
475
+ "store:durability-lost": "connection",
476
+ "store:db-name-collision": "connection",
477
+ "store:storage-blocked": "connection",
478
+ "store:storage-migrated": "connection",
479
+ "store:schema-ahead": "connection",
480
+ "replay:completed": "operation"
481
+ };
482
+ function eventTypeToCategory(type) {
483
+ return EVENT_TYPE_CATEGORIES[type];
484
+ }
485
+
486
+ // src/filter/event-filter.ts
487
+ function extractCollection(event) {
488
+ const e3 = event.event;
489
+ switch (e3.type) {
490
+ case "operation:created":
491
+ case "operation:applied":
492
+ return e3.operation.collection;
493
+ case "merge:started":
494
+ return e3.operationA.collection;
495
+ case "merge:completed":
496
+ case "merge:conflict":
497
+ return e3.trace.operationA.collection;
498
+ case "constraint:violated":
499
+ return e3.trace.operationA.collection;
500
+ case "query:subscribed":
501
+ return e3.collection;
502
+ case "query:invalidated":
503
+ return e3.trigger.collection;
504
+ case "sync:sent":
505
+ return e3.operations[0]?.collection ?? null;
506
+ case "sync:received":
507
+ return e3.operations[0]?.collection ?? null;
508
+ default:
509
+ return null;
510
+ }
511
+ }
512
+ function filterEvents(events2, criteria) {
513
+ const { categories, types, timeRange, collection } = criteria;
514
+ if (!categories && !types && !timeRange && !collection) {
515
+ return events2;
516
+ }
517
+ const categorySet = categories ? new Set(categories) : null;
518
+ const typeSet = types ? new Set(types) : null;
519
+ return events2.filter((event) => {
520
+ if (categorySet) {
521
+ const cat = eventTypeToCategory(event.event.type);
522
+ if (!categorySet.has(cat)) return false;
523
+ }
524
+ if (typeSet) {
525
+ if (!typeSet.has(event.event.type)) return false;
526
+ }
527
+ if (timeRange) {
528
+ if (event.receivedAt < timeRange.start || event.receivedAt > timeRange.end) {
529
+ return false;
530
+ }
531
+ }
532
+ if (collection) {
533
+ const eventCollection = extractCollection(event);
534
+ if (eventCollection !== collection) return false;
535
+ }
536
+ return true;
537
+ });
538
+ }
539
+
540
+ // src/stats/event-stats.ts
541
+ function computeStatistics(events2) {
542
+ const eventsByCategory = {
543
+ operation: 0,
544
+ merge: 0,
545
+ sync: 0,
546
+ query: 0,
547
+ connection: 0
548
+ };
549
+ const eventsByType = {};
550
+ let mergeConflicts = 0;
551
+ let constraintViolations = 0;
552
+ let mergeDurationSum = 0;
553
+ let mergeDurationCount = 0;
554
+ let queryDurationSum = 0;
555
+ let queryDurationCount = 0;
556
+ let syncOperationsSent = 0;
557
+ let syncOperationsReceived = 0;
558
+ for (const timestamped of events2) {
559
+ const e3 = timestamped.event;
560
+ const category = eventTypeToCategory(e3.type);
561
+ eventsByCategory[category]++;
562
+ eventsByType[e3.type] = (eventsByType[e3.type] ?? 0) + 1;
563
+ switch (e3.type) {
564
+ case "merge:completed":
565
+ mergeDurationSum += e3.trace.duration;
566
+ mergeDurationCount++;
567
+ break;
568
+ case "merge:conflict":
569
+ mergeConflicts++;
570
+ mergeDurationSum += e3.trace.duration;
571
+ mergeDurationCount++;
572
+ break;
573
+ case "constraint:violated":
574
+ constraintViolations++;
575
+ break;
576
+ case "query:executed":
577
+ queryDurationSum += e3.duration;
578
+ queryDurationCount++;
579
+ break;
580
+ case "sync:sent":
581
+ syncOperationsSent += e3.batchSize;
582
+ break;
583
+ case "sync:received":
584
+ syncOperationsReceived += e3.batchSize;
585
+ break;
586
+ }
587
+ }
588
+ return {
589
+ totalEvents: events2.length,
590
+ eventsByCategory,
591
+ eventsByType,
592
+ mergeConflicts,
593
+ constraintViolations,
594
+ avgMergeDuration: mergeDurationCount > 0 ? mergeDurationSum / mergeDurationCount : null,
595
+ avgQueryDuration: queryDurationCount > 0 ? queryDurationSum / queryDurationCount : null,
596
+ syncOperationsSent,
597
+ syncOperationsReceived
598
+ };
599
+ }
600
+
601
+ // src/ui/components.ts
602
+ function formatTime(timestamp) {
603
+ const d3 = new Date(timestamp);
604
+ const h3 = String(d3.getHours()).padStart(2, "0");
605
+ const m3 = String(d3.getMinutes()).padStart(2, "0");
606
+ const s3 = String(d3.getSeconds()).padStart(2, "0");
607
+ const ms = String(d3.getMilliseconds()).padStart(3, "0");
608
+ return `${h3}:${m3}:${s3}.${ms}`;
609
+ }
610
+ function truncate(str, max) {
611
+ if (str.length <= max) return str;
612
+ return `${str.slice(0, max - 1)}\u2026`;
613
+ }
614
+ function formatValue(value) {
615
+ if (value === null || value === void 0) return "null";
616
+ if (typeof value === "string") return `"${value}"`;
617
+ if (typeof value === "object") return JSON.stringify(value, null, 2);
618
+ return String(value);
619
+ }
620
+
621
+ // src/ui/panel-state.ts
622
+ function buildPanelModel(events2) {
623
+ const timeline = events2.map((entry) => ({
624
+ id: entry.id,
625
+ type: entry.event.type,
626
+ label: timelineLabel(entry.event),
627
+ color: timelineColor(entry.event.type),
628
+ receivedAt: entry.receivedAt,
629
+ dependsOn: extractCausalDependencies(entry.event)
630
+ }));
631
+ const conflicts = events2.flatMap((entry) => {
632
+ if (entry.event.type !== "merge:completed" && entry.event.type !== "merge:conflict" && entry.event.type !== "constraint:violated") {
633
+ return [];
634
+ }
635
+ const trace = entry.event.trace;
636
+ return [
637
+ {
638
+ id: entry.id,
639
+ timestamp: entry.receivedAt,
640
+ collection: trace.operationA.collection,
641
+ field: trace.field,
642
+ strategy: trace.strategy,
643
+ tier: trace.tier,
644
+ inputA: trace.inputA,
645
+ inputB: trace.inputB,
646
+ output: trace.output,
647
+ constraintViolated: trace.constraintViolated
648
+ }
649
+ ];
650
+ });
651
+ const operations = events2.map((entry) => {
652
+ const operation = extractOperation(entry.event);
653
+ if (!operation) return null;
654
+ return {
655
+ id: entry.id,
656
+ timestamp: entry.receivedAt,
657
+ operationId: operation.id,
658
+ collection: operation.collection,
659
+ recordId: operation.recordId,
660
+ opType: operation.type,
661
+ data: operation.data,
662
+ causalDeps: operation.causalDeps,
663
+ nodeId: operation.nodeId,
664
+ sequenceNumber: operation.sequenceNumber
665
+ };
666
+ }).filter((item) => item !== null);
667
+ const network = buildNetworkStatus(events2, operations);
668
+ return {
669
+ timeline,
670
+ conflicts,
671
+ operations,
672
+ network
673
+ };
674
+ }
675
+ function buildNetworkStatus(events2, operations) {
676
+ let connected = false;
677
+ let quality = null;
678
+ let pendingAcks = 0;
679
+ let lastSyncAt = null;
680
+ let sentOps = 0;
681
+ let receivedOps = 0;
682
+ for (const entry of events2) {
683
+ switch (entry.event.type) {
684
+ case "sync:connected":
685
+ connected = true;
686
+ lastSyncAt = entry.receivedAt;
687
+ break;
688
+ case "sync:disconnected":
689
+ connected = false;
690
+ break;
691
+ case "connection:quality":
692
+ quality = entry.event.quality;
693
+ break;
694
+ case "sync:sent":
695
+ sentOps += entry.event.operations.length;
696
+ pendingAcks += entry.event.operations.length;
697
+ lastSyncAt = entry.receivedAt;
698
+ break;
699
+ case "sync:received":
700
+ receivedOps += entry.event.operations.length;
701
+ lastSyncAt = entry.receivedAt;
702
+ break;
703
+ case "sync:acknowledged":
704
+ pendingAcks = Math.max(0, pendingAcks - 1);
705
+ lastSyncAt = entry.receivedAt;
706
+ break;
707
+ }
708
+ }
709
+ const vector = /* @__PURE__ */ new Map();
710
+ for (const operation of operations) {
711
+ const current = vector.get(operation.nodeId) ?? 0;
712
+ if (operation.sequenceNumber > current) {
713
+ vector.set(operation.nodeId, operation.sequenceNumber);
714
+ }
715
+ }
716
+ return {
717
+ connected,
718
+ quality,
719
+ pendingAcks,
720
+ lastSyncAt,
721
+ sentOps,
722
+ receivedOps,
723
+ versionVector: [...vector.entries()].map(([nodeId, sequenceNumber]) => ({ nodeId, sequenceNumber })).sort((left, right) => left.nodeId.localeCompare(right.nodeId))
724
+ };
725
+ }
726
+ function timelineLabel(event) {
727
+ switch (event.type) {
728
+ case "operation:created":
729
+ case "operation:applied":
730
+ return `${event.operation.type} ${event.operation.collection}/${event.operation.recordId}`;
731
+ case "merge:started":
732
+ return `merge start ${event.operationA.collection}`;
733
+ case "merge:completed":
734
+ return `merge complete ${event.trace.field}`;
735
+ case "merge:conflict":
736
+ return `merge conflict ${event.trace.field}`;
737
+ case "constraint:violated":
738
+ return `constraint ${event.constraint}`;
739
+ case "sync:connected":
740
+ return `sync connected ${event.nodeId}`;
741
+ case "sync:disconnected":
742
+ return "sync disconnected";
743
+ case "sync:auth-failed":
744
+ return "sync auth failed";
745
+ case "sync:suspended":
746
+ return `sync suspended (${event.reason})`;
747
+ case "encryption:status":
748
+ return `encryption ${event.status.state}${event.status.code ? ` (${event.status.code})` : ""}`;
749
+ case "sync:clock-skew":
750
+ return `clock skew ${Math.round(event.skewMs / 1e3)}s (${event.severity})`;
751
+ case "sync:node-id-rotated":
752
+ return `node id rotated (${event.reenqueuedCount} ops re-queued)`;
753
+ case "sync:local-node":
754
+ return `local node ${event.nodeId} ${event.action}`;
755
+ case "sync:clock-rebase":
756
+ return `clock rebase ${event.rebasedCount} ops (${Math.round(event.maxSkewMs / 1e3)}s ahead)`;
757
+ case "sync:schema-mismatch":
758
+ return `schema mismatch client ${event.clientSchemaVersion} server ${event.serverSchemaVersion}`;
759
+ case "sync:protocol-deprecated":
760
+ return `protocol v${event.clientProtocolVersion} deprecated (node ${event.nodeId})`;
761
+ case "sync:unverified-legacy-operation":
762
+ return `unverified legacy op ${event.operationId} (node ${event.nodeId})`;
763
+ case "sync:forged-duplicate":
764
+ return `forged duplicate refused ${event.operationId} (node ${event.nodeId})`;
765
+ case "sync:apply-failed":
766
+ return `sync apply failed ${event.operationId}`;
767
+ case "sync:apply-blocked":
768
+ return `sync apply blocked ${event.failure.collection}/${event.failure.recordId}`;
769
+ case "sync:apply-retrying":
770
+ return `sync apply retry ${event.failure.collection}/${event.failure.recordId}`;
771
+ case "sync:apply-recovered":
772
+ return `sync apply recovered ${event.failure.collection}/${event.failure.recordId}`;
773
+ case "sync:apply-abandoned":
774
+ return `sync apply abandoned ${event.failure.collection}/${event.failure.recordId}`;
775
+ case "sync:operation-rejected":
776
+ return `sync op rejected ${event.collection}/${event.recordId} (${event.code})`;
777
+ case "sync:sent":
778
+ return `sync sent ${event.batchSize}`;
779
+ case "sync:received":
780
+ return `sync received ${event.batchSize}`;
781
+ case "sync:acknowledged":
782
+ return `sync ack ${event.sequenceNumber}`;
783
+ case "sync:scope-retracted":
784
+ return `scope retracted ${event.collection}/${event.recordId}`;
785
+ case "query:subscribed":
786
+ return `query subscribed ${event.collection}`;
787
+ case "query:invalidated":
788
+ return `query invalidated ${event.queryId}`;
789
+ case "query:executed":
790
+ return `query executed ${event.queryId}`;
791
+ case "query:error":
792
+ return `query error ${event.collection} (${event.phase}): ${event.message}`;
793
+ case "storage:persistence":
794
+ return `storage persistence ${event.state}: ${event.persisted ? "persisted" : "best-effort"}`;
795
+ case "connection:quality":
796
+ return `connection ${event.quality}`;
797
+ case "sync:diagnostics":
798
+ return `sync diagnostics ${event.diagnostics.quality}`;
799
+ case "sync:bandwidth":
800
+ return `bandwidth ${event.direction} ${event.bytesPerSecond}B/s`;
801
+ case "sync:initial-sync-progress":
802
+ return `initial sync ${Math.round(event.progress * 100)}%`;
803
+ case "sync:delivery-gap":
804
+ return `delivery gap expected ${event.expectedBase} received ${event.receivedBase}`;
805
+ case "sync:delivery-stalled":
806
+ return `delivery unacknowledged ${event.watermark} \u2192 ${event.outstandingMaxDeliverySequence} (${event.repeatCount} repeats)`;
807
+ case "sync:durability-degraded":
808
+ return `local durability degraded after ${event.failedAttempts} failed barriers: ${event.message}`;
809
+ case "sync:durability-restored":
810
+ return "local durability restored";
811
+ case "awareness:updated":
812
+ return `awareness ${event.states.size} peers`;
813
+ case "state-machine:transition":
814
+ return `transition ${event.collection} ${event.from} \u2192 ${event.to}`;
815
+ case "state-machine:rejected":
816
+ return `transition rejected ${event.collection} ${event.from} \u2192 ${event.to}`;
817
+ case "store:persistence-error":
818
+ return `store persistence error ${event.message}`;
819
+ case "store:quota-exceeded":
820
+ return "store quota exceeded";
821
+ case "store:log-integrity":
822
+ return `log integrity: ${event.repaired} repaired, ${event.quarantined} quarantined`;
823
+ case "store:rematerialized":
824
+ return `re-materialized ${event.records} records (${event.mode}), ${event.changedRows} changed`;
825
+ case "store:storage-fallback":
826
+ return `store fallback ${event.from} \u2192 ${event.to}`;
827
+ case "store:opfs-unavailable":
828
+ return `store OPFS unavailable (${event.reason}), running in memory`;
829
+ case "store:durability-lost":
830
+ return `store durability lost (${event.reason} during ${event.phase}), writes refused`;
831
+ case "store:db-name-collision":
832
+ return `store db-name collision ${event.dbName}`;
833
+ case "store:storage-blocked":
834
+ return `store ${event.resource} ${event.state === "waiting" ? "blocked by another holder" : "unblocked"}`;
835
+ case "store:storage-migrated":
836
+ return `store migrated ${event.from} \u2192 ${event.to}`;
837
+ case "store:schema-ahead":
838
+ return `store refused: database at schema v${event.storedVersion}, code at v${event.codeVersion}`;
839
+ case "replay:completed":
840
+ return `replay ${event.operationsApplied} ops`;
841
+ }
842
+ }
843
+ function timelineColor(type) {
844
+ if (type.startsWith("operation:")) return "#22c55e";
845
+ if (type.startsWith("sync:")) return "#a855f7";
846
+ if (type.startsWith("merge:") || type.startsWith("constraint:")) return "#f59e0b";
847
+ if (type.startsWith("query:")) return "#0ea5e9";
848
+ return "#64748b";
849
+ }
850
+ function extractCausalDependencies(event) {
851
+ const operation = extractOperation(event);
852
+ return operation?.causalDeps ?? [];
853
+ }
854
+ function extractOperation(event) {
855
+ switch (event.type) {
856
+ case "operation:created":
857
+ case "operation:applied":
858
+ return event.operation;
859
+ case "query:invalidated":
860
+ return event.trigger;
861
+ default:
862
+ return null;
863
+ }
864
+ }
865
+
866
+ // src/ui/panel.ts
867
+ var html = htm_default.bind(k);
868
+ var ALL_CATEGORIES = ["operation", "merge", "sync", "query", "connection"];
869
+ function DevToolsPanel({ events: events2 }) {
870
+ const [activeTab, setActiveTab] = d2("timeline");
871
+ const [search, setSearch] = d2("");
872
+ const [categories, setCategories] = d2(() => new Set(ALL_CATEGORIES));
873
+ const [expanded, setExpanded] = d2(() => /* @__PURE__ */ new Set());
874
+ const [paused, setPaused] = d2(false);
875
+ const toggleCategory = q2((cat) => {
876
+ setCategories((prev) => {
877
+ const next = new Set(prev);
878
+ if (next.has(cat)) next.delete(cat);
879
+ else next.add(cat);
880
+ return next;
881
+ });
882
+ }, []);
883
+ const toggleExpand = q2((id) => {
884
+ setExpanded((prev) => {
885
+ const next = new Set(prev);
886
+ if (next.has(id)) next.delete(id);
887
+ else next.add(id);
888
+ return next;
889
+ });
890
+ }, []);
891
+ const filtered = T2(
892
+ () => filterEvents(events2, { categories: [...categories] }),
893
+ [events2, categories]
894
+ );
895
+ const model = T2(() => buildPanelModel(filtered), [filtered]);
896
+ const stats = T2(() => computeStatistics(events2), [events2]);
897
+ return html`
898
+ <div class="kora-devtools">
899
+ <${Toolbar}
900
+ activeTab=${activeTab}
901
+ onTabChange=${setActiveTab}
902
+ totalEvents=${events2.length}
903
+ conflicts=${stats.mergeConflicts}
904
+ search=${search}
905
+ onSearchChange=${setSearch}
906
+ paused=${paused}
907
+ onPauseToggle=${() => setPaused((p3) => !p3)}
908
+ onClear=${() => setExpanded(/* @__PURE__ */ new Set())}
909
+ categories=${categories}
910
+ onToggleCategory=${toggleCategory}
911
+ />
912
+ <div class="kora-content">
913
+ ${activeTab === "timeline" && html`<${TimelinePanel}
914
+ items=${model.timeline}
915
+ search=${search}
916
+ expanded=${expanded}
917
+ onToggle=${toggleExpand}
918
+ />`}
919
+ ${activeTab === "conflicts" && html`<${ConflictsPanel}
920
+ items=${model.conflicts}
921
+ search=${search}
922
+ expanded=${expanded}
923
+ onToggle=${toggleExpand}
924
+ />`}
925
+ ${activeTab === "operations" && html`<${OperationsPanel}
926
+ items=${model.operations}
927
+ search=${search}
928
+ expanded=${expanded}
929
+ onToggle=${toggleExpand}
930
+ />`}
931
+ ${activeTab === "network" && html`<${NetworkPanel} network=${model.network} events=${events2} />`}
932
+ </div>
933
+ </div>
934
+ `;
935
+ }
936
+ function Toolbar({
937
+ activeTab,
938
+ onTabChange,
939
+ totalEvents,
940
+ conflicts,
941
+ search,
942
+ onSearchChange,
943
+ paused,
944
+ onPauseToggle,
945
+ onClear,
946
+ categories,
947
+ onToggleCategory
948
+ }) {
949
+ const tabs = [
950
+ { id: "timeline", label: "Timeline", badge: totalEvents },
951
+ { id: "conflicts", label: "Conflicts", badge: conflicts },
952
+ { id: "operations", label: "Operations" },
953
+ { id: "network", label: "Network" }
954
+ ];
955
+ return html`
956
+ <div class="kora-toolbar">
957
+ <div class="kora-tabs">
958
+ ${tabs.map(
959
+ (tab) => html`
960
+ <button
961
+ class="kora-tab${activeTab === tab.id ? " active" : ""}"
962
+ onClick=${() => onTabChange(tab.id)}
963
+ >
964
+ ${tab.label}
965
+ ${tab.badge != null && tab.badge > 0 ? html`<span class="kora-badge">${tab.badge}</span>` : null}
966
+ </button>
967
+ `
968
+ )}
969
+ </div>
970
+ <div class="kora-controls">
971
+ <input
972
+ type="text"
973
+ class="kora-search"
974
+ placeholder="Filter..."
975
+ value=${search}
976
+ onInput=${(e3) => onSearchChange(e3.target.value)}
977
+ />
978
+ <button class="kora-btn" onClick=${onPauseToggle}>
979
+ ${paused ? "Resume" : "Pause"}
980
+ </button>
981
+ <button class="kora-btn" onClick=${onClear}>Clear</button>
982
+ ${ALL_CATEGORIES.map(
983
+ (cat) => html`
984
+ <button
985
+ class="kora-cat-toggle${categories.has(cat) ? " active" : ""}"
986
+ onClick=${() => onToggleCategory(cat)}
987
+ >
988
+ ${cat}
989
+ </button>
990
+ `
991
+ )}
992
+ </div>
993
+ </div>
994
+ `;
995
+ }
996
+ function TimelinePanel({
997
+ items,
998
+ search,
999
+ expanded,
1000
+ onToggle
1001
+ }) {
1002
+ const lowerSearch = search.toLowerCase();
1003
+ const filtered = lowerSearch ? items.filter(
1004
+ (i3) => i3.label.toLowerCase().includes(lowerSearch) || i3.type.toLowerCase().includes(lowerSearch)
1005
+ ) : items;
1006
+ const visible = filtered.slice(-200).reverse();
1007
+ if (visible.length === 0) {
1008
+ return html`<div class="kora-panel"><div class="kora-empty">No events recorded yet.</div></div>`;
1009
+ }
1010
+ return html`
1011
+ <div class="kora-panel kora-timeline">
1012
+ <div class="kora-summary">Showing ${visible.length} of ${items.length} events</div>
1013
+ <div class="kora-event-list">
1014
+ ${visible.map(
1015
+ (item) => html`
1016
+ <div
1017
+ key=${item.id}
1018
+ class="kora-row${expanded.has(item.id) ? " expanded" : ""}"
1019
+ onClick=${() => onToggle(item.id)}
1020
+ >
1021
+ <span class="kora-time">${formatTime(item.receivedAt)}</span>
1022
+ <span class="kora-dot" style="background:${item.color}"></span>
1023
+ <span class="kora-type">${item.type}</span>
1024
+ <span class="kora-label">${item.label}</span>
1025
+ ${item.dependsOn.length > 0 ? html`<span class="kora-deps">deps: ${item.dependsOn.length}</span>` : null}
1026
+ </div>
1027
+ ${expanded.has(item.id) ? html`
1028
+ <div class="kora-detail">
1029
+ <div>
1030
+ <span class="kora-detail-label">Event ID:</span> ${item.id}
1031
+ </div>
1032
+ <div>
1033
+ <span class="kora-detail-label">Received:</span>
1034
+ ${new Date(item.receivedAt).toISOString()}
1035
+ </div>
1036
+ ${item.dependsOn.length > 0 ? html`<div>
1037
+ <span class="kora-detail-label">Causal deps:</span>
1038
+ ${item.dependsOn.join(", ")}
1039
+ </div>` : null}
1040
+ </div>
1041
+ ` : null}
1042
+ `
1043
+ )}
1044
+ </div>
1045
+ </div>
1046
+ `;
1047
+ }
1048
+ function ConflictsPanel({
1049
+ items,
1050
+ search,
1051
+ expanded,
1052
+ onToggle
1053
+ }) {
1054
+ const lowerSearch = search.toLowerCase();
1055
+ const filtered = lowerSearch ? items.filter(
1056
+ (i3) => i3.collection.toLowerCase().includes(lowerSearch) || i3.field.toLowerCase().includes(lowerSearch) || i3.strategy.toLowerCase().includes(lowerSearch)
1057
+ ) : items;
1058
+ const visible = filtered.slice(-100).reverse();
1059
+ if (visible.length === 0) {
1060
+ return html`<div class="kora-panel"><div class="kora-empty">No merge conflicts detected.</div></div>`;
1061
+ }
1062
+ return html`
1063
+ <div class="kora-panel kora-conflicts">
1064
+ <div class="kora-summary">
1065
+ ${items.length} conflict${items.length !== 1 ? "s" : ""}
1066
+ </div>
1067
+ <table class="kora-table">
1068
+ <thead>
1069
+ <tr>
1070
+ <th>Time</th>
1071
+ <th>Collection</th>
1072
+ <th>Field</th>
1073
+ <th>Strategy</th>
1074
+ <th>Tier</th>
1075
+ <th>Result</th>
1076
+ </tr>
1077
+ </thead>
1078
+ <tbody>
1079
+ ${visible.map(
1080
+ (item) => html`
1081
+ <tr
1082
+ key=${item.id}
1083
+ class="kora-conflict-row${item.constraintViolated ? " violated" : ""}${expanded.has(item.id) ? " expanded" : ""}"
1084
+ onClick=${() => onToggle(item.id)}
1085
+ >
1086
+ <td>${formatTime(item.timestamp)}</td>
1087
+ <td>${item.collection}</td>
1088
+ <td class="kora-mono">${item.field}</td>
1089
+ <td>
1090
+ <span class="kora-strategy tier-${item.tier}">${item.strategy}</span>
1091
+ </td>
1092
+ <td>${item.tier}</td>
1093
+ <td class="kora-mono">${truncate(String(item.output), 30)}</td>
1094
+ </tr>
1095
+ ${expanded.has(item.id) ? html`
1096
+ <tr class="kora-detail-row">
1097
+ <td colspan="6">
1098
+ <div class="kora-conflict-detail">
1099
+ <div class="kora-comparison">
1100
+ <div class="kora-value-box">
1101
+ <div class="kora-value-label">Input A (local)</div>
1102
+ <pre class="kora-value-code">
1103
+ ${formatValue(item.inputA)}</pre
1104
+ >
1105
+ </div>
1106
+ <div class="kora-value-box">
1107
+ <div class="kora-value-label">Input B (remote)</div>
1108
+ <pre class="kora-value-code">
1109
+ ${formatValue(item.inputB)}</pre
1110
+ >
1111
+ </div>
1112
+ <div class="kora-value-box result">
1113
+ <div class="kora-value-label">Result</div>
1114
+ <pre class="kora-value-code">
1115
+ ${formatValue(item.output)}</pre
1116
+ >
1117
+ </div>
1118
+ </div>
1119
+ ${item.constraintViolated ? html`<div class="kora-constraint-warning">
1120
+ Constraint violated: ${item.constraintViolated}
1121
+ </div>` : null}
1122
+ </div>
1123
+ </td>
1124
+ </tr>
1125
+ ` : null}
1126
+ `
1127
+ )}
1128
+ </tbody>
1129
+ </table>
1130
+ </div>
1131
+ `;
1132
+ }
1133
+ function OperationsPanel({
1134
+ items,
1135
+ search,
1136
+ expanded,
1137
+ onToggle
1138
+ }) {
1139
+ const lowerSearch = search.toLowerCase();
1140
+ const filtered = lowerSearch ? items.filter(
1141
+ (i3) => i3.collection.toLowerCase().includes(lowerSearch) || i3.recordId.toLowerCase().includes(lowerSearch) || i3.operationId.toLowerCase().includes(lowerSearch) || i3.opType.toLowerCase().includes(lowerSearch)
1142
+ ) : items;
1143
+ const visible = filtered.slice(-200).reverse();
1144
+ if (visible.length === 0) {
1145
+ return html`<div class="kora-panel"><div class="kora-empty">No operations recorded yet.</div></div>`;
1146
+ }
1147
+ return html`
1148
+ <div class="kora-panel kora-operations">
1149
+ <div class="kora-summary">
1150
+ Showing ${visible.length} of ${items.length} operations
1151
+ </div>
1152
+ <div class="kora-op-list">
1153
+ ${visible.map(
1154
+ (item) => html`
1155
+ <div
1156
+ key=${item.id}
1157
+ class="kora-op-row${expanded.has(item.id) ? " expanded" : ""}"
1158
+ onClick=${() => onToggle(item.id)}
1159
+ >
1160
+ <span class="kora-time">${formatTime(item.timestamp)}</span>
1161
+ <span class="kora-op-type op-${item.opType}">${item.opType}</span>
1162
+ <span class="kora-op-collection">${item.collection}</span>
1163
+ <span class="kora-op-record kora-mono"
1164
+ >${truncate(item.recordId, 12)}</span
1165
+ >
1166
+ <span class="kora-op-node">node:${truncate(item.nodeId, 8)}</span>
1167
+ <span class="kora-op-seq">#${item.sequenceNumber}</span>
1168
+ </div>
1169
+ ${expanded.has(item.id) ? html`
1170
+ <div class="kora-op-detail">
1171
+ <div>
1172
+ <span class="kora-detail-label">Operation ID:</span>
1173
+ <span class="kora-mono">${item.operationId}</span>
1174
+ </div>
1175
+ <div>
1176
+ <span class="kora-detail-label">Node:</span>
1177
+ <span class="kora-mono">${item.nodeId}</span>
1178
+ </div>
1179
+ <div>
1180
+ <span class="kora-detail-label">Sequence:</span>
1181
+ ${item.sequenceNumber}
1182
+ </div>
1183
+ ${item.causalDeps.length > 0 ? html`<div>
1184
+ <span class="kora-detail-label">Causal deps:</span>
1185
+ <span class="kora-mono"
1186
+ >${item.causalDeps.join(", ")}</span
1187
+ >
1188
+ </div>` : null}
1189
+ ${item.data ? html`<div>
1190
+ <div class="kora-detail-label">Data:</div>
1191
+ <pre class="kora-value-code">
1192
+ ${JSON.stringify(item.data, null, 2)}</pre
1193
+ >
1194
+ </div>` : null}
1195
+ </div>
1196
+ ` : null}
1197
+ `
1198
+ )}
1199
+ </div>
1200
+ </div>
1201
+ `;
1202
+ }
1203
+ function NetworkPanel({
1204
+ network,
1205
+ events: events2
1206
+ }) {
1207
+ const statusClass = network.connected ? "connected" : "disconnected";
1208
+ const statusText = network.connected ? network.quality ? `Connected (${network.quality})` : "Connected" : "Disconnected";
1209
+ const syncEvents = events2.filter((e3) => {
1210
+ const cat = eventTypeToCategory(e3.event.type);
1211
+ return cat === "sync" || cat === "connection";
1212
+ }).slice(-50).reverse();
1213
+ return html`
1214
+ <div class="kora-panel kora-network">
1215
+ <div class="kora-network-status">
1216
+ <div class="kora-status-indicator ${statusClass}">
1217
+ <span class="kora-status-dot"></span>
1218
+ <span class="kora-status-text">${statusText}</span>
1219
+ </div>
1220
+ </div>
1221
+
1222
+ <div class="kora-stats-grid">
1223
+ <${StatCard} label="Sent" value=${String(network.sentOps)} unit="ops" />
1224
+ <${StatCard} label="Received" value=${String(network.receivedOps)} unit="ops" />
1225
+ <${StatCard} label="Pending" value=${String(network.pendingAcks)} unit="acks" />
1226
+ <${StatCard}
1227
+ label="Last Sync"
1228
+ value=${network.lastSyncAt ? formatTime(network.lastSyncAt) : "never"}
1229
+ />
1230
+ </div>
1231
+
1232
+ ${network.versionVector.length > 0 ? html`
1233
+ <div class="kora-vv-section">
1234
+ <h3>Version Vector</h3>
1235
+ <table class="kora-table kora-vv-table">
1236
+ <thead>
1237
+ <tr>
1238
+ <th>Node</th>
1239
+ <th>Sequence</th>
1240
+ </tr>
1241
+ </thead>
1242
+ <tbody>
1243
+ ${network.versionVector.map(
1244
+ (entry) => html`
1245
+ <tr key=${entry.nodeId}>
1246
+ <td class="kora-mono">${truncate(entry.nodeId, 16)}</td>
1247
+ <td>${entry.sequenceNumber}</td>
1248
+ </tr>
1249
+ `
1250
+ )}
1251
+ </tbody>
1252
+ </table>
1253
+ </div>
1254
+ ` : null}
1255
+
1256
+ ${syncEvents.length > 0 ? html`
1257
+ <div class="kora-sync-log">
1258
+ <h3>Recent Sync Activity</h3>
1259
+ <div class="kora-event-list">
1260
+ ${syncEvents.map(
1261
+ (entry) => html`
1262
+ <div key=${entry.id} class="kora-row compact">
1263
+ <span class="kora-time"
1264
+ >${formatTime(entry.receivedAt)}</span
1265
+ >
1266
+ <span class="kora-type">${entry.event.type}</span>
1267
+ </div>
1268
+ `
1269
+ )}
1270
+ </div>
1271
+ </div>
1272
+ ` : null}
1273
+ </div>
1274
+ `;
1275
+ }
1276
+ function StatCard({
1277
+ label,
1278
+ value,
1279
+ unit
1280
+ }) {
1281
+ return html`
1282
+ <div class="kora-stat-card">
1283
+ <div class="kora-stat-value">${value}</div>
1284
+ <div class="kora-stat-label">${label}${unit ? ` (${unit})` : ""}</div>
1285
+ </div>
1286
+ `;
1287
+ }
1288
+ function renderDevtoolsPanel(target, events2) {
1289
+ R(html`<${DevToolsPanel} events=${events2} />`, target);
1290
+ }
1291
+
1292
+ // src/extension/panel.ts
1293
+ var extensionRoot = document.getElementById("kora-devtools-root");
1294
+ if (!extensionRoot) {
1295
+ throw new Error("Missing #kora-devtools-root element");
1296
+ }
1297
+ var events = [];
1298
+ var runtime = chrome?.runtime;
1299
+ var devtools = chrome?.devtools;
1300
+ if (runtime && devtools) {
1301
+ const tabId = devtools.inspectedWindow.tabId;
1302
+ const port = runtime.connect({ name: "kora-panel" });
1303
+ port.postMessage({ type: "panel-init", tabId });
1304
+ port.onMessage.addListener((message) => {
1305
+ if (!message || message.type !== "kora-event" || !message.payload) return;
1306
+ events.push(message.payload);
1307
+ renderDevtoolsPanel(extensionRoot, events);
1308
+ });
1309
+ }
1310
+ renderDevtoolsPanel(extensionRoot, events);
1311
+ //# sourceMappingURL=panel.cjs.map