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