opencode-antigravity-auth 1.0.7 → 1.1.0
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 +29 -7
- package/dist/src/plugin/accounts.d.ts +37 -0
- package/dist/src/plugin/accounts.d.ts.map +1 -0
- package/dist/src/plugin/accounts.js +190 -0
- package/dist/src/plugin/accounts.js.map +1 -0
- package/dist/src/plugin/accounts.test.d.ts +2 -0
- package/dist/src/plugin/accounts.test.d.ts.map +1 -0
- package/dist/src/plugin/accounts.test.js +139 -0
- package/dist/src/plugin/accounts.test.js.map +1 -0
- package/dist/src/plugin/cli.d.ts +4 -0
- package/dist/src/plugin/cli.d.ts.map +1 -1
- package/dist/src/plugin/cli.js +14 -0
- package/dist/src/plugin/cli.js.map +1 -1
- package/dist/src/plugin/project.d.ts +2 -2
- package/dist/src/plugin/project.d.ts.map +1 -1
- package/dist/src/plugin/project.js +1 -5
- package/dist/src/plugin/project.js.map +1 -1
- package/dist/src/plugin/storage.d.ts +24 -0
- package/dist/src/plugin/storage.d.ts.map +1 -0
- package/dist/src/plugin/storage.js +47 -0
- package/dist/src/plugin/storage.js.map +1 -0
- package/dist/src/plugin/token.d.ts +13 -0
- package/dist/src/plugin/token.d.ts.map +1 -1
- package/dist/src/plugin/token.js +29 -30
- package/dist/src/plugin/token.js.map +1 -1
- package/dist/src/plugin/token.test.js +19 -11
- package/dist/src/plugin/token.test.js.map +1 -1
- package/dist/src/plugin/types.d.ts +30 -6
- package/dist/src/plugin/types.d.ts.map +1 -1
- package/dist/src/plugin.d.ts.map +1 -1
- package/dist/src/plugin.js +449 -124
- package/dist/src/plugin.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
function getConfigDir() {
|
|
5
|
+
const platform = process.platform;
|
|
6
|
+
if (platform === "win32") {
|
|
7
|
+
return join(process.env.APPDATA || join(homedir(), "AppData", "Roaming"), "opencode");
|
|
8
|
+
}
|
|
9
|
+
const xdgConfig = process.env.XDG_CONFIG_HOME || join(homedir(), ".config");
|
|
10
|
+
return join(xdgConfig, "opencode");
|
|
11
|
+
}
|
|
12
|
+
export function getStoragePath() {
|
|
13
|
+
return join(getConfigDir(), "antigravity-accounts.json");
|
|
14
|
+
}
|
|
15
|
+
export async function loadAccounts() {
|
|
16
|
+
try {
|
|
17
|
+
const path = getStoragePath();
|
|
18
|
+
const content = await fs.readFile(path, "utf-8");
|
|
19
|
+
const parsed = JSON.parse(content);
|
|
20
|
+
if (parsed.version !== 1 || !Array.isArray(parsed.accounts)) {
|
|
21
|
+
console.warn("[opencode-antigravity-auth] Invalid account storage format, ignoring");
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
version: 1,
|
|
26
|
+
accounts: parsed.accounts.filter((a) => {
|
|
27
|
+
return !!a && typeof a === "object" && typeof a.refreshToken === "string";
|
|
28
|
+
}),
|
|
29
|
+
activeIndex: typeof parsed.activeIndex === "number" && Number.isFinite(parsed.activeIndex) ? parsed.activeIndex : 0,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
const code = error.code;
|
|
34
|
+
if (code === "ENOENT") {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
console.error("[opencode-antigravity-auth] Failed to load account storage:", error);
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export async function saveAccounts(storage) {
|
|
42
|
+
const path = getStoragePath();
|
|
43
|
+
await fs.mkdir(dirname(path), { recursive: true });
|
|
44
|
+
const content = JSON.stringify(storage, null, 2);
|
|
45
|
+
await fs.writeFile(path, content, "utf-8");
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/plugin/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAwBlC,SAAS,YAAY;IACnB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,UAAU,CAAC,CAAC;IACxF,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IAC5E,OAAO,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,2BAA2B,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;QAE9D,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5D,OAAO,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;YACrF,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAwB,EAAE;gBAC3D,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAQ,CAAqB,CAAC,YAAY,KAAK,QAAQ,CAAC;YACjG,CAAC,CAAC;YACF,WAAW,EAAE,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;SACpH,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAI,KAA+B,CAAC,IAAI,CAAC;QACnD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,6DAA6D,EAAE,KAAK,CAAC,CAAC;QACpF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAuB;IACxD,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAC9B,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEnD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACjD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -1,4 +1,17 @@
|
|
|
1
1
|
import type { OAuthAuthDetails, PluginClient } from "./types";
|
|
2
|
+
export declare class AntigravityTokenRefreshError extends Error {
|
|
3
|
+
code?: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
status: number;
|
|
6
|
+
statusText: string;
|
|
7
|
+
constructor(options: {
|
|
8
|
+
message: string;
|
|
9
|
+
code?: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
status: number;
|
|
12
|
+
statusText: string;
|
|
13
|
+
});
|
|
14
|
+
}
|
|
2
15
|
/**
|
|
3
16
|
* Refreshes an Antigravity OAuth access token, updates persisted credentials, and handles revocation.
|
|
4
17
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../src/plugin/token.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../../src/plugin/token.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAgB,MAAM,SAAS,CAAC;AAoD5E,qBAAa,4BAA6B,SAAQ,KAAK;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;gBAEP,OAAO,EAAE;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;KACpB;CAQF;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,gBAAgB,EACtB,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAiFvC"}
|
package/dist/src/plugin/token.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ANTIGRAVITY_CLIENT_ID, ANTIGRAVITY_CLIENT_SECRET
|
|
1
|
+
import { ANTIGRAVITY_CLIENT_ID, ANTIGRAVITY_CLIENT_SECRET } from "../constants";
|
|
2
2
|
import { formatRefreshParts, parseRefreshParts } from "./auth";
|
|
3
3
|
import { clearCachedAuth, storeCachedAuth } from "./cache";
|
|
4
4
|
import { invalidateProjectContextCache } from "./project";
|
|
@@ -37,6 +37,20 @@ function parseOAuthErrorPayload(text) {
|
|
|
37
37
|
return { description: text };
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
|
+
export class AntigravityTokenRefreshError extends Error {
|
|
41
|
+
code;
|
|
42
|
+
description;
|
|
43
|
+
status;
|
|
44
|
+
statusText;
|
|
45
|
+
constructor(options) {
|
|
46
|
+
super(options.message);
|
|
47
|
+
this.name = "AntigravityTokenRefreshError";
|
|
48
|
+
this.code = options.code;
|
|
49
|
+
this.description = options.description;
|
|
50
|
+
this.status = options.status;
|
|
51
|
+
this.statusText = options.statusText;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
40
54
|
/**
|
|
41
55
|
* Refreshes an Antigravity OAuth access token, updates persisted credentials, and handles revocation.
|
|
42
56
|
*/
|
|
@@ -69,29 +83,20 @@ export async function refreshAccessToken(auth, client, providerId) {
|
|
|
69
83
|
const { code, description } = parseOAuthErrorPayload(errorText);
|
|
70
84
|
const details = [code, description ?? errorText].filter(Boolean).join(": ");
|
|
71
85
|
const baseMessage = `Antigravity token refresh failed (${response.status} ${response.statusText})`;
|
|
72
|
-
|
|
86
|
+
const message = details ? `${baseMessage} - ${details}` : baseMessage;
|
|
87
|
+
console.warn(`[Antigravity OAuth] ${message}`);
|
|
73
88
|
if (code === "invalid_grant") {
|
|
74
|
-
console.warn("[Antigravity OAuth] Google revoked the stored refresh token.
|
|
89
|
+
console.warn("[Antigravity OAuth] Google revoked the stored refresh token for this account. Reauthenticate it via `opencode auth login`.");
|
|
75
90
|
invalidateProjectContextCache(auth.refresh);
|
|
76
|
-
|
|
77
|
-
const clearedAuth = {
|
|
78
|
-
type: "oauth",
|
|
79
|
-
refresh: formatRefreshParts({
|
|
80
|
-
refreshToken: "",
|
|
81
|
-
projectId: parts.projectId,
|
|
82
|
-
managedProjectId: parts.managedProjectId,
|
|
83
|
-
}),
|
|
84
|
-
};
|
|
85
|
-
await client.auth.set({
|
|
86
|
-
path: { id: providerId },
|
|
87
|
-
body: clearedAuth,
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
catch (storeError) {
|
|
91
|
-
console.error("Failed to clear stored Antigravity OAuth credentials:", storeError);
|
|
92
|
-
}
|
|
91
|
+
clearCachedAuth(auth.refresh);
|
|
93
92
|
}
|
|
94
|
-
|
|
93
|
+
throw new AntigravityTokenRefreshError({
|
|
94
|
+
message,
|
|
95
|
+
code,
|
|
96
|
+
description: description ?? errorText,
|
|
97
|
+
status: response.status,
|
|
98
|
+
statusText: response.statusText,
|
|
99
|
+
});
|
|
95
100
|
}
|
|
96
101
|
const payload = (await response.json());
|
|
97
102
|
const refreshedParts = {
|
|
@@ -107,18 +112,12 @@ export async function refreshAccessToken(auth, client, providerId) {
|
|
|
107
112
|
};
|
|
108
113
|
storeCachedAuth(updatedAuth);
|
|
109
114
|
invalidateProjectContextCache(auth.refresh);
|
|
110
|
-
try {
|
|
111
|
-
await client.auth.set({
|
|
112
|
-
path: { id: providerId },
|
|
113
|
-
body: updatedAuth,
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
catch (storeError) {
|
|
117
|
-
console.error("Failed to persist refreshed Antigravity OAuth credentials:", storeError);
|
|
118
|
-
}
|
|
119
115
|
return updatedAuth;
|
|
120
116
|
}
|
|
121
117
|
catch (error) {
|
|
118
|
+
if (error instanceof AntigravityTokenRefreshError) {
|
|
119
|
+
throw error;
|
|
120
|
+
}
|
|
122
121
|
console.error("Failed to refresh Antigravity access token due to an unexpected error:", error);
|
|
123
122
|
return undefined;
|
|
124
123
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/plugin/token.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/plugin/token.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
2
2
|
import { ANTIGRAVITY_PROVIDER_ID } from "../constants";
|
|
3
|
-
import { refreshAccessToken } from "./token";
|
|
3
|
+
import { AntigravityTokenRefreshError, refreshAccessToken } from "./token";
|
|
4
4
|
const baseAuth = {
|
|
5
5
|
type: "oauth",
|
|
6
6
|
refresh: "refresh-token|project-123",
|
|
@@ -18,7 +18,7 @@ describe("refreshAccessToken", () => {
|
|
|
18
18
|
beforeEach(() => {
|
|
19
19
|
vi.restoreAllMocks();
|
|
20
20
|
});
|
|
21
|
-
it("updates the caller
|
|
21
|
+
it("updates the caller when refresh token is unchanged", async () => {
|
|
22
22
|
const client = createClient();
|
|
23
23
|
const fetchMock = vi.fn(async () => {
|
|
24
24
|
return new Response(JSON.stringify({
|
|
@@ -29,9 +29,9 @@ describe("refreshAccessToken", () => {
|
|
|
29
29
|
global.fetch = fetchMock;
|
|
30
30
|
const result = await refreshAccessToken(baseAuth, client, ANTIGRAVITY_PROVIDER_ID);
|
|
31
31
|
expect(result?.access).toBe("new-access");
|
|
32
|
-
expect(client.auth.set.mock.calls.length).toBe(
|
|
32
|
+
expect(client.auth.set.mock.calls.length).toBe(0);
|
|
33
33
|
});
|
|
34
|
-
it("
|
|
34
|
+
it("handles Google refresh token rotation", async () => {
|
|
35
35
|
const client = createClient();
|
|
36
36
|
const fetchMock = vi.fn(async () => {
|
|
37
37
|
return new Response(JSON.stringify({
|
|
@@ -43,13 +43,21 @@ describe("refreshAccessToken", () => {
|
|
|
43
43
|
global.fetch = fetchMock;
|
|
44
44
|
const result = await refreshAccessToken(baseAuth, client, ANTIGRAVITY_PROVIDER_ID);
|
|
45
45
|
expect(result?.access).toBe("next-access");
|
|
46
|
-
expect(
|
|
47
|
-
expect(client.auth.set.mock.calls
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
46
|
+
expect(result?.refresh).toContain("rotated-token");
|
|
47
|
+
expect(client.auth.set.mock.calls.length).toBe(0);
|
|
48
|
+
});
|
|
49
|
+
it("throws a typed error on invalid_grant", async () => {
|
|
50
|
+
const client = createClient();
|
|
51
|
+
const fetchMock = vi.fn(async () => {
|
|
52
|
+
return new Response(JSON.stringify({
|
|
53
|
+
error: "invalid_grant",
|
|
54
|
+
error_description: "Refresh token revoked",
|
|
55
|
+
}), { status: 400, statusText: "Bad Request" });
|
|
56
|
+
});
|
|
57
|
+
global.fetch = fetchMock;
|
|
58
|
+
await expect(refreshAccessToken(baseAuth, client, ANTIGRAVITY_PROVIDER_ID)).rejects.toMatchObject({
|
|
59
|
+
name: "AntigravityTokenRefreshError",
|
|
60
|
+
code: "invalid_grant",
|
|
53
61
|
});
|
|
54
62
|
});
|
|
55
63
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.test.js","sourceRoot":"","sources":["../../../src/plugin/token.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"token.test.js","sourceRoot":"","sources":["../../../src/plugin/token.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,4BAA4B,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAG3E,MAAM,QAAQ,GAAqB;IACjC,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,2BAA2B;IACpC,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI;CAC3B,CAAC;AAEF,SAAS,YAAY;IACnB,OAAO;QACL,IAAI,EAAE;YACJ,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC;SAC3B;KAGF,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;YACjC,OAAO,IAAI,QAAQ,CACjB,IAAI,CAAC,SAAS,CAAC;gBACb,YAAY,EAAE,YAAY;gBAC1B,UAAU,EAAE,IAAI;aACjB,CAAC,EACF,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,GAAG,SAAoC,CAAC;QAEpD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,uBAAuB,CAAC,CAAC;QAEnF,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;YACjC,OAAO,IAAI,QAAQ,CACjB,IAAI,CAAC,SAAS,CAAC;gBACb,YAAY,EAAE,aAAa;gBAC3B,UAAU,EAAE,IAAI;gBAChB,aAAa,EAAE,eAAe;aAC/B,CAAC,EACF,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,GAAG,SAAoC,CAAC;QAEpD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,uBAAuB,CAAC,CAAC;QAEnF,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;YACjC,OAAO,IAAI,QAAQ,CACjB,IAAI,CAAC,SAAS,CAAC;gBACb,KAAK,EAAE,eAAe;gBACtB,iBAAiB,EAAE,uBAAuB;aAC3C,CAAC,EACF,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,aAAa,EAAE,CAC3C,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,GAAG,SAAoC,CAAC;QAEpD,MAAM,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,uBAAuB,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;YAChG,IAAI,EAAE,8BAA8B;YACpC,IAAI,EAAE,eAAe;SACtB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -25,16 +25,40 @@ export interface LoaderResult {
|
|
|
25
25
|
apiKey: string;
|
|
26
26
|
fetch(input: RequestInfo, init?: RequestInit): Promise<Response>;
|
|
27
27
|
}
|
|
28
|
+
export type AuthPrompt = {
|
|
29
|
+
type: "text";
|
|
30
|
+
key: string;
|
|
31
|
+
message: string;
|
|
32
|
+
placeholder?: string;
|
|
33
|
+
validate?: (value: string) => string | undefined;
|
|
34
|
+
condition?: (inputs: Record<string, string>) => boolean;
|
|
35
|
+
} | {
|
|
36
|
+
type: "select";
|
|
37
|
+
key: string;
|
|
38
|
+
message: string;
|
|
39
|
+
options: Array<{
|
|
40
|
+
label: string;
|
|
41
|
+
value: string;
|
|
42
|
+
hint?: string;
|
|
43
|
+
}>;
|
|
44
|
+
condition?: (inputs: Record<string, string>) => boolean;
|
|
45
|
+
};
|
|
46
|
+
export type OAuthAuthorizationResult = {
|
|
47
|
+
url: string;
|
|
48
|
+
instructions: string;
|
|
49
|
+
} & ({
|
|
50
|
+
method: "auto";
|
|
51
|
+
callback: () => Promise<AntigravityTokenExchangeResult>;
|
|
52
|
+
} | {
|
|
53
|
+
method: "code";
|
|
54
|
+
callback: (code: string) => Promise<AntigravityTokenExchangeResult>;
|
|
55
|
+
});
|
|
28
56
|
export interface AuthMethod {
|
|
29
57
|
provider?: string;
|
|
30
58
|
label: string;
|
|
31
59
|
type: "oauth" | "api";
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
instructions: string;
|
|
35
|
-
method: string;
|
|
36
|
-
callback: (callbackUrl: string) => Promise<AntigravityTokenExchangeResult>;
|
|
37
|
-
}>;
|
|
60
|
+
prompts?: AuthPrompt[];
|
|
61
|
+
authorize?: (inputs?: Record<string, string>) => Promise<OAuthAuthorizationResult>;
|
|
38
62
|
}
|
|
39
63
|
export interface PluginClient {
|
|
40
64
|
auth: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/plugin/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,sBAAsB,CAAC;AAE3E,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,WAAW,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;AAEjE,MAAM,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;AAEjD,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CAClE;AAED,MAAM,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/plugin/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,sBAAsB,CAAC;AAE3E,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,WAAW,GAAG,gBAAgB,GAAG,mBAAmB,CAAC;AAEjE,MAAM,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;AAEjD,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CAClE;AAED,MAAM,MAAM,UAAU,GAClB;IACE,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACjD,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC;CACzD,GACD;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChE,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC;CACzD,CAAC;AAEN,MAAM,MAAM,wBAAwB,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAAG,CAC3E;IACE,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,OAAO,CAAC,8BAA8B,CAAC,CAAC;CACzD,GACD;IACE,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,8BAA8B,CAAC,CAAC;CACrE,CACJ,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,GAAG,KAAK,CAAC;IACtB,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;CACpF;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE;QACJ,GAAG,CAAC,KAAK,EAAE;YAAE,IAAI,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAA;aAAE,CAAC;YAAC,IAAI,EAAE,gBAAgB,CAAA;SAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KAC7E,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;QAC/E,OAAO,EAAE,UAAU,EAAE,CAAC;KACvB,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,gBAAgB,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;CAC5B"}
|
package/dist/src/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAGV,aAAa,EACb,YAAY,EAGb,MAAM,gBAAgB,CAAC;AAiLxB;;GAEG;AACH,eAAO,MAAM,uBAAuB,GAAI,YAAY,MAAM,MACxD,YAAY,aAAa,KACxB,OAAO,CAAC,YAAY,CAofrB,CAAC;AAEH,eAAO,MAAM,yBAAyB,eAvfxB,aAAa,KACxB,OAAO,CAAC,YAAY,CAsfkE,CAAC;AAC1F,eAAO,MAAM,iBAAiB,eAxfhB,aAAa,KACxB,OAAO,CAAC,YAAY,CAufmC,CAAC"}
|