@kbve/droid 0.1.1 → 0.1.2

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 (120) hide show
  1. package/droid.mjs +2311 -203
  2. package/index.d.ts +3 -0
  3. package/lib/agents/api-types.d.ts +121 -0
  4. package/lib/agents/api-types.d.ts.map +1 -0
  5. package/lib/agents/auth/init.d.ts +8 -0
  6. package/lib/agents/auth/init.d.ts.map +1 -0
  7. package/lib/agents/cache.d.ts +9 -0
  8. package/lib/agents/cache.d.ts.map +1 -0
  9. package/lib/agents/client/callGuildVault.d.ts +3 -0
  10. package/lib/agents/client/callGuildVault.d.ts.map +1 -0
  11. package/lib/agents/client/callJson.d.ts +3 -0
  12. package/lib/agents/client/callJson.d.ts.map +1 -0
  13. package/lib/agents/config.d.ts +36 -0
  14. package/lib/agents/config.d.ts.map +1 -0
  15. package/lib/agents/constants.d.ts +11 -0
  16. package/lib/agents/constants.d.ts.map +1 -0
  17. package/lib/agents/createAgents.d.ts +4 -0
  18. package/lib/agents/createAgents.d.ts.map +1 -0
  19. package/lib/agents/ctx.d.ts +46 -0
  20. package/lib/agents/ctx.d.ts.map +1 -0
  21. package/lib/agents/discord/bot.d.ts +21 -0
  22. package/lib/agents/discord/bot.d.ts.map +1 -0
  23. package/lib/agents/discord/guilds.d.ts +8 -0
  24. package/lib/agents/discord/guilds.d.ts.map +1 -0
  25. package/lib/agents/formDrafts.d.ts +5 -0
  26. package/lib/agents/formDrafts.d.ts.map +1 -0
  27. package/lib/agents/generated/agents-schema.d.ts +73 -0
  28. package/lib/agents/generated/agents-schema.d.ts.map +1 -0
  29. package/lib/agents/generated/discordsh-agents-schema.d.ts +71 -0
  30. package/lib/agents/generated/discordsh-agents-schema.d.ts.map +1 -0
  31. package/lib/agents/github/backfill.d.ts +23 -0
  32. package/lib/agents/github/backfill.d.ts.map +1 -0
  33. package/lib/agents/github/events.d.ts +10 -0
  34. package/lib/agents/github/events.d.ts.map +1 -0
  35. package/lib/agents/github/pat.d.ts +13 -0
  36. package/lib/agents/github/pat.d.ts.map +1 -0
  37. package/lib/agents/github/repoConfig.d.ts +25 -0
  38. package/lib/agents/github/repoConfig.d.ts.map +1 -0
  39. package/lib/agents/github/tokens.d.ts +22 -0
  40. package/lib/agents/github/tokens.d.ts.map +1 -0
  41. package/lib/agents/github/webhook.d.ts +37 -0
  42. package/lib/agents/github/webhook.d.ts.map +1 -0
  43. package/lib/agents/index.d.ts +8 -0
  44. package/lib/agents/index.d.ts.map +1 -0
  45. package/lib/agents/state/atoms.d.ts +122 -0
  46. package/lib/agents/state/atoms.d.ts.map +1 -0
  47. package/lib/agents/types.d.ts +65 -0
  48. package/lib/agents/types.d.ts.map +1 -0
  49. package/lib/gateway/SupabaseGateway.d.ts.map +1 -1
  50. package/lib/gateway/types.d.ts +1 -1
  51. package/lib/gateway/types.d.ts.map +1 -1
  52. package/lib/workers/canvas-worker.js +6 -449
  53. package/lib/workers/data.d.ts.map +1 -1
  54. package/lib/workers/db-worker.d.ts +2 -2
  55. package/lib/workers/db-worker.d.ts.map +1 -1
  56. package/lib/workers/db-worker.js +14 -4170
  57. package/lib/workers/main.d.ts +0 -2
  58. package/lib/workers/main.d.ts.map +1 -1
  59. package/lib/workers/supabase-db-worker.js +11 -9325
  60. package/lib/workers/supabase-shared-worker.js +13 -12623
  61. package/lib/workers/ws-worker.d.ts +1 -2
  62. package/lib/workers/ws-worker.d.ts.map +1 -1
  63. package/lib/workers/ws-worker.js +6 -333
  64. package/main.js +5622 -4786
  65. package/package.json +2 -1
  66. package/src/index.ts +3 -0
  67. package/src/lib/agents/api-types.ts +170 -0
  68. package/src/lib/agents/auth/init.ts +200 -0
  69. package/src/lib/agents/cache.ts +127 -0
  70. package/src/lib/agents/client/callGuildVault.ts +71 -0
  71. package/src/lib/agents/client/callJson.ts +64 -0
  72. package/src/lib/agents/config.ts +83 -0
  73. package/src/lib/agents/constants.ts +11 -0
  74. package/src/lib/agents/createAgents.ts +62 -0
  75. package/src/lib/agents/ctx.ts +63 -0
  76. package/src/lib/agents/discord/bot.ts +169 -0
  77. package/src/lib/agents/discord/guilds.ts +106 -0
  78. package/src/lib/agents/formDrafts.ts +55 -0
  79. package/src/lib/agents/generated/agents-schema.ts +155 -0
  80. package/src/lib/agents/generated/discordsh-agents-schema.ts +96 -0
  81. package/src/lib/agents/github/backfill.ts +126 -0
  82. package/src/lib/agents/github/events.ts +131 -0
  83. package/src/lib/agents/github/pat.ts +150 -0
  84. package/src/lib/agents/github/repoConfig.ts +240 -0
  85. package/src/lib/agents/github/tokens.ts +222 -0
  86. package/src/lib/agents/github/webhook.ts +349 -0
  87. package/src/lib/agents/index.ts +35 -0
  88. package/src/lib/agents/state/atoms.ts +122 -0
  89. package/src/lib/agents/types.ts +83 -0
  90. package/src/lib/api.ts +71 -0
  91. package/src/lib/gateway/SupabaseGateway.ts +55 -2
  92. package/src/lib/gateway/WorkerCommunication.ts +1 -1
  93. package/src/lib/gateway/capabilities.spec.ts +144 -0
  94. package/src/lib/gateway/types.ts +97 -70
  95. package/src/lib/mod/module/supabase/mod-supabase.ts +10 -5
  96. package/src/lib/state/auth.ts +121 -3
  97. package/src/lib/state/bento.spec.ts +76 -0
  98. package/src/lib/state/bento.ts +51 -0
  99. package/src/lib/state/index.ts +64 -0
  100. package/src/lib/state/profile-sync.ts +214 -0
  101. package/src/lib/state/profile.ts +155 -0
  102. package/src/lib/state/staff.ts +128 -0
  103. package/src/lib/state/sync-bus.ts +109 -0
  104. package/src/lib/state/welcome-toast.spec.ts +101 -0
  105. package/src/lib/sw-recovery.spec.ts +165 -0
  106. package/src/lib/sw-recovery.ts +141 -0
  107. package/src/lib/types/event-schemas.spec.ts +120 -0
  108. package/src/lib/types/event-types.spec.ts +5 -2
  109. package/src/lib/types/event-types.ts +74 -0
  110. package/src/lib/workers/data.ts +5 -1
  111. package/src/lib/workers/db-worker.ts +34 -8
  112. package/src/lib/workers/main.ts +3 -18
  113. package/src/lib/workers/supabase-db-worker.ts +25 -3
  114. package/src/lib/workers/supabase-shared-worker.ts +43 -8
  115. package/src/lib/workers/ws-worker.spec.ts +41 -0
  116. package/src/lib/workers/ws-worker.ts +121 -28
  117. package/workers/main.js +2 -12
  118. package/comlink.js +0 -247
  119. package/index.js +0 -9263
  120. package/reference.js +0 -719
@@ -1,9 +1,8 @@
1
+ export declare function reconnectDelayMs(attempt: number): number;
1
2
  declare const wsInstanceAPI: {
2
3
  connect(url: string): Promise<void>;
3
4
  send(payload: Uint8Array): Promise<void>;
4
5
  close(): Promise<void>;
5
- onMessage(callback: (data: string | ArrayBuffer) => void): void;
6
- onStatus(callback: (status: string) => void): void;
7
6
  getStatus(): Promise<string>;
8
7
  };
9
8
  export type WSInstance = typeof wsInstanceAPI;
@@ -1 +1 @@
1
- {"version":3,"file":"ws-worker.d.ts","sourceRoot":"","sources":["../../../../../../packages/npm/droid/src/lib/workers/ws-worker.ts"],"names":[],"mappings":"AAkFA,QAAA,MAAM,aAAa;iBACC,MAAM;kBAiEL,UAAU;;wBAqBV,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,KAAK,IAAI;uBAIrC,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI;iBAIxB,OAAO,CAAC,MAAM,CAAC;CAUlC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,OAAO,aAAa,CAAC"}
1
+ {"version":3,"file":"ws-worker.d.ts","sourceRoot":"","sources":["../../../../../../packages/npm/droid/src/lib/workers/ws-worker.ts"],"names":[],"mappings":"AAyDA,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAOxD;AAuED,QAAA,MAAM,aAAa;iBACC,MAAM;kBA2GL,UAAU;;iBA2BX,OAAO,CAAC,MAAM,CAAC;CAUlC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,OAAO,aAAa,CAAC"}
@@ -1,333 +1,6 @@
1
- const L = /* @__PURE__ */ Symbol("Comlink.proxy"), $ = /* @__PURE__ */ Symbol("Comlink.endpoint"), B = /* @__PURE__ */ Symbol("Comlink.releaseProxy"), R = /* @__PURE__ */ Symbol("Comlink.finalizer"), k = /* @__PURE__ */ Symbol("Comlink.thrown"), z = (e) => typeof e == "object" && e !== null || typeof e == "function", Y = {
2
- canHandle: (e) => z(e) && e[L],
3
- serialize(e) {
4
- const { port1: t, port2: n } = new MessageChannel();
5
- return H(e, t), [n, [n]];
6
- },
7
- deserialize(e) {
8
- return e.start(), v(e);
9
- }
10
- }, q = {
11
- canHandle: (e) => z(e) && k in e,
12
- serialize({ value: e }) {
13
- let t;
14
- return e instanceof Error ? t = {
15
- isError: !0,
16
- value: {
17
- message: e.message,
18
- name: e.name,
19
- stack: e.stack
20
- }
21
- } : t = { isError: !1, value: e }, [t, []];
22
- },
23
- deserialize(e) {
24
- throw e.isError ? Object.assign(new Error(e.value.message), e.value) : e.value;
25
- }
26
- }, D = /* @__PURE__ */ new Map([
27
- ["proxy", Y],
28
- ["throw", q]
29
- ]);
30
- function J(e, t) {
31
- for (const n of e)
32
- if (t === n || n === "*" || n instanceof RegExp && n.test(t))
33
- return !0;
34
- return !1;
35
- }
36
- function H(e, t = globalThis, n = ["*"]) {
37
- t.addEventListener("message", function d(o) {
38
- if (!o || !o.data)
39
- return;
40
- if (!J(n, o.origin)) {
41
- console.warn(`Invalid origin '${o.origin}' for comlink proxy`);
42
- return;
43
- }
44
- const { id: a, type: g, path: l } = Object.assign({ path: [] }, o.data), u = (o.data.argumentList || []).map(y);
45
- let s;
46
- try {
47
- const c = l.slice(0, -1).reduce((i, b) => i[b], e), f = l.reduce((i, b) => i[b], e);
48
- switch (g) {
49
- case "GET":
50
- s = f;
51
- break;
52
- case "SET":
53
- c[l.slice(-1)[0]] = y(o.data.value), s = !0;
54
- break;
55
- case "APPLY":
56
- s = f.apply(c, u);
57
- break;
58
- case "CONSTRUCT":
59
- {
60
- const i = new f(...u);
61
- s = te(i);
62
- }
63
- break;
64
- case "ENDPOINT":
65
- {
66
- const { port1: i, port2: b } = new MessageChannel();
67
- H(e, b), s = ee(i, [i]);
68
- }
69
- break;
70
- case "RELEASE":
71
- s = void 0;
72
- break;
73
- default:
74
- return;
75
- }
76
- } catch (c) {
77
- s = { value: c, [k]: 0 };
78
- }
79
- Promise.resolve(s).catch((c) => ({ value: c, [k]: 0 })).then((c) => {
80
- const [f, i] = P(c);
81
- t.postMessage(Object.assign(Object.assign({}, f), { id: a }), i), g === "RELEASE" && (t.removeEventListener("message", d), F(t), R in e && typeof e[R] == "function" && e[R]());
82
- }).catch((c) => {
83
- const [f, i] = P({
84
- value: new TypeError("Unserializable return value"),
85
- [k]: 0
86
- });
87
- t.postMessage(Object.assign(Object.assign({}, f), { id: a }), i);
88
- });
89
- }), t.start && t.start();
90
- }
91
- function X(e) {
92
- return e.constructor.name === "MessagePort";
93
- }
94
- function F(e) {
95
- X(e) && e.close();
96
- }
97
- function v(e, t) {
98
- const n = /* @__PURE__ */ new Map();
99
- return e.addEventListener("message", function(o) {
100
- const { data: a } = o;
101
- if (!a || !a.id)
102
- return;
103
- const g = n.get(a.id);
104
- if (g)
105
- try {
106
- g(a);
107
- } finally {
108
- n.delete(a.id);
109
- }
110
- }), _(e, n, [], t);
111
- }
112
- function h(e) {
113
- if (e)
114
- throw new Error("Proxy has been released and is not useable");
115
- }
116
- function V(e) {
117
- return m(e, /* @__PURE__ */ new Map(), {
118
- type: "RELEASE"
119
- }).then(() => {
120
- F(e);
121
- });
122
- }
123
- const C = /* @__PURE__ */ new WeakMap(), O = "FinalizationRegistry" in globalThis && new FinalizationRegistry((e) => {
124
- const t = (C.get(e) || 0) - 1;
125
- C.set(e, t), t === 0 && V(e);
126
- });
127
- function K(e, t) {
128
- const n = (C.get(t) || 0) + 1;
129
- C.set(t, n), O && O.register(e, t, e);
130
- }
131
- function Q(e) {
132
- O && O.unregister(e);
133
- }
134
- function _(e, t, n = [], d = function() {
135
- }) {
136
- let o = !1;
137
- const a = new Proxy(d, {
138
- get(g, l) {
139
- if (h(o), l === B)
140
- return () => {
141
- Q(a), V(e), t.clear(), o = !0;
142
- };
143
- if (l === "then") {
144
- if (n.length === 0)
145
- return { then: () => a };
146
- const u = m(e, t, {
147
- type: "GET",
148
- path: n.map((s) => s.toString())
149
- }).then(y);
150
- return u.then.bind(u);
151
- }
152
- return _(e, t, [...n, l]);
153
- },
154
- set(g, l, u) {
155
- h(o);
156
- const [s, c] = P(u);
157
- return m(e, t, {
158
- type: "SET",
159
- path: [...n, l].map((f) => f.toString()),
160
- value: s
161
- }, c).then(y);
162
- },
163
- apply(g, l, u) {
164
- h(o);
165
- const s = n[n.length - 1];
166
- if (s === $)
167
- return m(e, t, {
168
- type: "ENDPOINT"
169
- }).then(y);
170
- if (s === "bind")
171
- return _(e, t, n.slice(0, -1));
172
- const [c, f] = I(u);
173
- return m(e, t, {
174
- type: "APPLY",
175
- path: n.map((i) => i.toString()),
176
- argumentList: c
177
- }, f).then(y);
178
- },
179
- construct(g, l) {
180
- h(o);
181
- const [u, s] = I(l);
182
- return m(e, t, {
183
- type: "CONSTRUCT",
184
- path: n.map((c) => c.toString()),
185
- argumentList: u
186
- }, s).then(y);
187
- }
188
- });
189
- return K(a, e), a;
190
- }
191
- function Z(e) {
192
- return Array.prototype.concat.apply([], e);
193
- }
194
- function I(e) {
195
- const t = e.map(P);
196
- return [t.map((n) => n[0]), Z(t.map((n) => n[1]))];
197
- }
198
- const U = /* @__PURE__ */ new WeakMap();
199
- function ee(e, t) {
200
- return U.set(e, t), e;
201
- }
202
- function te(e) {
203
- return Object.assign(e, { [L]: !0 });
204
- }
205
- function P(e) {
206
- for (const [t, n] of D)
207
- if (n.canHandle(e)) {
208
- const [d, o] = n.serialize(e);
209
- return [
210
- {
211
- type: "HANDLER",
212
- name: t,
213
- value: d
214
- },
215
- o
216
- ];
217
- }
218
- return [
219
- {
220
- type: "RAW",
221
- value: e
222
- },
223
- U.get(e) || []
224
- ];
225
- }
226
- function y(e) {
227
- switch (e.type) {
228
- case "HANDLER":
229
- return D.get(e.name).deserialize(e.value);
230
- case "RAW":
231
- return e.value;
232
- }
233
- }
234
- function m(e, t, n, d) {
235
- return new Promise((o) => {
236
- const a = ne();
237
- t.set(a, o), e.start && e.start(), e.postMessage(Object.assign({ id: a }, n), d);
238
- });
239
- }
240
- function ne() {
241
- return new Array(4).fill(0).map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16)).join("-");
242
- }
243
- let r = null, W = null, j = null, M = null, N = 0;
244
- const re = 3e4, oe = 6e4;
245
- let A = null, E = 0, p = null;
246
- const T = 5, se = 3e3;
247
- function ae() {
248
- w(), M = setInterval(() => {
249
- if (!r || r.readyState !== WebSocket.OPEN) {
250
- w();
251
- return;
252
- }
253
- if (N > 0 && Date.now() - N > oe) {
254
- console.warn("[WS] Heartbeat timeout — closing connection"), w(), r.close(1001, "Heartbeat timeout");
255
- return;
256
- }
257
- try {
258
- r.send(JSON.stringify({ type: "ping" }));
259
- } catch (e) {
260
- console.error("[WS] Failed to send heartbeat:", e);
261
- }
262
- }, re);
263
- }
264
- function w() {
265
- M && (clearInterval(M), M = null);
266
- }
267
- function S(e) {
268
- j?.(e);
269
- }
270
- function ce() {
271
- if (!p || E >= T) {
272
- E >= T && (console.error(
273
- `[WS] Max reconnect attempts (${T}) reached`
274
- ), S("failed"));
275
- return;
276
- }
277
- E++, console.log(
278
- `[WS] Reconnecting (${E}/${T})...`
279
- ), S("reconnecting"), A = setTimeout(() => {
280
- p && G.connect(p);
281
- }, se);
282
- }
283
- const G = {
284
- async connect(e) {
285
- r && r.readyState === WebSocket.OPEN || (r && (r.onclose = null, r.close(), r = null), p = e, r = new WebSocket(e), r.binaryType = "arraybuffer", r.onopen = () => {
286
- console.log("[WS] Connected:", e), E = 0, N = Date.now(), ae(), S("connected");
287
- }, r.onmessage = (t) => {
288
- try {
289
- if (typeof t.data == "string")
290
- try {
291
- if (JSON.parse(t.data).type === "pong") {
292
- N = Date.now();
293
- return;
294
- }
295
- } catch {
296
- }
297
- t.data instanceof ArrayBuffer, W?.(t.data);
298
- } catch (n) {
299
- console.error("[WS] Failed to forward message", n);
300
- }
301
- }, r.onerror = (t) => {
302
- console.error("[WS] Error:", t), S("error");
303
- }, r.onclose = (t) => {
304
- console.log("[WS] Disconnected:", t.code, t.reason), r = null, w(), S("disconnected"), t.code !== 1e3 && ce();
305
- });
306
- },
307
- async send(e) {
308
- r?.readyState === WebSocket.OPEN ? r.send(e) : console.warn("[WS] Tried to send while disconnected");
309
- },
310
- async close() {
311
- A && (clearTimeout(A), A = null), w(), E = 0, p = null, r?.close(1e3, "Client request"), r = null, S("disconnected");
312
- },
313
- onMessage(e) {
314
- W = e;
315
- },
316
- onStatus(e) {
317
- j = e;
318
- },
319
- async getStatus() {
320
- return r ? {
321
- [WebSocket.CONNECTING]: "connecting",
322
- [WebSocket.OPEN]: "connected",
323
- [WebSocket.CLOSING]: "closing",
324
- [WebSocket.CLOSED]: "disconnected"
325
- }[r.readyState] || "unknown" : "disconnected";
326
- }
327
- }, x = /* @__PURE__ */ new Set();
328
- self.onconnect = (e) => {
329
- const t = e.ports[0], n = x.size === 0;
330
- x.add(t), t.start(), t.postMessage({ type: n ? "first-connect" : "reconnect" }), t.addEventListener("message", (d) => {
331
- d.data?.type === "close" && x.delete(t);
332
- }), H(G, t);
333
- };
1
+ /**
2
+ * @license
3
+ * Copyright 2019 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ const e=Symbol(`Comlink.proxy`),t=Symbol(`Comlink.endpoint`),n=Symbol(`Comlink.releaseProxy`),r=Symbol(`Comlink.finalizer`),i=Symbol(`Comlink.thrown`),a=e=>typeof e==`object`&&!!e||typeof e==`function`,o=new Map([[`proxy`,{canHandle:t=>a(t)&&t[e],serialize(e){let{port1:t,port2:n}=new MessageChannel;return c(e,t),[n,[n]]},deserialize(e){return e.start(),d(e)}}],[`throw`,{canHandle:e=>a(e)&&i in e,serialize({value:e}){let t;return t=e instanceof Error?{isError:!0,value:{message:e.message,name:e.name,stack:e.stack}}:{isError:!1,value:e},[t,[]]},deserialize(e){throw e.isError?Object.assign(Error(e.value.message),e.value):e.value}}]]);function s(e,t){for(let n of e)if(t===n||n===`*`||n instanceof RegExp&&n.test(t))return!0;return!1}function c(e,t=globalThis,n=[`*`]){t.addEventListener(`message`,function a(o){if(!o||!o.data)return;if(!s(n,o.origin)){console.warn(`Invalid origin '${o.origin}' for comlink proxy`);return}let{id:l,type:d,path:f}=Object.assign({path:[]},o.data),p=(o.data.argumentList||[]).map(T),m;try{let t=f.slice(0,-1).reduce((e,t)=>e[t],e),n=f.reduce((e,t)=>e[t],e);switch(d){case`GET`:m=n;break;case`SET`:t[f.slice(-1)[0]]=T(o.data.value),m=!0;break;case`APPLY`:m=n.apply(t,p);break;case`CONSTRUCT`:m=C(new n(...p));break;case`ENDPOINT`:{let{port1:t,port2:n}=new MessageChannel;c(e,n),m=S(t,[t])}break;case`RELEASE`:m=void 0;break;default:return}}catch(e){m={value:e,[i]:0}}Promise.resolve(m).catch(e=>({value:e,[i]:0})).then(n=>{let[i,o]=w(n);t.postMessage(Object.assign(Object.assign({},i),{id:l}),o),d===`RELEASE`&&(t.removeEventListener(`message`,a),u(t),r in e&&typeof e[r]==`function`&&e[r]())}).catch(e=>{let[n,r]=w({value:TypeError(`Unserializable return value`),[i]:0});t.postMessage(Object.assign(Object.assign({},n),{id:l}),r)})}),t.start&&t.start()}function l(e){return e.constructor.name===`MessagePort`}function u(e){l(e)&&e.close()}function d(e,t){let n=new Map;return e.addEventListener(`message`,function(e){let{data:t}=e;if(!t||!t.id)return;let r=n.get(t.id);if(r)try{r(t)}finally{n.delete(t.id)}}),v(e,n,[],t)}function f(e){if(e)throw Error(`Proxy has been released and is not useable`)}function p(e){return E(e,new Map,{type:`RELEASE`}).then(()=>{u(e)})}const m=new WeakMap,h=`FinalizationRegistry`in globalThis&&new FinalizationRegistry(e=>{let t=(m.get(e)||0)-1;m.set(e,t),t===0&&p(e)});function g(e,t){let n=(m.get(t)||0)+1;m.set(t,n),h&&h.register(e,t,e)}function _(e){h&&h.unregister(e)}function v(e,r,i=[],a=function(){}){let o=!1,s=new Proxy(a,{get(t,a){if(f(o),a===n)return()=>{_(s),p(e),r.clear(),o=!0};if(a===`then`){if(i.length===0)return{then:()=>s};let t=E(e,r,{type:`GET`,path:i.map(e=>e.toString())}).then(T);return t.then.bind(t)}return v(e,r,[...i,a])},set(t,n,a){f(o);let[s,c]=w(a);return E(e,r,{type:`SET`,path:[...i,n].map(e=>e.toString()),value:s},c).then(T)},apply(n,a,s){f(o);let c=i[i.length-1];if(c===t)return E(e,r,{type:`ENDPOINT`}).then(T);if(c===`bind`)return v(e,r,i.slice(0,-1));let[l,u]=b(s);return E(e,r,{type:`APPLY`,path:i.map(e=>e.toString()),argumentList:l},u).then(T)},construct(t,n){f(o);let[a,s]=b(n);return E(e,r,{type:`CONSTRUCT`,path:i.map(e=>e.toString()),argumentList:a},s).then(T)}});return g(s,e),s}function y(e){return Array.prototype.concat.apply([],e)}function b(e){let t=e.map(w);return[t.map(e=>e[0]),y(t.map(e=>e[1]))]}const x=new WeakMap;function S(e,t){return x.set(e,t),e}function C(t){return Object.assign(t,{[e]:!0})}function w(e){for(let[t,n]of o)if(n.canHandle(e)){let[r,i]=n.serialize(e);return[{type:`HANDLER`,name:t,value:r},i]}return[{type:`RAW`,value:e},x.get(e)||[]]}function T(e){switch(e.type){case`HANDLER`:return o.get(e.name).deserialize(e.value);case`RAW`:return e.value}}function E(e,t,n,r){return new Promise(i=>{let a=D();t.set(a,i),e.start&&e.start(),e.postMessage(Object.assign({id:a},n),r)})}function D(){return[,,,,].fill(0).map(()=>Math.floor(Math.random()*(2**53-1)).toString(16)).join(`-`)}let O=null;const k=typeof BroadcastChannel<`u`?new BroadcastChannel(`kbve_ws_data`):null,A=typeof BroadcastChannel<`u`?new BroadcastChannel(`kbve_ws_events`):null;let j=null,M=0,N=null,P=0,F=null;function I(e){return Math.min(3e4,1e3*2**Math.max(0,e-1))+Math.floor(Math.random()*500)}function L(){R(),j=setInterval(()=>{if(!O||O.readyState!==WebSocket.OPEN){R();return}if(M>0&&Date.now()-M>6e4){console.warn(`[WS] Heartbeat timeout — closing connection`),R(),O.close(1001,`Heartbeat timeout`);return}try{O.send(JSON.stringify({type:`ping`}))}catch(e){console.error(`[WS] Failed to send heartbeat:`,e)}},3e4)}function R(){j&&=(clearInterval(j),null)}function z(e,t){A?.postMessage({type:`status`,status:e,...t})}function B(){if(!F||P>=5){P>=5&&(console.error(`[WS] Max reconnect attempts (5) reached`),z(`failed`));return}P++;let e=I(P);console.log(`[WS] Reconnecting (${P}/5) in ${e}ms...`),z(`reconnecting`),N=setTimeout(()=>{F&&V.connect(F)},e)}const V={async connect(e){if(O&&O.readyState===WebSocket.OPEN)return;O&&=(O.onclose=null,O.close(),null),F=e;let t=e.replace(/(token=)[^&]+/i,`$1<redacted>`);console.log(`[WS] Connecting to`,t),O=new WebSocket(e),O.binaryType=`arraybuffer`,O.onopen=()=>{console.log(`[WS] Connected:`,t),P=0,M=Date.now(),L(),z(`connected`)},O.onmessage=e=>{try{if(typeof e.data==`string`)try{if(JSON.parse(e.data).type===`pong`){M=Date.now();return}}catch{}k&&(typeof e.data==`string`?k.postMessage({type:`ws.store`,format:`text`,data:e.data,ts:Date.now()}):e.data instanceof ArrayBuffer&&k.postMessage({type:`ws.store`,format:`binary`,data:new Uint8Array(e.data),ts:Date.now()})),A&&(typeof e.data==`string`?A.postMessage({type:`message`,format:`text`,data:e.data}):e.data instanceof ArrayBuffer&&A.postMessage({type:`message`,format:`binary`,data:new Uint8Array(e.data)}))}catch(e){console.error(`[WS] Failed to forward message`,e)}},O.onerror=e=>{console.error(`[WS] Error event:`,e),z(`error`,{reason:`WebSocket error event (no detail in browser API)`})},O.onclose=e=>{console.log(`[WS] Disconnected code=${e.code} reason="${e.reason}" wasClean=${e.wasClean}`),O=null,R(),z(`disconnected`,{code:e.code,reason:e.reason,wasClean:e.wasClean}),e.code!==1e3&&B()}},async send(e){O?.readyState===WebSocket.OPEN?O.send(e):console.warn(`[WS] Tried to send while disconnected`)},async close(){N&&=(clearTimeout(N),null),R(),P=0,F=null,O?.close(1e3,`Client request`),O=null,z(`disconnected`)},async getStatus(){return O?{[WebSocket.CONNECTING]:`connecting`,[WebSocket.OPEN]:`connected`,[WebSocket.CLOSING]:`closing`,[WebSocket.CLOSED]:`disconnected`}[O.readyState]||`unknown`:`disconnected`}},H=new Set;self.onconnect=e=>{let t=e.ports[0],n=H.size===0;H.add(t),t.start(),t.postMessage({type:n?`first-connect`:`reconnect`}),t.addEventListener(`message`,e=>{e.data?.type===`close`&&H.delete(t)}),c(V,t)};