@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.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/authority-contract.d.ts +302 -6
- package/dist_ts/authority-contract.js +1 -1
- package/dist_ts/authority-runtime-contract.d.ts +15 -0
- package/dist_ts/authorityrehearsal.child.d.ts +1 -0
- package/dist_ts/authorityrehearsal.child.js +395 -0
- package/dist_ts/classes.accountlist.js +4 -3
- package/dist_ts/classes.authoritybackup.d.ts +134 -0
- package/dist_ts/classes.authoritybackup.js +769 -0
- package/dist_ts/classes.authoritybroker.d.ts +29 -6
- package/dist_ts/classes.authoritybroker.js +413 -122
- package/dist_ts/classes.authoritycli.d.ts +24 -0
- package/dist_ts/classes.authoritycli.js +675 -0
- package/dist_ts/classes.authorityclient.d.ts +34 -9
- package/dist_ts/classes.authorityclient.js +136 -38
- package/dist_ts/classes.authoritydaemon.d.ts +47 -0
- package/dist_ts/classes.authoritydaemon.js +705 -16
- package/dist_ts/classes.authoritydatabase.d.ts +182 -8
- package/dist_ts/classes.authoritydatabase.js +1188 -41
- package/dist_ts/classes.authoritymodels.d.ts +247 -1
- package/dist_ts/classes.authoritymodels.js +870 -6
- package/dist_ts/classes.authoritypreuse.d.ts +47 -0
- package/dist_ts/classes.authoritypreuse.js +278 -0
- package/dist_ts/classes.authorityregistry.d.ts +24 -0
- package/dist_ts/classes.authorityregistry.js +88 -0
- package/dist_ts/classes.authorityrehearsal.d.ts +127 -0
- package/dist_ts/classes.authorityrehearsal.js +632 -0
- package/dist_ts/classes.authorityusage.d.ts +160 -0
- package/dist_ts/classes.authorityusage.js +429 -0
- package/dist_ts/classes.claudeauthority.d.ts +66 -0
- package/dist_ts/classes.claudeauthority.js +532 -0
- package/dist_ts/classes.claudecodeharness.js +3 -2
- package/dist_ts/classes.claudecodelocks.d.ts +13 -0
- package/dist_ts/classes.claudecodelocks.js +75 -3
- package/dist_ts/classes.claudenative.d.ts +137 -0
- package/dist_ts/classes.claudenative.js +731 -0
- package/dist_ts/classes.claudestatus.d.ts +9 -0
- package/dist_ts/classes.claudestatus.js +26 -9
- package/dist_ts/classes.claudetokenrefresh.d.ts +15 -1
- package/dist_ts/classes.claudetokenrefresh.js +74 -21
- package/dist_ts/classes.codexharness.js +4 -2
- package/dist_ts/classes.codexmanaged.d.ts +91 -0
- package/dist_ts/classes.codexmanaged.js +404 -0
- package/dist_ts/classes.codexpreuse.d.ts +8 -0
- package/dist_ts/classes.codexpreuse.js +24 -6
- package/dist_ts/classes.fileharness.d.ts +2 -0
- package/dist_ts/classes.fileharness.js +6 -4
- package/dist_ts/classes.limits.js +12 -7
- package/dist_ts/classes.opencodeharness.js +2 -2
- package/dist_ts/claudehttp.d.ts +10 -0
- package/dist_ts/claudehttp.js +29 -3
- package/dist_ts/index.d.ts +2 -0
- package/dist_ts/index.js +8 -1
- package/dist_ts/interfaces.harness.d.ts +6 -0
- package/dist_ts/interfaces.list.d.ts +9 -3
- package/dist_ts/plugins.d.ts +7 -3
- package/dist_ts/plugins.js +9 -4
- package/dist_ts/ts_migration/0001_authority_meta.d.ts +3 -0
- package/dist_ts/ts_migration/0001_authority_meta.js +32 -0
- package/dist_ts/ts_migration/index.d.ts +3 -0
- package/dist_ts/ts_migration/index.js +6 -0
- package/package.json +12 -2
- package/readme.md +205 -13
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/authority-contract.ts +264 -9
- package/ts/authority-runtime-contract.ts +21 -1
- package/ts/authorityrehearsal.child.ts +330 -0
- package/ts/classes.accountlist.ts +3 -2
- package/ts/classes.authoritybackup.ts +780 -0
- package/ts/classes.authoritybroker.ts +410 -120
- package/ts/classes.authoritycli.ts +719 -0
- package/ts/classes.authorityclient.ts +164 -38
- package/ts/classes.authoritydaemon.ts +614 -17
- package/ts/classes.authoritydatabase.ts +1229 -44
- package/ts/classes.authoritymodels.ts +579 -4
- package/ts/classes.authoritypreuse.ts +297 -0
- package/ts/classes.authorityregistry.ts +118 -0
- package/ts/classes.authorityrehearsal.ts +625 -0
- package/ts/classes.authorityusage.ts +527 -0
- package/ts/classes.claudeauthority.ts +541 -0
- package/ts/classes.claudecodeharness.ts +2 -1
- package/ts/classes.claudecodelocks.ts +70 -1
- package/ts/classes.claudenative.ts +816 -0
- package/ts/classes.claudestatus.ts +38 -9
- package/ts/classes.claudetokenrefresh.ts +82 -19
- package/ts/classes.codexharness.ts +3 -1
- package/ts/classes.codexmanaged.ts +402 -0
- package/ts/classes.codexpreuse.ts +33 -5
- package/ts/classes.fileharness.ts +7 -3
- package/ts/classes.limits.ts +11 -6
- package/ts/classes.opencodeharness.ts +1 -1
- package/ts/claudehttp.ts +31 -2
- package/ts/index.ts +7 -0
- package/ts/interfaces.harness.ts +6 -0
- package/ts/interfaces.list.ts +9 -3
- package/ts/plugins.ts +9 -3
- package/ts/ts_migration/0001_authority_meta.ts +33 -0
- package/ts/ts_migration/index.ts +7 -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)}; admission=${safe(page.database.admission)}; schema=${page.database.schemaVersion}; 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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
|