@modelprofile.com/authswitch 6.3.0 → 6.5.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 (43) 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 +34 -0
  5. package/dist_ts/authority-runtime-contract.js +2 -0
  6. package/dist_ts/classes.authoritybroker.d.ts +76 -0
  7. package/dist_ts/classes.authoritybroker.js +570 -0
  8. package/dist_ts/classes.authorityclient.d.ts +47 -0
  9. package/dist_ts/classes.authorityclient.js +261 -0
  10. package/dist_ts/classes.authoritydaemon.d.ts +46 -0
  11. package/dist_ts/classes.authoritydaemon.js +492 -0
  12. package/dist_ts/classes.authoritydatabase.d.ts +103 -0
  13. package/dist_ts/classes.authoritydatabase.js +835 -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 +239 -0
  17. package/dist_ts/classes.authoritymodels.js +893 -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/classes.codexmanaged.d.ts +80 -0
  23. package/dist_ts/classes.codexmanaged.js +343 -0
  24. package/dist_ts/index.d.ts +3 -0
  25. package/dist_ts/index.js +27 -1
  26. package/dist_ts/plugins.d.ts +11 -3
  27. package/dist_ts/plugins.js +12 -4
  28. package/package.json +25 -4
  29. package/readme.md +59 -0
  30. package/ts/00_commitinfo_data.ts +1 -1
  31. package/ts/authority-contract.ts +109 -0
  32. package/ts/authority-runtime-contract.ts +33 -0
  33. package/ts/classes.authoritybroker.ts +552 -0
  34. package/ts/classes.authorityclient.ts +252 -0
  35. package/ts/classes.authoritydaemon.ts +403 -0
  36. package/ts/classes.authoritydatabase.ts +818 -0
  37. package/ts/classes.authorityframing.ts +21 -0
  38. package/ts/classes.authoritymodels.ts +407 -0
  39. package/ts/classes.authoritysecrets.ts +27 -0
  40. package/ts/classes.authorityservice.ts +83 -0
  41. package/ts/classes.codexmanaged.ts +339 -0
  42. package/ts/index.ts +26 -0
  43. package/ts/plugins.ts +11 -3
@@ -0,0 +1,47 @@
1
+ import type { IAuthSwitchAccountEvent, IAuthSwitchSnapshot, IReq_AuthSwitchBeginAdd, IReq_AuthSwitchBeginReauth, IReq_AuthSwitchCancelOperation, IReq_AuthSwitchEvents, IReq_AuthSwitchGetOperation, IReq_AuthSwitchRemoveAccount, IReq_AuthSwitchRenameAccount, IReq_AuthSwitchSnapshot } from './authority-contract.js';
2
+ import type { IReq_AuthSwitchBindAccount, IReq_AuthSwitchResolveAccess } from './authority-runtime-contract.js';
3
+ /** A snapshot is usable only while state is current; lastVerifiedAt is the last successful daemon proof. */
4
+ export interface IAuthSwitchSubscriptionStatus {
5
+ state: 'current' | 'unavailable' | 'closed';
6
+ reason: 'initial' | 'snapshot' | 'event' | 'heartbeat' | 'disconnect' | 'resync' | 'abort' | 'consumer_error';
7
+ epoch: string | null;
8
+ revision: number | null;
9
+ lastVerifiedAt: string | null;
10
+ }
11
+ export interface IAuthSwitchSubscriptionOptions {
12
+ onStatus?: (status: IAuthSwitchSubscriptionStatus) => void | Promise<void>;
13
+ /** Bounded long-poll interval; defaults to 30 seconds. */
14
+ heartbeatMs?: number;
15
+ }
16
+ /** Node-only client for the per-user daemon. Each request has its own bounded Unix connection. */
17
+ export declare class AuthSwitchClient {
18
+ readonly socketPath: string;
19
+ readonly runtimeSocketPath: string;
20
+ private readonly target;
21
+ private readonly runtimeTarget;
22
+ constructor(socketPath: string, runtimeSocketPath: string);
23
+ private request;
24
+ snapshot(options?: IReq_AuthSwitchSnapshot['request'], signal?: AbortSignal): Promise<IAuthSwitchSnapshot>;
25
+ /** Assemble a consistent view from bounded database pages; restart if a writer changes the revision. */
26
+ snapshotAll(options?: {
27
+ limit?: number;
28
+ signal?: AbortSignal;
29
+ }): Promise<IAuthSwitchSnapshot>;
30
+ events(epoch: string, afterRevision: number, waitMs?: number, signal?: AbortSignal): Promise<IReq_AuthSwitchEvents['response']>;
31
+ /** Snapshot callback runs after every known change; onStatus invalidates it on disconnect, resync or abort. */
32
+ subscribe(onSnapshot: (snapshot: IAuthSwitchSnapshot) => void | Promise<void>, onEvent: (event: IAuthSwitchAccountEvent) => void | Promise<void>, signal: AbortSignal, options?: IAuthSwitchSubscriptionOptions): Promise<void>;
33
+ beginAddOpenAi(): Promise<IReq_AuthSwitchBeginAdd['response']['operation']>;
34
+ beginReauthOpenAi(accountId: string): Promise<IReq_AuthSwitchBeginReauth['response']['operation']>;
35
+ getOperation(operationId: string): Promise<IReq_AuthSwitchGetOperation['response']['operation']>;
36
+ cancelOperation(operationId: string): Promise<IReq_AuthSwitchCancelOperation['response']['operation']>;
37
+ renameAccount(accountId: string, expectedRevision: number, label: string): Promise<IReq_AuthSwitchRenameAccount['response']['account']>;
38
+ removeAccount(accountId: string, expectedRevision: number): Promise<IReq_AuthSwitchRemoveAccount['response']['account']>;
39
+ bindAccount(input: IReq_AuthSwitchBindAccount['request']): Promise<IReq_AuthSwitchBindAccount['response']>;
40
+ resolveAccess(input: IReq_AuthSwitchResolveAccess['request']): Promise<IReq_AuthSwitchResolveAccess['response']>;
41
+ }
42
+ /** Container-facing client. It can only resolve a previously issued binding capability. */
43
+ export declare class AuthSwitchRuntimeClient {
44
+ private readonly target;
45
+ constructor(runtimeSocketPath: string);
46
+ resolveAccess(input: IReq_AuthSwitchResolveAccess['request']): Promise<IReq_AuthSwitchResolveAccess['response']>;
47
+ }
@@ -0,0 +1,261 @@
1
+ import * as plugins from './plugins.js';
2
+ import { AuthSwitchAuthorityFrameReader, authSwitchAuthorityFrameBytes, maxAuthSwitchAuthorityFrameBytes } from './classes.authorityframing.js';
3
+ const post = (path, payload, signal) => {
4
+ return new Promise((resolve, reject) => {
5
+ if (signal?.aborted) {
6
+ reject(signal.reason);
7
+ return;
8
+ }
9
+ const socket = plugins.net.createConnection(path);
10
+ let settled = false;
11
+ const frame = new AuthSwitchAuthorityFrameReader();
12
+ const finish = (error, response) => {
13
+ if (settled)
14
+ return;
15
+ settled = true;
16
+ signal?.removeEventListener('abort', abort);
17
+ socket.destroy();
18
+ if (error)
19
+ reject(error);
20
+ else if (response)
21
+ resolve(response);
22
+ else
23
+ reject(new Error('Authswitch daemon returned no response.'));
24
+ };
25
+ const abort = () => finish(signal?.reason ?? new Error('Account request was cancelled.'));
26
+ signal?.addEventListener('abort', abort, { once: true });
27
+ socket.setTimeout(35_000, () => finish(new Error('Authswitch daemon request timed out.')));
28
+ socket.on('connect', () => {
29
+ const raw = JSON.stringify(payload);
30
+ if (authSwitchAuthorityFrameBytes(raw) > maxAuthSwitchAuthorityFrameBytes) {
31
+ finish(new Error('Account request is too large.'));
32
+ return;
33
+ }
34
+ socket.write(raw + '\n');
35
+ });
36
+ socket.on('data', chunk => {
37
+ if (!Buffer.isBuffer(chunk)) {
38
+ finish(new Error('Account response must be a byte frame.'));
39
+ return;
40
+ }
41
+ let input;
42
+ try {
43
+ input = frame.add(chunk);
44
+ }
45
+ catch (error) {
46
+ finish(error);
47
+ return;
48
+ }
49
+ if (input === null)
50
+ return;
51
+ try {
52
+ finish(undefined, JSON.parse(input));
53
+ }
54
+ catch {
55
+ finish(new Error('Account response could not be decoded.'));
56
+ }
57
+ });
58
+ socket.on('error', () => finish(new Error('Authswitch daemon is unavailable.')));
59
+ socket.on('close', () => finish(new Error('Authswitch daemon connection closed before its response.')));
60
+ });
61
+ };
62
+ /** Node-only client for the per-user daemon. Each request has its own bounded Unix connection. */
63
+ export class AuthSwitchClient {
64
+ socketPath;
65
+ runtimeSocketPath;
66
+ target;
67
+ runtimeTarget;
68
+ constructor(socketPath, runtimeSocketPath) {
69
+ this.socketPath = socketPath;
70
+ this.runtimeSocketPath = runtimeSocketPath;
71
+ this.target = new plugins.typedrequest.TypedTarget({
72
+ supportsAbortSignal: true,
73
+ postMethod: (payload, options) => post(this.socketPath, payload, options?.signal),
74
+ });
75
+ this.runtimeTarget = new plugins.typedrequest.TypedTarget({
76
+ supportsAbortSignal: true,
77
+ postMethod: (payload, options) => post(this.runtimeSocketPath, payload, options?.signal),
78
+ });
79
+ }
80
+ request(method, request, timeoutMs = 35_000, runtime = false, signal) {
81
+ return new plugins.typedrequest.TypedRequest(runtime ? this.runtimeTarget : this.target, method)
82
+ .fire(request, { timeoutMs, maxRetries: 0, abortSignal: signal });
83
+ }
84
+ async snapshot(options = {}, signal) {
85
+ return (await this.request('authswitch.authority.snapshot', options, 35_000, false, signal)).snapshot;
86
+ }
87
+ /** Assemble a consistent view from bounded database pages; restart if a writer changes the revision. */
88
+ async snapshotAll(options = {}) {
89
+ while (true) {
90
+ if (options.signal?.aborted)
91
+ throw options.signal.reason ?? new Error('Account snapshot cancelled.');
92
+ let accountAfter;
93
+ let bindingAfter;
94
+ let aggregate;
95
+ let changed = false;
96
+ while (true) {
97
+ const page = await this.snapshot({ accountAfter, bindingAfter, limit: options.limit }, options.signal);
98
+ if (!aggregate)
99
+ aggregate = { ...page, accounts: [...page.accounts], bindings: [...page.bindings] };
100
+ else if (aggregate.epoch !== page.epoch || aggregate.revision !== page.revision) {
101
+ changed = true;
102
+ break;
103
+ }
104
+ else {
105
+ aggregate.accounts.push(...page.accounts);
106
+ aggregate.bindings.push(...page.bindings);
107
+ }
108
+ accountAfter = page.nextAccountCursor ?? accountAfter ?? page.accounts.at(-1)?.id;
109
+ bindingAfter = page.nextBindingCursor ?? bindingAfter ?? page.bindings.at(-1)?.id;
110
+ if (!page.nextAccountCursor && !page.nextBindingCursor) {
111
+ return { ...aggregate, nextAccountCursor: null, nextBindingCursor: null };
112
+ }
113
+ }
114
+ if (!changed)
115
+ throw new Error('Authority snapshot could not complete.');
116
+ }
117
+ }
118
+ events(epoch, afterRevision, waitMs = 30_000, signal) {
119
+ return this.request('authswitch.authority.events', { epoch, afterRevision, waitMs }, waitMs + 5_000, false, signal);
120
+ }
121
+ /** Snapshot callback runs after every known change; onStatus invalidates it on disconnect, resync or abort. */
122
+ async subscribe(onSnapshot, onEvent, signal, options = {}) {
123
+ const heartbeatMs = options.heartbeatMs ?? 30_000;
124
+ if (!Number.isSafeInteger(heartbeatMs) || heartbeatMs < 50 || heartbeatMs > 30_000) {
125
+ throw new Error('Authswitch subscription heartbeat must be 50–30000 ms.');
126
+ }
127
+ const retry = () => new Promise(resolve => {
128
+ const timer = setTimeout(() => { signal.removeEventListener('abort', aborted); resolve(); }, 250);
129
+ const aborted = () => { clearTimeout(timer); resolve(); };
130
+ signal.addEventListener('abort', aborted, { once: true });
131
+ });
132
+ let snapshot;
133
+ let available = false;
134
+ let lastVerifiedAt = null;
135
+ let lastEpoch = null;
136
+ let lastRevision = null;
137
+ const status = async (state, reason) => {
138
+ await options.onStatus?.({ state, reason, epoch: lastEpoch, revision: lastRevision, lastVerifiedAt });
139
+ };
140
+ const invalidate = async (reason) => {
141
+ snapshot = undefined;
142
+ if (available) {
143
+ available = false;
144
+ await status('unavailable', reason);
145
+ }
146
+ };
147
+ try {
148
+ if (!signal.aborted)
149
+ await status('unavailable', 'initial');
150
+ while (!signal.aborted) {
151
+ if (!snapshot) {
152
+ let fresh;
153
+ try {
154
+ fresh = await this.snapshotAll({ signal });
155
+ }
156
+ catch {
157
+ if (signal.aborted)
158
+ break;
159
+ await invalidate('disconnect');
160
+ await retry();
161
+ continue;
162
+ }
163
+ snapshot = fresh;
164
+ await onSnapshot(fresh);
165
+ available = true;
166
+ lastEpoch = fresh.epoch;
167
+ lastRevision = fresh.revision;
168
+ lastVerifiedAt = new Date().toISOString();
169
+ await status('current', 'snapshot');
170
+ }
171
+ let result;
172
+ try {
173
+ result = await this.events(snapshot.epoch, snapshot.revision, heartbeatMs, signal);
174
+ }
175
+ catch {
176
+ if (signal.aborted)
177
+ break;
178
+ await invalidate('disconnect');
179
+ await retry();
180
+ continue;
181
+ }
182
+ if (result.resyncRequired || result.epoch !== snapshot.epoch
183
+ || (result.events.length === 0 && result.revision !== snapshot.revision)) {
184
+ await invalidate('resync');
185
+ continue;
186
+ }
187
+ if (result.events.length) {
188
+ let fresh;
189
+ try {
190
+ fresh = await this.snapshotAll({ signal });
191
+ }
192
+ catch {
193
+ if (signal.aborted)
194
+ break;
195
+ await invalidate('disconnect');
196
+ await retry();
197
+ continue;
198
+ }
199
+ if (fresh.epoch !== result.epoch || fresh.revision < result.revision) {
200
+ await invalidate('resync');
201
+ continue;
202
+ }
203
+ snapshot = fresh;
204
+ await onSnapshot(fresh);
205
+ for (const event of result.events)
206
+ await onEvent(event);
207
+ lastEpoch = fresh.epoch;
208
+ lastRevision = fresh.revision;
209
+ lastVerifiedAt = new Date().toISOString();
210
+ await status('current', 'event');
211
+ }
212
+ else {
213
+ lastVerifiedAt = new Date().toISOString();
214
+ await status('current', 'heartbeat');
215
+ }
216
+ }
217
+ }
218
+ finally {
219
+ available = false;
220
+ await status('closed', signal.aborted ? 'abort' : 'consumer_error');
221
+ }
222
+ }
223
+ async beginAddOpenAi() {
224
+ return (await this.request('authswitch.authority.add', { providerId: 'openai', flow: 'device' })).operation;
225
+ }
226
+ async beginReauthOpenAi(accountId) {
227
+ return (await this.request('authswitch.authority.reauth', { accountId, flow: 'device' })).operation;
228
+ }
229
+ async getOperation(operationId) {
230
+ return (await this.request('authswitch.authority.operation', { operationId })).operation;
231
+ }
232
+ async cancelOperation(operationId) {
233
+ return (await this.request('authswitch.authority.cancel', { operationId })).operation;
234
+ }
235
+ async renameAccount(accountId, expectedRevision, label) {
236
+ return (await this.request('authswitch.authority.rename', { accountId, expectedRevision, label })).account;
237
+ }
238
+ async removeAccount(accountId, expectedRevision) {
239
+ return (await this.request('authswitch.authority.remove', { accountId, expectedRevision })).account;
240
+ }
241
+ bindAccount(input) {
242
+ return this.request('authswitch.authority.bind', input);
243
+ }
244
+ resolveAccess(input) {
245
+ return this.request('authswitch.authority.resolveAccess', input, 35_000, true);
246
+ }
247
+ }
248
+ /** Container-facing client. It can only resolve a previously issued binding capability. */
249
+ export class AuthSwitchRuntimeClient {
250
+ target;
251
+ constructor(runtimeSocketPath) {
252
+ this.target = new plugins.typedrequest.TypedTarget({
253
+ supportsAbortSignal: true,
254
+ postMethod: (payload, options) => post(runtimeSocketPath, payload, options?.signal),
255
+ });
256
+ }
257
+ resolveAccess(input) {
258
+ return new plugins.typedrequest.TypedRequest(this.target, 'authswitch.authority.resolveAccess').fire(input, { timeoutMs: 35_000, maxRetries: 0 });
259
+ }
260
+ }
261
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5hdXRob3JpdHljbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmF1dGhvcml0eWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQVF4QyxPQUFPLEVBQUUsOEJBQThCLEVBQUUsNkJBQTZCLEVBQ3BFLGdDQUFnQyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFMUUsTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFZLEVBQUUsT0FBc0IsRUFBRSxNQUFvQixFQUEwQixFQUFFO0lBQ2hHLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDckMsSUFBSSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQUMsT0FBTztRQUFDLENBQUM7UUFDdkQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsRCxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDcEIsTUFBTSxLQUFLLEdBQUcsSUFBSSw4QkFBOEIsRUFBRSxDQUFDO1FBQ25ELE1BQU0sTUFBTSxHQUFHLENBQUMsS0FBZSxFQUFFLFFBQXdCLEVBQVEsRUFBRTtZQUNqRSxJQUFJLE9BQU87Z0JBQUUsT0FBTztZQUNwQixPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ2YsTUFBTSxFQUFFLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM1QyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsSUFBSSxLQUFLO2dCQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDcEIsSUFBSSxRQUFRO2dCQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQzs7Z0JBQ2hDLE1BQU0sQ0FBQyxJ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
@@ -0,0 +1,46 @@
1
+ import { AuthSwitchAuthorityBroker, type IAuthSwitchAuthorityBrokerOptions } from './classes.authoritybroker.js';
2
+ import { AuthSwitchAuthorityDatabase, type IAuthSwitchAuthorityDatabaseOptions } from './classes.authoritydatabase.js';
3
+ import { AuthSwitchManagedCodex, type IAuthSwitchManagedCodexOptions } from './classes.codexmanaged.js';
4
+ export interface IAuthSwitchAuthorityDaemonOptions extends IAuthSwitchAuthorityDatabaseOptions {
5
+ authoritySocketPath: string;
6
+ runtimeSocketPath: string;
7
+ broker?: IAuthSwitchAuthorityBrokerOptions;
8
+ }
9
+ /** TypedRequest handlers over a private one-request-per-connection Unix socket. */
10
+ export declare class AuthSwitchAuthorityDaemon {
11
+ private readonly options;
12
+ readonly database: AuthSwitchAuthorityDatabase;
13
+ readonly broker: AuthSwitchAuthorityBroker;
14
+ private readonly managementRouter;
15
+ private readonly runtimeRouter;
16
+ private managementServer?;
17
+ private runtimeServer?;
18
+ private readonly sockets;
19
+ private readonly managedCodex;
20
+ private readonly managedCodexHomes;
21
+ private readonly managedCodexAccountIds;
22
+ private readonly drainingAccounts;
23
+ private readonly managedCodexStops;
24
+ private readonly managedCodexFailures;
25
+ private closing;
26
+ constructor(options: IAuthSwitchAuthorityDaemonOptions);
27
+ private register;
28
+ start(): Promise<void>;
29
+ /** Trusted in-process SDK admission; management RPC exposure belongs to the later CLI cutover. */
30
+ private drainManagedCodexAccount;
31
+ startManagedCodex(input: {
32
+ accountId: string;
33
+ scopeId: string;
34
+ workspaceDirectory: string;
35
+ codexHomeDirectory: string;
36
+ executable?: string;
37
+ onNotification?: IAuthSwitchManagedCodexOptions['onNotification'];
38
+ onServerRequest?: IAuthSwitchManagedCodexOptions['onServerRequest'];
39
+ }): Promise<AuthSwitchManagedCodex>;
40
+ stopManagedCodex(scopeId: string): Promise<void>;
41
+ private listen;
42
+ /** A killed daemon leaves a pathname behind; only remove an unchanged, owned, refused Unix socket. */
43
+ private clearStaleSocket;
44
+ private accept;
45
+ close(): Promise<void>;
46
+ }