@modelprofile.com/authswitch 6.5.0 → 8.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 (95) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/authority-contract.d.ts +300 -6
  3. package/dist_ts/authority-contract.js +1 -1
  4. package/dist_ts/authority-runtime-contract.d.ts +13 -0
  5. package/dist_ts/classes.accountlist.js +4 -3
  6. package/dist_ts/classes.authoritybroker.d.ts +25 -5
  7. package/dist_ts/classes.authoritybroker.js +388 -123
  8. package/dist_ts/classes.authoritycli.d.ts +24 -0
  9. package/dist_ts/classes.authoritycli.js +675 -0
  10. package/dist_ts/classes.authorityclient.d.ts +19 -7
  11. package/dist_ts/classes.authorityclient.js +51 -14
  12. package/dist_ts/classes.authoritydaemon.d.ts +28 -1
  13. package/dist_ts/classes.authoritydaemon.js +477 -36
  14. package/dist_ts/classes.authoritydatabase.d.ts +155 -11
  15. package/dist_ts/classes.authoritydatabase.js +1037 -69
  16. package/dist_ts/classes.authoritymodels.d.ts +229 -23
  17. package/dist_ts/classes.authoritymodels.js +867 -128
  18. package/dist_ts/classes.authoritypreuse.d.ts +47 -0
  19. package/dist_ts/classes.authoritypreuse.js +277 -0
  20. package/dist_ts/classes.authorityregistry.d.ts +9 -0
  21. package/dist_ts/classes.authorityregistry.js +32 -0
  22. package/dist_ts/classes.authoritysecrets.d.ts +1 -1
  23. package/dist_ts/classes.authoritysecrets.js +2 -2
  24. package/dist_ts/classes.authorityusage.d.ts +160 -0
  25. package/dist_ts/classes.authorityusage.js +429 -0
  26. package/dist_ts/classes.claudeauthority.d.ts +66 -0
  27. package/dist_ts/classes.claudeauthority.js +528 -0
  28. package/dist_ts/classes.claudecodeharness.js +3 -2
  29. package/dist_ts/classes.claudecodelocks.d.ts +13 -0
  30. package/dist_ts/classes.claudecodelocks.js +75 -3
  31. package/dist_ts/classes.claudenative.d.ts +130 -0
  32. package/dist_ts/classes.claudenative.js +708 -0
  33. package/dist_ts/classes.claudestatus.d.ts +9 -0
  34. package/dist_ts/classes.claudestatus.js +26 -9
  35. package/dist_ts/classes.claudetokenrefresh.d.ts +15 -1
  36. package/dist_ts/classes.claudetokenrefresh.js +74 -21
  37. package/dist_ts/classes.codexharness.js +4 -2
  38. package/dist_ts/classes.codexmanaged.d.ts +12 -1
  39. package/dist_ts/classes.codexmanaged.js +75 -14
  40. package/dist_ts/classes.codexpreuse.d.ts +8 -0
  41. package/dist_ts/classes.codexpreuse.js +24 -6
  42. package/dist_ts/classes.fileharness.d.ts +2 -0
  43. package/dist_ts/classes.fileharness.js +6 -4
  44. package/dist_ts/classes.limits.js +12 -7
  45. package/dist_ts/classes.opencodeharness.js +2 -2
  46. package/dist_ts/claudehttp.d.ts +10 -0
  47. package/dist_ts/claudehttp.js +29 -3
  48. package/dist_ts/index.d.ts +1 -0
  49. package/dist_ts/index.js +7 -1
  50. package/dist_ts/interfaces.harness.d.ts +6 -0
  51. package/dist_ts/interfaces.list.d.ts +9 -3
  52. package/dist_ts/plugins.d.ts +6 -3
  53. package/dist_ts/plugins.js +8 -4
  54. package/dist_ts/ts_migration/0001_authority_meta.d.ts +13 -0
  55. package/dist_ts/ts_migration/0001_authority_meta.js +44 -0
  56. package/dist_ts/ts_migration/0002_remove_backup_records.d.ts +17 -0
  57. package/dist_ts/ts_migration/0002_remove_backup_records.js +48 -0
  58. package/dist_ts/ts_migration/index.d.ts +6 -0
  59. package/dist_ts/ts_migration/index.js +12 -0
  60. package/package.json +3 -3
  61. package/readme.md +177 -14
  62. package/ts/00_commitinfo_data.ts +1 -1
  63. package/ts/authority-contract.ts +262 -9
  64. package/ts/authority-runtime-contract.ts +14 -0
  65. package/ts/classes.accountlist.ts +3 -2
  66. package/ts/classes.authoritybroker.ts +385 -121
  67. package/ts/classes.authoritycli.ts +719 -0
  68. package/ts/classes.authorityclient.ts +75 -18
  69. package/ts/classes.authoritydaemon.ts +444 -36
  70. package/ts/classes.authoritydatabase.ts +1076 -75
  71. package/ts/classes.authoritymodels.ts +642 -144
  72. package/ts/classes.authoritypreuse.ts +296 -0
  73. package/ts/classes.authorityregistry.ts +47 -0
  74. package/ts/classes.authoritysecrets.ts +1 -1
  75. package/ts/classes.authorityusage.ts +527 -0
  76. package/ts/classes.claudeauthority.ts +537 -0
  77. package/ts/classes.claudecodeharness.ts +2 -1
  78. package/ts/classes.claudecodelocks.ts +70 -1
  79. package/ts/classes.claudenative.ts +785 -0
  80. package/ts/classes.claudestatus.ts +38 -9
  81. package/ts/classes.claudetokenrefresh.ts +82 -19
  82. package/ts/classes.codexharness.ts +3 -1
  83. package/ts/classes.codexmanaged.ts +76 -13
  84. package/ts/classes.codexpreuse.ts +33 -5
  85. package/ts/classes.fileharness.ts +7 -3
  86. package/ts/classes.limits.ts +11 -6
  87. package/ts/classes.opencodeharness.ts +1 -1
  88. package/ts/claudehttp.ts +31 -2
  89. package/ts/index.ts +6 -0
  90. package/ts/interfaces.harness.ts +6 -0
  91. package/ts/interfaces.list.ts +9 -3
  92. package/ts/plugins.ts +8 -3
  93. package/ts/ts_migration/0001_authority_meta.ts +45 -0
  94. package/ts/ts_migration/0002_remove_backup_records.ts +49 -0
  95. package/ts/ts_migration/index.ts +12 -0
@@ -0,0 +1,675 @@
1
+ import { AuthSwitchClient } from './classes.authorityclient.js';
2
+ import { resolveAuthSwitchAuthorityPaths } from './classes.authorityservice.js';
3
+ import { defaultPreusePrompt, validatePreuseOptions } from './preuse.js';
4
+ import { plainText } from './formatting.js';
5
+ import * as plugins from './plugins.js';
6
+ class AuthorityCliFailure extends Error {
7
+ kind;
8
+ constructor(kind) {
9
+ super(`Authswitch authority CLI ${kind} failure.`);
10
+ this.kind = kind;
11
+ }
12
+ }
13
+ const usage = 'Usage: authswitch account list [--json] | authswitch account add openai [--json] | authswitch account reauth <account-id> <login-id> [--json] | authswitch account operation get|cancel|resume <operation-id> [--json] | authswitch account preuse <account-id> <login-id>|--all [--prompt <text>] [--model <id>] [--json] | authswitch account preuse operation get|cancel|resume <operation-id> [--json] | authswitch authority doctor [--json]';
14
+ const safe = (value) => plainText(value === null ? 'none' : String(value));
15
+ const isId = (value) => Boolean(value && !value.startsWith('-'));
16
+ const parsePreuse = (argv) => {
17
+ if (argv[2] === 'operation') {
18
+ if ((argv[3] === 'get' || argv[3] === 'cancel' || argv[3] === 'resume') && isId(argv[4])
19
+ && (argv.length === 5 || (argv.length === 6 && argv[5] === '--json'))) {
20
+ const kind = argv[3] === 'get' ? 'preuseGet'
21
+ : argv[3] === 'cancel' ? 'preuseCancel' : 'preuseResume';
22
+ return { kind, operationId: argv[4], json: argv[5] === '--json' };
23
+ }
24
+ return null;
25
+ }
26
+ let target;
27
+ let index;
28
+ if (argv[2] === '--all') {
29
+ target = 'all';
30
+ index = 3;
31
+ }
32
+ else if (isId(argv[2]) && isId(argv[3])) {
33
+ target = { accountId: argv[2], loginId: argv[3] };
34
+ index = 4;
35
+ }
36
+ else
37
+ return null;
38
+ let prompt = defaultPreusePrompt;
39
+ let model;
40
+ let json = false;
41
+ let promptSet = false;
42
+ let modelSet = false;
43
+ while (index < argv.length) {
44
+ const option = argv[index];
45
+ if (option === '--json' && !json) {
46
+ json = true;
47
+ index++;
48
+ }
49
+ else if (option === '--prompt' && !promptSet && argv[index + 1] !== undefined
50
+ && !argv[index + 1].startsWith('--')) {
51
+ prompt = argv[index + 1];
52
+ promptSet = true;
53
+ index += 2;
54
+ }
55
+ else if (option === '--model' && !modelSet && argv[index + 1] !== undefined
56
+ && !argv[index + 1].startsWith('--')) {
57
+ model = argv[index + 1];
58
+ modelSet = true;
59
+ index += 2;
60
+ }
61
+ else
62
+ return null;
63
+ }
64
+ try {
65
+ validatePreuseOptions({ prompt, model });
66
+ }
67
+ catch {
68
+ return null;
69
+ }
70
+ return { kind: 'preuse', target, prompt, ...(model === undefined ? {} : { model }), json };
71
+ };
72
+ const parse = (argv) => {
73
+ if (argv[0] === 'account' && argv[1] === 'list'
74
+ && (argv.length === 2 || (argv.length === 3 && argv[2] === '--json'))) {
75
+ return { kind: 'list', json: argv[2] === '--json' };
76
+ }
77
+ if (argv[0] === 'authority' && argv[1] === 'doctor'
78
+ && (argv.length === 2 || (argv.length === 3 && argv[2] === '--json'))) {
79
+ return { kind: 'doctor', json: argv[2] === '--json' };
80
+ }
81
+ if (argv[0] === 'account' && argv[1] === 'add' && argv[2] === 'openai'
82
+ && (argv.length === 3 || (argv.length === 4 && argv[3] === '--json'))) {
83
+ return { kind: 'add', json: argv[3] === '--json' };
84
+ }
85
+ if (argv[0] === 'account' && argv[1] === 'reauth' && isId(argv[2]) && isId(argv[3])
86
+ && (argv.length === 4 || (argv.length === 5 && argv[4] === '--json'))) {
87
+ return { kind: 'reauth', accountId: argv[2], loginId: argv[3], json: argv[4] === '--json' };
88
+ }
89
+ if (argv[0] === 'account' && argv[1] === 'operation'
90
+ && (argv[2] === 'get' || argv[2] === 'cancel' || argv[2] === 'resume') && isId(argv[3])
91
+ && (argv.length === 4 || (argv.length === 5 && argv[4] === '--json'))) {
92
+ return { kind: argv[2], operationId: argv[3], json: argv[4] === '--json' };
93
+ }
94
+ if (argv[0] === 'account' && argv[1] === 'preuse')
95
+ return parsePreuse(argv);
96
+ return null;
97
+ };
98
+ class ScopedAuthorityCliClient {
99
+ controller = new AbortController();
100
+ client;
101
+ constructor() {
102
+ const paths = resolveAuthSwitchAuthorityPaths();
103
+ this.client = new AuthSwitchClient(paths.authoritySocketPath, paths.runtimeSocketPath);
104
+ }
105
+ snapshotAll() {
106
+ return this.client.snapshotAll({ limit: 128, signal: this.controller.signal });
107
+ }
108
+ doctorPage(request) {
109
+ return this.client.doctorPage(request, this.controller.signal);
110
+ }
111
+ beginAddOpenAi(operationId) {
112
+ return this.client.beginAddOpenAi(operationId, this.controller.signal);
113
+ }
114
+ beginReauthOpenAi(operationId, accountId, loginId, purpose) {
115
+ return this.client.beginReauthOpenAi(operationId, accountId, loginId, purpose, this.controller.signal);
116
+ }
117
+ getOperation(operationId) {
118
+ return this.client.getOperation(operationId, this.controller.signal);
119
+ }
120
+ cancelOperation(operationId) {
121
+ return this.client.cancelOperation(operationId, this.controller.signal);
122
+ }
123
+ startPreuse(input) {
124
+ return this.client.startPreuse(input, this.controller.signal);
125
+ }
126
+ getPreuse(operationId) {
127
+ return this.client.getPreuse(operationId, this.controller.signal);
128
+ }
129
+ cancelPreuse(operationId) {
130
+ return this.client.cancelPreuse(operationId, this.controller.signal);
131
+ }
132
+ close(reason = new Error('Authswitch authority CLI closed.')) {
133
+ if (!this.controller.signal.aborted)
134
+ this.controller.abort(reason);
135
+ }
136
+ }
137
+ const renderList = (snapshot) => {
138
+ const lines = [`Authority accounts — generated ${safe(snapshot.generatedAt)}, revision ${snapshot.revision}`];
139
+ if (snapshot.accounts.length === 0)
140
+ lines.push('No authority accounts are registered.');
141
+ for (const account of snapshot.accounts) {
142
+ const identity = account.email ?? account.label;
143
+ lines.push(`${safe(identity)} [${safe(account.providerId)}]`, ` account ${safe(account.id)}; plan ${safe(account.plan)}; ${account.removed ? 'removed' : 'registered'}; stored ${safe(account.statusObservedAt)}`);
144
+ const logins = snapshot.logins.filter(login => login.accountId === account.id);
145
+ if (logins.length === 0)
146
+ lines.push(' logins: none');
147
+ else {
148
+ lines.push(' stored login state (live provider check not performed):');
149
+ for (const login of logins) {
150
+ lines.push(` ${safe(login.id)} ${safe(login.purpose)} owner=${safe(login.owner)} health=${safe(login.health)} problem=${safe(login.problem)} observed=${safe(login.statusObservedAt)}`);
151
+ }
152
+ }
153
+ const bindings = snapshot.bindings.filter(binding => binding.accountId === account.id);
154
+ if (bindings.length === 0)
155
+ lines.push(' runtime bindings: none');
156
+ else
157
+ for (const binding of bindings) {
158
+ lines.push(` runtime ${safe(binding.runtime)} scope=${safe(binding.scopeId)} binding=${safe(binding.id)}`);
159
+ }
160
+ }
161
+ return lines.join('\n') + '\n';
162
+ };
163
+ const terminalOperation = (operation) => operation.state === 'complete' || operation.state === 'failed' || operation.state === 'cancelled'
164
+ || operation.state === 'interrupted' || operation.state === 'outcome_unknown';
165
+ const resumeCommand = (operationId, json) => `authswitch account operation resume ${safe(operationId)}${json ? ' --json' : ''}`;
166
+ const terminalPreuseOperation = (operation) => operation.state === 'complete' || operation.state === 'not_sent' || operation.state === 'outcome_unknown';
167
+ const preuseResumeCommand = (operationId, json) => `authswitch account preuse operation resume ${safe(operationId)}${json ? ' --json' : ''}`;
168
+ const renderOperation = (operation, json) => {
169
+ if (json)
170
+ return JSON.stringify(operation) + '\n';
171
+ const lines = [
172
+ `Authority operation ${safe(operation.id)} — ${safe(operation.state)}, revision ${operation.revision}`,
173
+ ` kind=${safe(operation.kind)}; purpose=${safe(operation.purpose)}`,
174
+ ];
175
+ if (operation.targetAccountId || operation.targetLoginId) {
176
+ lines.push(` target account=${safe(operation.targetAccountId)}; login=${safe(operation.targetLoginId)}`);
177
+ }
178
+ if (operation.prompt?.flow === 'device') {
179
+ lines.push(` Open ${safe(operation.prompt.verificationUrl)}`, ` Code: ${safe(operation.prompt.userCode)}`);
180
+ }
181
+ else if (operation.prompt?.flow === 'browser')
182
+ lines.push(` Open ${safe(operation.prompt.authUrl)}`);
183
+ if (operation.result) {
184
+ lines.push(` completed account=${safe(operation.result.accountId)}; login=${safe(operation.result.loginId)}; account revision=${operation.result.accountRevision}; login generation=${operation.result.loginGeneration}`);
185
+ }
186
+ if (operation.error)
187
+ lines.push(` problem=${safe(operation.error)}`);
188
+ if (!terminalOperation(operation))
189
+ lines.push(` Resume: ${resumeCommand(operation.id, false)}`);
190
+ return lines.join('\n') + '\n';
191
+ };
192
+ const renderPreuseOperation = (operation, json, batch = false) => {
193
+ if (json)
194
+ return JSON.stringify(batch ? { type: 'operation', operation } : operation) + '\n';
195
+ const lines = [
196
+ `Authority preuse operation ${safe(operation.id)} — ${safe(operation.state)}, revision ${operation.revision}`,
197
+ ` account=${safe(operation.accountId)}; login=${safe(operation.loginId)}; purpose=${safe(operation.purpose)}`,
198
+ ` requested model=${safe(operation.requestedModel)}; model=${safe(operation.model)}; problem=${safe(operation.problem)}`,
199
+ ];
200
+ if (operation.result) {
201
+ lines.push(` tokens input=${safe(operation.result.inputTokens)}; output=${safe(operation.result.outputTokens)}; total=${safe(operation.result.totalTokens)}`);
202
+ }
203
+ if (!terminalPreuseOperation(operation)) {
204
+ lines.push(` Resume: ${preuseResumeCommand(operation.id, false)}`);
205
+ }
206
+ return lines.join('\n') + '\n';
207
+ };
208
+ const renderPreuseSkip = (skip, json) => {
209
+ if (json)
210
+ return JSON.stringify(skip) + '\n';
211
+ return `Preuse skipped account ${safe(skip.accountId)}; login ${safe(skip.loginId)} — snapshot revision ${skip.snapshotRevision}, login revision ${skip.loginRevision}; health=${safe(skip.health)}; problem=${safe(skip.problem)}; observed=${safe(skip.statusObservedAt)}; reason=${skip.reason}\n`;
212
+ };
213
+ const defaultWait = (milliseconds, signal) => new Promise((resolve, reject) => {
214
+ if (signal.aborted) {
215
+ reject(signal.reason);
216
+ return;
217
+ }
218
+ const timer = setTimeout(() => {
219
+ signal.removeEventListener('abort', onAbort);
220
+ resolve();
221
+ }, milliseconds);
222
+ const onAbort = () => {
223
+ clearTimeout(timer);
224
+ signal.removeEventListener('abort', onAbort);
225
+ reject(signal.reason);
226
+ };
227
+ signal.addEventListener('abort', onAbort, { once: true });
228
+ });
229
+ const renderDoctorPage = (page, pageNumber) => {
230
+ const lines = [
231
+ `Authority doctor page ${pageNumber} — observed ${safe(page.observedAt)}`,
232
+ ` daemon=${safe(page.daemon.state)}; Claude native authority=${safe(page.daemon.claudeNativeAuthority)}; observed=${safe(page.daemon.observedAt)}`,
233
+ ` database=${safe(page.database.state)}; revision=${page.database.revision}; observed=${safe(page.database.observedAt)}`,
234
+ ` accounts: ${page.accounts.length} stored evidence record(s); live provider check not performed`,
235
+ ` logins: ${page.logins.length} stored evidence record(s); live provider check not performed`,
236
+ ];
237
+ for (const login of page.logins) {
238
+ lines.push(` login ${safe(login.id)} ${safe(login.purpose)} state=${safe(login.state)} owner=${safe(login.owner)} problem=${safe(login.problem)}`);
239
+ }
240
+ for (const runtime of page.managedCodex) {
241
+ lines.push(` managed Codex ${safe(runtime.scopeId)}: health=${safe(runtime.health)}; durable=${safe(runtime.durable.state)}; daemon=${safe(runtime.daemon.state)}/${safe(runtime.daemon.assignment)}; process=${safe(runtime.process.state)}/${safe(runtime.process.identity)}; problem=${safe(runtime.process.problem)}`);
242
+ }
243
+ for (const home of page.claudeHomes) {
244
+ lines.push(` Claude home ${safe(home.id)}: status=${safe(home.status)}; account=${safe(home.activeAccountId)}; login=${safe(home.activeLoginId)}`);
245
+ }
246
+ for (const handoff of page.claudeHandoffs) {
247
+ lines.push(` Claude handoff ${safe(handoff.id)}: phase=${safe(handoff.phase)}; problem=${safe(handoff.problem)}`);
248
+ }
249
+ for (const handoff of page.nativeHandoffs) {
250
+ lines.push(` native handoff ${safe(handoff.id)}: direction=${safe(handoff.direction)}; phase=${safe(handoff.phase)}`);
251
+ }
252
+ for (const migration of page.migrations) {
253
+ lines.push(` migration ${safe(migration.id)}: source=${safe(migration.sourceKind)}; status=${safe(migration.status)}`);
254
+ }
255
+ return lines.join('\n') + '\n';
256
+ };
257
+ const observationTimes = (page) => [
258
+ page.database.observedAt,
259
+ page.daemon.observedAt,
260
+ ...page.managedCodex.map(runtime => runtime.process.observedAt),
261
+ page.observedAt,
262
+ ];
263
+ const nextDoctorRequest = (request, page) => ({
264
+ accountAfter: page.nextAccountCursor ?? page.accounts.at(-1)?.id ?? request.accountAfter,
265
+ loginAfter: page.nextLoginCursor ?? page.logins.at(-1)?.id ?? request.loginAfter,
266
+ codexHomeAfter: page.nextCodexHomeCursor ?? page.managedCodex.at(-1)?.homeId ?? request.codexHomeAfter,
267
+ claudeHomeAfter: page.nextClaudeHomeCursor ?? page.claudeHomes.at(-1)?.id ?? request.claudeHomeAfter,
268
+ claudeHandoffAfter: page.nextClaudeHandoffCursor ?? page.claudeHandoffs.at(-1)?.id ?? request.claudeHandoffAfter,
269
+ nativeHandoffAfter: page.nextNativeHandoffCursor ?? page.nativeHandoffs.at(-1)?.id ?? request.nativeHandoffAfter,
270
+ migrationAfter: page.nextMigrationCursor ?? page.migrations.at(-1)?.id ?? request.migrationAfter,
271
+ limit: 128,
272
+ });
273
+ const doctorComplete = (page) => page.nextAccountCursor === null
274
+ && page.nextLoginCursor === null && page.nextCodexHomeCursor === null && page.nextClaudeHomeCursor === null
275
+ && page.nextClaudeHandoffCursor === null && page.nextNativeHandoffCursor === null
276
+ && page.nextMigrationCursor === null;
277
+ const runDoctor = async (client, json, write) => {
278
+ let request = { limit: 128 };
279
+ let pageNumber = 0;
280
+ let observedFrom = null;
281
+ let observedTo = null;
282
+ while (true) {
283
+ const page = await client.doctorPage(request);
284
+ pageNumber++;
285
+ for (const timestamp of observationTimes(page)) {
286
+ if (observedFrom === null || timestamp < observedFrom)
287
+ observedFrom = timestamp;
288
+ if (observedTo === null || timestamp > observedTo)
289
+ observedTo = timestamp;
290
+ }
291
+ if (json) {
292
+ await write((pageNumber === 1 ? '{"type":"authswitch-authority-doctor","schemaVersion":1,"pages":[' : ',')
293
+ + JSON.stringify({ pageNumber, page }));
294
+ }
295
+ else
296
+ await write(renderDoctorPage(page, pageNumber));
297
+ if (doctorComplete(page))
298
+ break;
299
+ const next = nextDoctorRequest(request, page);
300
+ if (JSON.stringify(next) === JSON.stringify(request))
301
+ throw new AuthorityCliFailure('response');
302
+ request = next;
303
+ }
304
+ if (json)
305
+ await write(`],"observationSpan":${JSON.stringify({ pageCount: pageNumber, observedFrom, observedTo })},"globallyAtomic":false}\n`);
306
+ else
307
+ await write(`Authority doctor completed ${pageNumber} page(s); observation span ${safe(observedFrom)} to ${safe(observedTo)}. Pages are independently observed and are not globally atomic.\n`);
308
+ };
309
+ const streamWrite = (stream, text) => new Promise((resolve, reject) => {
310
+ let settled = false;
311
+ const finish = (error) => {
312
+ if (settled)
313
+ return;
314
+ settled = true;
315
+ if (error)
316
+ reject(error);
317
+ else
318
+ resolve();
319
+ };
320
+ const onError = (error) => finish(error);
321
+ stream.once('error', onError);
322
+ stream.write(text, error => {
323
+ if (error) {
324
+ // Writable streams may emit the same failure after invoking the callback. Keep the
325
+ // one-shot listener through the current turn so an EPIPE cannot become unhandled.
326
+ finish(error);
327
+ setImmediate(() => stream.off('error', onError));
328
+ return;
329
+ }
330
+ stream.off('error', onError);
331
+ finish();
332
+ });
333
+ });
334
+ const abortable = (operation, signal) => {
335
+ if (signal.aborted)
336
+ return Promise.reject(signal.reason);
337
+ return new Promise((resolve, reject) => {
338
+ const onAbort = () => {
339
+ signal.removeEventListener('abort', onAbort);
340
+ reject(signal.reason);
341
+ };
342
+ signal.addEventListener('abort', onAbort, { once: true });
343
+ operation.then(value => {
344
+ signal.removeEventListener('abort', onAbort);
345
+ resolve(value);
346
+ }, error => {
347
+ signal.removeEventListener('abort', onAbort);
348
+ reject(error);
349
+ });
350
+ });
351
+ };
352
+ const preuseBatchTargets = (snapshot) => {
353
+ const accountIds = new Set(snapshot.accounts
354
+ .filter(account => account.providerId === 'openai' && !account.removed)
355
+ .map(account => account.id));
356
+ const seen = new Set();
357
+ return snapshot.logins.filter(login => {
358
+ const key = `${login.accountId}:${login.id}`;
359
+ if (seen.has(key) || !accountIds.has(login.accountId) || login.providerId !== 'openai'
360
+ || login.purpose !== 'openai_managed' || login.owner !== 'daemon')
361
+ return false;
362
+ seen.add(key);
363
+ return true;
364
+ });
365
+ };
366
+ const operationPollIntervalMs = 1_000;
367
+ const operationDeadlineMs = 15 * 60 * 1_000;
368
+ /** Credential-free daemon CLI. It never opens the database or falls back to native harness stores. */
369
+ export const runAuthSwitchAuthorityCli = async (argv, options = {}) => {
370
+ const write = options.stdout ?? (text => streamWrite(process.stdout, text));
371
+ const writeError = options.stderr ?? (text => streamWrite(process.stderr, text));
372
+ const now = options.now ?? Date.now;
373
+ const wait = options.wait ?? defaultWait;
374
+ const operationIdFactory = options.operationIdFactory ?? (() => plugins.crypto.randomUUID());
375
+ const command = parse(argv);
376
+ if (!command) {
377
+ await writeError(`${usage}\n`);
378
+ return 2;
379
+ }
380
+ let client;
381
+ let clientClosed = false;
382
+ let cancelled = false;
383
+ let timedOut = false;
384
+ let deadlineAt = null;
385
+ let operationIdForHint = null;
386
+ let preuseHint = false;
387
+ let beginAttempted = false;
388
+ let beginResponded = false;
389
+ const operationController = new AbortController();
390
+ const closeClient = (reason) => {
391
+ if (clientClosed || !client)
392
+ return;
393
+ clientClosed = true;
394
+ client.close(reason);
395
+ };
396
+ const detach = (reason) => {
397
+ if (!operationController.signal.aborted)
398
+ operationController.abort(reason);
399
+ closeClient(reason);
400
+ };
401
+ const close = () => {
402
+ cancelled = true;
403
+ detach(new Error('Authswitch authority request cancelled.'));
404
+ };
405
+ const expire = () => {
406
+ const reason = new Error('Authswitch authority operation timed out.');
407
+ timedOut = true;
408
+ detach(reason);
409
+ return reason;
410
+ };
411
+ const withinDeadline = async (work) => {
412
+ if (deadlineAt === null)
413
+ return abortable(Promise.resolve().then(work), operationController.signal);
414
+ const remaining = deadlineAt - now();
415
+ if (remaining <= 0)
416
+ throw expire();
417
+ const timerController = new AbortController();
418
+ const stopTimer = () => {
419
+ if (!timerController.signal.aborted)
420
+ timerController.abort(new Error('Authswitch authority deadline timer stopped.'));
421
+ };
422
+ const onOperationAbort = () => {
423
+ if (!timerController.signal.aborted)
424
+ timerController.abort(operationController.signal.reason);
425
+ };
426
+ operationController.signal.addEventListener('abort', onOperationAbort, { once: true });
427
+ const operation = abortable(Promise.resolve().then(work), operationController.signal);
428
+ const timer = wait(remaining, timerController.signal).then(() => {
429
+ if (timerController.signal.aborted)
430
+ throw timerController.signal.reason;
431
+ throw expire();
432
+ });
433
+ timer.catch(() => undefined);
434
+ try {
435
+ return await Promise.race([operation, timer]);
436
+ }
437
+ finally {
438
+ operationController.signal.removeEventListener('abort', onOperationAbort);
439
+ stopTimer();
440
+ }
441
+ };
442
+ const writeOutput = async (text) => {
443
+ try {
444
+ await withinDeadline(() => Promise.resolve(write(text)));
445
+ }
446
+ catch (error) {
447
+ if (operationController.signal.aborted)
448
+ throw error;
449
+ throw new AuthorityCliFailure('output');
450
+ }
451
+ };
452
+ const writeDiagnostic = async (text) => {
453
+ let pending;
454
+ try {
455
+ pending = Promise.resolve(writeError(text));
456
+ }
457
+ catch {
458
+ return;
459
+ }
460
+ pending.catch(() => undefined);
461
+ if (operationController.signal.aborted)
462
+ return;
463
+ try {
464
+ await withinDeadline(() => pending);
465
+ }
466
+ catch {
467
+ // Diagnostics are best effort. A failed or timed-out stderr must not recurse into
468
+ // another diagnostic or keep signal handlers and the scoped client alive.
469
+ }
470
+ };
471
+ const validateOperation = (operation, expectedId, previousRevision) => {
472
+ if (operation.id !== expectedId || (previousRevision !== undefined && operation.revision < previousRevision)) {
473
+ throw new AuthorityCliFailure('response');
474
+ }
475
+ return operation;
476
+ };
477
+ const validatePreuseOperation = (operation, expectedId, previousRevision, expected) => {
478
+ if (operation.id !== expectedId || (previousRevision !== undefined && operation.revision < previousRevision)
479
+ || (expected && (operation.accountId !== expected.accountId || operation.loginId !== expected.loginId
480
+ || operation.requestedModel !== expected.requestedModel))) {
481
+ throw new AuthorityCliFailure('response');
482
+ }
483
+ return operation;
484
+ };
485
+ try {
486
+ client = options.clientFactory?.() ?? new ScopedAuthorityCliClient();
487
+ const activeClient = client;
488
+ if (options.signal?.aborted)
489
+ close();
490
+ else
491
+ options.signal?.addEventListener('abort', close, { once: true });
492
+ if (!options.signal) {
493
+ process.once('SIGINT', close);
494
+ process.once('SIGTERM', close);
495
+ }
496
+ if (cancelled)
497
+ throw new Error('Authswitch authority request cancelled.');
498
+ const followOperation = async (initial) => {
499
+ let current = validateOperation(initial, initial.id);
500
+ await writeOutput(renderOperation(current, command.json));
501
+ while (!terminalOperation(current)) {
502
+ await withinDeadline(() => wait(operationPollIntervalMs, operationController.signal));
503
+ const next = validateOperation(await withinDeadline(() => activeClient.getOperation(current.id)), current.id, current.revision);
504
+ if (next.revision !== current.revision)
505
+ await writeOutput(renderOperation(next, command.json));
506
+ current = next;
507
+ }
508
+ return current;
509
+ };
510
+ const followPreuseOperation = async (initial, batch) => {
511
+ const expected = { accountId: initial.accountId, loginId: initial.loginId,
512
+ requestedModel: initial.requestedModel };
513
+ let current = validatePreuseOperation(initial, initial.id, undefined, expected);
514
+ await writeOutput(renderPreuseOperation(current, command.json, batch));
515
+ while (!terminalPreuseOperation(current)) {
516
+ await withinDeadline(() => wait(operationPollIntervalMs, operationController.signal));
517
+ const next = validatePreuseOperation(await withinDeadline(() => activeClient.getPreuse(current.id)), current.id, current.revision, expected);
518
+ if (next.revision !== current.revision) {
519
+ await writeOutput(renderPreuseOperation(next, command.json, batch));
520
+ }
521
+ current = next;
522
+ }
523
+ return current;
524
+ };
525
+ if (command.kind === 'list') {
526
+ const snapshot = await activeClient.snapshotAll();
527
+ await writeOutput(command.json ? JSON.stringify(snapshot) + '\n' : renderList(snapshot));
528
+ return 0;
529
+ }
530
+ if (command.kind === 'doctor') {
531
+ await runDoctor(activeClient, command.json, writeOutput);
532
+ return 0;
533
+ }
534
+ if (command.kind === 'preuseGet' || command.kind === 'preuseCancel') {
535
+ const operation = validatePreuseOperation(command.kind === 'preuseGet'
536
+ ? await activeClient.getPreuse(command.operationId)
537
+ : await activeClient.cancelPreuse(command.operationId), command.operationId);
538
+ await writeOutput(renderPreuseOperation(operation, command.json));
539
+ return 0;
540
+ }
541
+ if (command.kind === 'get' || command.kind === 'cancel') {
542
+ const operation = validateOperation(command.kind === 'get'
543
+ ? await activeClient.getOperation(command.operationId)
544
+ : await activeClient.cancelOperation(command.operationId), command.operationId);
545
+ await writeOutput(renderOperation(operation, command.json));
546
+ return 0;
547
+ }
548
+ if (command.kind === 'preuseResume') {
549
+ deadlineAt = now() + operationDeadlineMs;
550
+ operationIdForHint = command.operationId;
551
+ preuseHint = true;
552
+ const initial = validatePreuseOperation(await withinDeadline(() => activeClient.getPreuse(command.operationId)), command.operationId);
553
+ const finalOperation = await followPreuseOperation(initial, false);
554
+ if (finalOperation.state !== 'complete') {
555
+ await writeDiagnostic('Authswitch authority preuse was unsuccessful.\n');
556
+ return 1;
557
+ }
558
+ return 0;
559
+ }
560
+ if (command.kind === 'preuse') {
561
+ if (command.target === 'all') {
562
+ deadlineAt = now() + operationDeadlineMs;
563
+ const snapshot = await withinDeadline(() => activeClient.snapshotAll());
564
+ let unsuccessful = false;
565
+ for (const login of preuseBatchTargets(snapshot)) {
566
+ if (operationController.signal.aborted)
567
+ throw operationController.signal.reason;
568
+ deadlineAt = now() + operationDeadlineMs;
569
+ if (!login.capabilities.canPreuse) {
570
+ operationIdForHint = null;
571
+ const skip = {
572
+ type: 'skipped', snapshotRevision: snapshot.revision,
573
+ accountId: login.accountId, loginId: login.id, loginRevision: login.revision,
574
+ statusObservedAt: login.statusObservedAt, health: login.health, problem: login.problem,
575
+ reason: 'snapshot_not_preuse_capable',
576
+ };
577
+ await writeOutput(renderPreuseSkip(skip, command.json));
578
+ continue;
579
+ }
580
+ const operationId = operationIdFactory();
581
+ operationIdForHint = operationId;
582
+ preuseHint = true;
583
+ beginAttempted = true;
584
+ beginResponded = false;
585
+ const expected = { accountId: login.accountId, loginId: login.id,
586
+ requestedModel: command.model ?? null };
587
+ const initial = await withinDeadline(() => activeClient.startPreuse({
588
+ operationId, accountId: login.accountId, loginId: login.id, purpose: 'openai_managed',
589
+ prompt: command.prompt, ...(command.model === undefined ? {} : { model: command.model }),
590
+ }));
591
+ beginResponded = true;
592
+ validatePreuseOperation(initial, operationId, undefined, expected);
593
+ const finalOperation = await followPreuseOperation(initial, true);
594
+ if (finalOperation.state !== 'complete')
595
+ unsuccessful = true;
596
+ }
597
+ if (unsuccessful) {
598
+ await writeDiagnostic('Authswitch authority preuse was unsuccessful.\n');
599
+ return 1;
600
+ }
601
+ return 0;
602
+ }
603
+ deadlineAt = now() + operationDeadlineMs;
604
+ const target = command.target;
605
+ const operationId = operationIdFactory();
606
+ operationIdForHint = operationId;
607
+ preuseHint = true;
608
+ beginAttempted = true;
609
+ const expected = { accountId: target.accountId, loginId: target.loginId,
610
+ requestedModel: command.model ?? null };
611
+ const initial = await withinDeadline(() => activeClient.startPreuse({
612
+ operationId, accountId: target.accountId, loginId: target.loginId,
613
+ purpose: 'openai_managed', prompt: command.prompt,
614
+ ...(command.model === undefined ? {} : { model: command.model }),
615
+ }));
616
+ beginResponded = true;
617
+ validatePreuseOperation(initial, operationId, undefined, expected);
618
+ const finalOperation = await followPreuseOperation(initial, false);
619
+ if (finalOperation.state !== 'complete') {
620
+ await writeDiagnostic('Authswitch authority preuse was unsuccessful.\n');
621
+ return 1;
622
+ }
623
+ return 0;
624
+ }
625
+ deadlineAt = now() + operationDeadlineMs;
626
+ let initial;
627
+ if (command.kind === 'resume') {
628
+ operationIdForHint = command.operationId;
629
+ initial = validateOperation(await withinDeadline(() => activeClient.getOperation(command.operationId)), command.operationId);
630
+ }
631
+ else {
632
+ const operationId = operationIdFactory();
633
+ operationIdForHint = operationId;
634
+ beginAttempted = true;
635
+ initial = await withinDeadline(() => command.kind === 'add'
636
+ ? activeClient.beginAddOpenAi(operationId)
637
+ : activeClient.beginReauthOpenAi(operationId, command.accountId, command.loginId, 'openai_managed'));
638
+ beginResponded = true;
639
+ validateOperation(initial, operationId);
640
+ }
641
+ const finalOperation = await followOperation(initial);
642
+ if (finalOperation.state !== 'complete') {
643
+ await writeDiagnostic('Authswitch authority sign-in was unsuccessful.\n');
644
+ return 1;
645
+ }
646
+ return 0;
647
+ }
648
+ catch (error) {
649
+ let message = cancelled ? 'Authswitch authority request was cancelled.\n'
650
+ : timedOut ? 'Authswitch authority operation timed out.\n'
651
+ : beginAttempted && !beginResponded
652
+ ? 'Authswitch authority operation start response was lost.\n'
653
+ : error instanceof AuthorityCliFailure && error.kind === 'output'
654
+ ? 'Authswitch authority output failed.\n'
655
+ : error instanceof AuthorityCliFailure && error.kind === 'response'
656
+ ? 'Authswitch authority daemon returned an invalid response.\n'
657
+ : 'Authswitch authority daemon is unavailable.\n';
658
+ if (operationIdForHint !== null) {
659
+ const resume = preuseHint ? preuseResumeCommand(operationIdForHint, command.json)
660
+ : resumeCommand(operationIdForHint, command.json);
661
+ message += `Operation ID: ${safe(operationIdForHint)}\nResume: ${resume}\n`;
662
+ }
663
+ await writeDiagnostic(message);
664
+ return 1;
665
+ }
666
+ finally {
667
+ options.signal?.removeEventListener('abort', close);
668
+ if (!options.signal) {
669
+ process.off('SIGINT', close);
670
+ process.off('SIGTERM', close);
671
+ }
672
+ closeClient();
673
+ }
674
+ };
675
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5hdXRob3JpdHljbGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmF1dGhvcml0eWNsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBeUN4QyxNQUFNLG1CQUFvQixTQUFRLEtBQUs7SUFDVDtJQUE1QixZQUE0QixJQUEwQjtRQUNwRCxLQUFLLENBQUMsNEJBQTRCLElBQUksV0FBVyxDQUFDLENBQUM7UUFEekIsU0FBSSxHQUFKLElBQUksQ0FBc0I7SUFFdEQsQ0FBQztDQUNGO0FBRUQsTUFBTSxLQUFLLEdBQUcsbWJBQW1iLENBQUM7QUFDbGMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxLQUE2QixFQUFVLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUMzRyxNQUFNLElBQUksR0FBRyxDQUFDLEtBQXlCLEVBQW1CLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBRXRHLE1BQU0sV0FBVyxHQUFHLENBQUMsSUFBdUIsRUFBK0IsRUFBRTtJQUMzRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxXQUFXLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FB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QUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDeEUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztJQUN4RCxDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVE7V0FDakUsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDeEUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztJQUNyRCxDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7V0FDOUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDeEUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7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