@modelprofile.com/authswitch 6.3.0 → 6.4.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 (40) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/authority-contract.d.ts +142 -0
  3. package/dist_ts/authority-contract.js +3 -0
  4. package/dist_ts/authority-runtime-contract.d.ts +32 -0
  5. package/dist_ts/authority-runtime-contract.js +2 -0
  6. package/dist_ts/classes.authoritybroker.d.ts +73 -0
  7. package/dist_ts/classes.authoritybroker.js +548 -0
  8. package/dist_ts/classes.authorityclient.d.ts +34 -0
  9. package/dist_ts/classes.authorityclient.js +200 -0
  10. package/dist_ts/classes.authoritydaemon.d.ts +26 -0
  11. package/dist_ts/classes.authoritydaemon.js +249 -0
  12. package/dist_ts/classes.authoritydatabase.d.ts +94 -0
  13. package/dist_ts/classes.authoritydatabase.js +736 -0
  14. package/dist_ts/classes.authorityframing.d.ts +8 -0
  15. package/dist_ts/classes.authorityframing.js +22 -0
  16. package/dist_ts/classes.authoritymodels.d.ts +215 -0
  17. package/dist_ts/classes.authoritymodels.js +818 -0
  18. package/dist_ts/classes.authoritysecrets.d.ts +9 -0
  19. package/dist_ts/classes.authoritysecrets.js +30 -0
  20. package/dist_ts/classes.authorityservice.d.ts +28 -0
  21. package/dist_ts/classes.authorityservice.js +71 -0
  22. package/dist_ts/index.d.ts +2 -0
  23. package/dist_ts/index.js +26 -1
  24. package/dist_ts/plugins.d.ts +9 -2
  25. package/dist_ts/plugins.js +10 -3
  26. package/package.json +17 -3
  27. package/readme.md +34 -0
  28. package/ts/00_commitinfo_data.ts +1 -1
  29. package/ts/authority-contract.ts +109 -0
  30. package/ts/authority-runtime-contract.ts +27 -0
  31. package/ts/classes.authoritybroker.ts +530 -0
  32. package/ts/classes.authorityclient.ts +183 -0
  33. package/ts/classes.authoritydaemon.ts +219 -0
  34. package/ts/classes.authoritydatabase.ts +725 -0
  35. package/ts/classes.authorityframing.ts +21 -0
  36. package/ts/classes.authoritymodels.ts +367 -0
  37. package/ts/classes.authoritysecrets.ts +27 -0
  38. package/ts/classes.authorityservice.ts +83 -0
  39. package/ts/index.ts +25 -0
  40. package/ts/plugins.ts +9 -2
@@ -0,0 +1,736 @@
1
+ import * as plugins from './plugins.js';
2
+ import { AuthSwitchAuthorityAccountModel, AuthSwitchAuthorityBindingModel, AuthSwitchAuthorityEnrollmentModel, AuthSwitchAuthorityEventModel, AuthSwitchAuthorityGrantModel, AuthSwitchAuthorityHandoffModel, AuthSwitchAuthorityMetaModel, AuthSwitchAuthorityMigrationLedgerModel, assertStoredAuthorityAccount, assertStoredAuthorityBinding, assertStoredAuthorityEnrollment, assertStoredAuthorityGrant, assertStoredAuthorityHandoff, assertStoredAuthorityMigrationLedger, } from './classes.authoritymodels.js';
3
+ /** Separate account, grant, binding and journal records; the only global record is a revision counter. */
4
+ export class AuthSwitchAuthorityDatabase {
5
+ options;
6
+ engine;
7
+ database;
8
+ started = false;
9
+ constructor(options) {
10
+ this.options = options;
11
+ }
12
+ async privateDirectory(pathArg) {
13
+ await plugins.fs.promises.mkdir(pathArg, { recursive: true, mode: 0o700 });
14
+ const stat = await plugins.fs.promises.lstat(pathArg);
15
+ if (!stat.isDirectory() || stat.isSymbolicLink() || stat.uid !== process.getuid?.()) {
16
+ throw new Error('Authswitch database directory is not owned by this user.');
17
+ }
18
+ await plugins.fs.promises.chmod(pathArg, 0o700);
19
+ }
20
+ async start() {
21
+ if (this.started || this.engine || this.database)
22
+ throw new Error('Authswitch database is already starting or started.');
23
+ await this.privateDirectory(this.options.dataDirectory);
24
+ await this.privateDirectory(plugins.path.dirname(this.options.socketPath));
25
+ const engine = new plugins.smartdb.LocalSmartDb({ folderPath: this.options.dataDirectory, socketPath: this.options.socketPath });
26
+ this.engine = engine;
27
+ try {
28
+ const connection = await engine.start();
29
+ const database = new plugins.smartdata.SmartdataDb({ mongoDbUrl: connection.connectionUri, mongoDbName: 'authswitch' });
30
+ this.database = database;
31
+ for (const model of [AuthSwitchAuthorityMetaModel, AuthSwitchAuthorityAccountModel,
32
+ AuthSwitchAuthorityGrantModel, AuthSwitchAuthorityBindingModel, AuthSwitchAuthorityEnrollmentModel,
33
+ AuthSwitchAuthorityHandoffModel, AuthSwitchAuthorityMigrationLedgerModel, AuthSwitchAuthorityEventModel]) {
34
+ plugins.smartdata.setDefaultManagerForDoc({ db: database }, model);
35
+ }
36
+ await database.init();
37
+ await Promise.all([AuthSwitchAuthorityMetaModel.init(), AuthSwitchAuthorityAccountModel.init(),
38
+ AuthSwitchAuthorityGrantModel.init(), AuthSwitchAuthorityBindingModel.init(),
39
+ AuthSwitchAuthorityEnrollmentModel.init(), AuthSwitchAuthorityHandoffModel.init(),
40
+ AuthSwitchAuthorityMigrationLedgerModel.init(), AuthSwitchAuthorityEventModel.init()]);
41
+ await Promise.all([AuthSwitchAuthorityMetaModel.exact.prepare(), AuthSwitchAuthorityAccountModel.exact.prepare(),
42
+ AuthSwitchAuthorityGrantModel.exact.prepare(), AuthSwitchAuthorityBindingModel.exact.prepare(),
43
+ AuthSwitchAuthorityEnrollmentModel.exact.prepare(), AuthSwitchAuthorityHandoffModel.exact.prepare(),
44
+ AuthSwitchAuthorityMigrationLedgerModel.exact.prepare(), AuthSwitchAuthorityEventModel.exact.prepare()]);
45
+ const initial = {
46
+ id: 'authswitch-authority', epoch: plugins.crypto.randomUUID(), revision: 0,
47
+ updateId: plugins.crypto.randomUUID(),
48
+ };
49
+ const result = await AuthSwitchAuthorityMetaModel.exact.insert(initial);
50
+ if (result.status === 'conflict' && result.document.id !== initial.id)
51
+ throw new Error('Authswitch authority could not initialize.');
52
+ this.started = true;
53
+ }
54
+ catch (error) {
55
+ try {
56
+ await this.stop();
57
+ }
58
+ catch { /* Preserve the original startup error. */ }
59
+ throw error;
60
+ }
61
+ }
62
+ db() {
63
+ if (!this.started || !this.database)
64
+ throw new Error('Authswitch database is unavailable.');
65
+ return this.database;
66
+ }
67
+ async transaction(callback) {
68
+ const session = this.db().createSession();
69
+ try {
70
+ const result = await session.withTransaction(callback);
71
+ if (result === undefined)
72
+ throw new Error('Authswitch database transaction did not commit.');
73
+ return result;
74
+ }
75
+ finally {
76
+ await session.close();
77
+ }
78
+ }
79
+ async readMeta() {
80
+ this.db();
81
+ const stored = await AuthSwitchAuthorityMetaModel.exact.findStoredOne({ id: 'authswitch-authority' });
82
+ if (!stored)
83
+ throw new Error('Authswitch authority metadata is missing.');
84
+ return AuthSwitchAuthorityMetaModel.exact.toPersisted(stored);
85
+ }
86
+ async readAccount(id) {
87
+ this.db();
88
+ const stored = await AuthSwitchAuthorityAccountModel.exact.findStoredOne({ id });
89
+ return stored ? AuthSwitchAuthorityAccountModel.exact.toPersisted(stored) : null;
90
+ }
91
+ async readBinding(id) {
92
+ this.db();
93
+ const stored = await AuthSwitchAuthorityBindingModel.exact.findStoredOne({ id });
94
+ return stored ? AuthSwitchAuthorityBindingModel.exact.toPersisted(stored) : null;
95
+ }
96
+ /** One consistent authorization view. Callers must not combine separate binding and grant reads. */
97
+ async readBindingContext(id) {
98
+ return this.transaction(async (session) => {
99
+ const bindingStored = await AuthSwitchAuthorityBindingModel.exact.findStoredOne({ id }, { session });
100
+ const binding = bindingStored ? AuthSwitchAuthorityBindingModel.exact.toPersisted(bindingStored) : null;
101
+ const accountStored = binding
102
+ ? await AuthSwitchAuthorityAccountModel.exact.findStoredOne({ id: binding.accountId }, { session }) : null;
103
+ const account = accountStored ? AuthSwitchAuthorityAccountModel.exact.toPersisted(accountStored) : null;
104
+ const grantStored = binding && account?.primaryGrantId === binding.grantId
105
+ ? await AuthSwitchAuthorityGrantModel.exact.findStoredOne({ id: binding.grantId }, { session }) : null;
106
+ const grant = grantStored ? AuthSwitchAuthorityGrantModel.exact.toPersisted(grantStored) : null;
107
+ return { binding, account, grant };
108
+ });
109
+ }
110
+ async readGrant(id) {
111
+ this.db();
112
+ const stored = await AuthSwitchAuthorityGrantModel.exact.findStoredOne({ id });
113
+ return stored ? AuthSwitchAuthorityGrantModel.exact.toPersisted(stored) : null;
114
+ }
115
+ async readEnrollment(id) {
116
+ this.db();
117
+ const stored = await AuthSwitchAuthorityEnrollmentModel.exact.findStoredOne({ id });
118
+ return stored ? AuthSwitchAuthorityEnrollmentModel.exact.toPersisted(stored) : null;
119
+ }
120
+ async readHandoff(id) {
121
+ this.db();
122
+ const stored = await AuthSwitchAuthorityHandoffModel.exact.findStoredOne({ id });
123
+ return stored ? AuthSwitchAuthorityHandoffModel.exact.toPersisted(stored) : null;
124
+ }
125
+ async readMigrationLedger(id) {
126
+ this.db();
127
+ const stored = await AuthSwitchAuthorityMigrationLedgerModel.exact.findStoredOne({ id });
128
+ return stored ? AuthSwitchAuthorityMigrationLedgerModel.exact.toPersisted(stored) : null;
129
+ }
130
+ async migrationLedgerByStatus(status, after, limit = 128) {
131
+ this.db();
132
+ if (!Number.isSafeInteger(limit) || limit < 1 || limit > 256)
133
+ throw new Error('Invalid migration page size.');
134
+ const stored = await AuthSwitchAuthorityMigrationLedgerModel.exact.findStored({
135
+ filter: after ? { status, id: { $gt: after } } : { status }, sort: { id: 1 }, limit,
136
+ });
137
+ return stored.map(item => AuthSwitchAuthorityMigrationLedgerModel.exact.toPersisted(item));
138
+ }
139
+ async readAccountAndPrimaryGrant(id) {
140
+ return this.transaction(async (session) => {
141
+ const accountStored = await AuthSwitchAuthorityAccountModel.exact.findStoredOne({ id }, { session });
142
+ const account = accountStored ? AuthSwitchAuthorityAccountModel.exact.toPersisted(accountStored) : null;
143
+ const grantStored = account?.primaryGrantId
144
+ ? await AuthSwitchAuthorityGrantModel.exact.findStoredOne({ id: account.primaryGrantId }, { session }) : null;
145
+ return { account, grant: grantStored ? AuthSwitchAuthorityGrantModel.exact.toPersisted(grantStored) : null };
146
+ });
147
+ }
148
+ async page(accountAfter, bindingAfter, limit) {
149
+ if (!Number.isSafeInteger(limit) || limit < 1 || limit > 256)
150
+ throw new Error('Invalid authority page size.');
151
+ return this.transaction(async (session) => {
152
+ const meta = await AuthSwitchAuthorityMetaModel.exact.findStoredOne({ id: 'authswitch-authority' }, { session });
153
+ if (!meta)
154
+ throw new Error('Authswitch authority metadata is missing.');
155
+ const accounts = await AuthSwitchAuthorityAccountModel.exact.findStored({
156
+ filter: accountAfter ? { id: { $gt: accountAfter } } : {},
157
+ sort: { id: 1 }, limit: limit + 1, session,
158
+ });
159
+ const bindings = await AuthSwitchAuthorityBindingModel.exact.findStored({
160
+ filter: bindingAfter ? { id: { $gt: bindingAfter } } : {},
161
+ sort: { id: 1 }, limit: limit + 1, session,
162
+ });
163
+ const accountPage = accounts.slice(0, limit).map(item => AuthSwitchAuthorityAccountModel.exact.toPersisted(item));
164
+ const bindingPage = bindings.slice(0, limit).map(item => AuthSwitchAuthorityBindingModel.exact.toPersisted(item));
165
+ const withGrants = [];
166
+ for (const account of accountPage) {
167
+ const stored = account.primaryGrantId
168
+ ? await AuthSwitchAuthorityGrantModel.exact.findStoredOne({ id: account.primaryGrantId }, { session }) : null;
169
+ if (account.primaryGrantId && !stored)
170
+ throw new Error('Authority account primary grant is missing.');
171
+ withGrants.push({ account, grant: stored ? AuthSwitchAuthorityGrantModel.exact.toPersisted(stored) : null });
172
+ }
173
+ return {
174
+ meta: AuthSwitchAuthorityMetaModel.exact.toPersisted(meta),
175
+ accounts: withGrants, bindings: bindingPage,
176
+ nextAccountCursor: accounts.length > limit ? accountPage.at(-1).id : null,
177
+ nextBindingCursor: bindings.length > limit ? bindingPage.at(-1).id : null,
178
+ };
179
+ });
180
+ }
181
+ async grantsByState(state, after, limit = 128) {
182
+ this.db();
183
+ if (!Number.isSafeInteger(limit) || limit < 1 || limit > 256)
184
+ throw new Error('Invalid authority scan size.');
185
+ const stored = await AuthSwitchAuthorityGrantModel.exact.findStored({
186
+ filter: after ? { state, id: { $gt: after } } : { state },
187
+ sort: { id: 1 }, limit,
188
+ });
189
+ return stored.map(item => AuthSwitchAuthorityGrantModel.exact.toPersisted(item));
190
+ }
191
+ async grantsForAccount(accountId, after, limit = 128) {
192
+ this.db();
193
+ if (!Number.isSafeInteger(limit) || limit < 1 || limit > 256)
194
+ throw new Error('Invalid grant page size.');
195
+ const stored = await AuthSwitchAuthorityGrantModel.exact.findStored({
196
+ filter: after ? { accountId, id: { $gt: after } } : { accountId },
197
+ sort: { id: 1 }, limit,
198
+ });
199
+ return stored.map(item => AuthSwitchAuthorityGrantModel.exact.toPersisted(item));
200
+ }
201
+ async eventsAfter(revision, limit = 256) {
202
+ this.db();
203
+ const stored = await AuthSwitchAuthorityEventModel.exact.findStored({
204
+ filter: { revision: { $gt: revision } }, sort: { revision: 1, id: 1 }, limit,
205
+ });
206
+ return stored.map(item => AuthSwitchAuthorityEventModel.exact.toPersisted(item));
207
+ }
208
+ async appendEvent(session, meta, updateId, kind, accountId) {
209
+ const stored = await AuthSwitchAuthorityMetaModel.exact.findStoredOne({ id: 'authswitch-authority' }, { session });
210
+ if (!stored || stored.revision !== meta.revision)
211
+ throw new Error('Authswitch authority revision changed.');
212
+ const next = { ...meta, revision: meta.revision + 1, updateId };
213
+ const transitioned = await AuthSwitchAuthorityMetaModel.exact.transition({ current: stored,
214
+ change: model => { model.revision = next.revision; model.updateId = next.updateId; } }, { session });
215
+ if (transitioned.status !== 'transitioned')
216
+ throw new Error('Authswitch authority revision changed.');
217
+ const inserted = await AuthSwitchAuthorityEventModel.exact.insert({
218
+ id: updateId, epoch: meta.epoch, revision: next.revision, kind, accountId,
219
+ }, { session });
220
+ if (inserted.status !== 'inserted')
221
+ throw new Error('Authswitch authority event was not inserted.');
222
+ return next;
223
+ }
224
+ async persistAccount(session, current, draft) {
225
+ assertStoredAuthorityAccount(draft);
226
+ if (current) {
227
+ const prior = AuthSwitchAuthorityAccountModel.exact.toPersisted(current);
228
+ if (draft.providerId !== prior.providerId || draft.issuer !== prior.issuer
229
+ || draft.subject !== prior.subject || draft.workspaceId !== prior.workspaceId
230
+ || draft.id !== prior.id)
231
+ throw new Error('Account identity cannot change.');
232
+ const result = await AuthSwitchAuthorityAccountModel.exact.transition({
233
+ current, change: model => Object.assign(model, draft),
234
+ }, { session });
235
+ if (result.status !== 'transitioned')
236
+ throw new Error('Account changed concurrently.');
237
+ }
238
+ else {
239
+ const result = await AuthSwitchAuthorityAccountModel.exact.insert(draft, { session });
240
+ if (result.status !== 'inserted')
241
+ throw new Error('Account was added concurrently.');
242
+ }
243
+ }
244
+ async persistGrant(session, current, draft) {
245
+ assertStoredAuthorityGrant(draft);
246
+ if (current) {
247
+ const prior = AuthSwitchAuthorityGrantModel.exact.toPersisted(current);
248
+ if (draft.id !== prior.id || draft.accountId !== prior.accountId
249
+ || draft.providerId !== prior.providerId || draft.purpose !== prior.purpose
250
+ || draft.audience !== prior.audience)
251
+ throw new Error('Grant identity cannot change.');
252
+ const result = await AuthSwitchAuthorityGrantModel.exact.transition({
253
+ current, change: model => Object.assign(model, draft),
254
+ }, { session });
255
+ if (result.status !== 'transitioned')
256
+ throw new Error('Grant changed concurrently.');
257
+ }
258
+ else {
259
+ const result = await AuthSwitchAuthorityGrantModel.exact.insert(draft, { session });
260
+ if (result.status !== 'inserted')
261
+ throw new Error('Grant was added concurrently.');
262
+ }
263
+ }
264
+ /** Atomic account/grant enrollment or reauthentication. Both records become visible together. */
265
+ async changeAccountAndGrant(updateId, accountId, grantId, change) {
266
+ try {
267
+ return await this.transaction(async (session) => {
268
+ const metaStored = await AuthSwitchAuthorityMetaModel.exact.findStoredOne({ id: 'authswitch-authority' }, { session });
269
+ if (!metaStored)
270
+ throw new Error('Authswitch authority metadata is missing.');
271
+ const accountStored = await AuthSwitchAuthorityAccountModel.exact.findStoredOne({ id: accountId }, { session });
272
+ const grantStored = await AuthSwitchAuthorityGrantModel.exact.findStoredOne({ id: grantId }, { session });
273
+ const draft = change(accountStored ? structuredClone(AuthSwitchAuthorityAccountModel.exact.toPersisted(accountStored)) : null, grantStored ? structuredClone(AuthSwitchAuthorityGrantModel.exact.toPersisted(grantStored)) : null);
274
+ if (draft.account.id !== accountId || draft.grant.id !== grantId || draft.grant.accountId !== accountId
275
+ || draft.account.primaryGrantId !== grantId || draft.account.providerId !== draft.grant.providerId
276
+ || draft.account.updateId !== updateId || draft.grant.updateId !== updateId) {
277
+ throw new Error('Account/grant change has an invalid identity.');
278
+ }
279
+ if (accountStored && accountStored.primaryGrantId !== grantId) {
280
+ throw new Error('Primary grant identity cannot be replaced.');
281
+ }
282
+ if (grantStored && ['legacy_native', 'claude_native'].includes(grantStored.owner)
283
+ && draft.grant.owner === 'daemon') {
284
+ throw new Error('Native ownership requires a verified handoff.');
285
+ }
286
+ await this.persistAccount(session, accountStored, draft.account);
287
+ await this.persistGrant(session, grantStored, draft.grant);
288
+ const meta = await this.appendEvent(session, AuthSwitchAuthorityMetaModel.exact.toPersisted(metaStored), updateId, 'account', accountId);
289
+ return { meta, ...draft };
290
+ });
291
+ }
292
+ catch (error) {
293
+ if (!(error instanceof plugins.smartdata.SmartdataExactPersistenceError) || error.code !== 'ambiguous_write')
294
+ throw error;
295
+ const event = await AuthSwitchAuthorityEventModel.exact.findStoredOne({ id: updateId });
296
+ const { account, grant } = await this.readAccountAndPrimaryGrant(accountId);
297
+ if (event && account?.updateId === updateId && grant?.updateId === updateId) {
298
+ return { meta: await this.readMeta(), account, grant };
299
+ }
300
+ throw new Error('Authswitch account/grant write outcome is unknown; no external exchange may start.');
301
+ }
302
+ }
303
+ /** Grant transition and public account revision share a transaction and one event. */
304
+ async changeGrant(updateId, grantId, change) {
305
+ try {
306
+ return await this.transaction(async (session) => {
307
+ const metaStored = await AuthSwitchAuthorityMetaModel.exact.findStoredOne({ id: 'authswitch-authority' }, { session });
308
+ const grantStored = await AuthSwitchAuthorityGrantModel.exact.findStoredOne({ id: grantId }, { session });
309
+ if (!metaStored || !grantStored)
310
+ throw new Error('Grant is unavailable.');
311
+ const grant = AuthSwitchAuthorityGrantModel.exact.toPersisted(grantStored);
312
+ const accountStored = await AuthSwitchAuthorityAccountModel.exact.findStoredOne({ id: grant.accountId }, { session });
313
+ if (!accountStored)
314
+ throw new Error('Grant account is unavailable.');
315
+ const account = AuthSwitchAuthorityAccountModel.exact.toPersisted(accountStored);
316
+ const draft = change(structuredClone(grant), structuredClone(account));
317
+ if (draft.id !== grantId || draft.accountId !== account.id || draft.updateId !== updateId) {
318
+ throw new Error('Grant change has an invalid identity.');
319
+ }
320
+ const accountDraft = { ...account, revision: account.revision + 1,
321
+ statusObservedAt: draft.statusObservedAt, updateId };
322
+ await this.persistGrant(session, grantStored, draft);
323
+ await this.persistAccount(session, accountStored, accountDraft);
324
+ const meta = await this.appendEvent(session, AuthSwitchAuthorityMetaModel.exact.toPersisted(metaStored), updateId, 'account', account.id);
325
+ return { meta, account: accountDraft, grant: draft };
326
+ });
327
+ }
328
+ catch (error) {
329
+ if (!(error instanceof plugins.smartdata.SmartdataExactPersistenceError) || error.code !== 'ambiguous_write')
330
+ throw error;
331
+ const event = await AuthSwitchAuthorityEventModel.exact.findStoredOne({ id: updateId });
332
+ const grant = await this.readGrant(grantId);
333
+ const account = grant ? await this.readAccount(grant.accountId) : null;
334
+ if (event && grant?.updateId === updateId && account?.updateId === updateId) {
335
+ return { meta: await this.readMeta(), account, grant };
336
+ }
337
+ throw new Error('Authswitch grant write outcome is unknown; no external exchange may start.');
338
+ }
339
+ }
340
+ /** Add a distinct per-purpose grant without replacing the account's primary grant. */
341
+ async changeSecondaryGrant(updateId, accountId, grantId, change) {
342
+ try {
343
+ return await this.transaction(async (session) => {
344
+ const metaStored = await AuthSwitchAuthorityMetaModel.exact.findStoredOne({ id: 'authswitch-authority' }, { session });
345
+ const accountStored = await AuthSwitchAuthorityAccountModel.exact.findStoredOne({ id: accountId }, { session });
346
+ if (!metaStored || !accountStored || accountStored.removed)
347
+ throw new Error('Secondary grant account is unavailable.');
348
+ const account = AuthSwitchAuthorityAccountModel.exact.toPersisted(accountStored);
349
+ const grantStored = await AuthSwitchAuthorityGrantModel.exact.findStoredOne({ id: grantId }, { session });
350
+ const grant = grantStored ? AuthSwitchAuthorityGrantModel.exact.toPersisted(grantStored) : null;
351
+ const draft = change(grant ? structuredClone(grant) : null, structuredClone(account));
352
+ if (grantId === account.primaryGrantId || draft.id !== grantId || draft.accountId !== accountId
353
+ || draft.providerId !== account.providerId || draft.updateId !== updateId) {
354
+ throw new Error('Secondary grant identity is invalid.');
355
+ }
356
+ await this.persistGrant(session, grantStored, draft);
357
+ const updatedAccount = { ...account, revision: account.revision + 1,
358
+ statusObservedAt: draft.statusObservedAt, updateId };
359
+ await this.persistAccount(session, accountStored, updatedAccount);
360
+ await this.appendEvent(session, AuthSwitchAuthorityMetaModel.exact.toPersisted(metaStored), updateId, 'account', accountId);
361
+ return { account: updatedAccount, grant: draft };
362
+ });
363
+ }
364
+ catch (error) {
365
+ if (!(error instanceof plugins.smartdata.SmartdataExactPersistenceError) || error.code !== 'ambiguous_write')
366
+ throw error;
367
+ const event = await AuthSwitchAuthorityEventModel.exact.findStoredOne({ id: updateId });
368
+ const account = await this.readAccount(accountId);
369
+ const grant = await this.readGrant(grantId);
370
+ if (event && account?.updateId === updateId && grant?.updateId === updateId)
371
+ return { account, grant };
372
+ throw new Error('Authswitch secondary grant write outcome is unknown.');
373
+ }
374
+ }
375
+ /** Remove all managed grants in one transaction; native owners must be stopped and handed off first. */
376
+ async removeAccountAndGrants(updateId, accountId, expectedRevision, statusObservedAt) {
377
+ try {
378
+ return await this.transaction(async (session) => {
379
+ const metaStored = await AuthSwitchAuthorityMetaModel.exact.findStoredOne({ id: 'authswitch-authority' }, { session });
380
+ const accountStored = await AuthSwitchAuthorityAccountModel.exact.findStoredOne({ id: accountId }, { session });
381
+ if (!metaStored || !accountStored || accountStored.removed || accountStored.revision !== expectedRevision) {
382
+ throw new Error('Account changed; refresh before removing.');
383
+ }
384
+ const account = AuthSwitchAuthorityAccountModel.exact.toPersisted(accountStored);
385
+ const scan = async (visit) => {
386
+ let after = null;
387
+ while (true) {
388
+ const page = await AuthSwitchAuthorityGrantModel.exact.findStored({
389
+ filter: after ? { accountId, id: { $gt: after } } : { accountId },
390
+ sort: { id: 1 }, limit: 128, session,
391
+ });
392
+ for (const stored of page)
393
+ await visit(AuthSwitchAuthorityGrantModel.exact.toPersisted(stored), stored);
394
+ if (page.length < 128)
395
+ break;
396
+ after = page.at(-1).id;
397
+ }
398
+ };
399
+ await scan(async (grant) => {
400
+ if (grant.state === 'removed')
401
+ return;
402
+ if (grant.owner === 'claude_native' || grant.owner === 'legacy_native') {
403
+ throw new Error('Stop the native owner and complete its handoff before removing this account.');
404
+ }
405
+ if (grant.state === 'exchange_may_have_been_sent') {
406
+ throw new Error('Wait for the account refresh to finish before removing it.');
407
+ }
408
+ });
409
+ await scan(async (grant, stored) => {
410
+ if (grant.state === 'removed')
411
+ return;
412
+ const draft = {
413
+ ...grant, state: 'removed', owner: 'none', ciphertext: null, accessExpiresAt: null,
414
+ attemptId: null, retryAt: null, retryCount: 0, problem: 'none',
415
+ grantGeneration: grant.grantGeneration + 1,
416
+ authorizationGeneration: grant.authorizationGeneration + 1,
417
+ revision: grant.revision + 1, statusObservedAt, updateId,
418
+ };
419
+ await this.persistGrant(session, stored, draft);
420
+ });
421
+ let bindingAfter = null;
422
+ while (true) {
423
+ const bindings = await AuthSwitchAuthorityBindingModel.exact.findStored({
424
+ filter: bindingAfter ? { accountId, id: { $gt: bindingAfter } } : { accountId },
425
+ sort: { id: 1 }, limit: 128, session,
426
+ });
427
+ for (const binding of bindings) {
428
+ const result = await AuthSwitchAuthorityBindingModel.exact.delete({ current: binding }, { session });
429
+ if (result.status !== 'deleted')
430
+ throw new Error('Runtime binding changed during account removal.');
431
+ }
432
+ if (bindings.length < 128)
433
+ break;
434
+ bindingAfter = bindings.at(-1).id;
435
+ }
436
+ let enrollmentAfter = null;
437
+ while (true) {
438
+ const enrollments = await AuthSwitchAuthorityEnrollmentModel.exact.findStored({
439
+ filter: enrollmentAfter ? { accountId, id: { $gt: enrollmentAfter } } : { accountId },
440
+ sort: { id: 1 }, limit: 128, session,
441
+ });
442
+ for (const enrollment of enrollments) {
443
+ const result = await AuthSwitchAuthorityEnrollmentModel.exact.delete({ current: enrollment }, { session });
444
+ if (result.status !== 'deleted')
445
+ throw new Error('Remote-control enrollment changed during account removal.');
446
+ }
447
+ if (enrollments.length < 128)
448
+ break;
449
+ enrollmentAfter = enrollments.at(-1).id;
450
+ }
451
+ const removed = { ...account, removed: true,
452
+ revision: account.revision + 1, statusObservedAt, updateId };
453
+ await this.persistAccount(session, accountStored, removed);
454
+ await this.appendEvent(session, AuthSwitchAuthorityMetaModel.exact.toPersisted(metaStored), updateId, 'account', accountId);
455
+ return removed;
456
+ });
457
+ }
458
+ catch (error) {
459
+ if (!(error instanceof plugins.smartdata.SmartdataExactPersistenceError) || error.code !== 'ambiguous_write')
460
+ throw error;
461
+ const event = await AuthSwitchAuthorityEventModel.exact.findStoredOne({ id: updateId });
462
+ const account = await this.readAccount(accountId);
463
+ if (event && account?.removed && account.updateId === updateId)
464
+ return account;
465
+ throw new Error('Authswitch account removal outcome is unknown; refresh before retrying.');
466
+ }
467
+ }
468
+ async changeAccount(updateId, accountId, change) {
469
+ try {
470
+ return await this.transaction(async (session) => {
471
+ const metaStored = await AuthSwitchAuthorityMetaModel.exact.findStoredOne({ id: 'authswitch-authority' }, { session });
472
+ if (!metaStored)
473
+ throw new Error('Authswitch authority metadata is missing.');
474
+ const current = await AuthSwitchAuthorityAccountModel.exact.findStoredOne({ id: accountId }, { session });
475
+ const draft = change(current ? structuredClone(AuthSwitchAuthorityAccountModel.exact.toPersisted(current)) : null);
476
+ if (draft.id !== accountId || draft.updateId !== updateId)
477
+ throw new Error('Account change has an invalid identity.');
478
+ if (current && (draft.primaryGrantId !== current.primaryGrantId || draft.removed !== current.removed)) {
479
+ throw new Error('Account grant and removal state require an atomic grant change.');
480
+ }
481
+ await this.persistAccount(session, current, draft);
482
+ const meta = await this.appendEvent(session, AuthSwitchAuthorityMetaModel.exact.toPersisted(metaStored), updateId, 'account', accountId);
483
+ return { meta, account: draft };
484
+ });
485
+ }
486
+ catch (error) {
487
+ if (!(error instanceof plugins.smartdata.SmartdataExactPersistenceError) || error.code !== 'ambiguous_write')
488
+ throw error;
489
+ const event = await AuthSwitchAuthorityEventModel.exact.findStoredOne({ id: updateId });
490
+ const account = await this.readAccount(accountId);
491
+ if (event && account?.updateId === updateId)
492
+ return { meta: await this.readMeta(), account };
493
+ throw new Error('Authswitch account write outcome is unknown; no external exchange may start.');
494
+ }
495
+ }
496
+ async changeBinding(updateId, bindingId, accountId, change) {
497
+ try {
498
+ return await this.transaction(async (session) => {
499
+ const metaStored = await AuthSwitchAuthorityMetaModel.exact.findStoredOne({ id: 'authswitch-authority' }, { session });
500
+ const accountStored = await AuthSwitchAuthorityAccountModel.exact.findStoredOne({ id: accountId }, { session });
501
+ if (!metaStored || !accountStored)
502
+ throw new Error('Account is not available for this runtime.');
503
+ const account = AuthSwitchAuthorityAccountModel.exact.toPersisted(accountStored);
504
+ const grantStored = account.primaryGrantId
505
+ ? await AuthSwitchAuthorityGrantModel.exact.findStoredOne({ id: account.primaryGrantId }, { session }) : null;
506
+ const grant = grantStored ? AuthSwitchAuthorityGrantModel.exact.toPersisted(grantStored) : null;
507
+ const current = await AuthSwitchAuthorityBindingModel.exact.findStoredOne({ id: bindingId }, { session });
508
+ const draft = change(current ? structuredClone(AuthSwitchAuthorityBindingModel.exact.toPersisted(current)) : null, account, grant);
509
+ if (draft.id !== bindingId || draft.accountId !== accountId || draft.updateId !== updateId)
510
+ throw new Error('Binding change has an invalid identity.');
511
+ if (draft.grantId !== grant?.id)
512
+ throw new Error('Binding grant does not belong to the account.');
513
+ if (current && (draft.runtime !== current.runtime || draft.scopeId !== current.scopeId)) {
514
+ throw new Error('Runtime binding identity cannot change.');
515
+ }
516
+ assertStoredAuthorityBinding(draft);
517
+ if (current) {
518
+ const result = await AuthSwitchAuthorityBindingModel.exact.transition({
519
+ current, change: model => Object.assign(model, draft),
520
+ }, { session });
521
+ if (result.status !== 'transitioned')
522
+ throw new Error('Binding changed concurrently.');
523
+ }
524
+ else {
525
+ const result = await AuthSwitchAuthorityBindingModel.exact.insert(draft, { session });
526
+ if (result.status !== 'inserted')
527
+ throw new Error('Binding changed concurrently.');
528
+ }
529
+ const meta = await this.appendEvent(session, AuthSwitchAuthorityMetaModel.exact.toPersisted(metaStored), updateId, 'binding', accountId);
530
+ return { meta, binding: draft };
531
+ });
532
+ }
533
+ catch (error) {
534
+ if (!(error instanceof plugins.smartdata.SmartdataExactPersistenceError) || error.code !== 'ambiguous_write')
535
+ throw error;
536
+ const event = await AuthSwitchAuthorityEventModel.exact.findStoredOne({ id: updateId });
537
+ const binding = await this.readBinding(bindingId);
538
+ if (event && binding?.updateId === updateId)
539
+ return { meta: await this.readMeta(), binding };
540
+ throw new Error('Authswitch binding write outcome is unknown.');
541
+ }
542
+ }
543
+ /** Enrollment metadata is sealed by the caller and cannot become detached from an account. */
544
+ async changeEnrollment(updateId, enrollmentId, accountId, change) {
545
+ try {
546
+ return await this.transaction(async (session) => {
547
+ const metaStored = await AuthSwitchAuthorityMetaModel.exact.findStoredOne({ id: 'authswitch-authority' }, { session });
548
+ const accountStored = await AuthSwitchAuthorityAccountModel.exact.findStoredOne({ id: accountId }, { session });
549
+ if (!metaStored || !accountStored || accountStored.removed)
550
+ throw new Error('Enrollment account is unavailable.');
551
+ const current = await AuthSwitchAuthorityEnrollmentModel.exact.findStoredOne({ id: enrollmentId }, { session });
552
+ const draft = change(current ? structuredClone(AuthSwitchAuthorityEnrollmentModel.exact.toPersisted(current)) : null);
553
+ if (draft.id !== enrollmentId || draft.accountId !== accountId || draft.updateId !== updateId) {
554
+ throw new Error('Enrollment change has an invalid identity.');
555
+ }
556
+ assertStoredAuthorityEnrollment(draft);
557
+ if (current) {
558
+ const result = await AuthSwitchAuthorityEnrollmentModel.exact.transition({
559
+ current, change: model => Object.assign(model, draft),
560
+ }, { session });
561
+ if (result.status !== 'transitioned')
562
+ throw new Error('Enrollment changed concurrently.');
563
+ }
564
+ else {
565
+ const result = await AuthSwitchAuthorityEnrollmentModel.exact.insert(draft, { session });
566
+ if (result.status !== 'inserted')
567
+ throw new Error('Enrollment was added concurrently.');
568
+ }
569
+ await this.appendEvent(session, AuthSwitchAuthorityMetaModel.exact.toPersisted(metaStored), updateId, 'account', accountId);
570
+ return draft;
571
+ });
572
+ }
573
+ catch (error) {
574
+ if (!(error instanceof plugins.smartdata.SmartdataExactPersistenceError) || error.code !== 'ambiguous_write')
575
+ throw error;
576
+ const event = await AuthSwitchAuthorityEventModel.exact.findStoredOne({ id: updateId });
577
+ const enrollment = await this.readEnrollment(enrollmentId);
578
+ if (event && enrollment?.updateId === updateId)
579
+ return enrollment;
580
+ throw new Error('Authswitch enrollment write outcome is unknown.');
581
+ }
582
+ }
583
+ /** Journal and grant advance together; no intermediate phase may expose an active daemon grant. */
584
+ async changeHandoffAndGrant(updateId, handoffId, grantId, change) {
585
+ try {
586
+ return await this.transaction(async (session) => {
587
+ const metaStored = await AuthSwitchAuthorityMetaModel.exact.findStoredOne({ id: 'authswitch-authority' }, { session });
588
+ const grantStored = await AuthSwitchAuthorityGrantModel.exact.findStoredOne({ id: grantId }, { session });
589
+ if (!metaStored || !grantStored)
590
+ throw new Error('Native handoff grant is unavailable.');
591
+ const grant = AuthSwitchAuthorityGrantModel.exact.toPersisted(grantStored);
592
+ const accountStored = await AuthSwitchAuthorityAccountModel.exact.findStoredOne({ id: grant.accountId }, { session });
593
+ if (!accountStored || accountStored.removed)
594
+ throw new Error('Native handoff account is unavailable.');
595
+ const account = AuthSwitchAuthorityAccountModel.exact.toPersisted(accountStored);
596
+ const currentStored = await AuthSwitchAuthorityHandoffModel.exact.findStoredOne({ id: handoffId }, { session });
597
+ const current = currentStored ? AuthSwitchAuthorityHandoffModel.exact.toPersisted(currentStored) : null;
598
+ const draft = change(current ? structuredClone(current) : null, structuredClone(grant), structuredClone(account));
599
+ if (draft.handoff.id !== handoffId || draft.handoff.accountId !== account.id
600
+ || draft.handoff.grantId !== grantId || draft.handoff.updateId !== updateId
601
+ || draft.grant.id !== grantId || draft.grant.updateId !== updateId) {
602
+ throw new Error('Native handoff change has an invalid identity.');
603
+ }
604
+ assertStoredAuthorityHandoff(draft.handoff);
605
+ if (current) {
606
+ if (draft.handoff.operationId !== current.operationId
607
+ || draft.handoff.direction !== current.direction
608
+ || draft.handoff.nativeHomeId !== current.nativeHomeId
609
+ || draft.handoff.sourceDigest !== current.sourceDigest
610
+ || ['committed', 'aborted'].includes(current.phase)) {
611
+ throw new Error('Native handoff identity or terminal state cannot change.');
612
+ }
613
+ const allowed = {
614
+ prepared: ['source_stopped', 'needs_reauth', 'aborted'],
615
+ source_stopped: ['target_written', 'needs_reauth'],
616
+ target_written: ['verified', 'needs_reauth'],
617
+ verified: ['committed', 'needs_reauth'],
618
+ committed: [], needs_reauth: ['aborted'], aborted: [],
619
+ };
620
+ if (!allowed[current.phase].includes(draft.handoff.phase)
621
+ || draft.handoff.revision !== current.revision + 1) {
622
+ throw new Error('Native handoff phase transition is invalid.');
623
+ }
624
+ }
625
+ else if (draft.handoff.phase !== 'prepared' || draft.handoff.revision !== 1) {
626
+ throw new Error('Native handoff must begin with a prepared record.');
627
+ }
628
+ if (draft.handoff.phase !== 'committed'
629
+ && ['ready', 'retry_wait', 'exchange_may_have_been_sent'].includes(draft.grant.state)) {
630
+ throw new Error('An in-flight handoff cannot expose a daemon grant.');
631
+ }
632
+ if (draft.handoff.phase === 'committed') {
633
+ if (draft.handoff.direction === 'to_daemon'
634
+ ? draft.grant.state !== 'ready' || draft.grant.owner !== 'daemon' || draft.grant.ciphertext === null
635
+ : draft.grant.state !== 'native' || !['claude_native', 'legacy_native'].includes(draft.grant.owner)) {
636
+ throw new Error('Native handoff target ownership is invalid.');
637
+ }
638
+ }
639
+ await this.persistGrant(session, grantStored, draft.grant);
640
+ if (currentStored) {
641
+ const result = await AuthSwitchAuthorityHandoffModel.exact.transition({
642
+ current: currentStored, change: model => Object.assign(model, draft.handoff),
643
+ }, { session });
644
+ if (result.status !== 'transitioned')
645
+ throw new Error('Native handoff changed concurrently.');
646
+ }
647
+ else {
648
+ const result = await AuthSwitchAuthorityHandoffModel.exact.insert(draft.handoff, { session });
649
+ if (result.status !== 'inserted')
650
+ throw new Error('Native handoff was added concurrently.');
651
+ }
652
+ await this.persistAccount(session, accountStored, { ...account, revision: account.revision + 1,
653
+ statusObservedAt: draft.handoff.statusObservedAt, updateId });
654
+ await this.appendEvent(session, AuthSwitchAuthorityMetaModel.exact.toPersisted(metaStored), updateId, 'account', account.id);
655
+ return draft;
656
+ });
657
+ }
658
+ catch (error) {
659
+ if (!(error instanceof plugins.smartdata.SmartdataExactPersistenceError) || error.code !== 'ambiguous_write')
660
+ throw error;
661
+ const event = await AuthSwitchAuthorityEventModel.exact.findStoredOne({ id: updateId });
662
+ const handoff = await this.readHandoff(handoffId);
663
+ const grant = await this.readGrant(grantId);
664
+ if (event && handoff?.updateId === updateId && grant?.updateId === updateId)
665
+ return { handoff, grant };
666
+ throw new Error('Authswitch handoff write outcome is unknown; native ownership remains blocked.');
667
+ }
668
+ }
669
+ /** Ledger transitions never silently replace an active credential or waive backup proof. */
670
+ async changeMigrationLedger(updateId, ledgerId, change) {
671
+ try {
672
+ return await this.transaction(async (session) => {
673
+ const current = await AuthSwitchAuthorityMigrationLedgerModel.exact.findStoredOne({ id: ledgerId }, { session });
674
+ const draft = change(current ? structuredClone(AuthSwitchAuthorityMigrationLedgerModel.exact.toPersisted(current)) : null);
675
+ if (draft.id !== ledgerId || draft.updateId !== updateId)
676
+ throw new Error('Migration ledger identity is invalid.');
677
+ assertStoredAuthorityMigrationLedger(draft);
678
+ if (draft.status === 'complete' && draft.backupDigest === null)
679
+ throw new Error('Migration completion requires verified backup proof.');
680
+ if (current) {
681
+ if (current.status === 'complete' || current.version !== draft.version
682
+ || current.sourceKind !== draft.sourceKind || current.sourcePathHash !== draft.sourcePathHash
683
+ || current.sourceDigest !== draft.sourceDigest || draft.revision !== current.revision + 1) {
684
+ throw new Error('Migration source identity or terminal status cannot change.');
685
+ }
686
+ const result = await AuthSwitchAuthorityMigrationLedgerModel.exact.transition({
687
+ current, change: model => Object.assign(model, draft),
688
+ }, { session });
689
+ if (result.status !== 'transitioned')
690
+ throw new Error('Migration ledger changed concurrently.');
691
+ }
692
+ else {
693
+ if (draft.revision !== 1 || draft.status === 'complete')
694
+ throw new Error('Migration must begin pending or prepared.');
695
+ const result = await AuthSwitchAuthorityMigrationLedgerModel.exact.insert(draft, { session });
696
+ if (result.status !== 'inserted')
697
+ throw new Error('Migration ledger was added concurrently.');
698
+ }
699
+ return draft;
700
+ });
701
+ }
702
+ catch (error) {
703
+ if (!(error instanceof plugins.smartdata.SmartdataExactPersistenceError) || error.code !== 'ambiguous_write')
704
+ throw error;
705
+ const ledger = await this.readMigrationLedger(ledgerId);
706
+ if (ledger?.updateId === updateId)
707
+ return ledger;
708
+ throw new Error('Authswitch migration ledger write outcome is unknown.');
709
+ }
710
+ }
711
+ async stop() {
712
+ this.started = false;
713
+ const database = this.database;
714
+ const engine = this.engine;
715
+ this.database = undefined;
716
+ this.engine = undefined;
717
+ const errors = [];
718
+ if (database)
719
+ try {
720
+ await database.close();
721
+ }
722
+ catch (error) {
723
+ errors.push(error);
724
+ }
725
+ if (engine)
726
+ try {
727
+ await engine.stop();
728
+ }
729
+ catch (error) {
730
+ errors.push(error);
731
+ }
732
+ if (errors.length)
733
+ throw new AggregateError(errors, 'Authswitch database shutdown was incomplete.');
734
+ }
735
+ }
736
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5hdXRob3JpdHlkYXRhYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuYXV0aG9yaXR5ZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUNMLCtCQUErQixFQUFFLCtCQUErQixFQUFFLGtDQUFrQyxFQUNwRyw2QkFBNkIsRUFBRSw2QkFBNkIsRUFBRSwrQkFBK0IsRUFDN0YsNEJBQTRCLEVBQUUsdUNBQXVDLEVBQUUsNEJBQTRCLEVBQ25HLDRCQUE0QixFQUFFLCtCQUErQixFQUFFLDBCQUEwQixFQUN6Riw0QkFBNEIsRUFBRSxvQ0FBb0MsR0FJbkUsTUFBTSw4QkFBOEIsQ0FBQztBQVV0QywwR0FBMEc7QUFDMUcsTUFBTSxPQUFPLDJCQUEyQjtJQUtUO0lBSnJCLE1BQU0sQ0FBZ0M7SUFDdEMsUUFBUSxDQUFpQztJQUN6QyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBRXhCLFlBQTZCLE9BQTRDO1FBQTVDLFlBQU8sR0FBUCxPQUFPLENBQXFDO0lBQUcsQ0FBQztJQUVyRSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsT0FBZTtRQUM1QyxNQUFNLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sSUFBSSxHQUFHLE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUNwRixNQUFNLElB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