@codemem/core 0.40.0-alpha.1 → 0.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dist/attribution-assessment.d.ts +78 -0
  2. package/dist/attribution-assessment.d.ts.map +1 -0
  3. package/dist/attribution-diagnostics.d.ts +53 -0
  4. package/dist/attribution-diagnostics.d.ts.map +1 -0
  5. package/dist/better-sqlite-coordinator-store.d.ts.map +1 -1
  6. package/dist/coordinator-actions.d.ts +46 -0
  7. package/dist/coordinator-actions.d.ts.map +1 -1
  8. package/dist/coordinator-api-DJVH2jw5.js +21107 -0
  9. package/dist/coordinator-api-DJVH2jw5.js.map +1 -0
  10. package/dist/coordinator-api.d.ts.map +1 -1
  11. package/dist/coordinator-enrollment-reconciler.d.ts +24 -0
  12. package/dist/coordinator-enrollment-reconciler.d.ts.map +1 -0
  13. package/dist/coordinator-enrollment-reconciliation-issues.d.ts +34 -0
  14. package/dist/coordinator-enrollment-reconciliation-issues.d.ts.map +1 -0
  15. package/dist/coordinator-invites.d.ts +1 -0
  16. package/dist/coordinator-invites.d.ts.map +1 -1
  17. package/dist/coordinator-runtime.d.ts +14 -0
  18. package/dist/coordinator-runtime.d.ts.map +1 -1
  19. package/dist/coordinator-store-contract.d.ts +7 -0
  20. package/dist/coordinator-store-contract.d.ts.map +1 -1
  21. package/dist/coordinator-store-test-harness.d.ts +1 -0
  22. package/dist/coordinator-store-test-harness.d.ts.map +1 -1
  23. package/dist/d1-coordinator-store.d.ts.map +1 -1
  24. package/dist/db.d.ts +2 -2
  25. package/dist/db.d.ts.map +1 -1
  26. package/dist/embeddings.d.ts +2 -0
  27. package/dist/embeddings.d.ts.map +1 -1
  28. package/dist/extraction-benchmarks.d.ts +2 -2
  29. package/dist/extraction-benchmarks.d.ts.map +1 -1
  30. package/dist/extraction-model-pricing.d.ts.map +1 -1
  31. package/dist/extraction-replay.d.ts +7 -1
  32. package/dist/extraction-replay.d.ts.map +1 -1
  33. package/dist/extraction-tier-routing.d.ts.map +1 -1
  34. package/dist/index.d.ts +17 -5
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +5414 -18791
  37. package/dist/index.js.map +1 -1
  38. package/dist/ingest-pipeline.d.ts.map +1 -1
  39. package/dist/ingest-prompts.d.ts +5 -0
  40. package/dist/ingest-prompts.d.ts.map +1 -1
  41. package/dist/ingest-xml-parser.d.ts +4 -0
  42. package/dist/ingest-xml-parser.d.ts.map +1 -1
  43. package/dist/internal/cloudflare-coordinator.js +358 -318
  44. package/dist/internal/cloudflare-coordinator.js.map +1 -1
  45. package/dist/maintenance/relink.d.ts +1 -1
  46. package/dist/maintenance/relink.d.ts.map +1 -1
  47. package/dist/observer-client.d.ts.map +1 -1
  48. package/dist/observer-config.d.ts.map +1 -1
  49. package/dist/outcome-evidence.d.ts +193 -0
  50. package/dist/outcome-evidence.d.ts.map +1 -0
  51. package/dist/pack.d.ts +8 -0
  52. package/dist/pack.d.ts.map +1 -1
  53. package/dist/prompt-pack-ledger.d.ts +21 -0
  54. package/dist/prompt-pack-ledger.d.ts.map +1 -0
  55. package/dist/raw-event-flush.d.ts.map +1 -1
  56. package/dist/recipient-policy-onboarding.d.ts.map +1 -1
  57. package/dist/recipient-policy-reconciler.d.ts +15 -1
  58. package/dist/recipient-policy-reconciler.d.ts.map +1 -1
  59. package/dist/recipient-policy-reconciliation.d.ts +22 -0
  60. package/dist/recipient-policy-reconciliation.d.ts.map +1 -1
  61. package/dist/retrieval-ledger.d.ts +216 -0
  62. package/dist/retrieval-ledger.d.ts.map +1 -0
  63. package/dist/retrieval-surface-ledger.d.ts +17 -0
  64. package/dist/retrieval-surface-ledger.d.ts.map +1 -0
  65. package/dist/schema-bootstrap.d.ts +2 -0
  66. package/dist/schema-bootstrap.d.ts.map +1 -1
  67. package/dist/schema.d.ts +8747 -3831
  68. package/dist/schema.d.ts.map +1 -1
  69. package/dist/scope-membership-cache.d.ts.map +1 -1
  70. package/dist/share-operation-lifecycle.d.ts +2 -0
  71. package/dist/share-operation-lifecycle.d.ts.map +1 -1
  72. package/dist/share-operation.d.ts +2 -0
  73. package/dist/share-operation.d.ts.map +1 -1
  74. package/dist/store.d.ts +3 -0
  75. package/dist/store.d.ts.map +1 -1
  76. package/dist/sync-daemon.d.ts.map +1 -1
  77. package/dist/sync-replication.d.ts.map +1 -1
  78. package/dist/test-schema.generated.d.ts +1 -1
  79. package/dist/test-schema.generated.d.ts.map +1 -1
  80. package/package.json +1 -1
  81. package/dist/coordinator-api-Btb6CEhw.js +0 -2818
  82. package/dist/coordinator-api-Btb6CEhw.js.map +0 -1
@@ -1,10 +1,29 @@
1
- import { A as e, D as t, F as n, M as r, N as i, O as a, P as o, S as s, b as c, h as l, j as u, k as d, n as f, t as p, v as m } from "../coordinator-api-Btb6CEhw.js";
1
+ import { Qa as e, Xa as t, ao as n, co as r, do as i, eo as a, fo as o, lo as s, ma as c, oo as l, po as u, qa as d, so as f, t as p, uo as m } from "../coordinator-api-DJVH2jw5.js";
2
2
  //#region src/d1-coordinator-store.ts
3
3
  function h(e) {
4
4
  if (e == null) throw Error("expected row");
5
5
  return e;
6
6
  }
7
7
  function g(e) {
8
+ let { presence_capabilities_json: t, presence_expires_at: n, ...r } = h(e);
9
+ if (typeof n != "string" || typeof t != "string") return r;
10
+ try {
11
+ let e = JSON.parse(t);
12
+ if (!e || typeof e != "object" || Array.isArray(e)) return r;
13
+ let i = e;
14
+ return {
15
+ ...r,
16
+ presence_expires_at: n,
17
+ presence_capabilities: {
18
+ sync_capability: i.sync_capability,
19
+ sync_features: i.sync_features
20
+ }
21
+ };
22
+ } catch {
23
+ return r;
24
+ }
25
+ }
26
+ function _(e) {
8
27
  let t = e.trim();
9
28
  if (!t) return "";
10
29
  let n = t.includes("://") ? t : `http://${t}`;
@@ -15,7 +34,7 @@ function g(e) {
15
34
  return "";
16
35
  }
17
36
  }
18
- function _(e) {
37
+ function v(e) {
19
38
  if (!e) return "";
20
39
  try {
21
40
  let t = new URL(e), n = t.hostname.toLowerCase();
@@ -23,18 +42,18 @@ function _(e) {
23
42
  } catch {}
24
43
  return e;
25
44
  }
26
- function v(e, t) {
45
+ function y(e, t) {
27
46
  let n = [], r = /* @__PURE__ */ new Set();
28
47
  for (let i of [...e, ...t]) {
29
- let e = g(i), t = _(e);
48
+ let e = _(i), t = v(e);
30
49
  !e || r.has(t) || (r.add(t), n.push(e));
31
50
  }
32
51
  return n;
33
52
  }
34
- function y() {
53
+ function b() {
35
54
  return (/* @__PURE__ */ new Date()).toISOString();
36
55
  }
37
- function b(e, t) {
56
+ function x(e, t) {
38
57
  return e <= t ? {
39
58
  low: e,
40
59
  high: t
@@ -43,22 +62,22 @@ function b(e, t) {
43
62
  high: e
44
63
  };
45
64
  }
46
- function x(e) {
65
+ function S(e) {
47
66
  return e instanceof Error && /unique|constraint/i.test(e.message);
48
67
  }
49
- function S(e) {
68
+ function C(e) {
50
69
  let t = new Uint8Array(e);
51
70
  globalThis.crypto.getRandomValues(t);
52
71
  let n = [];
53
72
  for (let e of t) n.push("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"[e % 64] ?? "A");
54
73
  return n.join("");
55
74
  }
56
- async function C(e) {
75
+ async function w(e) {
57
76
  let t = await globalThis.crypto.subtle.digest("SHA-256", new TextEncoder().encode(e));
58
77
  return Array.from(new Uint8Array(t), (e) => e.toString(16).padStart(2, "0")).join("");
59
78
  }
60
- var w = "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", T = "group_id, device_id, public_key, fingerprint, identity_id, display_name, enabled, created_at";
61
- function E(e) {
79
+ var T = "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", E = "group_id, device_id, public_key, fingerprint, identity_id, display_name, enabled, created_at", D = "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 O(e) {
62
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;
63
82
  if (!t || !n || !r || !i) throw Error("groupId, seedDeviceId, workerDeviceId, and expiresAt are required.");
64
83
  return {
@@ -69,194 +88,194 @@ function E(e) {
69
88
  createdBy: a
70
89
  };
71
90
  }
72
- function D(e) {
91
+ function k(e) {
73
92
  return e?.trim() || null;
74
93
  }
75
- async function O(e) {
76
- let t = e.inviteKind ?? (D(e.operationId) ? "project_share" : "legacy_enrollment"), n = D(e.policyTeamId), r = D(e.targetIdentityId), i = D(e.reviewedPreviewDigest);
94
+ async function A(e) {
95
+ let n = e.inviteKind ?? (k(e.operationId) ? "project_share" : "legacy_enrollment"), r = k(e.policyTeamId), i = k(e.targetIdentityId), o = k(e.reviewedPreviewDigest);
77
96
  if (![
78
97
  "legacy_enrollment",
79
98
  "project_share",
80
99
  "team_member",
81
100
  "add_device"
82
- ].includes(t)) throw Error("inviteKind is invalid.");
83
- 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.");
84
- if (i && !/^[a-f0-9]{64}$/u.test(i)) throw Error("reviewedPreviewDigest must be a SHA-256 digest.");
85
- if (t === "project_share") {
86
- if (!D(e.operationId)) throw Error("project_share invite requires operationId.");
87
- if (n || r || i) throw Error("recipient invite metadata requires a recipient invite kind.");
88
- } else if (t === "legacy_enrollment") {
89
- if (D(e.operationId)) throw Error("legacy_enrollment invite cannot reference an operation.");
90
- if (n || r || i) throw Error("recipient invite metadata requires a recipient invite kind.");
91
- } else if (t === "team_member") {
92
- if (!n || !i || r || D(e.operationId)) throw Error("team_member invite metadata is invalid.");
93
- } else if (t === "add_device" && (!r || !i || n || D(e.operationId))) throw Error("add_device invite metadata is invalid.");
101
+ ].includes(n)) throw Error("inviteKind is invalid.");
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 (o && !/^[a-f0-9]{64}$/u.test(o)) throw Error("reviewedPreviewDigest must be a SHA-256 digest.");
104
+ if (n === "project_share") {
105
+ if (!k(e.operationId)) throw Error("project_share invite requires operationId.");
106
+ if (r || i || o) throw Error("recipient invite metadata requires a recipient invite kind.");
107
+ } else if (n === "legacy_enrollment") {
108
+ if (k(e.operationId)) throw Error("legacy_enrollment invite cannot reference an operation.");
109
+ if (r || i || o) throw Error("recipient invite metadata requires a recipient invite kind.");
110
+ } else if (n === "team_member") {
111
+ if (!r || !o || i || k(e.operationId)) throw Error("team_member invite metadata is invalid.");
112
+ } else if (n === "add_device" && (!i || !o || r || k(e.operationId))) throw Error("add_device invite metadata is invalid.");
94
113
  if (!(e.reviewedIntent !== void 0 && e.reviewedIntent !== null)) {
95
- if (t === "team_member" || t === "add_device") throw Error("recipient_invite_review_unavailable");
114
+ if (n === "team_member" || n === "add_device") throw Error("recipient_invite_review_unavailable");
96
115
  return {
97
- inviteKind: t,
98
- policyTeamId: n,
99
- targetIdentityId: r,
100
- reviewedPreviewDigest: i,
116
+ inviteKind: n,
117
+ policyTeamId: r,
118
+ targetIdentityId: i,
119
+ reviewedPreviewDigest: o,
101
120
  reviewedIntentJson: null
102
121
  };
103
122
  }
104
- let a;
105
- if (t === "team_member" && n && i) a = {
123
+ let s;
124
+ if (n === "team_member" && r && o) s = {
106
125
  kind: "team_member",
107
- policyTeamId: n
126
+ policyTeamId: r
108
127
  };
109
- else if (t === "add_device" && r && i) a = {
128
+ else if (n === "add_device" && i && o) s = {
110
129
  kind: "add_device",
111
- targetIdentityId: r
130
+ targetIdentityId: i
112
131
  };
113
132
  else throw Error("recipient invite metadata requires a recipient invite kind.");
114
- return await s(e.reviewedIntent, {
115
- target: a,
116
- digest: i
133
+ return await a(e.reviewedIntent, {
134
+ target: s,
135
+ digest: o
117
136
  }), {
118
- inviteKind: t,
119
- policyTeamId: n,
120
- targetIdentityId: r,
121
- reviewedPreviewDigest: i,
122
- reviewedIntentJson: m(e.reviewedIntent, a)
137
+ inviteKind: n,
138
+ policyTeamId: r,
139
+ targetIdentityId: i,
140
+ reviewedPreviewDigest: o,
141
+ reviewedIntentJson: t(e.reviewedIntent, s)
123
142
  };
124
143
  }
125
- async function k(e) {
126
- if (e.invite_kind === "team_member") {
127
- if (!e.policy_team_id || !t(e.assigned_identity_id) || !e.reviewed_preview_digest) throw Error("invite_invalid");
128
- let n = await c(e.reviewed_intent_json, {
144
+ async function j(t) {
145
+ if (t.invite_kind === "team_member") {
146
+ if (!t.policy_team_id || !n(t.assigned_identity_id) || !t.reviewed_preview_digest) throw Error("invite_invalid");
147
+ let r = await e(t.reviewed_intent_json, {
129
148
  target: {
130
149
  kind: "team_member",
131
- policyTeamId: e.policy_team_id
150
+ policyTeamId: t.policy_team_id
132
151
  },
133
- digest: e.reviewed_preview_digest
152
+ digest: t.reviewed_preview_digest
134
153
  });
135
154
  return {
136
155
  kind: "team_member",
137
- invite: e,
138
- policy_team_id: e.policy_team_id,
139
- assigned_identity_id: e.assigned_identity_id,
140
- reviewed_preview_digest: e.reviewed_preview_digest,
141
- reviewed_intent: n,
142
- bound: !!e.consumed_at
156
+ invite: t,
157
+ policy_team_id: t.policy_team_id,
158
+ assigned_identity_id: t.assigned_identity_id,
159
+ reviewed_preview_digest: t.reviewed_preview_digest,
160
+ reviewed_intent: r,
161
+ bound: !!t.consumed_at
143
162
  };
144
163
  }
145
- if (e.invite_kind === "add_device") {
146
- if (!e.target_identity_id || !e.reviewed_preview_digest) throw Error("invite_invalid");
147
- let t = await c(e.reviewed_intent_json, {
164
+ if (t.invite_kind === "add_device") {
165
+ if (!t.target_identity_id || !t.reviewed_preview_digest) throw Error("invite_invalid");
166
+ let n = await e(t.reviewed_intent_json, {
148
167
  target: {
149
168
  kind: "add_device",
150
- targetIdentityId: e.target_identity_id
169
+ targetIdentityId: t.target_identity_id
151
170
  },
152
- digest: e.reviewed_preview_digest
171
+ digest: t.reviewed_preview_digest
153
172
  });
154
173
  return {
155
174
  kind: "add_device",
156
- invite: e,
157
- target_identity_id: e.target_identity_id,
158
- reviewed_preview_digest: e.reviewed_preview_digest,
159
- reviewed_intent: t,
160
- bound: !!e.consumed_at
175
+ invite: t,
176
+ target_identity_id: t.target_identity_id,
177
+ reviewed_preview_digest: t.reviewed_preview_digest,
178
+ reviewed_intent: n,
179
+ bound: !!t.consumed_at
161
180
  };
162
181
  }
163
182
  return null;
164
183
  }
165
- function A(e, t = 0) {
184
+ function M(e, t = 0) {
166
185
  if (e == null) return t;
167
186
  if (!Number.isFinite(e) || e < 0) throw Error("membershipEpoch must be non-negative.");
168
187
  return Math.trunc(e);
169
188
  }
170
- function j(e) {
171
- let t = D(e.scopeId), n = D(e.label);
189
+ function N(e) {
190
+ let t = k(e.scopeId), n = k(e.label);
172
191
  if (!t || !n) throw Error("scopeId and label are required.");
173
192
  return {
174
193
  scopeId: t,
175
194
  label: n,
176
- kind: D(e.kind) ?? "user",
177
- authorityType: D(e.authorityType) ?? "coordinator",
178
- coordinatorId: D(e.coordinatorId),
179
- groupId: D(e.groupId),
180
- manifestIssuerDeviceId: D(e.manifestIssuerDeviceId),
181
- membershipEpoch: A(e.membershipEpoch),
182
- manifestHash: D(e.manifestHash),
183
- status: D(e.status) ?? "active"
195
+ kind: k(e.kind) ?? "user",
196
+ authorityType: k(e.authorityType) ?? "coordinator",
197
+ coordinatorId: k(e.coordinatorId),
198
+ groupId: k(e.groupId),
199
+ manifestIssuerDeviceId: k(e.manifestIssuerDeviceId),
200
+ membershipEpoch: M(e.membershipEpoch),
201
+ manifestHash: k(e.manifestHash),
202
+ status: k(e.status) ?? "active"
184
203
  };
185
204
  }
186
- function M(e, t, n) {
205
+ function P(e, t, n) {
187
206
  if (e === void 0) return t;
188
- let r = D(e);
207
+ let r = k(e);
189
208
  if (!r) throw Error(`${n} must not be empty.`);
190
209
  return r;
191
210
  }
192
- function N(e, t) {
193
- return e === void 0 ? t : D(e);
211
+ function F(e, t) {
212
+ return e === void 0 ? t : k(e);
194
213
  }
195
- function P(e, t) {
196
- let n = D(e.scopeId);
214
+ function I(e, t) {
215
+ let n = k(e.scopeId);
197
216
  if (!n) throw Error("scopeId is required.");
198
- let r = e.membershipEpoch == null ? null : A(e.membershipEpoch);
217
+ let r = e.membershipEpoch == null ? null : M(e.membershipEpoch);
199
218
  if (r != null && r < t.membership_epoch) throw Error("membershipEpoch must not move backwards.");
200
219
  return {
201
220
  scopeId: n,
202
- label: M(e.label, t.label, "label"),
203
- kind: M(e.kind, t.kind, "kind"),
204
- authorityType: M(e.authorityType, t.authority_type, "authorityType"),
205
- coordinatorId: N(e.coordinatorId, t.coordinator_id),
206
- groupId: N(e.groupId, t.group_id),
207
- manifestIssuerDeviceId: N(e.manifestIssuerDeviceId, t.manifest_issuer_device_id),
221
+ label: P(e.label, t.label, "label"),
222
+ kind: P(e.kind, t.kind, "kind"),
223
+ authorityType: P(e.authorityType, t.authority_type, "authorityType"),
224
+ coordinatorId: F(e.coordinatorId, t.coordinator_id),
225
+ groupId: F(e.groupId, t.group_id),
226
+ manifestIssuerDeviceId: F(e.manifestIssuerDeviceId, t.manifest_issuer_device_id),
208
227
  membershipEpoch: r ?? t.membership_epoch,
209
- manifestHash: N(e.manifestHash, t.manifest_hash),
210
- status: M(e.status, t.status, "status")
228
+ manifestHash: F(e.manifestHash, t.manifest_hash),
229
+ status: P(e.status, t.status, "status")
211
230
  };
212
231
  }
213
- function F(t, n, r) {
214
- let i = D(t.scopeId), a = D(t.deviceId);
232
+ function L(e, t, n) {
233
+ let i = k(e.scopeId), a = k(e.deviceId);
215
234
  if (!i || !a) throw Error("scopeId and deviceId are required.");
216
- let o = D(t.coordinatorId), s = D(t.groupId);
217
- if (o && o !== n?.coordinator_id) throw Error("membership coordinatorId must match the scope coordinatorId.");
218
- if (s && s !== n?.group_id) throw new e("scope_group_mismatch");
219
- let c = t.membershipEpoch == null ? null : A(t.membershipEpoch), l = n?.membership_epoch ?? 0;
235
+ let o = k(e.coordinatorId), s = k(e.groupId);
236
+ if (o && o !== t?.coordinator_id) throw Error("membership coordinatorId must match the scope coordinatorId.");
237
+ if (s && s !== t?.group_id) throw new r("scope_group_mismatch");
238
+ let c = e.membershipEpoch == null ? null : M(e.membershipEpoch), l = t?.membership_epoch ?? 0;
220
239
  if (c != null && c < l) throw Error("membershipEpoch must not be lower than the scope membershipEpoch.");
221
- if (c != null && r && c < (r.status === "revoked" ? r.membership_epoch + 1 : r.membership_epoch)) throw Error("membershipEpoch must not move backwards.");
222
- let u = c ?? (r ? Math.max(l, r.membership_epoch + +(r.status === "revoked")) : l);
240
+ if (c != null && n && c < (n.status === "revoked" ? n.membership_epoch + 1 : n.membership_epoch)) throw Error("membershipEpoch must not move backwards.");
241
+ let u = c ?? (n ? Math.max(l, n.membership_epoch + +(n.status === "revoked")) : l);
223
242
  return {
224
243
  scopeId: i,
225
244
  deviceId: a,
226
- role: D(t.role) ?? "member",
245
+ role: k(e.role) ?? "member",
227
246
  membershipEpoch: u,
228
- coordinatorId: n?.coordinator_id ?? null,
229
- groupId: n?.group_id ?? null,
230
- manifestIssuerDeviceId: D(t.manifestIssuerDeviceId) ?? n?.manifest_issuer_device_id ?? null,
231
- manifestHash: D(t.manifestHash) ?? n?.manifest_hash ?? null,
232
- signedManifestJson: D(t.signedManifestJson),
233
- actorType: D(t.actorType),
234
- actorId: D(t.actorId)
247
+ coordinatorId: t?.coordinator_id ?? null,
248
+ groupId: t?.group_id ?? null,
249
+ manifestIssuerDeviceId: k(e.manifestIssuerDeviceId) ?? t?.manifest_issuer_device_id ?? null,
250
+ manifestHash: k(e.manifestHash) ?? t?.manifest_hash ?? null,
251
+ signedManifestJson: k(e.signedManifestJson),
252
+ actorType: k(e.actorType),
253
+ actorId: k(e.actorId)
235
254
  };
236
255
  }
237
- function I(e) {
256
+ function R(e) {
238
257
  return e == null || !Number.isFinite(e) ? 100 : Math.max(1, Math.min(1e3, Math.trunc(e)));
239
258
  }
240
- function L(e, t) {
259
+ function z(e, t) {
241
260
  return e.prepare("INSERT INTO coordinator_scope_membership_audit_log(\n effect_id, action, scope_id, device_id, role, status, membership_epoch,\n previous_role, previous_status, previous_membership_epoch,\n coordinator_id, group_id, actor_type, actor_id, manifest_hash, created_at\n )\n SELECT receipt.effect_id, ?, membership.scope_id, membership.device_id, membership.role, membership.status,\n membership.membership_epoch, ?, ?, ?, membership.coordinator_id, membership.group_id,\n ?, ?, membership.manifest_hash, ?\n FROM (SELECT 1 WHERE changes() > 0) AS required\n JOIN coordinator_scope_membership_effect_receipts AS receipt\n ON receipt.effect_id = ? AND receipt.action = ? AND receipt.request_json = ?\n AND receipt.outcome_applied = 1\n LEFT JOIN coordinator_scope_memberships AS membership\n ON membership.scope_id = ?\n AND membership.device_id = ?\n AND membership.status = ?\n AND membership.membership_epoch = ?\n AND membership.updated_at = ?").bind(t.action, t.previous?.role ?? null, t.previous?.status ?? null, t.previous?.membership_epoch ?? null, t.actorType, t.actorId, t.createdAt, t.effectId, t.action, t.requestJson, t.scopeId, t.deviceId, t.status, t.membershipEpoch, t.updatedAt);
242
261
  }
243
- async function R(e, t) {
244
- return await G(e.prepare("SELECT effect_id, action, request_json, outcome_applied, scope_id, device_id,\n role, status, membership_epoch, coordinator_id, group_id, manifest_issuer_device_id,\n manifest_hash, signed_manifest_json, updated_at, created_at\n FROM coordinator_scope_membership_effect_receipts WHERE effect_id = ?").bind(t));
262
+ async function B(e, t) {
263
+ return await q(e.prepare("SELECT effect_id, action, request_json, outcome_applied, scope_id, device_id,\n role, status, membership_epoch, coordinator_id, group_id, manifest_issuer_device_id,\n manifest_hash, signed_manifest_json, updated_at, created_at\n FROM coordinator_scope_membership_effect_receipts WHERE effect_id = ?").bind(t));
245
264
  }
246
- function z(e, t) {
265
+ function V(e, t) {
247
266
  return e.prepare("INSERT INTO coordinator_scope_membership_effect_receipts(\n effect_id, action, request_json, outcome_applied, scope_id, device_id,\n role, status, membership_epoch, coordinator_id, group_id, manifest_issuer_device_id,\n manifest_hash, signed_manifest_json, updated_at, created_at\n )\n SELECT ?, 'grant', ?, 1, membership.scope_id, membership.device_id,\n membership.role, membership.status, membership.membership_epoch,\n membership.coordinator_id, membership.group_id, membership.manifest_issuer_device_id,\n membership.manifest_hash, membership.signed_manifest_json, membership.updated_at, ?\n FROM coordinator_scope_memberships AS membership\n WHERE changes() > 0 AND membership.scope_id = ? AND membership.device_id = ?").bind(t.effectId, t.requestJson, t.createdAt, t.scopeId, t.deviceId);
248
267
  }
249
- function B(e, t) {
268
+ function H(e, t) {
250
269
  return e.prepare("INSERT INTO coordinator_scope_membership_effect_receipts(\n effect_id, action, request_json, outcome_applied, scope_id, device_id,\n role, status, membership_epoch, coordinator_id, group_id, manifest_issuer_device_id,\n manifest_hash, signed_manifest_json, updated_at, created_at\n )\n SELECT ?, 'revoke', ?, changed.applied, ?, ?, membership.role, membership.status,\n membership.membership_epoch, membership.coordinator_id, membership.group_id,\n membership.manifest_issuer_device_id, membership.manifest_hash,\n membership.signed_manifest_json, membership.updated_at, ?\n FROM (SELECT CASE WHEN changes() > 0 THEN 1 ELSE 0 END AS applied) AS changed\n LEFT JOIN coordinator_scope_memberships AS membership\n ON changed.applied = 1 AND membership.scope_id = ? AND membership.device_id = ?\n WHERE NOT EXISTS (\n SELECT 1 FROM coordinator_scope_membership_effect_receipts WHERE effect_id = ?\n )").bind(t.effectId, t.requestJson, t.scopeId, t.deviceId, t.createdAt, t.scopeId, t.deviceId, t.effectId);
251
270
  }
252
- async function V(e, t) {
271
+ async function U(e, t) {
253
272
  if (!e.batch) throw Error("D1 batch support is required for audited scope membership changes.");
254
273
  return await e.batch(t);
255
274
  }
256
- function H(e) {
275
+ function W(e) {
257
276
  return Number(e?.meta?.changes ?? 0);
258
277
  }
259
- function U(e) {
278
+ function G(e) {
260
279
  if (!e) return null;
261
280
  let t = String(e.seedDeviceId ?? "").trim(), n = String(e.expiresAt ?? "").trim(), r = String(e.createdBy ?? "").trim() || null;
262
281
  if (!t || !n) throw Error("bootstrapGrant.seedDeviceId and expiresAt are required.");
@@ -268,214 +287,235 @@ function U(e) {
268
287
  createdBy: r
269
288
  };
270
289
  }
271
- async function W(e) {
290
+ async function K(e) {
272
291
  let t = await e.all();
273
292
  return Array.isArray(t?.results) ? t.results : [];
274
293
  }
275
- async function G(e) {
294
+ async function q(e) {
276
295
  return await e.first();
277
296
  }
278
- async function K(e) {
297
+ async function J(e) {
279
298
  let t = await e.run();
280
299
  return Number(t?.meta?.changes ?? 0);
281
300
  }
282
- var q = class {
301
+ var Y = class {
283
302
  db;
284
303
  constructor(e) {
285
304
  this.db = e;
286
305
  }
287
306
  async close() {}
288
307
  async createGroup(e, t) {
289
- await this.db.prepare("INSERT OR IGNORE INTO groups(group_id, display_name, archived_at, created_at) VALUES (?, ?, NULL, ?)").bind(e, t ?? null, y()).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, b()).run();
290
309
  }
291
310
  async getGroup(e) {
292
- let t = await G(this.db.prepare("SELECT group_id, display_name, archived_at, created_at FROM groups WHERE group_id = ?").bind(e));
311
+ let t = await q(this.db.prepare("SELECT group_id, display_name, archived_at, created_at FROM groups WHERE group_id = ?").bind(e));
293
312
  return t ? h(t) : null;
294
313
  }
295
314
  async listGroups(e = !1) {
296
315
  let t = e ? "" : "WHERE archived_at IS NULL";
297
- return (await W(this.db.prepare(`SELECT group_id, display_name, archived_at, created_at FROM groups ${t} ORDER BY created_at ASC`))).map((e) => h(e));
316
+ return (await K(this.db.prepare(`SELECT group_id, display_name, archived_at, created_at FROM groups ${t} ORDER BY created_at ASC`))).map((e) => h(e));
298
317
  }
299
318
  async renameGroup(e, t) {
300
- return await K(this.db.prepare("UPDATE groups SET display_name = ? WHERE group_id = ?").bind(t, e)) > 0;
319
+ return await J(this.db.prepare("UPDATE groups SET display_name = ? WHERE group_id = ?").bind(t, e)) > 0;
301
320
  }
302
- async archiveGroup(e, t = y()) {
303
- return await K(this.db.prepare("UPDATE groups SET archived_at = ? WHERE group_id = ? AND archived_at IS NULL").bind(t, e)) > 0;
321
+ async archiveGroup(e, t = b()) {
322
+ return await J(this.db.prepare("UPDATE groups SET archived_at = ? WHERE group_id = ? AND archived_at IS NULL").bind(t, e)) > 0;
304
323
  }
305
324
  async unarchiveGroup(e) {
306
- return await K(this.db.prepare("UPDATE groups SET archived_at = NULL WHERE group_id = ? AND archived_at IS NOT NULL").bind(e)) > 0;
325
+ return await J(this.db.prepare("UPDATE groups SET archived_at = NULL WHERE group_id = ? AND archived_at IS NOT NULL").bind(e)) > 0;
307
326
  }
308
327
  async enrollDevice(e, t) {
309
- if (await K(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, y())) === 0) throw Error("invite_identity_conflict");
328
+ if (await J(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, b())) === 0) throw Error("invite_identity_conflict");
310
329
  }
311
330
  async listEnrolledDevices(e, t) {
312
- let n = t ? "" : "AND enabled = 1";
313
- return (await W(this.db.prepare(`SELECT ${T}
331
+ let n = t ? "" : "AND enrolled_devices.enabled = 1";
332
+ return (await K(this.db.prepare(`SELECT ${D}
314
333
  FROM enrolled_devices
315
- WHERE group_id = ? ${n}
316
- ORDER BY created_at ASC, device_id ASC`).bind(e))).map((e) => h(e));
334
+ LEFT JOIN presence_records
335
+ ON presence_records.group_id = enrolled_devices.group_id
336
+ AND presence_records.device_id = enrolled_devices.device_id
337
+ WHERE enrolled_devices.group_id = ? ${n}
338
+ ORDER BY enrolled_devices.created_at ASC, enrolled_devices.device_id ASC`).bind(e))).map(g);
317
339
  }
318
340
  async getEnrollment(e, t, n = !1) {
319
- let r = n ? "" : "AND enabled = 1", i = await G(this.db.prepare(`SELECT ${T}
341
+ let r = n ? "" : "AND enabled = 1", i = await q(this.db.prepare(`SELECT ${E}
320
342
  FROM enrolled_devices
321
343
  WHERE group_id = ? AND device_id = ? ${r}`).bind(e, t));
322
344
  return i ? h(i) : null;
323
345
  }
324
346
  async renameDevice(e, t, n) {
325
- return await K(this.db.prepare("UPDATE enrolled_devices SET display_name = ?\n WHERE group_id = ? AND device_id = ?").bind(n, e, t)) > 0;
347
+ return await J(this.db.prepare("UPDATE enrolled_devices SET display_name = ?\n WHERE group_id = ? AND device_id = ?").bind(n, e, t)) > 0;
326
348
  }
327
349
  async setDeviceEnabled(e, t, n) {
328
- return await K(this.db.prepare("UPDATE enrolled_devices SET enabled = ?\n WHERE group_id = ? AND device_id = ?").bind(+!!n, e, t)) > 0;
350
+ return await J(this.db.prepare("UPDATE enrolled_devices SET enabled = ?\n WHERE group_id = ? AND device_id = ?").bind(+!!n, e, t)) > 0;
329
351
  }
330
352
  async removeDevice(e, t) {
331
353
  if (!this.db.batch) throw Error("D1 batch support is required for atomic device removal.");
332
- return H((await this.db.batch([
354
+ return W((await this.db.batch([
333
355
  this.db.prepare("DELETE FROM presence_records WHERE group_id = ? AND device_id = ?").bind(e, t),
334
356
  this.db.prepare("DELETE FROM coordinator_reciprocal_approvals WHERE group_id = ? AND (requesting_device_id = ? OR requested_device_id = ?)").bind(e, t, t),
335
357
  this.db.prepare("DELETE FROM enrolled_devices WHERE group_id = ? AND device_id = ?").bind(e, t)
336
358
  ]))[2]) > 0;
337
359
  }
338
360
  async recordNonce(e, t, n) {
339
- return await K(this.db.prepare("INSERT OR IGNORE INTO request_nonces(device_id, nonce, created_at) VALUES (?, ?, ?)").bind(e, t, n)) > 0;
361
+ return await J(this.db.prepare("INSERT OR IGNORE INTO request_nonces(device_id, nonce, created_at) VALUES (?, ?, ?)").bind(e, t, n)) > 0;
340
362
  }
341
363
  async cleanupNonces(e) {
342
364
  await this.db.prepare("DELETE FROM request_nonces WHERE created_at < ?").bind(e).run();
343
365
  }
344
366
  async createInvite(e) {
345
- let t = y(), n = S(12), r = S(24), i = await C(r), o = a(e.expiresAt), s = await this.getGroup(e.groupId), c = String(e.operationId ?? "").trim() || null, l = String(e.reviewedProjectSetDigest ?? "").trim() || null, u = await O(e), d = u.inviteKind === "team_member" ? `identity:${S(18)}` : null;
346
- if (!!c != !!l) throw Error("operationId and reviewedProjectSetDigest must be provided together.");
367
+ let t = b(), n = C(12), r = C(24), i = await w(r), a = l(e.expiresAt), o = await this.getGroup(e.groupId), s = String(e.operationId ?? "").trim() || null, c = String(e.reviewedProjectSetDigest ?? "").trim() || null, u = await A(e), d = u.inviteKind === "team_member" ? `identity:${C(18)}` : null;
368
+ if (!!s != !!c) throw Error("operationId and reviewedProjectSetDigest must be provided together.");
347
369
  let f = async () => {
348
- if (!c) return null;
349
- let t = await G(this.db.prepare(`SELECT ${w} FROM coordinator_invites WHERE operation_id = ?`).bind(c));
370
+ if (!s) return null;
371
+ let t = await q(this.db.prepare(`SELECT ${T} FROM coordinator_invites WHERE operation_id = ?`).bind(s));
350
372
  if (!t) return null;
351
373
  if (t.consumed_at) throw Error("invite_already_bound");
352
- 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");
374
+ if (t.group_id !== e.groupId || t.policy !== e.policy || t.invite_kind !== u.inviteKind || t.reviewed_project_set_digest !== c || 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");
353
375
  return h(t);
354
376
  }, p = async (n) => {
355
377
  if (!n.revoked_at && n.expires_at > t) return n;
356
- await K(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, o, t, e.createdBy ?? null, s?.display_name ?? null, c, n.token, t));
357
- let a = await f();
358
- if (!a) throw Error("invite_operation_reissue_failed");
359
- return a;
378
+ await J(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, o?.display_name ?? null, s, n.token, t));
379
+ let c = await f();
380
+ if (!c) throw Error("invite_operation_reissue_failed");
381
+ return c;
360
382
  };
361
- if (c) {
383
+ if (s) {
362
384
  let e = await f();
363
385
  if (e) return await p(e);
364
386
  }
365
387
  try {
366
- 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, o, 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();
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, o?.display_name ?? null, s, c, 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, s ? "pending" : null, u.inviteKind, u.policyTeamId, u.targetIdentityId, d, u.reviewedPreviewDigest, u.reviewedIntentJson).run();
367
389
  } catch (e) {
368
- if (c) {
390
+ if (s) {
369
391
  let e = await f();
370
392
  if (e) return await p(e);
371
393
  }
372
394
  throw e;
373
395
  }
374
- return h(await G(this.db.prepare(`SELECT ${w} FROM coordinator_invites WHERE invite_id = ?`).bind(n)));
396
+ return h(await q(this.db.prepare(`SELECT ${T} FROM coordinator_invites WHERE invite_id = ?`).bind(n)));
375
397
  }
376
398
  async getInviteByToken(e) {
377
- let t = await C(e), n = await G(this.db.prepare(`SELECT ${w}
399
+ let t = await w(e), n = await q(this.db.prepare(`SELECT ${T}
378
400
  FROM coordinator_invites
379
401
  WHERE (token_digest = ? OR token = ?)
380
402
  AND revoked_at IS NULL
381
- AND expires_at > ?`).bind(t, e, y()));
403
+ AND expires_at > ?`).bind(t, e, b()));
382
404
  return n ? h(n) : null;
383
405
  }
384
406
  async getInviteByTokenForInspection(e) {
385
- let t = await C(e), n = await G(this.db.prepare(`SELECT ${w} FROM coordinator_invites WHERE token_digest = ? OR token = ?`).bind(t, e));
407
+ let t = await w(e), n = await q(this.db.prepare(`SELECT ${T} FROM coordinator_invites WHERE token_digest = ? OR token = ?`).bind(t, e));
386
408
  return n ? h(n) : null;
387
409
  }
388
410
  async inspectRecipientInvite(e) {
389
411
  let t = await this.getInviteByTokenForInspection(e.token);
390
412
  if (!t) return null;
391
- let n = await k(t);
413
+ let n = await j(t);
392
414
  if (!n) return null;
393
415
  if (t.revoked_at) throw Error("invite_invalid");
394
- if (!t.consumed_at && new Date(t.expires_at) <= new Date(a(e.now))) throw Error("invite_expired");
416
+ if (!t.consumed_at && new Date(t.expires_at) <= new Date(l(e.now))) throw Error("invite_expired");
395
417
  let r = await this.getGroup(t.group_id);
396
418
  if (!r) throw Error("group_not_found");
397
419
  if (r.archived_at) throw Error("group_archived");
398
420
  return n;
399
421
  }
400
422
  async consumeRecipientInvite(e) {
401
- let t = a(e.now);
423
+ let t = l(e.now), n = e.recipientDisplayName ?? null, r = e.deviceDisplayName ?? null;
402
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");
403
- let n = await C(e.token), r = await this.getInviteByTokenForInspection(e.token), i = r ? await k(r) : null;
404
- if (!r || !i || i.kind !== e.inviteKind || r.revoked_at) throw Error("invite_invalid");
405
- let o = await this.getGroup(r.group_id);
406
- if (!o) throw Error("group_not_found");
407
- if (o.archived_at) throw Error("group_archived");
408
- if (!r.consumed_at && new Date(r.expires_at) <= new Date(t)) throw Error("invite_expired");
409
- if (l(e.publicKey) !== e.fingerprint) throw Error("fingerprint_mismatch");
410
- let s = d(i);
411
- if (s !== e.identityId) throw Error("invite_identity_conflict");
412
- let c = r.bound_device_id === e.deviceId && r.bound_public_key === e.publicKey && r.bound_fingerprint === e.fingerprint;
413
- if (r.consumed_at && !c) throw Error("invite_already_bound");
414
- if (r.consumed_at && r.recipient_actor_id !== s) throw Error("invite_identity_conflict");
415
- let u = await G(this.db.prepare(`SELECT ${T}
416
- FROM enrolled_devices WHERE group_id = ? AND device_id = ?`).bind(r.group_id, e.deviceId));
417
- if (u && (u.public_key !== e.publicKey || u.fingerprint !== e.fingerprint || u.identity_id !== null && u.identity_id !== s)) throw Error("invite_identity_conflict");
418
- let f = 0;
419
- if (!r.consumed_at) {
425
+ let i = await w(e.token), a = await this.getInviteByTokenForInspection(e.token), o = a ? await j(a) : null;
426
+ if (!a || !o || o.kind !== e.inviteKind || a.revoked_at) throw Error("invite_invalid");
427
+ let s = await this.getGroup(a.group_id);
428
+ if (!s) throw Error("group_not_found");
429
+ if (s.archived_at) throw Error("group_archived");
430
+ if (!a.consumed_at && new Date(a.expires_at) <= new Date(t)) throw Error("invite_expired");
431
+ if (d(e.publicKey) !== e.fingerprint) throw Error("fingerprint_mismatch");
432
+ let c = f(o);
433
+ if (c !== e.identityId) throw Error("invite_identity_conflict");
434
+ let u = a.bound_device_id === e.deviceId && a.bound_public_key === e.publicKey && a.bound_fingerprint === e.fingerprint;
435
+ if (a.consumed_at && !u) throw Error("invite_already_bound");
436
+ if (a.consumed_at && a.recipient_actor_id !== c) throw Error("invite_identity_conflict");
437
+ let p = await q(this.db.prepare(`SELECT ${E}
438
+ FROM enrolled_devices WHERE group_id = ? AND device_id = ?`).bind(a.group_id, e.deviceId));
439
+ if (p && (p.public_key !== e.publicKey || p.fingerprint !== e.fingerprint || p.identity_id !== null && p.identity_id !== c)) throw Error("invite_identity_conflict");
440
+ let m = 0, h = C(12);
441
+ if (!a.consumed_at) {
420
442
  if (!this.db.batch) throw Error("D1 batch support is required for atomic invite consume.");
421
- f = H((await this.db.batch([this.db.prepare("UPDATE coordinator_invites SET token = ?, consumed_at = ?, bound_device_id = ?,\n bound_public_key = ?, bound_fingerprint = ?, recipient_actor_id = ?\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:${r.invite_id}`, t, e.deviceId, e.publicKey, e.fingerprint, s, n, e.token, t, e.inviteKind, r.reviewed_intent_json, r.reviewed_preview_digest, s, s, e.deviceId, e.publicKey, e.fingerprint, s), 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, NULL, 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 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, e.publicKey, e.fingerprint, s)]))[0]);
443
+ m = W((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, c, n, r, i, e.token, t, e.inviteKind, a.reviewed_intent_json, a.reviewed_preview_digest, c, c, e.deviceId, e.publicKey, e.fingerprint, c),
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, c),
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, 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
+ ]))[0]);
422
449
  }
423
- let p = await this.getGroup(r.group_id);
424
- if (!p) throw Error("group_not_found");
425
- if (p.archived_at) throw Error("group_archived");
426
- let m = await G(this.db.prepare(`SELECT ${T}
427
- FROM enrolled_devices WHERE group_id = ? AND device_id = ?`).bind(r.group_id, e.deviceId));
428
- if (m && (m.public_key !== e.publicKey || m.fingerprint !== e.fingerprint || m.identity_id !== null && m.identity_id !== s)) throw Error("invite_identity_conflict");
429
- let h = await this.getInviteByTokenForInspection(e.token);
430
- if (!h || h.revoked_at || !h.consumed_at && new Date(h.expires_at) <= new Date(t)) throw Error("invite_invalid");
431
- let g = await k(h);
432
- if (!g || g.kind !== e.inviteKind) throw Error("invite_invalid");
433
- if (d(g) !== s) throw Error("invite_identity_conflict");
434
- if (h.bound_device_id !== e.deviceId || h.bound_public_key !== e.publicKey || h.bound_fingerprint !== e.fingerprint) throw Error("invite_already_bound");
435
- if (h.recipient_actor_id !== s) throw Error("invite_identity_conflict");
436
- 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(s, h.group_id, e.deviceId, e.publicKey, e.fingerprint).run();
437
- let _ = await this.getEnrollment(h.group_id, e.deviceId);
438
- if (!_) throw Error("invite_acceptance_incomplete");
439
- if (_.public_key !== e.publicKey || _.fingerprint !== e.fingerprint || _.identity_id !== s) throw Error("invite_identity_conflict");
450
+ let g = await this.getGroup(a.group_id);
451
+ if (!g) throw Error("group_not_found");
452
+ if (g.archived_at) throw Error("group_archived");
453
+ let _ = await q(this.db.prepare(`SELECT ${E}
454
+ FROM enrolled_devices WHERE group_id = ? AND device_id = ?`).bind(a.group_id, e.deviceId));
455
+ if (_ && (_.public_key !== e.publicKey || _.fingerprint !== e.fingerprint || _.identity_id !== null && _.identity_id !== c)) 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 j(v);
459
+ if (!y || y.kind !== e.inviteKind) throw Error("invite_invalid");
460
+ if (f(y) !== c) 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 !== c) 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(c, 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 !== c) 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)) {
469
+ if (!this.db.batch) throw Error("D1 batch support is required for atomic bootstrap grant recovery.");
470
+ let n = C(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, c, 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)]);
472
+ let r = await this.getInviteByTokenForInspection(e.token);
473
+ if (!r) throw Error("invite_invalid");
474
+ x = r;
475
+ }
476
+ let S = x.bootstrap_grant_id ? await this.getBootstrapGrant(x.bootstrap_grant_id) : null;
440
477
  return {
441
- status: f === 1 ? "accepted" : "existing",
442
- invite: h,
443
- reviewed_intent: g.reviewed_intent
478
+ status: m === 1 ? "accepted" : "existing",
479
+ invite: x,
480
+ reviewed_intent: y.reviewed_intent,
481
+ bootstrap_grant: S
444
482
  };
445
483
  }
446
484
  async consumeProjectInvite(e) {
447
485
  if (!this.db.batch) throw Error("D1 batch support is required for atomic invite consume.");
448
- let t = a(e.now), n = await C(e.token), r = await this.getInviteByTokenForInspection(e.token);
486
+ let t = l(e.now), n = await w(e.token), r = await this.getInviteByTokenForInspection(e.token);
449
487
  if (!r?.operation_id || !r.project_intent_json || r.revoked_at) throw Error("invite_invalid");
450
488
  let i = await this.getGroup(r.group_id);
451
489
  if (!i) throw Error("group_not_found");
452
490
  if (i.archived_at) throw Error("group_archived");
453
491
  if (r.operation_id !== e.operationId) throw Error("invite_invalid");
454
- if (l(e.publicKey) !== e.fingerprint) throw Error("fingerprint_mismatch");
492
+ if (d(e.publicKey) !== e.fingerprint) throw Error("fingerprint_mismatch");
455
493
  if (!r.consumed_at && new Date(r.expires_at) <= new Date(t)) throw Error("invite_expired");
456
- let o = r.bound_device_id === e.deviceId && r.bound_public_key === e.publicKey && r.bound_fingerprint === e.fingerprint;
457
- if (r.consumed_at && !o) throw Error("invite_already_bound");
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");
458
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");
459
- let s = await G(this.db.prepare(`SELECT ${T}
497
+ let o = await q(this.db.prepare(`SELECT ${E}
460
498
  FROM enrolled_devices WHERE group_id = ? AND device_id = ?`).bind(r.group_id, e.deviceId));
461
- if (s && (s.public_key !== e.publicKey || s.fingerprint !== e.fingerprint)) throw Error("invite_identity_conflict");
462
- let c = S(12), u = H((await this.db.batch([
499
+ if (o && (o.public_key !== e.publicKey || o.fingerprint !== e.fingerprint || o.identity_id != null && o.identity_id !== e.recipientActorId)) throw Error("invite_identity_conflict");
500
+ let s = C(12), c = W((await this.db.batch([
463
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),
464
- this.db.prepare("INSERT INTO enrolled_devices(\n group_id, device_id, public_key, fingerprint, display_name, enabled, created_at\n ) SELECT i.group_id, i.bound_device_id, i.bound_public_key, i.bound_fingerprint,\n 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 display_name = excluded.display_name, enabled = 1").bind(t, n, e.token, e.deviceId, +!r.consumed_at),
465
- 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),
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
+ 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(s, n, e.token, e.deviceId, t),
466
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)
467
- ]))[0]) === 1, d = await this.getGroup(r.group_id);
468
- if (!d) throw Error("group_not_found");
469
- if (d.archived_at) throw Error("group_archived");
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");
470
508
  let f = await this.getInviteByTokenForInspection(e.token);
471
509
  if (!f) throw Error("invite_invalid");
472
510
  if (f.bound_device_id !== e.deviceId || f.bound_public_key !== e.publicKey || f.bound_fingerprint !== e.fingerprint) throw Error("invite_already_bound");
473
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
+ c || 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();
474
513
  let p = await this.getEnrollment(f.group_id, e.deviceId);
475
514
  if (!p) throw Error("invite_acceptance_incomplete");
515
+ if (p.identity_id !== e.recipientActorId) throw Error("invite_identity_conflict");
476
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;
477
517
  return {
478
- status: u ? "accepted" : "existing",
518
+ status: c ? "accepted" : "existing",
479
519
  invite: f,
480
520
  enrollment: p,
481
521
  seed_enrollment: m,
@@ -483,28 +523,28 @@ var q = class {
483
523
  };
484
524
  }
485
525
  async listInvites(e) {
486
- return (await W(this.db.prepare(`SELECT ${w}
526
+ return (await K(this.db.prepare(`SELECT ${T}
487
527
  FROM coordinator_invites WHERE group_id = ?
488
528
  ORDER BY created_at DESC`).bind(e))).map((e) => h(e));
489
529
  }
490
530
  async createJoinRequest(e) {
491
- let t = y(), n = S(12);
492
- 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(), h(await G(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 = b(), n = C(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(), h(await q(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)));
493
533
  }
494
534
  async listJoinRequests(e, t) {
495
535
  let n = t ?? "pending";
496
- return (await W(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) => h(e));
536
+ return (await K(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) => h(e));
497
537
  }
498
538
  async reviewJoinRequest(e) {
499
- let t = await G(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));
539
+ let t = await q(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));
500
540
  if (!t) return null;
501
541
  if (t.status !== "pending") return {
502
542
  ...h(t),
503
543
  _no_transition: !0
504
544
  };
505
- let n = U(e.bootstrapGrant), r = y(), i = e.approved ? "approved" : "denied", a = null, o = null;
545
+ let n = G(e.bootstrapGrant), r = b(), i = e.approved ? "approved" : "denied", a = null, o = null;
506
546
  if (e.approved && n) {
507
- if (!await G(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.");
547
+ if (!await q(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.");
508
548
  if (n.seedDeviceId === t.device_id) throw Error("bootstrap grant seed and worker device ids must differ.");
509
549
  a = {
510
550
  ...n,
@@ -514,9 +554,9 @@ var q = class {
514
554
  }
515
555
  if (this.db.batch) {
516
556
  let t = [];
517
- 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(y(), e.requestId, r)), a)) {
518
- o = S(12);
519
- let n = y();
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(b(), e.requestId, r)), a)) {
558
+ o = C(12);
559
+ let n = b();
520
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));
521
561
  }
522
562
  await this.db.batch(t);
@@ -531,16 +571,16 @@ var q = class {
531
571
  let e = await this.createBootstrapGrant(a);
532
572
  n = e.grant_id, o = e.grant_id;
533
573
  }
534
- if (await K(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)) === 0) {
574
+ if (await J(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)) === 0) {
535
575
  n && await this.revokeBootstrapGrant(n);
536
- let t = await G(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));
576
+ let t = await q(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));
537
577
  return t ? {
538
578
  ...h(t),
539
579
  _no_transition: !0
540
580
  } : null;
541
581
  }
542
582
  }
543
- let s = await G(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));
583
+ let s = await q(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));
544
584
  if (!s) return null;
545
585
  let c = a ? o ? await this.getBootstrapGrant(o) : await this.createBootstrapGrant(a) : null;
546
586
  return {
@@ -552,165 +592,165 @@ var q = class {
552
592
  let t = e.groupId.trim(), n = e.requestingDeviceId.trim(), r = e.requestedDeviceId.trim();
553
593
  if (!t || !n || !r) throw Error("groupId, requestingDeviceId, and requestedDeviceId are required.");
554
594
  if (n === r) throw Error("requesting and requested device ids must differ.");
555
- let i = b(n, r), a = await G(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));
595
+ let i = x(n, r), a = await q(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));
556
596
  if (a) return h(a);
557
- let o = await G(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));
597
+ let o = await q(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));
558
598
  if (o) {
559
- let e = y();
560
- return await this.db.prepare("UPDATE coordinator_reciprocal_approvals SET status = 'completed', resolved_at = ? WHERE request_id = ?").bind(e, o.request_id).run(), h(await G(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(o.request_id)));
599
+ let e = b();
600
+ return await this.db.prepare("UPDATE coordinator_reciprocal_approvals SET status = 'completed', resolved_at = ? WHERE request_id = ?").bind(e, o.request_id).run(), h(await q(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(o.request_id)));
561
601
  }
562
- let s = S(12), c = y();
602
+ let s = C(12), c = b();
563
603
  try {
564
604
  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(s, t, n, r, i.low, i.high, c).run();
565
605
  } catch (e) {
566
- if (!x(e)) throw e;
567
- let i = await G(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));
606
+ if (!S(e)) throw e;
607
+ let i = await q(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));
568
608
  if (i) return h(i);
569
- let a = await G(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));
609
+ let a = await q(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));
570
610
  if (a) {
571
- let e = y();
572
- return await this.db.prepare("UPDATE coordinator_reciprocal_approvals SET status = 'completed', resolved_at = ? WHERE request_id = ?").bind(e, a.request_id).run(), h(await G(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)));
611
+ let e = b();
612
+ return await this.db.prepare("UPDATE coordinator_reciprocal_approvals SET status = 'completed', resolved_at = ? WHERE request_id = ?").bind(e, a.request_id).run(), h(await q(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)));
573
613
  }
574
614
  throw e;
575
615
  }
576
- return h(await G(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(s)));
616
+ return h(await q(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(s)));
577
617
  }
578
618
  async createBootstrapGrant(e) {
579
- let t = E(e), n = S(12), r = y();
580
- 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(), h(await G(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)));
619
+ let t = O(e), n = C(12), r = b();
620
+ 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(), h(await q(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)));
581
621
  }
582
622
  async getScope(e) {
583
- let t = await G(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));
623
+ let t = await q(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));
584
624
  return t ? h(t) : null;
585
625
  }
586
626
  async getScopeMembership(e, t) {
587
- let n = await G(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));
627
+ let n = await q(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));
588
628
  return n ? h(n) : null;
589
629
  }
590
630
  async createScope(e) {
591
- let t = j(e);
631
+ let t = N(e);
592
632
  if (await this.getScope(t.scopeId)) throw Error("scopeId already exists.");
593
- let n = y();
633
+ let n = b();
594
634
  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();
595
635
  let r = await this.getScope(t.scopeId);
596
636
  if (!r) throw Error("scope insert returned no row");
597
637
  return r;
598
638
  }
599
639
  async updateScope(e) {
600
- let t = D(e.scopeId), n = t ? await this.getScope(t) : null;
640
+ let t = k(e.scopeId), n = t ? await this.getScope(t) : null;
601
641
  if (!n) return null;
602
- let r = P(e, n);
603
- 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, y(), r.scopeId).run(), await this.getScope(r.scopeId);
642
+ let r = I(e, n);
643
+ 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, b(), r.scopeId).run(), await this.getScope(r.scopeId);
604
644
  }
605
645
  async listScopes(e = {}) {
606
- let t = [], n = [], r = D(e.coordinatorId), i = D(e.groupId), a = D(e.status);
646
+ let t = [], n = [], r = k(e.coordinatorId), i = k(e.groupId), a = k(e.status);
607
647
  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'");
608
648
  let o = t.length ? `WHERE ${t.join(" AND ")}` : "", s = this.db.prepare(`SELECT scope_id, label, kind, authority_type, coordinator_id, group_id,
609
649
  manifest_issuer_device_id, membership_epoch, manifest_hash, status, created_at, updated_at
610
650
  FROM coordinator_scopes ${o}
611
651
  ORDER BY coordinator_id ASC, group_id ASC, scope_id ASC`);
612
- return (await W(n.length ? s.bind(...n) : s)).map((e) => h(e));
613
- }
614
- async grantScopeMembership(t) {
615
- let n = o(t.effectId), a = r(t), s = await R(this.db, n);
616
- if (s) return u(s, "grant", a), i(s);
617
- let c = D(t.scopeId), l = D(t.deviceId), d = c ? await this.getScope(c) : null;
618
- if (!d) throw new e("scope_not_found");
619
- if (d.status !== "active") throw new e("scope_inactive");
620
- let f = c && l ? await this.getScopeMembership(c, l) : null, p = F(t, d, f);
621
- if (p.groupId && !await this.getEnrollment(p.groupId, p.deviceId)) throw new e("device_not_enrolled");
622
- let m = y();
623
- await V(this.db, [
624
- 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(p.scopeId, p.deviceId, p.role, p.membershipEpoch, p.coordinatorId, p.groupId, p.manifestIssuerDeviceId, p.manifestHash, p.signedManifestJson, m, n),
625
- z(this.db, {
626
- effectId: n,
627
- requestJson: a,
628
- scopeId: p.scopeId,
629
- deviceId: p.deviceId,
630
- createdAt: m
652
+ return (await K(n.length ? s.bind(...n) : s)).map((e) => h(e));
653
+ }
654
+ async grantScopeMembership(e) {
655
+ let t = o(e.effectId), n = m(e), a = await B(this.db, t);
656
+ if (a) return s(a, "grant", n), i(a);
657
+ let c = k(e.scopeId), l = k(e.deviceId), u = c ? await this.getScope(c) : null;
658
+ if (!u) throw new r("scope_not_found");
659
+ if (u.status !== "active") throw new r("scope_inactive");
660
+ let d = c && l ? await this.getScopeMembership(c, l) : null, f = L(e, u, d);
661
+ if (f.groupId && !await this.getEnrollment(f.groupId, f.deviceId)) throw new r("device_not_enrolled");
662
+ let p = b();
663
+ await U(this.db, [
664
+ 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(f.scopeId, f.deviceId, f.role, f.membershipEpoch, f.coordinatorId, f.groupId, f.manifestIssuerDeviceId, f.manifestHash, f.signedManifestJson, p, t),
665
+ V(this.db, {
666
+ effectId: t,
667
+ requestJson: n,
668
+ scopeId: f.scopeId,
669
+ deviceId: f.deviceId,
670
+ createdAt: p
631
671
  }),
632
- L(this.db, {
633
- effectId: n,
634
- requestJson: a,
672
+ z(this.db, {
673
+ effectId: t,
674
+ requestJson: n,
635
675
  action: "grant",
636
- previous: f,
637
- scopeId: p.scopeId,
638
- deviceId: p.deviceId,
676
+ previous: d,
677
+ scopeId: f.scopeId,
678
+ deviceId: f.deviceId,
639
679
  status: "active",
640
- membershipEpoch: p.membershipEpoch,
641
- updatedAt: m,
642
- actorType: p.actorType,
643
- actorId: p.actorId,
644
- createdAt: m
680
+ membershipEpoch: f.membershipEpoch,
681
+ updatedAt: p,
682
+ actorType: f.actorType,
683
+ actorId: f.actorId,
684
+ createdAt: p
645
685
  })
646
686
  ]);
647
- let h = await R(this.db, n);
687
+ let h = await B(this.db, t);
648
688
  if (!h) throw Error("scope membership grant was not applied.");
649
- return u(h, "grant", a), i(h);
650
- }
651
- async revokeScopeMembership(t) {
652
- let r = D(t.scopeId), i = D(t.deviceId);
653
- if (!r || !i) throw Error("scopeId and deviceId are required.");
654
- let a = o(t.effectId), s = n(t), c = await R(this.db, a);
655
- if (c) return u(c, "revoke", s), c.outcome_applied === 1;
656
- let l = t.membershipEpoch == null ? null : A(t.membershipEpoch), d = D(t.groupId), f = d ? await this.getScope(r) : null;
657
- if (d && d !== f?.group_id) throw new e("scope_group_mismatch");
658
- let p = await this.getScopeMembership(r, i);
689
+ return s(h, "grant", n), i(h);
690
+ }
691
+ async revokeScopeMembership(e) {
692
+ let t = k(e.scopeId), n = k(e.deviceId);
693
+ if (!t || !n) throw Error("scopeId and deviceId are required.");
694
+ let i = o(e.effectId), a = u(e), c = await B(this.db, i);
695
+ if (c) return s(c, "revoke", a), c.outcome_applied === 1;
696
+ let l = e.membershipEpoch == null ? null : M(e.membershipEpoch), d = k(e.groupId), f = d ? await this.getScope(t) : null;
697
+ if (d && d !== f?.group_id) throw new r("scope_group_mismatch");
698
+ let p = await this.getScopeMembership(t, n);
659
699
  if (l != null && p && l <= p.membership_epoch) throw Error("membershipEpoch must increase on revoke.");
660
- let m = y(), h = l ?? (p?.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(l, l, D(t.manifestHash), D(t.signedManifestJson), m, r, i, p?.membership_epoch ?? -1, p?.status ?? "", a), _ = B(this.db, {
661
- effectId: a,
662
- requestJson: s,
663
- scopeId: r,
664
- deviceId: i,
700
+ let m = b(), h = l ?? (p?.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(l, l, k(e.manifestHash), k(e.signedManifestJson), m, t, n, p?.membership_epoch ?? -1, p?.status ?? "", i), _ = H(this.db, {
701
+ effectId: i,
702
+ requestJson: a,
703
+ scopeId: t,
704
+ deviceId: n,
665
705
  createdAt: m
666
- }), v = L(this.db, {
667
- effectId: a,
668
- requestJson: s,
706
+ }), v = z(this.db, {
707
+ effectId: i,
708
+ requestJson: a,
669
709
  action: "revoke",
670
710
  previous: p,
671
- scopeId: r,
672
- deviceId: i,
711
+ scopeId: t,
712
+ deviceId: n,
673
713
  status: "revoked",
674
714
  membershipEpoch: h,
675
715
  updatedAt: m,
676
- actorType: D(t.actorType),
677
- actorId: D(t.actorId),
716
+ actorType: k(e.actorType),
717
+ actorId: k(e.actorId),
678
718
  createdAt: m
679
719
  });
680
720
  try {
681
- await V(this.db, [
721
+ await U(this.db, [
682
722
  g,
683
723
  _,
684
724
  v
685
725
  ]);
686
726
  } catch (e) {
687
- let t = await this.getScopeMembership(r, i);
688
- if (p && (!t || t.membership_epoch !== p.membership_epoch || t.status !== p.status)) return !1;
727
+ let r = await this.getScopeMembership(t, n);
728
+ if (p && (!r || r.membership_epoch !== p.membership_epoch || r.status !== p.status)) return !1;
689
729
  throw e;
690
730
  }
691
- let b = await R(this.db, a);
692
- if (!b) throw Error("scope membership revoke receipt was not persisted.");
693
- return u(b, "revoke", s), b.outcome_applied === 1;
731
+ let y = await B(this.db, i);
732
+ if (!y) throw Error("scope membership revoke receipt was not persisted.");
733
+ return s(y, "revoke", a), y.outcome_applied === 1;
694
734
  }
695
735
  async listScopeMemberships(e, t = !1) {
696
- let n = D(e);
736
+ let n = k(e);
697
737
  if (!n) throw Error("scopeId is required.");
698
738
  let r = t ? "" : "AND status = 'active'";
699
- return (await W(this.db.prepare(`SELECT scope_id, device_id, role, status, membership_epoch, coordinator_id, group_id,
739
+ return (await K(this.db.prepare(`SELECT scope_id, device_id, role, status, membership_epoch, coordinator_id, group_id,
700
740
  manifest_issuer_device_id, manifest_hash, signed_manifest_json, updated_at
701
741
  FROM coordinator_scope_memberships
702
742
  WHERE scope_id = ? ${r}
703
743
  ORDER BY device_id ASC`).bind(n))).map((e) => h(e));
704
744
  }
705
745
  async listScopeMembershipAuditEvents(e) {
706
- let t = D(e.scopeId);
746
+ let t = k(e.scopeId);
707
747
  if (!t) throw Error("scopeId is required.");
708
- let n = D(e.deviceId), r = I(e.limit), i = n ? "scope_id = ? AND device_id = ?" : "scope_id = ?", a = n ? [
748
+ let n = k(e.deviceId), r = R(e.limit), i = n ? "scope_id = ? AND device_id = ?" : "scope_id = ?", a = n ? [
709
749
  t,
710
750
  n,
711
751
  r
712
752
  ] : [t, r];
713
- return (await W(this.db.prepare(`SELECT event_id, effect_id, action, scope_id, device_id, role, status, membership_epoch,
753
+ return (await K(this.db.prepare(`SELECT event_id, effect_id, action, scope_id, device_id, role, status, membership_epoch,
714
754
  previous_role, previous_status, previous_membership_epoch,
715
755
  coordinator_id, group_id, actor_type, actor_id, manifest_hash, created_at
716
756
  FROM coordinator_scope_membership_audit_log
@@ -719,24 +759,24 @@ var q = class {
719
759
  LIMIT ?`).bind(...a))).map((e) => h(e));
720
760
  }
721
761
  async getBootstrapGrant(e) {
722
- let t = await G(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));
762
+ let t = await q(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));
723
763
  return t ? h(t) : null;
724
764
  }
725
765
  async listBootstrapGrants(e) {
726
- return (await W(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) => h(e));
766
+ return (await K(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) => h(e));
727
767
  }
728
- async revokeBootstrapGrant(e, t = y()) {
729
- return await K(this.db.prepare("UPDATE coordinator_bootstrap_grants\n SET revoked_at = COALESCE(revoked_at, ?)\n WHERE grant_id = ?").bind(t, e)) > 0;
768
+ async revokeBootstrapGrant(e, t = b()) {
769
+ return await J(this.db.prepare("UPDATE coordinator_bootstrap_grants\n SET revoked_at = COALESCE(revoked_at, ?)\n WHERE grant_id = ?").bind(t, e)) > 0;
730
770
  }
731
771
  async listReciprocalApprovals(e) {
732
772
  let t = e.direction === "incoming" ? "requested_device_id" : "requesting_device_id", n = e.status?.trim() || "pending";
733
- return (await W(this.db.prepare(`SELECT request_id, group_id, requesting_device_id, requested_device_id, status, created_at, resolved_at
773
+ return (await K(this.db.prepare(`SELECT request_id, group_id, requesting_device_id, requested_device_id, status, created_at, resolved_at
734
774
  FROM coordinator_reciprocal_approvals
735
775
  WHERE group_id = ? AND ${t} = ? AND status = ?
736
776
  ORDER BY created_at ASC, request_id ASC`).bind(e.groupId, e.deviceId, n))).map((e) => h(e));
737
777
  }
738
778
  async upsertPresence(e) {
739
- let t = /* @__PURE__ */ new Date(), n = new Date(t.getTime() + e.ttlS * 1e3).toISOString(), r = v([], e.addresses);
779
+ let t = /* @__PURE__ */ new Date(), n = new Date(t.getTime() + e.ttlS * 1e3).toISOString(), r = y([], e.addresses);
740
780
  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(), {
741
781
  group_id: e.groupId,
742
782
  device_id: e.deviceId,
@@ -745,14 +785,14 @@ var q = class {
745
785
  };
746
786
  }
747
787
  async listGroupPeers(e, t) {
748
- let n = y();
749
- return (await W(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) => {
788
+ let n = b();
789
+ return (await K(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) => {
750
790
  let t = String(e.expires_at ?? "").trim(), r = !0;
751
791
  if (t) {
752
792
  let e = new Date(t);
753
793
  r = Number.isNaN(e.getTime()) || e.toISOString() <= n;
754
794
  }
755
- let i = r ? [] : v([], JSON.parse(String(e.addresses_json ?? "[]")));
795
+ let i = r ? [] : y([], JSON.parse(String(e.addresses_json ?? "[]")));
756
796
  return {
757
797
  device_id: String(e.device_id ?? ""),
758
798
  public_key: String(e.public_key ?? ""),
@@ -769,9 +809,9 @@ var q = class {
769
809
  };
770
810
  //#endregion
771
811
  //#region src/d1-coordinator-runtime.ts
772
- function J(e) {
812
+ function X(e) {
773
813
  return p({
774
- storeFactory: () => new q(e.db),
814
+ storeFactory: () => new Y(e.db),
775
815
  runtime: {
776
816
  adminSecret: () => String(e.adminSecret ?? "").trim() || null,
777
817
  now: e.now ?? (() => (/* @__PURE__ */ new Date()).toISOString())
@@ -780,6 +820,6 @@ function J(e) {
780
820
  });
781
821
  }
782
822
  //#endregion
783
- export { q as D1CoordinatorStore, f as DEFAULT_TIME_WINDOW_S, J as createD1CoordinatorApp };
823
+ export { Y as D1CoordinatorStore, c as DEFAULT_TIME_WINDOW_S, X as createD1CoordinatorApp };
784
824
 
785
825
  //# sourceMappingURL=cloudflare-coordinator.js.map