@expiren/opencode-antigravity-auth 1.6.17 → 1.6.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +600 -81
- package/dist/index.js.map +4 -4
- package/dist/src/constants.d.ts +13 -0
- package/dist/src/constants.d.ts.map +1 -1
- package/dist/src/constants.js +19 -1
- package/dist/src/constants.js.map +1 -1
- package/dist/src/plugin/auth-doctor.d.ts +30 -0
- package/dist/src/plugin/auth-doctor.d.ts.map +1 -0
- package/dist/src/plugin/auth-doctor.js +144 -0
- package/dist/src/plugin/auth-doctor.js.map +1 -0
- package/dist/src/plugin/auth-drift.d.ts +13 -0
- package/dist/src/plugin/auth-drift.d.ts.map +1 -0
- package/dist/src/plugin/auth-drift.js +70 -0
- package/dist/src/plugin/auth-drift.js.map +1 -0
- package/dist/src/plugin/cli.d.ts +12 -2
- package/dist/src/plugin/cli.d.ts.map +1 -1
- package/dist/src/plugin/cli.js +36 -3
- package/dist/src/plugin/cli.js.map +1 -1
- package/dist/src/plugin/config/models.d.ts +2 -32
- package/dist/src/plugin/config/models.d.ts.map +1 -1
- package/dist/src/plugin/config/models.js +1 -113
- package/dist/src/plugin/config/models.js.map +1 -1
- package/dist/src/plugin/config/schema.js +2 -2
- package/dist/src/plugin/config/schema.js.map +1 -1
- package/dist/src/plugin/model-registry.d.ts +46 -0
- package/dist/src/plugin/model-registry.d.ts.map +1 -0
- package/dist/src/plugin/model-registry.js +180 -0
- package/dist/src/plugin/model-registry.js.map +1 -0
- package/dist/src/plugin/quota.d.ts +1 -0
- package/dist/src/plugin/quota.d.ts.map +1 -1
- package/dist/src/plugin/quota.js +8 -5
- package/dist/src/plugin/quota.js.map +1 -1
- package/dist/src/plugin/request.d.ts.map +1 -1
- package/dist/src/plugin/request.js +9 -9
- package/dist/src/plugin/request.js.map +1 -1
- package/dist/src/plugin/transform/claude.d.ts +1 -0
- package/dist/src/plugin/transform/claude.d.ts.map +1 -1
- package/dist/src/plugin/transform/claude.js +13 -0
- package/dist/src/plugin/transform/claude.js.map +1 -1
- package/dist/src/plugin/transform/model-resolver.d.ts.map +1 -1
- package/dist/src/plugin/transform/model-resolver.js +4 -26
- package/dist/src/plugin/transform/model-resolver.js.map +1 -1
- package/dist/src/plugin/ui/auth-menu.d.ts +25 -1
- package/dist/src/plugin/ui/auth-menu.d.ts.map +1 -1
- package/dist/src/plugin/ui/auth-menu.js +72 -16
- package/dist/src/plugin/ui/auth-menu.js.map +1 -1
- package/dist/src/plugin/ui/model-status.d.ts +28 -0
- package/dist/src/plugin/ui/model-status.d.ts.map +1 -0
- package/dist/src/plugin/ui/model-status.js +80 -0
- package/dist/src/plugin/ui/model-status.js.map +1 -0
- package/dist/src/plugin/ui/quota-status.d.ts +67 -0
- package/dist/src/plugin/ui/quota-status.d.ts.map +1 -0
- package/dist/src/plugin/ui/quota-status.js +194 -0
- package/dist/src/plugin/ui/quota-status.js.map +1 -0
- package/dist/src/plugin/version.d.ts +8 -1
- package/dist/src/plugin/version.d.ts.map +1 -1
- package/dist/src/plugin/version.js +8 -1
- package/dist/src/plugin/version.js.map +1 -1
- package/dist/src/plugin.d.ts.map +1 -1
- package/dist/src/plugin.js +66 -5
- package/dist/src/plugin.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ANSI } from './ansi';
|
|
2
2
|
import { select } from './select';
|
|
3
3
|
import { confirm } from './confirm';
|
|
4
|
+
import { classifyGroupStatus, buildCooldownStatus, formatQuotaStatusBadge, } from './quota-status';
|
|
4
5
|
function formatRelativeTime(timestamp) {
|
|
5
6
|
if (!timestamp)
|
|
6
7
|
return 'never';
|
|
@@ -20,12 +21,18 @@ function formatDate(timestamp) {
|
|
|
20
21
|
return 'unknown';
|
|
21
22
|
return new Date(timestamp).toLocaleDateString();
|
|
22
23
|
}
|
|
23
|
-
function getStatusBadge(status) {
|
|
24
|
+
function getStatusBadge(status, account) {
|
|
25
|
+
// Cooldown takes priority — account is temporarily unavailable
|
|
26
|
+
if (account?.cooldownMs !== undefined && account.cooldownMs > 0) {
|
|
27
|
+
const cooldownStatus = buildCooldownStatus(account.cooldownMs, account.cooldownReason);
|
|
28
|
+
return ` ${formatQuotaStatusBadge(cooldownStatus)}`;
|
|
29
|
+
}
|
|
30
|
+
// Then check account-level status
|
|
24
31
|
switch (status) {
|
|
25
|
-
case 'active': return
|
|
26
|
-
case 'rate-limited': return
|
|
27
|
-
case 'expired': return
|
|
28
|
-
case 'verification-required': return
|
|
32
|
+
case 'active': return ` ${ANSI.green}[active]${ANSI.reset}`;
|
|
33
|
+
case 'rate-limited': return ` ${ANSI.yellow}[rate-limited]${ANSI.reset}`;
|
|
34
|
+
case 'expired': return ` ${ANSI.red}[expired]${ANSI.reset}`;
|
|
35
|
+
case 'verification-required': return ` ${ANSI.red}[needs verification]${ANSI.reset}`;
|
|
29
36
|
default: return '';
|
|
30
37
|
}
|
|
31
38
|
}
|
|
@@ -33,22 +40,25 @@ export async function showAuthMenu(accounts) {
|
|
|
33
40
|
const items = [
|
|
34
41
|
{ label: 'Actions', value: { type: 'cancel' }, kind: 'heading' },
|
|
35
42
|
{ label: 'Add account', value: { type: 'add' }, color: 'cyan' },
|
|
43
|
+
{ label: 'Auth current', value: { type: 'current' }, color: 'cyan' },
|
|
36
44
|
{ label: 'Check quotas', value: { type: 'check' }, color: 'cyan' },
|
|
45
|
+
{ label: 'Repair auth', value: { type: 'repair' }, color: 'yellow' },
|
|
46
|
+
{ label: 'Auth doctor', value: { type: 'doctor' }, color: 'cyan' },
|
|
37
47
|
{ label: 'Verify one account', value: { type: 'verify' }, color: 'cyan' },
|
|
38
48
|
{ label: 'Verify all accounts', value: { type: 'verify-all' }, color: 'cyan' },
|
|
39
49
|
{ label: 'Configure models in opencode.json', value: { type: 'configure-models' }, color: 'cyan' },
|
|
40
50
|
{ label: '', value: { type: 'cancel' }, separator: true },
|
|
41
51
|
{ label: 'Accounts', value: { type: 'cancel' }, kind: 'heading' },
|
|
42
52
|
...accounts.map(account => {
|
|
43
|
-
const statusBadge = getStatusBadge(account.status);
|
|
53
|
+
const statusBadge = getStatusBadge(account.status, account);
|
|
44
54
|
const currentBadge = account.isCurrentAccount ? ` ${ANSI.cyan}[current]${ANSI.reset}` : '';
|
|
45
55
|
const disabledBadge = account.enabled === false ? ` ${ANSI.red}[disabled]${ANSI.reset}` : '';
|
|
46
56
|
const baseLabel = account.email || `Account ${account.index + 1}`;
|
|
47
57
|
const numbered = `${account.index + 1}. ${baseLabel}`;
|
|
48
|
-
const fullLabel = `${numbered}${currentBadge}${statusBadge
|
|
58
|
+
const fullLabel = `${numbered}${currentBadge}${statusBadge}${disabledBadge}`;
|
|
49
59
|
return {
|
|
50
60
|
label: fullLabel,
|
|
51
|
-
hint: account.lastUsed ? `used ${formatRelativeTime(account.lastUsed)}` : '',
|
|
61
|
+
hint: account.quotaSummary ?? (account.lastUsed ? `used ${formatRelativeTime(account.lastUsed)}` : ''),
|
|
52
62
|
value: { type: 'select-account', account },
|
|
53
63
|
};
|
|
54
64
|
}),
|
|
@@ -72,23 +82,69 @@ export async function showAuthMenu(accounts) {
|
|
|
72
82
|
return result;
|
|
73
83
|
}
|
|
74
84
|
}
|
|
85
|
+
function formatFingerprintReason(reason) {
|
|
86
|
+
switch (reason) {
|
|
87
|
+
case 'initial': return 'initial';
|
|
88
|
+
case 'regenerated': return 'regenerated';
|
|
89
|
+
case 'restored': return 'restored';
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export async function showFingerprintHistory(history, accountLabel) {
|
|
93
|
+
const items = [
|
|
94
|
+
{ label: 'Back', value: null },
|
|
95
|
+
{ label: '', value: null, separator: true },
|
|
96
|
+
{ label: 'Fingerprint history', value: null, kind: 'heading' },
|
|
97
|
+
...history.map((entry, index) => {
|
|
98
|
+
const deviceShort = entry.deviceId.slice(0, 8);
|
|
99
|
+
const reasonBadge = `${ANSI.dim}[${formatFingerprintReason(entry.reason)}]${ANSI.reset}`;
|
|
100
|
+
const label = `${index + 1}. ${deviceShort}... ${reasonBadge}`;
|
|
101
|
+
const hint = formatRelativeTime(entry.timestamp);
|
|
102
|
+
return {
|
|
103
|
+
label,
|
|
104
|
+
hint,
|
|
105
|
+
value: index,
|
|
106
|
+
color: 'cyan',
|
|
107
|
+
};
|
|
108
|
+
}),
|
|
109
|
+
];
|
|
110
|
+
const result = await select(items, {
|
|
111
|
+
message: `Restore fingerprint — ${accountLabel}`,
|
|
112
|
+
subtitle: 'Select a previous fingerprint to restore',
|
|
113
|
+
clearScreen: true,
|
|
114
|
+
});
|
|
115
|
+
return result ?? null;
|
|
116
|
+
}
|
|
75
117
|
export async function showAccountDetails(account) {
|
|
76
118
|
const label = account.email || `Account ${account.index + 1}`;
|
|
77
|
-
const badge = getStatusBadge(account.status);
|
|
119
|
+
const badge = getStatusBadge(account.status, account);
|
|
78
120
|
const disabledBadge = account.enabled === false ? ` ${ANSI.red}[disabled]${ANSI.reset}` : '';
|
|
79
|
-
const header = `${label}${badge
|
|
121
|
+
const header = `${label}${badge}${disabledBadge}`;
|
|
80
122
|
const subtitleParts = [
|
|
81
123
|
`Added: ${formatDate(account.addedAt)}`,
|
|
82
124
|
`Last used: ${formatRelativeTime(account.lastUsed)}`,
|
|
83
125
|
];
|
|
126
|
+
const hasHistory = (account.fingerprintHistory?.length ?? 0) > 0;
|
|
84
127
|
while (true) {
|
|
85
|
-
const
|
|
128
|
+
const menuItems = [
|
|
86
129
|
{ label: 'Back', value: 'back' },
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
{
|
|
90
|
-
|
|
91
|
-
|
|
130
|
+
];
|
|
131
|
+
if (!account.isCurrentAccount) {
|
|
132
|
+
menuItems.push({
|
|
133
|
+
label: 'Switch to this account',
|
|
134
|
+
value: 'switch-account',
|
|
135
|
+
color: 'green',
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
menuItems.push({ label: 'Verify account access', value: 'verify', color: 'cyan' }, { label: account.enabled === false ? 'Enable account' : 'Disable account', value: 'toggle', color: account.enabled === false ? 'green' : 'yellow' }, { label: 'Refresh token', value: 'refresh', color: 'cyan' });
|
|
139
|
+
if (hasHistory) {
|
|
140
|
+
menuItems.push({
|
|
141
|
+
label: `Restore fingerprint (${account.fingerprintHistory.length} saved)`,
|
|
142
|
+
value: 'restore-fingerprint',
|
|
143
|
+
color: 'cyan',
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
menuItems.push({ label: 'Delete this account', value: 'delete', color: 'red' });
|
|
147
|
+
const result = await select(menuItems, {
|
|
92
148
|
message: header,
|
|
93
149
|
subtitle: subtitleParts.join(' | '),
|
|
94
150
|
clearScreen: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-menu.js","sourceRoot":"","sources":["../../../../src/plugin/ui/auth-menu.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAiB,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"auth-menu.js","sourceRoot":"","sources":["../../../../src/plugin/ui/auth-menu.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { CooldownReason } from "../accounts";
|
|
2
|
+
import type { QuotaGroupSummary } from "../quota";
|
|
3
|
+
import type { QuotaStatusInfo } from "./quota-status";
|
|
4
|
+
/**
|
|
5
|
+
* Per-account status data for a specific model family.
|
|
6
|
+
* Extracted from AccountManager by the caller; kept simple for testability.
|
|
7
|
+
*/
|
|
8
|
+
export interface ModelAccountStatus {
|
|
9
|
+
coolingDown: boolean;
|
|
10
|
+
cooldownMs: number;
|
|
11
|
+
cooldownReason?: CooldownReason;
|
|
12
|
+
rateLimited: boolean;
|
|
13
|
+
rateLimitWaitMs: number;
|
|
14
|
+
quotaGroup?: QuotaGroupSummary;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Determine per-model availability status by aggregating across accounts.
|
|
18
|
+
*
|
|
19
|
+
* Rules:
|
|
20
|
+
* 1. If ANY enabled account can serve the model → READY (or LOW if all
|
|
21
|
+
* available accounts have low quota).
|
|
22
|
+
* 2. If ALL accounts are blocked:
|
|
23
|
+
* - All cooling down → COOLDOWN with min cooldown time
|
|
24
|
+
* - Any rate-limited → WAIT with min wait time
|
|
25
|
+
* 3. Fail-open: returns READY when no accounts or no quota data exist.
|
|
26
|
+
*/
|
|
27
|
+
export declare function getModelStatusFromAccounts(accounts: readonly ModelAccountStatus[]): QuotaStatusInfo;
|
|
28
|
+
//# sourceMappingURL=model-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-status.d.ts","sourceRoot":"","sources":["../../../../src/plugin/ui/model-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAMjD,OAAO,KAAK,EAAE,eAAe,EAAc,MAAM,gBAAgB,CAAA;AAEjE;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,OAAO,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B,WAAW,EAAE,OAAO,CAAA;IACpB,eAAe,EAAE,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,iBAAiB,CAAA;CAC/B;AAcD;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,SAAS,kBAAkB,EAAE,GACtC,eAAe,CAqBjB"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { classifyGroupStatus, buildCooldownStatus, buildWaitStatus, } from "./quota-status";
|
|
2
|
+
/**
|
|
3
|
+
* Priority ranking for quota labels — higher is more available.
|
|
4
|
+
* Used to pick the best (most optimistic) status across accounts.
|
|
5
|
+
*/
|
|
6
|
+
const STATUS_PRIORITY = {
|
|
7
|
+
READY: 4,
|
|
8
|
+
LOW: 3,
|
|
9
|
+
WAIT: 2,
|
|
10
|
+
EXHAUSTED: 1,
|
|
11
|
+
COOLDOWN: 0,
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Determine per-model availability status by aggregating across accounts.
|
|
15
|
+
*
|
|
16
|
+
* Rules:
|
|
17
|
+
* 1. If ANY enabled account can serve the model → READY (or LOW if all
|
|
18
|
+
* available accounts have low quota).
|
|
19
|
+
* 2. If ALL accounts are blocked:
|
|
20
|
+
* - All cooling down → COOLDOWN with min cooldown time
|
|
21
|
+
* - Any rate-limited → WAIT with min wait time
|
|
22
|
+
* 3. Fail-open: returns READY when no accounts or no quota data exist.
|
|
23
|
+
*/
|
|
24
|
+
export function getModelStatusFromAccounts(accounts) {
|
|
25
|
+
if (accounts.length === 0) {
|
|
26
|
+
return { label: "READY" };
|
|
27
|
+
}
|
|
28
|
+
const available = [];
|
|
29
|
+
const blocked = [];
|
|
30
|
+
for (const account of accounts) {
|
|
31
|
+
if (!account.coolingDown && !account.rateLimited) {
|
|
32
|
+
available.push(account);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
blocked.push(account);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (available.length > 0) {
|
|
39
|
+
return resolveAvailableStatus(available);
|
|
40
|
+
}
|
|
41
|
+
return resolveBlockedStatus(blocked);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Among accounts that can serve right now, pick the best quota status.
|
|
45
|
+
* If none have quota data, fail-open to READY.
|
|
46
|
+
*/
|
|
47
|
+
function resolveAvailableStatus(accounts) {
|
|
48
|
+
let best = null;
|
|
49
|
+
for (const account of accounts) {
|
|
50
|
+
if (!account.quotaGroup)
|
|
51
|
+
continue;
|
|
52
|
+
const status = classifyGroupStatus(account.quotaGroup);
|
|
53
|
+
if (!best || STATUS_PRIORITY[status.label] > STATUS_PRIORITY[best.label]) {
|
|
54
|
+
best = status;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return best ?? { label: "READY" };
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* All accounts are blocked — determine the dominant blocking reason and
|
|
61
|
+
* the soonest time any account becomes available.
|
|
62
|
+
*/
|
|
63
|
+
function resolveBlockedStatus(accounts) {
|
|
64
|
+
const allCooling = accounts.every((a) => a.coolingDown);
|
|
65
|
+
if (allCooling) {
|
|
66
|
+
const cooldownTimes = accounts
|
|
67
|
+
.map((a) => a.cooldownMs)
|
|
68
|
+
.filter((ms) => ms > 0);
|
|
69
|
+
const minMs = cooldownTimes.length > 0 ? Math.min(...cooldownTimes) : 0;
|
|
70
|
+
const reason = accounts[0]?.cooldownReason;
|
|
71
|
+
return buildCooldownStatus(minMs, reason);
|
|
72
|
+
}
|
|
73
|
+
// Mix of cooldown + rate-limited, or all rate-limited → WAIT
|
|
74
|
+
const waitTimes = accounts
|
|
75
|
+
.map((a) => (a.coolingDown ? a.cooldownMs : a.rateLimitWaitMs))
|
|
76
|
+
.filter((ms) => ms > 0);
|
|
77
|
+
const minMs = waitTimes.length > 0 ? Math.min(...waitTimes) : undefined;
|
|
78
|
+
return buildWaitStatus(minMs);
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=model-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-status.js","sourceRoot":"","sources":["../../../../src/plugin/ui/model-status.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,GAChB,MAAM,gBAAgB,CAAA;AAgBvB;;;GAGG;AACH,MAAM,eAAe,GAA+B;IAClD,KAAK,EAAE,CAAC;IACR,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,CAAC;IACP,SAAS,EAAE,CAAC;IACZ,QAAQ,EAAE,CAAC;CACZ,CAAA;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,0BAA0B,CACxC,QAAuC;IAEvC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;IAC3B,CAAC;IAED,MAAM,SAAS,GAAyB,EAAE,CAAA;IAC1C,MAAM,OAAO,GAAyB,EAAE,CAAA;IAExC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACjD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACzB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACvB,CAAC;IACH,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,sBAAsB,CAAC,SAAS,CAAC,CAAA;IAC1C,CAAC;IAED,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAA;AACtC,CAAC;AAED;;;GAGG;AACH,SAAS,sBAAsB,CAC7B,QAAuC;IAEvC,IAAI,IAAI,GAA2B,IAAI,CAAA;IAEvC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,UAAU;YAAE,SAAQ;QACjC,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QACtD,IAAI,CAAC,IAAI,IAAI,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACzE,IAAI,GAAG,MAAM,CAAA;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;AACnC,CAAC;AAED;;;GAGG;AACH,SAAS,oBAAoB,CAC3B,QAAuC;IAEvC,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAA;IAEvD,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,aAAa,GAAG,QAAQ;aAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;aACxB,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QACzB,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACvE,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,cAAc,CAAA;QAC1C,OAAO,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAC3C,CAAC;IAED,6DAA6D;IAC7D,MAAM,SAAS,GAAG,QAAQ;SACvB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;SAC9D,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;IAEzB,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACvE,OAAO,eAAe,CAAC,KAAK,CAAC,CAAA;AAC/B,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { QuotaGroupSummary } from "../quota";
|
|
2
|
+
import type { CooldownReason } from "../accounts";
|
|
3
|
+
/**
|
|
4
|
+
* Quota-aware status labels for models and accounts.
|
|
5
|
+
*
|
|
6
|
+
* Labels:
|
|
7
|
+
* [READY] — quota available, no rate limits
|
|
8
|
+
* [WAIT Xm] — rate-limited, resets in X minutes
|
|
9
|
+
* [EXHAUSTED] — quota fully consumed (0%), reset time known
|
|
10
|
+
* [COOLDOWN] — account cooling down (auth failure, network error, etc.)
|
|
11
|
+
* [LOW] — quota below 20% but still available
|
|
12
|
+
*/
|
|
13
|
+
export type QuotaLabel = "READY" | "WAIT" | "EXHAUSTED" | "COOLDOWN" | "LOW";
|
|
14
|
+
export interface QuotaStatusInfo {
|
|
15
|
+
label: QuotaLabel;
|
|
16
|
+
waitMs?: number;
|
|
17
|
+
cooldownReason?: CooldownReason;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Format a duration in milliseconds to a compact human-readable string.
|
|
21
|
+
* Used for wait/cooldown labels.
|
|
22
|
+
*/
|
|
23
|
+
export declare function formatWaitDuration(ms: number): string;
|
|
24
|
+
/**
|
|
25
|
+
* Classify a quota group's status based on remaining fraction and reset time.
|
|
26
|
+
*/
|
|
27
|
+
export declare function classifyGroupStatus(group: QuotaGroupSummary | undefined): QuotaStatusInfo;
|
|
28
|
+
/**
|
|
29
|
+
* Build a cooldown status for an account that is cooling down.
|
|
30
|
+
*/
|
|
31
|
+
export declare function buildCooldownStatus(cooldownMs: number, reason?: CooldownReason): QuotaStatusInfo;
|
|
32
|
+
/**
|
|
33
|
+
* Build a rate-limited (WAIT) status with optional wait time.
|
|
34
|
+
*/
|
|
35
|
+
export declare function buildWaitStatus(waitMs?: number): QuotaStatusInfo;
|
|
36
|
+
/**
|
|
37
|
+
* Format a QuotaStatusInfo into a colored ANSI badge string.
|
|
38
|
+
*
|
|
39
|
+
* Examples:
|
|
40
|
+
* [READY]
|
|
41
|
+
* [WAIT 3m 20s]
|
|
42
|
+
* [EXHAUSTED resets in 2h 15m]
|
|
43
|
+
* [COOLDOWN auth-failure]
|
|
44
|
+
* [LOW]
|
|
45
|
+
*/
|
|
46
|
+
export declare function formatQuotaStatusBadge(status: QuotaStatusInfo): string;
|
|
47
|
+
/**
|
|
48
|
+
* Format a plain-text (no ANSI) quota status label.
|
|
49
|
+
* Suitable for hints and non-colored contexts.
|
|
50
|
+
*/
|
|
51
|
+
export declare function formatQuotaStatusPlain(status: QuotaStatusInfo): string;
|
|
52
|
+
/**
|
|
53
|
+
* Build a quota summary string with status labels for cached quota data.
|
|
54
|
+
* Used in auth menu account hints.
|
|
55
|
+
*
|
|
56
|
+
* Example: "Claude READY 80%, Gemini Pro LOW 15%, Gemini Flash EXHAUSTED"
|
|
57
|
+
*/
|
|
58
|
+
export declare function formatCachedQuotaWithStatus(cachedQuota: Partial<Record<string, {
|
|
59
|
+
remainingFraction?: number;
|
|
60
|
+
resetTime?: string;
|
|
61
|
+
}>> | undefined): string | undefined;
|
|
62
|
+
/**
|
|
63
|
+
* Format a per-group quota status badge for the "Check quotas" output.
|
|
64
|
+
* Combines the progress bar with a status label.
|
|
65
|
+
*/
|
|
66
|
+
export declare function formatGroupQuotaBadge(remaining?: number, resetTime?: string): string;
|
|
67
|
+
//# sourceMappingURL=quota-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota-status.d.ts","sourceRoot":"","sources":["../../../../src/plugin/ui/quota-status.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAc,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD;;;;;;;;;GASG;AAEH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,KAAK,CAAA;AAE5E,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,UAAU,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,cAAc,CAAC,EAAE,cAAc,CAAA;CAChC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAYrD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,iBAAiB,GAAG,SAAS,GACnC,eAAe,CA2BjB;AAcD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,cAAc,GACtB,eAAe,CAMjB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,CAKhE;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAiCtE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAiCtE;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE;IAAE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,GAAG,SAAS,GACnG,MAAM,GAAG,SAAS,CAuBpB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAQR"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { ANSI } from "./ansi";
|
|
2
|
+
/**
|
|
3
|
+
* Format a duration in milliseconds to a compact human-readable string.
|
|
4
|
+
* Used for wait/cooldown labels.
|
|
5
|
+
*/
|
|
6
|
+
export function formatWaitDuration(ms) {
|
|
7
|
+
if (ms < 1000)
|
|
8
|
+
return `${ms}ms`;
|
|
9
|
+
const seconds = Math.ceil(ms / 1000);
|
|
10
|
+
if (seconds < 60)
|
|
11
|
+
return `${seconds}s`;
|
|
12
|
+
const minutes = Math.floor(seconds / 60);
|
|
13
|
+
const remainingSeconds = seconds % 60;
|
|
14
|
+
if (minutes < 60) {
|
|
15
|
+
return remainingSeconds > 0 ? `${minutes}m ${remainingSeconds}s` : `${minutes}m`;
|
|
16
|
+
}
|
|
17
|
+
const hours = Math.floor(minutes / 60);
|
|
18
|
+
const remainingMinutes = minutes % 60;
|
|
19
|
+
return remainingMinutes > 0 ? `${hours}h ${remainingMinutes}m` : `${hours}h`;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Classify a quota group's status based on remaining fraction and reset time.
|
|
23
|
+
*/
|
|
24
|
+
export function classifyGroupStatus(group) {
|
|
25
|
+
if (!group) {
|
|
26
|
+
return { label: "READY" };
|
|
27
|
+
}
|
|
28
|
+
const remaining = group.remainingFraction;
|
|
29
|
+
// No remaining fraction data — treat as ready (fail-open)
|
|
30
|
+
if (typeof remaining !== "number" || !Number.isFinite(remaining)) {
|
|
31
|
+
return { label: "READY" };
|
|
32
|
+
}
|
|
33
|
+
// Exhausted: 0% remaining
|
|
34
|
+
if (remaining <= 0) {
|
|
35
|
+
const waitMs = parseResetTimeToMs(group.resetTime);
|
|
36
|
+
if (waitMs !== null && waitMs > 0) {
|
|
37
|
+
return { label: "EXHAUSTED", waitMs };
|
|
38
|
+
}
|
|
39
|
+
return { label: "EXHAUSTED" };
|
|
40
|
+
}
|
|
41
|
+
// Low: below 20%
|
|
42
|
+
if (remaining < 0.2) {
|
|
43
|
+
return { label: "LOW" };
|
|
44
|
+
}
|
|
45
|
+
return { label: "READY" };
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Parse an ISO reset time string to milliseconds-until-reset.
|
|
49
|
+
* Returns null if the time is invalid or already past.
|
|
50
|
+
*/
|
|
51
|
+
function parseResetTimeToMs(resetTime) {
|
|
52
|
+
if (!resetTime)
|
|
53
|
+
return null;
|
|
54
|
+
const timestamp = Date.parse(resetTime);
|
|
55
|
+
if (!Number.isFinite(timestamp))
|
|
56
|
+
return null;
|
|
57
|
+
const ms = timestamp - Date.now();
|
|
58
|
+
return ms > 0 ? ms : null;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Build a cooldown status for an account that is cooling down.
|
|
62
|
+
*/
|
|
63
|
+
export function buildCooldownStatus(cooldownMs, reason) {
|
|
64
|
+
return {
|
|
65
|
+
label: "COOLDOWN",
|
|
66
|
+
waitMs: cooldownMs > 0 ? cooldownMs : undefined,
|
|
67
|
+
cooldownReason: reason,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Build a rate-limited (WAIT) status with optional wait time.
|
|
72
|
+
*/
|
|
73
|
+
export function buildWaitStatus(waitMs) {
|
|
74
|
+
if (waitMs !== undefined && waitMs > 0) {
|
|
75
|
+
return { label: "WAIT", waitMs };
|
|
76
|
+
}
|
|
77
|
+
return { label: "WAIT" };
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Format a QuotaStatusInfo into a colored ANSI badge string.
|
|
81
|
+
*
|
|
82
|
+
* Examples:
|
|
83
|
+
* [READY]
|
|
84
|
+
* [WAIT 3m 20s]
|
|
85
|
+
* [EXHAUSTED resets in 2h 15m]
|
|
86
|
+
* [COOLDOWN auth-failure]
|
|
87
|
+
* [LOW]
|
|
88
|
+
*/
|
|
89
|
+
export function formatQuotaStatusBadge(status) {
|
|
90
|
+
switch (status.label) {
|
|
91
|
+
case "READY":
|
|
92
|
+
return `${ANSI.green}[READY]${ANSI.reset}`;
|
|
93
|
+
case "LOW":
|
|
94
|
+
return `${ANSI.yellow}[LOW]${ANSI.reset}`;
|
|
95
|
+
case "WAIT": {
|
|
96
|
+
const suffix = status.waitMs
|
|
97
|
+
? ` ${formatWaitDuration(status.waitMs)}`
|
|
98
|
+
: "";
|
|
99
|
+
return `${ANSI.yellow}[WAIT${suffix}]${ANSI.reset}`;
|
|
100
|
+
}
|
|
101
|
+
case "EXHAUSTED": {
|
|
102
|
+
const suffix = status.waitMs
|
|
103
|
+
? ` resets in ${formatWaitDuration(status.waitMs)}`
|
|
104
|
+
: "";
|
|
105
|
+
return `${ANSI.red}[EXHAUSTED${suffix}]${ANSI.reset}`;
|
|
106
|
+
}
|
|
107
|
+
case "COOLDOWN": {
|
|
108
|
+
const parts = ["COOLDOWN"];
|
|
109
|
+
if (status.cooldownReason) {
|
|
110
|
+
parts.push(status.cooldownReason);
|
|
111
|
+
}
|
|
112
|
+
if (status.waitMs) {
|
|
113
|
+
parts.push(formatWaitDuration(status.waitMs));
|
|
114
|
+
}
|
|
115
|
+
return `${ANSI.red}[${parts.join(" ")}]${ANSI.reset}`;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Format a plain-text (no ANSI) quota status label.
|
|
121
|
+
* Suitable for hints and non-colored contexts.
|
|
122
|
+
*/
|
|
123
|
+
export function formatQuotaStatusPlain(status) {
|
|
124
|
+
switch (status.label) {
|
|
125
|
+
case "READY":
|
|
126
|
+
return "READY";
|
|
127
|
+
case "LOW":
|
|
128
|
+
return "LOW";
|
|
129
|
+
case "WAIT": {
|
|
130
|
+
const suffix = status.waitMs
|
|
131
|
+
? ` ${formatWaitDuration(status.waitMs)}`
|
|
132
|
+
: "";
|
|
133
|
+
return `WAIT${suffix}`;
|
|
134
|
+
}
|
|
135
|
+
case "EXHAUSTED": {
|
|
136
|
+
const suffix = status.waitMs
|
|
137
|
+
? ` resets in ${formatWaitDuration(status.waitMs)}`
|
|
138
|
+
: "";
|
|
139
|
+
return `EXHAUSTED${suffix}`;
|
|
140
|
+
}
|
|
141
|
+
case "COOLDOWN": {
|
|
142
|
+
const parts = ["COOLDOWN"];
|
|
143
|
+
if (status.cooldownReason) {
|
|
144
|
+
parts.push(status.cooldownReason);
|
|
145
|
+
}
|
|
146
|
+
if (status.waitMs) {
|
|
147
|
+
parts.push(formatWaitDuration(status.waitMs));
|
|
148
|
+
}
|
|
149
|
+
return parts.join(" ");
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Build a quota summary string with status labels for cached quota data.
|
|
155
|
+
* Used in auth menu account hints.
|
|
156
|
+
*
|
|
157
|
+
* Example: "Claude READY 80%, Gemini Pro LOW 15%, Gemini Flash EXHAUSTED"
|
|
158
|
+
*/
|
|
159
|
+
export function formatCachedQuotaWithStatus(cachedQuota) {
|
|
160
|
+
if (!cachedQuota) {
|
|
161
|
+
return undefined;
|
|
162
|
+
}
|
|
163
|
+
const entries = [
|
|
164
|
+
{ key: "claude", label: "Claude" },
|
|
165
|
+
{ key: "gemini-pro", label: "Gemini Pro" },
|
|
166
|
+
{ key: "gemini-flash", label: "Gemini Flash" },
|
|
167
|
+
].flatMap(({ key, label }) => {
|
|
168
|
+
const value = cachedQuota[key]?.remainingFraction;
|
|
169
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
170
|
+
return [];
|
|
171
|
+
}
|
|
172
|
+
const pct = Math.round(Math.max(0, Math.min(1, value)) * 100);
|
|
173
|
+
const status = classifyGroupStatus(cachedQuota[key]);
|
|
174
|
+
if (status.label === "READY") {
|
|
175
|
+
return [`${label} ${pct}%`];
|
|
176
|
+
}
|
|
177
|
+
return [`${label} ${formatQuotaStatusPlain(status)} ${pct}%`];
|
|
178
|
+
});
|
|
179
|
+
return entries.length > 0 ? entries.join(", ") : undefined;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Format a per-group quota status badge for the "Check quotas" output.
|
|
183
|
+
* Combines the progress bar with a status label.
|
|
184
|
+
*/
|
|
185
|
+
export function formatGroupQuotaBadge(remaining, resetTime) {
|
|
186
|
+
const group = {
|
|
187
|
+
remainingFraction: remaining,
|
|
188
|
+
resetTime,
|
|
189
|
+
modelCount: 1,
|
|
190
|
+
};
|
|
191
|
+
const status = classifyGroupStatus(group);
|
|
192
|
+
return formatQuotaStatusBadge(status);
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=quota-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota-status.js","sourceRoot":"","sources":["../../../../src/plugin/ui/quota-status.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,9 +11,16 @@
|
|
|
11
11
|
*
|
|
12
12
|
* @see https://github.com/lbjlaq/Antigravity-Manager (src-tauri/src/constants.rs)
|
|
13
13
|
*/
|
|
14
|
+
type VersionSource = "api" | "changelog" | "fallback";
|
|
15
|
+
export interface AntigravityVersionResolution {
|
|
16
|
+
version: string;
|
|
17
|
+
source: VersionSource;
|
|
18
|
+
}
|
|
14
19
|
/**
|
|
15
20
|
* Fetch the latest Antigravity version and update the global constant.
|
|
16
21
|
* Safe to call before logger is initialized (will silently skip logging).
|
|
17
22
|
*/
|
|
18
|
-
export declare function
|
|
23
|
+
export declare function getAntigravityVersionResolution(): AntigravityVersionResolution;
|
|
24
|
+
export declare function initAntigravityVersion(): Promise<AntigravityVersionResolution>;
|
|
25
|
+
export {};
|
|
19
26
|
//# sourceMappingURL=version.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/plugin/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/plugin/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAWH,KAAK,aAAa,GAAG,KAAK,GAAG,WAAW,GAAG,UAAU,CAAC;AAEtD,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,aAAa,CAAC;CACvB;AAyBD;;;GAGG;AACH,wBAAgB,+BAA+B,IAAI,4BAA4B,CAE9E;AAED,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,4BAA4B,CAAC,CAiCpF"}
|
|
@@ -18,6 +18,7 @@ const CHANGELOG_URL = "https://antigravity.google/changelog";
|
|
|
18
18
|
const FETCH_TIMEOUT_MS = 5000;
|
|
19
19
|
const CHANGELOG_SCAN_CHARS = 5000;
|
|
20
20
|
const VERSION_REGEX = /\d+\.\d+\.\d+/;
|
|
21
|
+
let lastResolution = null;
|
|
21
22
|
function parseVersion(text) {
|
|
22
23
|
const match = text.match(VERSION_REGEX);
|
|
23
24
|
return match ? match[0] : null;
|
|
@@ -45,6 +46,9 @@ async function tryFetchVersion(url, maxChars) {
|
|
|
45
46
|
* Fetch the latest Antigravity version and update the global constant.
|
|
46
47
|
* Safe to call before logger is initialized (will silently skip logging).
|
|
47
48
|
*/
|
|
49
|
+
export function getAntigravityVersionResolution() {
|
|
50
|
+
return lastResolution ?? { version: getAntigravityVersion(), source: "fallback" };
|
|
51
|
+
}
|
|
48
52
|
export async function initAntigravityVersion() {
|
|
49
53
|
const log = createLogger("version");
|
|
50
54
|
const fallback = getAntigravityVersion();
|
|
@@ -66,7 +70,8 @@ export async function initAntigravityVersion() {
|
|
|
66
70
|
source = "fallback";
|
|
67
71
|
setAntigravityVersion(fallback);
|
|
68
72
|
log.info("version-fetch-failed", { fallback });
|
|
69
|
-
|
|
73
|
+
lastResolution = { version: fallback, source };
|
|
74
|
+
return lastResolution;
|
|
70
75
|
}
|
|
71
76
|
}
|
|
72
77
|
if (version !== fallback) {
|
|
@@ -76,5 +81,7 @@ export async function initAntigravityVersion() {
|
|
|
76
81
|
log.debug("version-unchanged", { version, source });
|
|
77
82
|
}
|
|
78
83
|
setAntigravityVersion(version);
|
|
84
|
+
lastResolution = { version, source };
|
|
85
|
+
return lastResolution;
|
|
79
86
|
}
|
|
80
87
|
//# sourceMappingURL=version.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/plugin/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,WAAW,GAAG,mEAAmE,CAAC;AACxF,MAAM,aAAa,GAAG,sCAAsC,CAAC;AAC7D,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC9B,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAClC,MAAM,aAAa,GAAG,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/plugin/version.ts"],"names":[],"mappings":"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"}
|