@codemem/core 0.44.0-beta.1 → 0.44.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 (59) hide show
  1. package/dist/automatic-recall.d.ts +45 -0
  2. package/dist/automatic-recall.d.ts.map +1 -0
  3. package/dist/{coordinator-api-BAufmPEa.js → coordinator-api-C2ckGC2b.js} +710 -699
  4. package/dist/coordinator-api-C2ckGC2b.js.map +1 -0
  5. package/dist/coordinator-api.d.ts.map +1 -1
  6. package/dist/db.d.ts.map +1 -1
  7. package/dist/extraction-benchmark-scoring.d.ts +1 -0
  8. package/dist/extraction-benchmark-scoring.d.ts.map +1 -1
  9. package/dist/extraction-replay.d.ts +29 -0
  10. package/dist/extraction-replay.d.ts.map +1 -1
  11. package/dist/index.d.ts +11 -6
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +8964 -7979
  14. package/dist/index.js.map +1 -1
  15. package/dist/ingest-pipeline.d.ts.map +1 -1
  16. package/dist/ingest-prompts.d.ts +3 -1
  17. package/dist/ingest-prompts.d.ts.map +1 -1
  18. package/dist/ingest-xml-parser.d.ts.map +1 -1
  19. package/dist/internal/cloudflare-coordinator.js +316 -316
  20. package/dist/internal/cloudflare-coordinator.js.map +1 -1
  21. package/dist/legacy-team-setup-completion-manifest.d.ts.map +1 -1
  22. package/dist/legacy-team-setup-limits.d.ts +3 -1
  23. package/dist/legacy-team-setup-limits.d.ts.map +1 -1
  24. package/dist/maintenance/ai-structured.d.ts.map +1 -1
  25. package/dist/observer-client.d.ts +10 -0
  26. package/dist/observer-client.d.ts.map +1 -1
  27. package/dist/observer-concepts.d.ts +5 -0
  28. package/dist/observer-concepts.d.ts.map +1 -0
  29. package/dist/observer-config.d.ts.map +1 -1
  30. package/dist/observer-forced-tool.d.ts +34 -0
  31. package/dist/observer-forced-tool.d.ts.map +1 -0
  32. package/dist/observer-output-schema.d.ts +57 -0
  33. package/dist/observer-output-schema.d.ts.map +1 -0
  34. package/dist/observer-output.d.ts +59 -0
  35. package/dist/observer-output.d.ts.map +1 -0
  36. package/dist/pack.d.ts +7 -7
  37. package/dist/pack.d.ts.map +1 -1
  38. package/dist/project-invite-identity.d.ts +1 -0
  39. package/dist/project-invite-identity.d.ts.map +1 -1
  40. package/dist/raw-event-flush.d.ts.map +1 -1
  41. package/dist/ref-queries.d.ts +2 -0
  42. package/dist/ref-queries.d.ts.map +1 -1
  43. package/dist/schema-bootstrap.d.ts.map +1 -1
  44. package/dist/schema.d.ts +76 -0
  45. package/dist/schema.d.ts.map +1 -1
  46. package/dist/search.d.ts +4 -4
  47. package/dist/search.d.ts.map +1 -1
  48. package/dist/store.d.ts +10 -10
  49. package/dist/store.d.ts.map +1 -1
  50. package/dist/summary-memory.d.ts +6 -0
  51. package/dist/summary-memory.d.ts.map +1 -1
  52. package/dist/test-schema.generated.d.ts +1 -1
  53. package/dist/test-schema.generated.d.ts.map +1 -1
  54. package/dist/types.d.ts +16 -0
  55. package/dist/types.d.ts.map +1 -1
  56. package/dist/vectors.d.ts +1 -1
  57. package/dist/vectors.d.ts.map +1 -1
  58. package/package.json +3 -3
  59. package/dist/coordinator-api-BAufmPEa.js.map +0 -1
@@ -1,11 +1,11 @@
1
- import { $ as e, A as t, G as n, H as r, J as i, K as a, M as o, O as s, Q as c, T as l, U as u, V as d, W as f, X as p, Y as m, Z as h, at as g, et as _, it as v, lt as y, n as b, nt as x, ot as S, q as C, rt as w, st as T, t as ee, tt as te, ut as E, z as ne } from "../coordinator-api-BAufmPEa.js";
1
+ import { $ as e, B as t, E as n, F as r, G as i, H as a, I as o, J as s, K as c, L as l, N as u, Q as d, R as f, S as p, U as m, V as h, W as g, X as _, Y as v, Z as y, et as b, it as x, n as ee, q as S, rt as C, t as te, tt as w, w as T, y as E, z as D } from "../coordinator-api-C2ckGC2b.js";
2
2
  //#region src/d1-coordinator-store.ts
3
- function D(e) {
3
+ function O(e) {
4
4
  if (e == null) throw Error("expected row");
5
5
  return e;
6
6
  }
7
- function re(e) {
8
- let { presence_capabilities_json: t, presence_expires_at: n, ...r } = D(e);
7
+ function k(e) {
8
+ let { presence_capabilities_json: t, presence_expires_at: n, ...r } = O(e);
9
9
  if (typeof n != "string" || typeof t != "string") return r;
10
10
  try {
11
11
  let e = JSON.parse(t);
@@ -23,7 +23,7 @@ function re(e) {
23
23
  return r;
24
24
  }
25
25
  }
26
- function ie(e) {
26
+ function A(e) {
27
27
  let t = e.trim();
28
28
  if (!t) return "";
29
29
  let n = t.includes("://") ? t : `http://${t}`;
@@ -34,7 +34,7 @@ function ie(e) {
34
34
  return "";
35
35
  }
36
36
  }
37
- function ae(e) {
37
+ function ne(e) {
38
38
  if (!e) return "";
39
39
  try {
40
40
  let t = new URL(e), n = t.hostname.toLowerCase();
@@ -42,18 +42,18 @@ function ae(e) {
42
42
  } catch {}
43
43
  return e;
44
44
  }
45
- function O(e, t) {
45
+ function j(e, t) {
46
46
  let n = [], r = /* @__PURE__ */ new Set();
47
47
  for (let i of [...e, ...t]) {
48
- let e = ie(i), t = ae(e);
48
+ let e = A(i), t = ne(e);
49
49
  !e || r.has(t) || (r.add(t), n.push(e));
50
50
  }
51
51
  return n;
52
52
  }
53
- function k() {
53
+ function M() {
54
54
  return (/* @__PURE__ */ new Date()).toISOString();
55
55
  }
56
- function A(e, t) {
56
+ function re(e, t) {
57
57
  return e <= t ? {
58
58
  low: e,
59
59
  high: t
@@ -62,22 +62,22 @@ function A(e, t) {
62
62
  high: e
63
63
  };
64
64
  }
65
- function j(e) {
65
+ function ie(e) {
66
66
  return e instanceof Error && /unique|constraint/i.test(e.message);
67
67
  }
68
- function M(e) {
68
+ function N(e) {
69
69
  let t = new Uint8Array(e);
70
70
  globalThis.crypto.getRandomValues(t);
71
71
  let n = [];
72
72
  for (let e of t) n.push("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"[e % 64] ?? "A");
73
73
  return n.join("");
74
74
  }
75
- async function N(e) {
75
+ async function P(e) {
76
76
  let t = await globalThis.crypto.subtle.digest("SHA-256", new TextEncoder().encode(e));
77
77
  return Array.from(new Uint8Array(t), (e) => e.toString(16).padStart(2, "0")).join("");
78
78
  }
79
- var P = "invite_id, group_id, token, policy, expires_at, created_at, created_by,\n team_name_snapshot, revoked_at, operation_id, reviewed_project_set_digest, token_digest,\n inviter_actor_id, inviter_display_name, inviter_device_id, pending_person_id,\n project_summaries_json, project_intent_json, consumed_at, bound_device_id, bound_public_key, bound_fingerprint,\n recipient_actor_id, recipient_display_name, recipient_device_display_name, trust_state,\n bootstrap_grant_id, invite_kind, policy_team_id, target_identity_id, assigned_identity_id,\n reviewed_preview_digest, reviewed_intent_json", F = "group_id, device_id, public_key, fingerprint, identity_id, display_name, enabled, created_at", oe = "enrolled_devices.group_id, enrolled_devices.device_id,\n enrolled_devices.public_key, enrolled_devices.fingerprint, enrolled_devices.identity_id,\n enrolled_devices.display_name, enrolled_devices.enabled, enrolled_devices.created_at,\n presence_records.expires_at AS presence_expires_at,\n presence_records.capabilities_json AS presence_capabilities_json";
80
- function se(e) {
79
+ var F = "invite_id, group_id, token, policy, expires_at, created_at, created_by,\n team_name_snapshot, revoked_at, operation_id, reviewed_project_set_digest, token_digest,\n inviter_actor_id, inviter_display_name, inviter_device_id, pending_person_id,\n project_summaries_json, project_intent_json, consumed_at, bound_device_id, bound_public_key, bound_fingerprint,\n recipient_actor_id, recipient_display_name, recipient_device_display_name, trust_state,\n bootstrap_grant_id, invite_kind, policy_team_id, target_identity_id, assigned_identity_id,\n reviewed_preview_digest, reviewed_intent_json", I = "group_id, device_id, public_key, fingerprint, identity_id, display_name, enabled, created_at", ae = "enrolled_devices.group_id, enrolled_devices.device_id,\n enrolled_devices.public_key, enrolled_devices.fingerprint, enrolled_devices.identity_id,\n enrolled_devices.display_name, enrolled_devices.enabled, enrolled_devices.created_at,\n presence_records.expires_at AS presence_expires_at,\n presence_records.capabilities_json AS presence_capabilities_json";
80
+ function oe(e) {
81
81
  let t = String(e.groupId ?? "").trim(), n = String(e.seedDeviceId ?? "").trim(), r = String(e.workerDeviceId ?? "").trim(), i = String(e.expiresAt ?? "").trim(), a = String(e.createdBy ?? "").trim() || null;
82
82
  if (!t || !n || !r || !i) throw Error("groupId, seedDeviceId, workerDeviceId, and expiresAt are required.");
83
83
  return {
@@ -88,63 +88,63 @@ function se(e) {
88
88
  createdBy: a
89
89
  };
90
90
  }
91
- function I(e) {
91
+ function L(e) {
92
92
  return e?.trim() || null;
93
93
  }
94
- async function ce(e) {
95
- let t = e.inviteKind ?? (I(e.operationId) ? "project_share" : "legacy_enrollment"), n = I(e.policyTeamId), r = I(e.targetIdentityId), i = I(e.reviewedPreviewDigest);
94
+ async function se(e) {
95
+ let t = e.inviteKind ?? (L(e.operationId) ? "project_share" : "legacy_enrollment"), r = L(e.policyTeamId), i = L(e.targetIdentityId), a = L(e.reviewedPreviewDigest);
96
96
  if (![
97
97
  "legacy_enrollment",
98
98
  "project_share",
99
99
  "team_member",
100
100
  "add_device"
101
101
  ].includes(t)) throw Error("inviteKind is invalid.");
102
- if ([n, r].filter((e) => !!e).some((e) => e.length > 256 || /[\p{Cc}\p{Cf}]/u.test(e))) throw Error("recipient invite identifier is invalid.");
103
- if (i && !/^[a-f0-9]{64}$/u.test(i)) throw Error("reviewedPreviewDigest must be a SHA-256 digest.");
102
+ if ([r, i].filter((e) => !!e).some((e) => e.length > 256 || /[\p{Cc}\p{Cf}]/u.test(e))) throw Error("recipient invite identifier is invalid.");
103
+ if (a && !/^[a-f0-9]{64}$/u.test(a)) throw Error("reviewedPreviewDigest must be a SHA-256 digest.");
104
104
  if (t === "project_share") {
105
- if (!I(e.operationId)) throw Error("project_share invite requires operationId.");
106
- if (n || r || i) throw Error("recipient invite metadata requires a recipient invite kind.");
105
+ if (!L(e.operationId)) throw Error("project_share invite requires operationId.");
106
+ if (r || i || a) throw Error("recipient invite metadata requires a recipient invite kind.");
107
107
  } else if (t === "legacy_enrollment") {
108
- if (I(e.operationId)) throw Error("legacy_enrollment invite cannot reference an operation.");
109
- if (n || r || i) throw Error("recipient invite metadata requires a recipient invite kind.");
108
+ if (L(e.operationId)) throw Error("legacy_enrollment invite cannot reference an operation.");
109
+ if (r || i || a) throw Error("recipient invite metadata requires a recipient invite kind.");
110
110
  } else if (t === "team_member") {
111
- if (!n || !i || r || I(e.operationId)) throw Error("team_member invite metadata is invalid.");
112
- } else if (t === "add_device" && (!r || !i || n || I(e.operationId))) throw Error("add_device invite metadata is invalid.");
111
+ if (!r || !a || i || L(e.operationId)) throw Error("team_member invite metadata is invalid.");
112
+ } else if (t === "add_device" && (!i || !a || r || L(e.operationId))) throw Error("add_device invite metadata is invalid.");
113
113
  if (e.reviewedIntent === void 0 || e.reviewedIntent === null) {
114
114
  if (t === "team_member" || t === "add_device") throw Error("recipient_invite_review_unavailable");
115
115
  return {
116
116
  inviteKind: t,
117
- policyTeamId: n,
118
- targetIdentityId: r,
119
- reviewedPreviewDigest: i,
117
+ policyTeamId: r,
118
+ targetIdentityId: i,
119
+ reviewedPreviewDigest: a,
120
120
  reviewedIntentJson: null
121
121
  };
122
122
  }
123
- let a;
124
- if (t === "team_member" && n && i) a = {
123
+ let o;
124
+ if (t === "team_member" && r && a) o = {
125
125
  kind: "team_member",
126
- policyTeamId: n
126
+ policyTeamId: r
127
127
  };
128
- else if (t === "add_device" && r && i) a = {
128
+ else if (t === "add_device" && i && a) o = {
129
129
  kind: "add_device",
130
- targetIdentityId: r
130
+ targetIdentityId: i
131
131
  };
132
132
  else throw Error("recipient invite metadata requires a recipient invite kind.");
133
- return await o(e.reviewedIntent, {
134
- target: a,
135
- digest: i
133
+ return await n(e.reviewedIntent, {
134
+ target: o,
135
+ digest: a
136
136
  }), {
137
137
  inviteKind: t,
138
- policyTeamId: n,
139
- targetIdentityId: r,
140
- reviewedPreviewDigest: i,
141
- reviewedIntentJson: s(e.reviewedIntent, a)
138
+ policyTeamId: r,
139
+ targetIdentityId: i,
140
+ reviewedPreviewDigest: a,
141
+ reviewedIntentJson: p(e.reviewedIntent, o)
142
142
  };
143
143
  }
144
- async function L(e) {
144
+ async function R(e) {
145
145
  if (e.invite_kind === "team_member") {
146
- if (!e.policy_team_id || !d(e.assigned_identity_id) || !e.reviewed_preview_digest) throw Error("invite_invalid");
147
- let n = await t(e.reviewed_intent_json, {
146
+ if (!e.policy_team_id || !r(e.assigned_identity_id) || !e.reviewed_preview_digest) throw Error("invite_invalid");
147
+ let t = await T(e.reviewed_intent_json, {
148
148
  target: {
149
149
  kind: "team_member",
150
150
  policyTeamId: e.policy_team_id
@@ -157,13 +157,13 @@ async function L(e) {
157
157
  policy_team_id: e.policy_team_id,
158
158
  assigned_identity_id: e.assigned_identity_id,
159
159
  reviewed_preview_digest: e.reviewed_preview_digest,
160
- reviewed_intent: n,
160
+ reviewed_intent: t,
161
161
  bound: !!e.consumed_at
162
162
  };
163
163
  }
164
164
  if (e.invite_kind === "add_device") {
165
165
  if (!e.target_identity_id || !e.reviewed_preview_digest) throw Error("invite_invalid");
166
- let n = await t(e.reviewed_intent_json, {
166
+ let t = await T(e.reviewed_intent_json, {
167
167
  target: {
168
168
  kind: "add_device",
169
169
  targetIdentityId: e.target_identity_id
@@ -175,46 +175,46 @@ async function L(e) {
175
175
  invite: e,
176
176
  target_identity_id: e.target_identity_id,
177
177
  reviewed_preview_digest: e.reviewed_preview_digest,
178
- reviewed_intent: n,
178
+ reviewed_intent: t,
179
179
  bound: !!e.consumed_at
180
180
  };
181
181
  }
182
182
  return null;
183
183
  }
184
- function R(e, t = 0) {
184
+ function z(e, t = 0) {
185
185
  if (e == null) return t;
186
186
  if (!Number.isFinite(e) || e < 0) throw Error("membershipEpoch must be non-negative.");
187
187
  return Math.trunc(e);
188
188
  }
189
- function z(e) {
190
- let t = I(e.scopeId), n = I(e.label);
189
+ function ce(e) {
190
+ let t = L(e.scopeId), n = L(e.label);
191
191
  if (!t || !n) throw Error("scopeId and label are required.");
192
192
  return {
193
193
  scopeId: t,
194
194
  label: n,
195
- kind: I(e.kind) ?? "user",
196
- authorityType: I(e.authorityType) ?? "coordinator",
197
- coordinatorId: I(e.coordinatorId),
198
- groupId: I(e.groupId),
199
- manifestIssuerDeviceId: I(e.manifestIssuerDeviceId),
200
- membershipEpoch: R(e.membershipEpoch),
201
- manifestHash: I(e.manifestHash),
202
- status: I(e.status) ?? "active"
195
+ kind: L(e.kind) ?? "user",
196
+ authorityType: L(e.authorityType) ?? "coordinator",
197
+ coordinatorId: L(e.coordinatorId),
198
+ groupId: L(e.groupId),
199
+ manifestIssuerDeviceId: L(e.manifestIssuerDeviceId),
200
+ membershipEpoch: z(e.membershipEpoch),
201
+ manifestHash: L(e.manifestHash),
202
+ status: L(e.status) ?? "active"
203
203
  };
204
204
  }
205
205
  function B(e, t, n) {
206
206
  if (e === void 0) return t;
207
- let r = I(e);
207
+ let r = L(e);
208
208
  if (!r) throw Error(`${n} must not be empty.`);
209
209
  return r;
210
210
  }
211
211
  function V(e, t) {
212
- return e === void 0 ? t : I(e);
212
+ return e === void 0 ? t : L(e);
213
213
  }
214
214
  function H(e, t) {
215
- let n = I(e.scopeId);
215
+ let n = L(e.scopeId);
216
216
  if (!n) throw Error("scopeId is required.");
217
- let r = e.membershipEpoch == null ? null : R(e.membershipEpoch);
217
+ let r = e.membershipEpoch == null ? null : z(e.membershipEpoch);
218
218
  if (r != null && r < t.membership_epoch) throw Error("membershipEpoch must not move backwards.");
219
219
  return {
220
220
  scopeId: n,
@@ -230,27 +230,27 @@ function H(e, t) {
230
230
  };
231
231
  }
232
232
  function U(e, t, n) {
233
- let r = I(e.scopeId), i = I(e.deviceId);
233
+ let r = L(e.scopeId), i = L(e.deviceId);
234
234
  if (!r || !i) throw Error("scopeId and deviceId are required.");
235
- let a = I(e.coordinatorId), o = I(e.groupId);
235
+ let a = L(e.coordinatorId), o = L(e.groupId);
236
236
  if (a && a !== t?.coordinator_id) throw Error("membership coordinatorId must match the scope coordinatorId.");
237
237
  if (o && o !== t?.group_id) throw new f("scope_group_mismatch");
238
- let s = e.membershipEpoch == null ? null : R(e.membershipEpoch), c = t?.membership_epoch ?? 0;
238
+ let s = e.membershipEpoch == null ? null : z(e.membershipEpoch), c = t?.membership_epoch ?? 0;
239
239
  if (s != null && s < c) throw Error("membershipEpoch must not be lower than the scope membershipEpoch.");
240
240
  if (s != null && n && s < (n.status === "revoked" ? n.membership_epoch + 1 : n.membership_epoch)) throw Error("membershipEpoch must not move backwards.");
241
241
  let l = s ?? (n ? Math.max(c, n.membership_epoch + +(n.status === "revoked")) : c);
242
242
  return {
243
243
  scopeId: r,
244
244
  deviceId: i,
245
- role: I(e.role) ?? "member",
245
+ role: L(e.role) ?? "member",
246
246
  membershipEpoch: l,
247
247
  coordinatorId: t?.coordinator_id ?? null,
248
248
  groupId: t?.group_id ?? null,
249
- manifestIssuerDeviceId: I(e.manifestIssuerDeviceId) ?? t?.manifest_issuer_device_id ?? null,
250
- manifestHash: I(e.manifestHash) ?? t?.manifest_hash ?? null,
251
- signedManifestJson: I(e.signedManifestJson),
252
- actorType: I(e.actorType),
253
- actorId: I(e.actorId)
249
+ manifestIssuerDeviceId: L(e.manifestIssuerDeviceId) ?? t?.manifest_issuer_device_id ?? null,
250
+ manifestHash: L(e.manifestHash) ?? t?.manifest_hash ?? null,
251
+ signedManifestJson: L(e.signedManifestJson),
252
+ actorType: L(e.actorType),
253
+ actorId: L(e.actorId)
254
254
  };
255
255
  }
256
256
  function W(e) {
@@ -305,43 +305,43 @@ var $ = class {
305
305
  }
306
306
  async close() {}
307
307
  async createGroup(e, t) {
308
- await this.db.prepare("INSERT OR IGNORE INTO groups(group_id, display_name, archived_at, created_at) VALUES (?, ?, NULL, ?)").bind(e, t ?? null, k()).run();
308
+ await this.db.prepare("INSERT OR IGNORE INTO groups(group_id, display_name, archived_at, created_at) VALUES (?, ?, NULL, ?)").bind(e, t ?? null, M()).run();
309
309
  }
310
310
  async getGroup(e) {
311
311
  let t = await Z(this.db.prepare("SELECT group_id, display_name, archived_at, created_at FROM groups WHERE group_id = ?").bind(e));
312
- return t ? D(t) : null;
312
+ return t ? O(t) : null;
313
313
  }
314
314
  async listGroups(e = !1) {
315
315
  let t = e ? "" : "WHERE archived_at IS NULL";
316
- return (await X(this.db.prepare(`SELECT group_id, display_name, archived_at, created_at FROM groups ${t} ORDER BY created_at ASC`))).map((e) => D(e));
316
+ return (await X(this.db.prepare(`SELECT group_id, display_name, archived_at, created_at FROM groups ${t} ORDER BY created_at ASC`))).map((e) => O(e));
317
317
  }
318
318
  async renameGroup(e, t) {
319
319
  return await Q(this.db.prepare("UPDATE groups SET display_name = ? WHERE group_id = ?").bind(t, e)) > 0;
320
320
  }
321
- async archiveGroup(e, t = k()) {
321
+ async archiveGroup(e, t = M()) {
322
322
  return await Q(this.db.prepare("UPDATE groups SET archived_at = ? WHERE group_id = ? AND archived_at IS NULL").bind(t, e)) > 0;
323
323
  }
324
324
  async unarchiveGroup(e) {
325
325
  return await Q(this.db.prepare("UPDATE groups SET archived_at = NULL WHERE group_id = ? AND archived_at IS NOT NULL").bind(e)) > 0;
326
326
  }
327
327
  async enrollDevice(e, t) {
328
- if (await Q(this.db.prepare("INSERT INTO enrolled_devices(\n group_id, device_id, public_key, fingerprint, identity_id, display_name, enabled, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, 1, ?)\n ON CONFLICT(group_id, device_id) DO UPDATE SET\n public_key = excluded.public_key,\n fingerprint = excluded.fingerprint,\n identity_id = COALESCE(enrolled_devices.identity_id, excluded.identity_id),\n display_name = excluded.display_name,\n enabled = 1\n WHERE excluded.identity_id IS NULL\n OR enrolled_devices.identity_id IS NULL\n OR enrolled_devices.identity_id = excluded.identity_id").bind(e, t.deviceId, t.publicKey, t.fingerprint, t.identityId ?? null, t.displayName ?? null, k())) === 0) throw Error("invite_identity_conflict");
328
+ if (await Q(this.db.prepare("INSERT INTO enrolled_devices(\n group_id, device_id, public_key, fingerprint, identity_id, display_name, enabled, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, 1, ?)\n ON CONFLICT(group_id, device_id) DO UPDATE SET\n public_key = excluded.public_key,\n fingerprint = excluded.fingerprint,\n identity_id = COALESCE(enrolled_devices.identity_id, excluded.identity_id),\n display_name = excluded.display_name,\n enabled = 1\n WHERE excluded.identity_id IS NULL\n OR enrolled_devices.identity_id IS NULL\n OR enrolled_devices.identity_id = excluded.identity_id").bind(e, t.deviceId, t.publicKey, t.fingerprint, t.identityId ?? null, t.displayName ?? null, M())) === 0) throw Error("invite_identity_conflict");
329
329
  }
330
330
  async listEnrolledDevices(e, t) {
331
331
  let n = t ? "" : "AND enrolled_devices.enabled = 1";
332
- return (await X(this.db.prepare(`SELECT ${oe}
332
+ return (await X(this.db.prepare(`SELECT ${ae}
333
333
  FROM enrolled_devices
334
334
  LEFT JOIN presence_records
335
335
  ON presence_records.group_id = enrolled_devices.group_id
336
336
  AND presence_records.device_id = enrolled_devices.device_id
337
337
  WHERE enrolled_devices.group_id = ? ${n}
338
- ORDER BY enrolled_devices.created_at ASC, enrolled_devices.device_id ASC`).bind(e))).map(re);
338
+ ORDER BY enrolled_devices.created_at ASC, enrolled_devices.device_id ASC`).bind(e))).map(k);
339
339
  }
340
340
  async getEnrollment(e, t, n = !1) {
341
- let r = n ? "" : "AND enabled = 1", i = await Z(this.db.prepare(`SELECT ${F}
341
+ let r = n ? "" : "AND enabled = 1", i = await Z(this.db.prepare(`SELECT ${I}
342
342
  FROM enrolled_devices
343
343
  WHERE group_id = ? AND device_id = ? ${r}`).bind(e, t));
344
- return i ? D(i) : null;
344
+ return i ? O(i) : null;
345
345
  }
346
346
  async renameDevice(e, t, n) {
347
347
  return await Q(this.db.prepare("UPDATE enrolled_devices SET display_name = ?\n WHERE group_id = ? AND device_id = ?").bind(n, e, t)) > 0;
@@ -364,28 +364,28 @@ var $ = class {
364
364
  await this.db.prepare("DELETE FROM request_nonces WHERE created_at < ?").bind(e).run();
365
365
  }
366
366
  async createInvite(e) {
367
- let t = k(), n = M(12), i = M(24), a = await N(i), o = r(e.expiresAt), s = await this.getGroup(e.groupId), c = String(e.operationId ?? "").trim() || null, l = String(e.reviewedProjectSetDigest ?? "").trim() || null, u = await ce(e), d = u.inviteKind === "team_member" ? `identity:${M(18)}` : null;
367
+ let t = M(), n = N(12), r = N(24), i = await P(r), a = o(e.expiresAt), s = await this.getGroup(e.groupId), c = String(e.operationId ?? "").trim() || null, l = String(e.reviewedProjectSetDigest ?? "").trim() || null, u = await se(e), d = u.inviteKind === "team_member" ? `identity:${N(18)}` : null;
368
368
  if (!!c != !!l) throw Error("operationId and reviewedProjectSetDigest must be provided together.");
369
369
  let f = async () => {
370
370
  if (!c) return null;
371
- let t = await Z(this.db.prepare(`SELECT ${P} FROM coordinator_invites WHERE operation_id = ?`).bind(c));
371
+ let t = await Z(this.db.prepare(`SELECT ${F} FROM coordinator_invites WHERE operation_id = ?`).bind(c));
372
372
  if (!t) return null;
373
373
  if (t.consumed_at) throw Error("invite_already_bound");
374
374
  if (t.group_id !== e.groupId || t.policy !== e.policy || t.invite_kind !== u.inviteKind || t.reviewed_project_set_digest !== l || t.inviter_actor_id !== (String(e.inviterActorId ?? "").trim() || null) || t.inviter_display_name !== (String(e.inviterDisplayName ?? "").trim() || null) || t.inviter_device_id !== (String(e.inviterDeviceId ?? "").trim() || null) || t.pending_person_id !== (String(e.pendingPersonId ?? "").trim() || null) || t.project_summaries_json !== (e.projectSummaries ? JSON.stringify(e.projectSummaries) : null) || t.project_intent_json !== (e.projectIntent ? JSON.stringify(e.projectIntent) : null) || t.policy_team_id !== u.policyTeamId || t.target_identity_id !== u.targetIdentityId || t.reviewed_preview_digest !== u.reviewedPreviewDigest || t.reviewed_intent_json !== u.reviewedIntentJson) throw Error("invite_operation_intent_conflict");
375
- return D(t);
375
+ return O(t);
376
376
  }, p = async (n) => {
377
377
  if (!n.revoked_at && n.expires_at > t) return n;
378
- await Q(this.db.prepare("UPDATE coordinator_invites\n SET token = ?, token_digest = ?, expires_at = ?, created_at = ?, created_by = ?,\n team_name_snapshot = ?, revoked_at = NULL\n WHERE operation_id = ? AND token = ?\n AND (revoked_at IS NOT NULL OR expires_at <= ?)").bind(i, a, o, t, e.createdBy ?? null, s?.display_name ?? null, c, n.token, t));
379
- let r = await f();
380
- if (!r) throw Error("invite_operation_reissue_failed");
381
- return r;
378
+ await Q(this.db.prepare("UPDATE coordinator_invites\n SET token = ?, token_digest = ?, expires_at = ?, created_at = ?, created_by = ?,\n team_name_snapshot = ?, revoked_at = NULL\n WHERE operation_id = ? AND token = ?\n AND (revoked_at IS NOT NULL OR expires_at <= ?)").bind(r, i, a, t, e.createdBy ?? null, s?.display_name ?? null, c, n.token, t));
379
+ let o = await f();
380
+ if (!o) throw Error("invite_operation_reissue_failed");
381
+ return o;
382
382
  };
383
383
  if (c) {
384
384
  let e = await f();
385
385
  if (e) return await p(e);
386
386
  }
387
387
  try {
388
- await this.db.prepare("INSERT INTO coordinator_invites(\n invite_id, group_id, token, policy, expires_at, created_at, created_by,\n team_name_snapshot, revoked_at, operation_id, reviewed_project_set_digest,\n token_digest, inviter_actor_id, inviter_display_name, inviter_device_id,\n pending_person_id, project_summaries_json, project_intent_json, trust_state,\n invite_kind, policy_team_id, target_identity_id, assigned_identity_id,\n reviewed_preview_digest, reviewed_intent_json\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)").bind(n, e.groupId, i, e.policy, o, t, e.createdBy ?? null, s?.display_name ?? null, c, l, a, String(e.inviterActorId ?? "").trim() || null, String(e.inviterDisplayName ?? "").trim() || null, String(e.inviterDeviceId ?? "").trim() || null, String(e.pendingPersonId ?? "").trim() || null, e.projectSummaries ? JSON.stringify(e.projectSummaries) : null, e.projectIntent ? JSON.stringify(e.projectIntent) : null, c ? "pending" : null, u.inviteKind, u.policyTeamId, u.targetIdentityId, d, u.reviewedPreviewDigest, u.reviewedIntentJson).run();
388
+ await this.db.prepare("INSERT INTO coordinator_invites(\n invite_id, group_id, token, policy, expires_at, created_at, created_by,\n team_name_snapshot, revoked_at, operation_id, reviewed_project_set_digest,\n token_digest, inviter_actor_id, inviter_display_name, inviter_device_id,\n pending_person_id, project_summaries_json, project_intent_json, trust_state,\n invite_kind, policy_team_id, target_identity_id, assigned_identity_id,\n reviewed_preview_digest, reviewed_intent_json\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)").bind(n, e.groupId, r, e.policy, a, t, e.createdBy ?? null, s?.display_name ?? null, c, l, i, String(e.inviterActorId ?? "").trim() || null, String(e.inviterDisplayName ?? "").trim() || null, String(e.inviterDeviceId ?? "").trim() || null, String(e.pendingPersonId ?? "").trim() || null, e.projectSummaries ? JSON.stringify(e.projectSummaries) : null, e.projectIntent ? JSON.stringify(e.projectIntent) : null, c ? "pending" : null, u.inviteKind, u.policyTeamId, u.targetIdentityId, d, u.reviewedPreviewDigest, u.reviewedIntentJson).run();
389
389
  } catch (e) {
390
390
  if (c) {
391
391
  let e = await f();
@@ -393,156 +393,156 @@ var $ = class {
393
393
  }
394
394
  throw e;
395
395
  }
396
- return D(await Z(this.db.prepare(`SELECT ${P} FROM coordinator_invites WHERE invite_id = ?`).bind(n)));
396
+ return O(await Z(this.db.prepare(`SELECT ${F} FROM coordinator_invites WHERE invite_id = ?`).bind(n)));
397
397
  }
398
398
  async getInviteByToken(e) {
399
- let t = await N(e), n = await Z(this.db.prepare(`SELECT ${P}
399
+ let t = await P(e), n = await Z(this.db.prepare(`SELECT ${F}
400
400
  FROM coordinator_invites
401
401
  WHERE (token_digest = ? OR token = ?)
402
402
  AND revoked_at IS NULL
403
- AND expires_at > ?`).bind(t, e, k()));
404
- return n ? D(n) : null;
403
+ AND expires_at > ?`).bind(t, e, M()));
404
+ return n ? O(n) : null;
405
405
  }
406
406
  async getInviteByTokenForInspection(e) {
407
- let t = await N(e), n = await Z(this.db.prepare(`SELECT ${P} FROM coordinator_invites WHERE token_digest = ? OR token = ?`).bind(t, e));
408
- return n ? D(n) : null;
407
+ let t = await P(e), n = await Z(this.db.prepare(`SELECT ${F} FROM coordinator_invites WHERE token_digest = ? OR token = ?`).bind(t, e));
408
+ return n ? O(n) : null;
409
409
  }
410
410
  async inspectRecipientInvite(e) {
411
411
  let t = await this.getInviteByTokenForInspection(e.token);
412
412
  if (!t) return null;
413
- let n = await L(t);
413
+ let n = await R(t);
414
414
  if (!n) return null;
415
415
  if (t.revoked_at) throw Error("invite_invalid");
416
- if (!t.consumed_at && new Date(t.expires_at) <= new Date(r(e.now))) throw Error("invite_expired");
417
- let i = await this.getGroup(t.group_id);
418
- if (!i) throw Error("group_not_found");
419
- if (i.archived_at) throw Error("group_archived");
416
+ if (!t.consumed_at && new Date(t.expires_at) <= new Date(o(e.now))) throw Error("invite_expired");
417
+ let r = await this.getGroup(t.group_id);
418
+ if (!r) throw Error("group_not_found");
419
+ if (r.archived_at) throw Error("group_archived");
420
420
  return n;
421
421
  }
422
422
  async consumeRecipientInvite(e) {
423
- let t = r(e.now), n = e.recipientDisplayName ?? null, i = e.deviceDisplayName ?? null;
423
+ let t = o(e.now), n = e.recipientDisplayName ?? null, r = e.deviceDisplayName ?? null;
424
424
  if (!e.identityId || !e.deviceId || !e.publicKey || !e.fingerprint || e.identityId !== e.identityId.trim() || e.deviceId !== e.deviceId.trim() || e.identityId.length > 256 || e.deviceId.length > 256 || /[\p{Cc}\p{Cf}]/u.test(e.identityId) || /[\p{Cc}\p{Cf}]/u.test(e.deviceId)) throw Error("invite_identity_conflict");
425
- let a = await N(e.token), o = await this.getInviteByTokenForInspection(e.token), s = o ? await L(o) : null;
426
- if (!o || !s || s.kind !== e.inviteKind || o.revoked_at) throw Error("invite_invalid");
427
- let c = await this.getGroup(o.group_id);
425
+ let i = await P(e.token), a = await this.getInviteByTokenForInspection(e.token), s = a ? await R(a) : null;
426
+ if (!a || !s || s.kind !== e.inviteKind || a.revoked_at) throw Error("invite_invalid");
427
+ let c = await this.getGroup(a.group_id);
428
428
  if (!c) throw Error("group_not_found");
429
429
  if (c.archived_at) throw Error("group_archived");
430
- if (!o.consumed_at && new Date(o.expires_at) <= new Date(t)) throw Error("invite_expired");
431
- if (l(e.publicKey) !== e.fingerprint) throw Error("fingerprint_mismatch");
432
- let d = u(s);
433
- if (d !== e.identityId) throw Error("invite_identity_conflict");
434
- let f = o.bound_device_id === e.deviceId && o.bound_public_key === e.publicKey && o.bound_fingerprint === e.fingerprint;
435
- if (o.consumed_at && !f) throw Error("invite_already_bound");
436
- if (o.consumed_at && o.recipient_actor_id !== d) throw Error("invite_identity_conflict");
437
- let p = await Z(this.db.prepare(`SELECT ${F}
438
- FROM enrolled_devices WHERE group_id = ? AND device_id = ?`).bind(o.group_id, e.deviceId));
439
- if (p && (p.public_key !== e.publicKey || p.fingerprint !== e.fingerprint || p.identity_id !== null && p.identity_id !== d)) throw Error("invite_identity_conflict");
440
- let m = 0, h = M(12);
441
- if (!o.consumed_at) {
430
+ if (!a.consumed_at && new Date(a.expires_at) <= new Date(t)) throw Error("invite_expired");
431
+ if (E(e.publicKey) !== e.fingerprint) throw Error("fingerprint_mismatch");
432
+ let u = l(s);
433
+ if (u !== e.identityId) throw Error("invite_identity_conflict");
434
+ let d = a.bound_device_id === e.deviceId && a.bound_public_key === e.publicKey && a.bound_fingerprint === e.fingerprint;
435
+ if (a.consumed_at && !d) throw Error("invite_already_bound");
436
+ if (a.consumed_at && a.recipient_actor_id !== u) throw Error("invite_identity_conflict");
437
+ let f = await Z(this.db.prepare(`SELECT ${I}
438
+ FROM enrolled_devices WHERE group_id = ? AND device_id = ?`).bind(a.group_id, e.deviceId));
439
+ if (f && (f.public_key !== e.publicKey || f.fingerprint !== e.fingerprint || f.identity_id !== null && f.identity_id !== u)) throw Error("invite_identity_conflict");
440
+ let p = 0, m = N(12);
441
+ if (!a.consumed_at) {
442
442
  if (!this.db.batch) throw Error("D1 batch support is required for atomic invite consume.");
443
- m = J((await this.db.batch([
444
- this.db.prepare("UPDATE coordinator_invites SET token = ?, consumed_at = ?, bound_device_id = ?,\n bound_public_key = ?, bound_fingerprint = ?, recipient_actor_id = ?,\n recipient_display_name = ?, recipient_device_display_name = ?\n WHERE (token_digest = ? OR token = ?) AND consumed_at IS NULL\n AND revoked_at IS NULL AND expires_at > ? AND invite_kind = ?\n AND reviewed_intent_json = ? AND reviewed_preview_digest = ?\n AND ((invite_kind = 'team_member' AND assigned_identity_id = ?)\n OR (invite_kind = 'add_device' AND target_identity_id = ?))\n AND NOT EXISTS (\n SELECT 1 FROM enrolled_devices e\n WHERE e.group_id = coordinator_invites.group_id AND e.device_id = ?\n AND (e.public_key <> ? OR e.fingerprint <> ?\n OR (e.identity_id IS NOT NULL AND e.identity_id <> ?))\n )\n AND EXISTS (SELECT 1 FROM groups g WHERE g.group_id = coordinator_invites.group_id\n AND g.archived_at IS NULL)").bind(`consumed:${o.invite_id}`, t, e.deviceId, e.publicKey, e.fingerprint, d, n, i, a, e.token, t, e.inviteKind, o.reviewed_intent_json, o.reviewed_preview_digest, d, d, e.deviceId, e.publicKey, e.fingerprint, d),
445
- this.db.prepare("INSERT INTO enrolled_devices(\n group_id, device_id, public_key, fingerprint, identity_id, display_name, enabled, created_at\n ) SELECT i.group_id, i.bound_device_id, i.bound_public_key, i.bound_fingerprint,\n i.recipient_actor_id, i.recipient_device_display_name, 1, ? FROM coordinator_invites i\n JOIN groups g ON g.group_id = i.group_id AND g.archived_at IS NULL\n WHERE (i.token_digest = ? OR i.token = ?) AND i.bound_device_id = ?\n AND i.bound_public_key = ? AND i.bound_fingerprint = ?\n AND i.recipient_actor_id = ?\n ON CONFLICT(group_id, device_id) DO UPDATE SET\n identity_id = COALESCE(enrolled_devices.identity_id, excluded.identity_id),\n display_name = COALESCE(enrolled_devices.display_name, excluded.display_name),\n enabled = 1\n WHERE enrolled_devices.identity_id IS NULL\n OR enrolled_devices.identity_id = excluded.identity_id").bind(t, a, e.token, e.deviceId, e.publicKey, e.fingerprint, d),
446
- this.db.prepare("UPDATE coordinator_invites SET bootstrap_grant_id = ?,\n trust_state = 'bootstrap_grant_created'\n WHERE (token_digest = ? OR token = ?) AND invite_kind = 'add_device'\n AND bootstrap_grant_id IS NULL AND inviter_device_id IS NOT NULL\n AND expires_at > ?\n AND EXISTS (SELECT 1 FROM enrolled_devices e\n WHERE e.group_id = coordinator_invites.group_id\n AND e.device_id = coordinator_invites.inviter_device_id AND e.enabled = 1)").bind(h, a, e.token, t),
447
- this.db.prepare("INSERT OR IGNORE INTO coordinator_bootstrap_grants(\n grant_id, group_id, seed_device_id, worker_device_id, expires_at,\n created_at, created_by, revoked_at\n ) SELECT i.bootstrap_grant_id, i.group_id, i.inviter_device_id, i.bound_device_id,\n i.expires_at, ?, i.recipient_actor_id, NULL FROM coordinator_invites i\n JOIN enrolled_devices e ON e.group_id = i.group_id\n AND e.device_id = i.inviter_device_id AND e.enabled = 1\n WHERE (i.token_digest = ? OR i.token = ?) AND i.invite_kind = 'add_device'\n AND i.bootstrap_grant_id IS NOT NULL AND i.bound_device_id = ?").bind(t, a, e.token, e.deviceId)
443
+ p = J((await this.db.batch([
444
+ this.db.prepare("UPDATE coordinator_invites SET token = ?, consumed_at = ?, bound_device_id = ?,\n bound_public_key = ?, bound_fingerprint = ?, recipient_actor_id = ?,\n recipient_display_name = ?, recipient_device_display_name = ?\n WHERE (token_digest = ? OR token = ?) AND consumed_at IS NULL\n AND revoked_at IS NULL AND expires_at > ? AND invite_kind = ?\n AND reviewed_intent_json = ? AND reviewed_preview_digest = ?\n AND ((invite_kind = 'team_member' AND assigned_identity_id = ?)\n OR (invite_kind = 'add_device' AND target_identity_id = ?))\n AND NOT EXISTS (\n SELECT 1 FROM enrolled_devices e\n WHERE e.group_id = coordinator_invites.group_id AND e.device_id = ?\n AND (e.public_key <> ? OR e.fingerprint <> ?\n OR (e.identity_id IS NOT NULL AND e.identity_id <> ?))\n )\n AND EXISTS (SELECT 1 FROM groups g WHERE g.group_id = coordinator_invites.group_id\n AND g.archived_at IS NULL)").bind(`consumed:${a.invite_id}`, t, e.deviceId, e.publicKey, e.fingerprint, u, n, r, i, e.token, t, e.inviteKind, a.reviewed_intent_json, a.reviewed_preview_digest, u, u, e.deviceId, e.publicKey, e.fingerprint, u),
445
+ this.db.prepare("INSERT INTO enrolled_devices(\n group_id, device_id, public_key, fingerprint, identity_id, display_name, enabled, created_at\n ) SELECT i.group_id, i.bound_device_id, i.bound_public_key, i.bound_fingerprint,\n i.recipient_actor_id, i.recipient_device_display_name, 1, ? FROM coordinator_invites i\n JOIN groups g ON g.group_id = i.group_id AND g.archived_at IS NULL\n WHERE (i.token_digest = ? OR i.token = ?) AND i.bound_device_id = ?\n AND i.bound_public_key = ? AND i.bound_fingerprint = ?\n AND i.recipient_actor_id = ?\n ON CONFLICT(group_id, device_id) DO UPDATE SET\n identity_id = COALESCE(enrolled_devices.identity_id, excluded.identity_id),\n display_name = COALESCE(enrolled_devices.display_name, excluded.display_name),\n enabled = 1\n WHERE enrolled_devices.identity_id IS NULL\n OR enrolled_devices.identity_id = excluded.identity_id").bind(t, i, e.token, e.deviceId, e.publicKey, e.fingerprint, u),
446
+ this.db.prepare("UPDATE coordinator_invites SET bootstrap_grant_id = ?,\n trust_state = 'bootstrap_grant_created'\n WHERE (token_digest = ? OR token = ?) AND invite_kind = 'add_device'\n AND bootstrap_grant_id IS NULL AND inviter_device_id IS NOT NULL\n AND expires_at > ?\n AND EXISTS (SELECT 1 FROM enrolled_devices e\n WHERE e.group_id = coordinator_invites.group_id\n AND e.device_id = coordinator_invites.inviter_device_id AND e.enabled = 1)").bind(m, i, e.token, t),
447
+ this.db.prepare("INSERT OR IGNORE INTO coordinator_bootstrap_grants(\n grant_id, group_id, seed_device_id, worker_device_id, expires_at,\n created_at, created_by, revoked_at\n ) SELECT i.bootstrap_grant_id, i.group_id, i.inviter_device_id, i.bound_device_id,\n i.expires_at, ?, i.recipient_actor_id, NULL FROM coordinator_invites i\n JOIN enrolled_devices e ON e.group_id = i.group_id\n AND e.device_id = i.inviter_device_id AND e.enabled = 1\n WHERE (i.token_digest = ? OR i.token = ?) AND i.invite_kind = 'add_device'\n AND i.bootstrap_grant_id IS NOT NULL AND i.bound_device_id = ?").bind(t, i, e.token, e.deviceId)
448
448
  ]))[0]);
449
449
  }
450
- let g = await this.getGroup(o.group_id);
451
- if (!g) throw Error("group_not_found");
452
- if (g.archived_at) throw Error("group_archived");
453
- let _ = await Z(this.db.prepare(`SELECT ${F}
454
- FROM enrolled_devices WHERE group_id = ? AND device_id = ?`).bind(o.group_id, e.deviceId));
455
- if (_ && (_.public_key !== e.publicKey || _.fingerprint !== e.fingerprint || _.identity_id !== null && _.identity_id !== d)) throw Error("invite_identity_conflict");
456
- let v = await this.getInviteByTokenForInspection(e.token);
457
- if (!v || v.revoked_at || !v.consumed_at && new Date(v.expires_at) <= new Date(t)) throw Error("invite_invalid");
458
- let y = await L(v);
459
- if (!y || y.kind !== e.inviteKind) throw Error("invite_invalid");
460
- if (u(y) !== d) throw Error("invite_identity_conflict");
461
- if (v.bound_device_id !== e.deviceId || v.bound_public_key !== e.publicKey || v.bound_fingerprint !== e.fingerprint) throw Error("invite_already_bound");
462
- if (v.recipient_actor_id !== d) throw Error("invite_identity_conflict");
463
- await this.db.prepare("UPDATE enrolled_devices SET identity_id = ?\n WHERE group_id = ? AND device_id = ? AND identity_id IS NULL\n AND public_key = ? AND fingerprint = ?").bind(d, v.group_id, e.deviceId, e.publicKey, e.fingerprint).run();
464
- let b = await this.getEnrollment(v.group_id, e.deviceId);
465
- if (!b) throw Error("invite_acceptance_incomplete");
466
- if (b.public_key !== e.publicKey || b.fingerprint !== e.fingerprint || b.identity_id !== d) throw Error("invite_identity_conflict");
467
- let x = v;
468
- if (y.kind === "add_device" && v.inviter_device_id && !v.bootstrap_grant_id && new Date(v.expires_at) > new Date(t)) {
450
+ let h = await this.getGroup(a.group_id);
451
+ if (!h) throw Error("group_not_found");
452
+ if (h.archived_at) throw Error("group_archived");
453
+ let g = await Z(this.db.prepare(`SELECT ${I}
454
+ FROM enrolled_devices WHERE group_id = ? AND device_id = ?`).bind(a.group_id, e.deviceId));
455
+ if (g && (g.public_key !== e.publicKey || g.fingerprint !== e.fingerprint || g.identity_id !== null && g.identity_id !== u)) throw Error("invite_identity_conflict");
456
+ let _ = await this.getInviteByTokenForInspection(e.token);
457
+ if (!_ || _.revoked_at || !_.consumed_at && new Date(_.expires_at) <= new Date(t)) throw Error("invite_invalid");
458
+ let v = await R(_);
459
+ if (!v || v.kind !== e.inviteKind) throw Error("invite_invalid");
460
+ if (l(v) !== u) throw Error("invite_identity_conflict");
461
+ if (_.bound_device_id !== e.deviceId || _.bound_public_key !== e.publicKey || _.bound_fingerprint !== e.fingerprint) throw Error("invite_already_bound");
462
+ if (_.recipient_actor_id !== u) throw Error("invite_identity_conflict");
463
+ await this.db.prepare("UPDATE enrolled_devices SET identity_id = ?\n WHERE group_id = ? AND device_id = ? AND identity_id IS NULL\n AND public_key = ? AND fingerprint = ?").bind(u, _.group_id, e.deviceId, e.publicKey, e.fingerprint).run();
464
+ let y = await this.getEnrollment(_.group_id, e.deviceId);
465
+ if (!y) throw Error("invite_acceptance_incomplete");
466
+ if (y.public_key !== e.publicKey || y.fingerprint !== e.fingerprint || y.identity_id !== u) throw Error("invite_identity_conflict");
467
+ let b = _;
468
+ if (v.kind === "add_device" && _.inviter_device_id && !_.bootstrap_grant_id && new Date(_.expires_at) > new Date(t)) {
469
469
  if (!this.db.batch) throw Error("D1 batch support is required for atomic bootstrap grant recovery.");
470
- let n = M(12);
471
- await this.db.batch([this.db.prepare("UPDATE coordinator_invites SET bootstrap_grant_id = ?,\n trust_state = 'bootstrap_grant_created'\n WHERE invite_id = ? AND invite_kind = 'add_device'\n AND bootstrap_grant_id IS NULL AND inviter_device_id IS NOT NULL\n AND bound_device_id = ? AND recipient_actor_id = ? AND expires_at > ?\n AND EXISTS (SELECT 1 FROM enrolled_devices e\n WHERE e.group_id = coordinator_invites.group_id\n AND e.device_id = coordinator_invites.inviter_device_id AND e.enabled = 1)").bind(n, v.invite_id, e.deviceId, d, t), this.db.prepare("INSERT OR IGNORE INTO coordinator_bootstrap_grants(\n grant_id, group_id, seed_device_id, worker_device_id, expires_at,\n created_at, created_by, revoked_at\n ) SELECT i.bootstrap_grant_id, i.group_id, i.inviter_device_id, i.bound_device_id,\n i.expires_at, ?, i.recipient_actor_id, NULL FROM coordinator_invites i\n JOIN enrolled_devices e ON e.group_id = i.group_id\n AND e.device_id = i.inviter_device_id AND e.enabled = 1\n WHERE i.invite_id = ? AND i.invite_kind = 'add_device'\n AND i.bootstrap_grant_id IS NOT NULL AND i.bound_device_id = ?").bind(t, v.invite_id, e.deviceId)]);
470
+ let n = N(12);
471
+ await this.db.batch([this.db.prepare("UPDATE coordinator_invites SET bootstrap_grant_id = ?,\n trust_state = 'bootstrap_grant_created'\n WHERE invite_id = ? AND invite_kind = 'add_device'\n AND bootstrap_grant_id IS NULL AND inviter_device_id IS NOT NULL\n AND bound_device_id = ? AND recipient_actor_id = ? AND expires_at > ?\n AND EXISTS (SELECT 1 FROM enrolled_devices e\n WHERE e.group_id = coordinator_invites.group_id\n AND e.device_id = coordinator_invites.inviter_device_id AND e.enabled = 1)").bind(n, _.invite_id, e.deviceId, u, t), this.db.prepare("INSERT OR IGNORE INTO coordinator_bootstrap_grants(\n grant_id, group_id, seed_device_id, worker_device_id, expires_at,\n created_at, created_by, revoked_at\n ) SELECT i.bootstrap_grant_id, i.group_id, i.inviter_device_id, i.bound_device_id,\n i.expires_at, ?, i.recipient_actor_id, NULL FROM coordinator_invites i\n JOIN enrolled_devices e ON e.group_id = i.group_id\n AND e.device_id = i.inviter_device_id AND e.enabled = 1\n WHERE i.invite_id = ? AND i.invite_kind = 'add_device'\n AND i.bootstrap_grant_id IS NOT NULL AND i.bound_device_id = ?").bind(t, _.invite_id, e.deviceId)]);
472
472
  let r = await this.getInviteByTokenForInspection(e.token);
473
473
  if (!r) throw Error("invite_invalid");
474
- x = r;
474
+ b = r;
475
475
  }
476
- let S = x.bootstrap_grant_id ? await this.getBootstrapGrant(x.bootstrap_grant_id) : null;
476
+ let x = b.bootstrap_grant_id ? await this.getBootstrapGrant(b.bootstrap_grant_id) : null;
477
477
  return {
478
- status: m === 1 ? "accepted" : "existing",
479
- invite: x,
480
- reviewed_intent: y.reviewed_intent,
481
- bootstrap_grant: S
478
+ status: p === 1 ? "accepted" : "existing",
479
+ invite: b,
480
+ reviewed_intent: v.reviewed_intent,
481
+ bootstrap_grant: x
482
482
  };
483
483
  }
484
484
  async consumeProjectInvite(e) {
485
485
  if (!this.db.batch) throw Error("D1 batch support is required for atomic invite consume.");
486
- let t = r(e.now), n = await N(e.token), i = await this.getInviteByTokenForInspection(e.token);
487
- if (!i?.operation_id || !i.project_intent_json || i.revoked_at) throw Error("invite_invalid");
488
- let a = await this.getGroup(i.group_id);
489
- if (!a) throw Error("group_not_found");
490
- if (a.archived_at) throw Error("group_archived");
491
- if (i.operation_id !== e.operationId) throw Error("invite_invalid");
492
- if (l(e.publicKey) !== e.fingerprint) throw Error("fingerprint_mismatch");
493
- if (!i.consumed_at && new Date(i.expires_at) <= new Date(t)) throw Error("invite_expired");
494
- let o = i.bound_device_id === e.deviceId && i.bound_public_key === e.publicKey && i.bound_fingerprint === e.fingerprint;
495
- if (i.consumed_at && !o) throw Error("invite_already_bound");
496
- if (i.consumed_at && (i.recipient_actor_id !== e.recipientActorId || i.recipient_display_name !== e.recipientDisplayName || i.recipient_device_display_name !== e.deviceDisplayName)) throw Error("invite_identity_conflict");
497
- let s = await Z(this.db.prepare(`SELECT ${F}
498
- FROM enrolled_devices WHERE group_id = ? AND device_id = ?`).bind(i.group_id, e.deviceId));
486
+ let t = o(e.now), n = await P(e.token), r = await this.getInviteByTokenForInspection(e.token);
487
+ if (!r?.operation_id || !r.project_intent_json || r.revoked_at) throw Error("invite_invalid");
488
+ let i = await this.getGroup(r.group_id);
489
+ if (!i) throw Error("group_not_found");
490
+ if (i.archived_at) throw Error("group_archived");
491
+ if (r.operation_id !== e.operationId) throw Error("invite_invalid");
492
+ if (E(e.publicKey) !== e.fingerprint) throw Error("fingerprint_mismatch");
493
+ if (!r.consumed_at && new Date(r.expires_at) <= new Date(t)) throw Error("invite_expired");
494
+ let a = r.bound_device_id === e.deviceId && r.bound_public_key === e.publicKey && r.bound_fingerprint === e.fingerprint;
495
+ if (r.consumed_at && !a) throw Error("invite_already_bound");
496
+ if (r.consumed_at && (r.recipient_actor_id !== e.recipientActorId || r.recipient_display_name !== e.recipientDisplayName || r.recipient_device_display_name !== e.deviceDisplayName)) throw Error("invite_identity_conflict");
497
+ let s = await Z(this.db.prepare(`SELECT ${I}
498
+ FROM enrolled_devices WHERE group_id = ? AND device_id = ?`).bind(r.group_id, e.deviceId));
499
499
  if (s && (s.public_key !== e.publicKey || s.fingerprint !== e.fingerprint || s.identity_id != null && s.identity_id !== e.recipientActorId)) throw Error("invite_identity_conflict");
500
- let c = M(12), u = J((await this.db.batch([
501
- this.db.prepare("UPDATE coordinator_invites SET token = ?, consumed_at = ?, bound_device_id = ?,\n bound_public_key = ?, bound_fingerprint = ?, recipient_actor_id = ?,\n recipient_display_name = ?, recipient_device_display_name = ?,\n trust_state = 'pending_inviter_device'\n WHERE (token_digest = ? OR token = ?) AND consumed_at IS NULL\n AND EXISTS (SELECT 1 FROM groups g WHERE g.group_id = coordinator_invites.group_id\n AND g.archived_at IS NULL)").bind(`consumed:${i.invite_id}`, t, e.deviceId, e.publicKey, e.fingerprint, e.recipientActorId, e.recipientDisplayName, e.deviceDisplayName, n, e.token),
502
- this.db.prepare("INSERT INTO enrolled_devices(\n group_id, device_id, public_key, fingerprint, identity_id, display_name, enabled, created_at\n ) SELECT i.group_id, i.bound_device_id, i.bound_public_key, i.bound_fingerprint,\n i.recipient_actor_id, i.recipient_device_display_name, 1, ? FROM coordinator_invites i\n JOIN groups g ON g.group_id = i.group_id AND g.archived_at IS NULL\n WHERE (i.token_digest = ? OR i.token = ?) AND i.bound_device_id = ? AND ? = 1\n ON CONFLICT(group_id, device_id) DO UPDATE SET\n identity_id = COALESCE(enrolled_devices.identity_id, excluded.identity_id),\n display_name = excluded.display_name, enabled = 1\n WHERE enrolled_devices.identity_id IS NULL\n OR enrolled_devices.identity_id = excluded.identity_id").bind(t, n, e.token, e.deviceId, +!i.consumed_at),
500
+ let c = N(12), l = J((await this.db.batch([
501
+ this.db.prepare("UPDATE coordinator_invites SET token = ?, consumed_at = ?, bound_device_id = ?,\n bound_public_key = ?, bound_fingerprint = ?, recipient_actor_id = ?,\n recipient_display_name = ?, recipient_device_display_name = ?,\n trust_state = 'pending_inviter_device'\n WHERE (token_digest = ? OR token = ?) AND consumed_at IS NULL\n AND EXISTS (SELECT 1 FROM groups g WHERE g.group_id = coordinator_invites.group_id\n AND g.archived_at IS NULL)").bind(`consumed:${r.invite_id}`, t, e.deviceId, e.publicKey, e.fingerprint, e.recipientActorId, e.recipientDisplayName, e.deviceDisplayName, n, e.token),
502
+ this.db.prepare("INSERT INTO enrolled_devices(\n group_id, device_id, public_key, fingerprint, identity_id, display_name, enabled, created_at\n ) SELECT i.group_id, i.bound_device_id, i.bound_public_key, i.bound_fingerprint,\n i.recipient_actor_id, i.recipient_device_display_name, 1, ? FROM coordinator_invites i\n JOIN groups g ON g.group_id = i.group_id AND g.archived_at IS NULL\n WHERE (i.token_digest = ? OR i.token = ?) AND i.bound_device_id = ? AND ? = 1\n ON CONFLICT(group_id, device_id) DO UPDATE SET\n identity_id = COALESCE(enrolled_devices.identity_id, excluded.identity_id),\n display_name = excluded.display_name, enabled = 1\n WHERE enrolled_devices.identity_id IS NULL\n OR enrolled_devices.identity_id = excluded.identity_id").bind(t, n, e.token, e.deviceId, +!r.consumed_at),
503
503
  this.db.prepare("UPDATE coordinator_invites SET bootstrap_grant_id = ?,\n trust_state = 'bootstrap_grant_created'\n WHERE (token_digest = ? OR token = ?) AND bootstrap_grant_id IS NULL\n AND bound_device_id = ?\n AND EXISTS (SELECT 1 FROM groups g WHERE g.group_id = coordinator_invites.group_id\n AND g.archived_at IS NULL)\n AND expires_at > ?\n AND EXISTS (SELECT 1 FROM enrolled_devices e WHERE e.group_id = coordinator_invites.group_id\n AND e.device_id = coordinator_invites.inviter_device_id AND e.enabled = 1)").bind(c, n, e.token, e.deviceId, t),
504
504
  this.db.prepare("INSERT OR IGNORE INTO coordinator_bootstrap_grants(\n grant_id, group_id, seed_device_id, worker_device_id, expires_at, created_at,\n created_by, revoked_at\n ) SELECT i.bootstrap_grant_id, i.group_id, i.inviter_device_id, i.bound_device_id,\n i.expires_at, ?, i.inviter_actor_id, NULL FROM coordinator_invites i\n JOIN groups g ON g.group_id = i.group_id AND g.archived_at IS NULL\n JOIN enrolled_devices e ON e.group_id = i.group_id AND e.device_id = i.inviter_device_id\n WHERE (i.token_digest = ? OR i.token = ?) AND i.bootstrap_grant_id IS NOT NULL\n AND i.bound_device_id = ? AND e.enabled = 1").bind(t, n, e.token, e.deviceId)
505
- ]))[0]) === 1, d = await this.getGroup(i.group_id);
506
- if (!d) throw Error("group_not_found");
507
- if (d.archived_at) throw Error("group_archived");
508
- let f = await this.getInviteByTokenForInspection(e.token);
509
- if (!f) throw Error("invite_invalid");
510
- if (f.bound_device_id !== e.deviceId || f.bound_public_key !== e.publicKey || f.bound_fingerprint !== e.fingerprint) throw Error("invite_already_bound");
511
- if (f.recipient_actor_id !== e.recipientActorId || f.recipient_display_name !== e.recipientDisplayName || f.recipient_device_display_name !== e.deviceDisplayName) throw Error("invite_identity_conflict");
512
- u || await this.db.prepare("UPDATE enrolled_devices SET identity_id = ?\n WHERE group_id = ? AND device_id = ? AND identity_id IS NULL AND enabled = 1\n AND public_key = ? AND fingerprint = ?").bind(e.recipientActorId, f.group_id, e.deviceId, e.publicKey, e.fingerprint).run();
513
- let p = await this.getEnrollment(f.group_id, e.deviceId);
514
- if (!p) throw Error("invite_acceptance_incomplete");
515
- if (p.identity_id !== e.recipientActorId) throw Error("invite_identity_conflict");
516
- let m = f.inviter_device_id ? await this.getEnrollment(f.group_id, f.inviter_device_id) : null, h = f.bootstrap_grant_id ? await this.getBootstrapGrant(f.bootstrap_grant_id) : null;
505
+ ]))[0]) === 1, u = await this.getGroup(r.group_id);
506
+ if (!u) throw Error("group_not_found");
507
+ if (u.archived_at) throw Error("group_archived");
508
+ let d = await this.getInviteByTokenForInspection(e.token);
509
+ if (!d) throw Error("invite_invalid");
510
+ if (d.bound_device_id !== e.deviceId || d.bound_public_key !== e.publicKey || d.bound_fingerprint !== e.fingerprint) throw Error("invite_already_bound");
511
+ if (d.recipient_actor_id !== e.recipientActorId || d.recipient_display_name !== e.recipientDisplayName || d.recipient_device_display_name !== e.deviceDisplayName) throw Error("invite_identity_conflict");
512
+ l || await this.db.prepare("UPDATE enrolled_devices SET identity_id = ?\n WHERE group_id = ? AND device_id = ? AND identity_id IS NULL AND enabled = 1\n AND public_key = ? AND fingerprint = ?").bind(e.recipientActorId, d.group_id, e.deviceId, e.publicKey, e.fingerprint).run();
513
+ let f = await this.getEnrollment(d.group_id, e.deviceId);
514
+ if (!f) throw Error("invite_acceptance_incomplete");
515
+ if (f.identity_id !== e.recipientActorId) throw Error("invite_identity_conflict");
516
+ let p = d.inviter_device_id ? await this.getEnrollment(d.group_id, d.inviter_device_id) : null, m = d.bootstrap_grant_id ? await this.getBootstrapGrant(d.bootstrap_grant_id) : null;
517
517
  return {
518
- status: u ? "accepted" : "existing",
519
- invite: f,
520
- enrollment: p,
521
- seed_enrollment: m,
522
- bootstrap_grant: h
518
+ status: l ? "accepted" : "existing",
519
+ invite: d,
520
+ enrollment: f,
521
+ seed_enrollment: p,
522
+ bootstrap_grant: m
523
523
  };
524
524
  }
525
525
  async listInvites(e) {
526
- return (await X(this.db.prepare(`SELECT ${P}
526
+ return (await X(this.db.prepare(`SELECT ${F}
527
527
  FROM coordinator_invites WHERE group_id = ?
528
- ORDER BY created_at DESC`).bind(e))).map((e) => D(e));
528
+ ORDER BY created_at DESC`).bind(e))).map((e) => O(e));
529
529
  }
530
530
  async createJoinRequest(e) {
531
- let t = k(), n = M(12);
532
- return await this.db.prepare("INSERT INTO coordinator_join_requests(\n request_id, group_id, device_id, public_key, fingerprint, display_name, token, status, created_at, reviewed_at, reviewed_by\n ) VALUES (?, ?, ?, ?, ?, ?, ?, 'pending', ?, NULL, NULL)").bind(n, e.groupId, e.deviceId, e.publicKey, e.fingerprint, e.displayName ?? null, e.token, t).run(), D(await Z(this.db.prepare("SELECT request_id, group_id, device_id, public_key, fingerprint, display_name, token, status, created_at, reviewed_at, reviewed_by\n FROM coordinator_join_requests WHERE request_id = ?").bind(n)));
531
+ let t = M(), n = N(12);
532
+ return await this.db.prepare("INSERT INTO coordinator_join_requests(\n request_id, group_id, device_id, public_key, fingerprint, display_name, token, status, created_at, reviewed_at, reviewed_by\n ) VALUES (?, ?, ?, ?, ?, ?, ?, 'pending', ?, NULL, NULL)").bind(n, e.groupId, e.deviceId, e.publicKey, e.fingerprint, e.displayName ?? null, e.token, t).run(), O(await Z(this.db.prepare("SELECT request_id, group_id, device_id, public_key, fingerprint, display_name, token, status, created_at, reviewed_at, reviewed_by\n FROM coordinator_join_requests WHERE request_id = ?").bind(n)));
533
533
  }
534
534
  async listJoinRequests(e, t) {
535
535
  let n = t ?? "pending";
536
- return (await X(this.db.prepare("SELECT request_id, group_id, device_id, public_key, fingerprint, display_name, token, status, created_at, reviewed_at, reviewed_by\n FROM coordinator_join_requests\n WHERE group_id = ? AND status = ?\n ORDER BY created_at ASC, device_id ASC").bind(e, n))).map((e) => D(e));
536
+ return (await X(this.db.prepare("SELECT request_id, group_id, device_id, public_key, fingerprint, display_name, token, status, created_at, reviewed_at, reviewed_by\n FROM coordinator_join_requests\n WHERE group_id = ? AND status = ?\n ORDER BY created_at ASC, device_id ASC").bind(e, n))).map((e) => O(e));
537
537
  }
538
538
  async reviewJoinRequest(e) {
539
539
  let t = await Z(this.db.prepare("SELECT request_id, group_id, device_id, public_key, fingerprint, display_name, token, status,\n created_at, reviewed_at, reviewed_by\n FROM coordinator_join_requests WHERE request_id = ?").bind(e.requestId));
540
540
  if (!t) return null;
541
541
  if (t.status !== "pending") return {
542
- ...D(t),
542
+ ...O(t),
543
543
  _no_transition: !0
544
544
  };
545
- let n = Y(e.bootstrapGrant), r = k(), i = e.approved ? "approved" : "denied", a = null, o = null;
545
+ let n = Y(e.bootstrapGrant), r = M(), i = e.approved ? "approved" : "denied", a = null, o = null;
546
546
  if (e.approved && n) {
547
547
  if (!await Z(this.db.prepare("SELECT device_id FROM enrolled_devices WHERE group_id = ? AND device_id = ? AND enabled = 1").bind(t.group_id, n.seedDeviceId))) throw Error("bootstrap grant seed device is not enrolled in the group.");
548
548
  if (n.seedDeviceId === t.device_id) throw Error("bootstrap grant seed and worker device ids must differ.");
@@ -554,9 +554,9 @@ var $ = class {
554
554
  }
555
555
  if (this.db.batch) {
556
556
  let t = [];
557
- if (t.push(this.db.prepare("UPDATE coordinator_join_requests\n SET status = ?, reviewed_at = ?, reviewed_by = ?\n WHERE request_id = ? AND status = 'pending'").bind(i, r, e.reviewedBy ?? null, e.requestId)), e.approved && (t.push(this.db.prepare("INSERT INTO enrolled_devices(\n group_id, device_id, public_key, fingerprint, display_name, enabled, created_at\n )\n SELECT group_id, device_id, public_key, fingerprint, display_name, 1, ?\n FROM coordinator_join_requests\n WHERE request_id = ?\n AND status = 'approved'\n AND reviewed_at = ?\n ON CONFLICT(group_id, device_id) DO UPDATE SET\n public_key = excluded.public_key,\n fingerprint = excluded.fingerprint,\n display_name = excluded.display_name,\n enabled = 1").bind(k(), e.requestId, r)), a)) {
558
- o = M(12);
559
- let n = k();
557
+ if (t.push(this.db.prepare("UPDATE coordinator_join_requests\n SET status = ?, reviewed_at = ?, reviewed_by = ?\n WHERE request_id = ? AND status = 'pending'").bind(i, r, e.reviewedBy ?? null, e.requestId)), e.approved && (t.push(this.db.prepare("INSERT INTO enrolled_devices(\n group_id, device_id, public_key, fingerprint, display_name, enabled, created_at\n )\n SELECT group_id, device_id, public_key, fingerprint, display_name, 1, ?\n FROM coordinator_join_requests\n WHERE request_id = ?\n AND status = 'approved'\n AND reviewed_at = ?\n ON CONFLICT(group_id, device_id) DO UPDATE SET\n public_key = excluded.public_key,\n fingerprint = excluded.fingerprint,\n display_name = excluded.display_name,\n enabled = 1").bind(M(), e.requestId, r)), a)) {
558
+ o = N(12);
559
+ let n = M();
560
560
  t.push(this.db.prepare("INSERT INTO coordinator_bootstrap_grants(\n grant_id, group_id, seed_device_id, worker_device_id, expires_at, created_at, created_by, revoked_at\n ) SELECT ?, ?, ?, ?, ?, ?, ?, NULL\n WHERE EXISTS (\n SELECT 1 FROM coordinator_join_requests\n WHERE request_id = ? AND status = 'approved' AND reviewed_at = ?\n )").bind(o, a.groupId, a.seedDeviceId, a.workerDeviceId, a.expiresAt, n, a.createdBy ?? null, e.requestId, r));
561
561
  }
562
562
  await this.db.batch(t);
@@ -575,7 +575,7 @@ var $ = class {
575
575
  n && await this.revokeBootstrapGrant(n);
576
576
  let t = await Z(this.db.prepare("SELECT request_id, group_id, device_id, public_key, fingerprint, display_name, token, status, created_at, reviewed_at, reviewed_by\n FROM coordinator_join_requests WHERE request_id = ?").bind(e.requestId));
577
577
  return t ? {
578
- ...D(t),
578
+ ...O(t),
579
579
  _no_transition: !0
580
580
  } : null;
581
581
  }
@@ -584,7 +584,7 @@ var $ = class {
584
584
  if (!s) return null;
585
585
  let c = a ? o ? await this.getBootstrapGrant(o) : await this.createBootstrapGrant(a) : null;
586
586
  return {
587
- ...D(s),
587
+ ...O(s),
588
588
  bootstrap_grant: c
589
589
  };
590
590
  }
@@ -593,174 +593,174 @@ var $ = class {
593
593
  if (!t || !n || !r) throw Error("groupId, requestingDeviceId, and requestedDeviceId are required.");
594
594
  if (n === r) throw Error("requesting and requested device ids must differ.");
595
595
  if (i) {
596
- let e = k();
597
- if (await Q(this.db.prepare("UPDATE coordinator_reciprocal_approvals\n SET status = 'completed', resolved_at = ?\n WHERE request_id = ?\n AND group_id = ?\n AND requesting_device_id = ?\n AND requested_device_id = ?\n AND status = 'pending'").bind(e, a, t, r, n)) !== 1) throw new ne();
598
- return D(await Z(this.db.prepare("SELECT request_id, group_id, requesting_device_id, requested_device_id, status, created_at, resolved_at\n FROM coordinator_reciprocal_approvals WHERE request_id = ?").bind(a)));
596
+ let e = M();
597
+ if (await Q(this.db.prepare("UPDATE coordinator_reciprocal_approvals\n SET status = 'completed', resolved_at = ?\n WHERE request_id = ?\n AND group_id = ?\n AND requesting_device_id = ?\n AND requested_device_id = ?\n AND status = 'pending'").bind(e, a, t, r, n)) !== 1) throw new u();
598
+ return O(await Z(this.db.prepare("SELECT request_id, group_id, requesting_device_id, requested_device_id, status, created_at, resolved_at\n FROM coordinator_reciprocal_approvals WHERE request_id = ?").bind(a)));
599
599
  }
600
- let o = A(n, r), s = await Z(this.db.prepare("SELECT request_id, group_id, requesting_device_id, requested_device_id, status, created_at, resolved_at\n FROM coordinator_reciprocal_approvals\n WHERE group_id = ? AND requesting_device_id = ? AND requested_device_id = ? AND status = 'pending'\n ORDER BY created_at DESC LIMIT 1").bind(t, n, r));
601
- if (s) return D(s);
600
+ let o = re(n, r), s = await Z(this.db.prepare("SELECT request_id, group_id, requesting_device_id, requested_device_id, status, created_at, resolved_at\n FROM coordinator_reciprocal_approvals\n WHERE group_id = ? AND requesting_device_id = ? AND requested_device_id = ? AND status = 'pending'\n ORDER BY created_at DESC LIMIT 1").bind(t, n, r));
601
+ if (s) return O(s);
602
602
  let c = await Z(this.db.prepare("SELECT request_id, group_id, requesting_device_id, requested_device_id, status, created_at, resolved_at\n FROM coordinator_reciprocal_approvals\n WHERE group_id = ? AND requesting_device_id = ? AND requested_device_id = ? AND status = 'pending'\n ORDER BY created_at DESC LIMIT 1").bind(t, r, n));
603
603
  if (c) {
604
- let e = k();
605
- return await this.db.prepare("UPDATE coordinator_reciprocal_approvals SET status = 'completed', resolved_at = ? WHERE request_id = ?").bind(e, c.request_id).run(), D(await Z(this.db.prepare("SELECT request_id, group_id, requesting_device_id, requested_device_id, status, created_at, resolved_at\n FROM coordinator_reciprocal_approvals WHERE request_id = ?").bind(c.request_id)));
604
+ let e = M();
605
+ return await this.db.prepare("UPDATE coordinator_reciprocal_approvals SET status = 'completed', resolved_at = ? WHERE request_id = ?").bind(e, c.request_id).run(), O(await Z(this.db.prepare("SELECT request_id, group_id, requesting_device_id, requested_device_id, status, created_at, resolved_at\n FROM coordinator_reciprocal_approvals WHERE request_id = ?").bind(c.request_id)));
606
606
  }
607
- let l = M(12), u = k();
607
+ let l = N(12), d = M();
608
608
  try {
609
- await this.db.prepare("INSERT INTO coordinator_reciprocal_approvals(\n request_id,\n group_id,\n requesting_device_id,\n requested_device_id,\n pending_pair_low_device_id,\n pending_pair_high_device_id,\n status,\n created_at,\n resolved_at\n ) VALUES (?, ?, ?, ?, ?, ?, 'pending', ?, NULL)").bind(l, t, n, r, o.low, o.high, u).run();
609
+ await this.db.prepare("INSERT INTO coordinator_reciprocal_approvals(\n request_id,\n group_id,\n requesting_device_id,\n requested_device_id,\n pending_pair_low_device_id,\n pending_pair_high_device_id,\n status,\n created_at,\n resolved_at\n ) VALUES (?, ?, ?, ?, ?, ?, 'pending', ?, NULL)").bind(l, t, n, r, o.low, o.high, d).run();
610
610
  } catch (e) {
611
- if (!j(e)) throw e;
611
+ if (!ie(e)) throw e;
612
612
  let i = await Z(this.db.prepare("SELECT request_id, group_id, requesting_device_id, requested_device_id, status, created_at, resolved_at\n FROM coordinator_reciprocal_approvals\n WHERE group_id = ? AND requesting_device_id = ? AND requested_device_id = ? AND status = 'pending'\n ORDER BY created_at DESC LIMIT 1").bind(t, n, r));
613
- if (i) return D(i);
613
+ if (i) return O(i);
614
614
  let a = await Z(this.db.prepare("SELECT request_id, group_id, requesting_device_id, requested_device_id, status, created_at, resolved_at\n FROM coordinator_reciprocal_approvals\n WHERE group_id = ? AND requesting_device_id = ? AND requested_device_id = ? AND status = 'pending'\n ORDER BY created_at DESC LIMIT 1").bind(t, r, n));
615
615
  if (a) {
616
- let e = k();
617
- return await this.db.prepare("UPDATE coordinator_reciprocal_approvals SET status = 'completed', resolved_at = ? WHERE request_id = ?").bind(e, a.request_id).run(), D(await Z(this.db.prepare("SELECT request_id, group_id, requesting_device_id, requested_device_id, status, created_at, resolved_at\n FROM coordinator_reciprocal_approvals WHERE request_id = ?").bind(a.request_id)));
616
+ let e = M();
617
+ return await this.db.prepare("UPDATE coordinator_reciprocal_approvals SET status = 'completed', resolved_at = ? WHERE request_id = ?").bind(e, a.request_id).run(), O(await Z(this.db.prepare("SELECT request_id, group_id, requesting_device_id, requested_device_id, status, created_at, resolved_at\n FROM coordinator_reciprocal_approvals WHERE request_id = ?").bind(a.request_id)));
618
618
  }
619
619
  throw e;
620
620
  }
621
- return D(await Z(this.db.prepare("SELECT request_id, group_id, requesting_device_id, requested_device_id, status, created_at, resolved_at\n FROM coordinator_reciprocal_approvals WHERE request_id = ?").bind(l)));
621
+ return O(await Z(this.db.prepare("SELECT request_id, group_id, requesting_device_id, requested_device_id, status, created_at, resolved_at\n FROM coordinator_reciprocal_approvals WHERE request_id = ?").bind(l)));
622
622
  }
623
623
  async createBootstrapGrant(e) {
624
- let t = se(e), n = M(12), r = k();
625
- return await this.db.prepare("INSERT INTO coordinator_bootstrap_grants(\n grant_id, group_id, seed_device_id, worker_device_id, expires_at, created_at, created_by, revoked_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, NULL)").bind(n, t.groupId, t.seedDeviceId, t.workerDeviceId, t.expiresAt, r, t.createdBy).run(), D(await Z(this.db.prepare("SELECT grant_id, group_id, seed_device_id, worker_device_id, expires_at, created_at, created_by, revoked_at\n FROM coordinator_bootstrap_grants WHERE grant_id = ?").bind(n)));
624
+ let t = oe(e), n = N(12), r = M();
625
+ return await this.db.prepare("INSERT INTO coordinator_bootstrap_grants(\n grant_id, group_id, seed_device_id, worker_device_id, expires_at, created_at, created_by, revoked_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, NULL)").bind(n, t.groupId, t.seedDeviceId, t.workerDeviceId, t.expiresAt, r, t.createdBy).run(), O(await Z(this.db.prepare("SELECT grant_id, group_id, seed_device_id, worker_device_id, expires_at, created_at, created_by, revoked_at\n FROM coordinator_bootstrap_grants WHERE grant_id = ?").bind(n)));
626
626
  }
627
627
  async getScope(e) {
628
628
  let t = await Z(this.db.prepare("SELECT scope_id, label, kind, authority_type, coordinator_id, group_id,\n manifest_issuer_device_id, membership_epoch, manifest_hash, status, created_at, updated_at\n FROM coordinator_scopes WHERE scope_id = ?").bind(e));
629
- return t ? D(t) : null;
629
+ return t ? O(t) : null;
630
630
  }
631
631
  async getScopeMembership(e, t) {
632
632
  let n = await Z(this.db.prepare("SELECT scope_id, device_id, role, status, membership_epoch, coordinator_id, group_id,\n manifest_issuer_device_id, manifest_hash, signed_manifest_json, updated_at\n FROM coordinator_scope_memberships\n WHERE scope_id = ? AND device_id = ?").bind(e, t));
633
- return n ? D(n) : null;
633
+ return n ? O(n) : null;
634
634
  }
635
635
  async createScope(e) {
636
- let t = z(e);
636
+ let t = ce(e);
637
637
  if (await this.getScope(t.scopeId)) throw Error("scopeId already exists.");
638
- let n = k();
638
+ let n = M();
639
639
  await this.db.prepare("INSERT INTO coordinator_scopes(\n scope_id, label, kind, authority_type, coordinator_id, group_id,\n manifest_issuer_device_id, membership_epoch, manifest_hash, status, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)").bind(t.scopeId, t.label, t.kind, t.authorityType, t.coordinatorId, t.groupId, t.manifestIssuerDeviceId, t.membershipEpoch, t.manifestHash, t.status, n, n).run();
640
640
  let r = await this.getScope(t.scopeId);
641
641
  if (!r) throw Error("scope insert returned no row");
642
642
  return r;
643
643
  }
644
644
  async updateScope(e) {
645
- let t = I(e.scopeId), n = t ? await this.getScope(t) : null;
645
+ let t = L(e.scopeId), n = t ? await this.getScope(t) : null;
646
646
  if (!n) return null;
647
647
  let r = H(e, n);
648
- return await this.db.prepare("UPDATE coordinator_scopes\n SET label = ?,\n kind = ?,\n authority_type = ?,\n coordinator_id = ?,\n group_id = ?,\n manifest_issuer_device_id = ?,\n membership_epoch = ?,\n manifest_hash = ?,\n status = ?,\n updated_at = ?\n WHERE scope_id = ?").bind(r.label, r.kind, r.authorityType, r.coordinatorId, r.groupId, r.manifestIssuerDeviceId, r.membershipEpoch, r.manifestHash, r.status, k(), r.scopeId).run(), await this.getScope(r.scopeId);
648
+ return await this.db.prepare("UPDATE coordinator_scopes\n SET label = ?,\n kind = ?,\n authority_type = ?,\n coordinator_id = ?,\n group_id = ?,\n manifest_issuer_device_id = ?,\n membership_epoch = ?,\n manifest_hash = ?,\n status = ?,\n updated_at = ?\n WHERE scope_id = ?").bind(r.label, r.kind, r.authorityType, r.coordinatorId, r.groupId, r.manifestIssuerDeviceId, r.membershipEpoch, r.manifestHash, r.status, M(), r.scopeId).run(), await this.getScope(r.scopeId);
649
649
  }
650
650
  async listScopes(e = {}) {
651
- let t = [], n = [], r = I(e.coordinatorId), i = I(e.groupId), a = I(e.status);
651
+ let t = [], n = [], r = L(e.coordinatorId), i = L(e.groupId), a = L(e.status);
652
652
  r && (t.push("coordinator_id = ?"), n.push(r)), i && (t.push("group_id = ?"), n.push(i)), a ? (t.push("status = ?"), n.push(a)) : e.includeInactive || t.push("status = 'active'");
653
653
  let o = t.length ? `WHERE ${t.join(" AND ")}` : "", s = this.db.prepare(`SELECT scope_id, label, kind, authority_type, coordinator_id, group_id,
654
654
  manifest_issuer_device_id, membership_epoch, manifest_hash, status, created_at, updated_at
655
655
  FROM coordinator_scopes ${o}
656
656
  ORDER BY coordinator_id ASC, group_id ASC, scope_id ASC`);
657
- return (await X(n.length ? s.bind(...n) : s)).map((e) => D(e));
657
+ return (await X(n.length ? s.bind(...n) : s)).map((e) => O(e));
658
658
  }
659
659
  async grantScopeMembership(e) {
660
- let t = i(e.effectId), r = a(e), o = await K(this.db, t);
661
- if (o) return n(o, "grant", r), C(o);
662
- let s = I(e.scopeId), c = I(e.deviceId), l = s ? await this.getScope(s) : null;
663
- if (!l) throw new f("scope_not_found");
664
- if (l.status !== "active") throw new f("scope_inactive");
665
- let u = s && c ? await this.getScopeMembership(s, c) : null, d = U(e, l, u);
666
- if (d.groupId && !await this.getEnrollment(d.groupId, d.deviceId)) throw new f("device_not_enrolled");
667
- let p = k();
660
+ let n = a(e.effectId), r = t(e), i = await K(this.db, n);
661
+ if (i) return D(i, "grant", r), h(i);
662
+ let o = L(e.scopeId), s = L(e.deviceId), c = o ? await this.getScope(o) : null;
663
+ if (!c) throw new f("scope_not_found");
664
+ if (c.status !== "active") throw new f("scope_inactive");
665
+ let l = o && s ? await this.getScopeMembership(o, s) : null, u = U(e, c, l);
666
+ if (u.groupId && !await this.getEnrollment(u.groupId, u.deviceId)) throw new f("device_not_enrolled");
667
+ let d = M();
668
668
  await q(this.db, [
669
- this.db.prepare("INSERT INTO coordinator_scope_memberships(\n scope_id, device_id, role, status, membership_epoch, coordinator_id, group_id,\n manifest_issuer_device_id, manifest_hash, signed_manifest_json, updated_at\n ) SELECT ?, ?, ?, 'active', ?, ?, ?, ?, ?, ?, ?\n WHERE NOT EXISTS (\n SELECT 1 FROM coordinator_scope_membership_effect_receipts WHERE effect_id = ?\n )\n ON CONFLICT(scope_id, device_id) DO UPDATE SET\n role = excluded.role,\n status = 'active',\n membership_epoch = excluded.membership_epoch,\n coordinator_id = excluded.coordinator_id,\n group_id = excluded.group_id,\n manifest_issuer_device_id = excluded.manifest_issuer_device_id,\n manifest_hash = excluded.manifest_hash,\n signed_manifest_json = excluded.signed_manifest_json,\n updated_at = excluded.updated_at\n WHERE excluded.membership_epoch > coordinator_scope_memberships.membership_epoch\n OR (\n excluded.membership_epoch = coordinator_scope_memberships.membership_epoch\n AND coordinator_scope_memberships.status != 'revoked'\n )").bind(d.scopeId, d.deviceId, d.role, d.membershipEpoch, d.coordinatorId, d.groupId, d.manifestIssuerDeviceId, d.manifestHash, d.signedManifestJson, p, t),
669
+ this.db.prepare("INSERT INTO coordinator_scope_memberships(\n scope_id, device_id, role, status, membership_epoch, coordinator_id, group_id,\n manifest_issuer_device_id, manifest_hash, signed_manifest_json, updated_at\n ) SELECT ?, ?, ?, 'active', ?, ?, ?, ?, ?, ?, ?\n WHERE NOT EXISTS (\n SELECT 1 FROM coordinator_scope_membership_effect_receipts WHERE effect_id = ?\n )\n ON CONFLICT(scope_id, device_id) DO UPDATE SET\n role = excluded.role,\n status = 'active',\n membership_epoch = excluded.membership_epoch,\n coordinator_id = excluded.coordinator_id,\n group_id = excluded.group_id,\n manifest_issuer_device_id = excluded.manifest_issuer_device_id,\n manifest_hash = excluded.manifest_hash,\n signed_manifest_json = excluded.signed_manifest_json,\n updated_at = excluded.updated_at\n WHERE excluded.membership_epoch > coordinator_scope_memberships.membership_epoch\n OR (\n excluded.membership_epoch = coordinator_scope_memberships.membership_epoch\n AND coordinator_scope_memberships.status != 'revoked'\n )").bind(u.scopeId, u.deviceId, u.role, u.membershipEpoch, u.coordinatorId, u.groupId, u.manifestIssuerDeviceId, u.manifestHash, u.signedManifestJson, d, n),
670
670
  le(this.db, {
671
- effectId: t,
671
+ effectId: n,
672
672
  requestJson: r,
673
- scopeId: d.scopeId,
674
- deviceId: d.deviceId,
675
- createdAt: p
673
+ scopeId: u.scopeId,
674
+ deviceId: u.deviceId,
675
+ createdAt: d
676
676
  }),
677
677
  G(this.db, {
678
- effectId: t,
678
+ effectId: n,
679
679
  requestJson: r,
680
680
  action: "grant",
681
- previous: u,
682
- scopeId: d.scopeId,
683
- deviceId: d.deviceId,
681
+ previous: l,
682
+ scopeId: u.scopeId,
683
+ deviceId: u.deviceId,
684
684
  status: "active",
685
- membershipEpoch: d.membershipEpoch,
686
- updatedAt: p,
687
- actorType: d.actorType,
688
- actorId: d.actorId,
689
- createdAt: p
685
+ membershipEpoch: u.membershipEpoch,
686
+ updatedAt: d,
687
+ actorType: u.actorType,
688
+ actorId: u.actorId,
689
+ createdAt: d
690
690
  })
691
691
  ]);
692
- let m = await K(this.db, t);
693
- if (!m) throw Error("scope membership grant was not applied.");
694
- return n(m, "grant", r), C(m);
692
+ let p = await K(this.db, n);
693
+ if (!p) throw Error("scope membership grant was not applied.");
694
+ return D(p, "grant", r), h(p);
695
695
  }
696
696
  async revokeScopeMembership(e) {
697
- let t = I(e.scopeId), r = I(e.deviceId);
698
- if (!t || !r) throw Error("scopeId and deviceId are required.");
699
- let a = i(e.effectId), o = m(e), s = await K(this.db, a);
700
- if (s) return n(s, "revoke", o), s.outcome_applied === 1;
701
- let c = e.membershipEpoch == null ? null : R(e.membershipEpoch), l = I(e.groupId), u = l ? await this.getScope(t) : null;
702
- if (l && l !== u?.group_id) throw new f("scope_group_mismatch");
703
- let d = await this.getScopeMembership(t, r);
704
- if (c != null && d && c <= d.membership_epoch) throw Error("membershipEpoch must increase on revoke.");
705
- let p = k(), h = c ?? (d?.membership_epoch ?? -1) + 1, g = this.db.prepare("UPDATE coordinator_scope_memberships\n SET status = 'revoked',\n membership_epoch = CASE WHEN ? IS NULL THEN membership_epoch + 1 ELSE ? END,\n manifest_hash = COALESCE(?, manifest_hash),\n signed_manifest_json = COALESCE(?, signed_manifest_json),\n updated_at = ?\n WHERE scope_id = ? AND device_id = ? AND membership_epoch = ? AND status = ?\n AND NOT EXISTS (\n SELECT 1 FROM coordinator_scope_membership_effect_receipts WHERE effect_id = ?\n )").bind(c, c, I(e.manifestHash), I(e.signedManifestJson), p, t, r, d?.membership_epoch ?? -1, d?.status ?? "", a), _ = ue(this.db, {
706
- effectId: a,
707
- requestJson: o,
697
+ let t = L(e.scopeId), n = L(e.deviceId);
698
+ if (!t || !n) throw Error("scopeId and deviceId are required.");
699
+ let r = a(e.effectId), i = m(e), o = await K(this.db, r);
700
+ if (o) return D(o, "revoke", i), o.outcome_applied === 1;
701
+ let s = e.membershipEpoch == null ? null : z(e.membershipEpoch), c = L(e.groupId), l = c ? await this.getScope(t) : null;
702
+ if (c && c !== l?.group_id) throw new f("scope_group_mismatch");
703
+ let u = await this.getScopeMembership(t, n);
704
+ if (s != null && u && s <= u.membership_epoch) throw Error("membershipEpoch must increase on revoke.");
705
+ let d = M(), p = s ?? (u?.membership_epoch ?? -1) + 1, h = this.db.prepare("UPDATE coordinator_scope_memberships\n SET status = 'revoked',\n membership_epoch = CASE WHEN ? IS NULL THEN membership_epoch + 1 ELSE ? END,\n manifest_hash = COALESCE(?, manifest_hash),\n signed_manifest_json = COALESCE(?, signed_manifest_json),\n updated_at = ?\n WHERE scope_id = ? AND device_id = ? AND membership_epoch = ? AND status = ?\n AND NOT EXISTS (\n SELECT 1 FROM coordinator_scope_membership_effect_receipts WHERE effect_id = ?\n )").bind(s, s, L(e.manifestHash), L(e.signedManifestJson), d, t, n, u?.membership_epoch ?? -1, u?.status ?? "", r), g = ue(this.db, {
706
+ effectId: r,
707
+ requestJson: i,
708
708
  scopeId: t,
709
- deviceId: r,
710
- createdAt: p
711
- }), v = G(this.db, {
712
- effectId: a,
713
- requestJson: o,
709
+ deviceId: n,
710
+ createdAt: d
711
+ }), _ = G(this.db, {
712
+ effectId: r,
713
+ requestJson: i,
714
714
  action: "revoke",
715
- previous: d,
715
+ previous: u,
716
716
  scopeId: t,
717
- deviceId: r,
717
+ deviceId: n,
718
718
  status: "revoked",
719
- membershipEpoch: h,
720
- updatedAt: p,
721
- actorType: I(e.actorType),
722
- actorId: I(e.actorId),
723
- createdAt: p
719
+ membershipEpoch: p,
720
+ updatedAt: d,
721
+ actorType: L(e.actorType),
722
+ actorId: L(e.actorId),
723
+ createdAt: d
724
724
  });
725
725
  try {
726
726
  await q(this.db, [
727
+ h,
727
728
  g,
728
- _,
729
- v
729
+ _
730
730
  ]);
731
731
  } catch (e) {
732
- let n = await this.getScopeMembership(t, r);
733
- if (d && (!n || n.membership_epoch !== d.membership_epoch || n.status !== d.status)) return !1;
732
+ let r = await this.getScopeMembership(t, n);
733
+ if (u && (!r || r.membership_epoch !== u.membership_epoch || r.status !== u.status)) return !1;
734
734
  throw e;
735
735
  }
736
- let y = await K(this.db, a);
737
- if (!y) throw Error("scope membership revoke receipt was not persisted.");
738
- return n(y, "revoke", o), y.outcome_applied === 1;
736
+ let v = await K(this.db, r);
737
+ if (!v) throw Error("scope membership revoke receipt was not persisted.");
738
+ return D(v, "revoke", i), v.outcome_applied === 1;
739
739
  }
740
740
  async listScopeMemberships(e, t = !1) {
741
- let n = I(e);
741
+ let n = L(e);
742
742
  if (!n) throw Error("scopeId is required.");
743
743
  let r = t ? "" : "AND status = 'active'";
744
744
  return (await X(this.db.prepare(`SELECT scope_id, device_id, role, status, membership_epoch, coordinator_id, group_id,
745
745
  manifest_issuer_device_id, manifest_hash, signed_manifest_json, updated_at
746
746
  FROM coordinator_scope_memberships
747
747
  WHERE scope_id = ? ${r}
748
- ORDER BY device_id ASC`).bind(n))).map((e) => D(e));
748
+ ORDER BY device_id ASC`).bind(n))).map((e) => O(e));
749
749
  }
750
750
  async listDeviceScopeMemberships(e, t = !1) {
751
- let n = I(e);
751
+ let n = L(e);
752
752
  if (!n) throw Error("deviceId is required.");
753
753
  let r = t ? "" : "AND status = 'active'";
754
754
  return (await X(this.db.prepare(`SELECT scope_id, device_id, role, status, membership_epoch, coordinator_id, group_id,
755
755
  manifest_issuer_device_id, manifest_hash, signed_manifest_json, updated_at
756
756
  FROM coordinator_scope_memberships
757
757
  WHERE device_id = ? ${r}
758
- ORDER BY scope_id ASC`).bind(n))).map((e) => D(e));
758
+ ORDER BY scope_id ASC`).bind(n))).map((e) => O(e));
759
759
  }
760
760
  async listScopeMembershipAuditEvents(e) {
761
- let t = I(e.scopeId);
761
+ let t = L(e.scopeId);
762
762
  if (!t) throw Error("scopeId is required.");
763
- let n = I(e.deviceId), r = W(e.limit), i = n ? "scope_id = ? AND device_id = ?" : "scope_id = ?", a = n ? [
763
+ let n = L(e.deviceId), r = W(e.limit), i = n ? "scope_id = ? AND device_id = ?" : "scope_id = ?", a = n ? [
764
764
  t,
765
765
  n,
766
766
  r
@@ -771,16 +771,16 @@ var $ = class {
771
771
  FROM coordinator_scope_membership_audit_log
772
772
  WHERE ${i}
773
773
  ORDER BY event_id ASC
774
- LIMIT ?`).bind(...a))).map((e) => D(e));
774
+ LIMIT ?`).bind(...a))).map((e) => O(e));
775
775
  }
776
776
  async getBootstrapGrant(e) {
777
777
  let t = await Z(this.db.prepare("SELECT grant_id, group_id, seed_device_id, worker_device_id, expires_at, created_at, created_by, revoked_at\n FROM coordinator_bootstrap_grants WHERE grant_id = ?").bind(e));
778
- return t ? D(t) : null;
778
+ return t ? O(t) : null;
779
779
  }
780
780
  async listBootstrapGrants(e) {
781
- return (await X(this.db.prepare("SELECT grant_id, group_id, seed_device_id, worker_device_id, expires_at, created_at, created_by, revoked_at\n FROM coordinator_bootstrap_grants WHERE group_id = ?\n ORDER BY created_at DESC, grant_id DESC").bind(e))).map((e) => D(e));
781
+ return (await X(this.db.prepare("SELECT grant_id, group_id, seed_device_id, worker_device_id, expires_at, created_at, created_by, revoked_at\n FROM coordinator_bootstrap_grants WHERE group_id = ?\n ORDER BY created_at DESC, grant_id DESC").bind(e))).map((e) => O(e));
782
782
  }
783
- async revokeBootstrapGrant(e, t = k()) {
783
+ async revokeBootstrapGrant(e, t = M()) {
784
784
  return await Q(this.db.prepare("UPDATE coordinator_bootstrap_grants\n SET revoked_at = COALESCE(revoked_at, ?)\n WHERE grant_id = ?").bind(t, e)) > 0;
785
785
  }
786
786
  async listReciprocalApprovals(e) {
@@ -788,56 +788,56 @@ var $ = class {
788
788
  return (await X(this.db.prepare(`SELECT request_id, group_id, requesting_device_id, requested_device_id, status, created_at, resolved_at
789
789
  FROM coordinator_reciprocal_approvals
790
790
  WHERE group_id = ? AND ${t} = ? AND status = ?
791
- ORDER BY created_at ASC, request_id ASC`).bind(e.groupId, e.deviceId, n))).map((e) => D(e));
791
+ ORDER BY created_at ASC, request_id ASC`).bind(e.groupId, e.deviceId, n))).map((e) => O(e));
792
792
  }
793
793
  async createLegacyTeamCompletion(e, t) {
794
- let [n] = S([e]);
794
+ let [n] = b([e]);
795
795
  if (!n) throw Error("completion_manifest_invalid");
796
796
  let r = await this.getGroup(n);
797
797
  if (!r) throw Error("group_not_found");
798
798
  if (r.archived_at) throw Error("group_archived");
799
- let i = v(t), a = JSON.parse(i);
800
- E(a);
799
+ let i = d(t), a = JSON.parse(i);
800
+ x(a);
801
801
  let o = await Z(this.db.prepare("SELECT manifest_json FROM coordinator_legacy_team_completions\n WHERE group_id = ? AND candidate_ref = ?").bind(n, a.candidate_ref));
802
802
  if (o) {
803
- if (o.manifest_json !== i) throw new w();
803
+ if (o.manifest_json !== i) throw new y();
804
804
  return {
805
805
  status: "existing",
806
- manifest: T(JSON.parse(o.manifest_json))
806
+ manifest: w(JSON.parse(o.manifest_json))
807
807
  };
808
808
  }
809
- let s = await X(this.db.prepare("SELECT DISTINCT\n requested.scope_id,\n scope.authority_type,\n scope.coordinator_id,\n scope.group_id,\n scope.status\n FROM (\n SELECT json_extract(value, '$.scope_id') AS scope_id\n FROM json_each(?, '$.project_mappings')\n ) AS requested\n LEFT JOIN coordinator_scopes AS scope ON scope.scope_id = requested.scope_id").bind(i)), c = y(a, n, s), l = await Q(this.db.prepare("INSERT OR IGNORE INTO coordinator_legacy_team_completions(\n group_id, candidate_ref, manifest_version, manifest_json, completed_at, created_at\n ) SELECT ?, ?, ?, ?, ?, ?\n FROM groups\n WHERE group_id = ? AND archived_at IS NULL\n AND NOT EXISTS (\n SELECT 1\n FROM json_each(?, '$.project_mappings') AS requested\n LEFT JOIN coordinator_scopes AS scope\n ON scope.scope_id = json_extract(requested.value, '$.scope_id')\n AND scope.authority_type = 'coordinator'\n AND scope.coordinator_id = ?\n AND scope.group_id = ?\n AND scope.status = 'active'\n WHERE scope.scope_id IS NULL\n )\n AND NOT EXISTS (\n SELECT 1 FROM enrolled_devices AS enrolled\n WHERE enrolled.group_id = ?\n AND NOT EXISTS (\n SELECT 1 FROM json_each(?, '$.device_decisions') AS requested\n WHERE json_extract(requested.value, '$.device_id') = enrolled.device_id\n AND json_extract(requested.value, '$.key_fingerprint') = enrolled.fingerprint\n AND json_extract(requested.value, '$.enabled') = enrolled.enabled\n )\n )\n AND NOT EXISTS (\n SELECT 1 FROM json_each(?, '$.device_decisions') AS requested\n WHERE json_extract(requested.value, '$.decision') = 'included'\n AND NOT EXISTS (\n SELECT 1 FROM enrolled_devices AS enrolled\n WHERE enrolled.group_id = ?\n AND enrolled.device_id = json_extract(requested.value, '$.device_id')\n AND enrolled.fingerprint = json_extract(requested.value, '$.key_fingerprint')\n AND enrolled.enabled = 1\n )\n )").bind(n, a.candidate_ref, a.version, i, a.completed_at, k(), n, i, c, n, n, i, i, n)), u = await Z(this.db.prepare("SELECT manifest_json FROM coordinator_legacy_team_completions\n WHERE group_id = ? AND candidate_ref = ?").bind(n, a.candidate_ref));
809
+ let s = await X(this.db.prepare("SELECT DISTINCT\n requested.scope_id,\n scope.authority_type,\n scope.coordinator_id,\n scope.group_id,\n scope.status\n FROM (\n SELECT json_extract(value, '$.scope_id') AS scope_id\n FROM json_each(?, '$.project_mappings')\n ) AS requested\n LEFT JOIN coordinator_scopes AS scope ON scope.scope_id = requested.scope_id").bind(i)), c = C(a, n, s), l = await Q(this.db.prepare("INSERT OR IGNORE INTO coordinator_legacy_team_completions(\n group_id, candidate_ref, manifest_version, manifest_json, completed_at, created_at\n ) SELECT ?, ?, ?, ?, ?, ?\n FROM groups\n WHERE group_id = ? AND archived_at IS NULL\n AND NOT EXISTS (\n SELECT 1\n FROM json_each(?, '$.project_mappings') AS requested\n LEFT JOIN coordinator_scopes AS scope\n ON scope.scope_id = json_extract(requested.value, '$.scope_id')\n AND scope.authority_type = 'coordinator'\n AND scope.coordinator_id = ?\n AND scope.group_id = ?\n AND scope.status = 'active'\n WHERE scope.scope_id IS NULL\n )\n AND NOT EXISTS (\n SELECT 1 FROM enrolled_devices AS enrolled\n WHERE enrolled.group_id = ?\n AND NOT EXISTS (\n SELECT 1 FROM json_each(?, '$.device_decisions') AS requested\n WHERE json_extract(requested.value, '$.device_id') = enrolled.device_id\n AND json_extract(requested.value, '$.key_fingerprint') = enrolled.fingerprint\n AND json_extract(requested.value, '$.enabled') = enrolled.enabled\n )\n )\n AND NOT EXISTS (\n SELECT 1 FROM json_each(?, '$.device_decisions') AS requested\n WHERE json_extract(requested.value, '$.decision') = 'included'\n AND NOT EXISTS (\n SELECT 1 FROM enrolled_devices AS enrolled\n WHERE enrolled.group_id = ?\n AND enrolled.device_id = json_extract(requested.value, '$.device_id')\n AND enrolled.fingerprint = json_extract(requested.value, '$.key_fingerprint')\n AND enrolled.enabled = 1\n )\n )").bind(n, a.candidate_ref, a.version, i, a.completed_at, M(), n, i, c, n, n, i, i, n)), u = await Z(this.db.prepare("SELECT manifest_json FROM coordinator_legacy_team_completions\n WHERE group_id = ? AND candidate_ref = ?").bind(n, a.candidate_ref));
810
810
  if (!u) {
811
811
  let e = await this.getGroup(n);
812
812
  if (!e) throw Error("group_not_found");
813
813
  if (e.archived_at) throw Error("group_archived");
814
814
  let t = await X(this.db.prepare("SELECT DISTINCT\n requested.scope_id,\n scope.authority_type,\n scope.coordinator_id,\n scope.group_id,\n scope.status\n FROM (\n SELECT json_extract(value, '$.scope_id') AS scope_id\n FROM json_each(?, '$.project_mappings')\n ) AS requested\n LEFT JOIN coordinator_scopes AS scope ON scope.scope_id = requested.scope_id").bind(i));
815
- throw y(a, n, t), Error("completion_manifest_unavailable");
815
+ throw C(a, n, t), Error("completion_manifest_unavailable");
816
816
  }
817
- if (u.manifest_json !== i) throw new w();
817
+ if (u.manifest_json !== i) throw new y();
818
818
  return {
819
819
  status: l === 1 ? "created" : "existing",
820
- manifest: T(JSON.parse(u.manifest_json))
820
+ manifest: w(JSON.parse(u.manifest_json))
821
821
  };
822
822
  }
823
- async getLegacyTeamCompletion(e, t) {
824
- let [n] = S([e]), r = g(t);
825
- if (!n) throw Error("completion_manifest_invalid");
826
- let i = await Z(this.db.prepare("SELECT manifest_json FROM coordinator_legacy_team_completions\n WHERE group_id = ? AND candidate_ref = ?").bind(n, r));
827
- return i ? T(JSON.parse(i.manifest_json)) : null;
823
+ async getLegacyTeamCompletion(t, n) {
824
+ let [r] = b([t]), i = e(n);
825
+ if (!r) throw Error("completion_manifest_invalid");
826
+ let a = await Z(this.db.prepare("SELECT manifest_json FROM coordinator_legacy_team_completions\n WHERE group_id = ? AND candidate_ref = ?").bind(r, i));
827
+ return a ? w(JSON.parse(a.manifest_json)) : null;
828
828
  }
829
- async listLegacyTeamCompletions(t) {
830
- let n = S(t);
831
- if (n.length === 0) return [];
832
- let r = n.map(() => "?").join(", "), i = await Z(this.db.prepare(`SELECT
829
+ async listLegacyTeamCompletions(e) {
830
+ let t = b(e);
831
+ if (t.length === 0) return [];
832
+ let n = t.map(() => "?").join(", "), r = await Z(this.db.prepare(`SELECT
833
833
  COUNT(*) AS record_count,
834
834
  COALESCE(SUM(
835
835
  LENGTH(CAST(group_id AS BLOB)) + LENGTH(CAST(manifest_json AS BLOB))
836
836
  ), 0) AS batch_bytes,
837
837
  COALESCE(MAX(LENGTH(CAST(manifest_json AS BLOB))), 0) AS max_manifest_bytes
838
838
  FROM coordinator_legacy_team_completions
839
- WHERE group_id IN (${r})`).bind(...n));
840
- if (!i || i.record_count > 500 || i.batch_bytes > 375e5 || i.max_manifest_bytes > 15e5) throw Error("completion_results_too_large");
839
+ WHERE group_id IN (${n})`).bind(...t));
840
+ if (!r || r.record_count > 500 || r.batch_bytes > 375e5 || r.max_manifest_bytes > 15e5) throw Error("completion_results_too_large");
841
841
  let a = await X(this.db.prepare(`WITH completion_stats AS (
842
842
  SELECT
843
843
  COUNT(*) AS record_count,
@@ -846,27 +846,27 @@ var $ = class {
846
846
  ), 0) AS batch_bytes,
847
847
  COALESCE(MAX(LENGTH(CAST(manifest_json AS BLOB))), 0) AS max_manifest_bytes
848
848
  FROM coordinator_legacy_team_completions
849
- WHERE group_id IN (${r})
849
+ WHERE group_id IN (${n})
850
850
  )
851
851
  SELECT completions.group_id, completions.manifest_json
852
852
  FROM coordinator_legacy_team_completions AS completions
853
853
  CROSS JOIN completion_stats
854
- WHERE completions.group_id IN (${r})
854
+ WHERE completions.group_id IN (${n})
855
855
  AND completion_stats.record_count <= 500
856
- AND completion_stats.batch_bytes <= ${h}
857
- AND completion_stats.max_manifest_bytes <= ${e}
858
- AND LENGTH(completions.manifest_json) <= ${e}
859
- AND LENGTH(CAST(completions.manifest_json AS BLOB)) <= ${e}
856
+ AND completion_stats.batch_bytes <= ${i}
857
+ AND completion_stats.max_manifest_bytes <= ${S}
858
+ AND LENGTH(completions.manifest_json) <= ${S}
859
+ AND LENGTH(CAST(completions.manifest_json AS BLOB)) <= ${S}
860
860
  ORDER BY completions.group_id, completions.completed_at, completions.candidate_ref
861
- LIMIT 501`).bind(...n, ...n));
862
- if (a.length === 0 && i.record_count > 0 || a.length > 500 || a.reduce((e, t) => e + new TextEncoder().encode(t.group_id).byteLength + new TextEncoder().encode(t.manifest_json).byteLength, 0) > 375e5) throw Error("completion_results_too_large");
861
+ LIMIT 501`).bind(...t, ...t));
862
+ if (a.length === 0 && r.record_count > 0 || a.length > 500 || a.reduce((e, t) => e + new TextEncoder().encode(t.group_id).byteLength + new TextEncoder().encode(t.manifest_json).byteLength, 0) > 375e5) throw Error("completion_results_too_large");
863
863
  return a.map((e) => ({
864
864
  group_id: e.group_id,
865
- manifest: T(JSON.parse(e.manifest_json))
865
+ manifest: w(JSON.parse(e.manifest_json))
866
866
  }));
867
867
  }
868
868
  async upsertPresence(e) {
869
- let t = /* @__PURE__ */ new Date(), n = new Date(t.getTime() + e.ttlS * 1e3).toISOString(), r = O([], e.addresses);
869
+ let t = /* @__PURE__ */ new Date(), n = new Date(t.getTime() + e.ttlS * 1e3).toISOString(), r = j([], e.addresses);
870
870
  return await this.db.prepare("INSERT INTO presence_records(group_id, device_id, addresses_json, last_seen_at, expires_at, capabilities_json)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(group_id, device_id) DO UPDATE SET\n addresses_json = excluded.addresses_json,\n last_seen_at = excluded.last_seen_at,\n expires_at = excluded.expires_at,\n capabilities_json = excluded.capabilities_json").bind(e.groupId, e.deviceId, JSON.stringify(r), t.toISOString(), n, JSON.stringify(e.capabilities ?? {})).run(), {
871
871
  group_id: e.groupId,
872
872
  device_id: e.deviceId,
@@ -875,14 +875,14 @@ var $ = class {
875
875
  };
876
876
  }
877
877
  async listGroupPeers(e, t) {
878
- let n = k();
878
+ let n = M();
879
879
  return (await X(this.db.prepare("SELECT enrolled_devices.device_id, enrolled_devices.public_key, enrolled_devices.fingerprint, enrolled_devices.display_name,\n presence_records.addresses_json, presence_records.last_seen_at, presence_records.expires_at,\n presence_records.capabilities_json\n FROM enrolled_devices\n LEFT JOIN presence_records\n ON presence_records.group_id = enrolled_devices.group_id\n AND presence_records.device_id = enrolled_devices.device_id\n WHERE enrolled_devices.group_id = ?\n AND enrolled_devices.enabled = 1\n AND enrolled_devices.device_id != ?\n ORDER BY enrolled_devices.device_id ASC").bind(e, t))).map((e) => {
880
880
  let t = String(e.expires_at ?? "").trim(), r = !0;
881
881
  if (t) {
882
882
  let e = new Date(t);
883
883
  r = Number.isNaN(e.getTime()) || e.toISOString() <= n;
884
884
  }
885
- let i = r ? [] : O([], JSON.parse(String(e.addresses_json ?? "[]")));
885
+ let i = r ? [] : j([], JSON.parse(String(e.addresses_json ?? "[]")));
886
886
  return {
887
887
  device_id: String(e.device_id ?? ""),
888
888
  public_key: String(e.public_key ?? ""),
@@ -904,13 +904,13 @@ function de(e) {
904
904
  adminSecret: () => String(e.adminSecret ?? "").trim() || null,
905
905
  now: e.now ?? (() => (/* @__PURE__ */ new Date()).toISOString())
906
906
  };
907
- return ee({
907
+ return te({
908
908
  storeFactory: () => new $(e.db),
909
909
  runtime: t,
910
910
  requestVerifier: e.requestVerifier
911
911
  });
912
912
  }
913
913
  //#endregion
914
- export { p as COORDINATOR_LEGACY_TEAM_COMPLETION_CONFLICT, h as COORDINATOR_LEGACY_TEAM_COMPLETION_MAX_BATCH_BYTES, c as COORDINATOR_LEGACY_TEAM_COMPLETION_MAX_BATCH_RESPONSE_BYTES, e as COORDINATOR_LEGACY_TEAM_COMPLETION_MAX_BYTES, _ as COORDINATOR_LEGACY_TEAM_COMPLETION_MAX_GROUPS, te as COORDINATOR_LEGACY_TEAM_COMPLETION_MAX_RECORDS, x as COORDINATOR_LEGACY_TEAM_COMPLETION_VERSION, w as CoordinatorLegacyTeamCompletionConflictError, $ as D1CoordinatorStore, b as DEFAULT_TIME_WINDOW_S, v as canonicalCoordinatorLegacyTeamCompletionManifestJson, de as createD1CoordinatorApp, g as normalizeCoordinatorLegacyTeamCompletionCandidateRef, S as normalizeCoordinatorLegacyTeamCompletionGroupIds, T as normalizeCoordinatorLegacyTeamCompletionManifest };
914
+ export { g as COORDINATOR_LEGACY_TEAM_COMPLETION_CONFLICT, i as COORDINATOR_LEGACY_TEAM_COMPLETION_MAX_BATCH_BYTES, c as COORDINATOR_LEGACY_TEAM_COMPLETION_MAX_BATCH_RESPONSE_BYTES, S as COORDINATOR_LEGACY_TEAM_COMPLETION_MAX_BYTES, s as COORDINATOR_LEGACY_TEAM_COMPLETION_MAX_GROUPS, v as COORDINATOR_LEGACY_TEAM_COMPLETION_MAX_RECORDS, _ as COORDINATOR_LEGACY_TEAM_COMPLETION_VERSION, y as CoordinatorLegacyTeamCompletionConflictError, $ as D1CoordinatorStore, ee as DEFAULT_TIME_WINDOW_S, d as canonicalCoordinatorLegacyTeamCompletionManifestJson, de as createD1CoordinatorApp, e as normalizeCoordinatorLegacyTeamCompletionCandidateRef, b as normalizeCoordinatorLegacyTeamCompletionGroupIds, w as normalizeCoordinatorLegacyTeamCompletionManifest };
915
915
 
916
916
  //# sourceMappingURL=cloudflare-coordinator.js.map