egaki 0.6.0 → 0.7.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/CHANGELOG.md +145 -9
- package/dist/cli/cache-utils.d.ts +33 -0
- package/dist/cli/cache-utils.d.ts.map +1 -0
- package/dist/cli/cache-utils.js +157 -0
- package/dist/cli/cached-generate.d.ts +105 -0
- package/dist/cli/cached-generate.d.ts.map +1 -0
- package/dist/cli/cached-generate.js +208 -0
- package/dist/cli/cached-generate.test.d.ts +11 -0
- package/dist/cli/cached-generate.test.d.ts.map +1 -0
- package/dist/cli/cached-generate.test.js +431 -0
- package/dist/cli/cartesia-provider.d.ts +16 -0
- package/dist/cli/cartesia-provider.d.ts.map +1 -0
- package/dist/cli/cartesia-provider.js +184 -0
- package/dist/cli/chatgpt-auth.d.ts.map +1 -0
- package/dist/cli/cli.d.ts +4 -0
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/{cli.js → cli/cli.js} +626 -600
- package/dist/cli/clone-generate.d.ts +26 -0
- package/dist/cli/clone-generate.d.ts.map +1 -0
- package/dist/cli/clone-generate.js +148 -0
- package/dist/cli/credentials.d.ts.map +1 -0
- package/dist/{credentials.js → cli/credentials.js} +20 -0
- package/dist/cli/elevenlabs-speech-provider.d.ts +26 -0
- package/dist/cli/elevenlabs-speech-provider.d.ts.map +1 -0
- package/dist/cli/elevenlabs-speech-provider.js +199 -0
- package/dist/cli/generate.d.ts +140 -0
- package/dist/cli/generate.d.ts.map +1 -0
- package/dist/cli/generate.js +604 -0
- package/dist/cli/generate.test.d.ts +2 -0
- package/dist/cli/generate.test.d.ts.map +1 -0
- package/dist/cli/generate.test.js +131 -0
- package/dist/cli/login.d.ts.map +1 -0
- package/dist/cli/main.d.ts +3 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +7 -0
- package/dist/{model-catalog.d.ts → cli/model-catalog.d.ts} +6 -0
- package/dist/cli/model-catalog.d.ts.map +1 -0
- package/dist/{model-catalog.js → cli/model-catalog.js} +714 -4
- package/dist/{models.d.ts → cli/models.d.ts} +12 -5
- package/dist/cli/models.d.ts.map +1 -0
- package/dist/{models.js → cli/models.js} +58 -57
- package/dist/cli/open-browser.d.ts.map +1 -0
- package/dist/cli/openai-speech-provider.d.ts +3 -0
- package/dist/cli/openai-speech-provider.d.ts.map +1 -0
- package/dist/cli/openai-speech-provider.js +28 -0
- package/dist/cli/separation-generate.d.ts +34 -0
- package/dist/cli/separation-generate.d.ts.map +1 -0
- package/dist/cli/separation-generate.js +117 -0
- package/dist/cli/speech-catalog.d.ts +35 -0
- package/dist/cli/speech-catalog.d.ts.map +1 -0
- package/dist/cli/speech-catalog.js +195 -0
- package/dist/cli/speech-generate.d.ts +86 -0
- package/dist/cli/speech-generate.d.ts.map +1 -0
- package/dist/cli/speech-generate.js +156 -0
- package/dist/cli/speech-models.d.ts +8 -0
- package/dist/cli/speech-models.d.ts.map +1 -0
- package/dist/cli/speech-models.js +109 -0
- package/dist/cli/speech-provider.test.d.ts +2 -0
- package/dist/cli/speech-provider.test.d.ts.map +1 -0
- package/dist/cli/speech-provider.test.js +197 -0
- package/dist/cli/subscription.d.ts.map +1 -0
- package/dist/cli/transcription-catalog.d.ts +35 -0
- package/dist/cli/transcription-catalog.d.ts.map +1 -0
- package/dist/cli/transcription-catalog.js +192 -0
- package/dist/cli/transcription-generate.d.ts +62 -0
- package/dist/cli/transcription-generate.d.ts.map +1 -0
- package/dist/cli/transcription-generate.js +144 -0
- package/dist/cli/transcription-models.d.ts +9 -0
- package/dist/cli/transcription-models.d.ts.map +1 -0
- package/dist/cli/transcription-models.js +100 -0
- package/dist/cli/transcription-providers.d.ts +22 -0
- package/dist/cli/transcription-providers.d.ts.map +1 -0
- package/dist/cli/transcription-providers.js +290 -0
- package/dist/cli/video-model-catalog.d.ts.map +1 -0
- package/dist/cli/xai-auth.d.ts.map +1 -0
- package/dist/{xai-auth.js → cli/xai-auth.js} +1 -1
- package/dist/vite/angled-screen.d.ts +57 -0
- package/dist/vite/angled-screen.d.ts.map +1 -0
- package/dist/vite/angled-screen.js +115 -0
- package/dist/vite/app.d.ts +51 -0
- package/dist/vite/app.d.ts.map +1 -0
- package/dist/vite/app.js +150 -0
- package/dist/vite/bands-shader.d.ts +47 -0
- package/dist/vite/bands-shader.d.ts.map +1 -0
- package/dist/vite/bands-shader.js +267 -0
- package/dist/vite/code-block.d.ts +107 -0
- package/dist/vite/code-block.d.ts.map +1 -0
- package/dist/vite/code-block.js +641 -0
- package/dist/vite/components.d.ts +36 -0
- package/dist/vite/components.d.ts.map +1 -0
- package/dist/vite/components.js +113 -0
- package/dist/vite/dispersion-rings-shader.d.ts +44 -0
- package/dist/vite/dispersion-rings-shader.d.ts.map +1 -0
- package/dist/vite/dispersion-rings-shader.js +282 -0
- package/dist/vite/easing-curves.d.ts +129 -0
- package/dist/vite/easing-curves.d.ts.map +1 -0
- package/dist/vite/easing-curves.js +584 -0
- package/dist/vite/easing-curves.test.d.ts +2 -0
- package/dist/vite/easing-curves.test.d.ts.map +1 -0
- package/dist/vite/easing-curves.test.js +200 -0
- package/dist/vite/generated-media-client.d.ts +35 -0
- package/dist/vite/generated-media-client.d.ts.map +1 -0
- package/dist/vite/generated-media-client.js +76 -0
- package/dist/vite/keyframes.d.ts +129 -0
- package/dist/vite/keyframes.d.ts.map +1 -0
- package/dist/vite/keyframes.js +194 -0
- package/dist/vite/layout-editor.d.ts +45 -0
- package/dist/vite/layout-editor.d.ts.map +1 -0
- package/dist/vite/layout-editor.js +587 -0
- package/dist/vite/layout-transition.d.ts +136 -0
- package/dist/vite/layout-transition.d.ts.map +1 -0
- package/dist/vite/layout-transition.js +581 -0
- package/dist/vite/liquid-gradient-shader.d.ts +62 -0
- package/dist/vite/liquid-gradient-shader.d.ts.map +1 -0
- package/dist/vite/liquid-gradient-shader.js +413 -0
- package/dist/vite/mdx-client.d.ts +15 -0
- package/dist/vite/mdx-client.d.ts.map +1 -0
- package/dist/vite/mdx-client.js +265 -0
- package/dist/vite/mdx-parse.d.ts +102 -0
- package/dist/vite/mdx-parse.d.ts.map +1 -0
- package/dist/vite/mdx-parse.js +251 -0
- package/dist/vite/mdx-provided-components.d.ts +18 -0
- package/dist/vite/mdx-provided-components.d.ts.map +1 -0
- package/dist/vite/mdx-provided-components.js +14 -0
- package/dist/vite/mdx-video.d.ts +327 -0
- package/dist/vite/mdx-video.d.ts.map +1 -0
- package/dist/vite/mdx-video.js +596 -0
- package/dist/vite/mdx-video.test.d.ts +9 -0
- package/dist/vite/mdx-video.test.d.ts.map +1 -0
- package/dist/vite/mdx-video.test.js +1945 -0
- package/dist/vite/media-components.d.ts +45 -0
- package/dist/vite/media-components.d.ts.map +1 -0
- package/dist/vite/media-components.js +355 -0
- package/dist/vite/media-duration-store.d.ts +66 -0
- package/dist/vite/media-duration-store.d.ts.map +1 -0
- package/dist/vite/media-duration-store.js +204 -0
- package/dist/vite/player-page.d.ts +35 -0
- package/dist/vite/player-page.d.ts.map +1 -0
- package/dist/vite/player-page.js +720 -0
- package/dist/vite/render-client.d.ts +18 -0
- package/dist/vite/render-client.d.ts.map +1 -0
- package/dist/vite/render-client.js +67 -0
- package/dist/vite/sdk.d.ts +221 -0
- package/dist/vite/sdk.d.ts.map +1 -0
- package/dist/vite/sdk.js +355 -0
- package/dist/vite/server-components.d.ts +55 -0
- package/dist/vite/server-components.d.ts.map +1 -0
- package/dist/vite/server-components.js +156 -0
- package/dist/vite/server-mdx.d.ts +74 -0
- package/dist/vite/server-mdx.d.ts.map +1 -0
- package/dist/vite/server-mdx.js +259 -0
- package/dist/vite/shader-renderer.d.ts +48 -0
- package/dist/vite/shader-renderer.d.ts.map +1 -0
- package/dist/vite/shader-renderer.js +411 -0
- package/dist/vite/store-hooks.d.ts +12 -0
- package/dist/vite/store-hooks.d.ts.map +1 -0
- package/dist/vite/store-hooks.js +93 -0
- package/dist/vite/store.d.ts +75 -0
- package/dist/vite/store.d.ts.map +1 -0
- package/dist/vite/store.js +52 -0
- package/dist/vite/store.test.d.ts +6 -0
- package/dist/vite/store.test.d.ts.map +1 -0
- package/dist/vite/store.test.js +172 -0
- package/dist/vite/tweakpane-hook.d.ts +94 -0
- package/dist/vite/tweakpane-hook.d.ts.map +1 -0
- package/dist/vite/tweakpane-hook.js +450 -0
- package/dist/vite/vite-plugin.d.ts +28 -0
- package/dist/vite/vite-plugin.d.ts.map +1 -0
- package/dist/vite/vite-plugin.js +539 -0
- package/dist/vite/wave-gradient-shader.d.ts +41 -0
- package/dist/vite/wave-gradient-shader.d.ts.map +1 -0
- package/dist/vite/wave-gradient-shader.js +207 -0
- package/package.json +101 -24
- package/skills/egaki/SKILL.md +162 -1
- package/src/cli/cache-utils.ts +169 -0
- package/src/cli/cached-generate.test.ts +531 -0
- package/src/cli/cached-generate.ts +348 -0
- package/src/cli/cartesia-provider.ts +249 -0
- package/src/{cli.ts → cli/cli.ts} +836 -884
- package/src/cli/clone-generate.ts +202 -0
- package/src/{credentials.ts → cli/credentials.ts} +20 -0
- package/src/cli/elevenlabs-speech-provider.ts +243 -0
- package/src/cli/generate.test.ts +166 -0
- package/src/cli/generate.ts +912 -0
- package/src/cli/main.ts +8 -0
- package/src/{model-catalog.ts → cli/model-catalog.ts} +787 -58
- package/src/{models.ts → cli/models.ts} +65 -86
- package/src/cli/openai-speech-provider.ts +34 -0
- package/src/cli/separation-generate.ts +187 -0
- package/src/cli/speech-catalog.ts +253 -0
- package/src/cli/speech-generate.ts +275 -0
- package/src/cli/speech-models.ts +146 -0
- package/src/cli/speech-provider.test.ts +226 -0
- package/src/cli/transcription-catalog.ts +250 -0
- package/src/cli/transcription-generate.ts +214 -0
- package/src/cli/transcription-models.ts +136 -0
- package/src/cli/transcription-providers.ts +427 -0
- package/src/{xai-auth.ts → cli/xai-auth.ts} +1 -1
- package/src/vite/angled-screen.tsx +214 -0
- package/src/vite/app.tsx +197 -0
- package/src/vite/bands-shader.tsx +319 -0
- package/src/vite/code-block.tsx +939 -0
- package/src/vite/components.tsx +278 -0
- package/src/vite/dispersion-rings-shader.tsx +331 -0
- package/src/vite/easing-curves.test.ts +232 -0
- package/src/vite/easing-curves.ts +743 -0
- package/src/vite/generated-media-client.tsx +121 -0
- package/src/vite/keyframes.tsx +347 -0
- package/src/vite/layout-editor.tsx +709 -0
- package/src/vite/layout-transition.tsx +706 -0
- package/src/vite/liquid-gradient-shader.tsx +474 -0
- package/src/vite/mdx-client.tsx +420 -0
- package/src/vite/mdx-parse.ts +343 -0
- package/src/vite/mdx-provided-components.ts +19 -0
- package/src/vite/mdx-video.test.tsx +2219 -0
- package/src/vite/mdx-video.tsx +976 -0
- package/src/vite/media-components.tsx +473 -0
- package/src/vite/media-duration-store.ts +225 -0
- package/src/vite/motion-timing.ts +194 -0
- package/src/vite/player-page.tsx +1107 -0
- package/src/vite/render-client.ts +84 -0
- package/src/vite/sdk.ts +598 -0
- package/src/vite/server-components.tsx +241 -0
- package/src/vite/server-mdx.ts +285 -0
- package/src/vite/shader-renderer.tsx +535 -0
- package/src/vite/store-hooks.ts +117 -0
- package/src/vite/store.test.ts +202 -0
- package/src/vite/store.ts +115 -0
- package/src/vite/styles.css +21 -0
- package/src/vite/tweakpane-hook.tsx +593 -0
- package/src/vite/virtual-modules.d.ts +30 -0
- package/src/vite/vite-plugin.ts +585 -0
- package/src/vite/wave-gradient-shader.tsx +253 -0
- package/README.md +0 -370
- package/dist/antigravity-auth.d.ts +0 -15
- package/dist/antigravity-auth.d.ts.map +0 -1
- package/dist/antigravity-auth.js +0 -544
- package/dist/antigravity-image.d.ts +0 -11
- package/dist/antigravity-image.d.ts.map +0 -1
- package/dist/antigravity-image.js +0 -285
- package/dist/chatgpt-auth.d.ts.map +0 -1
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/credentials.d.ts.map +0 -1
- package/dist/gateway-model-candidates.generated.d.ts +0 -11
- package/dist/gateway-model-candidates.generated.d.ts.map +0 -1
- package/dist/gateway-model-candidates.generated.js +0 -64
- package/dist/login.d.ts.map +0 -1
- package/dist/model-catalog.d.ts.map +0 -1
- package/dist/models.d.ts.map +0 -1
- package/dist/open-browser.d.ts.map +0 -1
- package/dist/subscription.d.ts.map +0 -1
- package/dist/video-model-catalog.d.ts.map +0 -1
- package/dist/xai-auth.d.ts.map +0 -1
- /package/dist/{chatgpt-auth.d.ts → cli/chatgpt-auth.d.ts} +0 -0
- /package/dist/{chatgpt-auth.js → cli/chatgpt-auth.js} +0 -0
- /package/dist/{credentials.d.ts → cli/credentials.d.ts} +0 -0
- /package/dist/{login.d.ts → cli/login.d.ts} +0 -0
- /package/dist/{login.js → cli/login.js} +0 -0
- /package/dist/{open-browser.d.ts → cli/open-browser.d.ts} +0 -0
- /package/dist/{open-browser.js → cli/open-browser.js} +0 -0
- /package/dist/{subscription.d.ts → cli/subscription.d.ts} +0 -0
- /package/dist/{subscription.js → cli/subscription.js} +0 -0
- /package/dist/{video-model-catalog.d.ts → cli/video-model-catalog.d.ts} +0 -0
- /package/dist/{video-model-catalog.js → cli/video-model-catalog.js} +0 -0
- /package/dist/{xai-auth.d.ts → cli/xai-auth.d.ts} +0 -0
- /package/src/{chatgpt-auth.ts → cli/chatgpt-auth.ts} +0 -0
- /package/src/{login.ts → cli/login.ts} +0 -0
- /package/src/{open-browser.ts → cli/open-browser.ts} +0 -0
- /package/src/{subscription.ts → cli/subscription.ts} +0 -0
- /package/src/{video-model-catalog.ts → cli/video-model-catalog.ts} +0 -0
package/dist/antigravity-auth.js
DELETED
|
@@ -1,544 +0,0 @@
|
|
|
1
|
-
// Antigravity OAuth authentication for egaki.
|
|
2
|
-
// Handles Google OAuth + PKCE for Antigravity accounts and stores
|
|
3
|
-
// refresh/access tokens so login status can show the signed-in account.
|
|
4
|
-
import { createServer } from 'node:http';
|
|
5
|
-
import { createHash, randomBytes } from 'node:crypto';
|
|
6
|
-
import { spawn } from 'node:child_process';
|
|
7
|
-
import fs from 'node:fs';
|
|
8
|
-
import os from 'node:os';
|
|
9
|
-
import path from 'node:path';
|
|
10
|
-
import { log, note, spinner } from '@clack/prompts';
|
|
11
|
-
import pc from 'picocolors';
|
|
12
|
-
const ANTIGRAVITY_CLIENT_ID = '1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com';
|
|
13
|
-
const ANTIGRAVITY_CLIENT_SECRET = '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';
|
|
14
|
-
const ANTIGRAVITY_REDIRECT_URI = 'http://localhost:51121/oauth-callback';
|
|
15
|
-
const ANTIGRAVITY_PORT = 51121;
|
|
16
|
-
const ANTIGRAVITY_SCOPES = [
|
|
17
|
-
'https://www.googleapis.com/auth/cloud-platform',
|
|
18
|
-
'https://www.googleapis.com/auth/userinfo.email',
|
|
19
|
-
'https://www.googleapis.com/auth/userinfo.profile',
|
|
20
|
-
'https://www.googleapis.com/auth/cclog',
|
|
21
|
-
'https://www.googleapis.com/auth/experimentsandconfigs',
|
|
22
|
-
];
|
|
23
|
-
const GEMINI_CLI_USER_AGENT = 'google-api-nodejs-client/9.15.1';
|
|
24
|
-
const LOAD_ENDPOINTS = [
|
|
25
|
-
'https://cloudcode-pa.googleapis.com',
|
|
26
|
-
'https://daily-cloudcode-pa.sandbox.googleapis.com',
|
|
27
|
-
'https://autopush-cloudcode-pa.sandbox.googleapis.com',
|
|
28
|
-
];
|
|
29
|
-
const PENDING_STATE_TTL_MS = 30 * 60 * 1000;
|
|
30
|
-
const ANTIGRAVITY_DEFAULT_PROJECT_ID = 'rising-fact-p41fc';
|
|
31
|
-
function getConfigDir() {
|
|
32
|
-
const xdg = process.env['XDG_CONFIG_HOME'];
|
|
33
|
-
const base = xdg || path.join(os.homedir(), '.config');
|
|
34
|
-
return path.join(base, 'egaki');
|
|
35
|
-
}
|
|
36
|
-
function getPendingStatePath() {
|
|
37
|
-
return path.join(getConfigDir(), 'antigravity-oauth-pending.json');
|
|
38
|
-
}
|
|
39
|
-
function readPendingStateStore() {
|
|
40
|
-
const filePath = getPendingStatePath();
|
|
41
|
-
if (!fs.existsSync(filePath)) {
|
|
42
|
-
return {};
|
|
43
|
-
}
|
|
44
|
-
const raw = fs.readFileSync(filePath, 'utf-8');
|
|
45
|
-
const json = JSON.parse(raw);
|
|
46
|
-
const now = Date.now();
|
|
47
|
-
const entries = Object.entries(json).filter(([, entry]) => {
|
|
48
|
-
return now - entry.createdAt < PENDING_STATE_TTL_MS;
|
|
49
|
-
});
|
|
50
|
-
return Object.fromEntries(entries);
|
|
51
|
-
}
|
|
52
|
-
function writePendingStateStore(store) {
|
|
53
|
-
const dir = getConfigDir();
|
|
54
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
55
|
-
const filePath = getPendingStatePath();
|
|
56
|
-
fs.writeFileSync(filePath, JSON.stringify(store, null, 2) + '\n', { mode: 0o600 });
|
|
57
|
-
}
|
|
58
|
-
function savePendingState(state, verifier) {
|
|
59
|
-
const store = readPendingStateStore();
|
|
60
|
-
store[state] = { verifier, createdAt: Date.now() };
|
|
61
|
-
writePendingStateStore(store);
|
|
62
|
-
}
|
|
63
|
-
function getPendingVerifier(state) {
|
|
64
|
-
const store = readPendingStateStore();
|
|
65
|
-
return store[state]?.verifier;
|
|
66
|
-
}
|
|
67
|
-
function deletePendingState(state) {
|
|
68
|
-
const store = readPendingStateStore();
|
|
69
|
-
if (!store[state]) {
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
delete store[state];
|
|
73
|
-
writePendingStateStore(store);
|
|
74
|
-
}
|
|
75
|
-
function randomString(length) {
|
|
76
|
-
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';
|
|
77
|
-
const bytes = randomBytes(length);
|
|
78
|
-
return Array.from(bytes)
|
|
79
|
-
.map((b) => chars[b % chars.length] ?? 'a')
|
|
80
|
-
.join('');
|
|
81
|
-
}
|
|
82
|
-
function generatePKCE() {
|
|
83
|
-
const verifier = randomString(64);
|
|
84
|
-
const challenge = createHash('sha256').update(verifier).digest('base64url');
|
|
85
|
-
return { verifier, challenge };
|
|
86
|
-
}
|
|
87
|
-
function generateState() {
|
|
88
|
-
return randomBytes(32).toString('base64url');
|
|
89
|
-
}
|
|
90
|
-
function buildAuthorizeUrl({ challenge, state }) {
|
|
91
|
-
const params = new URLSearchParams({
|
|
92
|
-
client_id: ANTIGRAVITY_CLIENT_ID,
|
|
93
|
-
response_type: 'code',
|
|
94
|
-
redirect_uri: ANTIGRAVITY_REDIRECT_URI,
|
|
95
|
-
scope: ANTIGRAVITY_SCOPES.join(' '),
|
|
96
|
-
code_challenge: challenge,
|
|
97
|
-
code_challenge_method: 'S256',
|
|
98
|
-
state,
|
|
99
|
-
access_type: 'offline',
|
|
100
|
-
prompt: 'consent',
|
|
101
|
-
});
|
|
102
|
-
return `https://accounts.google.com/o/oauth2/v2/auth?${params.toString()}`;
|
|
103
|
-
}
|
|
104
|
-
async function exchangeCodeForTokens({ code, verifier }) {
|
|
105
|
-
const response = await fetch('https://oauth2.googleapis.com/token', {
|
|
106
|
-
method: 'POST',
|
|
107
|
-
headers: {
|
|
108
|
-
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
|
|
109
|
-
'User-Agent': GEMINI_CLI_USER_AGENT,
|
|
110
|
-
},
|
|
111
|
-
body: new URLSearchParams({
|
|
112
|
-
client_id: ANTIGRAVITY_CLIENT_ID,
|
|
113
|
-
client_secret: ANTIGRAVITY_CLIENT_SECRET,
|
|
114
|
-
code,
|
|
115
|
-
grant_type: 'authorization_code',
|
|
116
|
-
redirect_uri: ANTIGRAVITY_REDIRECT_URI,
|
|
117
|
-
code_verifier: verifier,
|
|
118
|
-
}).toString(),
|
|
119
|
-
});
|
|
120
|
-
if (!response.ok) {
|
|
121
|
-
throw new Error(`Antigravity token exchange failed: ${response.status}`);
|
|
122
|
-
}
|
|
123
|
-
return (await response.json());
|
|
124
|
-
}
|
|
125
|
-
async function fetchUserEmail(accessToken) {
|
|
126
|
-
const response = await fetch('https://www.googleapis.com/oauth2/v1/userinfo?alt=json', {
|
|
127
|
-
headers: {
|
|
128
|
-
Authorization: `Bearer ${accessToken}`,
|
|
129
|
-
'User-Agent': GEMINI_CLI_USER_AGENT,
|
|
130
|
-
},
|
|
131
|
-
});
|
|
132
|
-
if (!response.ok)
|
|
133
|
-
return undefined;
|
|
134
|
-
const json = (await response.json());
|
|
135
|
-
return json.email;
|
|
136
|
-
}
|
|
137
|
-
function getAntigravityClientMetadata() {
|
|
138
|
-
return `{"ideType":"ANTIGRAVITY","platform":"${process.platform === 'win32' ? 'WINDOWS' : 'MACOS'}","pluginType":"GEMINI"}`;
|
|
139
|
-
}
|
|
140
|
-
function extractManagedProjectId(payload) {
|
|
141
|
-
if (!payload)
|
|
142
|
-
return undefined;
|
|
143
|
-
const project = payload.cloudaicompanionProject;
|
|
144
|
-
if (typeof project === 'string' && project.length > 0)
|
|
145
|
-
return project;
|
|
146
|
-
if (project && typeof project === 'object' && typeof project.id === 'string' && project.id.length > 0) {
|
|
147
|
-
return project.id;
|
|
148
|
-
}
|
|
149
|
-
return undefined;
|
|
150
|
-
}
|
|
151
|
-
async function loadManagedProject(accessToken, projectId) {
|
|
152
|
-
for (const endpoint of LOAD_ENDPOINTS) {
|
|
153
|
-
const response = await fetch(`${endpoint}/v1internal:loadCodeAssist`, {
|
|
154
|
-
method: 'POST',
|
|
155
|
-
headers: {
|
|
156
|
-
Authorization: `Bearer ${accessToken}`,
|
|
157
|
-
'Content-Type': 'application/json',
|
|
158
|
-
'User-Agent': GEMINI_CLI_USER_AGENT,
|
|
159
|
-
'X-Goog-Api-Client': 'google-cloud-sdk vscode_cloudshelleditor/0.1',
|
|
160
|
-
'Client-Metadata': getAntigravityClientMetadata(),
|
|
161
|
-
},
|
|
162
|
-
body: JSON.stringify({
|
|
163
|
-
metadata: {
|
|
164
|
-
ideType: 'ANTIGRAVITY',
|
|
165
|
-
platform: process.platform === 'win32' ? 'WINDOWS' : 'MACOS',
|
|
166
|
-
pluginType: 'GEMINI',
|
|
167
|
-
...(projectId ? { duetProject: projectId } : {}),
|
|
168
|
-
},
|
|
169
|
-
}),
|
|
170
|
-
});
|
|
171
|
-
if (!response.ok)
|
|
172
|
-
continue;
|
|
173
|
-
return (await response.json());
|
|
174
|
-
}
|
|
175
|
-
return null;
|
|
176
|
-
}
|
|
177
|
-
async function onboardManagedProject(accessToken, tierId, projectId) {
|
|
178
|
-
const endpoints = [
|
|
179
|
-
'https://daily-cloudcode-pa.sandbox.googleapis.com',
|
|
180
|
-
'https://autopush-cloudcode-pa.sandbox.googleapis.com',
|
|
181
|
-
'https://cloudcode-pa.googleapis.com',
|
|
182
|
-
];
|
|
183
|
-
for (const endpoint of endpoints) {
|
|
184
|
-
for (let i = 0; i < 5; i++) {
|
|
185
|
-
const response = await fetch(`${endpoint}/v1internal:onboardUser`, {
|
|
186
|
-
method: 'POST',
|
|
187
|
-
headers: {
|
|
188
|
-
Authorization: `Bearer ${accessToken}`,
|
|
189
|
-
'Content-Type': 'application/json',
|
|
190
|
-
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Antigravity/1.18.3 Chrome/138.0.7204.235 Electron/37.3.1 Safari/537.36',
|
|
191
|
-
'X-Goog-Api-Client': 'google-cloud-sdk vscode_cloudshelleditor/0.1',
|
|
192
|
-
'Client-Metadata': getAntigravityClientMetadata(),
|
|
193
|
-
},
|
|
194
|
-
body: JSON.stringify({
|
|
195
|
-
tierId,
|
|
196
|
-
metadata: {
|
|
197
|
-
ideType: 'ANTIGRAVITY',
|
|
198
|
-
platform: process.platform === 'win32' ? 'WINDOWS' : 'MACOS',
|
|
199
|
-
pluginType: 'GEMINI',
|
|
200
|
-
...(projectId ? { duetProject: projectId } : {}),
|
|
201
|
-
},
|
|
202
|
-
}),
|
|
203
|
-
});
|
|
204
|
-
if (!response.ok) {
|
|
205
|
-
break;
|
|
206
|
-
}
|
|
207
|
-
const json = (await response.json());
|
|
208
|
-
const managed = json.response?.cloudaicompanionProject?.id;
|
|
209
|
-
if (json.done && managed) {
|
|
210
|
-
return managed;
|
|
211
|
-
}
|
|
212
|
-
await new Promise((resolve) => setTimeout(resolve, 1500));
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
return undefined;
|
|
216
|
-
}
|
|
217
|
-
async function fetchProjectId(accessToken, preferredProjectId) {
|
|
218
|
-
const loaded = await loadManagedProject(accessToken, preferredProjectId);
|
|
219
|
-
const fromLoad = extractManagedProjectId(loaded);
|
|
220
|
-
if (fromLoad)
|
|
221
|
-
return fromLoad;
|
|
222
|
-
const defaultTier = (loaded?.allowedTiers || []).find((tier) => tier?.isDefault)?.id
|
|
223
|
-
|| (loaded?.allowedTiers || [])[0]?.id
|
|
224
|
-
|| 'FREE';
|
|
225
|
-
const onboarded = await onboardManagedProject(accessToken, defaultTier, preferredProjectId);
|
|
226
|
-
if (onboarded) {
|
|
227
|
-
return onboarded;
|
|
228
|
-
}
|
|
229
|
-
const fromProjectsApi = await fetchProjectIdFromResourceManager(accessToken);
|
|
230
|
-
if (fromProjectsApi)
|
|
231
|
-
return fromProjectsApi;
|
|
232
|
-
return undefined;
|
|
233
|
-
}
|
|
234
|
-
async function fetchProjectIdFromResourceManager(accessToken) {
|
|
235
|
-
const response = await fetch('https://cloudresourcemanager.googleapis.com/v1/projects?pageSize=50', {
|
|
236
|
-
headers: {
|
|
237
|
-
Authorization: `Bearer ${accessToken}`,
|
|
238
|
-
'User-Agent': GEMINI_CLI_USER_AGENT,
|
|
239
|
-
},
|
|
240
|
-
});
|
|
241
|
-
if (!response.ok) {
|
|
242
|
-
return undefined;
|
|
243
|
-
}
|
|
244
|
-
const json = (await response.json());
|
|
245
|
-
const activeProject = (json.projects || []).find((project) => {
|
|
246
|
-
return project.projectId && project.lifecycleState === 'ACTIVE';
|
|
247
|
-
});
|
|
248
|
-
return activeProject?.projectId;
|
|
249
|
-
}
|
|
250
|
-
async function createAuthFromTokens(tokens) {
|
|
251
|
-
const [email, projectId] = await Promise.all([
|
|
252
|
-
fetchUserEmail(tokens.access_token),
|
|
253
|
-
fetchProjectId(tokens.access_token),
|
|
254
|
-
]);
|
|
255
|
-
return {
|
|
256
|
-
email,
|
|
257
|
-
refresh: formatRefreshParts({ refreshToken: tokens.refresh_token, projectId }),
|
|
258
|
-
access: tokens.access_token,
|
|
259
|
-
expires: Date.now() + (tokens.expires_in ?? 3600) * 1000,
|
|
260
|
-
projectId,
|
|
261
|
-
};
|
|
262
|
-
}
|
|
263
|
-
function parseRefreshParts(refresh) {
|
|
264
|
-
const [refreshToken, projectId] = refresh.split('|');
|
|
265
|
-
return {
|
|
266
|
-
refreshToken: refreshToken || '',
|
|
267
|
-
projectId: projectId && projectId.length > 0 ? projectId : undefined,
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
function formatRefreshParts({ refreshToken, projectId }) {
|
|
271
|
-
return projectId ? `${refreshToken}|${projectId}` : refreshToken;
|
|
272
|
-
}
|
|
273
|
-
export async function refreshAntigravityToken(auth) {
|
|
274
|
-
const { refreshToken, projectId } = parseRefreshParts(auth.refresh);
|
|
275
|
-
if (!refreshToken) {
|
|
276
|
-
return new Error('Missing refresh token');
|
|
277
|
-
}
|
|
278
|
-
try {
|
|
279
|
-
const response = await fetch('https://oauth2.googleapis.com/token', {
|
|
280
|
-
method: 'POST',
|
|
281
|
-
headers: {
|
|
282
|
-
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
|
|
283
|
-
},
|
|
284
|
-
body: new URLSearchParams({
|
|
285
|
-
grant_type: 'refresh_token',
|
|
286
|
-
refresh_token: refreshToken,
|
|
287
|
-
client_id: ANTIGRAVITY_CLIENT_ID,
|
|
288
|
-
client_secret: ANTIGRAVITY_CLIENT_SECRET,
|
|
289
|
-
}).toString(),
|
|
290
|
-
});
|
|
291
|
-
if (!response.ok) {
|
|
292
|
-
return new Error(`Antigravity token refresh failed: ${response.status}`);
|
|
293
|
-
}
|
|
294
|
-
const json = (await response.json());
|
|
295
|
-
return {
|
|
296
|
-
...auth,
|
|
297
|
-
access: json.access_token,
|
|
298
|
-
refresh: formatRefreshParts({
|
|
299
|
-
refreshToken: json.refresh_token ?? refreshToken,
|
|
300
|
-
projectId: auth.projectId ?? projectId,
|
|
301
|
-
}),
|
|
302
|
-
projectId: auth.projectId ?? projectId,
|
|
303
|
-
expires: Date.now() + (json.expires_in ?? 3600) * 1000,
|
|
304
|
-
};
|
|
305
|
-
}
|
|
306
|
-
catch (error) {
|
|
307
|
-
return error instanceof Error ? error : new Error(String(error));
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
export async function getValidAntigravityAccessToken(auth, onRefresh) {
|
|
311
|
-
const resolveProjectId = async (current, accessToken) => {
|
|
312
|
-
const parsed = parseRefreshParts(current.refresh).projectId;
|
|
313
|
-
const existing = current.projectId ?? parsed;
|
|
314
|
-
if (existing) {
|
|
315
|
-
return { projectId: existing };
|
|
316
|
-
}
|
|
317
|
-
const discovered = await fetchProjectId(accessToken, existing);
|
|
318
|
-
if (discovered) {
|
|
319
|
-
const updated = {
|
|
320
|
-
...current,
|
|
321
|
-
projectId: discovered,
|
|
322
|
-
refresh: formatRefreshParts({
|
|
323
|
-
refreshToken: parseRefreshParts(current.refresh).refreshToken,
|
|
324
|
-
projectId: discovered,
|
|
325
|
-
}),
|
|
326
|
-
};
|
|
327
|
-
return { projectId: discovered, updated };
|
|
328
|
-
}
|
|
329
|
-
return { projectId: ANTIGRAVITY_DEFAULT_PROJECT_ID };
|
|
330
|
-
};
|
|
331
|
-
if (auth.expires > Date.now() + 60_000) {
|
|
332
|
-
const resolved = await resolveProjectId(auth, auth.access);
|
|
333
|
-
if (resolved.updated) {
|
|
334
|
-
onRefresh?.(resolved.updated);
|
|
335
|
-
}
|
|
336
|
-
return {
|
|
337
|
-
accessToken: auth.access,
|
|
338
|
-
projectId: resolved.projectId,
|
|
339
|
-
};
|
|
340
|
-
}
|
|
341
|
-
const refreshed = await refreshAntigravityToken(auth);
|
|
342
|
-
if (refreshed instanceof Error) {
|
|
343
|
-
return refreshed;
|
|
344
|
-
}
|
|
345
|
-
onRefresh?.(refreshed);
|
|
346
|
-
const resolved = await resolveProjectId(refreshed, refreshed.access);
|
|
347
|
-
if (resolved.updated) {
|
|
348
|
-
onRefresh?.(resolved.updated);
|
|
349
|
-
}
|
|
350
|
-
return {
|
|
351
|
-
accessToken: refreshed.access,
|
|
352
|
-
projectId: resolved.projectId,
|
|
353
|
-
};
|
|
354
|
-
}
|
|
355
|
-
function parseCallbackUrl(callbackUrl) {
|
|
356
|
-
const trimmed = callbackUrl.trim();
|
|
357
|
-
if (!trimmed) {
|
|
358
|
-
throw new Error('Callback URL is empty');
|
|
359
|
-
}
|
|
360
|
-
const normalized = (() => {
|
|
361
|
-
if (/^https?:\/\//i.test(trimmed))
|
|
362
|
-
return trimmed;
|
|
363
|
-
if (trimmed.startsWith('localhost:'))
|
|
364
|
-
return `http://${trimmed}`;
|
|
365
|
-
if (trimmed.startsWith('/oauth-callback?'))
|
|
366
|
-
return `http://localhost:${ANTIGRAVITY_PORT}${trimmed}`;
|
|
367
|
-
if (trimmed.startsWith('oauth-callback?')) {
|
|
368
|
-
return `http://localhost:${ANTIGRAVITY_PORT}/${trimmed}`;
|
|
369
|
-
}
|
|
370
|
-
if (trimmed.includes('code=') && trimmed.includes('state=')) {
|
|
371
|
-
return `http://localhost:${ANTIGRAVITY_PORT}/oauth-callback?${trimmed}`;
|
|
372
|
-
}
|
|
373
|
-
return trimmed;
|
|
374
|
-
})();
|
|
375
|
-
const parsed = new URL(normalized);
|
|
376
|
-
const code = parsed.searchParams.get('code');
|
|
377
|
-
const state = parsed.searchParams.get('state');
|
|
378
|
-
if (!code) {
|
|
379
|
-
throw new Error('Callback URL is missing `code`');
|
|
380
|
-
}
|
|
381
|
-
if (!state) {
|
|
382
|
-
throw new Error('Callback URL is missing `state`');
|
|
383
|
-
}
|
|
384
|
-
return { code, state };
|
|
385
|
-
}
|
|
386
|
-
function openBrowser(url) {
|
|
387
|
-
if (process.platform === 'darwin') {
|
|
388
|
-
const child = spawn('open', [url], { detached: true, stdio: 'ignore' });
|
|
389
|
-
child.unref();
|
|
390
|
-
return;
|
|
391
|
-
}
|
|
392
|
-
if (process.platform === 'win32') {
|
|
393
|
-
const child = spawn('cmd', ['/c', 'start', '', url], { detached: true, stdio: 'ignore' });
|
|
394
|
-
child.unref();
|
|
395
|
-
return;
|
|
396
|
-
}
|
|
397
|
-
const child = spawn('xdg-open', [url], { detached: true, stdio: 'ignore' });
|
|
398
|
-
child.unref();
|
|
399
|
-
}
|
|
400
|
-
const HTML_SUCCESS = `<!doctype html>
|
|
401
|
-
<html><body style="font-family:system-ui;text-align:center;padding:4em">
|
|
402
|
-
<h1>Authorization Successful</h1>
|
|
403
|
-
<p>You can close this window and return to the terminal.</p>
|
|
404
|
-
</body></html>`;
|
|
405
|
-
function htmlError(message) {
|
|
406
|
-
return `<!doctype html><html><body style="font-family:system-ui;text-align:center;padding:4em">
|
|
407
|
-
<h1>Authorization Failed</h1><pre>${message}</pre></body></html>`;
|
|
408
|
-
}
|
|
409
|
-
let oauthServer;
|
|
410
|
-
let pendingOAuth;
|
|
411
|
-
function handleOAuthRequest(req, res) {
|
|
412
|
-
const url = new URL(req.url ?? '/', `http://localhost:${ANTIGRAVITY_PORT}`);
|
|
413
|
-
if (url.pathname !== '/oauth-callback') {
|
|
414
|
-
res.statusCode = 404;
|
|
415
|
-
res.end('Not found');
|
|
416
|
-
return;
|
|
417
|
-
}
|
|
418
|
-
const code = url.searchParams.get('code');
|
|
419
|
-
const state = url.searchParams.get('state');
|
|
420
|
-
const error = url.searchParams.get('error');
|
|
421
|
-
const errorDescription = url.searchParams.get('error_description');
|
|
422
|
-
if (error) {
|
|
423
|
-
const message = errorDescription || error;
|
|
424
|
-
pendingOAuth?.reject(new Error(message));
|
|
425
|
-
pendingOAuth = undefined;
|
|
426
|
-
res.statusCode = 400;
|
|
427
|
-
res.setHeader('Content-Type', 'text/html');
|
|
428
|
-
res.end(htmlError(message));
|
|
429
|
-
return;
|
|
430
|
-
}
|
|
431
|
-
if (!code) {
|
|
432
|
-
const message = 'Missing authorization code';
|
|
433
|
-
pendingOAuth?.reject(new Error(message));
|
|
434
|
-
pendingOAuth = undefined;
|
|
435
|
-
res.statusCode = 400;
|
|
436
|
-
res.setHeader('Content-Type', 'text/html');
|
|
437
|
-
res.end(htmlError(message));
|
|
438
|
-
return;
|
|
439
|
-
}
|
|
440
|
-
if (!pendingOAuth || state !== pendingOAuth.state) {
|
|
441
|
-
const message = 'Invalid state for OAuth callback';
|
|
442
|
-
pendingOAuth?.reject(new Error(message));
|
|
443
|
-
pendingOAuth = undefined;
|
|
444
|
-
res.statusCode = 400;
|
|
445
|
-
res.setHeader('Content-Type', 'text/html');
|
|
446
|
-
res.end(htmlError(message));
|
|
447
|
-
return;
|
|
448
|
-
}
|
|
449
|
-
const current = pendingOAuth;
|
|
450
|
-
pendingOAuth = undefined;
|
|
451
|
-
exchangeCodeForTokens({ code, verifier: current.verifier })
|
|
452
|
-
.then((tokens) => {
|
|
453
|
-
deletePendingState(state);
|
|
454
|
-
current.resolve(tokens);
|
|
455
|
-
})
|
|
456
|
-
.catch((err) => {
|
|
457
|
-
current.reject(err instanceof Error ? err : new Error(String(err)));
|
|
458
|
-
});
|
|
459
|
-
res.statusCode = 200;
|
|
460
|
-
res.setHeader('Content-Type', 'text/html');
|
|
461
|
-
res.end(HTML_SUCCESS);
|
|
462
|
-
}
|
|
463
|
-
async function startOAuthServer() {
|
|
464
|
-
if (oauthServer)
|
|
465
|
-
return;
|
|
466
|
-
oauthServer = createServer(handleOAuthRequest);
|
|
467
|
-
await new Promise((resolve, reject) => {
|
|
468
|
-
oauthServer?.once('error', reject);
|
|
469
|
-
oauthServer?.listen(ANTIGRAVITY_PORT, '127.0.0.1', () => resolve());
|
|
470
|
-
});
|
|
471
|
-
}
|
|
472
|
-
async function stopOAuthServer() {
|
|
473
|
-
if (!oauthServer)
|
|
474
|
-
return;
|
|
475
|
-
await new Promise((resolve) => oauthServer?.close(() => resolve()));
|
|
476
|
-
oauthServer = undefined;
|
|
477
|
-
}
|
|
478
|
-
function waitForOAuthCallback({ verifier, state }) {
|
|
479
|
-
return new Promise((resolve, reject) => {
|
|
480
|
-
const timeout = setTimeout(() => {
|
|
481
|
-
if (pendingOAuth) {
|
|
482
|
-
pendingOAuth = undefined;
|
|
483
|
-
}
|
|
484
|
-
reject(new Error('OAuth callback timeout — authorization took too long'));
|
|
485
|
-
}, 5 * 60 * 1000);
|
|
486
|
-
pendingOAuth = {
|
|
487
|
-
state,
|
|
488
|
-
verifier,
|
|
489
|
-
resolve: (tokens) => {
|
|
490
|
-
clearTimeout(timeout);
|
|
491
|
-
resolve(tokens);
|
|
492
|
-
},
|
|
493
|
-
reject: (error) => {
|
|
494
|
-
clearTimeout(timeout);
|
|
495
|
-
reject(error);
|
|
496
|
-
},
|
|
497
|
-
};
|
|
498
|
-
});
|
|
499
|
-
}
|
|
500
|
-
export async function antigravityOAuthLogin() {
|
|
501
|
-
await startOAuthServer();
|
|
502
|
-
const { verifier, challenge } = generatePKCE();
|
|
503
|
-
const state = generateState();
|
|
504
|
-
savePendingState(state, verifier);
|
|
505
|
-
const authUrl = buildAuthorizeUrl({ challenge, state });
|
|
506
|
-
note(`Open this URL in your browser to sign in with your Google account:\n\n` +
|
|
507
|
-
` ${pc.cyan(pc.underline(authUrl))}\n\n` +
|
|
508
|
-
`${pc.yellow('Warning: this Antigravity OAuth flow may violate Google Terms of Service; use at your own risk.')}` +
|
|
509
|
-
`\n${pc.yellow('Recommended: use a secondary Google account, not your primary account.')}\n\n` +
|
|
510
|
-
`${pc.dim(`Listening for callback on ${ANTIGRAVITY_REDIRECT_URI}`)}`, 'Antigravity OAuth');
|
|
511
|
-
openBrowser(authUrl);
|
|
512
|
-
const s = spinner();
|
|
513
|
-
s.start('Waiting for authorization in browser...');
|
|
514
|
-
try {
|
|
515
|
-
const tokens = await waitForOAuthCallback({ verifier, state });
|
|
516
|
-
const auth = await createAuthFromTokens(tokens);
|
|
517
|
-
s.stop('Authorization received');
|
|
518
|
-
log.success(`Signed in${auth.email ? ` as ${pc.bold(auth.email)}` : ''}${auth.projectId ? ` (${pc.cyan(auth.projectId)})` : ''}`);
|
|
519
|
-
return auth;
|
|
520
|
-
}
|
|
521
|
-
catch (error) {
|
|
522
|
-
deletePendingState(state);
|
|
523
|
-
throw error;
|
|
524
|
-
}
|
|
525
|
-
finally {
|
|
526
|
-
await stopOAuthServer();
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
export async function antigravityOAuthFromCallbackUrl(callbackUrl) {
|
|
530
|
-
const { code, state } = parseCallbackUrl(callbackUrl);
|
|
531
|
-
const verifier = getPendingVerifier(state);
|
|
532
|
-
if (!verifier) {
|
|
533
|
-
throw new Error('Could not find pending OAuth verifier for this callback URL state. Start login with `egaki login --provider antigravity` first, then pass the callback URL.');
|
|
534
|
-
}
|
|
535
|
-
try {
|
|
536
|
-
const tokens = await exchangeCodeForTokens({ code, verifier });
|
|
537
|
-
const auth = await createAuthFromTokens(tokens);
|
|
538
|
-
deletePendingState(state);
|
|
539
|
-
return auth;
|
|
540
|
-
}
|
|
541
|
-
catch (error) {
|
|
542
|
-
throw error;
|
|
543
|
-
}
|
|
544
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export declare function generateWithAntigravityModel({ prompt, model, outputPath, inputImages, aspectRatio, count, json, stdout, }: {
|
|
2
|
-
prompt: string;
|
|
3
|
-
model: string;
|
|
4
|
-
outputPath: string;
|
|
5
|
-
inputImages: Uint8Array[];
|
|
6
|
-
aspectRatio?: string;
|
|
7
|
-
count: number;
|
|
8
|
-
json: boolean;
|
|
9
|
-
stdout: boolean;
|
|
10
|
-
}): Promise<void>;
|
|
11
|
-
//# sourceMappingURL=antigravity-image.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"antigravity-image.d.ts","sourceRoot":"","sources":["../src/antigravity-image.ts"],"names":[],"mappings":"AAsBA,wBAAsB,4BAA4B,CAAC,EACjD,MAAM,EACN,KAAK,EACL,UAAU,EACV,WAAW,EACX,WAAW,EACX,KAAK,EACL,IAAI,EACJ,MAAM,GACP,EAAE;IACD,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,UAAU,EAAE,CAAA;IACzB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,OAAO,CAAA;IACb,MAAM,EAAE,OAAO,CAAA;CAChB,iBAqKA"}
|