@pleri/olam-cli 0.1.196 → 0.1.199
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/README.md +52 -0
- package/dist/ask/knowledge-pack.generated.d.ts.map +1 -1
- package/dist/ask/knowledge-pack.generated.js +10 -8
- package/dist/ask/knowledge-pack.generated.js.map +1 -1
- package/dist/commands/auth-list-json.d.ts +34 -0
- package/dist/commands/auth-list-json.d.ts.map +1 -1
- package/dist/commands/auth-list-json.js +24 -0
- package/dist/commands/auth-list-json.js.map +1 -1
- package/dist/commands/auth-migrate.d.ts +212 -0
- package/dist/commands/auth-migrate.d.ts.map +1 -0
- package/dist/commands/auth-migrate.js +465 -0
- package/dist/commands/auth-migrate.js.map +1 -0
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +239 -184
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/bootstrap.d.ts +4 -0
- package/dist/commands/bootstrap.d.ts.map +1 -1
- package/dist/commands/bootstrap.js +10 -0
- package/dist/commands/bootstrap.js.map +1 -1
- package/dist/commands/dispatch.d.ts.map +1 -1
- package/dist/commands/dispatch.js +11 -1
- package/dist/commands/dispatch.js.map +1 -1
- package/dist/commands/doctor.d.ts +33 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +299 -12
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/kg-mirror.d.ts +18 -2
- package/dist/commands/kg-mirror.d.ts.map +1 -1
- package/dist/commands/kg-mirror.js +78 -3
- package/dist/commands/kg-mirror.js.map +1 -1
- package/dist/commands/mcp/complete.d.ts +36 -0
- package/dist/commands/mcp/complete.d.ts.map +1 -0
- package/dist/commands/mcp/complete.js +66 -0
- package/dist/commands/mcp/complete.js.map +1 -0
- package/dist/commands/mcp/index.d.ts +1 -1
- package/dist/commands/mcp/index.d.ts.map +1 -1
- package/dist/commands/mcp/index.js +3 -1
- package/dist/commands/mcp/index.js.map +1 -1
- package/dist/commands/memory/bridge.d.ts +1 -1
- package/dist/commands/memory/bridge.d.ts.map +1 -1
- package/dist/commands/memory/bridge.js +2 -6
- package/dist/commands/memory/bridge.js.map +1 -1
- package/dist/commands/memory/secret.d.ts.map +1 -1
- package/dist/commands/memory/secret.js +4 -3
- package/dist/commands/memory/secret.js.map +1 -1
- package/dist/commands/observe.d.ts +3 -3
- package/dist/commands/observe.d.ts.map +1 -1
- package/dist/commands/observe.js +11 -8
- package/dist/commands/observe.js.map +1 -1
- package/dist/commands/runbooks.d.ts.map +1 -1
- package/dist/commands/runbooks.js +77 -10
- package/dist/commands/runbooks.js.map +1 -1
- package/dist/commands/services-tls.d.ts.map +1 -1
- package/dist/commands/services-tls.js +41 -0
- package/dist/commands/services-tls.js.map +1 -1
- package/dist/commands/services.d.ts +45 -3
- package/dist/commands/services.d.ts.map +1 -1
- package/dist/commands/services.js +198 -71
- package/dist/commands/services.js.map +1 -1
- package/dist/commands/setup-phase-8-kg-hook.d.ts +48 -0
- package/dist/commands/setup-phase-8-kg-hook.d.ts.map +1 -0
- package/dist/commands/setup-phase-8-kg-hook.js +93 -0
- package/dist/commands/setup-phase-8-kg-hook.js.map +1 -0
- package/dist/commands/setup-phase-9-memory-bridge.d.ts +36 -0
- package/dist/commands/setup-phase-9-memory-bridge.d.ts.map +1 -0
- package/dist/commands/setup-phase-9-memory-bridge.js +59 -0
- package/dist/commands/setup-phase-9-memory-bridge.js.map +1 -0
- package/dist/commands/setup.d.ts +34 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +328 -23
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/update.d.ts +24 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +53 -0
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/upgrade.d.ts +5 -0
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +31 -8
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/image-digests.json +8 -8
- package/dist/index.js +4302 -2466
- package/dist/lib/auth-backend.d.ts +168 -0
- package/dist/lib/auth-backend.d.ts.map +1 -0
- package/dist/lib/auth-backend.js +172 -0
- package/dist/lib/auth-backend.js.map +1 -0
- package/dist/lib/auth-list-cache.d.ts +67 -0
- package/dist/lib/auth-list-cache.d.ts.map +1 -0
- package/dist/lib/auth-list-cache.js +84 -0
- package/dist/lib/auth-list-cache.js.map +1 -0
- package/dist/lib/auth-list.d.ts +107 -0
- package/dist/lib/auth-list.d.ts.map +1 -0
- package/dist/lib/auth-list.js +123 -0
- package/dist/lib/auth-list.js.map +1 -0
- package/dist/lib/auth-login.d.ts +92 -0
- package/dist/lib/auth-login.d.ts.map +1 -0
- package/dist/lib/auth-login.js +124 -0
- package/dist/lib/auth-login.js.map +1 -0
- package/dist/lib/auth-mutator-backend.d.ts +54 -0
- package/dist/lib/auth-mutator-backend.d.ts.map +1 -0
- package/dist/lib/auth-mutator-backend.js +62 -0
- package/dist/lib/auth-mutator-backend.js.map +1 -0
- package/dist/lib/auth-remote.d.ts +50 -0
- package/dist/lib/auth-remote.d.ts.map +1 -1
- package/dist/lib/auth-remote.js +84 -2
- package/dist/lib/auth-remote.js.map +1 -1
- package/dist/lib/bootstrap-kubernetes.d.ts +93 -12
- package/dist/lib/bootstrap-kubernetes.d.ts.map +1 -1
- package/dist/lib/bootstrap-kubernetes.js +364 -53
- package/dist/lib/bootstrap-kubernetes.js.map +1 -1
- package/dist/lib/config.d.ts +7 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/health-probes.d.ts +0 -22
- package/dist/lib/health-probes.d.ts.map +1 -1
- package/dist/lib/health-probes.js +23 -2
- package/dist/lib/health-probes.js.map +1 -1
- package/dist/lib/peripheral-registry.d.ts +11 -0
- package/dist/lib/peripheral-registry.d.ts.map +1 -1
- package/dist/lib/peripheral-registry.js +5 -0
- package/dist/lib/peripheral-registry.js.map +1 -1
- package/dist/lib/plans-client.d.ts.map +1 -1
- package/dist/lib/plans-client.js +6 -3
- package/dist/lib/plans-client.js.map +1 -1
- package/dist/mcp-server.js +14 -3
- package/hermes-bundle/version.json +1 -1
- package/host-cp/k8s/manifests/30-configmap.yaml +4 -0
- package/host-cp/k8s/manifests/50-deployment.yaml +13 -1
- package/host-cp/k8s/manifests/auth-service/50-deployment.yaml +1 -1
- package/host-cp/k8s/manifests/kg-service/50-deployment.yaml +1 -1
- package/host-cp/k8s/manifests/mcp-auth-service/50-deployment.yaml +1 -1
- package/host-cp/k8s/manifests/memory-service/50-deployment.yaml +1 -1
- package/host-cp/src/dispatch-persister.mjs +157 -0
- package/host-cp/src/pr-nanny.mjs +7 -0
- package/host-cp/src/server.mjs +175 -3
- package/host-cp/src/world-watchdog-pid-lookup.mjs +119 -0
- package/host-cp/src/world-watchdog-probes.mjs +271 -0
- package/host-cp/src/world-watchdog-recovery.mjs +192 -0
- package/host-cp/src/world-watchdog.mjs +313 -0
- package/package.json +1 -1
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* olam auth migrate — one-shot migration tool for operators with a legacy
|
|
3
|
+
* `~/.olam/auth-data/accounts.json` (the file the pre-Phase-A auth-service
|
|
4
|
+
* container wrote OAuth tokens to). Reads each local account and walks the
|
|
5
|
+
* operator through re-authenticating it against the cloud auth-worker.
|
|
6
|
+
*
|
|
7
|
+
* ───────────────────────────────────────────────────────────────────────────
|
|
8
|
+
* IMPORTANT — DESIGN-DOC NOTE FROM B2's AUDIT
|
|
9
|
+
* ───────────────────────────────────────────────────────────────────────────
|
|
10
|
+
*
|
|
11
|
+
* **There is no `POST /v1/credentials` endpoint on the cloud auth-worker DO.**
|
|
12
|
+
* Phase A's design doc (`docs/architecture/cloud-only-vault.md` §3 — "the
|
|
13
|
+
* bearer IS the credential") makes the explicit choice that the cloud vault
|
|
14
|
+
* does not accept already-minted OAuth tokens over HTTP. The only way a
|
|
15
|
+
* credential lands in the DO is via the worker's own OAuth-callback handler
|
|
16
|
+
* after the operator completes the Anthropic device-code dance.
|
|
17
|
+
*
|
|
18
|
+
* So "migrate" here does NOT mean "POST tokens into the cloud DO" (phase-b-
|
|
19
|
+
* tasks.md B3's wording is shorthand). It means: **for each local account,
|
|
20
|
+
* re-run the OAuth-start flow against the cloud auth-worker so the operator
|
|
21
|
+
* re-authenticates that Anthropic account, and the worker's callback stores
|
|
22
|
+
* the resulting token server-side.**
|
|
23
|
+
*
|
|
24
|
+
* The local OAuth token bytes themselves are never sent anywhere — they
|
|
25
|
+
* remain in `~/.olam/auth-data/accounts.json` until the operator approves
|
|
26
|
+
* the final timestamped rename. Local file is NEVER deleted automatically.
|
|
27
|
+
*
|
|
28
|
+
* ───────────────────────────────────────────────────────────────────────────
|
|
29
|
+
* IDEMPOTENCE MODEL
|
|
30
|
+
* ───────────────────────────────────────────────────────────────────────────
|
|
31
|
+
*
|
|
32
|
+
* Per-account migration state lives in `~/.olam/auth-data/migration-state.json`:
|
|
33
|
+
*
|
|
34
|
+
* {
|
|
35
|
+
* "version": 1,
|
|
36
|
+
* "migrated": {
|
|
37
|
+
* "<sha256(stable-content-shape)>": {
|
|
38
|
+
* "migratedAt": "2026-05-29T...Z",
|
|
39
|
+
* "email": "alice@example.com",
|
|
40
|
+
* "provider": "claude"
|
|
41
|
+
* },
|
|
42
|
+
* ...
|
|
43
|
+
* }
|
|
44
|
+
* }
|
|
45
|
+
*
|
|
46
|
+
* The hash is computed from a STABLE JSON shape (`{email, provider,
|
|
47
|
+
* anthropicAccountId}`) — re-running migrate after the local vault changes
|
|
48
|
+
* picks up new accounts but skips already-migrated ones. Atomic write
|
|
49
|
+
* (write-to-tmp then rename) guarantees that a mid-flight kill resumes
|
|
50
|
+
* cleanly: any account whose state record is durable on disk is skipped;
|
|
51
|
+
* the rest are re-attempted.
|
|
52
|
+
*
|
|
53
|
+
* ───────────────────────────────────────────────────────────────────────────
|
|
54
|
+
* CLI SURFACE
|
|
55
|
+
* ───────────────────────────────────────────────────────────────────────────
|
|
56
|
+
*
|
|
57
|
+
* olam auth migrate # default: interactive live-run
|
|
58
|
+
* olam auth migrate --dry-run # print the per-account plan only
|
|
59
|
+
* olam auth migrate --remote <url> # override auth-worker URL
|
|
60
|
+
* olam auth migrate --yes # CI safety; only valid w/ --dry-run
|
|
61
|
+
*/
|
|
62
|
+
import * as fs from 'node:fs';
|
|
63
|
+
import * as os from 'node:os';
|
|
64
|
+
import * as path from 'node:path';
|
|
65
|
+
import * as crypto from 'node:crypto';
|
|
66
|
+
import * as readline from 'node:readline/promises';
|
|
67
|
+
import pc from 'picocolors';
|
|
68
|
+
import { requireBackend, ConflictingBackendFlags, } from '../lib/auth-backend.js';
|
|
69
|
+
import { resolveRemoteUrl, DEFAULT_AUTH_WORKER_URL } from '../lib/auth-login.js';
|
|
70
|
+
import { printError, printHeader, printSuccess } from '../output.js';
|
|
71
|
+
// ── Path helpers ────────────────────────────────────────────────────────────
|
|
72
|
+
function defaultAccountsPath() {
|
|
73
|
+
return path.join(os.homedir(), '.olam', 'auth-data', 'accounts.json');
|
|
74
|
+
}
|
|
75
|
+
function defaultStatePath() {
|
|
76
|
+
return path.join(os.homedir(), '.olam', 'auth-data', 'migration-state.json');
|
|
77
|
+
}
|
|
78
|
+
// ── Hash + state IO ─────────────────────────────────────────────────────────
|
|
79
|
+
/**
|
|
80
|
+
* Stable content hash for an account. Two accounts with identical
|
|
81
|
+
* (email, provider, anthropicAccountId) tuples produce the same hash —
|
|
82
|
+
* the operator deleting + re-adding the same Anthropic account locally
|
|
83
|
+
* still resolves to "already migrated" on the cloud side. Tests rely on
|
|
84
|
+
* this invariant being stable (no random salt, no time component).
|
|
85
|
+
*/
|
|
86
|
+
export function accountContentHash(account) {
|
|
87
|
+
const stable = JSON.stringify({
|
|
88
|
+
email: account.email,
|
|
89
|
+
provider: account.provider,
|
|
90
|
+
anthropicAccountId: account.anthropicAccountId ?? null,
|
|
91
|
+
});
|
|
92
|
+
return crypto.createHash('sha256').update(stable).digest('hex');
|
|
93
|
+
}
|
|
94
|
+
/** Empty initial migration state (version 1). */
|
|
95
|
+
export function emptyMigrationState() {
|
|
96
|
+
return { version: 1, migrated: {} };
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Read + parse migration-state.json. Returns `emptyMigrationState()` when
|
|
100
|
+
* the file is absent (first-ever migrate run). Throws on parse-failure or
|
|
101
|
+
* version drift so the caller can exit 1 with a manual-inspection message.
|
|
102
|
+
*/
|
|
103
|
+
export function readMigrationState(statePath, deps) {
|
|
104
|
+
const existsSync = deps.existsSync ?? fs.existsSync;
|
|
105
|
+
const readFileSync = deps.readFileSync ?? ((p) => fs.readFileSync(p, 'utf-8'));
|
|
106
|
+
if (!existsSync(statePath))
|
|
107
|
+
return emptyMigrationState();
|
|
108
|
+
const raw = readFileSync(statePath);
|
|
109
|
+
let parsed;
|
|
110
|
+
try {
|
|
111
|
+
parsed = JSON.parse(raw);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
throw new Error(`Migration state file is corrupt at ${statePath}. ` +
|
|
115
|
+
`Inspect manually or delete to restart migration.`);
|
|
116
|
+
}
|
|
117
|
+
if (typeof parsed !== 'object' ||
|
|
118
|
+
parsed === null ||
|
|
119
|
+
parsed.version !== 1 ||
|
|
120
|
+
typeof parsed.migrated !== 'object' ||
|
|
121
|
+
parsed.migrated === null) {
|
|
122
|
+
throw new Error(`Migration state file is corrupt at ${statePath}. ` +
|
|
123
|
+
`Inspect manually or delete to restart migration.`);
|
|
124
|
+
}
|
|
125
|
+
return parsed;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Atomically write migration state. Strategy: serialise to `<path>.tmp`,
|
|
129
|
+
* then `rename` over the live file. The rename is atomic on POSIX (and on
|
|
130
|
+
* NTFS via ReplaceFileEx semantics); a process kill between the .tmp write
|
|
131
|
+
* and the rename leaves the live file untouched.
|
|
132
|
+
*
|
|
133
|
+
* Throws on write or rename failure; caller is expected to surface the
|
|
134
|
+
* error and exit 1 without touching anything else.
|
|
135
|
+
*/
|
|
136
|
+
export function writeMigrationStateAtomic(statePath, state, deps) {
|
|
137
|
+
const writeFileSync = deps.writeFileSync ?? ((p, d) => fs.writeFileSync(p, d, 'utf-8'));
|
|
138
|
+
const renameSync = deps.renameSync ?? fs.renameSync;
|
|
139
|
+
const tmpPath = `${statePath}.tmp`;
|
|
140
|
+
writeFileSync(tmpPath, JSON.stringify(state, null, 2) + '\n');
|
|
141
|
+
renameSync(tmpPath, statePath);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Read + parse the legacy local vault file. Returns `null` when absent
|
|
145
|
+
* (the "nothing to migrate" path). Throws on parse failure.
|
|
146
|
+
*/
|
|
147
|
+
export function readLocalAccounts(accountsPath, deps) {
|
|
148
|
+
const existsSync = deps.existsSync ?? fs.existsSync;
|
|
149
|
+
const readFileSync = deps.readFileSync ?? ((p) => fs.readFileSync(p, 'utf-8'));
|
|
150
|
+
if (!existsSync(accountsPath))
|
|
151
|
+
return null;
|
|
152
|
+
const raw = readFileSync(accountsPath);
|
|
153
|
+
let parsed;
|
|
154
|
+
try {
|
|
155
|
+
parsed = JSON.parse(raw);
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
159
|
+
throw new Error(`Failed to parse ${accountsPath}: ${msg}`);
|
|
160
|
+
}
|
|
161
|
+
if (typeof parsed !== 'object' ||
|
|
162
|
+
parsed === null ||
|
|
163
|
+
!Array.isArray(parsed.accounts)) {
|
|
164
|
+
throw new Error(`Malformed ${accountsPath}: expected { accounts: LocalAccount[] }`);
|
|
165
|
+
}
|
|
166
|
+
for (const a of parsed.accounts) {
|
|
167
|
+
if (typeof a !== 'object' ||
|
|
168
|
+
a === null ||
|
|
169
|
+
typeof a.email !== 'string' ||
|
|
170
|
+
typeof a.provider !== 'string') {
|
|
171
|
+
throw new Error(`Malformed ${accountsPath}: each account must have string email + provider.`);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return parsed;
|
|
175
|
+
}
|
|
176
|
+
// ── Plan computation ────────────────────────────────────────────────────────
|
|
177
|
+
/**
|
|
178
|
+
* Pure planner — given the local accounts + the migration state, decide
|
|
179
|
+
* what each account's status is. No IO; trivial to unit-test.
|
|
180
|
+
*/
|
|
181
|
+
export function planMigration(accounts, state) {
|
|
182
|
+
return accounts.map((account) => {
|
|
183
|
+
const hash = accountContentHash(account);
|
|
184
|
+
const existing = state.migrated[hash];
|
|
185
|
+
if (existing) {
|
|
186
|
+
return { account, hash, status: 'already-migrated', migratedRecord: existing };
|
|
187
|
+
}
|
|
188
|
+
return { account, hash, status: 'pending' };
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
// ── Rendering ───────────────────────────────────────────────────────────────
|
|
192
|
+
function renderPlanTable(plan, remoteUrl) {
|
|
193
|
+
const lines = [];
|
|
194
|
+
lines.push(`Local vault accounts (${plan.length}):`);
|
|
195
|
+
for (let i = 0; i < plan.length; i += 1) {
|
|
196
|
+
const p = plan[i];
|
|
197
|
+
const idx = String(i + 1).padStart(2, ' ');
|
|
198
|
+
const emailPad = p.account.email.padEnd(34);
|
|
199
|
+
const provider = `(${p.account.provider})`.padEnd(10);
|
|
200
|
+
if (p.status === 'already-migrated') {
|
|
201
|
+
const recorded = p.migratedRecord?.migratedAt ?? 'unknown';
|
|
202
|
+
lines.push(` [${idx}] ${emailPad} ${provider} status: ALREADY MIGRATED (recorded ${recorded})`);
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
lines.push(` [${idx}] ${emailPad} ${provider} status: pending hash: ${p.hash.slice(0, 12)}...`);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
const pending = plan.filter((p) => p.status === 'pending').length;
|
|
209
|
+
const migrated = plan.length - pending;
|
|
210
|
+
lines.push('');
|
|
211
|
+
if (pending === 0) {
|
|
212
|
+
lines.push(`All ${migrated} account(s) already migrated to ${remoteUrl}. Nothing to do.`);
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
lines.push(`Migration plan: ${pending} account(s) will be re-OAuth'd against ${remoteUrl}.`);
|
|
216
|
+
}
|
|
217
|
+
return lines.join('\n') + '\n';
|
|
218
|
+
}
|
|
219
|
+
// ── Default deps for production IO ──────────────────────────────────────────
|
|
220
|
+
function defaultIsTty() {
|
|
221
|
+
return Boolean(process.stdin.isTTY);
|
|
222
|
+
}
|
|
223
|
+
async function defaultPromptLine(question) {
|
|
224
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
225
|
+
try {
|
|
226
|
+
const answer = await rl.question(question);
|
|
227
|
+
return answer.trim();
|
|
228
|
+
}
|
|
229
|
+
finally {
|
|
230
|
+
rl.close();
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
// ── Core orchestration — the testable entry point ───────────────────────────
|
|
234
|
+
/**
|
|
235
|
+
* Run the `olam auth migrate` decision tree. Every IO touchpoint is funnelled
|
|
236
|
+
* through `AuthMigrateDeps` so tests assert on orchestration without spawning
|
|
237
|
+
* real OAuth round-trips, filesystem writes, or readline reads.
|
|
238
|
+
*/
|
|
239
|
+
export async function runAuthMigrate(opts, deps = {}) {
|
|
240
|
+
const stdout = deps.stdout ?? process.stdout;
|
|
241
|
+
const stderr = deps.stderr ?? process.stderr;
|
|
242
|
+
const now = deps.now ?? (() => new Date().toISOString());
|
|
243
|
+
const accountsPath = deps.accountsPath ?? defaultAccountsPath();
|
|
244
|
+
const statePath = deps.statePath ?? defaultStatePath();
|
|
245
|
+
// (0) Safety: --yes only meaningful with --dry-run.
|
|
246
|
+
if (opts.yes === true && opts.dryRun !== true) {
|
|
247
|
+
stderr.write('error: --yes is only valid with --dry-run ' +
|
|
248
|
+
'(interactive browser is required for real migrations).\n');
|
|
249
|
+
return { exitCode: 1 };
|
|
250
|
+
}
|
|
251
|
+
// (1) Backend resolution (gives us the remote-URL hint).
|
|
252
|
+
let resolution;
|
|
253
|
+
try {
|
|
254
|
+
resolution = requireBackend({ local: opts.local, remote: opts.remote });
|
|
255
|
+
}
|
|
256
|
+
catch (err) {
|
|
257
|
+
if (err instanceof ConflictingBackendFlags) {
|
|
258
|
+
stderr.write(`error: ${err.message}\n`);
|
|
259
|
+
return { exitCode: 1 };
|
|
260
|
+
}
|
|
261
|
+
throw err;
|
|
262
|
+
}
|
|
263
|
+
// `--local` makes no sense for migrate (migrate's whole purpose is to move
|
|
264
|
+
// to remote). Treat the explicit --local opt-out as a user error.
|
|
265
|
+
if (resolution.backend === 'local' && opts.local === true) {
|
|
266
|
+
stderr.write('error: --local is incompatible with `olam auth migrate` ' +
|
|
267
|
+
'(migrate exists to move local vault → cloud auth-worker).\n');
|
|
268
|
+
return { exitCode: 1 };
|
|
269
|
+
}
|
|
270
|
+
const remoteUrl = resolveRemoteUrl(resolution, {
|
|
271
|
+
readEnv: deps.readEnv,
|
|
272
|
+
readAuthWorkerUrlFile: deps.readAuthWorkerUrlFile,
|
|
273
|
+
});
|
|
274
|
+
// (2) Read the local vault. Empty / absent → exit 0 cleanly.
|
|
275
|
+
let vault;
|
|
276
|
+
try {
|
|
277
|
+
vault = readLocalAccounts(accountsPath, deps);
|
|
278
|
+
}
|
|
279
|
+
catch (err) {
|
|
280
|
+
stderr.write(`error: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
281
|
+
return { exitCode: 1 };
|
|
282
|
+
}
|
|
283
|
+
if (vault === null || vault.accounts.length === 0) {
|
|
284
|
+
stdout.write('No local vault found; nothing to migrate.\n');
|
|
285
|
+
return { exitCode: 0, accountsTotal: 0 };
|
|
286
|
+
}
|
|
287
|
+
// (3) Read the migration state. Corrupt → exit 1.
|
|
288
|
+
let state;
|
|
289
|
+
try {
|
|
290
|
+
state = readMigrationState(statePath, deps);
|
|
291
|
+
}
|
|
292
|
+
catch (err) {
|
|
293
|
+
stderr.write(`error: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
294
|
+
return { exitCode: 1 };
|
|
295
|
+
}
|
|
296
|
+
// (4) Compute the plan.
|
|
297
|
+
const plan = planMigration(vault.accounts, state);
|
|
298
|
+
const pending = plan.filter((p) => p.status === 'pending');
|
|
299
|
+
const alreadyMigrated = plan.length - pending.length;
|
|
300
|
+
// (5) --dry-run branch.
|
|
301
|
+
if (opts.dryRun === true) {
|
|
302
|
+
stdout.write(renderPlanTable(plan, remoteUrl));
|
|
303
|
+
if (pending.length > 0) {
|
|
304
|
+
stdout.write('Re-run without --dry-run to begin.\n');
|
|
305
|
+
}
|
|
306
|
+
return {
|
|
307
|
+
exitCode: 0,
|
|
308
|
+
accountsTotal: plan.length,
|
|
309
|
+
accountsAlreadyMigrated: alreadyMigrated,
|
|
310
|
+
accountsMigratedNow: 0,
|
|
311
|
+
accountsSkipped: 0,
|
|
312
|
+
dryRun: true,
|
|
313
|
+
resolvedRemoteUrl: remoteUrl,
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
// (6) Live-run requires a TTY (operator must complete the browser flow).
|
|
317
|
+
const isTty = (deps.isTty ?? defaultIsTty)();
|
|
318
|
+
if (!isTty) {
|
|
319
|
+
stderr.write('error: `olam auth migrate` requires an interactive terminal.\n');
|
|
320
|
+
return { exitCode: 1 };
|
|
321
|
+
}
|
|
322
|
+
stdout.write(renderPlanTable(plan, remoteUrl));
|
|
323
|
+
if (pending.length === 0) {
|
|
324
|
+
return {
|
|
325
|
+
exitCode: 0,
|
|
326
|
+
accountsTotal: plan.length,
|
|
327
|
+
accountsAlreadyMigrated: alreadyMigrated,
|
|
328
|
+
accountsMigratedNow: 0,
|
|
329
|
+
accountsSkipped: 0,
|
|
330
|
+
dryRun: false,
|
|
331
|
+
resolvedRemoteUrl: remoteUrl,
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
// (7) Per-account live-run loop.
|
|
335
|
+
let migratedNow = 0;
|
|
336
|
+
let skipped = 0;
|
|
337
|
+
let currentState = state;
|
|
338
|
+
const promptPerAccount = deps.promptPerAccount ?? defaultPromptLine;
|
|
339
|
+
for (const entry of pending) {
|
|
340
|
+
stdout.write(`\nMigrating ${entry.account.email} (${entry.account.provider})...\n`);
|
|
341
|
+
const startUrl = `${remoteUrl.replace(/\/+$/, '')}/v1/oauth/start?label=${encodeURIComponent(entry.account.email)}`;
|
|
342
|
+
stdout.write(` Open: ${startUrl}\n`);
|
|
343
|
+
const ans = (await promptPerAccount(` Press Enter when login succeeds in browser. (s = skip, q = abort): `))
|
|
344
|
+
.trim()
|
|
345
|
+
.toLowerCase();
|
|
346
|
+
if (ans === 'q' || ans === 'quit' || ans === 'abort') {
|
|
347
|
+
stderr.write('Migration aborted by operator. Partial state saved; safe to re-run.\n');
|
|
348
|
+
return {
|
|
349
|
+
exitCode: 1,
|
|
350
|
+
accountsTotal: plan.length,
|
|
351
|
+
accountsAlreadyMigrated: alreadyMigrated,
|
|
352
|
+
accountsMigratedNow: migratedNow,
|
|
353
|
+
accountsSkipped: skipped,
|
|
354
|
+
dryRun: false,
|
|
355
|
+
resolvedRemoteUrl: remoteUrl,
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
if (ans === 's' || ans === 'skip') {
|
|
359
|
+
stdout.write(` Skipped ${entry.account.email}.\n`);
|
|
360
|
+
skipped += 1;
|
|
361
|
+
continue;
|
|
362
|
+
}
|
|
363
|
+
// Confirm + record. Build the next state immutably so a writeFileSync
|
|
364
|
+
// exception (atomic-write failure) does not pollute the in-memory state.
|
|
365
|
+
const record = {
|
|
366
|
+
migratedAt: now(),
|
|
367
|
+
email: entry.account.email,
|
|
368
|
+
provider: entry.account.provider,
|
|
369
|
+
};
|
|
370
|
+
const nextState = {
|
|
371
|
+
version: 1,
|
|
372
|
+
migrated: { ...currentState.migrated, [entry.hash]: record },
|
|
373
|
+
};
|
|
374
|
+
try {
|
|
375
|
+
writeMigrationStateAtomic(statePath, nextState, deps);
|
|
376
|
+
}
|
|
377
|
+
catch (err) {
|
|
378
|
+
stderr.write(`error: failed to persist migration state: ` +
|
|
379
|
+
`${err instanceof Error ? err.message : String(err)}\n`);
|
|
380
|
+
return {
|
|
381
|
+
exitCode: 1,
|
|
382
|
+
accountsTotal: plan.length,
|
|
383
|
+
accountsAlreadyMigrated: alreadyMigrated,
|
|
384
|
+
accountsMigratedNow: migratedNow,
|
|
385
|
+
accountsSkipped: skipped,
|
|
386
|
+
dryRun: false,
|
|
387
|
+
resolvedRemoteUrl: remoteUrl,
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
currentState = nextState;
|
|
391
|
+
migratedNow += 1;
|
|
392
|
+
stdout.write(` Recorded ${entry.account.email} as migrated.\n`);
|
|
393
|
+
}
|
|
394
|
+
// (8) Final rename prompt — only when ALL accounts were migrated.
|
|
395
|
+
if (skipped === 0 && migratedNow === pending.length) {
|
|
396
|
+
const ts = now().replace(/[:.]/g, '-');
|
|
397
|
+
const backupPath = `${accountsPath}.migrated-${ts}.bak`;
|
|
398
|
+
const promptFinalRename = deps.promptFinalRename ?? defaultPromptLine;
|
|
399
|
+
const ans = (await promptFinalRename(`\nAll accounts migrated. Rename ${accountsPath} -> ${backupPath}? [y/N] `))
|
|
400
|
+
.trim()
|
|
401
|
+
.toLowerCase();
|
|
402
|
+
if (ans === 'y' || ans === 'yes') {
|
|
403
|
+
const renameSync = deps.renameSync ?? fs.renameSync;
|
|
404
|
+
try {
|
|
405
|
+
renameSync(accountsPath, backupPath);
|
|
406
|
+
stdout.write(`Local vault renamed to ${backupPath}.\n`);
|
|
407
|
+
}
|
|
408
|
+
catch (err) {
|
|
409
|
+
stderr.write(`warning: rename failed: ${err instanceof Error ? err.message : String(err)}. ` +
|
|
410
|
+
`Migration state is intact; rename ${accountsPath} manually when ready.\n`);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
else {
|
|
414
|
+
stdout.write('Local vault left in place. Use OLAM_CREDENTIAL_BACKEND=local to ' +
|
|
415
|
+
'keep using it, or rename manually when ready.\n');
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
else {
|
|
419
|
+
stdout.write(`\n${migratedNow} migrated, ${skipped} skipped. Re-run to handle skipped accounts.\n`);
|
|
420
|
+
}
|
|
421
|
+
return {
|
|
422
|
+
exitCode: 0,
|
|
423
|
+
accountsTotal: plan.length,
|
|
424
|
+
accountsAlreadyMigrated: alreadyMigrated,
|
|
425
|
+
accountsMigratedNow: migratedNow,
|
|
426
|
+
accountsSkipped: skipped,
|
|
427
|
+
dryRun: false,
|
|
428
|
+
resolvedRemoteUrl: remoteUrl,
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
// ── Commander registration ──────────────────────────────────────────────────
|
|
432
|
+
/**
|
|
433
|
+
* Register `olam auth migrate` on the supplied `auth` subcommand. Called
|
|
434
|
+
* from `packages/cli/src/commands/auth.ts`.
|
|
435
|
+
*/
|
|
436
|
+
export function registerAuthMigrate(auth) {
|
|
437
|
+
auth
|
|
438
|
+
.command('migrate')
|
|
439
|
+
.description('Migrate local ~/.olam/auth-data/accounts.json to the cloud auth-worker. ' +
|
|
440
|
+
'Each local account is re-OAuth\'d against the cloud worker; local file ' +
|
|
441
|
+
'is preserved until operator approves the timestamped rename. Idempotent ' +
|
|
442
|
+
'on re-run via content-hash state in migration-state.json. ' +
|
|
443
|
+
'(Design note: cloud DO has no POST /v1/credentials; migration = per-account re-OAuth.)')
|
|
444
|
+
.option('--dry-run', 'Print the migration plan without acting')
|
|
445
|
+
.option('--yes', 'Skip interactive prompts (only valid with --dry-run)')
|
|
446
|
+
.option('--remote <url>', 'Override auth-worker URL (defaults to canonical zone)')
|
|
447
|
+
.option('--local', '(Disallowed — migrate only makes sense going to remote)')
|
|
448
|
+
.action(async (opts) => {
|
|
449
|
+
const result = await runAuthMigrate(opts, {});
|
|
450
|
+
if (result.exitCode !== 0) {
|
|
451
|
+
process.exitCode = result.exitCode;
|
|
452
|
+
}
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
// Re-export for the deprecated stub in auth.ts so the redirect can call it.
|
|
456
|
+
export { DEFAULT_AUTH_WORKER_URL };
|
|
457
|
+
// Silence "unused import" lints when the symbols below are only used by
|
|
458
|
+
// downstream re-exports + Commander action wiring (TS strict mode).
|
|
459
|
+
export const _internal = {
|
|
460
|
+
printError,
|
|
461
|
+
printHeader,
|
|
462
|
+
printSuccess,
|
|
463
|
+
pc,
|
|
464
|
+
};
|
|
465
|
+
//# sourceMappingURL=auth-migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-migrate.js","sourceRoot":"","sources":["../../src/commands/auth-migrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAC;AAEnD,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EACL,cAAc,EACd,uBAAuB,GACxB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAyGrE,+EAA+E;AAE/E,SAAS,mBAAmB;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,sBAAsB,CAAC,CAAC;AAC/E,CAAC;AAED,+EAA+E;AAE/E;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAqB;IACtD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;QAC5B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,IAAI,IAAI;KACvD,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,mBAAmB;IACjC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AACtC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,SAAiB,EACjB,IAA0D;IAE1D,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,UAAU,CAAC;IACpD,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAEvF,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,mBAAmB,EAAE,CAAC;IAEzD,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACpC,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,sCAAsC,SAAS,IAAI;YACjD,kDAAkD,CACrD,CAAC;IACJ,CAAC;IACD,IACE,OAAO,MAAM,KAAK,QAAQ;QAC1B,MAAM,KAAK,IAAI;QACd,MAAgC,CAAC,OAAO,KAAK,CAAC;QAC/C,OAAQ,MAAiC,CAAC,QAAQ,KAAK,QAAQ;QAC9D,MAAiC,CAAC,QAAQ,KAAK,IAAI,EACpD,CAAC;QACD,MAAM,IAAI,KAAK,CACb,sCAAsC,SAAS,IAAI;YACjD,kDAAkD,CACrD,CAAC;IACJ,CAAC;IACD,OAAO,MAAwB,CAAC;AAClC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CACvC,SAAiB,EACjB,KAAqB,EACrB,IAA2D;IAE3D,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACxG,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,UAAU,CAAC;IAEpD,MAAM,OAAO,GAAG,GAAG,SAAS,MAAM,CAAC;IACnC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9D,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,YAAoB,EACpB,IAA0D;IAE1D,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,UAAU,CAAC;IACpD,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAEvF,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAE3C,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IACvC,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,mBAAmB,YAAY,KAAK,GAAG,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,IACE,OAAO,MAAM,KAAK,QAAQ;QAC1B,MAAM,KAAK,IAAI;QACf,CAAC,KAAK,CAAC,OAAO,CAAE,MAAiC,CAAC,QAAQ,CAAC,EAC3D,CAAC;QACD,MAAM,IAAI,KAAK,CACb,aAAa,YAAY,yCAAyC,CACnE,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,CAAC,IAAK,MAAkC,CAAC,QAAQ,EAAE,CAAC;QAC7D,IACE,OAAO,CAAC,KAAK,QAAQ;YACrB,CAAC,KAAK,IAAI;YACV,OAAQ,CAAyB,CAAC,KAAK,KAAK,QAAQ;YACpD,OAAQ,CAA4B,CAAC,QAAQ,KAAK,QAAQ,EAC1D,CAAC;YACD,MAAM,IAAI,KAAK,CACb,aAAa,YAAY,mDAAmD,CAC7E,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,MAA2B,CAAC;AACrC,CAAC;AAED,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,QAAiC,EACjC,KAAqB;IAErB,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAC9B,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,kBAAkB,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC;QACjF,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,+EAA+E;AAE/E,SAAS,eAAe,CAAC,IAA+B,EAAE,SAAiB;IACzE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,yBAAyB,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACnB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,CAAC,MAAM,KAAK,kBAAkB,EAAE,CAAC;YACpC,MAAM,QAAQ,GAAG,CAAC,CAAC,cAAc,EAAE,UAAU,IAAI,SAAS,CAAC;YAC3D,KAAK,CAAC,IAAI,CACR,MAAM,GAAG,KAAK,QAAQ,IAAI,QAAQ,wCAAwC,QAAQ,GAAG,CACtF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CACR,MAAM,GAAG,KAAK,QAAQ,IAAI,QAAQ,2BAA2B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CACtF,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;IACvC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CACR,OAAO,QAAQ,mCAAmC,SAAS,kBAAkB,CAC9E,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CACR,mBAAmB,OAAO,0CAA0C,SAAS,GAAG,CACjF,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC;AAED,+EAA+E;AAE/E,SAAS,YAAY;IACnB,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,QAAgB;IAC/C,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC3C,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAwB,EACxB,OAAwB,EAAE;IAE1B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IACzD,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,mBAAmB,EAAE,CAAC;IAChE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,gBAAgB,EAAE,CAAC;IAEvD,oDAAoD;IACpD,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC9C,MAAM,CAAC,KAAK,CACV,4CAA4C;YAC1C,0DAA0D,CAC7D,CAAC;QACF,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzB,CAAC;IAED,yDAAyD;IACzD,IAAI,UAAU,CAAC;IACf,IAAI,CAAC;QACH,UAAU,GAAG,cAAc,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,uBAAuB,EAAE,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;YACxC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;QACzB,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,2EAA2E;IAC3E,kEAAkE;IAClE,IAAI,UAAU,CAAC,OAAO,KAAK,OAAO,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1D,MAAM,CAAC,KAAK,CACV,0DAA0D;YACxD,6DAA6D,CAChE,CAAC;QACF,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,SAAS,GAAG,gBAAgB,CAAC,UAAU,EAAE;QAC7C,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;KAClD,CAAC,CAAC;IAEH,6DAA6D;IAC7D,IAAI,KAA+B,CAAC;IACpC,IAAI,CAAC;QACH,KAAK,GAAG,iBAAiB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7E,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzB,CAAC;IACD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAC5D,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;IAC3C,CAAC;IAED,kDAAkD;IAClD,IAAI,KAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,KAAK,GAAG,kBAAkB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7E,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzB,CAAC;IAED,wBAAwB;IACxB,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IAC3D,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAErD,wBAAwB;IACxB,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QACzB,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;QAC/C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QACvD,CAAC;QACD,OAAO;YACL,QAAQ,EAAE,CAAC;YACX,aAAa,EAAE,IAAI,CAAC,MAAM;YAC1B,uBAAuB,EAAE,eAAe;YACxC,mBAAmB,EAAE,CAAC;YACtB,eAAe,EAAE,CAAC;YAClB,MAAM,EAAE,IAAI;YACZ,iBAAiB,EAAE,SAAS;SAC7B,CAAC;IACJ,CAAC;IAED,yEAAyE;IACzE,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC,EAAE,CAAC;IAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,CAAC,KAAK,CACV,gEAAgE,CACjE,CAAC;QACF,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IAC/C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO;YACL,QAAQ,EAAE,CAAC;YACX,aAAa,EAAE,IAAI,CAAC,MAAM;YAC1B,uBAAuB,EAAE,eAAe;YACxC,mBAAmB,EAAE,CAAC;YACtB,eAAe,EAAE,CAAC;YAClB,MAAM,EAAE,KAAK;YACb,iBAAiB,EAAE,SAAS;SAC7B,CAAC;IACJ,CAAC;IAED,iCAAiC;IACjC,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,IAAI,iBAAiB,CAAC;IAEpE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,eAAe,KAAK,CAAC,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO,CAAC,QAAQ,QAAQ,CAAC,CAAC;QACpF,MAAM,QAAQ,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,yBAAyB,kBAAkB,CAC1F,KAAK,CAAC,OAAO,CAAC,KAAK,CACpB,EAAE,CAAC;QACJ,MAAM,CAAC,KAAK,CAAC,WAAW,QAAQ,IAAI,CAAC,CAAC;QAEtC,MAAM,GAAG,GAAG,CACV,MAAM,gBAAgB,CACpB,uEAAuE,CACxE,CACF;aACE,IAAI,EAAE;aACN,WAAW,EAAE,CAAC;QAEjB,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACrD,MAAM,CAAC,KAAK,CACV,uEAAuE,CACxE,CAAC;YACF,OAAO;gBACL,QAAQ,EAAE,CAAC;gBACX,aAAa,EAAE,IAAI,CAAC,MAAM;gBAC1B,uBAAuB,EAAE,eAAe;gBACxC,mBAAmB,EAAE,WAAW;gBAChC,eAAe,EAAE,OAAO;gBACxB,MAAM,EAAE,KAAK;gBACb,iBAAiB,EAAE,SAAS;aAC7B,CAAC;QACJ,CAAC;QACD,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YAClC,MAAM,CAAC,KAAK,CAAC,aAAa,KAAK,CAAC,OAAO,CAAC,KAAK,KAAK,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC,CAAC;YACb,SAAS;QACX,CAAC;QAED,sEAAsE;QACtE,yEAAyE;QACzE,MAAM,MAAM,GAAoB;YAC9B,UAAU,EAAE,GAAG,EAAE;YACjB,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK;YAC1B,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ;SACjC,CAAC;QACF,MAAM,SAAS,GAAmB;YAChC,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE,EAAE,GAAG,YAAY,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE;SAC7D,CAAC;QACF,IAAI,CAAC;YACH,yBAAyB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CACV,4CAA4C;gBAC1C,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAC1D,CAAC;YACF,OAAO;gBACL,QAAQ,EAAE,CAAC;gBACX,aAAa,EAAE,IAAI,CAAC,MAAM;gBAC1B,uBAAuB,EAAE,eAAe;gBACxC,mBAAmB,EAAE,WAAW;gBAChC,eAAe,EAAE,OAAO;gBACxB,MAAM,EAAE,KAAK;gBACb,iBAAiB,EAAE,SAAS;aAC7B,CAAC;QACJ,CAAC;QACD,YAAY,GAAG,SAAS,CAAC;QACzB,WAAW,IAAI,CAAC,CAAC;QACjB,MAAM,CAAC,KAAK,CAAC,cAAc,KAAK,CAAC,OAAO,CAAC,KAAK,iBAAiB,CAAC,CAAC;IACnE,CAAC;IAED,kEAAkE;IAClE,IAAI,OAAO,KAAK,CAAC,IAAI,WAAW,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;QACpD,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACvC,MAAM,UAAU,GAAG,GAAG,YAAY,aAAa,EAAE,MAAM,CAAC;QACxD,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,IAAI,iBAAiB,CAAC;QAEtE,MAAM,GAAG,GAAG,CACV,MAAM,iBAAiB,CACrB,mCAAmC,YAAY,OAAO,UAAU,UAAU,CAC3E,CACF;aACE,IAAI,EAAE;aACN,WAAW,EAAE,CAAC;QAEjB,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;YACjC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,UAAU,CAAC;YACpD,IAAI,CAAC;gBACH,UAAU,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;gBACrC,MAAM,CAAC,KAAK,CAAC,0BAA0B,UAAU,KAAK,CAAC,CAAC;YAC1D,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CACV,2BAA2B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI;oBAC7E,qCAAqC,YAAY,yBAAyB,CAC7E,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CACV,kEAAkE;gBAChE,iDAAiD,CACpD,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,KAAK,CACV,KAAK,WAAW,cAAc,OAAO,gDAAgD,CACtF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,CAAC;QACX,aAAa,EAAE,IAAI,CAAC,MAAM;QAC1B,uBAAuB,EAAE,eAAe;QACxC,mBAAmB,EAAE,WAAW;QAChC,eAAe,EAAE,OAAO;QACxB,MAAM,EAAE,KAAK;QACb,iBAAiB,EAAE,SAAS;KAC7B,CAAC;AACJ,CAAC;AAED,+EAA+E;AAE/E;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAa;IAC/C,IAAI;SACD,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CACV,0EAA0E;QACxE,yEAAyE;QACzE,0EAA0E;QAC1E,4DAA4D;QAC5D,wFAAwF,CAC3F;SACA,MAAM,CAAC,WAAW,EAAE,yCAAyC,CAAC;SAC9D,MAAM,CAAC,OAAO,EAAE,sDAAsD,CAAC;SACvE,MAAM,CAAC,gBAAgB,EAAE,uDAAuD,CAAC;SACjF,MAAM,CAAC,SAAS,EAAE,yDAAyD,CAAC;SAC5E,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,EAAE;QACzC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC9C,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QACrC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,4EAA4E;AAC5E,OAAO,EAAE,uBAAuB,EAAE,CAAC;AAEnC,wEAAwE;AACxE,oEAAoE;AACpE,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,UAAU;IACV,WAAW;IACX,YAAY;IACZ,EAAE;CACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+LzC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmpBnD"}
|