@modelprofile.com/authswitch 6.4.0 → 7.0.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 (98) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/authority-contract.d.ts +302 -6
  3. package/dist_ts/authority-contract.js +1 -1
  4. package/dist_ts/authority-runtime-contract.d.ts +15 -0
  5. package/dist_ts/authorityrehearsal.child.d.ts +1 -0
  6. package/dist_ts/authorityrehearsal.child.js +395 -0
  7. package/dist_ts/classes.accountlist.js +4 -3
  8. package/dist_ts/classes.authoritybackup.d.ts +134 -0
  9. package/dist_ts/classes.authoritybackup.js +769 -0
  10. package/dist_ts/classes.authoritybroker.d.ts +29 -6
  11. package/dist_ts/classes.authoritybroker.js +413 -122
  12. package/dist_ts/classes.authoritycli.d.ts +24 -0
  13. package/dist_ts/classes.authoritycli.js +675 -0
  14. package/dist_ts/classes.authorityclient.d.ts +34 -9
  15. package/dist_ts/classes.authorityclient.js +136 -38
  16. package/dist_ts/classes.authoritydaemon.d.ts +47 -0
  17. package/dist_ts/classes.authoritydaemon.js +705 -16
  18. package/dist_ts/classes.authoritydatabase.d.ts +182 -8
  19. package/dist_ts/classes.authoritydatabase.js +1188 -41
  20. package/dist_ts/classes.authoritymodels.d.ts +247 -1
  21. package/dist_ts/classes.authoritymodels.js +870 -6
  22. package/dist_ts/classes.authoritypreuse.d.ts +47 -0
  23. package/dist_ts/classes.authoritypreuse.js +278 -0
  24. package/dist_ts/classes.authorityregistry.d.ts +24 -0
  25. package/dist_ts/classes.authorityregistry.js +88 -0
  26. package/dist_ts/classes.authorityrehearsal.d.ts +127 -0
  27. package/dist_ts/classes.authorityrehearsal.js +632 -0
  28. package/dist_ts/classes.authorityusage.d.ts +160 -0
  29. package/dist_ts/classes.authorityusage.js +429 -0
  30. package/dist_ts/classes.claudeauthority.d.ts +66 -0
  31. package/dist_ts/classes.claudeauthority.js +532 -0
  32. package/dist_ts/classes.claudecodeharness.js +3 -2
  33. package/dist_ts/classes.claudecodelocks.d.ts +13 -0
  34. package/dist_ts/classes.claudecodelocks.js +75 -3
  35. package/dist_ts/classes.claudenative.d.ts +137 -0
  36. package/dist_ts/classes.claudenative.js +731 -0
  37. package/dist_ts/classes.claudestatus.d.ts +9 -0
  38. package/dist_ts/classes.claudestatus.js +26 -9
  39. package/dist_ts/classes.claudetokenrefresh.d.ts +15 -1
  40. package/dist_ts/classes.claudetokenrefresh.js +74 -21
  41. package/dist_ts/classes.codexharness.js +4 -2
  42. package/dist_ts/classes.codexmanaged.d.ts +91 -0
  43. package/dist_ts/classes.codexmanaged.js +404 -0
  44. package/dist_ts/classes.codexpreuse.d.ts +8 -0
  45. package/dist_ts/classes.codexpreuse.js +24 -6
  46. package/dist_ts/classes.fileharness.d.ts +2 -0
  47. package/dist_ts/classes.fileharness.js +6 -4
  48. package/dist_ts/classes.limits.js +12 -7
  49. package/dist_ts/classes.opencodeharness.js +2 -2
  50. package/dist_ts/claudehttp.d.ts +10 -0
  51. package/dist_ts/claudehttp.js +29 -3
  52. package/dist_ts/index.d.ts +2 -0
  53. package/dist_ts/index.js +8 -1
  54. package/dist_ts/interfaces.harness.d.ts +6 -0
  55. package/dist_ts/interfaces.list.d.ts +9 -3
  56. package/dist_ts/plugins.d.ts +7 -3
  57. package/dist_ts/plugins.js +9 -4
  58. package/dist_ts/ts_migration/0001_authority_meta.d.ts +3 -0
  59. package/dist_ts/ts_migration/0001_authority_meta.js +32 -0
  60. package/dist_ts/ts_migration/index.d.ts +3 -0
  61. package/dist_ts/ts_migration/index.js +6 -0
  62. package/package.json +12 -2
  63. package/readme.md +205 -13
  64. package/ts/00_commitinfo_data.ts +1 -1
  65. package/ts/authority-contract.ts +264 -9
  66. package/ts/authority-runtime-contract.ts +21 -1
  67. package/ts/authorityrehearsal.child.ts +330 -0
  68. package/ts/classes.accountlist.ts +3 -2
  69. package/ts/classes.authoritybackup.ts +780 -0
  70. package/ts/classes.authoritybroker.ts +410 -120
  71. package/ts/classes.authoritycli.ts +719 -0
  72. package/ts/classes.authorityclient.ts +164 -38
  73. package/ts/classes.authoritydaemon.ts +614 -17
  74. package/ts/classes.authoritydatabase.ts +1229 -44
  75. package/ts/classes.authoritymodels.ts +579 -4
  76. package/ts/classes.authoritypreuse.ts +297 -0
  77. package/ts/classes.authorityregistry.ts +118 -0
  78. package/ts/classes.authorityrehearsal.ts +625 -0
  79. package/ts/classes.authorityusage.ts +527 -0
  80. package/ts/classes.claudeauthority.ts +541 -0
  81. package/ts/classes.claudecodeharness.ts +2 -1
  82. package/ts/classes.claudecodelocks.ts +70 -1
  83. package/ts/classes.claudenative.ts +816 -0
  84. package/ts/classes.claudestatus.ts +38 -9
  85. package/ts/classes.claudetokenrefresh.ts +82 -19
  86. package/ts/classes.codexharness.ts +3 -1
  87. package/ts/classes.codexmanaged.ts +402 -0
  88. package/ts/classes.codexpreuse.ts +33 -5
  89. package/ts/classes.fileharness.ts +7 -3
  90. package/ts/classes.limits.ts +11 -6
  91. package/ts/classes.opencodeharness.ts +1 -1
  92. package/ts/claudehttp.ts +31 -2
  93. package/ts/index.ts +7 -0
  94. package/ts/interfaces.harness.ts +6 -0
  95. package/ts/interfaces.list.ts +9 -3
  96. package/ts/plugins.ts +9 -3
  97. package/ts/ts_migration/0001_authority_meta.ts +33 -0
  98. package/ts/ts_migration/index.ts +7 -0
@@ -0,0 +1,47 @@
1
+ import * as plugins from './plugins.js';
2
+ import type { IAuthSwitchPreuseOperation } from './authority-contract.js';
3
+ import { AuthSwitchAuthorityBroker } from './classes.authoritybroker.js';
4
+ import { AuthSwitchAuthorityDatabase } from './classes.authoritydatabase.js';
5
+ import { type ICodexPreuseLifecycle } from './classes.codexpreuse.js';
6
+ import type { IHarnessPreuseOptions, IHarnessPreuseResult } from './interfaces.harness.js';
7
+ export interface IAuthSwitchAuthorityPreuseExecutor {
8
+ runAccess(credential: plugins.flexAccounts.IOpenAiChatGptAccessCredential, options: IHarnessPreuseOptions, lifecycle: ICodexPreuseLifecycle): Promise<IHarnessPreuseResult>;
9
+ }
10
+ export interface IAuthSwitchAuthorityPreuseOptions {
11
+ executor?: IAuthSwitchAuthorityPreuseExecutor;
12
+ now?: () => number;
13
+ minAccessValidityMs?: number;
14
+ }
15
+ export interface IAuthSwitchAuthorityPreuseRequest {
16
+ operationId: string;
17
+ accountId: string;
18
+ loginId: string;
19
+ purpose: 'openai_managed';
20
+ prompt: string;
21
+ model?: string;
22
+ }
23
+ export type TAuthSwitchAuthorityPreuseFreshAdmission = () => 'admitted' | 'account_busy';
24
+ /** Durable, at-most-once owner of one quota-consuming inference for one exact login. */
25
+ export declare class AuthSwitchAuthorityPreuse {
26
+ private readonly database;
27
+ private readonly broker;
28
+ private readonly executor;
29
+ private readonly now;
30
+ private readonly minAccessValidityMs;
31
+ private readonly starts;
32
+ private readonly running;
33
+ private closed;
34
+ constructor(database: AuthSwitchAuthorityDatabase, broker: AuthSwitchAuthorityBroker, options?: IAuthSwitchAuthorityPreuseOptions);
35
+ /** Terminalize every abandoned record before management admission opens. */
36
+ start(): Promise<void>;
37
+ begin(input: IAuthSwitchAuthorityPreuseRequest, admitFresh: TAuthSwitchAuthorityPreuseFreshAdmission): Promise<IAuthSwitchPreuseOperation>;
38
+ private admit;
39
+ private perform;
40
+ private fail;
41
+ private readStored;
42
+ get(operationId: string): Promise<IAuthSwitchPreuseOperation>;
43
+ cancel(operationId: string): Promise<IAuthSwitchPreuseOperation>;
44
+ wait(operationId: string): Promise<void>;
45
+ hasActive(operationId: string): boolean;
46
+ close(): Promise<void>;
47
+ }
@@ -0,0 +1,278 @@
1
+ import * as plugins from './plugins.js';
2
+ import { AuthSwitchAuthorityBroker } from './classes.authoritybroker.js';
3
+ import { AuthSwitchAuthorityDatabase } from './classes.authoritydatabase.js';
4
+ import { CodexPreuse } from './classes.codexpreuse.js';
5
+ import { validatePreuseOptions } from './preuse.js';
6
+ const uuid = (value) => typeof value === 'string' && /^[a-f0-9-]{36}$/.test(value);
7
+ const hash = (value) => typeof value === 'string' && /^[a-f0-9]{64}$/.test(value);
8
+ const publicOperation = (operation) => ({
9
+ id: operation.id, accountId: operation.accountId, loginId: operation.grantId,
10
+ purpose: operation.purpose, requestedModel: operation.requestedModel, model: operation.model,
11
+ state: operation.state, result: operation.result, problem: operation.problem,
12
+ createdAt: operation.createdAt, updatedAt: operation.updatedAt,
13
+ finishedAt: operation.finishedAt, revision: operation.revision,
14
+ });
15
+ /** Durable, at-most-once owner of one quota-consuming inference for one exact login. */
16
+ export class AuthSwitchAuthorityPreuse {
17
+ database;
18
+ broker;
19
+ executor;
20
+ now;
21
+ minAccessValidityMs;
22
+ starts = new Map();
23
+ running = new Map();
24
+ closed = false;
25
+ constructor(database, broker, options = {}) {
26
+ this.database = database;
27
+ this.broker = broker;
28
+ this.executor = options.executor ?? new CodexPreuse();
29
+ this.now = options.now ?? Date.now;
30
+ this.minAccessValidityMs = options.minAccessValidityMs ?? 300_000;
31
+ }
32
+ /** Terminalize every abandoned record before management admission opens. */
33
+ async start() {
34
+ for (const state of ['preparing', 'request_may_have_started']) {
35
+ let after = null;
36
+ while (true) {
37
+ const page = await this.database.preuseOperationsByState(state, after);
38
+ if (!page.length)
39
+ break;
40
+ for (const operation of page) {
41
+ const updateId = plugins.crypto.randomUUID();
42
+ const now = new Date(this.now()).toISOString();
43
+ await this.database.changePreuseOperation(updateId, operation.id, current => {
44
+ if (current.state !== state)
45
+ throw new Error('Preuse recovery changed concurrently.');
46
+ return { ...current, state: state === 'preparing' ? 'not_sent' : 'outcome_unknown',
47
+ problem: state === 'preparing' ? 'interrupted' : 'request_uncertain',
48
+ updatedAt: now, finishedAt: now, revision: current.revision + 1, updateId };
49
+ });
50
+ }
51
+ after = page.at(-1).id;
52
+ }
53
+ }
54
+ }
55
+ begin(input, admitFresh) {
56
+ if (this.closed)
57
+ return Promise.reject(new Error('Authswitch preuse is closing.'));
58
+ if (!uuid(input.operationId) || !hash(input.accountId) || !hash(input.loginId)
59
+ || input.purpose !== 'openai_managed') {
60
+ return Promise.reject(new Error('Invalid preuse target.'));
61
+ }
62
+ validatePreuseOptions({ prompt: input.prompt, model: input.model });
63
+ const requestedModel = input.model ?? null;
64
+ const requestHash = plugins.crypto.createHash('sha256').update(JSON.stringify([
65
+ 'authswitch-preuse-v1', input.accountId, input.loginId, input.purpose, input.prompt, requestedModel,
66
+ ])).digest('hex');
67
+ const active = this.running.get(input.operationId);
68
+ if (active) {
69
+ if (active.requestHash !== requestHash)
70
+ return Promise.reject(new Error('Preuse operation ID belongs to a different request.'));
71
+ return this.get(input.operationId);
72
+ }
73
+ const starting = this.starts.get(input.operationId);
74
+ if (starting) {
75
+ if (starting.requestHash !== requestHash)
76
+ return Promise.reject(new Error('Preuse operation ID belongs to a different request.'));
77
+ return starting.promise;
78
+ }
79
+ const promise = this.admit(input, requestHash, requestedModel, admitFresh).finally(() => {
80
+ if (this.starts.get(input.operationId)?.promise === promise)
81
+ this.starts.delete(input.operationId);
82
+ });
83
+ this.starts.set(input.operationId, { requestHash, promise });
84
+ return promise;
85
+ }
86
+ async admit(input, requestHash, requestedModel, admitFresh) {
87
+ await this.database.assertOpenAdmission();
88
+ if (this.closed)
89
+ throw new Error('Authswitch preuse is closing.');
90
+ const prior = await this.database.readOperation(input.operationId);
91
+ if (prior) {
92
+ if (prior.kind !== 'preuse_openai' || prior.accountId !== input.accountId || prior.grantId !== input.loginId
93
+ || prior.purpose !== input.purpose || prior.requestHash !== requestHash
94
+ || prior.requestedModel !== requestedModel) {
95
+ throw new Error('Preuse operation ID belongs to a different request.');
96
+ }
97
+ if (prior.state !== 'preparing')
98
+ return publicOperation(prior);
99
+ const updateId = plugins.crypto.randomUUID();
100
+ const interruptedAt = new Date(this.now()).toISOString();
101
+ return publicOperation(await this.database.changePreuseOperation(updateId, prior.id, current => ({
102
+ ...current, state: 'not_sent', problem: 'interrupted', updatedAt: interruptedAt,
103
+ finishedAt: interruptedAt, revision: current.revision + 1, updateId,
104
+ })));
105
+ }
106
+ const context = await this.database.readUsageContext(input.accountId, input.loginId);
107
+ if (!context || context.providerId !== 'openai' || context.purpose !== input.purpose
108
+ || context.owner !== 'daemon' || context.removed
109
+ || !['ready', 'retry_wait'].includes(context.grantState)) {
110
+ throw new Error('Selected OpenAI login is unavailable for preuse.');
111
+ }
112
+ if (this.closed)
113
+ throw new Error('Authswitch preuse is closing.');
114
+ const freshAdmission = admitFresh();
115
+ if (freshAdmission === 'admitted' && this.running.size >= 32) {
116
+ throw new Error('Too many active preuse operations.');
117
+ }
118
+ const now = new Date(this.now()).toISOString();
119
+ const admitted = await this.database.createPreuseOperation({
120
+ id: input.operationId, kind: 'preuse_openai', purpose: input.purpose,
121
+ accountId: input.accountId, grantId: input.loginId, requestHash, requestedModel,
122
+ model: null, authorizationGeneration: context.authorizationGeneration, grantGeneration: null,
123
+ state: 'preparing', result: null, problem: 'none', createdAt: now, updatedAt: now,
124
+ finishedAt: null, revision: 1, updateId: plugins.crypto.randomUUID(),
125
+ });
126
+ if (!admitted.created) {
127
+ if (admitted.operation.state !== 'preparing')
128
+ return publicOperation(admitted.operation);
129
+ const updateId = plugins.crypto.randomUUID();
130
+ const interruptedAt = new Date(this.now()).toISOString();
131
+ const interrupted = await this.database.changePreuseOperation(updateId, admitted.operation.id, current => ({
132
+ ...current, state: 'not_sent', problem: 'interrupted', updatedAt: interruptedAt,
133
+ finishedAt: interruptedAt, revision: current.revision + 1, updateId,
134
+ }));
135
+ return publicOperation(interrupted);
136
+ }
137
+ if (freshAdmission === 'account_busy') {
138
+ const updateId = plugins.crypto.randomUUID();
139
+ const finishedAt = new Date(this.now()).toISOString();
140
+ const busy = await this.database.changePreuseOperation(updateId, admitted.operation.id, current => ({
141
+ ...current, state: 'not_sent', problem: 'account_busy', updatedAt: finishedAt,
142
+ finishedAt, revision: current.revision + 1, updateId,
143
+ }));
144
+ return publicOperation(busy);
145
+ }
146
+ if (this.closed) {
147
+ const updateId = plugins.crypto.randomUUID();
148
+ const closedAt = new Date(this.now()).toISOString();
149
+ const closed = await this.database.changePreuseOperation(updateId, admitted.operation.id, current => ({
150
+ ...current, state: 'not_sent', problem: 'authority_closing', updatedAt: closedAt,
151
+ finishedAt: closedAt, revision: current.revision + 1, updateId,
152
+ }));
153
+ return publicOperation(closed);
154
+ }
155
+ const controller = new AbortController();
156
+ const owned = { requestHash, controller, task: Promise.resolve() };
157
+ this.running.set(input.operationId, owned);
158
+ owned.task = this.perform(admitted.operation, input.prompt, controller.signal).finally(() => {
159
+ if (this.running.get(input.operationId) === owned)
160
+ this.running.delete(input.operationId);
161
+ });
162
+ void owned.task.catch(() => { });
163
+ return publicOperation(admitted.operation);
164
+ }
165
+ async perform(operation, prompt, signal) {
166
+ let phase = 'target';
167
+ try {
168
+ signal.throwIfAborted();
169
+ const context = await this.database.readUsageContext(operation.accountId, operation.grantId);
170
+ if (!context || context.providerId !== 'openai' || context.purpose !== operation.purpose
171
+ || context.owner !== 'daemon' || context.removed
172
+ || context.authorizationGeneration !== operation.authorizationGeneration
173
+ || !['ready', 'retry_wait'].includes(context.grantState)) {
174
+ throw new Error('Preuse target changed.');
175
+ }
176
+ phase = 'access';
177
+ const access = await this.broker.resolveUsageAccess(context, undefined, this.minAccessValidityMs);
178
+ signal.throwIfAborted();
179
+ phase = operation.requestedModel === null ? 'catalog' : 'access';
180
+ const credential = {
181
+ kind: 'chatgptAccess', providerId: 'openai', accessToken: access.accessToken,
182
+ accountId: access.accountId, isFedrampAccount: access.isFedrampAccount,
183
+ };
184
+ const result = await this.executor.runAccess(credential, { prompt, ...(operation.requestedModel === null ? {} : { model: operation.requestedModel }), signal }, { beforeRequest: async (model) => {
185
+ signal.throwIfAborted();
186
+ await this.database.markPreuseRequestMayHaveStarted(operation.id, plugins.crypto.randomUUID(), model, access.grantGeneration, new Date(this.now()).toISOString());
187
+ } });
188
+ const current = await this.readStored(operation.id);
189
+ if (current.state !== 'request_may_have_started')
190
+ return;
191
+ const count = (value) => Number.isSafeInteger(value) && value >= 0 ? value : null;
192
+ const updateId = plugins.crypto.randomUUID();
193
+ const now = new Date(this.now()).toISOString();
194
+ await this.database.changePreuseOperation(updateId, operation.id, prior => ({ ...prior,
195
+ state: 'complete', result: { inputTokens: count(result.inputTokens), outputTokens: count(result.outputTokens),
196
+ totalTokens: count(result.totalTokens) }, problem: 'none', updatedAt: now, finishedAt: now,
197
+ revision: prior.revision + 1, updateId }));
198
+ }
199
+ catch {
200
+ await this.fail(operation.id, phase, signal);
201
+ }
202
+ }
203
+ async fail(operationId, phase, signal) {
204
+ let current;
205
+ try {
206
+ current = await this.readStored(operationId);
207
+ }
208
+ catch {
209
+ return;
210
+ }
211
+ if (!['preparing', 'request_may_have_started'].includes(current.state))
212
+ return;
213
+ const marked = current.state === 'request_may_have_started';
214
+ const problem = marked
215
+ ? this.closed ? 'authority_closing' : signal.aborted ? 'cancelled' : 'request_uncertain'
216
+ : this.closed ? 'authority_closing' : signal.aborted ? 'cancelled'
217
+ : phase === 'target' ? 'target_unavailable' : phase === 'catalog' ? 'catalog_unavailable' : 'access_unavailable';
218
+ const updateId = plugins.crypto.randomUUID();
219
+ const now = new Date(this.now()).toISOString();
220
+ try {
221
+ await this.database.changePreuseOperation(updateId, operationId, prior => ({ ...prior,
222
+ state: marked ? 'outcome_unknown' : 'not_sent', problem,
223
+ updatedAt: now, finishedAt: now, revision: prior.revision + 1, updateId }));
224
+ }
225
+ catch { /* A durable request marker remains recoverable as outcome_unknown on restart. */ }
226
+ }
227
+ async readStored(operationId) {
228
+ if (!uuid(operationId))
229
+ throw new Error('Invalid preuse operation ID.');
230
+ const operation = await this.database.readOperation(operationId);
231
+ if (!operation || operation.kind !== 'preuse_openai')
232
+ throw new Error('Preuse operation was not found.');
233
+ return operation;
234
+ }
235
+ async get(operationId) {
236
+ return publicOperation(await this.readStored(operationId));
237
+ }
238
+ async cancel(operationId) {
239
+ let current = await this.readStored(operationId);
240
+ if (!['preparing', 'request_may_have_started'].includes(current.state))
241
+ return publicOperation(current);
242
+ this.running.get(operationId)?.controller.abort(new Error('Preuse cancelled.'));
243
+ const updateId = plugins.crypto.randomUUID();
244
+ const now = new Date(this.now()).toISOString();
245
+ try {
246
+ current = await this.database.changePreuseOperation(updateId, operationId, prior => ({ ...prior,
247
+ state: prior.state === 'preparing' ? 'not_sent' : 'outcome_unknown', problem: 'cancelled',
248
+ updatedAt: now, finishedAt: now, revision: prior.revision + 1, updateId }));
249
+ }
250
+ catch {
251
+ current = await this.readStored(operationId);
252
+ if (['preparing', 'request_may_have_started'].includes(current.state))
253
+ throw new Error('Preuse cancellation outcome is unknown.');
254
+ }
255
+ return publicOperation(current);
256
+ }
257
+ async wait(operationId) {
258
+ const starting = this.starts.get(operationId);
259
+ if (starting)
260
+ await starting.promise;
261
+ const running = this.running.get(operationId);
262
+ if (running)
263
+ await running.task;
264
+ }
265
+ hasActive(operationId) {
266
+ return this.starts.has(operationId) || this.running.has(operationId);
267
+ }
268
+ async close() {
269
+ if (this.closed)
270
+ return;
271
+ this.closed = true;
272
+ await Promise.allSettled([...this.starts.values()].map(item => item.promise));
273
+ for (const running of this.running.values())
274
+ running.controller.abort(new Error('Authswitch authority is closing.'));
275
+ await Promise.allSettled([...this.running.values()].map(item => item.task));
276
+ }
277
+ }
278
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5hdXRob3JpdHlwcmV1c2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmF1dGhvcml0eXByZXVzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUV4QyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUU3RSxPQUFPLEVBQUUsV0FBVyxFQUE4QixNQUFNLDBCQUEwQixDQUFDO0FBRW5GLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQThCcEQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxLQUFjLEVBQW1CLEVBQUUsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzdHLE1BQU0sSUFBSSxHQUFHLENBQUMsS0FBYyxFQUFtQixFQUFFLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM1RyxNQUFNLGVBQWUsR0FBRyxDQUFDLFNBQTBDLEVBQThCLEVBQUUsQ0FBQyxDQUFDO0lBQ25HLEVBQUUsRUFBRSxTQUFTLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTztJQUM1RSxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsU0FBUyxDQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLEtBQUs7SUFDNUYsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPO0lBQzVFLFNB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
@@ -0,0 +1,24 @@
1
+ import * as plugins from './plugins.js';
2
+ export interface IAuthorityStoredRecord {
3
+ model: string;
4
+ id: string;
5
+ value: unknown;
6
+ }
7
+ interface IAuthorityModelEntry {
8
+ readonly name: string;
9
+ initialize(db: plugins.smartdata.SmartdataDb): Promise<void>;
10
+ prepare(): Promise<void>;
11
+ assert(value: unknown): void;
12
+ page(after: string | null, limit: number, session?: plugins.smartdata.SmartdataSession, signal?: AbortSignal): Promise<IAuthorityStoredRecord[]>;
13
+ insert(record: IAuthorityStoredRecord, session?: plugins.smartdata.SmartdataSession): Promise<void>;
14
+ }
15
+ /** The sole authority collection inventory, in portable model+stable-ID order. */
16
+ export declare const authorityModelRegistry: readonly IAuthorityModelEntry[];
17
+ export declare const authorityModel: (name: string) => IAuthorityModelEntry;
18
+ export declare const assertAuthorityStoredRecord: (record: IAuthorityStoredRecord) => void;
19
+ export declare function authorityStoredRecords(options?: {
20
+ session?: plugins.smartdata.SmartdataSession;
21
+ signal?: AbortSignal;
22
+ pageSize?: number;
23
+ }): AsyncGenerator<IAuthorityStoredRecord>;
24
+ export {};
@@ -0,0 +1,88 @@
1
+ import * as plugins from './plugins.js';
2
+ import { AuthSwitchAuthorityAccountModel, AuthSwitchAuthorityBindingModel, AuthSwitchAuthorityClaudeHandoffModel, AuthSwitchAuthorityClaudeHomeModel, AuthSwitchAuthorityCodexHomeModel, AuthSwitchAuthorityEnrollmentModel, AuthSwitchAuthorityEventModel, AuthSwitchAuthorityGrantModel, AuthSwitchAuthorityHandoffModel, AuthSwitchAuthorityMetaModel, AuthSwitchAuthorityMigrationLedgerModel, AuthSwitchAuthorityOperationModel, AuthSwitchAuthorityUsageModel, assertStoredAuthorityAccount, assertStoredAuthorityBinding, assertStoredAuthorityClaudeHandoff, assertStoredAuthorityClaudeHome, assertStoredAuthorityCodexHome, assertStoredAuthorityEnrollment, assertStoredAuthorityEvent, assertStoredAuthorityGrant, assertStoredAuthorityHandoff, assertStoredAuthorityMeta, assertStoredAuthorityMigrationLedger, assertStoredAuthorityOperationDocument, assertStoredAuthorityUsage, } from './classes.authoritymodels.js';
3
+ const define = (name, model, assertDocument) => Object.freeze({
4
+ name,
5
+ initialize: async (db) => {
6
+ plugins.smartdata.setDefaultManagerForDoc({ db }, model);
7
+ await model.init();
8
+ },
9
+ prepare: () => model.exact.prepare(),
10
+ assert: (value) => { assertDocument(value); },
11
+ page: async (after, limit, session, signal) => {
12
+ const query = {
13
+ filter: after === null ? {} : { id: { $gt: after } }, sort: { id: 1 }, limit, session, signal,
14
+ };
15
+ const stored = await model.exact.findStored(query);
16
+ return stored.map(item => {
17
+ const value = model.exact.toPersisted(item);
18
+ return { model: name, id: value.id, value };
19
+ });
20
+ },
21
+ insert: async (record, session) => {
22
+ assertDocument(record.value);
23
+ if (record.value.id !== record.id)
24
+ throw new Error('Authority restore record identity differs from its key.');
25
+ const result = await model.exact.insert(record.value, { session });
26
+ if (result.status !== 'inserted')
27
+ throw new Error('Authority restore record already exists.');
28
+ },
29
+ });
30
+ /** The sole authority collection inventory, in portable model+stable-ID order. */
31
+ export const authorityModelRegistry = Object.freeze([
32
+ define('authswitch_authority_accounts', AuthSwitchAuthorityAccountModel, assertStoredAuthorityAccount),
33
+ define('authswitch_authority_bindings', AuthSwitchAuthorityBindingModel, assertStoredAuthorityBinding),
34
+ define('authswitch_authority_claude_handoffs', AuthSwitchAuthorityClaudeHandoffModel, assertStoredAuthorityClaudeHandoff),
35
+ define('authswitch_authority_claude_homes', AuthSwitchAuthorityClaudeHomeModel, assertStoredAuthorityClaudeHome),
36
+ define('authswitch_authority_codex_homes', AuthSwitchAuthorityCodexHomeModel, assertStoredAuthorityCodexHome),
37
+ define('authswitch_authority_enrollments', AuthSwitchAuthorityEnrollmentModel, assertStoredAuthorityEnrollment),
38
+ define('authswitch_authority_events', AuthSwitchAuthorityEventModel, assertStoredAuthorityEvent),
39
+ define('authswitch_authority_grants', AuthSwitchAuthorityGrantModel, assertStoredAuthorityGrant),
40
+ define('authswitch_authority_handoffs', AuthSwitchAuthorityHandoffModel, assertStoredAuthorityHandoff),
41
+ define('authswitch_authority_meta', AuthSwitchAuthorityMetaModel, assertStoredAuthorityMeta),
42
+ define('authswitch_authority_migration_ledger', AuthSwitchAuthorityMigrationLedgerModel, assertStoredAuthorityMigrationLedger),
43
+ define('authswitch_authority_operations', AuthSwitchAuthorityOperationModel, assertStoredAuthorityOperationDocument),
44
+ define('authswitch_authority_usage', AuthSwitchAuthorityUsageModel, assertStoredAuthorityUsage),
45
+ ]);
46
+ for (let index = 1; index < authorityModelRegistry.length; index++) {
47
+ if (authorityModelRegistry[index - 1].name >= authorityModelRegistry[index].name) {
48
+ throw new Error('Authority model registry must be unique and sorted.');
49
+ }
50
+ }
51
+ export const authorityModel = (name) => {
52
+ const entry = authorityModelRegistry.find(item => item.name === name);
53
+ if (!entry)
54
+ throw new Error('Unclassified authority model cannot be read, backed up or restored.');
55
+ return entry;
56
+ };
57
+ export const assertAuthorityStoredRecord = (record) => {
58
+ if (!record || typeof record.model !== 'string' || typeof record.id !== 'string' || !record.id) {
59
+ throw new Error('Invalid authority record identity.');
60
+ }
61
+ authorityModel(record.model).assert(record.value);
62
+ if (!record.value || typeof record.value !== 'object' || !('id' in record.value)
63
+ || record.value.id !== record.id)
64
+ throw new Error('Invalid authority record identity.');
65
+ };
66
+ export async function* authorityStoredRecords(options = {}) {
67
+ const pageSize = options.pageSize ?? 64;
68
+ if (!Number.isSafeInteger(pageSize) || pageSize < 1 || pageSize > 256) {
69
+ throw new Error('Invalid authority record page size.');
70
+ }
71
+ for (const entry of authorityModelRegistry) {
72
+ let after = null;
73
+ while (true) {
74
+ options.signal?.throwIfAborted();
75
+ const page = await entry.page(after, pageSize, options.session, options.signal);
76
+ if (!page.length)
77
+ break;
78
+ for (const record of page) {
79
+ assertAuthorityStoredRecord(record);
80
+ yield record;
81
+ }
82
+ after = page[page.length - 1].id;
83
+ if (page.length < pageSize)
84
+ break;
85
+ }
86
+ }
87
+ }
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5hdXRob3JpdHlyZWdpc3RyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuYXV0aG9yaXR5cmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUNMLCtCQUErQixFQUFFLCtCQUErQixFQUFFLHFDQUFxQyxFQUN2RyxrQ0FBa0MsRUFBRSxpQ0FBaUMsRUFBRSxrQ0FBa0MsRUFDekcsNkJBQTZCLEVBQUUsNkJBQTZCLEVBQUUsK0JBQStCLEVBQzdGLDRCQUE0QixFQUFFLHVDQUF1QyxFQUFFLGlDQUFpQyxFQUN4Ryw2QkFBNkIsRUFBRSw0QkFBNEIsRUFBRSw0QkFBNEIsRUFDekYsa0NBQWtDLEVBQUUsK0JBQStCLEVBQUUsOEJBQThCLEVBQ25HLCtCQUErQixFQUFFLDBCQUEwQixFQUFFLDBCQUEwQixFQUN2Riw0QkFBNEIsRUFBRSx5QkFBeUIsRUFBRSxvQ0FBb0MsRUFDN0Ysc0NBQXNDLEVBQUUsMEJBQTBCLEdBQ25FLE1BQU0sOEJBQThCLENBQUM7QUFjdEMsTUFBTSxNQUFNLEdBQUcsQ0FFWCxJQUFZLEVBQ1osS0FBd0YsRUFDeEYsY0FBK0QsRUFDekMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDdkMsSUFBSTtJQUNKLFVBQVUsRUFBRSxLQUFLLEVBQUUsRUFBaUMsRUFBRSxFQUFFO1FBQ3RELE9BQU8sQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6RCxNQUFNLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBQ0QsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFO0lBQ3BDLE1BQU0sRUFBRSxDQUFDLEtBQWMsRUFBRSxFQUFFLEdBQUcsY0FBYyxDQUFD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
@@ -0,0 +1,127 @@
1
+ import * as plugins from './plugins.js';
2
+ import type { IAuthorityBackupRehearsal, IAuthorityBackupRehearsalReadback, IAuthorityRestoredRecord, IAuthorityRestoredSource, TAuthorityRestoredEntry } from './classes.authoritybackup.js';
3
+ export declare const authorityRehearsalProtocolVersion: 1;
4
+ export declare const authorityRehearsalMaximumFrameBytes: number;
5
+ export declare const authorityRehearsalMaximumRecordBytes: number;
6
+ export declare const authorityRehearsalMaximumSourceBytes: number;
7
+ export interface IAuthorityRehearsalWireSource {
8
+ kind: 'source';
9
+ sourceKind: string;
10
+ sourceId: string;
11
+ sourceDigest: string;
12
+ linkedModel: string;
13
+ linkedId: string;
14
+ linkedDigestField: IAuthorityRestoredSource['linkedDigestField'];
15
+ bytesBase64url: string;
16
+ }
17
+ export type TAuthorityRehearsalWireEntry = IAuthorityRestoredRecord | IAuthorityRehearsalWireSource;
18
+ export type TAuthorityRehearsalParentMessage = {
19
+ version: 1;
20
+ type: 'stage';
21
+ sequence: number;
22
+ entry: TAuthorityRehearsalWireEntry;
23
+ } | {
24
+ version: 1;
25
+ type: 'finish';
26
+ sequence: number;
27
+ } | {
28
+ version: 1;
29
+ type: 'restore.next';
30
+ } | {
31
+ version: 1;
32
+ type: 'record.next';
33
+ } | {
34
+ version: 1;
35
+ type: 'source.next';
36
+ } | {
37
+ version: 1;
38
+ type: 'close';
39
+ };
40
+ export type TAuthorityRehearsalChildMessage = {
41
+ version: 1;
42
+ type: 'ready';
43
+ } | {
44
+ version: 1;
45
+ type: 'staged';
46
+ sequence: number;
47
+ } | {
48
+ version: 1;
49
+ type: 'input.complete';
50
+ } | {
51
+ version: 1;
52
+ type: 'restore.progress';
53
+ done: boolean;
54
+ } | {
55
+ version: 1;
56
+ type: 'record';
57
+ record: IAuthorityRestoredRecord | null;
58
+ } | {
59
+ version: 1;
60
+ type: 'source';
61
+ source: IAuthorityRehearsalWireSource | null;
62
+ } | {
63
+ version: 1;
64
+ type: 'closed';
65
+ } | {
66
+ version: 1;
67
+ type: 'failed';
68
+ phase: 'protocol' | 'staging' | 'restore' | 'readback' | 'cleanup';
69
+ };
70
+ export declare const parseAuthorityRehearsalWireEntry: (value: unknown) => TAuthorityRehearsalWireEntry;
71
+ export declare const restoredEntryToWire: (entry: TAuthorityRestoredEntry) => TAuthorityRehearsalWireEntry;
72
+ export declare const wireSourceToRestored: (source: IAuthorityRehearsalWireSource) => IAuthorityRestoredSource;
73
+ export declare const parseAuthorityRehearsalParentMessage: (value: unknown) => TAuthorityRehearsalParentMessage;
74
+ export declare const parseAuthorityRehearsalChildMessage: (value: unknown) => TAuthorityRehearsalChildMessage;
75
+ /** Single-reader/single-writer bounded transport for the isolated rehearsal child. */
76
+ export declare class AuthorityRehearsalFramedTransport<TIncoming, TOutgoing> {
77
+ private readonly options;
78
+ private readonly header;
79
+ private headerOffset;
80
+ private body?;
81
+ private bodyOffset;
82
+ private queued?;
83
+ private waiting?;
84
+ private failure?;
85
+ private closed;
86
+ private sending;
87
+ constructor(options: {
88
+ readable: plugins.stream.Readable;
89
+ writable: plugins.stream.Writable;
90
+ parseIncoming: (value: unknown) => TIncoming;
91
+ validateOutgoing: (value: unknown) => TOutgoing;
92
+ });
93
+ send(message: TOutgoing, timeoutMs: number, signal?: AbortSignal): Promise<void>;
94
+ receive(timeoutMs: number, signal?: AbortSignal): Promise<TIncoming>;
95
+ finishWritable(): Promise<void>;
96
+ destroy(): void;
97
+ private readonly onData;
98
+ private finishBody;
99
+ private readonly onReadError;
100
+ private readonly onWriteError;
101
+ private readonly onReadableClose;
102
+ private fail;
103
+ private detach;
104
+ }
105
+ export interface IAuthorityRehearsalChildLaunch {
106
+ entryPath: string;
107
+ args: string[];
108
+ options: plugins.childProcess.SpawnOptions;
109
+ }
110
+ export type TAuthorityRehearsalChildFactory = (launch: IAuthorityRehearsalChildLaunch) => plugins.childProcess.ChildProcess;
111
+ export interface IAuthSwitchAuthorityRehearsalOptions {
112
+ signal?: AbortSignal;
113
+ requestTimeoutMs?: number;
114
+ /** Test-only source runner seam. Never populate this from CLI, RPC or management input. */
115
+ childFactory?: TAuthorityRehearsalChildFactory;
116
+ }
117
+ export declare const resolveAuthorityRehearsalChildEntryPath: () => string;
118
+ export declare class AuthSwitchAuthorityRehearsal implements IAuthorityBackupRehearsal {
119
+ private readonly options;
120
+ private readonly requestTimeoutMs;
121
+ constructor(options?: IAuthSwitchAuthorityRehearsalOptions);
122
+ restoreClosed(entries: AsyncIterable<TAuthorityRestoredEntry>): Promise<IAuthorityBackupRehearsalReadback>;
123
+ private exchange;
124
+ private expect;
125
+ private closeReadback;
126
+ private abortChild;
127
+ }