@codemem/core 0.22.0 → 0.22.1

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 (33) hide show
  1. package/dist/better-sqlite-coordinator-runtime.d.ts.map +1 -1
  2. package/dist/coordinator-api-CEbQ6LHE.js +1575 -0
  3. package/dist/coordinator-api-CEbQ6LHE.js.map +1 -0
  4. package/dist/coordinator-api.d.ts +23 -2
  5. package/dist/coordinator-api.d.ts.map +1 -1
  6. package/dist/coordinator-invites.d.ts.map +1 -1
  7. package/dist/coordinator-runtime.d.ts +4 -1
  8. package/dist/coordinator-runtime.d.ts.map +1 -1
  9. package/dist/d1-coordinator-runtime.d.ts +2 -1
  10. package/dist/d1-coordinator-runtime.d.ts.map +1 -1
  11. package/dist/index.d.ts +4 -3
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +3061 -1935
  14. package/dist/index.js.map +1 -1
  15. package/dist/internal/cloudflare-coordinator.d.ts +2 -0
  16. package/dist/internal/cloudflare-coordinator.d.ts.map +1 -1
  17. package/dist/internal/cloudflare-coordinator.js +94 -93
  18. package/dist/internal/cloudflare-coordinator.js.map +1 -1
  19. package/dist/request-rate-limit.d.ts +12 -0
  20. package/dist/request-rate-limit.d.ts.map +1 -0
  21. package/dist/sync-auth-constants.d.ts +2 -0
  22. package/dist/sync-auth-constants.d.ts.map +1 -0
  23. package/dist/sync-auth.d.ts +0 -1
  24. package/dist/sync-auth.d.ts.map +1 -1
  25. package/dist/sync-daemon.d.ts +7 -0
  26. package/dist/sync-daemon.d.ts.map +1 -1
  27. package/dist/sync-fingerprint.d.ts +3 -0
  28. package/dist/sync-fingerprint.d.ts.map +1 -0
  29. package/dist/sync-identity.d.ts +1 -2
  30. package/dist/sync-identity.d.ts.map +1 -1
  31. package/package.json +2 -1
  32. package/dist/coordinator-api-CimbM4rk.js +0 -2482
  33. package/dist/coordinator-api-CimbM4rk.js.map +0 -1
@@ -1,2482 +0,0 @@
1
- import { createHash as e, createPrivateKey as t, createPublicKey as n, generateKeyPairSync as r, randomBytes as i, randomUUID as a, sign as o, verify as s } from "node:crypto";
2
- import { copyFileSync as c, existsSync as l, mkdirSync as u, readFileSync as d, renameSync as f, unlinkSync as p, writeFileSync as m } from "node:fs";
3
- import { homedir as h } from "node:os";
4
- import { dirname as g, join as _ } from "node:path";
5
- import v from "better-sqlite3";
6
- import { eq as ee, lt as te } from "drizzle-orm";
7
- import { drizzle as y } from "drizzle-orm/better-sqlite3";
8
- import { index as b, integer as x, primaryKey as ne, real as re, sqliteTable as S, text as C, uniqueIndex as ie } from "drizzle-orm/sqlite-core";
9
- import { execFileSync as w } from "node:child_process";
10
- import * as ae from "sqlite-vec";
11
- //#region \0rolldown/runtime.js
12
- var oe = Object.defineProperty, se = (e, t) => {
13
- let n = {};
14
- for (var r in e) oe(n, r, {
15
- get: e[r],
16
- enumerable: !0
17
- });
18
- return t || oe(n, Symbol.toStringTag, { value: "Module" }), n;
19
- }, ce = (e, t, n) => (r, i) => {
20
- let a = -1;
21
- return o(0);
22
- async function o(s) {
23
- if (s <= a) throw Error("next() called multiple times");
24
- a = s;
25
- let c, l = !1, u;
26
- if (e[s] ? (u = e[s][0][0], r.req.routeIndex = s) : u = s === e.length && i || void 0, u) try {
27
- c = await u(r, () => o(s + 1));
28
- } catch (e) {
29
- if (e instanceof Error && t) r.error = e, c = await t(e, r), l = !0;
30
- else throw e;
31
- }
32
- else r.finalized === !1 && n && (c = await n(r));
33
- return c && (r.finalized === !1 || l) && (r.res = c), r;
34
- }
35
- }, le = /* @__PURE__ */ Symbol(), ue = async (e, t = /* @__PURE__ */ Object.create(null)) => {
36
- let { all: n = !1, dot: r = !1 } = t, i = (e instanceof Ae ? e.raw.headers : e.headers).get("Content-Type");
37
- return i?.startsWith("multipart/form-data") || i?.startsWith("application/x-www-form-urlencoded") ? de(e, {
38
- all: n,
39
- dot: r
40
- }) : {};
41
- };
42
- async function de(e, t) {
43
- let n = await e.formData();
44
- return n ? fe(n, t) : {};
45
- }
46
- function fe(e, t) {
47
- let n = /* @__PURE__ */ Object.create(null);
48
- return e.forEach((e, r) => {
49
- t.all || r.endsWith("[]") ? pe(n, r, e) : n[r] = e;
50
- }), t.dot && Object.entries(n).forEach(([e, t]) => {
51
- e.includes(".") && (me(n, e, t), delete n[e]);
52
- }), n;
53
- }
54
- var pe = (e, t, n) => {
55
- e[t] === void 0 ? t.endsWith("[]") ? e[t] = [n] : e[t] = n : Array.isArray(e[t]) ? e[t].push(n) : e[t] = [e[t], n];
56
- }, me = (e, t, n) => {
57
- if (/(?:^|\.)__proto__\./.test(t)) return;
58
- let r = e, i = t.split(".");
59
- i.forEach((e, t) => {
60
- t === i.length - 1 ? r[e] = n : ((!r[e] || typeof r[e] != "object" || Array.isArray(r[e]) || r[e] instanceof File) && (r[e] = /* @__PURE__ */ Object.create(null)), r = r[e]);
61
- });
62
- }, he = (e) => {
63
- let t = e.split("/");
64
- return t[0] === "" && t.shift(), t;
65
- }, ge = (e) => {
66
- let { groups: t, path: n } = _e(e);
67
- return ve(he(n), t);
68
- }, _e = (e) => {
69
- let t = [];
70
- return e = e.replace(/\{[^}]+\}/g, (e, n) => {
71
- let r = `@${n}`;
72
- return t.push([r, e]), r;
73
- }), {
74
- groups: t,
75
- path: e
76
- };
77
- }, ve = (e, t) => {
78
- for (let n = t.length - 1; n >= 0; n--) {
79
- let [r] = t[n];
80
- for (let i = e.length - 1; i >= 0; i--) if (e[i].includes(r)) {
81
- e[i] = e[i].replace(r, t[n][1]);
82
- break;
83
- }
84
- }
85
- return e;
86
- }, T = {}, ye = (e, t) => {
87
- if (e === "*") return "*";
88
- let n = e.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/);
89
- if (n) {
90
- let r = `${e}#${t}`;
91
- return T[r] || (n[2] ? T[r] = t && t[0] !== ":" && t[0] !== "*" ? [
92
- r,
93
- n[1],
94
- RegExp(`^${n[2]}(?=/${t})`)
95
- ] : [
96
- e,
97
- n[1],
98
- RegExp(`^${n[2]}$`)
99
- ] : T[r] = [
100
- e,
101
- n[1],
102
- !0
103
- ]), T[r];
104
- }
105
- return null;
106
- }, be = (e, t) => {
107
- try {
108
- return t(e);
109
- } catch {
110
- return e.replace(/(?:%[0-9A-Fa-f]{2})+/g, (e) => {
111
- try {
112
- return t(e);
113
- } catch {
114
- return e;
115
- }
116
- });
117
- }
118
- }, xe = (e) => be(e, decodeURI), Se = (e) => {
119
- let t = e.url, n = t.indexOf("/", t.indexOf(":") + 4), r = n;
120
- for (; r < t.length; r++) {
121
- let e = t.charCodeAt(r);
122
- if (e === 37) {
123
- let e = t.indexOf("?", r), i = t.indexOf("#", r), a = e === -1 ? i === -1 ? void 0 : i : i === -1 ? e : Math.min(e, i), o = t.slice(n, a);
124
- return xe(o.includes("%25") ? o.replace(/%25/g, "%2525") : o);
125
- } else if (e === 63 || e === 35) break;
126
- }
127
- return t.slice(n, r);
128
- }, Ce = (e) => {
129
- let t = Se(e);
130
- return t.length > 1 && t.at(-1) === "/" ? t.slice(0, -1) : t;
131
- }, E = (e, t, ...n) => (n.length && (t = E(t, ...n)), `${e?.[0] === "/" ? "" : "/"}${e}${t === "/" ? "" : `${e?.at(-1) === "/" ? "" : "/"}${t?.[0] === "/" ? t.slice(1) : t}`}`), we = (e) => {
132
- if (e.charCodeAt(e.length - 1) !== 63 || !e.includes(":")) return null;
133
- let t = e.split("/"), n = [], r = "";
134
- return t.forEach((e) => {
135
- if (e !== "" && !/\:/.test(e)) r += "/" + e;
136
- else if (/\:/.test(e)) if (/\?/.test(e)) {
137
- n.length === 0 && r === "" ? n.push("/") : n.push(r);
138
- let t = e.replace("?", "");
139
- r += "/" + t, n.push(r);
140
- } else r += "/" + e;
141
- }), n.filter((e, t, n) => n.indexOf(e) === t);
142
- }, D = (e) => /[%+]/.test(e) ? (e.indexOf("+") !== -1 && (e = e.replace(/\+/g, " ")), e.indexOf("%") === -1 ? e : be(e, Oe)) : e, Te = (e, t, n) => {
143
- let r;
144
- if (!n && t && !/[%+]/.test(t)) {
145
- let n = e.indexOf("?", 8);
146
- if (n === -1) return;
147
- for (e.startsWith(t, n + 1) || (n = e.indexOf(`&${t}`, n + 1)); n !== -1;) {
148
- let r = e.charCodeAt(n + t.length + 1);
149
- if (r === 61) {
150
- let r = n + t.length + 2, i = e.indexOf("&", r);
151
- return D(e.slice(r, i === -1 ? void 0 : i));
152
- } else if (r == 38 || isNaN(r)) return "";
153
- n = e.indexOf(`&${t}`, n + 1);
154
- }
155
- if (r = /[%+]/.test(e), !r) return;
156
- }
157
- let i = {};
158
- r ??= /[%+]/.test(e);
159
- let a = e.indexOf("?", 8);
160
- for (; a !== -1;) {
161
- let t = e.indexOf("&", a + 1), o = e.indexOf("=", a);
162
- o > t && t !== -1 && (o = -1);
163
- let s = e.slice(a + 1, o === -1 ? t === -1 ? void 0 : t : o);
164
- if (r && (s = D(s)), a = t, s === "") continue;
165
- let c;
166
- o === -1 ? c = "" : (c = e.slice(o + 1, t === -1 ? void 0 : t), r && (c = D(c))), n ? (i[s] && Array.isArray(i[s]) || (i[s] = []), i[s].push(c)) : i[s] ??= c;
167
- }
168
- return t ? i[t] : i;
169
- }, Ee = Te, De = (e, t) => Te(e, t, !0), Oe = decodeURIComponent, ke = (e) => be(e, Oe), Ae = class {
170
- raw;
171
- #e;
172
- #t;
173
- routeIndex = 0;
174
- path;
175
- bodyCache = {};
176
- constructor(e, t = "/", n = [[]]) {
177
- this.raw = e, this.path = t, this.#t = n, this.#e = {};
178
- }
179
- param(e) {
180
- return e ? this.#n(e) : this.#r();
181
- }
182
- #n(e) {
183
- let t = this.#t[0][this.routeIndex][1][e], n = this.#i(t);
184
- return n && /\%/.test(n) ? ke(n) : n;
185
- }
186
- #r() {
187
- let e = {}, t = Object.keys(this.#t[0][this.routeIndex][1]);
188
- for (let n of t) {
189
- let t = this.#i(this.#t[0][this.routeIndex][1][n]);
190
- t !== void 0 && (e[n] = /\%/.test(t) ? ke(t) : t);
191
- }
192
- return e;
193
- }
194
- #i(e) {
195
- return this.#t[1] ? this.#t[1][e] : e;
196
- }
197
- query(e) {
198
- return Ee(this.url, e);
199
- }
200
- queries(e) {
201
- return De(this.url, e);
202
- }
203
- header(e) {
204
- if (e) return this.raw.headers.get(e) ?? void 0;
205
- let t = {};
206
- return this.raw.headers.forEach((e, n) => {
207
- t[n] = e;
208
- }), t;
209
- }
210
- async parseBody(e) {
211
- return this.bodyCache.parsedBody ??= await ue(this, e);
212
- }
213
- #a = (e) => {
214
- let { bodyCache: t, raw: n } = this, r = t[e];
215
- if (r) return r;
216
- let i = Object.keys(t)[0];
217
- return i ? t[i].then((t) => (i === "json" && (t = JSON.stringify(t)), new Response(t)[e]())) : t[e] = n[e]();
218
- };
219
- json() {
220
- return this.#a("text").then((e) => JSON.parse(e));
221
- }
222
- text() {
223
- return this.#a("text");
224
- }
225
- arrayBuffer() {
226
- return this.#a("arrayBuffer");
227
- }
228
- blob() {
229
- return this.#a("blob");
230
- }
231
- formData() {
232
- return this.#a("formData");
233
- }
234
- addValidatedData(e, t) {
235
- this.#e[e] = t;
236
- }
237
- valid(e) {
238
- return this.#e[e];
239
- }
240
- get url() {
241
- return this.raw.url;
242
- }
243
- get method() {
244
- return this.raw.method;
245
- }
246
- get [le]() {
247
- return this.#t;
248
- }
249
- get matchedRoutes() {
250
- return this.#t[0].map(([[, e]]) => e);
251
- }
252
- get routePath() {
253
- return this.#t[0].map(([[, e]]) => e)[this.routeIndex].path;
254
- }
255
- }, je = {
256
- Stringify: 1,
257
- BeforeStream: 2,
258
- Stream: 3
259
- }, Me = (e, t) => {
260
- let n = new String(e);
261
- return n.isEscaped = !0, n.callbacks = t, n;
262
- }, Ne = async (e, t, n, r, i) => {
263
- typeof e == "object" && !(e instanceof String) && (e instanceof Promise || (e = e.toString()), e instanceof Promise && (e = await e));
264
- let a = e.callbacks;
265
- if (!a?.length) return Promise.resolve(e);
266
- i ? i[0] += e : i = [e];
267
- let o = Promise.all(a.map((e) => e({
268
- phase: t,
269
- buffer: i,
270
- context: r
271
- }))).then((e) => Promise.all(e.filter(Boolean).map((e) => Ne(e, t, !1, r, i))).then(() => i[0]));
272
- return n ? Me(await o, a) : o;
273
- }, Pe = "text/plain; charset=UTF-8", Fe = (e, t) => ({
274
- "Content-Type": e,
275
- ...t
276
- }), O = (e, t) => new Response(e, t), Ie = class {
277
- #e;
278
- #t;
279
- env = {};
280
- #n;
281
- finalized = !1;
282
- error;
283
- #r;
284
- #i;
285
- #a;
286
- #o;
287
- #s;
288
- #c;
289
- #l;
290
- #u;
291
- #d;
292
- constructor(e, t) {
293
- this.#e = e, t && (this.#i = t.executionCtx, this.env = t.env, this.#c = t.notFoundHandler, this.#d = t.path, this.#u = t.matchResult);
294
- }
295
- get req() {
296
- return this.#t ??= new Ae(this.#e, this.#d, this.#u), this.#t;
297
- }
298
- get event() {
299
- if (this.#i && "respondWith" in this.#i) return this.#i;
300
- throw Error("This context has no FetchEvent");
301
- }
302
- get executionCtx() {
303
- if (this.#i) return this.#i;
304
- throw Error("This context has no ExecutionContext");
305
- }
306
- get res() {
307
- return this.#a ||= O(null, { headers: this.#l ??= new Headers() });
308
- }
309
- set res(e) {
310
- if (this.#a && e) {
311
- e = O(e.body, e);
312
- for (let [t, n] of this.#a.headers.entries()) if (t !== "content-type") if (t === "set-cookie") {
313
- let t = this.#a.headers.getSetCookie();
314
- e.headers.delete("set-cookie");
315
- for (let n of t) e.headers.append("set-cookie", n);
316
- } else e.headers.set(t, n);
317
- }
318
- this.#a = e, this.finalized = !0;
319
- }
320
- render = (...e) => (this.#s ??= (e) => this.html(e), this.#s(...e));
321
- setLayout = (e) => this.#o = e;
322
- getLayout = () => this.#o;
323
- setRenderer = (e) => {
324
- this.#s = e;
325
- };
326
- header = (e, t, n) => {
327
- this.finalized && (this.#a = O(this.#a.body, this.#a));
328
- let r = this.#a ? this.#a.headers : this.#l ??= new Headers();
329
- t === void 0 ? r.delete(e) : n?.append ? r.append(e, t) : r.set(e, t);
330
- };
331
- status = (e) => {
332
- this.#r = e;
333
- };
334
- set = (e, t) => {
335
- this.#n ??= /* @__PURE__ */ new Map(), this.#n.set(e, t);
336
- };
337
- get = (e) => this.#n ? this.#n.get(e) : void 0;
338
- get var() {
339
- return this.#n ? Object.fromEntries(this.#n) : {};
340
- }
341
- #f(e, t, n) {
342
- let r = this.#a ? new Headers(this.#a.headers) : this.#l ?? new Headers();
343
- if (typeof t == "object" && "headers" in t) {
344
- let e = t.headers instanceof Headers ? t.headers : new Headers(t.headers);
345
- for (let [t, n] of e) t.toLowerCase() === "set-cookie" ? r.append(t, n) : r.set(t, n);
346
- }
347
- if (n) for (let [e, t] of Object.entries(n)) if (typeof t == "string") r.set(e, t);
348
- else {
349
- r.delete(e);
350
- for (let n of t) r.append(e, n);
351
- }
352
- return O(e, {
353
- status: typeof t == "number" ? t : t?.status ?? this.#r,
354
- headers: r
355
- });
356
- }
357
- newResponse = (...e) => this.#f(...e);
358
- body = (e, t, n) => this.#f(e, t, n);
359
- text = (e, t, n) => !this.#l && !this.#r && !t && !n && !this.finalized ? new Response(e) : this.#f(e, t, Fe(Pe, n));
360
- json = (e, t, n) => this.#f(JSON.stringify(e), t, Fe("application/json", n));
361
- html = (e, t, n) => {
362
- let r = (e) => this.#f(e, t, Fe("text/html; charset=UTF-8", n));
363
- return typeof e == "object" ? Ne(e, je.Stringify, !1, {}).then(r) : r(e);
364
- };
365
- redirect = (e, t) => {
366
- let n = String(e);
367
- return this.header("Location", /[^\x00-\xFF]/.test(n) ? encodeURI(n) : n), this.newResponse(null, t ?? 302);
368
- };
369
- notFound = () => (this.#c ??= () => O(), this.#c(this));
370
- }, Le = [
371
- "get",
372
- "post",
373
- "put",
374
- "delete",
375
- "options",
376
- "patch"
377
- ], Re = "Can not add a route since the matcher is already built.", ze = class extends Error {}, Be = "__COMPOSED_HANDLER", Ve = (e) => e.text("404 Not Found", 404), He = (e, t) => {
378
- if ("getResponse" in e) {
379
- let n = e.getResponse();
380
- return t.newResponse(n.body, n);
381
- }
382
- return console.error(e), t.text("Internal Server Error", 500);
383
- }, Ue = class e {
384
- get;
385
- post;
386
- put;
387
- delete;
388
- options;
389
- patch;
390
- all;
391
- on;
392
- use;
393
- router;
394
- getPath;
395
- _basePath = "/";
396
- #e = "/";
397
- routes = [];
398
- constructor(e = {}) {
399
- [...Le, "all"].forEach((e) => {
400
- this[e] = (t, ...n) => (typeof t == "string" ? this.#e = t : this.#r(e, this.#e, t), n.forEach((t) => {
401
- this.#r(e, this.#e, t);
402
- }), this);
403
- }), this.on = (e, t, ...n) => {
404
- for (let r of [t].flat()) {
405
- this.#e = r;
406
- for (let t of [e].flat()) n.map((e) => {
407
- this.#r(t.toUpperCase(), this.#e, e);
408
- });
409
- }
410
- return this;
411
- }, this.use = (e, ...t) => (typeof e == "string" ? this.#e = e : (this.#e = "*", t.unshift(e)), t.forEach((e) => {
412
- this.#r("ALL", this.#e, e);
413
- }), this);
414
- let { strict: t, ...n } = e;
415
- Object.assign(this, n), this.getPath = t ?? !0 ? e.getPath ?? Se : Ce;
416
- }
417
- #t() {
418
- let t = new e({
419
- router: this.router,
420
- getPath: this.getPath
421
- });
422
- return t.errorHandler = this.errorHandler, t.#n = this.#n, t.routes = this.routes, t;
423
- }
424
- #n = Ve;
425
- errorHandler = He;
426
- route(e, t) {
427
- let n = this.basePath(e);
428
- return t.routes.map((e) => {
429
- let r;
430
- t.errorHandler === He ? r = e.handler : (r = async (n, r) => (await ce([], t.errorHandler)(n, () => e.handler(n, r))).res, r[Be] = e.handler), n.#r(e.method, e.path, r);
431
- }), this;
432
- }
433
- basePath(e) {
434
- let t = this.#t();
435
- return t._basePath = E(this._basePath, e), t;
436
- }
437
- onError = (e) => (this.errorHandler = e, this);
438
- notFound = (e) => (this.#n = e, this);
439
- mount(e, t, n) {
440
- let r, i;
441
- n && (typeof n == "function" ? i = n : (i = n.optionHandler, r = n.replaceRequest === !1 ? (e) => e : n.replaceRequest));
442
- let a = i ? (e) => {
443
- let t = i(e);
444
- return Array.isArray(t) ? t : [t];
445
- } : (e) => {
446
- let t;
447
- try {
448
- t = e.executionCtx;
449
- } catch {}
450
- return [e.env, t];
451
- };
452
- return r ||= (() => {
453
- let t = E(this._basePath, e), n = t === "/" ? 0 : t.length;
454
- return (e) => {
455
- let t = new URL(e.url);
456
- return t.pathname = t.pathname.slice(n) || "/", new Request(t, e);
457
- };
458
- })(), this.#r("ALL", E(e, "*"), async (e, n) => {
459
- let i = await t(r(e.req.raw), ...a(e));
460
- if (i) return i;
461
- await n();
462
- }), this;
463
- }
464
- #r(e, t, n) {
465
- e = e.toUpperCase(), t = E(this._basePath, t);
466
- let r = {
467
- basePath: this._basePath,
468
- path: t,
469
- method: e,
470
- handler: n
471
- };
472
- this.router.add(e, t, [n, r]), this.routes.push(r);
473
- }
474
- #i(e, t) {
475
- if (e instanceof Error) return this.errorHandler(e, t);
476
- throw e;
477
- }
478
- #a(e, t, n, r) {
479
- if (r === "HEAD") return (async () => new Response(null, await this.#a(e, t, n, "GET")))();
480
- let i = this.getPath(e, { env: n }), a = this.router.match(r, i), o = new Ie(e, {
481
- path: i,
482
- matchResult: a,
483
- env: n,
484
- executionCtx: t,
485
- notFoundHandler: this.#n
486
- });
487
- if (a[0].length === 1) {
488
- let e;
489
- try {
490
- e = a[0][0][0][0](o, async () => {
491
- o.res = await this.#n(o);
492
- });
493
- } catch (e) {
494
- return this.#i(e, o);
495
- }
496
- return e instanceof Promise ? e.then((e) => e || (o.finalized ? o.res : this.#n(o))).catch((e) => this.#i(e, o)) : e ?? this.#n(o);
497
- }
498
- let s = ce(a[0], this.errorHandler, this.#n);
499
- return (async () => {
500
- try {
501
- let e = await s(o);
502
- if (!e.finalized) throw Error("Context is not finalized. Did you forget to return a Response object or `await next()`?");
503
- return e.res;
504
- } catch (e) {
505
- return this.#i(e, o);
506
- }
507
- })();
508
- }
509
- fetch = (e, ...t) => this.#a(e, t[1], t[0], e.method);
510
- request = (e, t, n, r) => e instanceof Request ? this.fetch(t ? new Request(e, t) : e, n, r) : (e = e.toString(), this.fetch(new Request(/^https?:\/\//.test(e) ? e : `http://localhost${E("/", e)}`, t), n, r));
511
- fire = () => {
512
- addEventListener("fetch", (e) => {
513
- e.respondWith(this.#a(e.request, e, void 0, e.request.method));
514
- });
515
- };
516
- }, We = [];
517
- function Ge(e, t) {
518
- let n = this.buildAllMatchers(), r = ((e, t) => {
519
- let r = n[e] || n.ALL, i = r[2][t];
520
- if (i) return i;
521
- let a = t.match(r[0]);
522
- if (!a) return [[], We];
523
- let o = a.indexOf("", 1);
524
- return [r[1][o], a];
525
- });
526
- return this.match = r, r(e, t);
527
- }
528
- //#endregion
529
- //#region ../../node_modules/.pnpm/hono@4.12.8/node_modules/hono/dist/router/reg-exp-router/node.js
530
- var k = "[^/]+", A = ".*", j = "(?:|/.*)", M = /* @__PURE__ */ Symbol(), Ke = /* @__PURE__ */ new Set(".\\+*[^]$()");
531
- function qe(e, t) {
532
- return e.length === 1 ? t.length === 1 ? e < t ? -1 : 1 : -1 : t.length === 1 || e === A || e === j ? 1 : t === A || t === j ? -1 : e === k ? 1 : t === k ? -1 : e.length === t.length ? e < t ? -1 : 1 : t.length - e.length;
533
- }
534
- var Je = class e {
535
- #e;
536
- #t;
537
- #n = /* @__PURE__ */ Object.create(null);
538
- insert(t, n, r, i, a) {
539
- if (t.length === 0) {
540
- if (this.#e !== void 0) throw M;
541
- if (a) return;
542
- this.#e = n;
543
- return;
544
- }
545
- let [o, ...s] = t, c = o === "*" ? s.length === 0 ? [
546
- "",
547
- "",
548
- A
549
- ] : [
550
- "",
551
- "",
552
- k
553
- ] : o === "/*" ? [
554
- "",
555
- "",
556
- j
557
- ] : o.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/), l;
558
- if (c) {
559
- let t = c[1], n = c[2] || k;
560
- if (t && c[2] && (n === ".*" || (n = n.replace(/^\((?!\?:)(?=[^)]+\)$)/, "(?:"), /\((?!\?:)/.test(n)))) throw M;
561
- if (l = this.#n[n], !l) {
562
- if (Object.keys(this.#n).some((e) => e !== A && e !== j)) throw M;
563
- if (a) return;
564
- l = this.#n[n] = new e(), t !== "" && (l.#t = i.varIndex++);
565
- }
566
- !a && t !== "" && r.push([t, l.#t]);
567
- } else if (l = this.#n[o], !l) {
568
- if (Object.keys(this.#n).some((e) => e.length > 1 && e !== A && e !== j)) throw M;
569
- if (a) return;
570
- l = this.#n[o] = new e();
571
- }
572
- l.insert(s, n, r, i, a);
573
- }
574
- buildRegExpStr() {
575
- let e = Object.keys(this.#n).sort(qe).map((e) => {
576
- let t = this.#n[e];
577
- return (typeof t.#t == "number" ? `(${e})@${t.#t}` : Ke.has(e) ? `\\${e}` : e) + t.buildRegExpStr();
578
- });
579
- return typeof this.#e == "number" && e.unshift(`#${this.#e}`), e.length === 0 ? "" : e.length === 1 ? e[0] : "(?:" + e.join("|") + ")";
580
- }
581
- }, Ye = class {
582
- #e = { varIndex: 0 };
583
- #t = new Je();
584
- insert(e, t, n) {
585
- let r = [], i = [];
586
- for (let t = 0;;) {
587
- let n = !1;
588
- if (e = e.replace(/\{[^}]+\}/g, (e) => {
589
- let r = `@\\${t}`;
590
- return i[t] = [r, e], t++, n = !0, r;
591
- }), !n) break;
592
- }
593
- let a = e.match(/(?::[^\/]+)|(?:\/\*$)|./g) || [];
594
- for (let e = i.length - 1; e >= 0; e--) {
595
- let [t] = i[e];
596
- for (let n = a.length - 1; n >= 0; n--) if (a[n].indexOf(t) !== -1) {
597
- a[n] = a[n].replace(t, i[e][1]);
598
- break;
599
- }
600
- }
601
- return this.#t.insert(a, t, r, this.#e, n), r;
602
- }
603
- buildRegExp() {
604
- let e = this.#t.buildRegExpStr();
605
- if (e === "") return [
606
- /^$/,
607
- [],
608
- []
609
- ];
610
- let t = 0, n = [], r = [];
611
- return e = e.replace(/#(\d+)|@(\d+)|\.\*\$/g, (e, i, a) => i === void 0 ? (a === void 0 || (r[Number(a)] = ++t), "") : (n[++t] = Number(i), "$()")), [
612
- RegExp(`^${e}`),
613
- n,
614
- r
615
- ];
616
- }
617
- }, Xe = [
618
- /^$/,
619
- [],
620
- /* @__PURE__ */ Object.create(null)
621
- ], Ze = /* @__PURE__ */ Object.create(null);
622
- function Qe(e) {
623
- return Ze[e] ??= RegExp(e === "*" ? "" : `^${e.replace(/\/\*$|([.\\+*[^\]$()])/g, (e, t) => t ? `\\${t}` : "(?:|/.*)")}$`);
624
- }
625
- function $e() {
626
- Ze = /* @__PURE__ */ Object.create(null);
627
- }
628
- function et(e) {
629
- let t = new Ye(), n = [];
630
- if (e.length === 0) return Xe;
631
- let r = e.map((e) => [!/\*|\/:/.test(e[0]), ...e]).sort(([e, t], [n, r]) => e ? 1 : n ? -1 : t.length - r.length), i = /* @__PURE__ */ Object.create(null);
632
- for (let e = 0, a = -1, o = r.length; e < o; e++) {
633
- let [o, s, c] = r[e];
634
- o ? i[s] = [c.map(([e]) => [e, /* @__PURE__ */ Object.create(null)]), We] : a++;
635
- let l;
636
- try {
637
- l = t.insert(s, a, o);
638
- } catch (e) {
639
- throw e === M ? new ze(s) : e;
640
- }
641
- o || (n[a] = c.map(([e, t]) => {
642
- let n = /* @__PURE__ */ Object.create(null);
643
- for (--t; t >= 0; t--) {
644
- let [e, r] = l[t];
645
- n[e] = r;
646
- }
647
- return [e, n];
648
- }));
649
- }
650
- let [a, o, s] = t.buildRegExp();
651
- for (let e = 0, t = n.length; e < t; e++) for (let t = 0, r = n[e].length; t < r; t++) {
652
- let r = n[e][t]?.[1];
653
- if (!r) continue;
654
- let i = Object.keys(r);
655
- for (let e = 0, t = i.length; e < t; e++) r[i[e]] = s[r[i[e]]];
656
- }
657
- let c = [];
658
- for (let e in o) c[e] = n[o[e]];
659
- return [
660
- a,
661
- c,
662
- i
663
- ];
664
- }
665
- function N(e, t) {
666
- if (e) {
667
- for (let n of Object.keys(e).sort((e, t) => t.length - e.length)) if (Qe(n).test(t)) return [...e[n]];
668
- }
669
- }
670
- var tt = class {
671
- name = "RegExpRouter";
672
- #e;
673
- #t;
674
- constructor() {
675
- this.#e = { ALL: /* @__PURE__ */ Object.create(null) }, this.#t = { ALL: /* @__PURE__ */ Object.create(null) };
676
- }
677
- add(e, t, n) {
678
- let r = this.#e, i = this.#t;
679
- if (!r || !i) throw Error(Re);
680
- r[e] || [r, i].forEach((t) => {
681
- t[e] = /* @__PURE__ */ Object.create(null), Object.keys(t.ALL).forEach((n) => {
682
- t[e][n] = [...t.ALL[n]];
683
- });
684
- }), t === "/*" && (t = "*");
685
- let a = (t.match(/\/:/g) || []).length;
686
- if (/\*$/.test(t)) {
687
- let o = Qe(t);
688
- e === "ALL" ? Object.keys(r).forEach((e) => {
689
- r[e][t] ||= N(r[e], t) || N(r.ALL, t) || [];
690
- }) : r[e][t] ||= N(r[e], t) || N(r.ALL, t) || [], Object.keys(r).forEach((t) => {
691
- (e === "ALL" || e === t) && Object.keys(r[t]).forEach((e) => {
692
- o.test(e) && r[t][e].push([n, a]);
693
- });
694
- }), Object.keys(i).forEach((t) => {
695
- (e === "ALL" || e === t) && Object.keys(i[t]).forEach((e) => o.test(e) && i[t][e].push([n, a]));
696
- });
697
- return;
698
- }
699
- let o = we(t) || [t];
700
- for (let t = 0, s = o.length; t < s; t++) {
701
- let c = o[t];
702
- Object.keys(i).forEach((o) => {
703
- (e === "ALL" || e === o) && (i[o][c] ||= [...N(r[o], c) || N(r.ALL, c) || []], i[o][c].push([n, a - s + t + 1]));
704
- });
705
- }
706
- }
707
- match = Ge;
708
- buildAllMatchers() {
709
- let e = /* @__PURE__ */ Object.create(null);
710
- return Object.keys(this.#t).concat(Object.keys(this.#e)).forEach((t) => {
711
- e[t] ||= this.#n(t);
712
- }), this.#e = this.#t = void 0, $e(), e;
713
- }
714
- #n(e) {
715
- let t = [], n = e === "ALL";
716
- return [this.#e, this.#t].forEach((r) => {
717
- let i = r[e] ? Object.keys(r[e]).map((t) => [t, r[e][t]]) : [];
718
- i.length === 0 ? e !== "ALL" && t.push(...Object.keys(r.ALL).map((e) => [e, r.ALL[e]])) : (n ||= !0, t.push(...i));
719
- }), n ? et(t) : null;
720
- }
721
- }, nt = class {
722
- name = "SmartRouter";
723
- #e = [];
724
- #t = [];
725
- constructor(e) {
726
- this.#e = e.routers;
727
- }
728
- add(e, t, n) {
729
- if (!this.#t) throw Error(Re);
730
- this.#t.push([
731
- e,
732
- t,
733
- n
734
- ]);
735
- }
736
- match(e, t) {
737
- if (!this.#t) throw Error("Fatal error");
738
- let n = this.#e, r = this.#t, i = n.length, a = 0, o;
739
- for (; a < i; a++) {
740
- let i = n[a];
741
- try {
742
- for (let e = 0, t = r.length; e < t; e++) i.add(...r[e]);
743
- o = i.match(e, t);
744
- } catch (e) {
745
- if (e instanceof ze) continue;
746
- throw e;
747
- }
748
- this.match = i.match.bind(i), this.#e = [i], this.#t = void 0;
749
- break;
750
- }
751
- if (a === i) throw Error("Fatal error");
752
- return this.name = `SmartRouter + ${this.activeRouter.name}`, o;
753
- }
754
- get activeRouter() {
755
- if (this.#t || this.#e.length !== 1) throw Error("No active router has been determined yet.");
756
- return this.#e[0];
757
- }
758
- }, P = /* @__PURE__ */ Object.create(null), rt = (e) => {
759
- for (let t in e) return !0;
760
- return !1;
761
- }, it = class e {
762
- #e;
763
- #t;
764
- #n;
765
- #r = 0;
766
- #i = P;
767
- constructor(e, t, n) {
768
- if (this.#t = n || /* @__PURE__ */ Object.create(null), this.#e = [], e && t) {
769
- let n = /* @__PURE__ */ Object.create(null);
770
- n[e] = {
771
- handler: t,
772
- possibleKeys: [],
773
- score: 0
774
- }, this.#e = [n];
775
- }
776
- this.#n = [];
777
- }
778
- insert(t, n, r) {
779
- this.#r = ++this.#r;
780
- let i = this, a = ge(n), o = [];
781
- for (let t = 0, n = a.length; t < n; t++) {
782
- let n = a[t], r = a[t + 1], s = ye(n, r), c = Array.isArray(s) ? s[0] : n;
783
- if (c in i.#t) {
784
- i = i.#t[c], s && o.push(s[1]);
785
- continue;
786
- }
787
- i.#t[c] = new e(), s && (i.#n.push(s), o.push(s[1])), i = i.#t[c];
788
- }
789
- return i.#e.push({ [t]: {
790
- handler: r,
791
- possibleKeys: o.filter((e, t, n) => n.indexOf(e) === t),
792
- score: this.#r
793
- } }), i;
794
- }
795
- #a(e, t, n, r, i) {
796
- for (let a = 0, o = t.#e.length; a < o; a++) {
797
- let o = t.#e[a], s = o[n] || o.ALL, c = {};
798
- if (s !== void 0 && (s.params = /* @__PURE__ */ Object.create(null), e.push(s), r !== P || i && i !== P)) for (let e = 0, t = s.possibleKeys.length; e < t; e++) {
799
- let t = s.possibleKeys[e], n = c[s.score];
800
- s.params[t] = i?.[t] && !n ? i[t] : r[t] ?? i?.[t], c[s.score] = !0;
801
- }
802
- }
803
- }
804
- search(e, t) {
805
- let n = [];
806
- this.#i = P;
807
- let r = [this], i = he(t), a = [], o = i.length, s = null;
808
- for (let c = 0; c < o; c++) {
809
- let l = i[c], u = c === o - 1, d = [];
810
- for (let f = 0, p = r.length; f < p; f++) {
811
- let p = r[f], m = p.#t[l];
812
- m && (m.#i = p.#i, u ? (m.#t["*"] && this.#a(n, m.#t["*"], e, p.#i), this.#a(n, m, e, p.#i)) : d.push(m));
813
- for (let r = 0, f = p.#n.length; r < f; r++) {
814
- let f = p.#n[r], m = p.#i === P ? {} : { ...p.#i };
815
- if (f === "*") {
816
- let t = p.#t["*"];
817
- t && (this.#a(n, t, e, p.#i), t.#i = m, d.push(t));
818
- continue;
819
- }
820
- let [h, g, _] = f;
821
- if (!l && !(_ instanceof RegExp)) continue;
822
- let v = p.#t[h];
823
- if (_ instanceof RegExp) {
824
- if (s === null) {
825
- s = Array(o);
826
- let e = t[0] === "/" ? 1 : 0;
827
- for (let t = 0; t < o; t++) s[t] = e, e += i[t].length + 1;
828
- }
829
- let r = t.substring(s[c]), l = _.exec(r);
830
- if (l) {
831
- if (m[g] = l[0], this.#a(n, v, e, p.#i, m), rt(v.#t)) {
832
- v.#i = m;
833
- let e = l[0].match(/\//)?.length ?? 0;
834
- (a[e] ||= []).push(v);
835
- }
836
- continue;
837
- }
838
- }
839
- (_ === !0 || _.test(l)) && (m[g] = l, u ? (this.#a(n, v, e, m, p.#i), v.#t["*"] && this.#a(n, v.#t["*"], e, m, p.#i)) : (v.#i = m, d.push(v)));
840
- }
841
- }
842
- let f = a.shift();
843
- r = f ? d.concat(f) : d;
844
- }
845
- return n.length > 1 && n.sort((e, t) => e.score - t.score), [n.map(({ handler: e, params: t }) => [e, t])];
846
- }
847
- }, at = class {
848
- name = "TrieRouter";
849
- #e;
850
- constructor() {
851
- this.#e = new it();
852
- }
853
- add(e, t, n) {
854
- let r = we(t);
855
- if (r) {
856
- for (let t = 0, i = r.length; t < i; t++) this.#e.insert(e, r[t], n);
857
- return;
858
- }
859
- this.#e.insert(e, t, n);
860
- }
861
- match(e, t) {
862
- return this.#e.search(e, t);
863
- }
864
- }, ot = class extends Ue {
865
- constructor(e = {}) {
866
- super(e), this.router = e.router ?? new nt({ routers: [new tt(), new at()] });
867
- }
868
- };
869
- //#endregion
870
- //#region src/coordinator-invites.ts
871
- function st(e) {
872
- let t = JSON.stringify(e), n = new TextEncoder().encode(t);
873
- return Buffer.from(n).toString("base64url").replace(/=+$/, "");
874
- }
875
- function ct(e) {
876
- let t = e + "=".repeat((4 - e.length % 4) % 4), n = Buffer.from(t, "base64url").toString("utf-8"), r = JSON.parse(n);
877
- if (typeof r != "object" || !r) throw Error("invalid invite payload");
878
- return r;
879
- }
880
- function lt(e) {
881
- return `codemem://join?invite=${encodeURIComponent(e)}`;
882
- }
883
- function ut(e) {
884
- let t = e.trim();
885
- if (t.startsWith("codemem://")) {
886
- let e = new URL(t).searchParams.get("invite") ?? "";
887
- if (!e) throw Error("invite payload missing from link");
888
- return e;
889
- }
890
- return t;
891
- }
892
- //#endregion
893
- //#region src/schema.ts
894
- var F = /* @__PURE__ */ se({
895
- actors: () => Ot,
896
- artifacts: () => dt,
897
- memoryItems: () => ft,
898
- opencodeSessions: () => gt,
899
- rawEventFlushBatches: () => _t,
900
- rawEventIngestSamples: () => z,
901
- rawEventIngestStats: () => Dt,
902
- rawEventSessions: () => ht,
903
- rawEvents: () => mt,
904
- replicationCursors: () => xt,
905
- replicationOps: () => bt,
906
- schema: () => kt,
907
- sessionSummaries: () => yt,
908
- sessions: () => I,
909
- syncAttempts: () => Ct,
910
- syncDaemonState: () => wt,
911
- syncDevice: () => R,
912
- syncNonces: () => L,
913
- syncPeers: () => St,
914
- syncResetState: () => Tt,
915
- syncRetentionState: () => Et,
916
- usageEvents: () => pt,
917
- userPrompts: () => vt
918
- }), I = S("sessions", {
919
- id: x("id").primaryKey(),
920
- started_at: C("started_at").notNull(),
921
- ended_at: C("ended_at"),
922
- cwd: C("cwd"),
923
- project: C("project"),
924
- git_remote: C("git_remote"),
925
- git_branch: C("git_branch"),
926
- user: C("user"),
927
- tool_version: C("tool_version"),
928
- metadata_json: C("metadata_json"),
929
- import_key: C("import_key")
930
- }), dt = S("artifacts", {
931
- id: x("id").primaryKey(),
932
- session_id: x("session_id").notNull().references(() => I.id, { onDelete: "cascade" }),
933
- kind: C("kind").notNull(),
934
- path: C("path"),
935
- content_text: C("content_text"),
936
- content_hash: C("content_hash"),
937
- created_at: C("created_at").notNull(),
938
- metadata_json: C("metadata_json")
939
- }, (e) => [b("idx_artifacts_session_kind").on(e.session_id, e.kind)]), ft = S("memory_items", {
940
- id: x("id").primaryKey(),
941
- session_id: x("session_id").notNull().references(() => I.id, { onDelete: "cascade" }),
942
- kind: C("kind").notNull(),
943
- title: C("title").notNull(),
944
- subtitle: C("subtitle"),
945
- body_text: C("body_text").notNull(),
946
- confidence: re("confidence").default(.5),
947
- tags_text: C("tags_text").default(""),
948
- active: x("active").default(1),
949
- created_at: C("created_at").notNull(),
950
- updated_at: C("updated_at").notNull(),
951
- metadata_json: C("metadata_json"),
952
- actor_id: C("actor_id"),
953
- actor_display_name: C("actor_display_name"),
954
- visibility: C("visibility"),
955
- workspace_id: C("workspace_id"),
956
- workspace_kind: C("workspace_kind"),
957
- origin_device_id: C("origin_device_id"),
958
- origin_source: C("origin_source"),
959
- trust_state: C("trust_state"),
960
- facts: C("facts"),
961
- narrative: C("narrative"),
962
- concepts: C("concepts"),
963
- files_read: C("files_read"),
964
- files_modified: C("files_modified"),
965
- user_prompt_id: x("user_prompt_id"),
966
- prompt_number: x("prompt_number"),
967
- deleted_at: C("deleted_at"),
968
- rev: x("rev").default(0),
969
- import_key: C("import_key")
970
- }, (e) => [b("idx_memory_items_active_created").on(e.active, e.created_at), b("idx_memory_items_session").on(e.session_id)]), pt = S("usage_events", {
971
- id: x("id").primaryKey(),
972
- session_id: x("session_id").references(() => I.id, { onDelete: "set null" }),
973
- event: C("event").notNull(),
974
- tokens_read: x("tokens_read").default(0),
975
- tokens_written: x("tokens_written").default(0),
976
- tokens_saved: x("tokens_saved").default(0),
977
- created_at: C("created_at").notNull(),
978
- metadata_json: C("metadata_json")
979
- }, (e) => [b("idx_usage_events_event_created").on(e.event, e.created_at), b("idx_usage_events_session").on(e.session_id)]), mt = S("raw_events", {
980
- id: x("id").primaryKey(),
981
- source: C("source").notNull().default("opencode"),
982
- stream_id: C("stream_id").notNull().default(""),
983
- opencode_session_id: C("opencode_session_id").notNull(),
984
- event_id: C("event_id"),
985
- event_seq: x("event_seq").notNull(),
986
- event_type: C("event_type").notNull(),
987
- ts_wall_ms: x("ts_wall_ms"),
988
- ts_mono_ms: re("ts_mono_ms"),
989
- payload_json: C("payload_json").notNull(),
990
- created_at: C("created_at").notNull()
991
- }, (e) => [
992
- ie("idx_raw_events_source_stream_seq").on(e.source, e.stream_id, e.event_seq),
993
- ie("idx_raw_events_source_stream_event_id").on(e.source, e.stream_id, e.event_id),
994
- b("idx_raw_events_session_seq").on(e.opencode_session_id, e.event_seq),
995
- b("idx_raw_events_created").on(e.created_at)
996
- ]), ht = S("raw_event_sessions", {
997
- source: C("source").notNull().default("opencode"),
998
- stream_id: C("stream_id").notNull().default(""),
999
- opencode_session_id: C("opencode_session_id").notNull(),
1000
- cwd: C("cwd"),
1001
- project: C("project"),
1002
- started_at: C("started_at"),
1003
- last_seen_ts_wall_ms: x("last_seen_ts_wall_ms"),
1004
- last_received_event_seq: x("last_received_event_seq").notNull().default(-1),
1005
- last_flushed_event_seq: x("last_flushed_event_seq").notNull().default(-1),
1006
- updated_at: C("updated_at").notNull()
1007
- }, (e) => [ne({ columns: [e.source, e.stream_id] })]), gt = S("opencode_sessions", {
1008
- source: C("source").notNull().default("opencode"),
1009
- stream_id: C("stream_id").notNull().default(""),
1010
- opencode_session_id: C("opencode_session_id").notNull(),
1011
- session_id: x("session_id").references(() => I.id, { onDelete: "cascade" }),
1012
- created_at: C("created_at").notNull()
1013
- }, (e) => [ne({ columns: [e.source, e.stream_id] }), b("idx_opencode_sessions_session").on(e.session_id)]), _t = S("raw_event_flush_batches", {
1014
- id: x("id").primaryKey(),
1015
- source: C("source").notNull().default("opencode"),
1016
- stream_id: C("stream_id").notNull().default(""),
1017
- opencode_session_id: C("opencode_session_id").notNull(),
1018
- start_event_seq: x("start_event_seq").notNull(),
1019
- end_event_seq: x("end_event_seq").notNull(),
1020
- extractor_version: C("extractor_version").notNull(),
1021
- status: C("status").notNull(),
1022
- error_message: C("error_message"),
1023
- error_type: C("error_type"),
1024
- observer_provider: C("observer_provider"),
1025
- observer_model: C("observer_model"),
1026
- observer_runtime: C("observer_runtime"),
1027
- observer_auth_source: C("observer_auth_source"),
1028
- observer_auth_type: C("observer_auth_type"),
1029
- observer_error_code: C("observer_error_code"),
1030
- observer_error_message: C("observer_error_message"),
1031
- attempt_count: x("attempt_count").notNull().default(0),
1032
- created_at: C("created_at").notNull(),
1033
- updated_at: C("updated_at").notNull()
1034
- }, (e) => [
1035
- ie("idx_flush_batches_source_stream_seq_ver").on(e.source, e.stream_id, e.start_event_seq, e.end_event_seq, e.extractor_version),
1036
- b("idx_flush_batches_session_created").on(e.opencode_session_id, e.created_at),
1037
- b("idx_flush_batches_status_updated").on(e.status, e.updated_at)
1038
- ]), vt = S("user_prompts", {
1039
- id: x("id").primaryKey(),
1040
- session_id: x("session_id").references(() => I.id, { onDelete: "cascade" }),
1041
- project: C("project"),
1042
- prompt_text: C("prompt_text").notNull(),
1043
- prompt_number: x("prompt_number"),
1044
- created_at: C("created_at").notNull(),
1045
- created_at_epoch: x("created_at_epoch").notNull(),
1046
- metadata_json: C("metadata_json"),
1047
- import_key: C("import_key")
1048
- }, (e) => [
1049
- b("idx_user_prompts_session").on(e.session_id),
1050
- b("idx_user_prompts_project").on(e.project),
1051
- b("idx_user_prompts_epoch").on(e.created_at_epoch)
1052
- ]), yt = S("session_summaries", {
1053
- id: x("id").primaryKey(),
1054
- session_id: x("session_id").references(() => I.id, { onDelete: "cascade" }),
1055
- project: C("project"),
1056
- request: C("request"),
1057
- investigated: C("investigated"),
1058
- learned: C("learned"),
1059
- completed: C("completed"),
1060
- next_steps: C("next_steps"),
1061
- notes: C("notes"),
1062
- files_read: C("files_read"),
1063
- files_edited: C("files_edited"),
1064
- prompt_number: x("prompt_number"),
1065
- created_at: C("created_at").notNull(),
1066
- created_at_epoch: x("created_at_epoch").notNull(),
1067
- metadata_json: C("metadata_json"),
1068
- import_key: C("import_key")
1069
- }, (e) => [
1070
- b("idx_session_summaries_session").on(e.session_id),
1071
- b("idx_session_summaries_project").on(e.project),
1072
- b("idx_session_summaries_epoch").on(e.created_at_epoch)
1073
- ]), bt = S("replication_ops", {
1074
- op_id: C("op_id").primaryKey(),
1075
- entity_type: C("entity_type").notNull(),
1076
- entity_id: C("entity_id").notNull(),
1077
- op_type: C("op_type").notNull(),
1078
- payload_json: C("payload_json"),
1079
- clock_rev: x("clock_rev").notNull(),
1080
- clock_updated_at: C("clock_updated_at").notNull(),
1081
- clock_device_id: C("clock_device_id").notNull(),
1082
- device_id: C("device_id").notNull(),
1083
- created_at: C("created_at").notNull()
1084
- }, (e) => [b("idx_replication_ops_created").on(e.created_at, e.op_id), b("idx_replication_ops_entity").on(e.entity_type, e.entity_id)]), xt = S("replication_cursors", {
1085
- peer_device_id: C("peer_device_id").primaryKey(),
1086
- last_applied_cursor: C("last_applied_cursor"),
1087
- last_acked_cursor: C("last_acked_cursor"),
1088
- updated_at: C("updated_at").notNull()
1089
- }), St = S("sync_peers", {
1090
- peer_device_id: C("peer_device_id").primaryKey(),
1091
- name: C("name"),
1092
- pinned_fingerprint: C("pinned_fingerprint"),
1093
- public_key: C("public_key"),
1094
- addresses_json: C("addresses_json"),
1095
- claimed_local_actor: x("claimed_local_actor").notNull().default(0),
1096
- actor_id: C("actor_id"),
1097
- projects_include_json: C("projects_include_json"),
1098
- projects_exclude_json: C("projects_exclude_json"),
1099
- created_at: C("created_at").notNull(),
1100
- last_seen_at: C("last_seen_at"),
1101
- last_sync_at: C("last_sync_at"),
1102
- last_error: C("last_error")
1103
- }), L = S("sync_nonces", {
1104
- nonce: C("nonce").primaryKey(),
1105
- device_id: C("device_id").notNull(),
1106
- created_at: C("created_at").notNull()
1107
- }), R = S("sync_device", {
1108
- device_id: C("device_id").primaryKey(),
1109
- public_key: C("public_key").notNull(),
1110
- fingerprint: C("fingerprint").notNull(),
1111
- created_at: C("created_at").notNull()
1112
- }), Ct = S("sync_attempts", {
1113
- id: x("id").primaryKey({ autoIncrement: !0 }),
1114
- peer_device_id: C("peer_device_id").notNull(),
1115
- started_at: C("started_at").notNull(),
1116
- finished_at: C("finished_at"),
1117
- ok: x("ok").notNull(),
1118
- ops_in: x("ops_in").notNull(),
1119
- ops_out: x("ops_out").notNull(),
1120
- error: C("error")
1121
- }, (e) => [b("idx_sync_attempts_peer_started").on(e.peer_device_id, e.started_at)]), wt = S("sync_daemon_state", {
1122
- id: x("id").primaryKey(),
1123
- last_error: C("last_error"),
1124
- last_traceback: C("last_traceback"),
1125
- last_error_at: C("last_error_at"),
1126
- last_ok_at: C("last_ok_at"),
1127
- phase: C("phase")
1128
- }), Tt = S("sync_reset_state", {
1129
- id: x("id").primaryKey(),
1130
- generation: x("generation").notNull(),
1131
- snapshot_id: C("snapshot_id").notNull(),
1132
- baseline_cursor: C("baseline_cursor"),
1133
- retained_floor_cursor: C("retained_floor_cursor"),
1134
- updated_at: C("updated_at").notNull()
1135
- }), Et = S("sync_retention_state", {
1136
- id: x("id").primaryKey(),
1137
- last_run_at: C("last_run_at"),
1138
- last_duration_ms: x("last_duration_ms"),
1139
- last_deleted_ops: x("last_deleted_ops").notNull().default(0),
1140
- last_estimated_bytes_before: x("last_estimated_bytes_before"),
1141
- last_estimated_bytes_after: x("last_estimated_bytes_after"),
1142
- retained_floor_cursor: C("retained_floor_cursor"),
1143
- last_error: C("last_error"),
1144
- last_error_at: C("last_error_at")
1145
- }), z = S("raw_event_ingest_samples", {
1146
- id: x("id").primaryKey({ autoIncrement: !0 }),
1147
- created_at: C("created_at").notNull(),
1148
- inserted_events: x("inserted_events").notNull().default(0),
1149
- skipped_invalid: x("skipped_invalid").notNull().default(0),
1150
- skipped_duplicate: x("skipped_duplicate").notNull().default(0),
1151
- skipped_conflict: x("skipped_conflict").notNull().default(0)
1152
- }), Dt = S("raw_event_ingest_stats", {
1153
- id: x("id").primaryKey(),
1154
- inserted_events: x("inserted_events").notNull().default(0),
1155
- skipped_events: x("skipped_events").notNull().default(0),
1156
- skipped_invalid: x("skipped_invalid").notNull().default(0),
1157
- skipped_duplicate: x("skipped_duplicate").notNull().default(0),
1158
- skipped_conflict: x("skipped_conflict").notNull().default(0),
1159
- updated_at: C("updated_at").notNull()
1160
- }), Ot = S("actors", {
1161
- actor_id: C("actor_id").primaryKey(),
1162
- display_name: C("display_name").notNull(),
1163
- is_local: x("is_local").notNull().default(0),
1164
- status: C("status").notNull().default("active"),
1165
- merged_into_actor_id: C("merged_into_actor_id"),
1166
- created_at: C("created_at").notNull(),
1167
- updated_at: C("updated_at").notNull()
1168
- }, (e) => ({
1169
- isLocalIdx: b("idx_actors_is_local").on(e.is_local),
1170
- statusIdx: b("idx_actors_status").on(e.status)
1171
- })), kt = {
1172
- sessions: I,
1173
- artifacts: dt,
1174
- memoryItems: ft,
1175
- usageEvents: pt,
1176
- rawEvents: mt,
1177
- rawEventSessions: ht,
1178
- opencodeSessions: gt,
1179
- rawEventFlushBatches: _t,
1180
- userPrompts: vt,
1181
- sessionSummaries: yt,
1182
- replicationOps: bt,
1183
- replicationCursors: xt,
1184
- syncPeers: St,
1185
- syncNonces: L,
1186
- syncDevice: R,
1187
- syncAttempts: Ct,
1188
- syncDaemonState: wt,
1189
- syncResetState: Tt,
1190
- rawEventIngestSamples: z,
1191
- rawEventIngestStats: Dt,
1192
- actors: Ot
1193
- };
1194
- //#endregion
1195
- //#region src/observer-config.ts
1196
- function At(e) {
1197
- let t = [], n = !1, r = !1;
1198
- for (let i = 0; i < e.length; i++) {
1199
- let a = e.charAt(i);
1200
- if (r) {
1201
- t.push(a), r = !1;
1202
- continue;
1203
- }
1204
- if (a === "\\" && n) {
1205
- t.push(a), r = !0;
1206
- continue;
1207
- }
1208
- if (a === "\"") {
1209
- n = !n, t.push(a);
1210
- continue;
1211
- }
1212
- if (!n && a === "/" && i + 1 < e.length) {
1213
- let t = e.charAt(i + 1);
1214
- if (t === "/") {
1215
- let t = i + 2;
1216
- for (; t < e.length && e.charAt(t) !== "\n";) t++;
1217
- i = t - 1;
1218
- continue;
1219
- }
1220
- if (t === "*") {
1221
- let t = i + 2;
1222
- for (; t < e.length - 1;) {
1223
- if (e.charAt(t) === "*" && e.charAt(t + 1) === "/") {
1224
- t += 2;
1225
- break;
1226
- }
1227
- t++;
1228
- }
1229
- i = t - 1;
1230
- continue;
1231
- }
1232
- }
1233
- t.push(a);
1234
- }
1235
- return t.join("");
1236
- }
1237
- function jt(e) {
1238
- let t = [], n = !1, r = !1;
1239
- for (let i = 0; i < e.length; i++) {
1240
- let a = e.charAt(i);
1241
- if (r) {
1242
- t.push(a), r = !1;
1243
- continue;
1244
- }
1245
- if (a === "\\" && n) {
1246
- t.push(a), r = !0;
1247
- continue;
1248
- }
1249
- if (a === "\"") {
1250
- n = !n, t.push(a);
1251
- continue;
1252
- }
1253
- if (!n && a === ",") {
1254
- let t = i + 1;
1255
- for (; t < e.length && /\s/.test(e.charAt(t));) t++;
1256
- if (t < e.length && (e.charAt(t) === "]" || e.charAt(t) === "}")) continue;
1257
- }
1258
- t.push(a);
1259
- }
1260
- return t.join("");
1261
- }
1262
- function B() {
1263
- let e = _(h(), ".config", "opencode"), t = [_(e, "opencode.json"), _(e, "opencode.jsonc")].find((e) => l(e));
1264
- if (!t) return {};
1265
- let n;
1266
- try {
1267
- n = d(t, "utf-8");
1268
- } catch {
1269
- return {};
1270
- }
1271
- try {
1272
- return JSON.parse(n);
1273
- } catch {}
1274
- try {
1275
- let e = jt(At(n));
1276
- return JSON.parse(e);
1277
- } catch {
1278
- return {};
1279
- }
1280
- }
1281
- function V(e) {
1282
- return e.startsWith("~/") ? _(h(), e.slice(2)) : e;
1283
- }
1284
- var Mt = {
1285
- actor_id: "CODEMEM_ACTOR_ID",
1286
- actor_display_name: "CODEMEM_ACTOR_DISPLAY_NAME",
1287
- claude_command: "CODEMEM_CLAUDE_COMMAND",
1288
- observer_provider: "CODEMEM_OBSERVER_PROVIDER",
1289
- observer_model: "CODEMEM_OBSERVER_MODEL",
1290
- observer_base_url: "CODEMEM_OBSERVER_BASE_URL",
1291
- observer_runtime: "CODEMEM_OBSERVER_RUNTIME",
1292
- observer_auth_source: "CODEMEM_OBSERVER_AUTH_SOURCE",
1293
- observer_auth_file: "CODEMEM_OBSERVER_AUTH_FILE",
1294
- observer_auth_command: "CODEMEM_OBSERVER_AUTH_COMMAND",
1295
- observer_auth_timeout_ms: "CODEMEM_OBSERVER_AUTH_TIMEOUT_MS",
1296
- observer_auth_cache_ttl_s: "CODEMEM_OBSERVER_AUTH_CACHE_TTL_S",
1297
- observer_headers: "CODEMEM_OBSERVER_HEADERS",
1298
- observer_max_chars: "CODEMEM_OBSERVER_MAX_CHARS",
1299
- pack_observation_limit: "CODEMEM_PACK_OBSERVATION_LIMIT",
1300
- pack_session_limit: "CODEMEM_PACK_SESSION_LIMIT",
1301
- sync_enabled: "CODEMEM_SYNC_ENABLED",
1302
- sync_host: "CODEMEM_SYNC_HOST",
1303
- sync_port: "CODEMEM_SYNC_PORT",
1304
- sync_interval_s: "CODEMEM_SYNC_INTERVAL_S",
1305
- sync_mdns: "CODEMEM_SYNC_MDNS",
1306
- sync_advertise: "CODEMEM_SYNC_ADVERTISE",
1307
- sync_coordinator_url: "CODEMEM_SYNC_COORDINATOR_URL",
1308
- sync_coordinator_group: "CODEMEM_SYNC_COORDINATOR_GROUP",
1309
- sync_coordinator_groups: "CODEMEM_SYNC_COORDINATOR_GROUPS",
1310
- sync_coordinator_timeout_s: "CODEMEM_SYNC_COORDINATOR_TIMEOUT_S",
1311
- sync_coordinator_presence_ttl_s: "CODEMEM_SYNC_COORDINATOR_PRESENCE_TTL_S",
1312
- sync_coordinator_admin_secret: "CODEMEM_SYNC_COORDINATOR_ADMIN_SECRET",
1313
- sync_retention_enabled: "CODEMEM_SYNC_RETENTION_ENABLED",
1314
- sync_retention_max_age_days: "CODEMEM_SYNC_RETENTION_MAX_AGE_DAYS",
1315
- sync_retention_max_size_mb: "CODEMEM_SYNC_RETENTION_MAX_SIZE_MB",
1316
- sync_retention_interval_s: "CODEMEM_SYNC_RETENTION_INTERVAL_S",
1317
- sync_retention_max_runtime_ms: "CODEMEM_SYNC_RETENTION_MAX_RUNTIME_MS",
1318
- sync_retention_max_ops_per_pass: "CODEMEM_SYNC_RETENTION_MAX_OPS_PER_PASS",
1319
- sync_projects_include: "CODEMEM_SYNC_PROJECTS_INCLUDE",
1320
- sync_projects_exclude: "CODEMEM_SYNC_PROJECTS_EXCLUDE",
1321
- raw_events_sweeper_interval_s: "CODEMEM_RAW_EVENTS_SWEEPER_INTERVAL_S"
1322
- };
1323
- function Nt() {
1324
- let e = process.env.CODEMEM_CONFIG?.trim();
1325
- if (e) return V(e);
1326
- let t = _(h(), ".config", "codemem");
1327
- return [_(t, "config.json"), _(t, "config.jsonc")].find((e) => l(e)) ?? _(t, "config.json");
1328
- }
1329
- function Pt() {
1330
- let e = Nt();
1331
- if (!l(e)) return {};
1332
- let t;
1333
- try {
1334
- t = d(e, "utf-8");
1335
- } catch {
1336
- return {};
1337
- }
1338
- if (!t.trim()) return {};
1339
- try {
1340
- let e = JSON.parse(t);
1341
- return typeof e == "object" && e && !Array.isArray(e) ? e : {};
1342
- } catch {}
1343
- try {
1344
- let e = jt(At(t)), n = JSON.parse(e);
1345
- return typeof n == "object" && n && !Array.isArray(n) ? n : {};
1346
- } catch {
1347
- return {};
1348
- }
1349
- }
1350
- function Ft(e, t) {
1351
- let n = t ? V(t) : Nt();
1352
- return u(g(n), { recursive: !0 }), m(n, `${JSON.stringify(e, null, 2)}\n`, "utf8"), n;
1353
- }
1354
- function It() {
1355
- let e = {};
1356
- for (let [t, n] of Object.entries(Mt)) {
1357
- let r = process.env[n];
1358
- r != null && r !== "" && (e[t] = n);
1359
- }
1360
- return e;
1361
- }
1362
- function H(e) {
1363
- return typeof e == "object" && e && !Array.isArray(e) ? e : null;
1364
- }
1365
- function Lt(e) {
1366
- let t = H(B().provider);
1367
- return t ? H(t[e]) ?? {} : {};
1368
- }
1369
- function Rt() {
1370
- let e = H(B().provider);
1371
- return e ? new Set(Object.keys(e)) : /* @__PURE__ */ new Set();
1372
- }
1373
- var zt = new Set([
1374
- "openai",
1375
- "anthropic",
1376
- "opencode"
1377
- ]);
1378
- function Bt(e) {
1379
- return typeof e != "string" || !e.includes("/") ? null : e.split("/")[0]?.trim().toLowerCase() || null;
1380
- }
1381
- function Vt() {
1382
- let e = Rt(), t = B();
1383
- for (let n of ["model", "small_model"]) {
1384
- let r = Bt(t[n]);
1385
- r && e.add(r);
1386
- }
1387
- return e;
1388
- }
1389
- function Ht() {
1390
- let e = Vt();
1391
- for (let t of zt) e.add(t);
1392
- return Array.from(e).sort((e, t) => e.localeCompare(t));
1393
- }
1394
- function Ut(e) {
1395
- let t = Bt(e);
1396
- return t && zt.has(t) ? t : null;
1397
- }
1398
- function Wt(e) {
1399
- return e === "openai" ? "gpt-5.1-codex-mini" : e === "anthropic" ? "claude-sonnet-4-20250514" : e === "opencode" ? "opencode/gpt-5.1-codex-mini" : null;
1400
- }
1401
- function Gt(e, t) {
1402
- if (e !== "opencode") return [
1403
- null,
1404
- t || Wt(e),
1405
- {}
1406
- ];
1407
- let n = t || Wt(e) || "", r = `${e}/`;
1408
- return [
1409
- "https://opencode.ai/zen/v1",
1410
- (n.startsWith(r) ? n.slice(r.length) : n) || null,
1411
- {}
1412
- ];
1413
- }
1414
- function Kt(e, t) {
1415
- if (!e || !e.includes("/")) return null;
1416
- let n = e.split("/")[0] ?? "";
1417
- return n && t.has(n) ? n : null;
1418
- }
1419
- function qt(e) {
1420
- return Yt(Jt(e));
1421
- }
1422
- function Jt(e) {
1423
- return e.replace(/\$\{([^}]+)\}|\$([A-Za-z_][A-Za-z0-9_]*)/g, (e, t, n) => {
1424
- let r = t ?? n;
1425
- return process.env[r] ?? e;
1426
- });
1427
- }
1428
- function Yt(e) {
1429
- return e.includes("{file:") ? e.replace(/\{file:([^}]+)\}/g, (e, t) => {
1430
- let n = t.trim();
1431
- if (!n) return e;
1432
- let r = Jt(n).replace(/^~/, h());
1433
- try {
1434
- return d(r, "utf-8").trim();
1435
- } catch {
1436
- return e;
1437
- }
1438
- }) : e;
1439
- }
1440
- function U(e) {
1441
- return H(e.options) ?? {};
1442
- }
1443
- function Xt(e) {
1444
- let t = U(e), n = t.baseURL || t.baseUrl || t.base_url || e.base_url;
1445
- return typeof n == "string" && n ? n : null;
1446
- }
1447
- function Zt(e) {
1448
- let t = H(U(e).headers);
1449
- if (!t) return {};
1450
- let n = {};
1451
- for (let [e, r] of Object.entries(t)) typeof e != "string" || typeof r != "string" || (n[e] = qt(r));
1452
- return n;
1453
- }
1454
- function Qt(e) {
1455
- let t = U(e), n = t.apiKey || e.apiKey;
1456
- if (typeof n == "string" && n) return qt(n);
1457
- let r = t.apiKeyEnv ?? t.api_key_env;
1458
- if (typeof r == "string" && r) {
1459
- let e = process.env[r];
1460
- if (e) return e;
1461
- }
1462
- return null;
1463
- }
1464
- function $t(e) {
1465
- let t = Lt(e), n = U(t), r = n.defaultModel ?? n.default_model ?? t.defaultModel ?? t.default_model;
1466
- if (typeof r == "string" && r) return r.startsWith(`${e}/`) ? r : `${e}/${r}`;
1467
- let i = H(t.models);
1468
- if (i) {
1469
- let t = Object.keys(i)[0];
1470
- if (typeof t == "string" && t) return `${e}/${t}`;
1471
- }
1472
- return null;
1473
- }
1474
- function en(e, t) {
1475
- let n = Lt(e), r = Xt(n), i = Zt(n), a = t;
1476
- a ||= $t(e) ?? "";
1477
- let o = `${e}/`, s = a.startsWith(o) ? a.slice(o.length) : a, c = H(n.models), l = s;
1478
- if (c) {
1479
- let e = H(c[s]);
1480
- e && typeof e.id == "string" && (l = e.id);
1481
- }
1482
- return (typeof l != "string" || !l) && (l = null), [
1483
- r,
1484
- l,
1485
- i
1486
- ];
1487
- }
1488
- //#endregion
1489
- //#region src/db.ts
1490
- var tn = 6, nn = 6, rn = [
1491
- "memory_items",
1492
- "sessions",
1493
- "artifacts",
1494
- "raw_events",
1495
- "raw_event_sessions",
1496
- "usage_events"
1497
- ], W = _(h(), ".codemem", "mem.sqlite");
1498
- function an(e) {
1499
- if (e) return V(e);
1500
- let t = process.env.CODEMEM_DB;
1501
- return t ? V(t) : W;
1502
- }
1503
- var on = [_(h(), ".codemem.sqlite"), _(h(), ".opencode-mem.sqlite")], sn = ["-wal", "-shm"];
1504
- function cn(e, t) {
1505
- u(g(t), { recursive: !0 });
1506
- let n = [[e, t], ...sn.map((n) => [e + n, t + n])];
1507
- for (let [e, t] of n) if (l(e)) try {
1508
- f(e, t);
1509
- } catch {
1510
- try {
1511
- c(e, t);
1512
- try {
1513
- p(e);
1514
- } catch {}
1515
- } catch (e) {
1516
- if (l(t)) continue;
1517
- throw e;
1518
- }
1519
- }
1520
- }
1521
- function ln(e) {
1522
- if (e === W && !l(e)) {
1523
- for (let t of on) if (l(t)) {
1524
- cn(t, e);
1525
- return;
1526
- }
1527
- }
1528
- }
1529
- function un(e = W) {
1530
- ln(e), u(g(e), { recursive: !0 });
1531
- let t = new v(e);
1532
- t.pragma("foreign_keys = ON"), t.pragma("busy_timeout = 5000");
1533
- let n = t.pragma("journal_mode = WAL", { simple: !0 });
1534
- return n.toLowerCase() !== "wal" && console.warn(`Failed to enable WAL mode (got ${n}). Concurrent access may not work correctly.`), t.pragma("synchronous = NORMAL"), t;
1535
- }
1536
- function dn(e) {
1537
- try {
1538
- return !!e.prepare("SELECT 1 FROM sqlite_stat1 LIMIT 1").pluck().get();
1539
- } catch {
1540
- return !1;
1541
- }
1542
- }
1543
- function fn(e) {
1544
- e.pragma("optimize"), !dn(e) && (!G(e, "memory_items") || !G(e, "memory_fts") || (e.exec("ANALYZE"), e.pragma("optimize")));
1545
- }
1546
- function pn(e) {
1547
- if (!mn() && (ae.load(e), !e.prepare("SELECT vec_version() AS v").get()?.v)) throw Error("sqlite-vec loaded but version check failed");
1548
- }
1549
- function mn() {
1550
- let e = process.env.CODEMEM_EMBEDDING_DISABLED?.toLowerCase();
1551
- return e === "1" || e === "true" || e === "yes";
1552
- }
1553
- function hn(e) {
1554
- let t = e.pragma("user_version", { simple: !0 });
1555
- return typeof t == "number" ? t : 0;
1556
- }
1557
- function gn(e) {
1558
- let t = hn(e);
1559
- if (t === 0) throw Error("Database schema is not initialized. Initialize the SQLite database with the current TypeScript runtime before retrying.");
1560
- if (t < 6) throw Error(`Database schema version ${t} is older than minimum compatible (6). Upgrade the database schema with the current TypeScript runtime before retrying.`);
1561
- t > 6 && console.warn(`Database schema version ${t} is newer than this TS runtime (6). Running in compatibility mode — additive schema changes are tolerated.`);
1562
- let n = rn.filter((t) => !G(e, t));
1563
- if (n.length > 0) throw Error(`Required tables missing: ${n.join(", ")}. The database may be corrupt or from an incompatible version.`);
1564
- if (!G(e, "memory_fts")) throw Error("FTS5 index (memory_fts) is missing. Rebuild the database schema with the current TypeScript runtime before retrying.");
1565
- }
1566
- function G(e, t) {
1567
- return e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?").get(t) !== void 0;
1568
- }
1569
- function _n(e, t, n) {
1570
- return G(e, t) ? e.prepare("SELECT 1 FROM pragma_table_info(?) WHERE name = ? LIMIT 1").get(t, n) !== void 0 : !1;
1571
- }
1572
- function vn(e) {
1573
- try {
1574
- e.exec("\n CREATE TABLE IF NOT EXISTS sync_reset_state (\n id INTEGER PRIMARY KEY,\n generation INTEGER NOT NULL,\n snapshot_id TEXT NOT NULL,\n baseline_cursor TEXT,\n retained_floor_cursor TEXT,\n updated_at TEXT NOT NULL\n )\n ");
1575
- } catch {}
1576
- if (G(e, "sync_daemon_state") && !_n(e, "sync_daemon_state", "phase")) try {
1577
- e.exec("ALTER TABLE sync_daemon_state ADD COLUMN phase TEXT");
1578
- } catch {}
1579
- if (G(e, "raw_event_flush_batches")) {
1580
- for (let { name: t, ddl: n } of [
1581
- {
1582
- name: "error_message",
1583
- ddl: "TEXT"
1584
- },
1585
- {
1586
- name: "error_type",
1587
- ddl: "TEXT"
1588
- },
1589
- {
1590
- name: "observer_provider",
1591
- ddl: "TEXT"
1592
- },
1593
- {
1594
- name: "observer_model",
1595
- ddl: "TEXT"
1596
- },
1597
- {
1598
- name: "observer_runtime",
1599
- ddl: "TEXT"
1600
- },
1601
- {
1602
- name: "observer_auth_source",
1603
- ddl: "TEXT"
1604
- },
1605
- {
1606
- name: "observer_auth_type",
1607
- ddl: "TEXT"
1608
- },
1609
- {
1610
- name: "observer_error_code",
1611
- ddl: "TEXT"
1612
- },
1613
- {
1614
- name: "observer_error_message",
1615
- ddl: "TEXT"
1616
- },
1617
- {
1618
- name: "attempt_count",
1619
- ddl: "INTEGER NOT NULL DEFAULT 0"
1620
- }
1621
- ]) if (!_n(e, "raw_event_flush_batches", t)) try {
1622
- e.exec(`ALTER TABLE raw_event_flush_batches ADD COLUMN ${t} ${n}`);
1623
- } catch (n) {
1624
- if ((n instanceof Error ? n.message.toLowerCase() : "").includes("duplicate column name") && _n(e, "raw_event_flush_batches", t)) continue;
1625
- throw n;
1626
- }
1627
- }
1628
- }
1629
- function yn(e) {
1630
- if (!e) return {};
1631
- try {
1632
- let t = JSON.parse(e);
1633
- return typeof t != "object" || !t || Array.isArray(t) ? {} : t;
1634
- } catch {
1635
- return console.warn(`[codemem] fromJson: invalid JSON (${e.slice(0, 80)}...)`), {};
1636
- }
1637
- }
1638
- function bn(e) {
1639
- if (!e) return {};
1640
- let t = JSON.parse(e);
1641
- if (typeof t != "object" || !t || Array.isArray(t)) throw Error(`fromJsonStrict: expected object, got ${Array.isArray(t) ? "array" : typeof t}`);
1642
- return t;
1643
- }
1644
- function xn(e) {
1645
- return e == null ? "{}" : JSON.stringify(e);
1646
- }
1647
- function Sn(e) {
1648
- return e == null || typeof e == "object" && !Array.isArray(e) && Object.keys(e).length === 0 ? null : JSON.stringify(e);
1649
- }
1650
- //#endregion
1651
- //#region src/sync-identity.ts
1652
- var Cn = _(h(), ".config", "codemem", "keys"), wn = "device.key", Tn = "device.key.pub", K = "codemem-sync";
1653
- function En(t) {
1654
- return e("sha256").update(t, "utf-8").digest("hex");
1655
- }
1656
- function q() {
1657
- return process.env.CODEMEM_SYNC_KEY_STORE?.toLowerCase() === "keychain" ? "keychain" : "file";
1658
- }
1659
- function J(e) {
1660
- try {
1661
- return w("which", [e], { stdio: "pipe" }), !0;
1662
- } catch {
1663
- return !1;
1664
- }
1665
- }
1666
- function Dn() {
1667
- process.platform === "darwin" && q() === "keychain" && process.env.CODEMEM_SYNC_KEYCHAIN_WARN !== "0" && console.warn("[codemem] keychain storage on macOS uses the `security` CLI and may expose the key in process arguments.");
1668
- }
1669
- function On(e, t) {
1670
- if (process.platform === "linux") {
1671
- if (!J("secret-tool")) return !1;
1672
- try {
1673
- return w("secret-tool", [
1674
- "store",
1675
- "--label",
1676
- "codemem sync key",
1677
- "service",
1678
- K,
1679
- "account",
1680
- t
1681
- ], {
1682
- input: e,
1683
- stdio: [
1684
- "pipe",
1685
- "pipe",
1686
- "pipe"
1687
- ]
1688
- }), !0;
1689
- } catch {
1690
- return !1;
1691
- }
1692
- }
1693
- if (process.platform === "darwin") {
1694
- if (!J("security")) return !1;
1695
- try {
1696
- return w("security", [
1697
- "add-generic-password",
1698
- "-a",
1699
- t,
1700
- "-s",
1701
- K,
1702
- "-w",
1703
- e.toString("utf-8"),
1704
- "-U"
1705
- ], { stdio: [
1706
- "pipe",
1707
- "pipe",
1708
- "pipe"
1709
- ] }), !0;
1710
- } catch {
1711
- return !1;
1712
- }
1713
- }
1714
- return !1;
1715
- }
1716
- function kn(e) {
1717
- if (process.platform === "linux") {
1718
- if (!J("secret-tool")) return null;
1719
- try {
1720
- let t = w("secret-tool", [
1721
- "lookup",
1722
- "service",
1723
- K,
1724
- "account",
1725
- e
1726
- ], { stdio: [
1727
- "pipe",
1728
- "pipe",
1729
- "pipe"
1730
- ] });
1731
- return Buffer.from(t);
1732
- } catch {
1733
- return null;
1734
- }
1735
- }
1736
- if (process.platform === "darwin") {
1737
- if (!J("security")) return null;
1738
- try {
1739
- let t = w("security", [
1740
- "find-generic-password",
1741
- "-a",
1742
- e,
1743
- "-s",
1744
- K,
1745
- "-w"
1746
- ], { stdio: [
1747
- "pipe",
1748
- "pipe",
1749
- "pipe"
1750
- ] });
1751
- return Buffer.from(t);
1752
- } catch {
1753
- return null;
1754
- }
1755
- }
1756
- return null;
1757
- }
1758
- function Y(e) {
1759
- let t = e ?? Cn;
1760
- return [_(t, wn), _(t, Tn)];
1761
- }
1762
- function An(e) {
1763
- let [, t] = Y(e);
1764
- return l(t) && d(t, "utf-8").trim() || null;
1765
- }
1766
- function jn(e, t) {
1767
- if (q() === "keychain") {
1768
- let e = Mn(t);
1769
- if (e) {
1770
- let t = kn(e);
1771
- if (t) return t;
1772
- }
1773
- }
1774
- let [n] = Y(e);
1775
- return l(n) ? d(n) : null;
1776
- }
1777
- function Mn(e) {
1778
- let t = an(e);
1779
- if (!l(t)) return null;
1780
- let n = un(t);
1781
- try {
1782
- return y(n, { schema: F }).select({ device_id: R.device_id }).from(R).limit(1).get()?.device_id ?? null;
1783
- } finally {
1784
- n.close();
1785
- }
1786
- }
1787
- function Nn(e) {
1788
- let t = e.trim();
1789
- return t.startsWith("ssh-ed25519 ") || t.startsWith("ssh-rsa ") || t.startsWith("ecdsa-");
1790
- }
1791
- function Pn(e, t) {
1792
- l(e) && f(e, e.replace(/([^/]+)$/, `$1.invalid-${t}`));
1793
- }
1794
- function Fn(e, t) {
1795
- if (u(g(e), { recursive: !0 }), l(e) && l(t)) return;
1796
- if (l(e) && !l(t)) {
1797
- try {
1798
- let r = In(n(Ln(e)).export({
1799
- type: "spki",
1800
- format: "der"
1801
- }));
1802
- if (r && Nn(r)) {
1803
- m(t, `${r}\n`, { mode: 420 });
1804
- return;
1805
- }
1806
- } catch {}
1807
- f(e, `${e}.orphan-${(/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "")}`);
1808
- }
1809
- let { publicKey: i, privateKey: a } = r("ed25519");
1810
- m(e, a.export({
1811
- type: "pkcs8",
1812
- format: "pem"
1813
- }), { mode: 384 });
1814
- let o = In(i.export({
1815
- type: "spki",
1816
- format: "der"
1817
- }));
1818
- if (!o) throw Error("failed to convert public key to SSH format");
1819
- m(t, `${o}\n`, { mode: 420 });
1820
- }
1821
- function In(e) {
1822
- if (e.length < 32) return null;
1823
- let t = e.subarray(e.length - 32), n = Buffer.from("ssh-ed25519"), r = Buffer.alloc(4 + n.length + 4 + t.length), i = 0;
1824
- return r.writeUInt32BE(n.length, i), i += 4, n.copy(r, i), i += n.length, r.writeUInt32BE(t.length, i), i += 4, t.copy(r, i), `ssh-ed25519 ${r.toString("base64")}`;
1825
- }
1826
- function Ln(e) {
1827
- let n = d(e);
1828
- try {
1829
- return t(n);
1830
- } catch {
1831
- return t({
1832
- key: n,
1833
- format: "pem",
1834
- type: "pkcs8"
1835
- });
1836
- }
1837
- }
1838
- function Rn(e, t) {
1839
- if (!l(e) || !l(t)) return !1;
1840
- let r = d(t, "utf-8").trim();
1841
- if (!r || !Nn(r)) return !1;
1842
- try {
1843
- let i = In(n(Ln(e)).export({
1844
- type: "spki",
1845
- format: "der"
1846
- }));
1847
- return !i || !Nn(i) ? !1 : (i !== r && m(t, `${i}\n`, "utf-8"), !0);
1848
- } catch {
1849
- return !1;
1850
- }
1851
- }
1852
- function zn(e, t) {
1853
- let [n, r] = Y(t?.keysDir ?? Cn);
1854
- Dn();
1855
- let i = y(e, { schema: F }), o = i.select({
1856
- device_id: R.device_id,
1857
- public_key: R.public_key,
1858
- fingerprint: R.fingerprint
1859
- }).from(R).limit(1).get(), s = o?.device_id ?? "", c = o?.public_key ?? "", u = o?.fingerprint ?? "", f = l(n) && l(r);
1860
- if (f && !Rn(n, r)) {
1861
- let e = (/* @__PURE__ */ new Date()).toISOString().replace(/[-:T.Z]/g, "").slice(0, 20);
1862
- Pn(n, e), Pn(r, e), f = !1;
1863
- }
1864
- f || Fn(n, r);
1865
- let p = d(r, "utf-8").trim();
1866
- if (!p) throw Error("public key missing");
1867
- let m = En(p), h = (/* @__PURE__ */ new Date()).toISOString();
1868
- if (s) {
1869
- if ((c !== p || u !== m) && i.update(R).set({
1870
- public_key: p,
1871
- fingerprint: m
1872
- }).where(ee(R.device_id, s)).run(), q() === "keychain") {
1873
- let e = l(n) ? d(n) : kn(s);
1874
- e && On(e, s);
1875
- }
1876
- return [s, m];
1877
- }
1878
- let g = t?.deviceId ?? a();
1879
- if (i.insert(R).values({
1880
- device_id: g,
1881
- public_key: p,
1882
- fingerprint: m,
1883
- created_at: h
1884
- }).run(), q() === "keychain") {
1885
- let e = l(n) ? d(n) : null;
1886
- e && On(e, g);
1887
- }
1888
- return [g, m];
1889
- }
1890
- //#endregion
1891
- //#region src/sync-auth.ts
1892
- var Bn = "v2", Vn = 300;
1893
- function Hn(t, n, r, i, a) {
1894
- let o = e("sha256").update(a).digest("hex"), s = [
1895
- t.toUpperCase(),
1896
- n,
1897
- r,
1898
- i,
1899
- o
1900
- ].join("\n");
1901
- return Buffer.from(s, "utf-8");
1902
- }
1903
- function Un(e) {
1904
- let n = e.timestamp ?? String(Math.floor(Date.now() / 1e3)), r = e.nonce ?? i(16).toString("hex"), a = new URL(e.url), s = a.pathname || "/";
1905
- a.search && (s = `${s}${a.search}`);
1906
- let c = Hn(e.method, s, n, r, e.bodyBytes), l = jn(e.keysDir);
1907
- if (!l) throw Error("private key missing");
1908
- let u;
1909
- try {
1910
- u = t(l);
1911
- } catch {
1912
- u = t({
1913
- key: l,
1914
- format: "pem",
1915
- type: "pkcs8"
1916
- });
1917
- }
1918
- let d = o(null, c, u).toString("base64");
1919
- return {
1920
- "X-Opencode-Timestamp": n,
1921
- "X-Opencode-Nonce": r,
1922
- "X-Opencode-Signature": `v2:${d}`
1923
- };
1924
- }
1925
- function Wn(e) {
1926
- let t = e.timeWindowS ?? 300;
1927
- if (!/^\d+$/.test(e.timestamp)) return !1;
1928
- let n = Number.parseInt(e.timestamp, 10);
1929
- if (Number.isNaN(n)) return !1;
1930
- let r = Math.floor(Date.now() / 1e3);
1931
- if (Math.abs(r - n) > t) return !1;
1932
- let i = ["v1", "v2"], a = e.signature.indexOf(":");
1933
- if (a < 1) return !1;
1934
- let o = e.signature.slice(0, a);
1935
- if (!i.includes(o)) return !1;
1936
- let c = e.signature.slice(a + 1);
1937
- if (!c) return !1;
1938
- let l;
1939
- try {
1940
- if (l = Buffer.from(c, "base64"), l.toString("base64") !== c) return !1;
1941
- } catch {
1942
- return !1;
1943
- }
1944
- let u = Hn(e.method, e.pathWithQuery, e.timestamp, e.nonce, e.bodyBytes);
1945
- try {
1946
- return s(null, u, Gn(e.publicKey), l);
1947
- } catch {
1948
- return !1;
1949
- }
1950
- }
1951
- function Gn(e) {
1952
- let t = e.trim().split(/\s+/);
1953
- if (t.length < 2 || t[0] !== "ssh-ed25519") throw Error("not an ssh-ed25519 key");
1954
- let r = Buffer.from(t[1], "base64");
1955
- if (r.length < 4) throw Error("truncated wire format");
1956
- let i = 4 + r.readUInt32BE(0);
1957
- if (r.length < i + 4) throw Error("truncated wire format");
1958
- let a = r.readUInt32BE(i), o = i + 4;
1959
- if (r.length < o + a) throw Error("truncated wire format");
1960
- let s = r.subarray(o, o + a);
1961
- if (s.length !== 32) throw Error(`unexpected Ed25519 key length: ${s.length}`);
1962
- let c = Buffer.from("302a300506032b6570032100", "hex");
1963
- return n({
1964
- key: Buffer.concat([c, s]),
1965
- format: "der",
1966
- type: "spki"
1967
- });
1968
- }
1969
- function Kn(e) {
1970
- return {
1971
- "X-Opencode-Device": e.deviceId,
1972
- ...Un({
1973
- method: e.method,
1974
- url: e.url,
1975
- bodyBytes: e.bodyBytes,
1976
- keysDir: e.keysDir,
1977
- timestamp: e.timestamp,
1978
- nonce: e.nonce
1979
- })
1980
- };
1981
- }
1982
- function qn(e, t, n, r) {
1983
- let i = y(e, { schema: F });
1984
- try {
1985
- return i.insert(L).values({
1986
- nonce: n,
1987
- device_id: t,
1988
- created_at: r
1989
- }).run(), !0;
1990
- } catch (e) {
1991
- if (e instanceof Error && e.message.includes("UNIQUE constraint failed")) return !1;
1992
- throw e;
1993
- }
1994
- }
1995
- function Jn(e, t) {
1996
- y(e, { schema: F }).delete(L).where(te(L.created_at, t)).run();
1997
- }
1998
- //#endregion
1999
- //#region src/coordinator-api.ts
2000
- var X = 64 * 1024, Z = "X-Codemem-Coordinator-Admin";
2001
- function Yn() {
2002
- return (process.env.CODEMEM_SYNC_COORDINATOR_ADMIN_SECRET ?? "").trim() || null;
2003
- }
2004
- function Q(e, t) {
2005
- let n = t.adminSecret();
2006
- if (!n) return {
2007
- ok: !1,
2008
- error: "admin_not_configured"
2009
- };
2010
- let r = (e ?? "").trim();
2011
- return r ? r === n ? {
2012
- ok: !0,
2013
- error: "ok"
2014
- } : {
2015
- ok: !1,
2016
- error: "invalid_admin_secret"
2017
- } : {
2018
- ok: !1,
2019
- error: "missing_admin_header"
2020
- };
2021
- }
2022
- function Xn(e) {
2023
- let t = new URL(e);
2024
- return t.search ? `${t.pathname}${t.search}` : t.pathname;
2025
- }
2026
- async function Zn(e, t, n, r) {
2027
- return await e.recordNonce(t, n, r);
2028
- }
2029
- async function Qn(e, t) {
2030
- await e.cleanupNonces(t);
2031
- }
2032
- async function $(e, t, n) {
2033
- let { deviceId: r, signature: i, timestamp: a, nonce: o } = n;
2034
- if (!r || !i || !a || !o) return {
2035
- ok: !1,
2036
- error: "missing_headers",
2037
- enrollment: null
2038
- };
2039
- let s = await e.getEnrollment(n.groupId, r);
2040
- if (!s) return {
2041
- ok: !1,
2042
- error: "unknown_device",
2043
- enrollment: null
2044
- };
2045
- let c;
2046
- try {
2047
- c = Wn({
2048
- method: n.method,
2049
- pathWithQuery: Xn(n.url),
2050
- bodyBytes: n.body,
2051
- timestamp: a,
2052
- nonce: o,
2053
- signature: i,
2054
- publicKey: String(s.public_key),
2055
- deviceId: r
2056
- });
2057
- } catch {
2058
- return {
2059
- ok: !1,
2060
- error: "signature_verification_error",
2061
- enrollment: null
2062
- };
2063
- }
2064
- if (!c) return {
2065
- ok: !1,
2066
- error: "invalid_signature",
2067
- enrollment: null
2068
- };
2069
- let l = t.now();
2070
- return await Zn(e, r, o, l) ? (await Qn(e, (/* @__PURE__ */ new Date(new Date(l).getTime() - 300 * 2 * 1e3)).toISOString()), {
2071
- ok: !0,
2072
- error: "ok",
2073
- enrollment: s
2074
- }) : {
2075
- ok: !1,
2076
- error: "nonce_replay",
2077
- enrollment: null
2078
- };
2079
- }
2080
- function $n(e) {
2081
- let t = e?.runtime ?? {
2082
- adminSecret: Yn,
2083
- now: () => (/* @__PURE__ */ new Date()).toISOString()
2084
- };
2085
- if (!e?.storeFactory) throw Error("createCoordinatorApp requires a storeFactory.");
2086
- let n = e.storeFactory, r = new ot();
2087
- return r.post("/v1/presence", async (e) => {
2088
- let r = Buffer.from(await e.req.arrayBuffer());
2089
- if (r.length > X) return e.json({ error: "body_too_large" }, 413);
2090
- let i;
2091
- try {
2092
- if (i = JSON.parse(r.toString("utf-8")), typeof i != "object" || !i || Array.isArray(i)) return e.json({ error: "invalid_json" }, 400);
2093
- } catch {
2094
- return e.json({ error: "invalid_json" }, 400);
2095
- }
2096
- let a = String(i.group_id ?? "").trim();
2097
- if (!a) return e.json({ error: "group_id_required" }, 400);
2098
- let o = n();
2099
- try {
2100
- let n = await $(o, t, {
2101
- method: e.req.method,
2102
- url: e.req.url,
2103
- groupId: a,
2104
- body: r,
2105
- deviceId: e.req.header("X-Opencode-Device") ?? null,
2106
- signature: e.req.header("X-Opencode-Signature") ?? null,
2107
- timestamp: e.req.header("X-Opencode-Timestamp") ?? null,
2108
- nonce: e.req.header("X-Opencode-Nonce") ?? null
2109
- });
2110
- if (!n.ok || !n.enrollment) return e.json({ error: n.error }, 401);
2111
- if (i.fingerprint && String(i.fingerprint) !== String(n.enrollment.fingerprint)) return e.json({ error: "fingerprint_mismatch" }, 401);
2112
- let s = i.addresses ?? [];
2113
- if (!Array.isArray(s) || !s.every((e) => typeof e == "string")) return e.json({ error: "addresses_must_be_list_of_strings" }, 400);
2114
- let c;
2115
- try {
2116
- if (c = Math.max(1, Number.parseInt(String(i.ttl_s ?? 180), 10)), Number.isNaN(c)) return e.json({ error: "ttl_s_must_be_int" }, 400);
2117
- } catch {
2118
- return e.json({ error: "ttl_s_must_be_int" }, 400);
2119
- }
2120
- let l = await o.upsertPresence({
2121
- groupId: a,
2122
- deviceId: String(n.enrollment.device_id),
2123
- addresses: s,
2124
- ttlS: c,
2125
- capabilities: typeof i.capabilities == "object" && i.capabilities !== null && !Array.isArray(i.capabilities) ? i.capabilities : void 0
2126
- });
2127
- return e.json({
2128
- ok: !0,
2129
- ...l
2130
- });
2131
- } finally {
2132
- await o.close();
2133
- }
2134
- }), r.get("/v1/peers", async (e) => {
2135
- let r = (e.req.query("group_id") ?? "").trim();
2136
- if (!r) return e.json({ error: "group_id_required" }, 400);
2137
- let i = n();
2138
- try {
2139
- let n = await $(i, t, {
2140
- method: e.req.method,
2141
- url: e.req.url,
2142
- groupId: r,
2143
- body: Buffer.alloc(0),
2144
- deviceId: e.req.header("X-Opencode-Device") ?? null,
2145
- signature: e.req.header("X-Opencode-Signature") ?? null,
2146
- timestamp: e.req.header("X-Opencode-Timestamp") ?? null,
2147
- nonce: e.req.header("X-Opencode-Nonce") ?? null
2148
- });
2149
- if (!n.ok || !n.enrollment) return e.json({ error: n.error }, 401);
2150
- let a = await i.listGroupPeers(r, String(n.enrollment.device_id));
2151
- return e.json({ items: a });
2152
- } finally {
2153
- await i.close();
2154
- }
2155
- }), r.get("/v1/reciprocal-approvals", async (e) => {
2156
- let r = (e.req.query("group_id") ?? "").trim(), i = (e.req.query("direction") ?? "incoming").trim(), a = (e.req.query("status") ?? "pending").trim() || "pending";
2157
- if (!r) return e.json({ error: "group_id_required" }, 400);
2158
- if (!["incoming", "outgoing"].includes(i)) return e.json({ error: "direction_must_be_incoming_or_outgoing" }, 400);
2159
- let o = n();
2160
- try {
2161
- let n = await $(o, t, {
2162
- method: e.req.method,
2163
- url: e.req.url,
2164
- groupId: r,
2165
- body: Buffer.alloc(0),
2166
- deviceId: e.req.header("X-Opencode-Device") ?? null,
2167
- signature: e.req.header("X-Opencode-Signature") ?? null,
2168
- timestamp: e.req.header("X-Opencode-Timestamp") ?? null,
2169
- nonce: e.req.header("X-Opencode-Nonce") ?? null
2170
- });
2171
- if (!n.ok || !n.enrollment) return e.json({ error: n.error }, 401);
2172
- let s = await o.listReciprocalApprovals({
2173
- groupId: r,
2174
- deviceId: String(n.enrollment.device_id),
2175
- direction: i,
2176
- status: a
2177
- });
2178
- return e.json({ items: s });
2179
- } finally {
2180
- await o.close();
2181
- }
2182
- }), r.post("/v1/reciprocal-approvals", async (e) => {
2183
- let r = Buffer.from(await e.req.arrayBuffer());
2184
- if (r.length > X) return e.json({ error: "body_too_large" }, 413);
2185
- let i;
2186
- try {
2187
- if (i = JSON.parse(r.toString("utf-8")), typeof i != "object" || !i || Array.isArray(i)) return e.json({ error: "invalid_json" }, 400);
2188
- } catch {
2189
- return e.json({ error: "invalid_json" }, 400);
2190
- }
2191
- let a = String(i.group_id ?? "").trim(), o = String(i.requested_device_id ?? "").trim();
2192
- if (!a || !o) return e.json({ error: "group_id_and_requested_device_id_required" }, 400);
2193
- let s = n();
2194
- try {
2195
- let n = await $(s, t, {
2196
- method: e.req.method,
2197
- url: e.req.url,
2198
- groupId: a,
2199
- body: r,
2200
- deviceId: e.req.header("X-Opencode-Device") ?? null,
2201
- signature: e.req.header("X-Opencode-Signature") ?? null,
2202
- timestamp: e.req.header("X-Opencode-Timestamp") ?? null,
2203
- nonce: e.req.header("X-Opencode-Nonce") ?? null
2204
- });
2205
- if (!n.ok || !n.enrollment) return e.json({ error: n.error }, 401);
2206
- if (o === String(n.enrollment.device_id)) return e.json({ error: "requested_device_must_differ" }, 400);
2207
- if (!await s.getEnrollment(a, o)) return e.json({ error: "requested_device_not_found" }, 404);
2208
- let i = await s.createReciprocalApproval({
2209
- groupId: a,
2210
- requestingDeviceId: String(n.enrollment.device_id),
2211
- requestedDeviceId: o
2212
- });
2213
- return e.json({
2214
- ok: !0,
2215
- request: i
2216
- });
2217
- } finally {
2218
- await s.close();
2219
- }
2220
- }), r.post("/v1/admin/devices", async (e) => {
2221
- let r = Q(e.req.header(Z), t);
2222
- if (!r.ok) return e.json({ error: r.error }, 401);
2223
- let i = Buffer.from(await e.req.arrayBuffer());
2224
- if (i.length > X) return e.json({ error: "body_too_large" }, 413);
2225
- let a;
2226
- try {
2227
- if (a = JSON.parse(i.toString("utf-8")), typeof a != "object" || !a || Array.isArray(a)) return e.json({ error: "invalid_json" }, 400);
2228
- } catch {
2229
- return e.json({ error: "invalid_json" }, 400);
2230
- }
2231
- let o = String(a.group_id ?? "").trim(), s = String(a.device_id ?? "").trim(), c = String(a.fingerprint ?? "").trim(), l = String(a.public_key ?? "").trim(), u = String(a.display_name ?? "").trim() || null;
2232
- if (!o || !s || !c || !l) return e.json({ error: "group_id_device_id_fingerprint_public_key_required" }, 400);
2233
- let d = n();
2234
- try {
2235
- await d.createGroup(o), await d.enrollDevice(o, {
2236
- deviceId: s,
2237
- fingerprint: c,
2238
- publicKey: l,
2239
- displayName: u
2240
- });
2241
- } finally {
2242
- await d.close();
2243
- }
2244
- return e.json({ ok: !0 });
2245
- }), r.get("/v1/admin/devices", async (e) => {
2246
- let r = Q(e.req.header(Z), t);
2247
- if (!r.ok) return e.json({ error: r.error }, 401);
2248
- let i = (e.req.query("group_id") ?? "").trim();
2249
- if (!i) return e.json({ error: "group_id_required" }, 400);
2250
- let a = [
2251
- "1",
2252
- "true",
2253
- "yes"
2254
- ].includes((e.req.query("include_disabled") ?? "0").trim().toLowerCase()), o = n();
2255
- try {
2256
- return e.json({ items: await o.listEnrolledDevices(i, a) });
2257
- } finally {
2258
- await o.close();
2259
- }
2260
- }), r.post("/v1/admin/devices/rename", async (e) => {
2261
- let r = Q(e.req.header(Z), t);
2262
- if (!r.ok) return e.json({ error: r.error }, 401);
2263
- let i = Buffer.from(await e.req.arrayBuffer());
2264
- if (i.length > X) return e.json({ error: "body_too_large" }, 413);
2265
- let a;
2266
- try {
2267
- if (a = JSON.parse(i.toString("utf-8")), typeof a != "object" || !a || Array.isArray(a)) return e.json({ error: "invalid_json" }, 400);
2268
- } catch {
2269
- return e.json({ error: "invalid_json" }, 400);
2270
- }
2271
- let o = String(a.group_id ?? "").trim(), s = String(a.device_id ?? "").trim(), c = String(a.display_name ?? "").trim();
2272
- if (!o || !s) return e.json({ error: "group_id_and_device_id_required" }, 400);
2273
- if (!c) return e.json({ error: "display_name_required" }, 400);
2274
- let l = n();
2275
- try {
2276
- return await l.renameDevice(o, s, c) ? e.json({ ok: !0 }) : e.json({ error: "device_not_found" }, 404);
2277
- } finally {
2278
- await l.close();
2279
- }
2280
- }), r.post("/v1/admin/devices/disable", async (e) => {
2281
- let r = Q(e.req.header(Z), t);
2282
- if (!r.ok) return e.json({ error: r.error }, 401);
2283
- let i = Buffer.from(await e.req.arrayBuffer());
2284
- if (i.length > X) return e.json({ error: "body_too_large" }, 413);
2285
- let a;
2286
- try {
2287
- if (a = JSON.parse(i.toString("utf-8")), typeof a != "object" || !a || Array.isArray(a)) return e.json({ error: "invalid_json" }, 400);
2288
- } catch {
2289
- return e.json({ error: "invalid_json" }, 400);
2290
- }
2291
- let o = String(a.group_id ?? "").trim(), s = String(a.device_id ?? "").trim();
2292
- if (!o || !s) return e.json({ error: "group_id_and_device_id_required" }, 400);
2293
- let c = n();
2294
- try {
2295
- return await c.setDeviceEnabled(o, s, !1) ? e.json({ ok: !0 }) : e.json({ error: "device_not_found" }, 404);
2296
- } finally {
2297
- await c.close();
2298
- }
2299
- }), r.post("/v1/admin/devices/remove", async (e) => {
2300
- let r = Q(e.req.header(Z), t);
2301
- if (!r.ok) return e.json({ error: r.error }, 401);
2302
- let i = Buffer.from(await e.req.arrayBuffer());
2303
- if (i.length > X) return e.json({ error: "body_too_large" }, 413);
2304
- let a;
2305
- try {
2306
- if (a = JSON.parse(i.toString("utf-8")), typeof a != "object" || !a || Array.isArray(a)) return e.json({ error: "invalid_json" }, 400);
2307
- } catch {
2308
- return e.json({ error: "invalid_json" }, 400);
2309
- }
2310
- let o = String(a.group_id ?? "").trim(), s = String(a.device_id ?? "").trim();
2311
- if (!o || !s) return e.json({ error: "group_id_and_device_id_required" }, 400);
2312
- let c = n();
2313
- try {
2314
- return await c.removeDevice(o, s) ? e.json({ ok: !0 }) : e.json({ error: "device_not_found" }, 404);
2315
- } finally {
2316
- await c.close();
2317
- }
2318
- }), r.post("/v1/admin/invites", async (e) => {
2319
- let r = Q(e.req.header(Z), t);
2320
- if (!r.ok) return e.json({ error: r.error }, 401);
2321
- let i = Buffer.from(await e.req.arrayBuffer());
2322
- if (i.length > X) return e.json({ error: "body_too_large" }, 413);
2323
- let a;
2324
- try {
2325
- if (a = JSON.parse(i.toString("utf-8")), typeof a != "object" || !a || Array.isArray(a)) return e.json({ error: "invalid_json" }, 400);
2326
- } catch {
2327
- return e.json({ error: "invalid_json" }, 400);
2328
- }
2329
- let o = String(a.group_id ?? "").trim(), s = String(a.policy ?? "auto_admit").trim(), c = String(a.expires_at ?? "").trim(), l = String(a.created_by ?? "").trim() || null;
2330
- if (!o || !["auto_admit", "approval_required"].includes(s) || !c) return e.json({ error: "group_id_policy_and_expires_at_required" }, 400);
2331
- let u = n();
2332
- try {
2333
- if (!await u.getGroup(o)) return e.json({ error: "group_not_found" }, 404);
2334
- let t = await u.createInvite({
2335
- groupId: o,
2336
- policy: s,
2337
- expiresAt: c,
2338
- createdBy: l
2339
- }), n = {
2340
- v: 1,
2341
- kind: "coordinator_team_invite",
2342
- coordinator_url: String(a.coordinator_url ?? "").trim(),
2343
- group_id: o,
2344
- policy: s,
2345
- token: String(t.token ?? ""),
2346
- expires_at: c,
2347
- team_name: t.team_name_snapshot ?? null
2348
- }, r = st(n), { token: i, ...d } = t;
2349
- return e.json({
2350
- ok: !0,
2351
- invite: d,
2352
- payload: n,
2353
- encoded: r,
2354
- link: lt(r)
2355
- });
2356
- } finally {
2357
- await u.close();
2358
- }
2359
- }), r.get("/v1/admin/invites", async (e) => {
2360
- let r = Q(e.req.header(Z), t);
2361
- if (!r.ok) return e.json({ error: r.error }, 401);
2362
- let i = (e.req.query("group_id") ?? "").trim();
2363
- if (!i) return e.json({ error: "group_id_required" }, 400);
2364
- let a = n();
2365
- try {
2366
- let t = (await a.listInvites(i)).map(({ token: e, ...t }) => t);
2367
- return e.json({ items: t });
2368
- } finally {
2369
- await a.close();
2370
- }
2371
- }), r.post("/v1/admin/join-requests/approve", async (e) => er(e, !0, {
2372
- createStore: n,
2373
- runtime: t
2374
- })), r.post("/v1/admin/join-requests/deny", async (e) => er(e, !1, {
2375
- createStore: n,
2376
- runtime: t
2377
- })), r.get("/v1/admin/join-requests", async (e) => {
2378
- let r = Q(e.req.header(Z), t);
2379
- if (!r.ok) return e.json({ error: r.error }, 401);
2380
- let i = (e.req.query("group_id") ?? "").trim();
2381
- if (!i) return e.json({ error: "group_id_required" }, 400);
2382
- let a = n();
2383
- try {
2384
- return e.json({ items: await a.listJoinRequests(i) });
2385
- } finally {
2386
- await a.close();
2387
- }
2388
- }), r.post("/v1/join", async (e) => {
2389
- let r = Buffer.from(await e.req.arrayBuffer());
2390
- if (r.length > X) return e.json({ error: "body_too_large" }, 413);
2391
- let i;
2392
- try {
2393
- if (i = JSON.parse(r.toString("utf-8")), typeof i != "object" || !i || Array.isArray(i)) return e.json({ error: "invalid_json" }, 400);
2394
- } catch {
2395
- return e.json({ error: "invalid_json" }, 400);
2396
- }
2397
- let a = String(i.token ?? "").trim(), o = String(i.device_id ?? "").trim(), s = String(i.fingerprint ?? "").trim(), c = String(i.public_key ?? "").trim(), l = String(i.display_name ?? "").trim() || null;
2398
- if (!a || !o || !s || !c) return e.json({ error: "token_device_id_fingerprint_public_key_required" }, 400);
2399
- let u = n();
2400
- try {
2401
- let n = await u.getInviteByToken(a);
2402
- if (!n) return e.json({ error: "invalid_token" }, 404);
2403
- if (n.revoked_at) return e.json({ error: "revoked_token" }, 400);
2404
- let r = String(n.expires_at ?? "");
2405
- if (r && new Date(r.replace("Z", "+00:00")) <= new Date(t.now())) return e.json({ error: "expired_token" }, 400);
2406
- let i = String(n.group_id);
2407
- if (await u.getEnrollment(i, o)) return e.json({
2408
- ok: !0,
2409
- status: "already_enrolled",
2410
- group_id: n.group_id,
2411
- policy: n.policy
2412
- });
2413
- let d = String(n.policy);
2414
- if (!["auto_admit", "approval_required"].includes(d)) return e.json({ error: `unknown invite policy: ${d}` }, 400);
2415
- if (d === "approval_required") {
2416
- let t = await u.createJoinRequest({
2417
- groupId: i,
2418
- deviceId: o,
2419
- publicKey: c,
2420
- fingerprint: s,
2421
- displayName: l,
2422
- token: a
2423
- });
2424
- return e.json({
2425
- ok: !0,
2426
- status: "pending",
2427
- group_id: n.group_id,
2428
- policy: n.policy,
2429
- request_id: t.request_id
2430
- });
2431
- }
2432
- return await u.enrollDevice(i, {
2433
- deviceId: o,
2434
- fingerprint: s,
2435
- publicKey: c,
2436
- displayName: l
2437
- }), e.json({
2438
- ok: !0,
2439
- status: "enrolled",
2440
- group_id: n.group_id,
2441
- policy: n.policy
2442
- });
2443
- } finally {
2444
- await u.close();
2445
- }
2446
- }), r;
2447
- }
2448
- async function er(e, t, n) {
2449
- let r = Q(e.req.header(Z), n.runtime);
2450
- if (!r.ok) return e.json({ error: r.error }, 401);
2451
- let i = Buffer.from(await e.req.arrayBuffer());
2452
- if (i.length > X) return e.json({ error: "body_too_large" }, 413);
2453
- let a;
2454
- try {
2455
- if (a = JSON.parse(i.toString("utf-8")), typeof a != "object" || !a || Array.isArray(a)) return e.json({ error: "invalid_json" }, 400);
2456
- } catch {
2457
- return e.json({ error: "invalid_json" }, 400);
2458
- }
2459
- let o = String(a.request_id ?? "").trim(), s = String(a.reviewed_by ?? "").trim() || null;
2460
- if (!o) return e.json({ error: "request_id_required" }, 400);
2461
- let c = n.createStore();
2462
- try {
2463
- let n = await c.reviewJoinRequest({
2464
- requestId: o,
2465
- approved: t,
2466
- reviewedBy: s
2467
- });
2468
- return n ? n._no_transition ? e.json({
2469
- error: "request_not_pending",
2470
- status: n.status
2471
- }, 409) : e.json({
2472
- ok: !0,
2473
- request: n
2474
- }) : e.json({ error: "request_not_found" }, 404);
2475
- } finally {
2476
- await c.close();
2477
- }
2478
- }
2479
- //#endregion
2480
- export { $t as $, pn as A, lt as At, Lt as B, un as C, Tt as Ct, bn as D, ct as Dt, yn as E, vt as Et, Sn as F, Vt as G, Xt as H, Mt as I, B as J, Rt as K, V as L, an as M, G as N, hn as O, st as Ot, xn as P, Gt as Q, Nt as R, gn as S, St, fn as T, pt as Tt, Zt as U, Qt as V, U as W, Wt as X, Pt as Y, Ut as Z, On as _, yt as _t, Hn as a, Ft as at, nn as b, wt as bt, Un as c, ft as ct, En as d, Dt as dt, Kt as et, Fn as f, ht as ft, Y as g, F as gt, An as h, bt as ht, Kn as i, jt as it, ln as j, se as jt, mn as k, ut as kt, Wn as l, _t as lt, kn as m, xt as mt, Vn as n, qt as nt, Jn as o, Ot as ot, jn as p, mt as pt, Ht as q, Bn as r, At as rt, qn as s, dt as st, $n as t, en as tt, zn as u, z as ut, Rn as v, I as vt, vn as w, Et as wt, tn as x, R as xt, W as y, Ct as yt, It as z };
2481
-
2482
- //# sourceMappingURL=coordinator-api-CimbM4rk.js.map