agyx 0.1.0 → 0.1.2
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 +37 -1
- package/dist/src/cli.js +119 -34
- package/dist/src/cli.js.map +1 -1
- package/dist/src/config.d.ts +23 -0
- package/dist/src/config.js +87 -4
- package/dist/src/config.js.map +1 -1
- package/dist/src/coordinator.d.ts +6 -2
- package/dist/src/coordinator.js +25 -6
- package/dist/src/coordinator.js.map +1 -1
- package/dist/src/quota.d.ts +5 -0
- package/dist/src/quota.js +52 -0
- package/dist/src/quota.js.map +1 -0
- package/dist/src/selection.d.ts +5 -0
- package/dist/src/selection.js +35 -0
- package/dist/src/selection.js.map +1 -0
- package/dist/src/session.js +44 -1
- package/dist/src/session.js.map +1 -1
- package/dist/src/shim.js +0 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -43,13 +43,20 @@ prevents duplicate requests.
|
|
|
43
43
|
Save the account currently stored by `agy`:
|
|
44
44
|
|
|
45
45
|
```bash
|
|
46
|
-
agyx save
|
|
46
|
+
agyx save
|
|
47
|
+
agyx save personal
|
|
47
48
|
```
|
|
48
49
|
|
|
50
|
+
When the name is omitted, `agyx save` reads the active Google account from
|
|
51
|
+
`~/.gemini/google_accounts.json` and derives a profile name from the email
|
|
52
|
+
local-part. Use `--email EMAIL` only when you want to override the detected
|
|
53
|
+
metadata.
|
|
54
|
+
|
|
49
55
|
Add another account:
|
|
50
56
|
|
|
51
57
|
```bash
|
|
52
58
|
agyx login work
|
|
59
|
+
agyx login
|
|
53
60
|
```
|
|
54
61
|
|
|
55
62
|
`agyx login` performs this transaction:
|
|
@@ -60,6 +67,9 @@ agyx login work
|
|
|
60
67
|
4. Save and activate the new credential.
|
|
61
68
|
5. Restart every supervised session in its original terminal.
|
|
62
69
|
|
|
70
|
+
When the name is omitted, `agyx login` derives it from the OAuth email detected
|
|
71
|
+
in the `agy` log, falling back to `~/.gemini/google_accounts.json`.
|
|
72
|
+
|
|
63
73
|
Use `--no-resume` to leave sessions paused after login.
|
|
64
74
|
|
|
65
75
|
## Switching
|
|
@@ -67,10 +77,24 @@ Use `--no-resume` to leave sessions paused after login.
|
|
|
67
77
|
```bash
|
|
68
78
|
agyx list
|
|
69
79
|
agyx use work
|
|
80
|
+
agyx use
|
|
70
81
|
agyx next
|
|
71
82
|
agyx status
|
|
72
83
|
```
|
|
73
84
|
|
|
85
|
+
`agyx use` without a profile opens an interactive picker. The picker and
|
|
86
|
+
`agyx list` show profile metadata:
|
|
87
|
+
|
|
88
|
+
- `status`: `ready`, `quota`, `disabled`, or `unknown`
|
|
89
|
+
- `reset`: relative quota reset time when it can be inferred from logs
|
|
90
|
+
- `last-used`: when the profile was last activated through agyx
|
|
91
|
+
- `picks`: how many times agyx selected the profile
|
|
92
|
+
|
|
93
|
+
`agyx next` uses name-sorted round-robin order, starting after the currently
|
|
94
|
+
active profile. It skips profiles marked `disabled` or currently quota
|
|
95
|
+
exhausted. If a quota reset time has passed, the profile becomes selectable
|
|
96
|
+
again.
|
|
97
|
+
|
|
74
98
|
Each supervisor preserves its working directory and original arguments. It also
|
|
75
99
|
extracts the active conversation UUID from the session log and uses
|
|
76
100
|
`agy --conversation <UUID>` when restarting.
|
|
@@ -78,6 +102,18 @@ extracts the active conversation UUID from the session log and uses
|
|
|
78
102
|
Conversation names are supported by `agy` through `/rename` and `/resume`, but
|
|
79
103
|
`agyx` tracks UUIDs because names can be changed or duplicated.
|
|
80
104
|
|
|
105
|
+
## Quota detection
|
|
106
|
+
|
|
107
|
+
`agyx` passively scans supervised `agy` session logs for common quota/rate-limit
|
|
108
|
+
signals such as `RESOURCE_EXHAUSTED`, HTTP `429`, and `Individual quota
|
|
109
|
+
reached`. When a reset hint such as `Resets in 73h16m27s` is present, agyx stores
|
|
110
|
+
the inferred reset time in profile metadata.
|
|
111
|
+
|
|
112
|
+
This release records quota state and makes `agyx next` avoid exhausted profiles.
|
|
113
|
+
It does not yet perform an automatic global account switch from inside a running
|
|
114
|
+
session; use `agyx next` after a quota message so the switch still happens
|
|
115
|
+
through the normal pause/switch/resume transaction.
|
|
116
|
+
|
|
81
117
|
## Security
|
|
82
118
|
|
|
83
119
|
- Credentials remain in macOS Keychain.
|
package/dist/src/cli.js
CHANGED
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { createInterface } from "node:readline/promises";
|
|
2
3
|
import { activateProfile, loginProfile, pauseAll, resumeAll, saveCurrent, sessionRecords, switchProfile, } from "./coordinator.js";
|
|
3
4
|
import { installShellIntegration, shellInit } from "./install.js";
|
|
4
5
|
import { keychain } from "./keychain.js";
|
|
5
6
|
import { findRealAgy } from "./processes.js";
|
|
6
7
|
import { loadState, saveState, validateProfileName } from "./config.js";
|
|
8
|
+
import { effectiveProfileStatus, selectNextProfile } from "./selection.js";
|
|
7
9
|
import { supervise } from "./session.js";
|
|
8
10
|
const help = `agyx — multi-account session supervisor for Antigravity CLI
|
|
9
11
|
|
|
10
12
|
Usage:
|
|
11
13
|
agyx install Install transparent agy shell shim
|
|
12
14
|
agyx session -- [agy options] Run agy under a restartable supervisor
|
|
13
|
-
agyx save
|
|
14
|
-
agyx login
|
|
15
|
-
|
|
16
|
-
agyx
|
|
15
|
+
agyx save [name] [--email EMAIL] Save the current Keychain account
|
|
16
|
+
agyx login [name] [--email EMAIL] [--no-resume]
|
|
17
|
+
Pause all sessions and add an account
|
|
18
|
+
agyx use [name] Switch account and resume every session
|
|
19
|
+
agyx next Rotate to the next selectable account
|
|
17
20
|
agyx list List profiles
|
|
18
21
|
agyx current Print the active profile
|
|
19
22
|
agyx status List supervised terminal sessions
|
|
@@ -32,6 +35,105 @@ function takeOption(args, name) {
|
|
|
32
35
|
throw new Error(`${name} requires a value`);
|
|
33
36
|
return args.splice(index, 2)[1];
|
|
34
37
|
}
|
|
38
|
+
function takeFlag(args, name) {
|
|
39
|
+
const index = args.indexOf(name);
|
|
40
|
+
if (index < 0)
|
|
41
|
+
return false;
|
|
42
|
+
args.splice(index, 1);
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
function takeOptionalName(args, usage) {
|
|
46
|
+
if (args.length > 1)
|
|
47
|
+
throw new Error(`Usage: ${usage}`);
|
|
48
|
+
return args.shift();
|
|
49
|
+
}
|
|
50
|
+
function relativeTime(value, now = new Date()) {
|
|
51
|
+
if (!value)
|
|
52
|
+
return "-";
|
|
53
|
+
const timestamp = Date.parse(value);
|
|
54
|
+
if (Number.isNaN(timestamp))
|
|
55
|
+
return "-";
|
|
56
|
+
const delta = timestamp - now.getTime();
|
|
57
|
+
const absolute = Math.abs(delta);
|
|
58
|
+
const units = [
|
|
59
|
+
[24 * 60 * 60 * 1000, "d"],
|
|
60
|
+
[60 * 60 * 1000, "h"],
|
|
61
|
+
[60 * 1000, "m"],
|
|
62
|
+
[1000, "s"],
|
|
63
|
+
];
|
|
64
|
+
const [unitMs, suffix] = units.find(([ms]) => absolute >= ms) ?? units.at(-1);
|
|
65
|
+
const amount = Math.max(1, Math.round(absolute / unitMs));
|
|
66
|
+
return delta >= 0 ? `in ${amount}${suffix}` : `${amount}${suffix} ago`;
|
|
67
|
+
}
|
|
68
|
+
function profileStatusText(profile, now = new Date()) {
|
|
69
|
+
const status = effectiveProfileStatus(profile, now);
|
|
70
|
+
if (status === "disabled")
|
|
71
|
+
return "disabled";
|
|
72
|
+
if (status === "exhausted")
|
|
73
|
+
return "quota";
|
|
74
|
+
return profile.quotaStatus === "available" ? "ready" : "unknown";
|
|
75
|
+
}
|
|
76
|
+
function profileRow(index, profile, activeProfile, now = new Date()) {
|
|
77
|
+
const marker = profile.name === activeProfile ? "*" : " ";
|
|
78
|
+
const number = String(index + 1).padStart(2);
|
|
79
|
+
const name = profile.name.padEnd(18);
|
|
80
|
+
const email = (profile.email ?? "-").padEnd(28);
|
|
81
|
+
const status = profileStatusText(profile, now).padEnd(8);
|
|
82
|
+
const reset = relativeTime(profile.quotaResetAt, now).padEnd(8);
|
|
83
|
+
const lastUsed = relativeTime(profile.lastActivatedAt, now).padEnd(9);
|
|
84
|
+
const picks = String(profile.selectionCount ?? 0).padStart(5);
|
|
85
|
+
return `${marker} ${number} ${name} ${email} ${status} ${reset} ${lastUsed} ${picks}`;
|
|
86
|
+
}
|
|
87
|
+
function printProfiles(profiles, activeProfile) {
|
|
88
|
+
if (!profiles.length) {
|
|
89
|
+
console.log("No saved profiles.");
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const now = new Date();
|
|
93
|
+
console.log(" # name email status reset last-used picks");
|
|
94
|
+
for (const [index, profile] of profiles.entries()) {
|
|
95
|
+
console.log(profileRow(index, profile, activeProfile, now));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async function pickProfile() {
|
|
99
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
100
|
+
throw new Error("Usage: agyx use <name> or run 'agyx use' in an interactive terminal.");
|
|
101
|
+
}
|
|
102
|
+
const state = await loadState();
|
|
103
|
+
if (!state.profiles.length)
|
|
104
|
+
throw new Error("No saved profiles.");
|
|
105
|
+
printProfiles(state.profiles, state.activeProfile);
|
|
106
|
+
const suggested = (() => {
|
|
107
|
+
try {
|
|
108
|
+
return selectNextProfile(state).name;
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
})();
|
|
114
|
+
const prompt = suggested
|
|
115
|
+
? `Select profile number/name [next: ${suggested}]: `
|
|
116
|
+
: "Select profile number/name: ";
|
|
117
|
+
const interface_ = createInterface({ input: process.stdin, output: process.stdout });
|
|
118
|
+
try {
|
|
119
|
+
const answer = (await interface_.question(prompt)).trim();
|
|
120
|
+
if (!answer && suggested)
|
|
121
|
+
return suggested;
|
|
122
|
+
if (!answer)
|
|
123
|
+
throw new Error("No profile selected.");
|
|
124
|
+
const index = Number(answer);
|
|
125
|
+
if (Number.isInteger(index) && index >= 1 && index <= state.profiles.length) {
|
|
126
|
+
return state.profiles[index - 1].name;
|
|
127
|
+
}
|
|
128
|
+
const profile = state.profiles.find(({ name }) => name === answer);
|
|
129
|
+
if (!profile)
|
|
130
|
+
throw new Error(`Profile not found: ${answer}`);
|
|
131
|
+
return profile.name;
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
interface_.close();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
35
137
|
async function main() {
|
|
36
138
|
const args = process.argv.slice(2);
|
|
37
139
|
const command = args.shift();
|
|
@@ -54,56 +156,39 @@ async function main() {
|
|
|
54
156
|
args.shift();
|
|
55
157
|
return await supervise(args);
|
|
56
158
|
case "save": {
|
|
57
|
-
const name = args.shift();
|
|
58
|
-
if (!name)
|
|
59
|
-
throw new Error("Usage: agyx save <name> [--email EMAIL]");
|
|
60
159
|
const email = takeOption(args, "--email");
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
160
|
+
const name = takeOptionalName(args, "agyx save [name] [--email EMAIL]");
|
|
161
|
+
const result = await saveCurrent(name, email);
|
|
162
|
+
console.log(`Saved and activated profile '${result.name}'.`
|
|
163
|
+
+ (result.email ? ` (${result.email})` : ""));
|
|
65
164
|
return 0;
|
|
66
165
|
}
|
|
67
166
|
case "login": {
|
|
68
|
-
const name = args.shift();
|
|
69
|
-
if (!name)
|
|
70
|
-
throw new Error("Usage: agyx login <name> [--email EMAIL] [--no-resume]");
|
|
71
167
|
const email = takeOption(args, "--email");
|
|
72
|
-
const noResume = args
|
|
73
|
-
|
|
74
|
-
if (args.length)
|
|
75
|
-
throw new Error(`Unknown arguments: ${args.join(" ")}`);
|
|
168
|
+
const noResume = takeFlag(args, "--no-resume");
|
|
169
|
+
const name = takeOptionalName(args, "agyx login [name] [--email EMAIL] [--no-resume]");
|
|
76
170
|
await loginProfile(name, email, !noResume);
|
|
77
171
|
return 0;
|
|
78
172
|
}
|
|
79
173
|
case "use": {
|
|
80
174
|
const name = args.shift();
|
|
81
|
-
if (
|
|
82
|
-
throw new Error("Usage: agyx use
|
|
83
|
-
await
|
|
84
|
-
|
|
175
|
+
if (args.length)
|
|
176
|
+
throw new Error("Usage: agyx use [name]");
|
|
177
|
+
const selected = name ?? await pickProfile();
|
|
178
|
+
await switchProfile(selected);
|
|
179
|
+
console.log(`Activated profile '${selected}' and resumed all sessions.`);
|
|
85
180
|
return 0;
|
|
86
181
|
}
|
|
87
182
|
case "next": {
|
|
88
183
|
const state = await loadState();
|
|
89
|
-
|
|
90
|
-
throw new Error("No saved profiles.");
|
|
91
|
-
const index = state.activeProfile
|
|
92
|
-
? state.profiles.findIndex(({ name }) => name === state.activeProfile)
|
|
93
|
-
: -1;
|
|
94
|
-
const name = state.profiles[(index + 1) % state.profiles.length].name;
|
|
184
|
+
const name = selectNextProfile(state).name;
|
|
95
185
|
await switchProfile(name);
|
|
96
186
|
console.log(`Activated profile '${name}' and resumed all sessions.`);
|
|
97
187
|
return 0;
|
|
98
188
|
}
|
|
99
189
|
case "list": {
|
|
100
190
|
const state = await loadState();
|
|
101
|
-
|
|
102
|
-
console.log("No saved profiles.");
|
|
103
|
-
for (const profile of state.profiles) {
|
|
104
|
-
console.log(`${profile.name === state.activeProfile ? "*" : " "} ${profile.name}`
|
|
105
|
-
+ (profile.email ? ` ${profile.email}` : ""));
|
|
106
|
-
}
|
|
191
|
+
printProfiles(state.profiles, state.activeProfile);
|
|
107
192
|
return 0;
|
|
108
193
|
}
|
|
109
194
|
case "current":
|
package/dist/src/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EACL,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,WAAW,EACX,cAAc,EACd,aAAa,GACd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,uBAAuB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/src/config.d.ts
CHANGED
|
@@ -3,6 +3,16 @@ export interface ProfileRecord {
|
|
|
3
3
|
email?: string;
|
|
4
4
|
createdAt: string;
|
|
5
5
|
updatedAt: string;
|
|
6
|
+
authenticatedAt?: string;
|
|
7
|
+
lastActivatedAt?: string;
|
|
8
|
+
lastSuccessfulRequestAt?: string;
|
|
9
|
+
lastQuotaErrorAt?: string;
|
|
10
|
+
quotaResetAt?: string;
|
|
11
|
+
quotaStatus?: "unknown" | "available" | "exhausted";
|
|
12
|
+
lastQuotaReason?: string;
|
|
13
|
+
selectionCount?: number;
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
priority?: number;
|
|
6
16
|
}
|
|
7
17
|
export interface State {
|
|
8
18
|
version: 1;
|
|
@@ -14,10 +24,23 @@ export declare const configDir: string;
|
|
|
14
24
|
export declare const runtimeDir: string;
|
|
15
25
|
export declare const logDir: string;
|
|
16
26
|
export declare const statePath: string;
|
|
27
|
+
export declare const googleAccountsPath: string;
|
|
17
28
|
export declare function ensureDirectories(): Promise<void>;
|
|
18
29
|
export declare function loadState(): Promise<State>;
|
|
19
30
|
export declare function saveState(state: State): Promise<void>;
|
|
20
31
|
export declare function upsertProfile(name: string, email: string | undefined, makeActive: boolean): Promise<void>;
|
|
32
|
+
export declare function markProfileActivated(state: State, name: string, now?: Date): void;
|
|
33
|
+
export declare function markProfileQuotaExhausted(state: State, name: string, event: {
|
|
34
|
+
reason: string;
|
|
35
|
+
resetAt?: string;
|
|
36
|
+
}, now?: Date): void;
|
|
37
|
+
export declare function recordProfileQuotaExhausted(name: string, event: {
|
|
38
|
+
reason: string;
|
|
39
|
+
resetAt?: string;
|
|
40
|
+
}): Promise<void>;
|
|
21
41
|
export declare function cleanupRuntimeFile(path: string): Promise<void>;
|
|
22
42
|
export declare function validateProfileName(name: string): string;
|
|
43
|
+
export declare function profileNameFromEmail(email: string): string;
|
|
44
|
+
export declare function uniqueProfileName(baseName: string, state: State): string;
|
|
45
|
+
export declare function readActiveGoogleAccountEmail(): Promise<string | undefined>;
|
|
23
46
|
export declare function ensureParent(path: string): Promise<void>;
|
package/dist/src/config.js
CHANGED
|
@@ -6,6 +6,7 @@ export const configDir = process.env.AGYX_CONFIG_DIR
|
|
|
6
6
|
export const runtimeDir = join(configDir, "run");
|
|
7
7
|
export const logDir = join(configDir, "logs");
|
|
8
8
|
export const statePath = join(configDir, "state.json");
|
|
9
|
+
export const googleAccountsPath = join(homedir(), ".gemini", "google_accounts.json");
|
|
9
10
|
export async function ensureDirectories() {
|
|
10
11
|
for (const directory of [configDir, runtimeDir, logDir]) {
|
|
11
12
|
await mkdir(directory, { recursive: true, mode: 0o700 });
|
|
@@ -32,18 +33,66 @@ export async function saveState(state) {
|
|
|
32
33
|
}
|
|
33
34
|
export async function upsertProfile(name, email, makeActive) {
|
|
34
35
|
const state = await loadState();
|
|
35
|
-
const now = new Date()
|
|
36
|
+
const now = new Date();
|
|
37
|
+
const nowString = now.toISOString();
|
|
36
38
|
const existing = state.profiles.find((profile) => profile.name === name);
|
|
37
39
|
if (existing) {
|
|
38
40
|
existing.email = email ?? existing.email;
|
|
39
|
-
existing.
|
|
41
|
+
existing.authenticatedAt = nowString;
|
|
42
|
+
existing.updatedAt = nowString;
|
|
43
|
+
if (existing.quotaStatus === "exhausted") {
|
|
44
|
+
existing.quotaStatus = "available";
|
|
45
|
+
existing.quotaResetAt = undefined;
|
|
46
|
+
existing.lastQuotaReason = undefined;
|
|
47
|
+
}
|
|
40
48
|
}
|
|
41
49
|
else {
|
|
42
|
-
state.profiles.push({
|
|
50
|
+
state.profiles.push({
|
|
51
|
+
name,
|
|
52
|
+
email,
|
|
53
|
+
createdAt: nowString,
|
|
54
|
+
updatedAt: nowString,
|
|
55
|
+
authenticatedAt: nowString,
|
|
56
|
+
quotaStatus: "available",
|
|
57
|
+
selectionCount: 0,
|
|
58
|
+
});
|
|
43
59
|
}
|
|
44
60
|
state.profiles.sort((left, right) => left.name.localeCompare(right.name));
|
|
45
61
|
if (makeActive)
|
|
46
|
-
state
|
|
62
|
+
markProfileActivated(state, name, now);
|
|
63
|
+
await saveState(state);
|
|
64
|
+
}
|
|
65
|
+
export function markProfileActivated(state, name, now = new Date()) {
|
|
66
|
+
const profile = state.profiles.find((entry) => entry.name === name);
|
|
67
|
+
if (!profile)
|
|
68
|
+
throw new Error(`Profile not found: ${name}`);
|
|
69
|
+
const nowString = now.toISOString();
|
|
70
|
+
state.activeProfile = name;
|
|
71
|
+
profile.lastActivatedAt = nowString;
|
|
72
|
+
profile.updatedAt = nowString;
|
|
73
|
+
profile.selectionCount = (profile.selectionCount ?? 0) + 1;
|
|
74
|
+
if (profile.quotaStatus === "exhausted"
|
|
75
|
+
&& profile.quotaResetAt
|
|
76
|
+
&& Date.parse(profile.quotaResetAt) <= now.getTime()) {
|
|
77
|
+
profile.quotaStatus = "available";
|
|
78
|
+
profile.quotaResetAt = undefined;
|
|
79
|
+
profile.lastQuotaReason = undefined;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export function markProfileQuotaExhausted(state, name, event, now = new Date()) {
|
|
83
|
+
const profile = state.profiles.find((entry) => entry.name === name);
|
|
84
|
+
if (!profile)
|
|
85
|
+
return;
|
|
86
|
+
const nowString = now.toISOString();
|
|
87
|
+
profile.quotaStatus = "exhausted";
|
|
88
|
+
profile.lastQuotaErrorAt = nowString;
|
|
89
|
+
profile.lastQuotaReason = event.reason;
|
|
90
|
+
profile.quotaResetAt = event.resetAt;
|
|
91
|
+
profile.updatedAt = nowString;
|
|
92
|
+
}
|
|
93
|
+
export async function recordProfileQuotaExhausted(name, event) {
|
|
94
|
+
const state = await loadState();
|
|
95
|
+
markProfileQuotaExhausted(state, name, event);
|
|
47
96
|
await saveState(state);
|
|
48
97
|
}
|
|
49
98
|
export async function cleanupRuntimeFile(path) {
|
|
@@ -55,6 +104,40 @@ export function validateProfileName(name) {
|
|
|
55
104
|
}
|
|
56
105
|
return name;
|
|
57
106
|
}
|
|
107
|
+
export function profileNameFromEmail(email) {
|
|
108
|
+
const localPart = email.split("@")[0] ?? "";
|
|
109
|
+
const normalized = localPart
|
|
110
|
+
.toLowerCase()
|
|
111
|
+
.replace(/[^a-z0-9._-]+/g, "-")
|
|
112
|
+
.replace(/^[._-]+|[._-]+$/g, "")
|
|
113
|
+
.replace(/[._-]{2,}/g, "-");
|
|
114
|
+
return validateProfileName(normalized || "account");
|
|
115
|
+
}
|
|
116
|
+
export function uniqueProfileName(baseName, state) {
|
|
117
|
+
const base = validateProfileName(baseName);
|
|
118
|
+
const names = new Set(state.profiles.map((profile) => profile.name));
|
|
119
|
+
if (!names.has(base))
|
|
120
|
+
return base;
|
|
121
|
+
for (let suffix = 2; suffix < 10000; suffix += 1) {
|
|
122
|
+
const candidate = `${base}-${suffix}`;
|
|
123
|
+
if (!names.has(candidate))
|
|
124
|
+
return candidate;
|
|
125
|
+
}
|
|
126
|
+
throw new Error(`Could not find an unused profile name for '${base}'.`);
|
|
127
|
+
}
|
|
128
|
+
export async function readActiveGoogleAccountEmail() {
|
|
129
|
+
try {
|
|
130
|
+
const accounts = JSON.parse(await readFile(googleAccountsPath, "utf8"));
|
|
131
|
+
return typeof accounts.active === "string" && accounts.active.includes("@")
|
|
132
|
+
? accounts.active
|
|
133
|
+
: undefined;
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
if (error.code === "ENOENT")
|
|
137
|
+
return undefined;
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
58
141
|
export async function ensureParent(path) {
|
|
59
142
|
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
60
143
|
}
|
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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"}
|
|
@@ -2,8 +2,12 @@ import { SessionRecord } from "./session.js";
|
|
|
2
2
|
export declare function sessionRecords(): Promise<SessionRecord[]>;
|
|
3
3
|
export declare function pauseAll(): Promise<SessionRecord[]>;
|
|
4
4
|
export declare function resumeAll(records: SessionRecord[]): Promise<void>;
|
|
5
|
-
export
|
|
5
|
+
export interface ProfileCaptureResult {
|
|
6
|
+
name: string;
|
|
7
|
+
email?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function saveCurrent(nameInput?: string, explicitEmail?: string): Promise<ProfileCaptureResult>;
|
|
6
10
|
export declare function activateProfile(nameInput: string): Promise<void>;
|
|
7
11
|
export declare function switchProfile(name: string): Promise<void>;
|
|
8
12
|
export declare function detectEmail(content: string): string | undefined;
|
|
9
|
-
export declare function loginProfile(nameInput
|
|
13
|
+
export declare function loginProfile(nameInput?: string, explicitEmail?: string, resume?: boolean): Promise<ProfileCaptureResult>;
|
package/dist/src/coordinator.js
CHANGED
|
@@ -2,7 +2,7 @@ import { spawn } from "node:child_process";
|
|
|
2
2
|
import { readdir, readFile, rm } from "node:fs/promises";
|
|
3
3
|
import { connect } from "node:net";
|
|
4
4
|
import { join } from "node:path";
|
|
5
|
-
import { ensureDirectories, loadState, logDir, runtimeDir, saveState, upsertProfile, validateProfileName, } from "./config.js";
|
|
5
|
+
import { ensureDirectories, loadState, logDir, markProfileActivated, profileNameFromEmail, readActiveGoogleAccountEmail, runtimeDir, saveState, upsertProfile, uniqueProfileName, validateProfileName, } from "./config.js";
|
|
6
6
|
import { keychain } from "./keychain.js";
|
|
7
7
|
import { findRealAgy, runningAgy, stopProcesses, } from "./processes.js";
|
|
8
8
|
async function send(socketPath, command) {
|
|
@@ -67,11 +67,28 @@ export async function resumeAll(records) {
|
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
|
-
|
|
71
|
-
|
|
70
|
+
function resolveProfileName(state, nameInput, email, context) {
|
|
71
|
+
if (nameInput)
|
|
72
|
+
return validateProfileName(nameInput);
|
|
73
|
+
if (!email) {
|
|
74
|
+
throw new Error(context === "save"
|
|
75
|
+
? "Usage: agyx save [name] [--email EMAIL]. Profile name could not be inferred because no active Google account email was found."
|
|
76
|
+
: "Usage: agyx login [name] [--email EMAIL] [--no-resume]. Profile name could not be inferred because login email was not detected.");
|
|
77
|
+
}
|
|
78
|
+
const existingByEmail = state.profiles.find((profile) => profile.email === email);
|
|
79
|
+
if (existingByEmail)
|
|
80
|
+
return existingByEmail.name;
|
|
81
|
+
return uniqueProfileName(profileNameFromEmail(email), state);
|
|
82
|
+
}
|
|
83
|
+
export async function saveCurrent(nameInput, explicitEmail) {
|
|
84
|
+
const state = await loadState();
|
|
85
|
+
const activeProfileEmail = state.profiles.find((profile) => profile.name === state.activeProfile)?.email;
|
|
86
|
+
const email = explicitEmail ?? await readActiveGoogleAccountEmail() ?? activeProfileEmail;
|
|
87
|
+
const name = resolveProfileName(state, nameInput, email, "save");
|
|
72
88
|
const credential = await keychain.readActive();
|
|
73
89
|
await keychain.writeProfile(name, credential);
|
|
74
90
|
await upsertProfile(name, email, true);
|
|
91
|
+
return { name, email };
|
|
75
92
|
}
|
|
76
93
|
export async function activateProfile(nameInput) {
|
|
77
94
|
const name = validateProfileName(nameInput);
|
|
@@ -81,7 +98,7 @@ export async function activateProfile(nameInput) {
|
|
|
81
98
|
}
|
|
82
99
|
const credential = await keychain.readProfile(name);
|
|
83
100
|
await keychain.writeActive(credential);
|
|
84
|
-
state
|
|
101
|
+
markProfileActivated(state, name);
|
|
85
102
|
await saveState(state);
|
|
86
103
|
}
|
|
87
104
|
export async function switchProfile(name) {
|
|
@@ -136,7 +153,6 @@ async function interactiveLogin(logPath) {
|
|
|
136
153
|
});
|
|
137
154
|
}
|
|
138
155
|
export async function loginProfile(nameInput, explicitEmail, resume = true) {
|
|
139
|
-
const name = validateProfileName(nameInput);
|
|
140
156
|
const sessions = await pauseAll();
|
|
141
157
|
const state = await loadState();
|
|
142
158
|
const previousCredential = await keychain.readActive().catch(() => undefined);
|
|
@@ -151,9 +167,12 @@ export async function loginProfile(nameInput, explicitEmail, resume = true) {
|
|
|
151
167
|
const credential = await keychain.readActive().catch(() => undefined);
|
|
152
168
|
if (!credential)
|
|
153
169
|
throw new Error("Login ended without creating an agy credential.");
|
|
170
|
+
const email = explicitEmail ?? detectedEmail ?? await readActiveGoogleAccountEmail();
|
|
171
|
+
const name = resolveProfileName(await loadState(), nameInput, email, "login");
|
|
154
172
|
await keychain.writeProfile(name, credential);
|
|
155
|
-
await upsertProfile(name,
|
|
173
|
+
await upsertProfile(name, email, true);
|
|
156
174
|
console.log(`Captured and activated profile '${name}'.`);
|
|
175
|
+
return { name, email };
|
|
157
176
|
}
|
|
158
177
|
catch (error) {
|
|
159
178
|
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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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
function parseDurationMs(value) {
|
|
2
|
+
const pattern = /(\d+(?:\.\d+)?)\s*(d|day|days|h|hr|hrs|hour|hours|m|min|mins|minute|minutes|s|sec|secs|second|seconds)/gi;
|
|
3
|
+
let total = 0;
|
|
4
|
+
let matched = false;
|
|
5
|
+
for (const match of value.matchAll(pattern)) {
|
|
6
|
+
matched = true;
|
|
7
|
+
const amount = Number(match[1]);
|
|
8
|
+
const unit = match[2].toLowerCase();
|
|
9
|
+
if (unit.startsWith("d"))
|
|
10
|
+
total += amount * 24 * 60 * 60 * 1000;
|
|
11
|
+
else if (unit.startsWith("h"))
|
|
12
|
+
total += amount * 60 * 60 * 1000;
|
|
13
|
+
else if (unit.startsWith("m"))
|
|
14
|
+
total += amount * 60 * 1000;
|
|
15
|
+
else
|
|
16
|
+
total += amount * 1000;
|
|
17
|
+
}
|
|
18
|
+
return matched ? Math.round(total) : undefined;
|
|
19
|
+
}
|
|
20
|
+
function parseResetAt(line, now) {
|
|
21
|
+
const resetIn = line.match(/resets?\s+in\s+([0-9a-zA-Z.\s]+)/i)?.[1];
|
|
22
|
+
const resetMs = resetIn ? parseDurationMs(resetIn) : undefined;
|
|
23
|
+
if (resetMs !== undefined)
|
|
24
|
+
return new Date(now.getTime() + resetMs).toISOString();
|
|
25
|
+
const retryAfter = line.match(/retry-after["'\s:=]+(\d+)/i)?.[1];
|
|
26
|
+
if (retryAfter) {
|
|
27
|
+
return new Date(now.getTime() + Number(retryAfter) * 1000).toISOString();
|
|
28
|
+
}
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
export function parseQuotaEventLine(line, now = new Date()) {
|
|
32
|
+
const lower = line.toLowerCase();
|
|
33
|
+
const looksLikeQuota = lower.includes("resource_exhausted")
|
|
34
|
+
|| lower.includes("individual quota reached")
|
|
35
|
+
|| /\bcode\s*[:=]?\s*429\b/i.test(line)
|
|
36
|
+
|| /\b429\b/.test(line) && /(quota|rate|limit|exhausted)/i.test(line)
|
|
37
|
+
|| /(quota|rate limit).*(exceeded|exhausted|reached)/i.test(line);
|
|
38
|
+
if (!looksLikeQuota)
|
|
39
|
+
return undefined;
|
|
40
|
+
let reason = "quota exhausted";
|
|
41
|
+
if (lower.includes("individual quota reached"))
|
|
42
|
+
reason = "individual quota reached";
|
|
43
|
+
else if (lower.includes("resource_exhausted"))
|
|
44
|
+
reason = "RESOURCE_EXHAUSTED";
|
|
45
|
+
else if (/\b429\b/.test(line))
|
|
46
|
+
reason = "HTTP 429";
|
|
47
|
+
return {
|
|
48
|
+
reason,
|
|
49
|
+
resetAt: parseResetAt(line, now),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=quota.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota.js","sourceRoot":"","sources":["../../src/quota.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ProfileRecord, State } from "./config.js";
|
|
2
|
+
export type ProfileRuntimeStatus = "ready" | "exhausted" | "disabled";
|
|
3
|
+
export declare function effectiveProfileStatus(profile: ProfileRecord, now?: Date): ProfileRuntimeStatus;
|
|
4
|
+
export declare function isProfileSelectable(profile: ProfileRecord, now?: Date): boolean;
|
|
5
|
+
export declare function selectNextProfile(state: State, now?: Date): ProfileRecord;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export function effectiveProfileStatus(profile, now = new Date()) {
|
|
2
|
+
if (profile.disabled)
|
|
3
|
+
return "disabled";
|
|
4
|
+
if (profile.quotaStatus !== "exhausted")
|
|
5
|
+
return "ready";
|
|
6
|
+
if (!profile.quotaResetAt)
|
|
7
|
+
return "exhausted";
|
|
8
|
+
return Date.parse(profile.quotaResetAt) > now.getTime()
|
|
9
|
+
? "exhausted"
|
|
10
|
+
: "ready";
|
|
11
|
+
}
|
|
12
|
+
export function isProfileSelectable(profile, now = new Date()) {
|
|
13
|
+
return effectiveProfileStatus(profile, now) === "ready";
|
|
14
|
+
}
|
|
15
|
+
export function selectNextProfile(state, now = new Date()) {
|
|
16
|
+
if (!state.profiles.length)
|
|
17
|
+
throw new Error("No saved profiles.");
|
|
18
|
+
const activeIndex = state.activeProfile
|
|
19
|
+
? state.profiles.findIndex(({ name }) => name === state.activeProfile)
|
|
20
|
+
: -1;
|
|
21
|
+
for (let offset = 1; offset <= state.profiles.length; offset += 1) {
|
|
22
|
+
const profile = state.profiles[(activeIndex + offset + state.profiles.length)
|
|
23
|
+
% state.profiles.length];
|
|
24
|
+
if (isProfileSelectable(profile, now))
|
|
25
|
+
return profile;
|
|
26
|
+
}
|
|
27
|
+
const earliestReset = state.profiles
|
|
28
|
+
.filter((profile) => profile.quotaResetAt)
|
|
29
|
+
.sort((left, right) => Date.parse(left.quotaResetAt) - Date.parse(right.quotaResetAt))[0];
|
|
30
|
+
const resetText = earliestReset
|
|
31
|
+
? ` Earliest reset: ${earliestReset.name} at ${earliestReset.quotaResetAt}.`
|
|
32
|
+
: "";
|
|
33
|
+
throw new Error(`No selectable profiles.${resetText}`);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=selection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection.js","sourceRoot":"","sources":["../../src/selection.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,sBAAsB,CACpC,OAAsB,EACtB,GAAG,GAAG,IAAI,IAAI,EAAE;IAEhB,IAAI,OAAO,CAAC,QAAQ;QAAE,OAAO,UAAU,CAAC;IACxC,IAAI,OAAO,CAAC,WAAW,KAAK,WAAW;QAAE,OAAO,OAAO,CAAC;IACxD,IAAI,CAAC,OAAO,CAAC,YAAY;QAAE,OAAO,WAAW,CAAC;IAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE;QACrD,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,OAAO,CAAC;AACd,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,OAAsB,EACtB,GAAG,GAAG,IAAI,IAAI,EAAE;IAEhB,OAAO,sBAAsB,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,OAAO,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,KAAY,EACZ,GAAG,GAAG,IAAI,IAAI,EAAE;IAEhB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAClE,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa;QACrC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,aAAa,CAAC;QACtE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEP,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC;QAClE,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,WAAW,GAAG,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;cACzE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAE,CAAC;QAC5B,IAAI,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC;IACxD,CAAC;IAED,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ;SACjC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC;SACzC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAa,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,YAAa,CAAC,CACjE,CAAC,CAAC,CAAC,CAAC;IACP,MAAM,SAAS,GAAG,aAAa;QAC7B,CAAC,CAAC,oBAAoB,aAAa,CAAC,IAAI,OAAO,aAAa,CAAC,YAAY,GAAG;QAC5E,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,IAAI,KAAK,CAAC,0BAA0B,SAAS,EAAE,CAAC,CAAC;AACzD,CAAC"}
|
package/dist/src/session.js
CHANGED
|
@@ -2,8 +2,9 @@ import { spawn } from "node:child_process";
|
|
|
2
2
|
import { createServer } from "node:net";
|
|
3
3
|
import { readFile, writeFile } from "node:fs/promises";
|
|
4
4
|
import { join } from "node:path";
|
|
5
|
-
import { cleanupRuntimeFile, ensureDirectories, logDir, runtimeDir, } from "./config.js";
|
|
5
|
+
import { cleanupRuntimeFile, ensureDirectories, loadState, logDir, recordProfileQuotaExhausted, runtimeDir, } from "./config.js";
|
|
6
6
|
import { findRealAgy, isRestartable, withConversation, } from "./processes.js";
|
|
7
|
+
import { parseQuotaEventLine } from "./quota.js";
|
|
7
8
|
export function detectConversation(content) {
|
|
8
9
|
const patterns = [
|
|
9
10
|
/Created conversation ([0-9a-f-]{36})/gi,
|
|
@@ -42,6 +43,10 @@ export async function supervise(args) {
|
|
|
42
43
|
let intentionalStop = false;
|
|
43
44
|
let conversationId;
|
|
44
45
|
let finalCode = 0;
|
|
46
|
+
let logOffset = 0;
|
|
47
|
+
let scanningQuota = false;
|
|
48
|
+
let profileAtStart;
|
|
49
|
+
let quotaInterval;
|
|
45
50
|
const persist = async () => {
|
|
46
51
|
const record = {
|
|
47
52
|
id,
|
|
@@ -67,9 +72,40 @@ export async function supervise(args) {
|
|
|
67
72
|
// The log may not exist until agy has initialized.
|
|
68
73
|
}
|
|
69
74
|
};
|
|
75
|
+
const scanQuotaEvents = async () => {
|
|
76
|
+
if (scanningQuota)
|
|
77
|
+
return;
|
|
78
|
+
scanningQuota = true;
|
|
79
|
+
try {
|
|
80
|
+
const profileName = profileAtStart;
|
|
81
|
+
if (!profileName)
|
|
82
|
+
return;
|
|
83
|
+
const content = await readFile(logPath, "utf8");
|
|
84
|
+
if (content.length < logOffset)
|
|
85
|
+
logOffset = 0;
|
|
86
|
+
const appended = content.slice(logOffset);
|
|
87
|
+
logOffset = content.length;
|
|
88
|
+
for (const line of appended.split(/\r?\n/)) {
|
|
89
|
+
const event = parseQuotaEventLine(line);
|
|
90
|
+
if (!event)
|
|
91
|
+
continue;
|
|
92
|
+
await recordProfileQuotaExhausted(profileName, event);
|
|
93
|
+
console.error(`agyx: marked profile '${profileName}' as quota exhausted`
|
|
94
|
+
+ (event.resetAt ? ` until ${event.resetAt}` : "")
|
|
95
|
+
+ ". Run 'agyx next' to switch.");
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// The log or state file may not exist yet.
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
scanningQuota = false;
|
|
103
|
+
}
|
|
104
|
+
};
|
|
70
105
|
const startChild = async () => {
|
|
71
106
|
intentionalStop = false;
|
|
72
107
|
paused = false;
|
|
108
|
+
profileAtStart = (await loadState()).activeProfile;
|
|
73
109
|
const launchArgs = withConversation(args, conversationId);
|
|
74
110
|
if (!launchArgs.some((argument) => argument === "--log-file" || argument.startsWith("--log-file="))) {
|
|
75
111
|
launchArgs.push("--log-file", logPath);
|
|
@@ -87,6 +123,7 @@ export async function supervise(args) {
|
|
|
87
123
|
child.on("exit", async (code, signal) => {
|
|
88
124
|
finalCode = code ?? (signal ? 128 : 1);
|
|
89
125
|
await refreshConversation();
|
|
126
|
+
await scanQuotaEvents();
|
|
90
127
|
child = undefined;
|
|
91
128
|
await persist();
|
|
92
129
|
if (!intentionalStop && !paused) {
|
|
@@ -152,6 +189,8 @@ export async function supervise(args) {
|
|
|
152
189
|
});
|
|
153
190
|
});
|
|
154
191
|
const shutdown = async () => {
|
|
192
|
+
if (quotaInterval)
|
|
193
|
+
clearInterval(quotaInterval);
|
|
155
194
|
await cleanupRuntimeFile(socketPath);
|
|
156
195
|
await cleanupRuntimeFile(recordPath);
|
|
157
196
|
server.close();
|
|
@@ -172,6 +211,10 @@ export async function supervise(args) {
|
|
|
172
211
|
process.exit(143);
|
|
173
212
|
});
|
|
174
213
|
await startChild();
|
|
214
|
+
quotaInterval = setInterval(() => {
|
|
215
|
+
void scanQuotaEvents();
|
|
216
|
+
}, 750);
|
|
217
|
+
quotaInterval.unref();
|
|
175
218
|
return await new Promise(() => undefined);
|
|
176
219
|
}
|
|
177
220
|
//# sourceMappingURL=session.js.map
|
package/dist/src/session.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAU,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,MAAM,EACN,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,WAAW,EACX,aAAa,EACb,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/session.ts"],"names":[],"mappings":"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"}
|
package/dist/src/shim.js
CHANGED
|
File without changes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agyx",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Multi-account session supervisor for Google Antigravity CLI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"LICENSE"
|
|
14
14
|
],
|
|
15
15
|
"scripts": {
|
|
16
|
-
"build": "tsc -p tsconfig.json",
|
|
16
|
+
"build": "tsc -p tsconfig.json && chmod +x dist/src/cli.js dist/src/shim.js",
|
|
17
17
|
"clean": "rm -rf dist",
|
|
18
18
|
"prepack": "npm run clean && npm run build",
|
|
19
19
|
"test": "npm run clean && npm run build && node --test dist/test/*.test.js"
|