opencode-antigravity-auth 1.2.0 → 1.2.1
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 +198 -99
- package/dist/src/hooks/auto-update-checker/cache.d.ts +3 -0
- package/dist/src/hooks/auto-update-checker/cache.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/cache.js +71 -0
- package/dist/src/hooks/auto-update-checker/cache.js.map +1 -0
- package/dist/src/hooks/auto-update-checker/checker.d.ts +16 -0
- package/dist/src/hooks/auto-update-checker/checker.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/checker.js +237 -0
- package/dist/src/hooks/auto-update-checker/checker.js.map +1 -0
- package/dist/src/hooks/auto-update-checker/constants.d.ts +9 -0
- package/dist/src/hooks/auto-update-checker/constants.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/constants.js +23 -0
- package/dist/src/hooks/auto-update-checker/constants.js.map +1 -0
- package/dist/src/hooks/auto-update-checker/index.d.ts +34 -0
- package/dist/src/hooks/auto-update-checker/index.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/index.js +121 -0
- package/dist/src/hooks/auto-update-checker/index.js.map +1 -0
- package/dist/src/hooks/auto-update-checker/types.d.ts +25 -0
- package/dist/src/hooks/auto-update-checker/types.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/types.js +1 -0
- package/dist/src/hooks/auto-update-checker/types.js.map +1 -0
- package/dist/src/plugin/accounts.d.ts +21 -10
- package/dist/src/plugin/accounts.d.ts.map +1 -1
- package/dist/src/plugin/accounts.js +101 -55
- package/dist/src/plugin/accounts.js.map +1 -1
- package/dist/src/plugin/debug.d.ts +32 -0
- package/dist/src/plugin/debug.d.ts.map +1 -1
- package/dist/src/plugin/debug.js +140 -12
- package/dist/src/plugin/debug.js.map +1 -1
- package/dist/src/plugin/request.d.ts +3 -1
- package/dist/src/plugin/request.d.ts.map +1 -1
- package/dist/src/plugin/request.js +352 -16
- package/dist/src/plugin/request.js.map +1 -1
- package/dist/src/plugin/storage.d.ts +23 -7
- package/dist/src/plugin/storage.d.ts.map +1 -1
- package/dist/src/plugin/storage.js +54 -10
- package/dist/src/plugin/storage.js.map +1 -1
- package/dist/src/plugin/types.d.ts +8 -0
- package/dist/src/plugin/types.d.ts.map +1 -1
- package/dist/src/plugin.d.ts +3 -3
- package/dist/src/plugin.d.ts.map +1 -1
- package/dist/src/plugin.js +779 -476
- package/dist/src/plugin.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { PACKAGE_NAME, NPM_REGISTRY_URL, NPM_FETCH_TIMEOUT, INSTALLED_PACKAGE_JSON, USER_OPENCODE_CONFIG, USER_OPENCODE_CONFIG_JSONC, } from "./constants";
|
|
5
|
+
import { debugLogToFile } from "../../plugin/debug";
|
|
6
|
+
function debugLog(message) {
|
|
7
|
+
debugLogToFile(message);
|
|
8
|
+
}
|
|
9
|
+
export function isLocalDevMode(directory) {
|
|
10
|
+
return getLocalDevPath(directory) !== null;
|
|
11
|
+
}
|
|
12
|
+
function stripJsonComments(json) {
|
|
13
|
+
return json
|
|
14
|
+
.replace(/\\"|"(?:\\"|[^"])*"|(\/\/.*|\/\*[\s\S]*?\*\/)/g, (m, g) => (g ? "" : m))
|
|
15
|
+
.replace(/,(\s*[}\]])/g, "$1");
|
|
16
|
+
}
|
|
17
|
+
function getConfigPaths(directory) {
|
|
18
|
+
return [
|
|
19
|
+
path.join(directory, ".opencode", "opencode.json"),
|
|
20
|
+
path.join(directory, ".opencode", "opencode.jsonc"),
|
|
21
|
+
path.join(directory, ".opencode.json"),
|
|
22
|
+
USER_OPENCODE_CONFIG,
|
|
23
|
+
USER_OPENCODE_CONFIG_JSONC,
|
|
24
|
+
];
|
|
25
|
+
}
|
|
26
|
+
export function getLocalDevPath(directory) {
|
|
27
|
+
for (const configPath of getConfigPaths(directory)) {
|
|
28
|
+
try {
|
|
29
|
+
if (!fs.existsSync(configPath))
|
|
30
|
+
continue;
|
|
31
|
+
const content = fs.readFileSync(configPath, "utf-8");
|
|
32
|
+
const config = JSON.parse(stripJsonComments(content));
|
|
33
|
+
const plugins = config.plugin ?? [];
|
|
34
|
+
for (const entry of plugins) {
|
|
35
|
+
if (entry.startsWith("file://") && entry.includes(PACKAGE_NAME)) {
|
|
36
|
+
try {
|
|
37
|
+
return fileURLToPath(entry);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return entry.replace("file://", "");
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
function findPackageJsonUp(startPath) {
|
|
52
|
+
try {
|
|
53
|
+
const stat = fs.statSync(startPath);
|
|
54
|
+
let dir = stat.isDirectory() ? startPath : path.dirname(startPath);
|
|
55
|
+
for (let i = 0; i < 10; i++) {
|
|
56
|
+
const pkgPath = path.join(dir, "package.json");
|
|
57
|
+
if (fs.existsSync(pkgPath)) {
|
|
58
|
+
try {
|
|
59
|
+
const content = fs.readFileSync(pkgPath, "utf-8");
|
|
60
|
+
const pkg = JSON.parse(content);
|
|
61
|
+
if (pkg.name === PACKAGE_NAME)
|
|
62
|
+
return pkgPath;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const parent = path.dirname(dir);
|
|
69
|
+
if (parent === dir)
|
|
70
|
+
break;
|
|
71
|
+
dir = parent;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
export function getLocalDevVersion(directory) {
|
|
80
|
+
const localPath = getLocalDevPath(directory);
|
|
81
|
+
if (!localPath)
|
|
82
|
+
return null;
|
|
83
|
+
try {
|
|
84
|
+
const pkgPath = findPackageJsonUp(localPath);
|
|
85
|
+
if (!pkgPath)
|
|
86
|
+
return null;
|
|
87
|
+
const content = fs.readFileSync(pkgPath, "utf-8");
|
|
88
|
+
const pkg = JSON.parse(content);
|
|
89
|
+
return pkg.version ?? null;
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
export function findPluginEntry(directory) {
|
|
96
|
+
for (const configPath of getConfigPaths(directory)) {
|
|
97
|
+
try {
|
|
98
|
+
if (!fs.existsSync(configPath))
|
|
99
|
+
continue;
|
|
100
|
+
const content = fs.readFileSync(configPath, "utf-8");
|
|
101
|
+
const config = JSON.parse(stripJsonComments(content));
|
|
102
|
+
const plugins = config.plugin ?? [];
|
|
103
|
+
for (const entry of plugins) {
|
|
104
|
+
if (entry === PACKAGE_NAME) {
|
|
105
|
+
return { entry, isPinned: false, pinnedVersion: null, configPath };
|
|
106
|
+
}
|
|
107
|
+
if (entry.startsWith(`${PACKAGE_NAME}@`)) {
|
|
108
|
+
const pinnedVersion = entry.slice(PACKAGE_NAME.length + 1);
|
|
109
|
+
const isPinned = pinnedVersion !== "latest";
|
|
110
|
+
return { entry, isPinned, pinnedVersion: isPinned ? pinnedVersion : null, configPath };
|
|
111
|
+
}
|
|
112
|
+
if (entry.startsWith("file://") && entry.includes(PACKAGE_NAME)) {
|
|
113
|
+
return { entry, isPinned: false, pinnedVersion: null, configPath };
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
export function getCachedVersion() {
|
|
124
|
+
try {
|
|
125
|
+
if (fs.existsSync(INSTALLED_PACKAGE_JSON)) {
|
|
126
|
+
const content = fs.readFileSync(INSTALLED_PACKAGE_JSON, "utf-8");
|
|
127
|
+
const pkg = JSON.parse(content);
|
|
128
|
+
if (pkg.version)
|
|
129
|
+
return pkg.version;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
const currentDir = path.dirname(fileURLToPath(import.meta.url));
|
|
137
|
+
const pkgPath = findPackageJsonUp(currentDir);
|
|
138
|
+
if (pkgPath) {
|
|
139
|
+
const content = fs.readFileSync(pkgPath, "utf-8");
|
|
140
|
+
const pkg = JSON.parse(content);
|
|
141
|
+
if (pkg.version)
|
|
142
|
+
return pkg.version;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch (err) {
|
|
146
|
+
debugLog(`[auto-update-checker] Failed to resolve version from current directory: ${err}`);
|
|
147
|
+
}
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
export function updatePinnedVersion(configPath, oldEntry, newVersion) {
|
|
151
|
+
try {
|
|
152
|
+
const content = fs.readFileSync(configPath, "utf-8");
|
|
153
|
+
const newEntry = `${PACKAGE_NAME}@${newVersion}`;
|
|
154
|
+
const pluginMatch = content.match(/"plugin"\s*:\s*\[/);
|
|
155
|
+
if (!pluginMatch || pluginMatch.index === undefined) {
|
|
156
|
+
debugLog(`[auto-update-checker] No "plugin" array found in ${configPath}`);
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
const startIdx = pluginMatch.index + pluginMatch[0].length;
|
|
160
|
+
let bracketCount = 1;
|
|
161
|
+
let endIdx = startIdx;
|
|
162
|
+
for (let i = startIdx; i < content.length && bracketCount > 0; i++) {
|
|
163
|
+
if (content[i] === "[")
|
|
164
|
+
bracketCount++;
|
|
165
|
+
else if (content[i] === "]")
|
|
166
|
+
bracketCount--;
|
|
167
|
+
endIdx = i;
|
|
168
|
+
}
|
|
169
|
+
const before = content.slice(0, startIdx);
|
|
170
|
+
const pluginArrayContent = content.slice(startIdx, endIdx);
|
|
171
|
+
const after = content.slice(endIdx);
|
|
172
|
+
const escapedOldEntry = oldEntry.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
173
|
+
const regex = new RegExp(`["']${escapedOldEntry}["']`);
|
|
174
|
+
if (!regex.test(pluginArrayContent)) {
|
|
175
|
+
debugLog(`[auto-update-checker] Entry "${oldEntry}" not found in plugin array of ${configPath}`);
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
const updatedPluginArray = pluginArrayContent.replace(regex, `"${newEntry}"`);
|
|
179
|
+
const updatedContent = before + updatedPluginArray + after;
|
|
180
|
+
if (updatedContent === content) {
|
|
181
|
+
debugLog(`[auto-update-checker] No changes made to ${configPath}`);
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
fs.writeFileSync(configPath, updatedContent, "utf-8");
|
|
185
|
+
debugLog(`[auto-update-checker] Updated ${configPath}: ${oldEntry} → ${newEntry}`);
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
console.error(`[auto-update-checker] Failed to update config file ${configPath}:`, err);
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
export async function getLatestVersion() {
|
|
194
|
+
const controller = new AbortController();
|
|
195
|
+
const timeoutId = setTimeout(() => controller.abort(), NPM_FETCH_TIMEOUT);
|
|
196
|
+
try {
|
|
197
|
+
const response = await fetch(NPM_REGISTRY_URL, {
|
|
198
|
+
signal: controller.signal,
|
|
199
|
+
headers: { Accept: "application/json" },
|
|
200
|
+
});
|
|
201
|
+
if (!response.ok)
|
|
202
|
+
return null;
|
|
203
|
+
const data = (await response.json());
|
|
204
|
+
return data.latest ?? null;
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
finally {
|
|
210
|
+
clearTimeout(timeoutId);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
export async function checkForUpdate(directory) {
|
|
214
|
+
if (isLocalDevMode(directory)) {
|
|
215
|
+
debugLog("[auto-update-checker] Local dev mode detected, skipping update check");
|
|
216
|
+
return { needsUpdate: false, currentVersion: null, latestVersion: null, isLocalDev: true, isPinned: false };
|
|
217
|
+
}
|
|
218
|
+
const pluginInfo = findPluginEntry(directory);
|
|
219
|
+
if (!pluginInfo) {
|
|
220
|
+
debugLog("[auto-update-checker] Plugin not found in config");
|
|
221
|
+
return { needsUpdate: false, currentVersion: null, latestVersion: null, isLocalDev: false, isPinned: false };
|
|
222
|
+
}
|
|
223
|
+
const currentVersion = getCachedVersion() ?? pluginInfo.pinnedVersion;
|
|
224
|
+
if (!currentVersion) {
|
|
225
|
+
debugLog("[auto-update-checker] No version found (cached or pinned)");
|
|
226
|
+
return { needsUpdate: false, currentVersion: null, latestVersion: null, isLocalDev: false, isPinned: pluginInfo.isPinned };
|
|
227
|
+
}
|
|
228
|
+
const latestVersion = await getLatestVersion();
|
|
229
|
+
if (!latestVersion) {
|
|
230
|
+
debugLog("[auto-update-checker] Failed to fetch latest version");
|
|
231
|
+
return { needsUpdate: false, currentVersion, latestVersion: null, isLocalDev: false, isPinned: pluginInfo.isPinned };
|
|
232
|
+
}
|
|
233
|
+
const needsUpdate = currentVersion !== latestVersion;
|
|
234
|
+
debugLog(`[auto-update-checker] Current: ${currentVersion}, Latest: ${latestVersion}, NeedsUpdate: ${needsUpdate}`);
|
|
235
|
+
return { needsUpdate, currentVersion, latestVersion, isLocalDev: false, isPinned: pluginInfo.isPinned };
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=checker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checker.js","sourceRoot":"","sources":["../../../../src/hooks/auto-update-checker/checker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const PACKAGE_NAME = "opencode-antigravity-auth";
|
|
2
|
+
export declare const NPM_REGISTRY_URL = "https://registry.npmjs.org/-/package/opencode-antigravity-auth/dist-tags";
|
|
3
|
+
export declare const NPM_FETCH_TIMEOUT = 5000;
|
|
4
|
+
export declare const CACHE_DIR: string;
|
|
5
|
+
export declare const INSTALLED_PACKAGE_JSON: string;
|
|
6
|
+
export declare const USER_CONFIG_DIR: string;
|
|
7
|
+
export declare const USER_OPENCODE_CONFIG: string;
|
|
8
|
+
export declare const USER_OPENCODE_CONFIG_JSONC: string;
|
|
9
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../src/hooks/auto-update-checker/constants.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY,8BAA8B,CAAC;AACxD,eAAO,MAAM,gBAAgB,6EAAmE,CAAC;AACjG,eAAO,MAAM,iBAAiB,OAAO,CAAC;AAStC,eAAO,MAAM,SAAS,QAAgB,CAAC;AACvC,eAAO,MAAM,sBAAsB,QAKlC,CAAC;AASF,eAAO,MAAM,eAAe,QAAqB,CAAC;AAClD,eAAO,MAAM,oBAAoB,QAA0D,CAAC;AAC5F,eAAO,MAAM,0BAA0B,QAA2D,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as path from "node:path";
|
|
2
|
+
import * as os from "node:os";
|
|
3
|
+
export const PACKAGE_NAME = "opencode-antigravity-auth";
|
|
4
|
+
export const NPM_REGISTRY_URL = `https://registry.npmjs.org/-/package/${PACKAGE_NAME}/dist-tags`;
|
|
5
|
+
export const NPM_FETCH_TIMEOUT = 5000;
|
|
6
|
+
function getCacheDir() {
|
|
7
|
+
if (process.platform === "win32") {
|
|
8
|
+
return path.join(process.env.LOCALAPPDATA ?? os.homedir(), "opencode");
|
|
9
|
+
}
|
|
10
|
+
return path.join(os.homedir(), ".cache", "opencode");
|
|
11
|
+
}
|
|
12
|
+
export const CACHE_DIR = getCacheDir();
|
|
13
|
+
export const INSTALLED_PACKAGE_JSON = path.join(CACHE_DIR, "node_modules", PACKAGE_NAME, "package.json");
|
|
14
|
+
function getUserConfigDir() {
|
|
15
|
+
if (process.platform === "win32") {
|
|
16
|
+
return process.env.APPDATA ?? path.join(os.homedir(), "AppData", "Roaming");
|
|
17
|
+
}
|
|
18
|
+
return process.env.XDG_CONFIG_HOME ?? path.join(os.homedir(), ".config");
|
|
19
|
+
}
|
|
20
|
+
export const USER_CONFIG_DIR = getUserConfigDir();
|
|
21
|
+
export const USER_OPENCODE_CONFIG = path.join(USER_CONFIG_DIR, "opencode", "opencode.json");
|
|
22
|
+
export const USER_OPENCODE_CONFIG_JSONC = path.join(USER_CONFIG_DIR, "opencode", "opencode.jsonc");
|
|
23
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/hooks/auto-update-checker/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,MAAM,CAAC,MAAM,YAAY,GAAG,2BAA2B,CAAC;AACxD,MAAM,CAAC,MAAM,gBAAgB,GAAG,wCAAwC,YAAY,YAAY,CAAC;AACjG,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAEtC,SAAS,WAAW;IAClB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,WAAW,EAAE,CAAC;AACvC,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC,IAAI,CAC7C,SAAS,EACT,cAAc,EACd,YAAY,EACZ,cAAc,CACf,CAAC;AAEF,SAAS,gBAAgB;IACvB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,gBAAgB,EAAE,CAAC;AAClD,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;AAC5F,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,EAAE,gBAAgB,CAAC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { AutoUpdateCheckerOptions } from "./types";
|
|
2
|
+
interface PluginClient {
|
|
3
|
+
tui: {
|
|
4
|
+
showToast(options: {
|
|
5
|
+
body: {
|
|
6
|
+
title?: string;
|
|
7
|
+
message: string;
|
|
8
|
+
variant: "info" | "warning" | "success" | "error";
|
|
9
|
+
duration?: number;
|
|
10
|
+
};
|
|
11
|
+
}): Promise<unknown>;
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
interface SessionCreatedEvent {
|
|
15
|
+
type: "session.created";
|
|
16
|
+
properties?: {
|
|
17
|
+
info?: {
|
|
18
|
+
parentID?: string;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
type PluginEvent = SessionCreatedEvent | {
|
|
23
|
+
type: string;
|
|
24
|
+
properties?: unknown;
|
|
25
|
+
};
|
|
26
|
+
export declare function createAutoUpdateCheckerHook(client: PluginClient, directory: string, options?: AutoUpdateCheckerOptions): {
|
|
27
|
+
event: ({ event }: {
|
|
28
|
+
event: PluginEvent;
|
|
29
|
+
}) => void;
|
|
30
|
+
};
|
|
31
|
+
export type { UpdateCheckResult, AutoUpdateCheckerOptions } from "./types";
|
|
32
|
+
export { checkForUpdate, getCachedVersion, getLatestVersion } from "./checker";
|
|
33
|
+
export { invalidatePackage, invalidateCache } from "./cache";
|
|
34
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/hooks/auto-update-checker/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAUxD,UAAU,YAAY;IACpB,GAAG,EAAE;QACH,SAAS,CAAC,OAAO,EAAE;YACjB,IAAI,EAAE;gBACJ,KAAK,CAAC,EAAE,MAAM,CAAC;gBACf,OAAO,EAAE,MAAM,CAAC;gBAChB,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;gBAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;aACnB,CAAC;SACH,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;KACtB,CAAC;CACH;AAED,UAAU,mBAAmB;IAC3B,IAAI,EAAE,iBAAiB,CAAC;IACxB,UAAU,CAAC,EAAE;QACX,IAAI,CAAC,EAAE;YACL,QAAQ,CAAC,EAAE,MAAM,CAAC;SACnB,CAAC;KACH,CAAC;CACH;AAED,KAAK,WAAW,GAAG,mBAAmB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEhF,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,wBAA6B;uBAOjB;QAAE,KAAK,EAAE,WAAW,CAAA;KAAE;EA0B5C;AAgGD,YAAY,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { getCachedVersion, getLocalDevVersion, findPluginEntry, getLatestVersion, updatePinnedVersion } from "./checker";
|
|
2
|
+
import { invalidatePackage } from "./cache";
|
|
3
|
+
import { PACKAGE_NAME } from "./constants";
|
|
4
|
+
import { debugLogToFile } from "../../plugin/debug";
|
|
5
|
+
function debugLog(message) {
|
|
6
|
+
debugLogToFile(message);
|
|
7
|
+
}
|
|
8
|
+
export function createAutoUpdateCheckerHook(client, directory, options = {}) {
|
|
9
|
+
const { showStartupToast = true, autoUpdate = true } = options;
|
|
10
|
+
let hasChecked = false;
|
|
11
|
+
return {
|
|
12
|
+
event: ({ event }) => {
|
|
13
|
+
if (event.type !== "session.created")
|
|
14
|
+
return;
|
|
15
|
+
if (hasChecked)
|
|
16
|
+
return;
|
|
17
|
+
const props = event.properties;
|
|
18
|
+
if (props?.info?.parentID)
|
|
19
|
+
return;
|
|
20
|
+
hasChecked = true;
|
|
21
|
+
setTimeout(() => {
|
|
22
|
+
const localDevVersion = getLocalDevVersion(directory);
|
|
23
|
+
if (localDevVersion) {
|
|
24
|
+
if (showStartupToast) {
|
|
25
|
+
showLocalDevToast(client, localDevVersion).catch(() => { });
|
|
26
|
+
}
|
|
27
|
+
debugLog("[auto-update-checker] Local development mode");
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
runBackgroundUpdateCheck(client, directory, autoUpdate).catch((err) => {
|
|
31
|
+
debugLog(`[auto-update-checker] Background update check failed: ${err}`);
|
|
32
|
+
});
|
|
33
|
+
}, 0);
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
async function runBackgroundUpdateCheck(client, directory, autoUpdate) {
|
|
38
|
+
const pluginInfo = findPluginEntry(directory);
|
|
39
|
+
if (!pluginInfo) {
|
|
40
|
+
debugLog("[auto-update-checker] Plugin not found in config");
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const cachedVersion = getCachedVersion();
|
|
44
|
+
const currentVersion = cachedVersion ?? pluginInfo.pinnedVersion;
|
|
45
|
+
if (!currentVersion) {
|
|
46
|
+
debugLog("[auto-update-checker] No version found (cached or pinned)");
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const latestVersion = await getLatestVersion();
|
|
50
|
+
if (!latestVersion) {
|
|
51
|
+
debugLog("[auto-update-checker] Failed to fetch latest version");
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (currentVersion === latestVersion) {
|
|
55
|
+
debugLog("[auto-update-checker] Already on latest version");
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
debugLog(`[auto-update-checker] Update available: ${currentVersion} → ${latestVersion}`);
|
|
59
|
+
if (!autoUpdate) {
|
|
60
|
+
await showUpdateAvailableToast(client, latestVersion);
|
|
61
|
+
debugLog("[auto-update-checker] Auto-update disabled, notification only");
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (pluginInfo.isPinned) {
|
|
65
|
+
const updated = updatePinnedVersion(pluginInfo.configPath, pluginInfo.entry, latestVersion);
|
|
66
|
+
if (updated) {
|
|
67
|
+
invalidatePackage(PACKAGE_NAME);
|
|
68
|
+
await showAutoUpdatedToast(client, currentVersion, latestVersion);
|
|
69
|
+
debugLog(`[auto-update-checker] Config updated: ${pluginInfo.entry} → ${PACKAGE_NAME}@${latestVersion}`);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
await showUpdateAvailableToast(client, latestVersion);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
invalidatePackage(PACKAGE_NAME);
|
|
77
|
+
await showUpdateAvailableToast(client, latestVersion);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async function showUpdateAvailableToast(client, latestVersion) {
|
|
81
|
+
await client.tui
|
|
82
|
+
.showToast({
|
|
83
|
+
body: {
|
|
84
|
+
title: `Antigravity Auth Update`,
|
|
85
|
+
message: `v${latestVersion} available. Restart OpenCode to apply.`,
|
|
86
|
+
variant: "info",
|
|
87
|
+
duration: 8000,
|
|
88
|
+
},
|
|
89
|
+
})
|
|
90
|
+
.catch(() => { });
|
|
91
|
+
debugLog(`[auto-update-checker] Update available toast shown: v${latestVersion}`);
|
|
92
|
+
}
|
|
93
|
+
async function showAutoUpdatedToast(client, oldVersion, newVersion) {
|
|
94
|
+
await client.tui
|
|
95
|
+
.showToast({
|
|
96
|
+
body: {
|
|
97
|
+
title: `Antigravity Auth Updated!`,
|
|
98
|
+
message: `v${oldVersion} → v${newVersion}\nRestart OpenCode to apply.`,
|
|
99
|
+
variant: "success",
|
|
100
|
+
duration: 8000,
|
|
101
|
+
},
|
|
102
|
+
})
|
|
103
|
+
.catch(() => { });
|
|
104
|
+
debugLog(`[auto-update-checker] Auto-updated toast shown: v${oldVersion} → v${newVersion}`);
|
|
105
|
+
}
|
|
106
|
+
async function showLocalDevToast(client, version) {
|
|
107
|
+
await client.tui
|
|
108
|
+
.showToast({
|
|
109
|
+
body: {
|
|
110
|
+
title: `Antigravity Auth ${version} (dev)`,
|
|
111
|
+
message: "Running in local development mode.",
|
|
112
|
+
variant: "warning",
|
|
113
|
+
duration: 5000,
|
|
114
|
+
},
|
|
115
|
+
})
|
|
116
|
+
.catch(() => { });
|
|
117
|
+
debugLog(`[auto-update-checker] Local dev toast shown: v${version}`);
|
|
118
|
+
}
|
|
119
|
+
export { checkForUpdate, getCachedVersion, getLatestVersion } from "./checker";
|
|
120
|
+
export { invalidatePackage, invalidateCache } from "./cache";
|
|
121
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/hooks/auto-update-checker/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface NpmDistTags {
|
|
2
|
+
latest: string;
|
|
3
|
+
[key: string]: string;
|
|
4
|
+
}
|
|
5
|
+
export interface OpencodeConfig {
|
|
6
|
+
plugin?: string[];
|
|
7
|
+
[key: string]: unknown;
|
|
8
|
+
}
|
|
9
|
+
export interface PackageJson {
|
|
10
|
+
version: string;
|
|
11
|
+
name?: string;
|
|
12
|
+
[key: string]: unknown;
|
|
13
|
+
}
|
|
14
|
+
export interface UpdateCheckResult {
|
|
15
|
+
needsUpdate: boolean;
|
|
16
|
+
currentVersion: string | null;
|
|
17
|
+
latestVersion: string | null;
|
|
18
|
+
isLocalDev: boolean;
|
|
19
|
+
isPinned: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface AutoUpdateCheckerOptions {
|
|
22
|
+
showStartupToast?: boolean;
|
|
23
|
+
autoUpdate?: boolean;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/hooks/auto-update-checker/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/hooks/auto-update-checker/types.ts"],"names":[],"mappings":""}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { type AccountStorage } from "./storage";
|
|
1
|
+
import { type AccountStorage, type RateLimitState, type ModelFamily } from "./storage";
|
|
2
2
|
import type { OAuthAuthDetails, RefreshParts } from "./types";
|
|
3
|
+
export type { ModelFamily } from "./storage";
|
|
3
4
|
export interface ManagedAccount {
|
|
4
5
|
index: number;
|
|
5
6
|
email?: string;
|
|
@@ -8,30 +9,40 @@ export interface ManagedAccount {
|
|
|
8
9
|
parts: RefreshParts;
|
|
9
10
|
access?: string;
|
|
10
11
|
expires?: number;
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
rateLimitResetTimes: RateLimitState;
|
|
13
|
+
lastSwitchReason?: "rate-limit" | "initial" | "rotation";
|
|
13
14
|
}
|
|
14
15
|
/**
|
|
15
|
-
* In-memory multi-account manager
|
|
16
|
+
* In-memory multi-account manager with sticky account selection.
|
|
17
|
+
*
|
|
18
|
+
* Uses the same account until it hits a rate limit (429), then switches.
|
|
19
|
+
* Rate limits are tracked per-model-family (claude/gemini) so an account
|
|
20
|
+
* rate-limited for Claude can still be used for Gemini.
|
|
16
21
|
*
|
|
17
22
|
* Source of truth for the pool is `antigravity-accounts.json`.
|
|
18
23
|
*/
|
|
19
24
|
export declare class AccountManager {
|
|
20
25
|
private accounts;
|
|
21
26
|
private cursor;
|
|
27
|
+
private currentAccountIndex;
|
|
28
|
+
private lastToastAccountIndex;
|
|
29
|
+
private lastToastTime;
|
|
22
30
|
static loadFromDisk(authFallback?: OAuthAuthDetails): Promise<AccountManager>;
|
|
23
31
|
constructor(authFallback?: OAuthAuthDetails, stored?: AccountStorage | null);
|
|
24
32
|
getAccountCount(): number;
|
|
25
33
|
getAccountsSnapshot(): ManagedAccount[];
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
34
|
+
getCurrentAccount(): ManagedAccount | null;
|
|
35
|
+
markSwitched(account: ManagedAccount, reason: "rate-limit" | "initial" | "rotation"): void;
|
|
36
|
+
shouldShowAccountToast(accountIndex: number, debounceMs?: number): boolean;
|
|
37
|
+
markToastShown(accountIndex: number): void;
|
|
38
|
+
getCurrentOrNextForFamily(family: ModelFamily): ManagedAccount | null;
|
|
39
|
+
getNextForFamily(family: ModelFamily): ManagedAccount | null;
|
|
40
|
+
markRateLimited(account: ManagedAccount, retryAfterMs: number, family: ModelFamily): void;
|
|
31
41
|
removeAccount(account: ManagedAccount): boolean;
|
|
32
42
|
updateFromAuth(account: ManagedAccount, auth: OAuthAuthDetails): void;
|
|
33
43
|
toAuthDetails(account: ManagedAccount): OAuthAuthDetails;
|
|
34
|
-
|
|
44
|
+
getMinWaitTimeForFamily(family: ModelFamily): number;
|
|
45
|
+
getAccounts(): ManagedAccount[];
|
|
35
46
|
saveToDisk(): Promise<void>;
|
|
36
47
|
}
|
|
37
48
|
//# sourceMappingURL=accounts.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../../src/plugin/accounts.ts"],"names":[],"mappings":"AACA,OAAO,EAA8B,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../../src/plugin/accounts.ts"],"names":[],"mappings":"AACA,OAAO,EAA8B,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AACnH,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE9D,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,cAAc,CAAC;IACpC,gBAAgB,CAAC,EAAE,YAAY,GAAG,SAAS,GAAG,UAAU,CAAC;CAC1D;AA4BD;;;;;;;;GAQG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,mBAAmB,CAAM;IACjC,OAAO,CAAC,qBAAqB,CAAM;IACnC,OAAO,CAAC,aAAa,CAAK;WAEb,YAAY,CAAC,YAAY,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;gBAKvE,YAAY,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,IAAI;IAwE3E,eAAe,IAAI,MAAM;IAIzB,mBAAmB,IAAI,cAAc,EAAE;IAIvC,iBAAiB,IAAI,cAAc,GAAG,IAAI;IAO1C,YAAY,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,IAAI;IAK1F,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,SAAQ,GAAG,OAAO;IAQzE,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAK1C,yBAAyB,CAAC,MAAM,EAAE,WAAW,GAAG,cAAc,GAAG,IAAI;IAiBrE,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,cAAc,GAAG,IAAI;IAoB5D,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI;IAIzF,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO;IAgC/C,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAOrE,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,gBAAgB;IASxD,uBAAuB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM;IAiBpD,WAAW,IAAI,cAAc,EAAE;IAIzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAkBlC"}
|