agyx 0.1.1 → 0.1.3
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 +45 -10
- package/dist/src/cli.js +170 -114
- package/dist/src/cli.js.map +1 -1
- package/dist/src/color.d.ts +9 -0
- package/dist/src/color.js +28 -0
- package/dist/src/color.js.map +1 -0
- package/dist/src/config.d.ts +30 -2
- package/dist/src/config.js +109 -6
- package/dist/src/config.js.map +1 -1
- package/dist/src/coordinator.d.ts +18 -4
- package/dist/src/coordinator.js +286 -13
- package/dist/src/coordinator.js.map +1 -1
- package/dist/src/eligibility.d.ts +4 -0
- package/dist/src/eligibility.js +10 -0
- package/dist/src/eligibility.js.map +1 -0
- package/dist/src/google_auth.d.ts +1 -0
- package/dist/src/google_auth.js +42 -0
- package/dist/src/google_auth.js.map +1 -0
- package/dist/src/install.d.ts +2 -0
- package/dist/src/install.js +24 -7
- package/dist/src/install.js.map +1 -1
- package/dist/src/keychain.js +2 -2
- package/dist/src/keychain.js.map +1 -1
- package/dist/src/onboarding.d.ts +1 -0
- package/dist/src/onboarding.js +87 -0
- package/dist/src/onboarding.js.map +1 -0
- package/dist/src/profile_view.d.ts +22 -0
- package/dist/src/profile_view.js +77 -0
- package/dist/src/profile_view.js.map +1 -0
- package/dist/src/quota.d.ts +1 -0
- package/dist/src/quota.js +3 -0
- package/dist/src/quota.js.map +1 -1
- package/dist/src/selection.d.ts +1 -1
- package/dist/src/selection.js +18 -1
- package/dist/src/selection.js.map +1 -1
- package/dist/src/session.js +54 -31
- package/dist/src/session.js.map +1 -1
- package/dist/src/ui.d.ts +19 -0
- package/dist/src/ui.js +306 -0
- package/dist/src/ui.js.map +1 -0
- package/package.json +8 -1
package/dist/src/config.js
CHANGED
|
@@ -30,7 +30,7 @@ export async function saveState(state) {
|
|
|
30
30
|
await chmod(temporary, 0o600);
|
|
31
31
|
await rename(temporary, statePath);
|
|
32
32
|
}
|
|
33
|
-
export async function upsertProfile(name, email, makeActive) {
|
|
33
|
+
export async function upsertProfile(name, email, makeActive, countActivation = makeActive) {
|
|
34
34
|
const state = await loadState();
|
|
35
35
|
const now = new Date();
|
|
36
36
|
const nowString = now.toISOString();
|
|
@@ -39,7 +39,17 @@ export async function upsertProfile(name, email, makeActive) {
|
|
|
39
39
|
existing.email = email ?? existing.email;
|
|
40
40
|
existing.authenticatedAt = nowString;
|
|
41
41
|
existing.updatedAt = nowString;
|
|
42
|
-
|
|
42
|
+
existing.credentialStatus = email ? "verified" : "unknown";
|
|
43
|
+
existing.verifiedEmail = email ?? undefined;
|
|
44
|
+
existing.credentialVerifiedAt = email ? nowString : undefined;
|
|
45
|
+
existing.credentialMismatchAt = undefined;
|
|
46
|
+
existing.credentialError = undefined;
|
|
47
|
+
existing.eligibilityStatus = "unknown";
|
|
48
|
+
existing.lastEligibilityErrorAt = undefined;
|
|
49
|
+
existing.eligibilityReason = undefined;
|
|
50
|
+
if (existing.quotaStatus === "exhausted"
|
|
51
|
+
&& existing.quotaResetAt
|
|
52
|
+
&& Date.parse(existing.quotaResetAt) <= now.getTime()) {
|
|
43
53
|
existing.quotaStatus = "available";
|
|
44
54
|
existing.quotaResetAt = undefined;
|
|
45
55
|
existing.lastQuotaReason = undefined;
|
|
@@ -53,15 +63,19 @@ export async function upsertProfile(name, email, makeActive) {
|
|
|
53
63
|
updatedAt: nowString,
|
|
54
64
|
authenticatedAt: nowString,
|
|
55
65
|
quotaStatus: "available",
|
|
66
|
+
credentialStatus: email ? "verified" : "unknown",
|
|
67
|
+
verifiedEmail: email,
|
|
68
|
+
credentialVerifiedAt: email ? nowString : undefined,
|
|
69
|
+
eligibilityStatus: "unknown",
|
|
56
70
|
selectionCount: 0,
|
|
57
71
|
});
|
|
58
72
|
}
|
|
59
73
|
state.profiles.sort((left, right) => left.name.localeCompare(right.name));
|
|
60
74
|
if (makeActive)
|
|
61
|
-
markProfileActivated(state, name, now);
|
|
75
|
+
markProfileActivated(state, name, now, countActivation);
|
|
62
76
|
await saveState(state);
|
|
63
77
|
}
|
|
64
|
-
export function markProfileActivated(state, name, now = new Date()) {
|
|
78
|
+
export function markProfileActivated(state, name, now = new Date(), incrementSelection = true) {
|
|
65
79
|
const profile = state.profiles.find((entry) => entry.name === name);
|
|
66
80
|
if (!profile)
|
|
67
81
|
throw new Error(`Profile not found: ${name}`);
|
|
@@ -69,7 +83,9 @@ export function markProfileActivated(state, name, now = new Date()) {
|
|
|
69
83
|
state.activeProfile = name;
|
|
70
84
|
profile.lastActivatedAt = nowString;
|
|
71
85
|
profile.updatedAt = nowString;
|
|
72
|
-
|
|
86
|
+
if (incrementSelection) {
|
|
87
|
+
profile.selectionCount = (profile.selectionCount ?? 0) + 1;
|
|
88
|
+
}
|
|
73
89
|
if (profile.quotaStatus === "exhausted"
|
|
74
90
|
&& profile.quotaResetAt
|
|
75
91
|
&& Date.parse(profile.quotaResetAt) <= now.getTime()) {
|
|
@@ -78,8 +94,22 @@ export function markProfileActivated(state, name, now = new Date()) {
|
|
|
78
94
|
profile.lastQuotaReason = undefined;
|
|
79
95
|
}
|
|
80
96
|
}
|
|
97
|
+
export function markProfileRequest(state, name, now = new Date()) {
|
|
98
|
+
const profile = state.profiles.find((entry) => entry.name === name || entry.previousNames?.includes(name));
|
|
99
|
+
if (!profile)
|
|
100
|
+
return;
|
|
101
|
+
const nowString = now.toISOString();
|
|
102
|
+
profile.lastRequestAt = nowString;
|
|
103
|
+
profile.lastSuccessfulRequestAt = nowString;
|
|
104
|
+
profile.updatedAt = nowString;
|
|
105
|
+
if (profile.quotaStatus !== "exhausted")
|
|
106
|
+
profile.quotaStatus = "available";
|
|
107
|
+
profile.eligibilityStatus = "eligible";
|
|
108
|
+
profile.eligibilityReason = undefined;
|
|
109
|
+
profile.lastEligibilityErrorAt = undefined;
|
|
110
|
+
}
|
|
81
111
|
export function markProfileQuotaExhausted(state, name, event, now = new Date()) {
|
|
82
|
-
const profile = state.profiles.find((entry) => entry.name === name);
|
|
112
|
+
const profile = state.profiles.find((entry) => entry.name === name || entry.previousNames?.includes(name));
|
|
83
113
|
if (!profile)
|
|
84
114
|
return;
|
|
85
115
|
const nowString = now.toISOString();
|
|
@@ -89,11 +119,63 @@ export function markProfileQuotaExhausted(state, name, event, now = new Date())
|
|
|
89
119
|
profile.quotaResetAt = event.resetAt;
|
|
90
120
|
profile.updatedAt = nowString;
|
|
91
121
|
}
|
|
122
|
+
export function markProfileCredentialVerified(state, name, actualEmail, now = new Date()) {
|
|
123
|
+
const profile = state.profiles.find((entry) => entry.name === name);
|
|
124
|
+
if (!profile)
|
|
125
|
+
return;
|
|
126
|
+
const nowString = now.toISOString();
|
|
127
|
+
profile.email = profile.email ?? actualEmail;
|
|
128
|
+
profile.credentialStatus = "verified";
|
|
129
|
+
profile.verifiedEmail = actualEmail;
|
|
130
|
+
profile.credentialVerifiedAt = nowString;
|
|
131
|
+
profile.credentialMismatchAt = undefined;
|
|
132
|
+
profile.credentialError = undefined;
|
|
133
|
+
profile.updatedAt = nowString;
|
|
134
|
+
}
|
|
135
|
+
export function markProfileCredentialMismatch(state, name, actualEmail, expectedEmail, now = new Date()) {
|
|
136
|
+
const profile = state.profiles.find((entry) => entry.name === name);
|
|
137
|
+
if (!profile)
|
|
138
|
+
return;
|
|
139
|
+
const nowString = now.toISOString();
|
|
140
|
+
profile.credentialStatus = actualEmail ? "mismatch" : "error";
|
|
141
|
+
profile.verifiedEmail = actualEmail;
|
|
142
|
+
profile.credentialMismatchAt = nowString;
|
|
143
|
+
profile.credentialError = actualEmail
|
|
144
|
+
? `expected ${expectedEmail ?? "-"}, got ${actualEmail}`
|
|
145
|
+
: "credential probe did not return an authenticated email";
|
|
146
|
+
profile.updatedAt = nowString;
|
|
147
|
+
if (state.activeProfile === name) {
|
|
148
|
+
state.activeProfile = actualEmail
|
|
149
|
+
? state.profiles.find((entry) => entry.name !== name
|
|
150
|
+
&& (entry.email === actualEmail || entry.verifiedEmail === actualEmail))?.name
|
|
151
|
+
: undefined;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
export function markProfileIneligible(state, name, event, now = new Date()) {
|
|
155
|
+
const profile = state.profiles.find((entry) => entry.name === name || entry.previousNames?.includes(name));
|
|
156
|
+
if (!profile)
|
|
157
|
+
return;
|
|
158
|
+
const nowString = now.toISOString();
|
|
159
|
+
profile.eligibilityStatus = "ineligible";
|
|
160
|
+
profile.lastEligibilityErrorAt = nowString;
|
|
161
|
+
profile.eligibilityReason = event.reason;
|
|
162
|
+
profile.updatedAt = nowString;
|
|
163
|
+
}
|
|
92
164
|
export async function recordProfileQuotaExhausted(name, event) {
|
|
93
165
|
const state = await loadState();
|
|
94
166
|
markProfileQuotaExhausted(state, name, event);
|
|
95
167
|
await saveState(state);
|
|
96
168
|
}
|
|
169
|
+
export async function recordProfileRequest(name, now = new Date()) {
|
|
170
|
+
const state = await loadState();
|
|
171
|
+
markProfileRequest(state, name, now);
|
|
172
|
+
await saveState(state);
|
|
173
|
+
}
|
|
174
|
+
export async function recordProfileIneligible(name, event) {
|
|
175
|
+
const state = await loadState();
|
|
176
|
+
markProfileIneligible(state, name, event);
|
|
177
|
+
await saveState(state);
|
|
178
|
+
}
|
|
97
179
|
export async function cleanupRuntimeFile(path) {
|
|
98
180
|
await rm(path, { force: true }).catch(() => undefined);
|
|
99
181
|
}
|
|
@@ -103,6 +185,27 @@ export function validateProfileName(name) {
|
|
|
103
185
|
}
|
|
104
186
|
return name;
|
|
105
187
|
}
|
|
188
|
+
export function profileNameFromEmail(email) {
|
|
189
|
+
const localPart = email.split("@")[0] ?? "";
|
|
190
|
+
const normalized = localPart
|
|
191
|
+
.toLowerCase()
|
|
192
|
+
.replace(/[^a-z0-9._-]+/g, "-")
|
|
193
|
+
.replace(/^[._-]+|[._-]+$/g, "")
|
|
194
|
+
.replace(/[._-]{2,}/g, "-");
|
|
195
|
+
return validateProfileName(normalized || "account");
|
|
196
|
+
}
|
|
197
|
+
export function uniqueProfileName(baseName, state) {
|
|
198
|
+
const base = validateProfileName(baseName);
|
|
199
|
+
const names = new Set(state.profiles.flatMap((profile) => [profile.name, ...(profile.previousNames ?? [])]));
|
|
200
|
+
if (!names.has(base))
|
|
201
|
+
return base;
|
|
202
|
+
for (let suffix = 2; suffix < 10000; suffix += 1) {
|
|
203
|
+
const candidate = `${base}-${suffix}`;
|
|
204
|
+
if (!names.has(candidate))
|
|
205
|
+
return candidate;
|
|
206
|
+
}
|
|
207
|
+
throw new Error(`Could not find an unused profile name for '${base}'.`);
|
|
208
|
+
}
|
|
106
209
|
export async function ensureParent(path) {
|
|
107
210
|
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
108
211
|
}
|
package/dist/src/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACjF,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,23 @@
|
|
|
1
|
+
import { State } from "./config.js";
|
|
1
2
|
import { SessionRecord } from "./session.js";
|
|
2
3
|
export declare function sessionRecords(): Promise<SessionRecord[]>;
|
|
3
4
|
export declare function pauseAll(): Promise<SessionRecord[]>;
|
|
4
5
|
export declare function resumeAll(records: SessionRecord[]): Promise<void>;
|
|
5
|
-
export
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
export interface ProfileCaptureResult {
|
|
7
|
+
name: string;
|
|
8
|
+
email?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface ProfileSwitchResult {
|
|
11
|
+
name: string;
|
|
12
|
+
email?: string;
|
|
13
|
+
alreadyActive?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare function saveCurrent(nameInput?: string, explicitEmail?: string): Promise<ProfileCaptureResult>;
|
|
16
|
+
export declare function activateProfile(nameInput: string, options?: {
|
|
17
|
+
verify?: boolean;
|
|
18
|
+
}): Promise<ProfileSwitchResult>;
|
|
19
|
+
export declare function switchProfile(name: string): Promise<ProfileSwitchResult>;
|
|
20
|
+
export declare function switchToNextProfile(): Promise<ProfileSwitchResult>;
|
|
21
|
+
export declare function verifyAllProfiles(): Promise<State>;
|
|
8
22
|
export declare function detectEmail(content: string): string | undefined;
|
|
9
|
-
export declare function loginProfile(nameInput
|
|
23
|
+
export declare function loginProfile(nameInput?: string, explicitEmail?: string, resume?: boolean): Promise<ProfileCaptureResult>;
|
package/dist/src/coordinator.js
CHANGED
|
@@ -1,10 +1,69 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
|
-
import { readdir, readFile, rm } from "node:fs/promises";
|
|
2
|
+
import { chmod, readdir, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
3
3
|
import { connect } from "node:net";
|
|
4
4
|
import { join } from "node:path";
|
|
5
|
-
import { ensureDirectories, loadState, logDir, markProfileActivated, runtimeDir, saveState, upsertProfile, validateProfileName, } from "./config.js";
|
|
5
|
+
import { ensureDirectories, loadState, logDir, markProfileActivated, markProfileCredentialMismatch, markProfileCredentialVerified, profileNameFromEmail, runtimeDir, saveState, upsertProfile, uniqueProfileName, validateProfileName, } from "./config.js";
|
|
6
6
|
import { keychain } from "./keychain.js";
|
|
7
|
+
import { detectCredentialEmail } from "./google_auth.js";
|
|
7
8
|
import { findRealAgy, runningAgy, stopProcesses, } from "./processes.js";
|
|
9
|
+
import { effectiveProfileStatus, selectNextProfile } from "./selection.js";
|
|
10
|
+
function parseJSONPrefix(content) {
|
|
11
|
+
try {
|
|
12
|
+
return JSON.parse(content);
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
let depth = 0;
|
|
16
|
+
let inString = false;
|
|
17
|
+
let escaped = false;
|
|
18
|
+
let started = false;
|
|
19
|
+
for (let index = 0; index < content.length; index += 1) {
|
|
20
|
+
const character = content[index];
|
|
21
|
+
if (!started) {
|
|
22
|
+
if (/\s/.test(character))
|
|
23
|
+
continue;
|
|
24
|
+
if (character !== "{")
|
|
25
|
+
throw error;
|
|
26
|
+
started = true;
|
|
27
|
+
depth = 1;
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
if (escaped) {
|
|
31
|
+
escaped = false;
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (character === "\\") {
|
|
35
|
+
escaped = inString;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (character === "\"") {
|
|
39
|
+
inString = !inString;
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (inString)
|
|
43
|
+
continue;
|
|
44
|
+
if (character === "{")
|
|
45
|
+
depth += 1;
|
|
46
|
+
if (character === "}")
|
|
47
|
+
depth -= 1;
|
|
48
|
+
if (depth === 0) {
|
|
49
|
+
return JSON.parse(content.slice(0, index + 1));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async function writeRuntimeRecord(path, record) {
|
|
56
|
+
const temporary = `${path}.${process.pid}.tmp`;
|
|
57
|
+
try {
|
|
58
|
+
await writeFile(temporary, `${JSON.stringify(record, null, 2)}\n`, { mode: 0o600 });
|
|
59
|
+
await chmod(temporary, 0o600);
|
|
60
|
+
await rename(temporary, path);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
await rm(temporary, { force: true }).catch(() => undefined);
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
8
67
|
async function send(socketPath, command) {
|
|
9
68
|
return await new Promise((resolvePromise, reject) => {
|
|
10
69
|
const socket = connect(socketPath);
|
|
@@ -30,8 +89,9 @@ export async function sessionRecords() {
|
|
|
30
89
|
for (const entry of entries.filter((name) => name.endsWith(".json"))) {
|
|
31
90
|
const path = join(runtimeDir, entry);
|
|
32
91
|
try {
|
|
33
|
-
const record =
|
|
92
|
+
const record = parseJSONPrefix(await readFile(path, "utf8"));
|
|
34
93
|
process.kill(record.pid, 0);
|
|
94
|
+
await writeRuntimeRecord(path, record);
|
|
35
95
|
records.push(record);
|
|
36
96
|
}
|
|
37
97
|
catch {
|
|
@@ -45,9 +105,18 @@ export async function pauseAll() {
|
|
|
45
105
|
const paused = [];
|
|
46
106
|
for (const record of records) {
|
|
47
107
|
const reply = await send(record.socketPath, "pause");
|
|
48
|
-
if (!reply.ok)
|
|
49
|
-
|
|
50
|
-
|
|
108
|
+
if (!reply.ok) {
|
|
109
|
+
if (!reply.error?.includes("Unexpected non-whitespace character after JSON")) {
|
|
110
|
+
throw new Error(reply.error ?? `Failed to pause ${record.id}`);
|
|
111
|
+
}
|
|
112
|
+
paused.push({
|
|
113
|
+
...record,
|
|
114
|
+
childPid: undefined,
|
|
115
|
+
paused: true,
|
|
116
|
+
});
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
paused.push(reply.record ?? { ...record, childPid: undefined, paused: true });
|
|
51
120
|
}
|
|
52
121
|
const managedPIDs = new Set(paused.map((record) => record.childPid).filter(Boolean));
|
|
53
122
|
const unmanaged = (await runningAgy()).filter(({ pid }) => !managedPIDs.has(pid));
|
|
@@ -67,13 +136,59 @@ export async function resumeAll(records) {
|
|
|
67
136
|
}
|
|
68
137
|
}
|
|
69
138
|
}
|
|
70
|
-
|
|
71
|
-
|
|
139
|
+
function resolveProfileName(state, nameInput, email, context) {
|
|
140
|
+
if (nameInput)
|
|
141
|
+
return validateProfileName(nameInput);
|
|
142
|
+
if (!email) {
|
|
143
|
+
throw new Error(context === "save"
|
|
144
|
+
? "Usage: agyx save [name] [--email EMAIL]. Profile name could not be inferred because no active Google account email was found."
|
|
145
|
+
: "Usage: agyx login [name] [--email EMAIL] [--no-resume]. Profile name could not be inferred because login email was not detected.");
|
|
146
|
+
}
|
|
147
|
+
const existingByEmail = state.profiles.find((profile) => profile.email === email);
|
|
148
|
+
if (existingByEmail)
|
|
149
|
+
return existingByEmail.name;
|
|
150
|
+
return uniqueProfileName(profileNameFromEmail(email), state);
|
|
151
|
+
}
|
|
152
|
+
export async function saveCurrent(nameInput, explicitEmail) {
|
|
153
|
+
const state = await loadState();
|
|
154
|
+
const activeProfileEmail = state.profiles.find((profile) => profile.name === state.activeProfile)?.email;
|
|
155
|
+
const probeLogPath = join(logDir, `email-probe-${Date.now()}.log`);
|
|
156
|
+
const email = explicitEmail
|
|
157
|
+
?? await detectActiveEmail(probeLogPath)
|
|
158
|
+
?? (nameInput ? activeProfileEmail : undefined);
|
|
159
|
+
const name = resolveProfileName(state, nameInput, email, "save");
|
|
72
160
|
const credential = await keychain.readActive();
|
|
73
161
|
await keychain.writeProfile(name, credential);
|
|
74
|
-
await upsertProfile(name, email, true);
|
|
162
|
+
await upsertProfile(name, email, true, false);
|
|
163
|
+
return { name, email };
|
|
75
164
|
}
|
|
76
|
-
|
|
165
|
+
async function verifyActiveCredential(state, name) {
|
|
166
|
+
const profile = state.profiles.find((entry) => entry.name === name);
|
|
167
|
+
if (!profile)
|
|
168
|
+
throw new Error(`Profile not found: ${name}`);
|
|
169
|
+
const expectedEmail = profile.email;
|
|
170
|
+
const initialCredential = await keychain.readActive();
|
|
171
|
+
let actualEmail = await detectCredentialEmail(initialCredential);
|
|
172
|
+
if (!actualEmail) {
|
|
173
|
+
actualEmail = await detectActiveEmail(join(logDir, `verify-${name}-${Date.now()}.log`));
|
|
174
|
+
}
|
|
175
|
+
const refreshedCredential = await keychain.readActive();
|
|
176
|
+
actualEmail = actualEmail ?? await detectCredentialEmail(refreshedCredential);
|
|
177
|
+
if (!actualEmail) {
|
|
178
|
+
markProfileCredentialMismatch(state, name, undefined, expectedEmail);
|
|
179
|
+
await saveState(state);
|
|
180
|
+
throw new Error(`Profile '${name}' credential could not be verified. No authenticated email was detected.`);
|
|
181
|
+
}
|
|
182
|
+
if (expectedEmail && actualEmail !== expectedEmail) {
|
|
183
|
+
markProfileCredentialMismatch(state, name, actualEmail, expectedEmail);
|
|
184
|
+
await saveState(state);
|
|
185
|
+
throw new Error(`Profile '${name}' credential mismatch: expected ${expectedEmail}, got ${actualEmail}.`);
|
|
186
|
+
}
|
|
187
|
+
await keychain.writeProfile(name, refreshedCredential);
|
|
188
|
+
markProfileCredentialVerified(state, name, actualEmail);
|
|
189
|
+
return actualEmail;
|
|
190
|
+
}
|
|
191
|
+
export async function activateProfile(nameInput, options = {}) {
|
|
77
192
|
const name = validateProfileName(nameInput);
|
|
78
193
|
const state = await loadState();
|
|
79
194
|
if (!state.profiles.some((profile) => profile.name === name)) {
|
|
@@ -81,22 +196,178 @@ export async function activateProfile(nameInput) {
|
|
|
81
196
|
}
|
|
82
197
|
const credential = await keychain.readProfile(name);
|
|
83
198
|
await keychain.writeActive(credential);
|
|
199
|
+
const email = options.verify ? await verifyActiveCredential(state, name) : undefined;
|
|
84
200
|
markProfileActivated(state, name);
|
|
85
201
|
await saveState(state);
|
|
202
|
+
return { name, email };
|
|
86
203
|
}
|
|
87
204
|
export async function switchProfile(name) {
|
|
205
|
+
const initialState = await loadState();
|
|
206
|
+
const profile = initialState.profiles.find((entry) => entry.name === name);
|
|
207
|
+
if (!profile)
|
|
208
|
+
throw new Error(`Profile not found: ${name}`);
|
|
209
|
+
if (initialState.activeProfile === name) {
|
|
210
|
+
return {
|
|
211
|
+
name,
|
|
212
|
+
email: profile.email ?? profile.verifiedEmail,
|
|
213
|
+
alreadyActive: true,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
const status = effectiveProfileStatus(profile);
|
|
217
|
+
if (status !== "ready") {
|
|
218
|
+
throw new Error(`Profile '${name}' is not selectable: ${status}.`);
|
|
219
|
+
}
|
|
88
220
|
const sessions = await pauseAll();
|
|
221
|
+
const previousCredential = await keychain.readActive().catch(() => undefined);
|
|
89
222
|
try {
|
|
90
|
-
await activateProfile(name);
|
|
223
|
+
return await activateProfile(name, { verify: true });
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
if (previousCredential)
|
|
227
|
+
await keychain.writeActive(previousCredential);
|
|
228
|
+
throw error;
|
|
91
229
|
}
|
|
92
230
|
finally {
|
|
93
231
|
await resumeAll(sessions);
|
|
94
232
|
}
|
|
95
233
|
}
|
|
234
|
+
export async function switchToNextProfile() {
|
|
235
|
+
const initialState = await loadState();
|
|
236
|
+
const initialCandidate = selectNextProfile(initialState);
|
|
237
|
+
if (initialCandidate.name === initialState.activeProfile) {
|
|
238
|
+
return {
|
|
239
|
+
name: initialCandidate.name,
|
|
240
|
+
email: initialCandidate.email ?? initialCandidate.verifiedEmail,
|
|
241
|
+
alreadyActive: true,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
const sessions = await pauseAll();
|
|
245
|
+
const previousCredential = await keychain.readActive().catch(() => undefined);
|
|
246
|
+
let lastError;
|
|
247
|
+
try {
|
|
248
|
+
for (let attempt = 0; attempt < 10000; attempt += 1) {
|
|
249
|
+
const state = await loadState();
|
|
250
|
+
const candidate = selectNextProfile(state);
|
|
251
|
+
if (candidate.name === state.activeProfile) {
|
|
252
|
+
return {
|
|
253
|
+
name: candidate.name,
|
|
254
|
+
email: candidate.email ?? candidate.verifiedEmail,
|
|
255
|
+
alreadyActive: true,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
try {
|
|
259
|
+
return await activateProfile(candidate.name, { verify: true });
|
|
260
|
+
}
|
|
261
|
+
catch (error) {
|
|
262
|
+
lastError = error;
|
|
263
|
+
const profile = (await loadState()).profiles.find((entry) => entry.name === candidate.name);
|
|
264
|
+
if (!profile || !["mismatch", "error"].includes(profile.credentialStatus ?? "")) {
|
|
265
|
+
throw error;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
throw lastError ?? new Error("No selectable profiles.");
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
if (previousCredential)
|
|
273
|
+
await keychain.writeActive(previousCredential);
|
|
274
|
+
throw error;
|
|
275
|
+
}
|
|
276
|
+
finally {
|
|
277
|
+
await resumeAll(sessions);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
export async function verifyAllProfiles() {
|
|
281
|
+
const sessions = await pauseAll();
|
|
282
|
+
const previousCredential = await keychain.readActive().catch(() => undefined);
|
|
283
|
+
try {
|
|
284
|
+
const names = (await loadState()).profiles.map((profile) => profile.name);
|
|
285
|
+
for (const name of names) {
|
|
286
|
+
const state = await loadState();
|
|
287
|
+
if (!state.profiles.some((profile) => profile.name === name))
|
|
288
|
+
continue;
|
|
289
|
+
try {
|
|
290
|
+
const credential = await keychain.readProfile(name);
|
|
291
|
+
await keychain.writeActive(credential);
|
|
292
|
+
await verifyActiveCredential(state, name);
|
|
293
|
+
await saveState(state);
|
|
294
|
+
}
|
|
295
|
+
catch (error) {
|
|
296
|
+
const currentState = await loadState();
|
|
297
|
+
const profile = currentState.profiles.find((entry) => entry.name === name);
|
|
298
|
+
if (profile && profile.credentialStatus !== "mismatch") {
|
|
299
|
+
markProfileCredentialMismatch(currentState, name, undefined, profile.email);
|
|
300
|
+
await saveState(currentState);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
return await loadState();
|
|
305
|
+
}
|
|
306
|
+
finally {
|
|
307
|
+
if (previousCredential)
|
|
308
|
+
await keychain.writeActive(previousCredential);
|
|
309
|
+
await resumeAll(sessions);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
96
312
|
export function detectEmail(content) {
|
|
97
313
|
const matches = [...content.matchAll(/authenticated successfully as ([^\s]+@[^\s]+)/gi)];
|
|
98
314
|
return matches.at(-1)?.[1];
|
|
99
315
|
}
|
|
316
|
+
async function detectActiveEmail(logPath) {
|
|
317
|
+
const realAgy = await findRealAgy();
|
|
318
|
+
return await new Promise((resolvePromise, reject) => {
|
|
319
|
+
const child = spawn(realAgy, ["--log-file", logPath], {
|
|
320
|
+
stdio: "ignore",
|
|
321
|
+
cwd: process.cwd(),
|
|
322
|
+
env: {
|
|
323
|
+
...process.env,
|
|
324
|
+
AGYX_EMAIL_PROBE: "1",
|
|
325
|
+
},
|
|
326
|
+
});
|
|
327
|
+
let settled = false;
|
|
328
|
+
let interval;
|
|
329
|
+
let timeout;
|
|
330
|
+
const finish = (email) => {
|
|
331
|
+
if (settled)
|
|
332
|
+
return;
|
|
333
|
+
settled = true;
|
|
334
|
+
clearInterval(interval);
|
|
335
|
+
clearTimeout(timeout);
|
|
336
|
+
if (child.exitCode === null)
|
|
337
|
+
child.kill("SIGTERM");
|
|
338
|
+
resolvePromise(email);
|
|
339
|
+
};
|
|
340
|
+
interval = setInterval(async () => {
|
|
341
|
+
try {
|
|
342
|
+
const email = detectEmail(await readFile(logPath, "utf8"));
|
|
343
|
+
if (email)
|
|
344
|
+
finish(email);
|
|
345
|
+
}
|
|
346
|
+
catch {
|
|
347
|
+
// Wait for the log file and auth line.
|
|
348
|
+
}
|
|
349
|
+
}, 200);
|
|
350
|
+
timeout = setTimeout(() => finish(undefined), 7000);
|
|
351
|
+
child.on("error", (error) => {
|
|
352
|
+
if (settled)
|
|
353
|
+
return;
|
|
354
|
+
settled = true;
|
|
355
|
+
clearInterval(interval);
|
|
356
|
+
clearTimeout(timeout);
|
|
357
|
+
reject(error);
|
|
358
|
+
});
|
|
359
|
+
child.on("exit", async () => {
|
|
360
|
+
if (settled)
|
|
361
|
+
return;
|
|
362
|
+
try {
|
|
363
|
+
finish(detectEmail(await readFile(logPath, "utf8")));
|
|
364
|
+
}
|
|
365
|
+
catch {
|
|
366
|
+
finish(undefined);
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
});
|
|
370
|
+
}
|
|
100
371
|
async function interactiveLogin(logPath) {
|
|
101
372
|
const realAgy = await findRealAgy();
|
|
102
373
|
return await new Promise((resolvePromise, reject) => {
|
|
@@ -136,7 +407,6 @@ async function interactiveLogin(logPath) {
|
|
|
136
407
|
});
|
|
137
408
|
}
|
|
138
409
|
export async function loginProfile(nameInput, explicitEmail, resume = true) {
|
|
139
|
-
const name = validateProfileName(nameInput);
|
|
140
410
|
const sessions = await pauseAll();
|
|
141
411
|
const state = await loadState();
|
|
142
412
|
const previousCredential = await keychain.readActive().catch(() => undefined);
|
|
@@ -151,9 +421,12 @@ export async function loginProfile(nameInput, explicitEmail, resume = true) {
|
|
|
151
421
|
const credential = await keychain.readActive().catch(() => undefined);
|
|
152
422
|
if (!credential)
|
|
153
423
|
throw new Error("Login ended without creating an agy credential.");
|
|
424
|
+
const email = explicitEmail ?? detectedEmail;
|
|
425
|
+
const name = resolveProfileName(await loadState(), nameInput, email, "login");
|
|
154
426
|
await keychain.writeProfile(name, credential);
|
|
155
|
-
await upsertProfile(name,
|
|
427
|
+
await upsertProfile(name, email, true);
|
|
156
428
|
console.log(`Captured and activated profile '${name}'.`);
|
|
429
|
+
return { name, email };
|
|
157
430
|
}
|
|
158
431
|
catch (error) {
|
|
159
432
|
if (previousCredential)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../src/coordinator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../src/coordinator.ts"],"names":[],"mappings":"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"}
|