@spinabot/brigade 1.19.4 → 1.21.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 +4 -3
- package/convex/config.d.ts +2 -2
- package/convex/schema.d.ts +4 -4
- package/dist/agents/agent-loop.d.ts.map +1 -1
- package/dist/agents/agent-loop.js +92 -22
- package/dist/agents/agent-loop.js.map +1 -1
- package/dist/agents/content-quality-retry.d.ts.map +1 -1
- package/dist/agents/content-quality-retry.js +3 -22
- package/dist/agents/content-quality-retry.js.map +1 -1
- package/dist/agents/error-classifier.d.ts.map +1 -1
- package/dist/agents/error-classifier.js +2 -0
- package/dist/agents/error-classifier.js.map +1 -1
- package/dist/agents/memory/extract.d.ts.map +1 -1
- package/dist/agents/memory/extract.js +11 -44
- package/dist/agents/memory/extract.js.map +1 -1
- package/dist/agents/model-resolution.d.ts.map +1 -1
- package/dist/agents/model-resolution.js +9 -3
- package/dist/agents/model-resolution.js.map +1 -1
- package/dist/agents/ollama-native/ollama-json.d.ts +6 -0
- package/dist/agents/ollama-native/ollama-json.d.ts.map +1 -0
- package/dist/agents/ollama-native/ollama-json.js +126 -0
- package/dist/agents/ollama-native/ollama-json.js.map +1 -0
- package/dist/agents/ollama-native/register.d.ts +12 -0
- package/dist/agents/ollama-native/register.d.ts.map +1 -0
- package/dist/agents/ollama-native/register.js +37 -0
- package/dist/agents/ollama-native/register.js.map +1 -0
- package/dist/agents/ollama-native/stream.d.ts +59 -0
- package/dist/agents/ollama-native/stream.d.ts.map +1 -0
- package/dist/agents/ollama-native/stream.js +532 -0
- package/dist/agents/ollama-native/stream.js.map +1 -0
- package/dist/agents/payload-mutators.d.ts +0 -21
- package/dist/agents/payload-mutators.d.ts.map +1 -1
- package/dist/agents/payload-mutators.js +0 -58
- package/dist/agents/payload-mutators.js.map +1 -1
- package/dist/agents/thinking-fallback.d.ts.map +1 -1
- package/dist/agents/thinking-fallback.js +32 -10
- package/dist/agents/thinking-fallback.js.map +1 -1
- package/dist/buildstamp.json +1 -1
- package/dist/cli/commands/connect.d.ts.map +1 -1
- package/dist/cli/commands/connect.js +31 -43
- package/dist/cli/commands/connect.js.map +1 -1
- package/dist/cli/commands/update.d.ts +0 -6
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +9 -124
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/program/build-program.d.ts.map +1 -1
- package/dist/cli/program/build-program.js +1 -5
- package/dist/cli/program/build-program.js.map +1 -1
- package/dist/core/server.d.ts.map +1 -1
- package/dist/core/server.js +43 -25
- package/dist/core/server.js.map +1 -1
- package/dist/integrations/antigravity/transport.d.ts +29 -0
- package/dist/integrations/antigravity/transport.d.ts.map +1 -0
- package/dist/integrations/antigravity/transport.js +498 -0
- package/dist/integrations/antigravity/transport.js.map +1 -0
- package/dist/integrations/cli-login.d.ts +13 -0
- package/dist/integrations/cli-login.d.ts.map +1 -1
- package/dist/integrations/cli-login.js +29 -0
- package/dist/integrations/cli-login.js.map +1 -1
- package/dist/integrations/ollama.d.ts +29 -36
- package/dist/integrations/ollama.d.ts.map +1 -1
- package/dist/integrations/ollama.js +213 -78
- package/dist/integrations/ollama.js.map +1 -1
- package/dist/integrations/provider-discovery.d.ts +37 -0
- package/dist/integrations/provider-discovery.d.ts.map +1 -1
- package/dist/integrations/provider-discovery.js +102 -0
- package/dist/integrations/provider-discovery.js.map +1 -1
- package/dist/providers/catalog.d.ts +8 -1
- package/dist/providers/catalog.d.ts.map +1 -1
- package/dist/providers/catalog.js +29 -1
- package/dist/providers/catalog.js.map +1 -1
- package/dist/providers/validate-key.js +1 -1
- package/dist/storage/boot.d.ts.map +1 -1
- package/dist/storage/boot.js +2 -1
- package/dist/storage/boot.js.map +1 -1
- package/dist/storage/convex/index.d.ts.map +1 -1
- package/dist/storage/convex/index.js +15 -4
- package/dist/storage/convex/index.js.map +1 -1
- package/dist/system-prompt/guidance.d.ts.map +1 -1
- package/dist/system-prompt/guidance.js +2 -9
- package/dist/system-prompt/guidance.js.map +1 -1
- package/dist/ui/onboard-storage-mode.js +30 -4
- package/dist/ui/onboard-storage-mode.js.map +1 -1
- package/dist/ui/onboarding.d.ts.map +1 -1
- package/dist/ui/onboarding.js +150 -32
- package/dist/ui/onboarding.js.map +1 -1
- package/package.json +5 -2
- package/scripts/convex-push.mjs +47 -29
- package/dist/agents/tool-name-repair.d.ts +0 -28
- package/dist/agents/tool-name-repair.d.ts.map +0 -1
- package/dist/agents/tool-name-repair.js +0 -168
- package/dist/agents/tool-name-repair.js.map +0 -1
- package/dist/shared/reasoning-tags.d.ts +0 -14
- package/dist/shared/reasoning-tags.d.ts.map +0 -1
- package/dist/shared/reasoning-tags.js +0 -71
- package/dist/shared/reasoning-tags.js.map +0 -1
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { OAuthProviderInterface } from "@earendil-works/pi-ai/oauth";
|
|
2
|
+
import type { StreamFn } from "@earendil-works/pi-agent-core";
|
|
3
|
+
export declare const ANTIGRAVITY_API = "antigravity";
|
|
4
|
+
export declare const ANTIGRAVITY_PROVIDER = "antigravity";
|
|
5
|
+
export declare const ANTIGRAVITY_OAUTH_ID = "antigravity";
|
|
6
|
+
/** Cloud Code Assist base — models are served here, NOT the public Gemini API. */
|
|
7
|
+
export declare const CLOUD_CODE_ASSIST_BASE = "https://cloudcode-pa.googleapis.com";
|
|
8
|
+
export declare function generatePkce(): {
|
|
9
|
+
verifier: string;
|
|
10
|
+
challenge: string;
|
|
11
|
+
};
|
|
12
|
+
/** Parse a pasted authorization code or full redirect URL. Throws on state mismatch. */
|
|
13
|
+
export declare function parseAuthCode(input: string, expectedState: string): string | undefined;
|
|
14
|
+
export declare const antigravityOAuthProvider: OAuthProviderInterface;
|
|
15
|
+
/** Convert Pi's message array → Gemini `contents` (roles: user/model). */
|
|
16
|
+
export declare function toGeminiContents(messages: Array<{
|
|
17
|
+
role: string;
|
|
18
|
+
content: unknown;
|
|
19
|
+
}>): unknown[];
|
|
20
|
+
/** The Cloud Code Assist StreamFn. LIVE-VALIDATE: envelope + SSE field names. */
|
|
21
|
+
export declare function createAntigravityStreamFn(): StreamFn;
|
|
22
|
+
/**
|
|
23
|
+
* Idempotently register Antigravity's OAuth provider + `api:"antigravity"`
|
|
24
|
+
* transport. Guards on the LIVE registries (self-heals after Pi's
|
|
25
|
+
* resetApiProviders/resetOAuthProviders on refresh), same rationale as the
|
|
26
|
+
* Ollama-native registration. Safe to call at boot, per turn, and pre-login.
|
|
27
|
+
*/
|
|
28
|
+
export declare function ensureAntigravityRegistered(): void;
|
|
29
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/integrations/antigravity/transport.ts"],"names":[],"mappings":"AAsCA,OAAO,KAAK,EAGX,sBAAsB,EACtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAI9D,eAAO,MAAM,eAAe,gBAAgB,CAAC;AAC7C,eAAO,MAAM,oBAAoB,gBAAgB,CAAC;AAClD,eAAO,MAAM,oBAAoB,gBAAgB,CAAC;AAElD,kFAAkF;AAClF,eAAO,MAAM,sBAAsB,wCAAwC,CAAC;AA8F5E,wBAAgB,YAAY,IAAI;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAItE;AA4ED,wFAAwF;AACxF,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CActF;AAiCD,eAAO,MAAM,wBAAwB,EAAE,sBAsGtC,CAAC;AAeF,0EAA0E;AAC1E,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,GAAG,OAAO,EAAE,CAe/F;AAED,iFAAiF;AACjF,wBAAgB,yBAAyB,IAAI,QAAQ,CAqHpD;AAMD;;;;;GAKG;AACH,wBAAgB,2BAA2B,IAAI,IAAI,CAQlD"}
|
|
@@ -0,0 +1,498 @@
|
|
|
1
|
+
// Google Antigravity provider — OAuth login + a native transport for Google's
|
|
2
|
+
// Cloud Code Assist "/v1internal" API (the endpoint Antigravity/Gemini-CLI use).
|
|
3
|
+
//
|
|
4
|
+
// WHY a custom transport (not Pi's `google` provider): an Antigravity login does
|
|
5
|
+
// NOT grant the public Gemini API (generativelanguage.googleapis.com). Models are
|
|
6
|
+
// served only through the private Cloud Code Assist endpoint at
|
|
7
|
+
// `cloudcode-pa.googleapis.com/v1internal:streamGenerateContent`, which wraps
|
|
8
|
+
// Gemini `contents`/`parts` in a `{ project, model, request }` envelope and
|
|
9
|
+
// requires Antigravity's client headers. So we register a custom Pi OAuth provider
|
|
10
|
+
// (id "antigravity") + a custom Pi API provider (api "antigravity"), exactly like
|
|
11
|
+
// the Ollama-native pattern.
|
|
12
|
+
//
|
|
13
|
+
// ⚠ LIVE-VALIDATE: the `/v1internal` shape, headers, and the project-discovery
|
|
14
|
+
// handshake are reverse-engineered (Antigravity ships no public API). Everything
|
|
15
|
+
// tagged `LIVE-VALIDATE` below needs confirming against a real Antigravity account;
|
|
16
|
+
// the OAuth CLIENT_SECRET for the browser flow is the gemini-cli public value and
|
|
17
|
+
// must be filled in. The CLI-reuse path (~/.gemini/oauth_creds.json) needs neither.
|
|
18
|
+
import { createHash, randomBytes, randomUUID } from "node:crypto";
|
|
19
|
+
import { createServer } from "node:http";
|
|
20
|
+
import { createAssistantMessageEventStream, getApiProvider, registerApiProvider, } from "@earendil-works/pi-ai";
|
|
21
|
+
import { getOAuthProvider, registerOAuthProvider } from "@earendil-works/pi-ai/oauth";
|
|
22
|
+
/* ─────────────────────────── constants ─────────────────────────── */
|
|
23
|
+
export const ANTIGRAVITY_API = "antigravity";
|
|
24
|
+
export const ANTIGRAVITY_PROVIDER = "antigravity";
|
|
25
|
+
export const ANTIGRAVITY_OAUTH_ID = "antigravity";
|
|
26
|
+
/** Cloud Code Assist base — models are served here, NOT the public Gemini API. */
|
|
27
|
+
export const CLOUD_CODE_ASSIST_BASE = "https://cloudcode-pa.googleapis.com";
|
|
28
|
+
const STREAM_URL = `${CLOUD_CODE_ASSIST_BASE}/v1internal:streamGenerateContent?alt=sse`;
|
|
29
|
+
const LOAD_CODE_ASSIST_URL = `${CLOUD_CODE_ASSIST_BASE}/v1internal:loadCodeAssist`;
|
|
30
|
+
// OAuth client for Antigravity's Google sign-in — OPERATOR-SUPPLIED ONLY. Brigade
|
|
31
|
+
// ships NO client secret: GitHub push-protection AND our own safety guard block
|
|
32
|
+
// embedding it (obfuscated or not), and Google's Antigravity Terms prohibit
|
|
33
|
+
// third-party use with reports of account bans (see the catalog entry's warning).
|
|
34
|
+
// To enable browser sign-in, set BRIGADE_ANTIGRAVITY_CLIENT_ID + _SECRET (e.g. to
|
|
35
|
+
// the values a public Antigravity auth plugin uses, or your own Google OAuth
|
|
36
|
+
// client). Without them, browser login is unavailable and Brigade says so clearly.
|
|
37
|
+
const GOOGLE_CLIENT_ID = process.env.BRIGADE_ANTIGRAVITY_CLIENT_ID ?? "";
|
|
38
|
+
const GOOGLE_CLIENT_SECRET = process.env.BRIGADE_ANTIGRAVITY_CLIENT_SECRET ?? "";
|
|
39
|
+
const GOOGLE_TOKEN_URL = "https://oauth2.googleapis.com/token";
|
|
40
|
+
const GOOGLE_AUTH_URL = "https://accounts.google.com/o/oauth2/auth";
|
|
41
|
+
// Scopes the Antigravity client requests — including the cclog +
|
|
42
|
+
// experimentsandconfigs scopes its backend expects (per the reverse-engineered spec).
|
|
43
|
+
const OAUTH_SCOPES = [
|
|
44
|
+
"https://www.googleapis.com/auth/cloud-platform",
|
|
45
|
+
"https://www.googleapis.com/auth/userinfo.email",
|
|
46
|
+
"https://www.googleapis.com/auth/userinfo.profile",
|
|
47
|
+
"https://www.googleapis.com/auth/cclog",
|
|
48
|
+
"https://www.googleapis.com/auth/experimentsandconfigs",
|
|
49
|
+
];
|
|
50
|
+
/** Client platform tag the backend expects, from the host OS. */
|
|
51
|
+
function clientPlatform() {
|
|
52
|
+
return process.platform === "darwin" ? "MACOS" : process.platform === "win32" ? "WINDOWS" : "LINUX";
|
|
53
|
+
}
|
|
54
|
+
/** Headers every Cloud Code Assist call needs — the backend gates on ideType +
|
|
55
|
+
* client metadata. Mirrors the Antigravity client (per the reverse-engineered spec). */
|
|
56
|
+
function antigravityHeaders(accessToken) {
|
|
57
|
+
const arch = process.arch === "x64" ? "amd64" : process.arch;
|
|
58
|
+
const os = process.platform === "win32" ? "windows" : process.platform === "darwin" ? "darwin" : "linux";
|
|
59
|
+
return {
|
|
60
|
+
Authorization: `Bearer ${accessToken}`,
|
|
61
|
+
"Content-Type": "application/json",
|
|
62
|
+
"User-Agent": `antigravity/1.15.8 ${os}/${arch}`,
|
|
63
|
+
"X-Goog-Api-Client": "google-cloud-sdk vscode_cloudshelleditor/0.1",
|
|
64
|
+
"Client-Metadata": JSON.stringify({ ideType: "ANTIGRAVITY", platform: clientPlatform(), pluginType: "GEMINI" }),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/** Best-effort project discovery — the `/v1internal` envelope needs a project id.
|
|
68
|
+
* LIVE-VALIDATE: exact request/response shape of loadCodeAssist/onboardUser. */
|
|
69
|
+
async function discoverProject(accessToken) {
|
|
70
|
+
try {
|
|
71
|
+
const res = await fetch(LOAD_CODE_ASSIST_URL, {
|
|
72
|
+
method: "POST",
|
|
73
|
+
headers: antigravityHeaders(accessToken),
|
|
74
|
+
body: JSON.stringify({ metadata: { ideType: "ANTIGRAVITY" } }),
|
|
75
|
+
});
|
|
76
|
+
if (!res.ok)
|
|
77
|
+
return undefined;
|
|
78
|
+
const body = (await res.json());
|
|
79
|
+
return body.cloudaicompanionProject ?? body.project ?? undefined;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async function refreshGoogleToken(refresh) {
|
|
86
|
+
const res = await fetch(GOOGLE_TOKEN_URL, {
|
|
87
|
+
method: "POST",
|
|
88
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
89
|
+
body: new URLSearchParams({
|
|
90
|
+
grant_type: "refresh_token",
|
|
91
|
+
refresh_token: refresh,
|
|
92
|
+
client_id: GOOGLE_CLIENT_ID,
|
|
93
|
+
...(GOOGLE_CLIENT_SECRET ? { client_secret: GOOGLE_CLIENT_SECRET } : {}),
|
|
94
|
+
}).toString(),
|
|
95
|
+
});
|
|
96
|
+
if (!res.ok)
|
|
97
|
+
throw new Error(`Antigravity token refresh failed (${res.status})`);
|
|
98
|
+
const body = (await res.json());
|
|
99
|
+
return {
|
|
100
|
+
access: body.access_token,
|
|
101
|
+
refresh: body.refresh_token ?? refresh,
|
|
102
|
+
expires: Date.now() + (body.expires_in ?? 3600) * 1000,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/* ─────────── browser OAuth: PKCE + localhost loopback (like Pi's codex) ─────────── */
|
|
106
|
+
function base64url(buf) {
|
|
107
|
+
return buf.toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
108
|
+
}
|
|
109
|
+
export function generatePkce() {
|
|
110
|
+
const verifier = base64url(randomBytes(32));
|
|
111
|
+
const challenge = base64url(createHash("sha256").update(verifier).digest());
|
|
112
|
+
return { verifier, challenge };
|
|
113
|
+
}
|
|
114
|
+
function browserResultPage(message) {
|
|
115
|
+
return `<!doctype html><html><head><meta charset="utf-8"><title>Brigade · Antigravity</title></head><body style="font-family:system-ui,-apple-system,sans-serif;padding:3rem;text-align:center;color:#222"><h2>${message}</h2></body></html>`;
|
|
116
|
+
}
|
|
117
|
+
/** Localhost callback server on an ephemeral port; resolves with the code Google
|
|
118
|
+
* redirects back after the user approves. Mirrors Pi's codex loopback provider. */
|
|
119
|
+
async function startLoopbackServer(state) {
|
|
120
|
+
let settle;
|
|
121
|
+
let settled = false;
|
|
122
|
+
const waitForCodePromise = new Promise((resolve) => {
|
|
123
|
+
settle = (v) => {
|
|
124
|
+
if (settled)
|
|
125
|
+
return;
|
|
126
|
+
settled = true;
|
|
127
|
+
resolve(v);
|
|
128
|
+
};
|
|
129
|
+
});
|
|
130
|
+
const server = createServer((req, res) => {
|
|
131
|
+
try {
|
|
132
|
+
const url = new URL(req.url ?? "", "http://127.0.0.1");
|
|
133
|
+
if (url.pathname !== "/oauth2callback") {
|
|
134
|
+
res.statusCode = 404;
|
|
135
|
+
res.end("Not found");
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
res.setHeader("Content-Type", "text/html; charset=utf-8");
|
|
139
|
+
if (url.searchParams.get("state") !== state) {
|
|
140
|
+
res.statusCode = 400;
|
|
141
|
+
res.end(browserResultPage("Sign-in couldn't be verified (state mismatch). Close this window and try again."));
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const code = url.searchParams.get("code");
|
|
145
|
+
if (!code) {
|
|
146
|
+
const err = url.searchParams.get("error");
|
|
147
|
+
res.statusCode = 400;
|
|
148
|
+
res.end(browserResultPage(`Sign-in ${err ? `failed (${err})` : "was cancelled"}. You can close this window.`));
|
|
149
|
+
settle?.(null);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
res.statusCode = 200;
|
|
153
|
+
res.end(browserResultPage("Antigravity sign-in complete — close this window and return to Brigade."));
|
|
154
|
+
settle?.({ code });
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
res.statusCode = 500;
|
|
158
|
+
res.end("Internal error");
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
return new Promise((resolve, reject) => {
|
|
162
|
+
server.on("error", reject);
|
|
163
|
+
server.listen(0, "127.0.0.1", () => {
|
|
164
|
+
const addr = server.address();
|
|
165
|
+
const port = addr && typeof addr === "object" ? addr.port : 0;
|
|
166
|
+
resolve({
|
|
167
|
+
redirectUri: `http://127.0.0.1:${port}/oauth2callback`,
|
|
168
|
+
waitForCode: () => waitForCodePromise,
|
|
169
|
+
cancelWait: () => settle?.(null),
|
|
170
|
+
close: () => {
|
|
171
|
+
try {
|
|
172
|
+
server.close();
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
/* ignore */
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
/** Parse a pasted authorization code or full redirect URL. Throws on state mismatch. */
|
|
183
|
+
export function parseAuthCode(input, expectedState) {
|
|
184
|
+
const v = input.trim();
|
|
185
|
+
if (!v)
|
|
186
|
+
return undefined;
|
|
187
|
+
try {
|
|
188
|
+
const url = new URL(v);
|
|
189
|
+
const s = url.searchParams.get("state");
|
|
190
|
+
if (s && s !== expectedState)
|
|
191
|
+
throw new Error("__state_mismatch__");
|
|
192
|
+
return url.searchParams.get("code") ?? undefined;
|
|
193
|
+
}
|
|
194
|
+
catch (e) {
|
|
195
|
+
if (e instanceof Error && e.message === "__state_mismatch__") {
|
|
196
|
+
throw new Error("That code was from a different sign-in attempt — please retry.");
|
|
197
|
+
}
|
|
198
|
+
return v; // not a URL — treat the whole string as the raw code
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/** Exchange an authorization code for Google tokens (installed-app PKCE). */
|
|
202
|
+
async function exchangeAntigravityCode(code, verifier, redirectUri) {
|
|
203
|
+
const res = await fetch(GOOGLE_TOKEN_URL, {
|
|
204
|
+
method: "POST",
|
|
205
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
206
|
+
body: new URLSearchParams({
|
|
207
|
+
grant_type: "authorization_code",
|
|
208
|
+
code,
|
|
209
|
+
client_id: GOOGLE_CLIENT_ID,
|
|
210
|
+
...(GOOGLE_CLIENT_SECRET ? { client_secret: GOOGLE_CLIENT_SECRET } : {}),
|
|
211
|
+
code_verifier: verifier,
|
|
212
|
+
redirect_uri: redirectUri,
|
|
213
|
+
}).toString(),
|
|
214
|
+
});
|
|
215
|
+
if (!res.ok) {
|
|
216
|
+
const detail = await res.text().catch(() => "");
|
|
217
|
+
throw new Error(`Google sign-in couldn't be completed (${res.status})${detail ? `: ${detail.slice(0, 150)}` : ""}`);
|
|
218
|
+
}
|
|
219
|
+
const body = (await res.json());
|
|
220
|
+
if (!body.access_token)
|
|
221
|
+
throw new Error("Google returned no access token.");
|
|
222
|
+
return {
|
|
223
|
+
access: body.access_token,
|
|
224
|
+
refresh: body.refresh_token ?? "",
|
|
225
|
+
expires: Date.now() + (body.expires_in ?? 3600) * 1000,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
export const antigravityOAuthProvider = {
|
|
229
|
+
id: ANTIGRAVITY_OAUTH_ID,
|
|
230
|
+
name: "Google Antigravity",
|
|
231
|
+
usesCallbackServer: true,
|
|
232
|
+
async login(callbacks) {
|
|
233
|
+
// Antigravity runs its OWN Google OAuth (it does NOT reuse the Gemini CLI's
|
|
234
|
+
// token — that's a separate, now-deprecated product). Browser sign-in needs an
|
|
235
|
+
// OAuth client, which Brigade does not ship, so it's available only when the
|
|
236
|
+
// operator supplies one via env.
|
|
237
|
+
if (!GOOGLE_CLIENT_ID || !GOOGLE_CLIENT_SECRET) {
|
|
238
|
+
throw new Error("Antigravity sign-in isn't configured. Set BRIGADE_ANTIGRAVITY_CLIENT_ID and " +
|
|
239
|
+
"BRIGADE_ANTIGRAVITY_CLIENT_SECRET to a Google OAuth client, then sign in. Note: Google's " +
|
|
240
|
+
"Antigravity Terms prohibit third-party use and accounts have been banned — use at your own risk.");
|
|
241
|
+
}
|
|
242
|
+
// Browser path — Google installed-app OAuth (PKCE + localhost loopback), the
|
|
243
|
+
// same shape as Pi's codex/anthropic providers: the user approves in the
|
|
244
|
+
// browser and Google redirects the code back to the loopback (or they paste
|
|
245
|
+
// it). LIVE-VALIDATE: the exact scopes/consent Antigravity expects.
|
|
246
|
+
const { verifier, challenge } = generatePkce();
|
|
247
|
+
const state = base64url(randomBytes(16));
|
|
248
|
+
const server = await startLoopbackServer(state);
|
|
249
|
+
try {
|
|
250
|
+
const authUrl = `${GOOGLE_AUTH_URL}?${new URLSearchParams({
|
|
251
|
+
client_id: GOOGLE_CLIENT_ID,
|
|
252
|
+
redirect_uri: server.redirectUri,
|
|
253
|
+
response_type: "code",
|
|
254
|
+
scope: OAUTH_SCOPES.join(" "),
|
|
255
|
+
code_challenge: challenge,
|
|
256
|
+
code_challenge_method: "S256",
|
|
257
|
+
state,
|
|
258
|
+
access_type: "offline",
|
|
259
|
+
prompt: "consent",
|
|
260
|
+
}).toString()}`;
|
|
261
|
+
callbacks.onAuth({
|
|
262
|
+
url: authUrl,
|
|
263
|
+
instructions: "Approve the Google sign-in for the account tied to your Antigravity access.",
|
|
264
|
+
});
|
|
265
|
+
// Race the loopback callback against a manual code / redirect-URL paste, so
|
|
266
|
+
// login still completes if the browser can't reach the local server.
|
|
267
|
+
let code;
|
|
268
|
+
if (callbacks.onManualCodeInput) {
|
|
269
|
+
let manualVal = null;
|
|
270
|
+
let manualErr = null;
|
|
271
|
+
const manualPromise = callbacks
|
|
272
|
+
.onManualCodeInput()
|
|
273
|
+
.then((v) => {
|
|
274
|
+
manualVal = v;
|
|
275
|
+
server.cancelWait();
|
|
276
|
+
})
|
|
277
|
+
.catch((e) => {
|
|
278
|
+
manualErr = e instanceof Error ? e : new Error(String(e));
|
|
279
|
+
server.cancelWait();
|
|
280
|
+
});
|
|
281
|
+
const result = await server.waitForCode();
|
|
282
|
+
if (manualErr)
|
|
283
|
+
throw manualErr;
|
|
284
|
+
if (result?.code)
|
|
285
|
+
code = result.code;
|
|
286
|
+
else if (manualVal)
|
|
287
|
+
code = parseAuthCode(manualVal, state);
|
|
288
|
+
if (!code) {
|
|
289
|
+
await manualPromise;
|
|
290
|
+
if (manualErr)
|
|
291
|
+
throw manualErr;
|
|
292
|
+
if (manualVal)
|
|
293
|
+
code = parseAuthCode(manualVal, state);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
const result = await server.waitForCode();
|
|
298
|
+
if (result?.code)
|
|
299
|
+
code = result.code;
|
|
300
|
+
}
|
|
301
|
+
if (!code)
|
|
302
|
+
throw new Error("Sign-in didn't complete — no authorization code was received.");
|
|
303
|
+
const tokens = await exchangeAntigravityCode(code, verifier, server.redirectUri);
|
|
304
|
+
const project = await discoverProject(tokens.access);
|
|
305
|
+
return { ...tokens, project };
|
|
306
|
+
}
|
|
307
|
+
finally {
|
|
308
|
+
server.close();
|
|
309
|
+
}
|
|
310
|
+
},
|
|
311
|
+
async refreshToken(credentials) {
|
|
312
|
+
const refreshed = await refreshGoogleToken(credentials.refresh);
|
|
313
|
+
// Preserve the discovered project across refreshes.
|
|
314
|
+
const project = credentials.project ?? (await discoverProject(refreshed.access));
|
|
315
|
+
return { ...refreshed, project };
|
|
316
|
+
},
|
|
317
|
+
getApiKey(credentials) {
|
|
318
|
+
return credentials.access;
|
|
319
|
+
},
|
|
320
|
+
modifyModels(models, credentials) {
|
|
321
|
+
// Stamp the transport AND the discovered GCP project onto Antigravity models.
|
|
322
|
+
// Pi's streamFn `options` don't carry the project, so the model object is the
|
|
323
|
+
// only channel to get it to the transport for the /v1internal envelope.
|
|
324
|
+
const project = credentials.project;
|
|
325
|
+
return models.map((m) => m.provider === ANTIGRAVITY_PROVIDER
|
|
326
|
+
? { ...m, api: ANTIGRAVITY_API, baseUrl: CLOUD_CODE_ASSIST_BASE, ...(project ? { project } : {}) }
|
|
327
|
+
: m);
|
|
328
|
+
},
|
|
329
|
+
};
|
|
330
|
+
/* ─────────────────────────── transport (StreamFn) ─────────────────────────── */
|
|
331
|
+
function buildUsage(input = 0, output = 0) {
|
|
332
|
+
return {
|
|
333
|
+
input,
|
|
334
|
+
output,
|
|
335
|
+
cacheRead: 0,
|
|
336
|
+
cacheWrite: 0,
|
|
337
|
+
totalTokens: input + output,
|
|
338
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
/** Convert Pi's message array → Gemini `contents` (roles: user/model). */
|
|
342
|
+
export function toGeminiContents(messages) {
|
|
343
|
+
const out = [];
|
|
344
|
+
for (const m of messages) {
|
|
345
|
+
const role = m.role === "assistant" ? "model" : "user";
|
|
346
|
+
const text = typeof m.content === "string"
|
|
347
|
+
? m.content
|
|
348
|
+
: Array.isArray(m.content)
|
|
349
|
+
? m.content
|
|
350
|
+
.filter((p) => p?.type === "text" && typeof p.text === "string")
|
|
351
|
+
.map((p) => p.text)
|
|
352
|
+
.join("")
|
|
353
|
+
: "";
|
|
354
|
+
out.push({ role, parts: [{ text }] });
|
|
355
|
+
}
|
|
356
|
+
return out;
|
|
357
|
+
}
|
|
358
|
+
/** The Cloud Code Assist StreamFn. LIVE-VALIDATE: envelope + SSE field names. */
|
|
359
|
+
export function createAntigravityStreamFn() {
|
|
360
|
+
return ((model, context, options) => {
|
|
361
|
+
const stream = createAssistantMessageEventStream();
|
|
362
|
+
const modelInfo = { api: model.api, provider: model.provider, id: model.id };
|
|
363
|
+
const ts = Date.now();
|
|
364
|
+
const shell = (content, stopReason, errorMessage) => ({
|
|
365
|
+
role: "assistant",
|
|
366
|
+
content,
|
|
367
|
+
api: modelInfo.api,
|
|
368
|
+
provider: modelInfo.provider,
|
|
369
|
+
model: modelInfo.id,
|
|
370
|
+
usage: buildUsage(),
|
|
371
|
+
stopReason,
|
|
372
|
+
...(errorMessage ? { errorMessage } : {}),
|
|
373
|
+
timestamp: ts,
|
|
374
|
+
});
|
|
375
|
+
const run = async () => {
|
|
376
|
+
let acc = "";
|
|
377
|
+
let started = false;
|
|
378
|
+
try {
|
|
379
|
+
const ctx = (context ?? {});
|
|
380
|
+
const token = typeof options?.apiKey === "string" ? options.apiKey : "";
|
|
381
|
+
// Project is stamped onto the model by the OAuth provider's modifyModels
|
|
382
|
+
// (Pi's streamFn options don't carry it); fall back to options/env.
|
|
383
|
+
const project = model.project ??
|
|
384
|
+
options?.project ??
|
|
385
|
+
process.env.BRIGADE_ANTIGRAVITY_PROJECT ??
|
|
386
|
+
"";
|
|
387
|
+
const body = {
|
|
388
|
+
project,
|
|
389
|
+
model: model.id.replace(/^antigravity\//, ""),
|
|
390
|
+
request: {
|
|
391
|
+
contents: toGeminiContents(ctx.messages ?? []),
|
|
392
|
+
...(ctx.systemPrompt ? { systemInstruction: { parts: [{ text: ctx.systemPrompt }] } } : {}),
|
|
393
|
+
},
|
|
394
|
+
userAgent: "antigravity",
|
|
395
|
+
requestId: randomUUID(),
|
|
396
|
+
};
|
|
397
|
+
const res = await fetch(STREAM_URL, {
|
|
398
|
+
method: "POST",
|
|
399
|
+
headers: { ...antigravityHeaders(token), Accept: "text/event-stream" },
|
|
400
|
+
body: JSON.stringify(body),
|
|
401
|
+
signal: options?.signal,
|
|
402
|
+
});
|
|
403
|
+
if (!res.ok || !res.body) {
|
|
404
|
+
const detail = await res.text().catch(() => "");
|
|
405
|
+
throw new Error(`Antigravity /v1internal returned ${res.status}${detail ? `: ${detail.slice(0, 200)}` : ""}`);
|
|
406
|
+
}
|
|
407
|
+
stream.push({ type: "start", partial: shell([], "stop") });
|
|
408
|
+
started = true;
|
|
409
|
+
stream.push({ type: "text_start", contentIndex: 0, partial: shell([], "stop") });
|
|
410
|
+
const reader = res.body.getReader();
|
|
411
|
+
const decoder = new TextDecoder();
|
|
412
|
+
let buffer = "";
|
|
413
|
+
const handleSseLine = (line) => {
|
|
414
|
+
const t = line.trim();
|
|
415
|
+
if (!t.startsWith("data:"))
|
|
416
|
+
return;
|
|
417
|
+
const payload = t.slice(5).trim();
|
|
418
|
+
if (!payload || payload === "[DONE]")
|
|
419
|
+
return;
|
|
420
|
+
try {
|
|
421
|
+
// LIVE-VALIDATE: text lives under response.candidates[].content.parts[].text
|
|
422
|
+
const obj = JSON.parse(payload);
|
|
423
|
+
const parts = obj.response?.candidates?.[0]?.content?.parts ?? [];
|
|
424
|
+
for (const p of parts) {
|
|
425
|
+
if (typeof p.text === "string" && p.text) {
|
|
426
|
+
acc += p.text;
|
|
427
|
+
stream.push({ type: "text_delta", contentIndex: 0, delta: p.text, partial: shell([{ type: "text", text: acc }], "stop") });
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
catch {
|
|
432
|
+
/* skip malformed SSE line */
|
|
433
|
+
}
|
|
434
|
+
};
|
|
435
|
+
try {
|
|
436
|
+
while (true) {
|
|
437
|
+
const { done, value } = await reader.read();
|
|
438
|
+
if (done)
|
|
439
|
+
break;
|
|
440
|
+
buffer += decoder.decode(value, { stream: true });
|
|
441
|
+
const lines = buffer.split("\n");
|
|
442
|
+
buffer = lines.pop() ?? "";
|
|
443
|
+
for (const line of lines)
|
|
444
|
+
handleSseLine(line);
|
|
445
|
+
}
|
|
446
|
+
// Flush a trailing line if the stream closed without a final newline —
|
|
447
|
+
// otherwise the last delta / finish chunk is silently dropped.
|
|
448
|
+
if (buffer.trim())
|
|
449
|
+
handleSseLine(buffer);
|
|
450
|
+
}
|
|
451
|
+
finally {
|
|
452
|
+
await reader.cancel().catch(() => { });
|
|
453
|
+
}
|
|
454
|
+
stream.push({ type: "text_end", contentIndex: 0, content: acc, partial: shell([{ type: "text", text: acc }], "stop") });
|
|
455
|
+
const content = acc ? [{ type: "text", text: acc }] : [];
|
|
456
|
+
stream.push({ type: "done", reason: "stop", message: shell(content, "stop") });
|
|
457
|
+
}
|
|
458
|
+
catch (err) {
|
|
459
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
460
|
+
const aborted = err instanceof Error && (err.name === "AbortError" || /abort/i.test(msg));
|
|
461
|
+
// Guarantee a `start` precedes the terminal `error`, even when the failure
|
|
462
|
+
// happened before the stream started (e.g. the fetch or !res.ok threw).
|
|
463
|
+
if (!started) {
|
|
464
|
+
stream.push({ type: "start", partial: shell([], aborted ? "aborted" : "error") });
|
|
465
|
+
started = true;
|
|
466
|
+
}
|
|
467
|
+
stream.push({
|
|
468
|
+
type: "error",
|
|
469
|
+
reason: aborted ? "aborted" : "error",
|
|
470
|
+
error: shell(acc ? [{ type: "text", text: acc }] : [], aborted ? "aborted" : "error", msg),
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
finally {
|
|
474
|
+
stream.end();
|
|
475
|
+
}
|
|
476
|
+
};
|
|
477
|
+
queueMicrotask(() => void run());
|
|
478
|
+
return stream;
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
/* ─────────────────────────── registration ─────────────────────────── */
|
|
482
|
+
const REGISTRY_SOURCE_ID = "brigade-antigravity";
|
|
483
|
+
/**
|
|
484
|
+
* Idempotently register Antigravity's OAuth provider + `api:"antigravity"`
|
|
485
|
+
* transport. Guards on the LIVE registries (self-heals after Pi's
|
|
486
|
+
* resetApiProviders/resetOAuthProviders on refresh), same rationale as the
|
|
487
|
+
* Ollama-native registration. Safe to call at boot, per turn, and pre-login.
|
|
488
|
+
*/
|
|
489
|
+
export function ensureAntigravityRegistered() {
|
|
490
|
+
if (!getOAuthProvider(ANTIGRAVITY_OAUTH_ID)) {
|
|
491
|
+
registerOAuthProvider(antigravityOAuthProvider);
|
|
492
|
+
}
|
|
493
|
+
if (!getApiProvider(ANTIGRAVITY_API)) {
|
|
494
|
+
const streamFn = createAntigravityStreamFn();
|
|
495
|
+
registerApiProvider({ api: ANTIGRAVITY_API, stream: streamFn, streamSimple: streamFn }, REGISTRY_SOURCE_ID);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/integrations/antigravity/transport.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,iFAAiF;AACjF,EAAE;AACF,iFAAiF;AACjF,kFAAkF;AAClF,gEAAgE;AAChE,8EAA8E;AAC9E,4EAA4E;AAC5E,mFAAmF;AACnF,kFAAkF;AAClF,6BAA6B;AAC7B,EAAE;AACF,+EAA+E;AAC/E,iFAAiF;AACjF,oFAAoF;AACpF,kFAAkF;AAClF,oFAAoF;AAEpF,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EACN,iCAAiC,EACjC,cAAc,EACd,mBAAmB,GACnB,MAAM,uBAAuB,CAAC;AAY/B,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAQtF,uEAAuE;AAEvE,MAAM,CAAC,MAAM,eAAe,GAAG,aAAa,CAAC;AAC7C,MAAM,CAAC,MAAM,oBAAoB,GAAG,aAAa,CAAC;AAClD,MAAM,CAAC,MAAM,oBAAoB,GAAG,aAAa,CAAC;AAElD,kFAAkF;AAClF,MAAM,CAAC,MAAM,sBAAsB,GAAG,qCAAqC,CAAC;AAC5E,MAAM,UAAU,GAAG,GAAG,sBAAsB,2CAA2C,CAAC;AACxF,MAAM,oBAAoB,GAAG,GAAG,sBAAsB,4BAA4B,CAAC;AAEnF,kFAAkF;AAClF,gFAAgF;AAChF,4EAA4E;AAC5E,kFAAkF;AAClF,kFAAkF;AAClF,6EAA6E;AAC7E,mFAAmF;AACnF,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,EAAE,CAAC;AACzE,MAAM,oBAAoB,GAAG,OAAO,CAAC,GAAG,CAAC,iCAAiC,IAAI,EAAE,CAAC;AACjF,MAAM,gBAAgB,GAAG,qCAAqC,CAAC;AAC/D,MAAM,eAAe,GAAG,2CAA2C,CAAC;AACpE,iEAAiE;AACjE,sFAAsF;AACtF,MAAM,YAAY,GAAG;IACpB,gDAAgD;IAChD,gDAAgD;IAChD,kDAAkD;IAClD,uCAAuC;IACvC,uDAAuD;CACvD,CAAC;AAEF,iEAAiE;AACjE,SAAS,cAAc;IACtB,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;AACrG,CAAC;AAED;yFACyF;AACzF,SAAS,kBAAkB,CAAC,WAAmB;IAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IAC7D,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;IACzG,OAAO;QACN,aAAa,EAAE,UAAU,WAAW,EAAE;QACtC,cAAc,EAAE,kBAAkB;QAClC,YAAY,EAAE,sBAAsB,EAAE,IAAI,IAAI,EAAE;QAChD,mBAAmB,EAAE,8CAA8C;QACnE,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;KAC/G,CAAC;AACH,CAAC;AASD;iFACiF;AACjF,KAAK,UAAU,eAAe,CAAC,WAAmB;IACjD,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,oBAAoB,EAAE;YAC7C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,kBAAkB,CAAC,WAAW,CAAC;YACxC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,CAAC;SAC9D,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,SAAS,CAAC;QAC9B,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA2D,CAAC;QAC1F,OAAO,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,gBAAgB,EAAE;QACzC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;QAChE,IAAI,EAAE,IAAI,eAAe,CAAC;YACzB,UAAU,EAAE,eAAe;YAC3B,aAAa,EAAE,OAAO;YACtB,SAAS,EAAE,gBAAgB;YAC3B,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxE,CAAC,CAAC,QAAQ,EAAE;KACb,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IACjF,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA0E,CAAC;IACzG,OAAO;QACN,MAAM,EAAE,IAAI,CAAC,YAAY;QACzB,OAAO,EAAE,IAAI,CAAC,aAAa,IAAI,OAAO;QACtC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,IAAI;KACtD,CAAC;AACH,CAAC;AAED,wFAAwF;AAExF,SAAS,SAAS,CAAC,GAAW;IAC7B,OAAO,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,YAAY;IAC3B,MAAM,QAAQ,GAAG,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5E,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe;IACzC,OAAO,0MAA0M,OAAO,qBAAqB,CAAC;AAC/O,CAAC;AASD;oFACoF;AACpF,KAAK,UAAU,mBAAmB,CAAC,KAAa;IAC/C,IAAI,MAA0D,CAAC;IAC/D,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,kBAAkB,GAAG,IAAI,OAAO,CAA0B,CAAC,OAAO,EAAE,EAAE;QAC3E,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE;YACd,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,OAAO,CAAC,CAAC,CAAC,CAAC;QACZ,CAAC,CAAC;IACH,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACxC,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,kBAAkB,CAAC,CAAC;YACvD,IAAI,GAAG,CAAC,QAAQ,KAAK,iBAAiB,EAAE,CAAC;gBACxC,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;gBACrB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACrB,OAAO;YACR,CAAC;YACD,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;YAC1D,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,EAAE,CAAC;gBAC7C,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;gBACrB,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,iFAAiF,CAAC,CAAC,CAAC;gBAC9G,OAAO;YACR,CAAC;YACD,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACX,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC1C,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;gBACrB,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC,eAAe,8BAA8B,CAAC,CAAC,CAAC;gBAC/G,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;gBACf,OAAO;YACR,CAAC;YACD,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,yEAAyE,CAAC,CAAC,CAAC;YACtG,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACR,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC3B,CAAC;IACF,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,OAAO,CAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;YAClC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,OAAO,CAAC;gBACP,WAAW,EAAE,oBAAoB,IAAI,iBAAiB;gBACtD,WAAW,EAAE,GAAG,EAAE,CAAC,kBAAkB;gBACrC,UAAU,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;gBAChC,KAAK,EAAE,GAAG,EAAE;oBACX,IAAI,CAAC;wBACJ,MAAM,CAAC,KAAK,EAAE,CAAC;oBAChB,CAAC;oBAAC,MAAM,CAAC;wBACR,YAAY;oBACb,CAAC;gBACF,CAAC;aACD,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,aAAqB;IACjE,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACvB,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzB,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,CAAC,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,KAAK,aAAa;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACpE,OAAO,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC;IAClD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,OAAO,KAAK,oBAAoB,EAAE,CAAC;YAC9D,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,CAAC,CAAC,CAAC,qDAAqD;IAChE,CAAC;AACF,CAAC;AAED,6EAA6E;AAC7E,KAAK,UAAU,uBAAuB,CACrC,IAAY,EACZ,QAAgB,EAChB,WAAmB;IAEnB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,gBAAgB,EAAE;QACzC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;QAChE,IAAI,EAAE,IAAI,eAAe,CAAC;YACzB,UAAU,EAAE,oBAAoB;YAChC,IAAI;YACJ,SAAS,EAAE,gBAAgB;YAC3B,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxE,aAAa,EAAE,QAAQ;YACvB,YAAY,EAAE,WAAW;SACzB,CAAC,CAAC,QAAQ,EAAE;KACb,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,yCAAyC,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrH,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA2E,CAAC;IAC1G,IAAI,CAAC,IAAI,CAAC,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAC5E,OAAO;QACN,MAAM,EAAE,IAAI,CAAC,YAAY;QACzB,OAAO,EAAE,IAAI,CAAC,aAAa,IAAI,EAAE;QACjC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,IAAI;KACtD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GAA2B;IAC/D,EAAE,EAAE,oBAAoB;IACxB,IAAI,EAAE,oBAAoB;IAC1B,kBAAkB,EAAE,IAAI;IAExB,KAAK,CAAC,KAAK,CAAC,SAA8B;QACzC,4EAA4E;QAC5E,+EAA+E;QAC/E,6EAA6E;QAC7E,iCAAiC;QACjC,IAAI,CAAC,gBAAgB,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CACd,8EAA8E;gBAC7E,2FAA2F;gBAC3F,kGAAkG,CACnG,CAAC;QACH,CAAC;QACD,6EAA6E;QAC7E,yEAAyE;QACzE,4EAA4E;QAC5E,oEAAoE;QACpE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,YAAY,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,GAAG,eAAe,IAAI,IAAI,eAAe,CAAC;gBACzD,SAAS,EAAE,gBAAgB;gBAC3B,YAAY,EAAE,MAAM,CAAC,WAAW;gBAChC,aAAa,EAAE,MAAM;gBACrB,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC7B,cAAc,EAAE,SAAS;gBACzB,qBAAqB,EAAE,MAAM;gBAC7B,KAAK;gBACL,WAAW,EAAE,SAAS;gBACtB,MAAM,EAAE,SAAS;aACjB,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;YAChB,SAAS,CAAC,MAAM,CAAC;gBAChB,GAAG,EAAE,OAAO;gBACZ,YAAY,EAAE,6EAA6E;aAC3F,CAAC,CAAC;YAEH,4EAA4E;YAC5E,qEAAqE;YACrE,IAAI,IAAwB,CAAC;YAC7B,IAAI,SAAS,CAAC,iBAAiB,EAAE,CAAC;gBACjC,IAAI,SAAS,GAAkB,IAAI,CAAC;gBACpC,IAAI,SAAS,GAAiB,IAAI,CAAC;gBACnC,MAAM,aAAa,GAAG,SAAS;qBAC7B,iBAAiB,EAAE;qBACnB,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;oBACX,SAAS,GAAG,CAAC,CAAC;oBACd,MAAM,CAAC,UAAU,EAAE,CAAC;gBACrB,CAAC,CAAC;qBACD,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE;oBACrB,SAAS,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC1D,MAAM,CAAC,UAAU,EAAE,CAAC;gBACrB,CAAC,CAAC,CAAC;gBACJ,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;gBAC1C,IAAI,SAAS;oBAAE,MAAM,SAAS,CAAC;gBAC/B,IAAI,MAAM,EAAE,IAAI;oBAAE,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;qBAChC,IAAI,SAAS;oBAAE,IAAI,GAAG,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;gBAC3D,IAAI,CAAC,IAAI,EAAE,CAAC;oBACX,MAAM,aAAa,CAAC;oBACpB,IAAI,SAAS;wBAAE,MAAM,SAAS,CAAC;oBAC/B,IAAI,SAAS;wBAAE,IAAI,GAAG,aAAa,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;gBACvD,CAAC;YACF,CAAC;iBAAM,CAAC;gBACP,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;gBAC1C,IAAI,MAAM,EAAE,IAAI;oBAAE,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACtC,CAAC;YACD,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;YAE5F,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;YACjF,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACrD,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC;QAC/B,CAAC;gBAAS,CAAC;YACV,MAAM,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;IACF,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,WAA6B;QAC/C,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAChE,oDAAoD;QACpD,MAAM,OAAO,GAAI,WAAgC,CAAC,OAAO,IAAI,CAAC,MAAM,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QACvG,OAAO,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,CAAC;IAClC,CAAC;IAED,SAAS,CAAC,WAA6B;QACtC,OAAO,WAAW,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,YAAY,CAAC,MAAuB,EAAE,WAA6B;QAClE,8EAA8E;QAC9E,8EAA8E;QAC9E,wEAAwE;QACxE,MAAM,OAAO,GAAI,WAAgC,CAAC,OAAO,CAAC;QAC1D,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACvB,CAAC,CAAC,QAAQ,KAAK,oBAAoB;YAClC,CAAC,CAAE,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,sBAAsB,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAoB;YACrH,CAAC,CAAC,CAAC,CACJ,CAAC;IACH,CAAC;CACD,CAAC;AAEF,kFAAkF;AAElF,SAAS,UAAU,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC;IACxC,OAAO;QACN,KAAK;QACL,MAAM;QACN,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;QACb,WAAW,EAAE,KAAK,GAAG,MAAM;QAC3B,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;KAC3D,CAAC;AACZ,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,gBAAgB,CAAC,QAAmD;IACnF,MAAM,GAAG,GAAc,EAAE,CAAC;IAC1B,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QACvD,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ;YACzC,CAAC,CAAC,CAAC,CAAC,OAAO;YACX,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;gBACzB,CAAC,CAAE,CAAC,CAAC,OAAmD;qBACrD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;qBAC/D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;qBAClB,IAAI,CAAC,EAAE,CAAC;gBACX,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,yBAAyB;IACxC,OAAO,CAAC,CAAC,KAAoB,EAAE,OAAgB,EAAE,OAA4C,EAAE,EAAE;QAChG,MAAM,MAAM,GAAG,iCAAiC,EAAE,CAAC;QACnD,MAAM,SAAS,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;QAC7E,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,CAAC,OAAqD,EAAE,UAAsB,EAAE,YAAqB,EAAoB,EAAE,CACxI,CAAC;YACA,IAAI,EAAE,WAAW;YACjB,OAAO;YACP,GAAG,EAAE,SAAS,CAAC,GAAG;YAClB,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,KAAK,EAAE,SAAS,CAAC,EAAE;YACnB,KAAK,EAAE,UAAU,EAAE;YACnB,UAAU;YACV,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzC,SAAS,EAAE,EAAE;SACb,CAAqB,CAAC;QAExB,MAAM,GAAG,GAAG,KAAK,IAAmB,EAAE;YACrC,IAAI,GAAG,GAAG,EAAE,CAAC;YACb,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,IAAI,CAAC;gBACJ,MAAM,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAoG,CAAC;gBAC/H,MAAM,KAAK,GAAG,OAAO,OAAO,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxE,yEAAyE;gBACzE,oEAAoE;gBACpE,MAAM,OAAO,GACX,KAA8B,CAAC,OAAO;oBACtC,OAAO,EAAE,OAA8B;oBACxC,OAAO,CAAC,GAAG,CAAC,2BAA2B;oBACvC,EAAE,CAAC;gBACJ,MAAM,IAAI,GAAG;oBACZ,OAAO;oBACP,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC;oBAC7C,OAAO,EAAE;wBACR,QAAQ,EAAE,gBAAgB,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;wBAC9C,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBAC3F;oBACD,SAAS,EAAE,aAAa;oBACxB,SAAS,EAAE,UAAU,EAAE;iBACvB,CAAC;gBACF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,UAAU,EAAE;oBACnC,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,GAAG,kBAAkB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,mBAAmB,EAAE;oBACtE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;oBAC1B,MAAM,EAAE,OAAO,EAAE,MAAiC;iBAClD,CAAC,CAAC;gBACH,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;oBAC1B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;oBAChD,MAAM,IAAI,KAAK,CAAC,oCAAoC,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC/G,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC3D,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;gBAEjF,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACpC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;gBAClC,IAAI,MAAM,GAAG,EAAE,CAAC;gBAChB,MAAM,aAAa,GAAG,CAAC,IAAY,EAAQ,EAAE;oBAC5C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;oBACtB,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;wBAAE,OAAO;oBACnC,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAClC,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,QAAQ;wBAAE,OAAO;oBAC7C,IAAI,CAAC;wBACJ,6EAA6E;wBAC7E,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA8F,CAAC;wBAC7H,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;wBAClE,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;4BACvB,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;gCAC1C,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC;gCACd,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAiB,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;4BAC3I,CAAC;wBACF,CAAC;oBACF,CAAC;oBAAC,MAAM,CAAC;wBACR,6BAA6B;oBAC9B,CAAC;gBACF,CAAC,CAAC;gBACF,IAAI,CAAC;oBACJ,OAAO,IAAI,EAAE,CAAC;wBACb,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;wBAC5C,IAAI,IAAI;4BAAE,MAAM;wBAChB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;wBAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;wBAC3B,KAAK,MAAM,IAAI,IAAI,KAAK;4BAAE,aAAa,CAAC,IAAI,CAAC,CAAC;oBAC/C,CAAC;oBACD,uEAAuE;oBACvE,+DAA+D;oBAC/D,IAAI,MAAM,CAAC,IAAI,EAAE;wBAAE,aAAa,CAAC,MAAM,CAAC,CAAC;gBAC1C,CAAC;wBAAS,CAAC;oBACV,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBACvC,CAAC;gBAED,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAiB,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;gBACvI,MAAM,OAAO,GAAiD,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtH,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;YAChF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,YAAY,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC1F,2EAA2E;gBAC3E,wEAAwE;gBACxE,IAAI,CAAC,OAAO,EAAE,CAAC;oBACd,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBAClF,OAAO,GAAG,IAAI,CAAC;gBAChB,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;oBACrC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC;iBACzG,CAAC,CAAC;YACJ,CAAC;oBAAS,CAAC;gBACV,MAAM,CAAC,GAAG,EAAE,CAAC;YACd,CAAC;QACF,CAAC,CAAC;QACF,cAAc,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QACjC,OAAO,MAAqC,CAAC;IAC9C,CAAC,CAAwB,CAAC;AAC3B,CAAC;AAED,0EAA0E;AAE1E,MAAM,kBAAkB,GAAG,qBAAqB,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B;IAC1C,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,EAAE,CAAC;QAC7C,qBAAqB,CAAC,wBAAwB,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,yBAAyB,EAAE,CAAC;QAC7C,mBAAmB,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,QAAiB,EAAE,YAAY,EAAE,QAAiB,EAAE,EAAE,kBAAkB,CAAC,CAAC;IAC/H,CAAC;AACF,CAAC"}
|
|
@@ -47,4 +47,17 @@ export declare function readClaudeCliLogin(): CliLogin | null;
|
|
|
47
47
|
* access token.
|
|
48
48
|
*/
|
|
49
49
|
export declare function readCodexCliLogin(): CliLogin | null;
|
|
50
|
+
/**
|
|
51
|
+
* Read the Gemini / Antigravity CLI's stored login from
|
|
52
|
+
* `~/.gemini/oauth_creds.json` (the google-auth-library credential the
|
|
53
|
+
* gemini-cli / antigravity-cli writes after `gemini`/`antigravity` login).
|
|
54
|
+
*
|
|
55
|
+
* Shape: `{ access_token, refresh_token, expiry_date }` where `expiry_date` is
|
|
56
|
+
* ALREADY epoch-ms (google-auth-library convention). Returns an `oauth`
|
|
57
|
+
* credential (Pi/Brigade can refresh it against Google). Returns `null` on any
|
|
58
|
+
* missing file / parse error / absent token — e.g. an IDE-only Antigravity user
|
|
59
|
+
* whose token lives in the OS keyring, which we can't read (they use the browser
|
|
60
|
+
* login path instead). Never throws.
|
|
61
|
+
*/
|
|
62
|
+
export declare function readGeminiCliLogin(): CliLogin | null;
|
|
50
63
|
//# sourceMappingURL=cli-login.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-login.d.ts","sourceRoot":"","sources":["../../src/integrations/cli-login.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,4DAA4D;AAC5D,MAAM,MAAM,QAAQ,GACjB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1G;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAExE;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,IAAI,QAAQ,GAAG,IAAI,CAmBpD;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,IAAI,QAAQ,GAAG,IAAI,CAkCnD"}
|
|
1
|
+
{"version":3,"file":"cli-login.d.ts","sourceRoot":"","sources":["../../src/integrations/cli-login.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,4DAA4D;AAC5D,MAAM,MAAM,QAAQ,GACjB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1G;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAExE;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,IAAI,QAAQ,GAAG,IAAI,CAmBpD;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,IAAI,QAAQ,GAAG,IAAI,CAkCnD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,IAAI,QAAQ,GAAG,IAAI,CAiBpD"}
|
|
@@ -90,6 +90,35 @@ export function readCodexCliLogin() {
|
|
|
90
90
|
return null;
|
|
91
91
|
}
|
|
92
92
|
}
|
|
93
|
+
/**
|
|
94
|
+
* Read the Gemini / Antigravity CLI's stored login from
|
|
95
|
+
* `~/.gemini/oauth_creds.json` (the google-auth-library credential the
|
|
96
|
+
* gemini-cli / antigravity-cli writes after `gemini`/`antigravity` login).
|
|
97
|
+
*
|
|
98
|
+
* Shape: `{ access_token, refresh_token, expiry_date }` where `expiry_date` is
|
|
99
|
+
* ALREADY epoch-ms (google-auth-library convention). Returns an `oauth`
|
|
100
|
+
* credential (Pi/Brigade can refresh it against Google). Returns `null` on any
|
|
101
|
+
* missing file / parse error / absent token — e.g. an IDE-only Antigravity user
|
|
102
|
+
* whose token lives in the OS keyring, which we can't read (they use the browser
|
|
103
|
+
* login path instead). Never throws.
|
|
104
|
+
*/
|
|
105
|
+
export function readGeminiCliLogin() {
|
|
106
|
+
try {
|
|
107
|
+
const credPath = path.join(homedir(), ".gemini", "oauth_creds.json");
|
|
108
|
+
if (!fs.existsSync(credPath))
|
|
109
|
+
return null;
|
|
110
|
+
const parsed = JSON.parse(fs.readFileSync(credPath, "utf8"));
|
|
111
|
+
const access = parsed.access_token;
|
|
112
|
+
const refresh = parsed.refresh_token;
|
|
113
|
+
if (!access || !refresh)
|
|
114
|
+
return null;
|
|
115
|
+
const expires = typeof parsed.expiry_date === "number" ? parsed.expiry_date : undefined;
|
|
116
|
+
return { provider: "antigravity", type: "oauth", access, refresh, expires };
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
93
122
|
/**
|
|
94
123
|
* Decode the `exp` claim (seconds) of a JWT and return it as epoch-ms, or
|
|
95
124
|
* `undefined` if the token isn't a parseable three-part JWT with a numeric
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-login.js","sourceRoot":"","sources":["../../src/integrations/cli-login.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli-login.js","sourceRoot":"","sources":["../../src/integrations/cli-login.ts"],"names":[],"mappings":"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"}
|