@percygfx/opencode-antigravity-auth 0.0.0-stage → 2.0.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/LICENSE +21 -0
- package/README.md +896 -3
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/rpc.d.ts +176 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +91 -0
- package/dist/rpc.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +5 -0
- package/dist/server.js.map +1 -0
- package/dist/src/antigravity/oauth.d.ts +31 -0
- package/dist/src/antigravity/oauth.d.ts.map +1 -0
- package/dist/src/antigravity/oauth.js +171 -0
- package/dist/src/antigravity/oauth.js.map +1 -0
- package/dist/src/constants.d.ts +153 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +238 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/core/gateway.d.ts +43 -0
- package/dist/src/core/gateway.d.ts.map +1 -0
- package/dist/src/core/gateway.js +241 -0
- package/dist/src/core/gateway.js.map +1 -0
- package/dist/src/core/index.d.ts +8 -0
- package/dist/src/core/index.d.ts.map +1 -0
- package/dist/src/core/index.js +8 -0
- package/dist/src/core/index.js.map +1 -0
- package/dist/src/core/types.d.ts +60 -0
- package/dist/src/core/types.d.ts.map +1 -0
- package/dist/src/core/types.js +5 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/hooks/auto-update-checker/cache.d.ts +3 -0
- package/dist/src/hooks/auto-update-checker/cache.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/cache.js +71 -0
- package/dist/src/hooks/auto-update-checker/cache.js.map +1 -0
- package/dist/src/hooks/auto-update-checker/checker.d.ts +16 -0
- package/dist/src/hooks/auto-update-checker/checker.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/checker.js +234 -0
- package/dist/src/hooks/auto-update-checker/checker.js.map +1 -0
- package/dist/src/hooks/auto-update-checker/constants.d.ts +11 -0
- package/dist/src/hooks/auto-update-checker/constants.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/constants.js +26 -0
- package/dist/src/hooks/auto-update-checker/constants.js.map +1 -0
- package/dist/src/hooks/auto-update-checker/index.d.ts +34 -0
- package/dist/src/hooks/auto-update-checker/index.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/index.js +122 -0
- package/dist/src/hooks/auto-update-checker/index.js.map +1 -0
- package/dist/src/hooks/auto-update-checker/logging.d.ts +3 -0
- package/dist/src/hooks/auto-update-checker/logging.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/logging.js +9 -0
- package/dist/src/hooks/auto-update-checker/logging.js.map +1 -0
- package/dist/src/hooks/auto-update-checker/types.d.ts +25 -0
- package/dist/src/hooks/auto-update-checker/types.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/types.js +1 -0
- package/dist/src/hooks/auto-update-checker/types.js.map +1 -0
- package/dist/src/opencode-v2/accounts.d.ts +24 -0
- package/dist/src/opencode-v2/accounts.d.ts.map +1 -0
- package/dist/src/opencode-v2/accounts.js +109 -0
- package/dist/src/opencode-v2/accounts.js.map +1 -0
- package/dist/src/opencode-v2/catalog.d.ts +31 -0
- package/dist/src/opencode-v2/catalog.d.ts.map +1 -0
- package/dist/src/opencode-v2/catalog.js +68 -0
- package/dist/src/opencode-v2/catalog.js.map +1 -0
- package/dist/src/opencode-v2/client-shim.d.ts +9 -0
- package/dist/src/opencode-v2/client-shim.d.ts.map +1 -0
- package/dist/src/opencode-v2/client-shim.js +42 -0
- package/dist/src/opencode-v2/client-shim.js.map +1 -0
- package/dist/src/opencode-v2/clipboard.d.ts +7 -0
- package/dist/src/opencode-v2/clipboard.d.ts.map +1 -0
- package/dist/src/opencode-v2/clipboard.js +54 -0
- package/dist/src/opencode-v2/clipboard.js.map +1 -0
- package/dist/src/opencode-v2/index.d.ts +5 -0
- package/dist/src/opencode-v2/index.d.ts.map +1 -0
- package/dist/src/opencode-v2/index.js +4 -0
- package/dist/src/opencode-v2/index.js.map +1 -0
- package/dist/src/opencode-v2/plugin.d.ts +23 -0
- package/dist/src/opencode-v2/plugin.d.ts.map +1 -0
- package/dist/src/opencode-v2/plugin.js +466 -0
- package/dist/src/opencode-v2/plugin.js.map +1 -0
- package/dist/src/opencode-v2/proxy.d.ts +23 -0
- package/dist/src/opencode-v2/proxy.d.ts.map +1 -0
- package/dist/src/opencode-v2/proxy.js +148 -0
- package/dist/src/opencode-v2/proxy.js.map +1 -0
- package/dist/src/opencode-v2/quota-format.d.ts +19 -0
- package/dist/src/opencode-v2/quota-format.d.ts.map +1 -0
- package/dist/src/opencode-v2/quota-format.js +71 -0
- package/dist/src/opencode-v2/quota-format.js.map +1 -0
- package/dist/src/opencode-v2/quota.d.ts +18 -0
- package/dist/src/opencode-v2/quota.d.ts.map +1 -0
- package/dist/src/opencode-v2/quota.js +118 -0
- package/dist/src/opencode-v2/quota.js.map +1 -0
- package/dist/src/opencode-v2/sign-in-attempts.d.ts +52 -0
- package/dist/src/opencode-v2/sign-in-attempts.d.ts.map +1 -0
- package/dist/src/opencode-v2/sign-in-attempts.js +81 -0
- package/dist/src/opencode-v2/sign-in-attempts.js.map +1 -0
- package/dist/src/plugin/account-models.d.ts +38 -0
- package/dist/src/plugin/account-models.d.ts.map +1 -0
- package/dist/src/plugin/account-models.js +78 -0
- package/dist/src/plugin/account-models.js.map +1 -0
- package/dist/src/plugin/accounts.d.ts +186 -0
- package/dist/src/plugin/accounts.d.ts.map +1 -0
- package/dist/src/plugin/accounts.js +1045 -0
- package/dist/src/plugin/accounts.js.map +1 -0
- package/dist/src/plugin/auth.d.ts +21 -0
- package/dist/src/plugin/auth.d.ts.map +1 -0
- package/dist/src/plugin/auth.js +46 -0
- package/dist/src/plugin/auth.js.map +1 -0
- package/dist/src/plugin/cache/index.d.ts +5 -0
- package/dist/src/plugin/cache/index.d.ts.map +1 -0
- package/dist/src/plugin/cache/index.js +5 -0
- package/dist/src/plugin/cache/index.js.map +1 -0
- package/dist/src/plugin/cache/signature-cache.d.ts +111 -0
- package/dist/src/plugin/cache/signature-cache.d.ts.map +1 -0
- package/dist/src/plugin/cache/signature-cache.js +375 -0
- package/dist/src/plugin/cache/signature-cache.js.map +1 -0
- package/dist/src/plugin/cache.d.ts +44 -0
- package/dist/src/plugin/cache.d.ts.map +1 -0
- package/dist/src/plugin/cache.js +200 -0
- package/dist/src/plugin/cache.js.map +1 -0
- package/dist/src/plugin/cli.d.ts +26 -0
- package/dist/src/plugin/cli.d.ts.map +1 -0
- package/dist/src/plugin/cli.js +119 -0
- package/dist/src/plugin/cli.js.map +1 -0
- package/dist/src/plugin/config/index.d.ts +16 -0
- package/dist/src/plugin/config/index.d.ts.map +1 -0
- package/dist/src/plugin/config/index.js +16 -0
- package/dist/src/plugin/config/index.js.map +1 -0
- package/dist/src/plugin/config/loader.d.ts +36 -0
- package/dist/src/plugin/config/loader.d.ts.map +1 -0
- package/dist/src/plugin/config/loader.js +140 -0
- package/dist/src/plugin/config/loader.js.map +1 -0
- package/dist/src/plugin/config/models.d.ts +41 -0
- package/dist/src/plugin/config/models.d.ts.map +1 -0
- package/dist/src/plugin/config/models.js +46 -0
- package/dist/src/plugin/config/models.js.map +1 -0
- package/dist/src/plugin/config/schema.d.ts +135 -0
- package/dist/src/plugin/config/schema.d.ts.map +1 -0
- package/dist/src/plugin/config/schema.js +438 -0
- package/dist/src/plugin/config/schema.js.map +1 -0
- package/dist/src/plugin/config/updater.d.ts +55 -0
- package/dist/src/plugin/config/updater.d.ts.map +1 -0
- package/dist/src/plugin/config/updater.js +125 -0
- package/dist/src/plugin/config/updater.js.map +1 -0
- package/dist/src/plugin/core/streaming/index.d.ts +3 -0
- package/dist/src/plugin/core/streaming/index.d.ts.map +1 -0
- package/dist/src/plugin/core/streaming/index.js +3 -0
- package/dist/src/plugin/core/streaming/index.js.map +1 -0
- package/dist/src/plugin/core/streaming/transformer.d.ts +10 -0
- package/dist/src/plugin/core/streaming/transformer.d.ts.map +1 -0
- package/dist/src/plugin/core/streaming/transformer.js +271 -0
- package/dist/src/plugin/core/streaming/transformer.js.map +1 -0
- package/dist/src/plugin/core/streaming/types.d.ts +27 -0
- package/dist/src/plugin/core/streaming/types.d.ts.map +1 -0
- package/dist/src/plugin/core/streaming/types.js +1 -0
- package/dist/src/plugin/core/streaming/types.js.map +1 -0
- package/dist/src/plugin/debug.d.ts +94 -0
- package/dist/src/plugin/debug.d.ts.map +1 -0
- package/dist/src/plugin/debug.js +382 -0
- package/dist/src/plugin/debug.js.map +1 -0
- package/dist/src/plugin/errors.d.ts +28 -0
- package/dist/src/plugin/errors.d.ts.map +1 -0
- package/dist/src/plugin/errors.js +42 -0
- package/dist/src/plugin/errors.js.map +1 -0
- package/dist/src/plugin/fingerprint.d.ts +70 -0
- package/dist/src/plugin/fingerprint.d.ts.map +1 -0
- package/dist/src/plugin/fingerprint.js +138 -0
- package/dist/src/plugin/fingerprint.js.map +1 -0
- package/dist/src/plugin/image-saver.d.ts +25 -0
- package/dist/src/plugin/image-saver.d.ts.map +1 -0
- package/dist/src/plugin/image-saver.js +86 -0
- package/dist/src/plugin/image-saver.js.map +1 -0
- package/dist/src/plugin/logger.d.ts +36 -0
- package/dist/src/plugin/logger.d.ts.map +1 -0
- package/dist/src/plugin/logger.js +71 -0
- package/dist/src/plugin/logger.js.map +1 -0
- package/dist/src/plugin/logging-utils.d.ts +23 -0
- package/dist/src/plugin/logging-utils.d.ts.map +1 -0
- package/dist/src/plugin/logging-utils.js +92 -0
- package/dist/src/plugin/logging-utils.js.map +1 -0
- package/dist/src/plugin/model-discovery.d.ts +28 -0
- package/dist/src/plugin/model-discovery.d.ts.map +1 -0
- package/dist/src/plugin/model-discovery.js +59 -0
- package/dist/src/plugin/model-discovery.js.map +1 -0
- package/dist/src/plugin/model-registry.d.ts +108 -0
- package/dist/src/plugin/model-registry.d.ts.map +1 -0
- package/dist/src/plugin/model-registry.js +304 -0
- package/dist/src/plugin/model-registry.js.map +1 -0
- package/dist/src/plugin/project.d.ts +33 -0
- package/dist/src/plugin/project.d.ts.map +1 -0
- package/dist/src/plugin/project.js +235 -0
- package/dist/src/plugin/project.js.map +1 -0
- package/dist/src/plugin/quota.d.ts +58 -0
- package/dist/src/plugin/quota.d.ts.map +1 -0
- package/dist/src/plugin/quota.js +296 -0
- package/dist/src/plugin/quota.js.map +1 -0
- package/dist/src/plugin/recovery/constants.d.ts +22 -0
- package/dist/src/plugin/recovery/constants.d.ts.map +1 -0
- package/dist/src/plugin/recovery/constants.js +43 -0
- package/dist/src/plugin/recovery/constants.js.map +1 -0
- package/dist/src/plugin/recovery/index.d.ts +12 -0
- package/dist/src/plugin/recovery/index.d.ts.map +1 -0
- package/dist/src/plugin/recovery/index.js +12 -0
- package/dist/src/plugin/recovery/index.js.map +1 -0
- package/dist/src/plugin/recovery/storage.d.ts +24 -0
- package/dist/src/plugin/recovery/storage.d.ts.map +1 -0
- package/dist/src/plugin/recovery/storage.js +354 -0
- package/dist/src/plugin/recovery/storage.js.map +1 -0
- package/dist/src/plugin/recovery/types.d.ts +116 -0
- package/dist/src/plugin/recovery/types.d.ts.map +1 -0
- package/dist/src/plugin/recovery/types.js +6 -0
- package/dist/src/plugin/recovery/types.js.map +1 -0
- package/dist/src/plugin/recovery.d.ts +61 -0
- package/dist/src/plugin/recovery.d.ts.map +1 -0
- package/dist/src/plugin/recovery.js +381 -0
- package/dist/src/plugin/recovery.js.map +1 -0
- package/dist/src/plugin/refresh-queue.d.ts +100 -0
- package/dist/src/plugin/refresh-queue.d.ts.map +1 -0
- package/dist/src/plugin/refresh-queue.js +247 -0
- package/dist/src/plugin/refresh-queue.js.map +1 -0
- package/dist/src/plugin/request-helpers.d.ts +282 -0
- package/dist/src/plugin/request-helpers.d.ts.map +1 -0
- package/dist/src/plugin/request-helpers.js +2343 -0
- package/dist/src/plugin/request-helpers.js.map +1 -0
- package/dist/src/plugin/request.d.ts +95 -0
- package/dist/src/plugin/request.d.ts.map +1 -0
- package/dist/src/plugin/request.js +1491 -0
- package/dist/src/plugin/request.js.map +1 -0
- package/dist/src/plugin/rotation.d.ts +169 -0
- package/dist/src/plugin/rotation.d.ts.map +1 -0
- package/dist/src/plugin/rotation.js +328 -0
- package/dist/src/plugin/rotation.js.map +1 -0
- package/dist/src/plugin/search.d.ts +32 -0
- package/dist/src/plugin/search.d.ts.map +1 -0
- package/dist/src/plugin/search.js +195 -0
- package/dist/src/plugin/search.js.map +1 -0
- package/dist/src/plugin/server.d.ts +23 -0
- package/dist/src/plugin/server.d.ts.map +1 -0
- package/dist/src/plugin/server.js +324 -0
- package/dist/src/plugin/server.js.map +1 -0
- package/dist/src/plugin/storage.d.ts +173 -0
- package/dist/src/plugin/storage.d.ts.map +1 -0
- package/dist/src/plugin/storage.js +674 -0
- package/dist/src/plugin/storage.js.map +1 -0
- package/dist/src/plugin/stores/signature-store.d.ts +5 -0
- package/dist/src/plugin/stores/signature-store.d.ts.map +1 -0
- package/dist/src/plugin/stores/signature-store.js +25 -0
- package/dist/src/plugin/stores/signature-store.js.map +1 -0
- package/dist/src/plugin/thinking-recovery.d.ts +90 -0
- package/dist/src/plugin/thinking-recovery.d.ts.map +1 -0
- package/dist/src/plugin/thinking-recovery.js +316 -0
- package/dist/src/plugin/thinking-recovery.js.map +1 -0
- package/dist/src/plugin/token.d.ts +19 -0
- package/dist/src/plugin/token.d.ts.map +1 -0
- package/dist/src/plugin/token.js +128 -0
- package/dist/src/plugin/token.js.map +1 -0
- package/dist/src/plugin/transform/claude.d.ts +80 -0
- package/dist/src/plugin/transform/claude.d.ts.map +1 -0
- package/dist/src/plugin/transform/claude.js +265 -0
- package/dist/src/plugin/transform/claude.js.map +1 -0
- package/dist/src/plugin/transform/cross-model-sanitizer.d.ts +35 -0
- package/dist/src/plugin/transform/cross-model-sanitizer.d.ts.map +1 -0
- package/dist/src/plugin/transform/cross-model-sanitizer.js +225 -0
- package/dist/src/plugin/transform/cross-model-sanitizer.js.map +1 -0
- package/dist/src/plugin/transform/gemini.d.ts +100 -0
- package/dist/src/plugin/transform/gemini.d.ts.map +1 -0
- package/dist/src/plugin/transform/gemini.js +446 -0
- package/dist/src/plugin/transform/gemini.js.map +1 -0
- package/dist/src/plugin/transform/index.d.ts +15 -0
- package/dist/src/plugin/transform/index.d.ts.map +1 -0
- package/dist/src/plugin/transform/index.js +14 -0
- package/dist/src/plugin/transform/index.js.map +1 -0
- package/dist/src/plugin/transform/model-resolver.d.ts +99 -0
- package/dist/src/plugin/transform/model-resolver.d.ts.map +1 -0
- package/dist/src/plugin/transform/model-resolver.js +340 -0
- package/dist/src/plugin/transform/model-resolver.js.map +1 -0
- package/dist/src/plugin/transform/types.d.ts +111 -0
- package/dist/src/plugin/transform/types.d.ts.map +1 -0
- package/dist/src/plugin/transform/types.js +1 -0
- package/dist/src/plugin/transform/types.js.map +1 -0
- package/dist/src/plugin/types.d.ts +97 -0
- package/dist/src/plugin/types.d.ts.map +1 -0
- package/dist/src/plugin/types.js +1 -0
- package/dist/src/plugin/types.js.map +1 -0
- package/dist/src/plugin/ui/ansi.d.ts +32 -0
- package/dist/src/plugin/ui/ansi.d.ts.map +1 -0
- package/dist/src/plugin/ui/ansi.js +52 -0
- package/dist/src/plugin/ui/ansi.js.map +1 -0
- package/dist/src/plugin/ui/auth-menu.d.ts +33 -0
- package/dist/src/plugin/ui/auth-menu.d.ts.map +1 -0
- package/dist/src/plugin/ui/auth-menu.js +110 -0
- package/dist/src/plugin/ui/auth-menu.js.map +1 -0
- package/dist/src/plugin/ui/confirm.d.ts +2 -0
- package/dist/src/plugin/ui/confirm.d.ts.map +1 -0
- package/dist/src/plugin/ui/confirm.js +15 -0
- package/dist/src/plugin/ui/confirm.js.map +1 -0
- package/dist/src/plugin/ui/select.d.ts +23 -0
- package/dist/src/plugin/ui/select.d.ts.map +1 -0
- package/dist/src/plugin/ui/select.js +254 -0
- package/dist/src/plugin/ui/select.js.map +1 -0
- package/dist/src/plugin/version.d.ts +19 -0
- package/dist/src/plugin/version.d.ts.map +1 -0
- package/dist/src/plugin/version.js +80 -0
- package/dist/src/plugin/version.js.map +1 -0
- package/dist/src/plugin.d.ts +51 -0
- package/dist/src/plugin.d.ts.map +1 -0
- package/dist/src/plugin.js +2852 -0
- package/dist/src/plugin.js.map +1 -0
- package/dist/tui.js +420 -0
- package/package.json +99 -6
|
@@ -0,0 +1,466 @@
|
|
|
1
|
+
import { Credential, Integration, Plugin } from "@opencode/plugin";
|
|
2
|
+
import { AntigravityRpc } from "../../rpc";
|
|
3
|
+
import { authorizeAntigravity, exchangeAntigravity } from "../antigravity/oauth";
|
|
4
|
+
import { createAntigravityPlugin, getActiveAccountManager, getStateFromAuthorizationUrl, parseOAuthCallbackInput, persistAccountPool, shouldSkipLocalServer, } from "../plugin";
|
|
5
|
+
import { applyPoolModels, discoverPoolModels } from "../plugin/account-models";
|
|
6
|
+
import { isOAuthAuth, parseRefreshParts } from "../plugin/auth";
|
|
7
|
+
import { createLogger } from "../plugin/logger";
|
|
8
|
+
import { getRegistryFetchedAt } from "../plugin/model-registry";
|
|
9
|
+
import { startOAuthListener } from "../plugin/server";
|
|
10
|
+
import { loadAccounts } from "../plugin/storage";
|
|
11
|
+
import { refreshAccessToken } from "../plugin/token";
|
|
12
|
+
import { ANTIGRAVITY_INTEGRATION_ID, ANTIGRAVITY_METHOD_ID, ANTIGRAVITY_PASTE_METHOD_ID, ANTIGRAVITY_PROVIDER_ID, antigravityModels, antigravityProviderInfo, } from "./catalog";
|
|
13
|
+
import { poolAuth, removeAccount, setAccountEnabled } from "./accounts";
|
|
14
|
+
import { createV2ClientShim } from "./client-shim";
|
|
15
|
+
import { copyToClipboard } from "./clipboard";
|
|
16
|
+
import { ProxyRequestError, startLoopbackProxy } from "./proxy";
|
|
17
|
+
import { createQuotaReporter } from "./quota";
|
|
18
|
+
import { createSignInAttempts } from "./sign-in-attempts";
|
|
19
|
+
const log = createLogger("opencode-v2");
|
|
20
|
+
export const ANTIGRAVITY_V2_PLUGIN_ID = "opencode-antigravity-auth";
|
|
21
|
+
const LOGIN_HINT = `Run \`opencode auth login ${ANTIGRAVITY_INTEGRATION_ID}\` to sign in.`;
|
|
22
|
+
/** How long a discovered model list is used before asking Antigravity again. */
|
|
23
|
+
const MODEL_DISCOVERY_INTERVAL_MS = 6 * 60 * 60 * 1000;
|
|
24
|
+
/** After a failed discovery, ask again this much later rather than on every request. */
|
|
25
|
+
const MODEL_DISCOVERY_RETRY_MS = 5 * 60 * 1000;
|
|
26
|
+
/** OpenCode drops an unfinished sign-in after 10 minutes; give up on the browser well before. */
|
|
27
|
+
const BROWSER_CALLBACK_TIMEOUT_MS = 9 * 60 * 1000;
|
|
28
|
+
function linkSentence(copied) {
|
|
29
|
+
return copied
|
|
30
|
+
? "The sign-in link is copied to your clipboard (it is also shown below)."
|
|
31
|
+
: "Copy the sign-in link shown below.";
|
|
32
|
+
}
|
|
33
|
+
/** Instructions for the browser flow: the local callback page finishes the sign-in. */
|
|
34
|
+
export function buildBrowserSignInInstructions(copied) {
|
|
35
|
+
return [
|
|
36
|
+
linkSentence(copied),
|
|
37
|
+
"Open it in any browser on this computer and sign in with Google.",
|
|
38
|
+
'The browser then shows "All set!" and the sign-in finishes here on its own.',
|
|
39
|
+
].join(" ");
|
|
40
|
+
}
|
|
41
|
+
/** Instructions for the paste flow: no local server, the redirect URL is pasted back. */
|
|
42
|
+
export function buildPasteSignInInstructions(copied, reason) {
|
|
43
|
+
return [
|
|
44
|
+
reason,
|
|
45
|
+
linkSentence(copied),
|
|
46
|
+
"Open it in any browser and sign in with Google.",
|
|
47
|
+
"Google then redirects to a localhost page that will not load; that is expected.",
|
|
48
|
+
"Copy that page's full URL from the address bar and paste it here.",
|
|
49
|
+
]
|
|
50
|
+
.filter(Boolean)
|
|
51
|
+
.join(" ");
|
|
52
|
+
}
|
|
53
|
+
function errorMessage(error) {
|
|
54
|
+
return error instanceof Error ? error.message : String(error);
|
|
55
|
+
}
|
|
56
|
+
/** Adds Google's `login_hint`, so the sign-in page preselects that account. */
|
|
57
|
+
export function withLoginHint(url, loginHint) {
|
|
58
|
+
if (!loginHint)
|
|
59
|
+
return url;
|
|
60
|
+
const parsed = new URL(url);
|
|
61
|
+
parsed.searchParams.set("login_hint", loginHint);
|
|
62
|
+
return parsed.toString();
|
|
63
|
+
}
|
|
64
|
+
function hasFetch(result) {
|
|
65
|
+
return typeof result.fetch === "function";
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* opencode v2 entry point. It reuses the whole v1 pipeline (request rewriting, multi-account
|
|
69
|
+
* rotation, quota fallback, recovery of thinking blocks) and only replaces the opencode-facing
|
|
70
|
+
* glue that v2 changed:
|
|
71
|
+
*
|
|
72
|
+
* - sign-in: OAuth methods on the `google-antigravity` integration. The plugin never opens a
|
|
73
|
+
* browser; the link is copied and either the v1 callback page catches the redirect, or the
|
|
74
|
+
* redirect URL is pasted back;
|
|
75
|
+
* - models: a `google-antigravity` provider listing what Antigravity currently recommends
|
|
76
|
+
* (discovered after sign-in and every few hours; a built-in list until then);
|
|
77
|
+
* - requests: opencode's native Google client is pointed at a loopback proxy that feeds the
|
|
78
|
+
* v1 `fetch(url, init)` interceptor, because v2 no longer accepts a custom `fetch`.
|
|
79
|
+
*/
|
|
80
|
+
export function createAntigravityV2Plugin() {
|
|
81
|
+
return Plugin.define({
|
|
82
|
+
id: ANTIGRAVITY_V2_PLUGIN_ID,
|
|
83
|
+
async setup(ctx) {
|
|
84
|
+
const client = createV2ClientShim();
|
|
85
|
+
const v1 = await createAntigravityPlugin(ANTIGRAVITY_PROVIDER_ID)({
|
|
86
|
+
client,
|
|
87
|
+
directory: ctx.location.directory,
|
|
88
|
+
});
|
|
89
|
+
const getAuth = async () => {
|
|
90
|
+
const connection = await ctx.integration.connection.active(ANTIGRAVITY_INTEGRATION_ID);
|
|
91
|
+
const credential = connection
|
|
92
|
+
? await ctx.integration.connection.resolve(connection).catch((error) => {
|
|
93
|
+
log.warn("could not resolve the Antigravity credential", { error: String(error) });
|
|
94
|
+
return undefined;
|
|
95
|
+
})
|
|
96
|
+
: undefined;
|
|
97
|
+
if (credential?.type !== "oauth")
|
|
98
|
+
return { type: "none" };
|
|
99
|
+
return {
|
|
100
|
+
type: "oauth",
|
|
101
|
+
refresh: credential.refresh,
|
|
102
|
+
access: credential.access,
|
|
103
|
+
expires: credential.expires,
|
|
104
|
+
};
|
|
105
|
+
};
|
|
106
|
+
// The v1 loader loads the account pool and starts the refresh queue. It is built lazily on
|
|
107
|
+
// the first request, and rebuilt when the signed-in account changes or a login adds one.
|
|
108
|
+
let pipeline;
|
|
109
|
+
const getPipeline = async () => {
|
|
110
|
+
const auth = await getAuth();
|
|
111
|
+
// Never call the v1 loader without an OAuth credential: it wipes the stored account pool
|
|
112
|
+
// when it sees none, which would delete accounts that are only temporarily unreachable.
|
|
113
|
+
if (!isOAuthAuth(auth)) {
|
|
114
|
+
throw new ProxyRequestError(`Not signed in to Google Antigravity. ${LOGIN_HINT}`, 401);
|
|
115
|
+
}
|
|
116
|
+
if (pipeline?.refresh !== auth.refresh) {
|
|
117
|
+
// Accounts removed from the pool must not come back through opencode's login.
|
|
118
|
+
const loaderAuth = await poolAuth(auth);
|
|
119
|
+
const getLoaderAuth = async () => {
|
|
120
|
+
const latest = await getAuth();
|
|
121
|
+
return isOAuthAuth(latest) ? loaderAuth : latest;
|
|
122
|
+
};
|
|
123
|
+
const current = {
|
|
124
|
+
refresh: auth.refresh,
|
|
125
|
+
fetch: v1.auth.loader(getLoaderAuth, { models: {} }).then((result) => {
|
|
126
|
+
if (!hasFetch(result))
|
|
127
|
+
throw new ProxyRequestError(`Antigravity is not ready. ${LOGIN_HINT}`, 401);
|
|
128
|
+
return result.fetch;
|
|
129
|
+
}),
|
|
130
|
+
};
|
|
131
|
+
pipeline = current;
|
|
132
|
+
current.fetch.catch(() => {
|
|
133
|
+
if (pipeline === current)
|
|
134
|
+
pipeline = undefined;
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
return pipeline.fetch;
|
|
138
|
+
};
|
|
139
|
+
// Model discovery: ask Antigravity which models each account can use (plans differ: free
|
|
140
|
+
// accounts lack Claude 5.5 and Gemini 4 Argon). The catalog offers every model one account
|
|
141
|
+
// has, and the pipeline routes each request to accounts that have its model. New models
|
|
142
|
+
// appear (and retired ones disappear) without a plugin update.
|
|
143
|
+
let discovering;
|
|
144
|
+
/** When every account's model list was last known to be fresh; undefined until checked. */
|
|
145
|
+
let modelsFreshAt;
|
|
146
|
+
/** The pool's accounts plus `extra` (a sign-in that just finished); the login if neither. */
|
|
147
|
+
const discoveryAccounts = async (extra) => {
|
|
148
|
+
const stored = (await loadAccounts().catch(() => null))?.accounts ?? [];
|
|
149
|
+
const byToken = new Map(stored.map((account) => [account.refreshToken, account]));
|
|
150
|
+
for (const account of extra) {
|
|
151
|
+
byToken.set(account.refreshToken, { ...byToken.get(account.refreshToken), ...account });
|
|
152
|
+
}
|
|
153
|
+
if (byToken.size > 0)
|
|
154
|
+
return [...byToken.values()];
|
|
155
|
+
const auth = await getAuth();
|
|
156
|
+
if (!isOAuthAuth(auth))
|
|
157
|
+
return [];
|
|
158
|
+
const parts = parseRefreshParts(auth.refresh);
|
|
159
|
+
if (!parts.refreshToken)
|
|
160
|
+
return [];
|
|
161
|
+
return [{ ...parts, refreshToken: parts.refreshToken, access: auth.access, expires: auth.expires }];
|
|
162
|
+
};
|
|
163
|
+
const discoverModels = async (extra) => {
|
|
164
|
+
try {
|
|
165
|
+
const accounts = await discoveryAccounts(extra);
|
|
166
|
+
if (accounts.length === 0)
|
|
167
|
+
return;
|
|
168
|
+
const results = await discoverPoolModels(accounts, client, ANTIGRAVITY_PROVIDER_ID);
|
|
169
|
+
if (!(await applyPoolModels(results, getActiveAccountManager()))) {
|
|
170
|
+
throw new Error(results.map((result) => result.error).filter(Boolean).join("; ") || "no account answered");
|
|
171
|
+
}
|
|
172
|
+
modelsFreshAt = Date.now();
|
|
173
|
+
await ctx.provider.reload();
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
modelsFreshAt = Date.now() - MODEL_DISCOVERY_INTERVAL_MS + MODEL_DISCOVERY_RETRY_MS;
|
|
177
|
+
log.warn("model discovery failed; keeping the current model list", { error: String(error) });
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
/** Runs one discovery at a time; a sign-in during a run gets its own run afterwards. */
|
|
181
|
+
const refreshModels = (extra = []) => {
|
|
182
|
+
if (discovering && extra.length === 0)
|
|
183
|
+
return discovering;
|
|
184
|
+
const run = (discovering ?? Promise.resolve())
|
|
185
|
+
.then(() => discoverModels(extra))
|
|
186
|
+
.finally(() => {
|
|
187
|
+
if (discovering === run)
|
|
188
|
+
discovering = undefined;
|
|
189
|
+
});
|
|
190
|
+
discovering = run;
|
|
191
|
+
return run;
|
|
192
|
+
};
|
|
193
|
+
/** When the stored lists were discovered (the oldest account's), or undefined if any is missing. */
|
|
194
|
+
const storedModelsFreshAt = async () => {
|
|
195
|
+
const registryAt = getRegistryFetchedAt();
|
|
196
|
+
if (registryAt === undefined)
|
|
197
|
+
return undefined;
|
|
198
|
+
let oldest = registryAt;
|
|
199
|
+
for (const account of (await loadAccounts().catch(() => null))?.accounts ?? []) {
|
|
200
|
+
if (account.availableModelsUpdatedAt === undefined)
|
|
201
|
+
return undefined;
|
|
202
|
+
oldest = Math.min(oldest, account.availableModelsUpdatedAt);
|
|
203
|
+
}
|
|
204
|
+
return oldest;
|
|
205
|
+
};
|
|
206
|
+
const refreshModelsIfStale = async () => {
|
|
207
|
+
modelsFreshAt ??= await storedModelsFreshAt();
|
|
208
|
+
if (modelsFreshAt !== undefined && Date.now() - modelsFreshAt < MODEL_DISCOVERY_INTERVAL_MS)
|
|
209
|
+
return;
|
|
210
|
+
if (!isOAuthAuth(await getAuth()))
|
|
211
|
+
return;
|
|
212
|
+
await refreshModels();
|
|
213
|
+
};
|
|
214
|
+
const proxy = await startLoopbackProxy(async (url, init) => {
|
|
215
|
+
// Until the accounts' model lists are known, a request could go to an account whose plan
|
|
216
|
+
// lacks the model; the first request waits for them, later ones refresh in the background.
|
|
217
|
+
const refreshing = refreshModelsIfStale().catch(() => { });
|
|
218
|
+
if (modelsFreshAt === undefined)
|
|
219
|
+
await refreshing;
|
|
220
|
+
const fetchThroughPipeline = await getPipeline();
|
|
221
|
+
return fetchThroughPipeline(url, init);
|
|
222
|
+
});
|
|
223
|
+
// Google account emails by refresh token, so opencode can label each saved login.
|
|
224
|
+
const emailsByRefreshToken = new Map();
|
|
225
|
+
const rememberEmail = (refresh, email) => {
|
|
226
|
+
const token = parseRefreshParts(refresh).refreshToken;
|
|
227
|
+
if (token && email)
|
|
228
|
+
emailsByRefreshToken.set(token, email);
|
|
229
|
+
};
|
|
230
|
+
void loadAccounts()
|
|
231
|
+
.then((storage) => {
|
|
232
|
+
for (const account of storage?.accounts ?? [])
|
|
233
|
+
rememberEmail(account.refreshToken, account.email);
|
|
234
|
+
})
|
|
235
|
+
.catch(() => { });
|
|
236
|
+
const label = (credential) => emailsByRefreshToken.get(parseRefreshParts(credential.refresh).refreshToken);
|
|
237
|
+
/** Exchanges the authorization code, adds the account to the pool, returns the credential. */
|
|
238
|
+
const finishSignIn = async (code, state, methodID) => {
|
|
239
|
+
const result = await exchangeAntigravity(code, state);
|
|
240
|
+
if (result.type === "failed")
|
|
241
|
+
throw new Error(`Google sign-in failed: ${result.error}`);
|
|
242
|
+
// Same pool file as v1, so earlier accounts and rotation state carry over.
|
|
243
|
+
await persistAccountPool([result], false);
|
|
244
|
+
rememberEmail(result.refresh, result.email);
|
|
245
|
+
pipeline = undefined;
|
|
246
|
+
log.info("account added", { email: result.email });
|
|
247
|
+
const parts = parseRefreshParts(result.refresh);
|
|
248
|
+
if (parts.refreshToken) {
|
|
249
|
+
void refreshModels([
|
|
250
|
+
{
|
|
251
|
+
...parts,
|
|
252
|
+
refreshToken: parts.refreshToken,
|
|
253
|
+
projectId: parts.projectId || result.projectId,
|
|
254
|
+
email: result.email,
|
|
255
|
+
access: result.access,
|
|
256
|
+
expires: result.expires,
|
|
257
|
+
},
|
|
258
|
+
]);
|
|
259
|
+
}
|
|
260
|
+
return Credential.OAuth.make({
|
|
261
|
+
type: "oauth",
|
|
262
|
+
methodID: Integration.MethodID.make(methodID),
|
|
263
|
+
refresh: result.refresh,
|
|
264
|
+
access: result.access,
|
|
265
|
+
expires: Math.max(0, Math.floor(result.expires)),
|
|
266
|
+
});
|
|
267
|
+
};
|
|
268
|
+
const pasteAuthorization = async (methodID, reason, loginHint) => {
|
|
269
|
+
const authorization = await authorizeAntigravity("");
|
|
270
|
+
const fallbackState = getStateFromAuthorizationUrl(authorization.url);
|
|
271
|
+
const url = withLoginHint(authorization.url, loginHint);
|
|
272
|
+
const copied = await copyToClipboard(url);
|
|
273
|
+
return {
|
|
274
|
+
mode: "code",
|
|
275
|
+
url,
|
|
276
|
+
instructions: buildPasteSignInInstructions(copied, reason),
|
|
277
|
+
callback: async (pasted) => {
|
|
278
|
+
const params = parseOAuthCallbackInput(pasted, fallbackState);
|
|
279
|
+
if ("error" in params)
|
|
280
|
+
throw new Error(params.error);
|
|
281
|
+
return finishSignIn(params.code, params.state, methodID);
|
|
282
|
+
},
|
|
283
|
+
};
|
|
284
|
+
};
|
|
285
|
+
// Port 51121 is fixed by the OAuth client's redirect URI, so only one browser sign-in can
|
|
286
|
+
// wait at a time; a new attempt replaces an abandoned one.
|
|
287
|
+
let listener;
|
|
288
|
+
const closeListener = async () => {
|
|
289
|
+
const current = listener;
|
|
290
|
+
listener = undefined;
|
|
291
|
+
await current?.close().catch(() => { });
|
|
292
|
+
};
|
|
293
|
+
const browserAuthorization = async (loginHint) => {
|
|
294
|
+
if (shouldSkipLocalServer()) {
|
|
295
|
+
return pasteAuthorization(ANTIGRAVITY_METHOD_ID, "This looks like a remote or WSL session, so the redirect cannot reach a local page.", loginHint);
|
|
296
|
+
}
|
|
297
|
+
await closeListener();
|
|
298
|
+
let current;
|
|
299
|
+
try {
|
|
300
|
+
current = await startOAuthListener({ timeoutMs: BROWSER_CALLBACK_TIMEOUT_MS });
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
log.warn("could not start the OAuth callback listener", { error: String(error) });
|
|
304
|
+
return pasteAuthorization(ANTIGRAVITY_METHOD_ID, "Port 51121 is busy, so the browser cannot report back on its own.", loginHint);
|
|
305
|
+
}
|
|
306
|
+
listener = current;
|
|
307
|
+
let authorization;
|
|
308
|
+
try {
|
|
309
|
+
authorization = await authorizeAntigravity("");
|
|
310
|
+
}
|
|
311
|
+
catch (error) {
|
|
312
|
+
await closeListener();
|
|
313
|
+
throw error;
|
|
314
|
+
}
|
|
315
|
+
const url = withLoginHint(authorization.url, loginHint);
|
|
316
|
+
const fallbackState = getStateFromAuthorizationUrl(authorization.url);
|
|
317
|
+
const copied = await copyToClipboard(url);
|
|
318
|
+
const callback = (async () => {
|
|
319
|
+
try {
|
|
320
|
+
const url = await current.waitForCallback();
|
|
321
|
+
const code = url.searchParams.get("code");
|
|
322
|
+
const state = url.searchParams.get("state");
|
|
323
|
+
if (!code || !state) {
|
|
324
|
+
throw new Error(url.searchParams.get("error") ?? "Missing code or state in the Google redirect");
|
|
325
|
+
}
|
|
326
|
+
return await finishSignIn(code, state, ANTIGRAVITY_METHOD_ID);
|
|
327
|
+
}
|
|
328
|
+
finally {
|
|
329
|
+
if (listener === current)
|
|
330
|
+
listener = undefined;
|
|
331
|
+
await current.close().catch(() => { });
|
|
332
|
+
}
|
|
333
|
+
})();
|
|
334
|
+
// opencode stops awaiting an abandoned attempt; keep its later rejection from going unhandled.
|
|
335
|
+
callback.catch(() => { });
|
|
336
|
+
return {
|
|
337
|
+
mode: "auto",
|
|
338
|
+
url,
|
|
339
|
+
instructions: buildBrowserSignInInstructions(copied),
|
|
340
|
+
callback,
|
|
341
|
+
/**
|
|
342
|
+
* Fallback when the callback page could not be reached (plugin reloaded, timeout,
|
|
343
|
+
* browser on another machine): finish with the URL the browser ended up on.
|
|
344
|
+
*/
|
|
345
|
+
paste: async (pasted) => {
|
|
346
|
+
const params = parseOAuthCallbackInput(pasted, fallbackState);
|
|
347
|
+
if ("error" in params)
|
|
348
|
+
throw new Error(params.error);
|
|
349
|
+
if (listener === current)
|
|
350
|
+
await closeListener();
|
|
351
|
+
return finishSignIn(params.code, params.state, ANTIGRAVITY_METHOD_ID);
|
|
352
|
+
},
|
|
353
|
+
};
|
|
354
|
+
};
|
|
355
|
+
const refresh = async (credential) => {
|
|
356
|
+
const refreshed = await refreshAccessToken({
|
|
357
|
+
type: "oauth",
|
|
358
|
+
refresh: credential.refresh,
|
|
359
|
+
access: credential.access,
|
|
360
|
+
expires: credential.expires,
|
|
361
|
+
}, client, ANTIGRAVITY_PROVIDER_ID);
|
|
362
|
+
if (!refreshed?.access) {
|
|
363
|
+
throw new Error(`Google Antigravity token refresh failed. ${LOGIN_HINT}`);
|
|
364
|
+
}
|
|
365
|
+
return Credential.OAuth.make({
|
|
366
|
+
...credential,
|
|
367
|
+
refresh: refreshed.refresh,
|
|
368
|
+
access: refreshed.access,
|
|
369
|
+
expires: Math.max(0, Math.floor(refreshed.expires ?? Date.now() + 3_600_000)),
|
|
370
|
+
});
|
|
371
|
+
};
|
|
372
|
+
await ctx.integration.transform((editor) => {
|
|
373
|
+
editor.update(ANTIGRAVITY_INTEGRATION_ID, (integration) => {
|
|
374
|
+
integration.name = "Google Antigravity";
|
|
375
|
+
});
|
|
376
|
+
editor.method.update({
|
|
377
|
+
integrationID: ANTIGRAVITY_INTEGRATION_ID,
|
|
378
|
+
method: { id: ANTIGRAVITY_METHOD_ID, type: "oauth", label: "Google account (Antigravity)" },
|
|
379
|
+
authorize: () => browserAuthorization(),
|
|
380
|
+
refresh,
|
|
381
|
+
label,
|
|
382
|
+
});
|
|
383
|
+
editor.method.update({
|
|
384
|
+
integrationID: ANTIGRAVITY_INTEGRATION_ID,
|
|
385
|
+
method: {
|
|
386
|
+
id: ANTIGRAVITY_PASTE_METHOD_ID,
|
|
387
|
+
type: "oauth",
|
|
388
|
+
label: "Google account (Antigravity, paste the redirect URL)",
|
|
389
|
+
},
|
|
390
|
+
authorize: () => pasteAuthorization(ANTIGRAVITY_PASTE_METHOD_ID),
|
|
391
|
+
refresh,
|
|
392
|
+
label,
|
|
393
|
+
});
|
|
394
|
+
});
|
|
395
|
+
await ctx.provider.transform((editor) => {
|
|
396
|
+
editor.add({ info: antigravityProviderInfo(proxy.baseURL), models: antigravityModels() });
|
|
397
|
+
});
|
|
398
|
+
// Per-account quota and account actions for the TUI sidebar (tui.tsx).
|
|
399
|
+
const quota = createQuotaReporter(client, ANTIGRAVITY_PROVIDER_ID);
|
|
400
|
+
const signIns = createSignInAttempts({
|
|
401
|
+
start: (loginHint) => browserAuthorization(loginHint),
|
|
402
|
+
emailOf: (credential) => label(credential),
|
|
403
|
+
onComplete: () => quota.invalidate(),
|
|
404
|
+
onCancel: () => closeListener(),
|
|
405
|
+
});
|
|
406
|
+
await ctx.rpc.register(AntigravityRpc, {
|
|
407
|
+
quota: async (input) => quota.snapshot(input.refresh === true),
|
|
408
|
+
setAccountEnabled: async (input, call) => {
|
|
409
|
+
try {
|
|
410
|
+
await setAccountEnabled(getActiveAccountManager(), input.index, input.email, input.enabled);
|
|
411
|
+
}
|
|
412
|
+
catch (error) {
|
|
413
|
+
return call.error("failed", errorMessage(error), {});
|
|
414
|
+
}
|
|
415
|
+
quota.invalidate();
|
|
416
|
+
return {};
|
|
417
|
+
},
|
|
418
|
+
removeAccount: async (input, call) => {
|
|
419
|
+
let remaining;
|
|
420
|
+
try {
|
|
421
|
+
remaining = await removeAccount(getActiveAccountManager(), input.index, input.email);
|
|
422
|
+
}
|
|
423
|
+
catch (error) {
|
|
424
|
+
return call.error("failed", errorMessage(error), {});
|
|
425
|
+
}
|
|
426
|
+
quota.invalidate();
|
|
427
|
+
return { remaining };
|
|
428
|
+
},
|
|
429
|
+
signInStart: async (input, call) => {
|
|
430
|
+
try {
|
|
431
|
+
return await signIns.start(input.email);
|
|
432
|
+
}
|
|
433
|
+
catch (error) {
|
|
434
|
+
return call.error("failed", errorMessage(error), {});
|
|
435
|
+
}
|
|
436
|
+
},
|
|
437
|
+
signInStatus: async (input) => {
|
|
438
|
+
const status = signIns.status(input.attemptID);
|
|
439
|
+
return status.status === "failed"
|
|
440
|
+
? { status: "failed", message: status.message }
|
|
441
|
+
: status.status === "complete"
|
|
442
|
+
? { status: "complete", ...(status.email ? { email: status.email } : {}) }
|
|
443
|
+
: { status: status.status };
|
|
444
|
+
},
|
|
445
|
+
signInComplete: async (input, call) => {
|
|
446
|
+
try {
|
|
447
|
+
return await signIns.complete(input.attemptID, input.code);
|
|
448
|
+
}
|
|
449
|
+
catch (error) {
|
|
450
|
+
return call.error("failed", errorMessage(error), {});
|
|
451
|
+
}
|
|
452
|
+
},
|
|
453
|
+
signInCancel: async (input) => {
|
|
454
|
+
await signIns.cancel(input.attemptID);
|
|
455
|
+
return {};
|
|
456
|
+
},
|
|
457
|
+
});
|
|
458
|
+
void refreshModelsIfStale().catch(() => { });
|
|
459
|
+
return async () => {
|
|
460
|
+
await closeListener();
|
|
461
|
+
await proxy.close();
|
|
462
|
+
};
|
|
463
|
+
},
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../../src/opencode-v2/plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** The host the v1 request pipeline recognises and rewrites to Antigravity. */
|
|
2
|
+
export declare const UPSTREAM_ORIGIN = "https://generativelanguage.googleapis.com";
|
|
3
|
+
export type ProxyHandler = (url: string, init: RequestInit) => Promise<Response>;
|
|
4
|
+
export interface LoopbackProxy {
|
|
5
|
+
/** Gemini-style base URL (`.../v1beta`) to hand to opencode's native Google client. */
|
|
6
|
+
readonly baseURL: string;
|
|
7
|
+
close(): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
/** Error the handler can throw to control the HTTP status of the reply. */
|
|
10
|
+
export declare class ProxyRequestError extends Error {
|
|
11
|
+
readonly status: number;
|
|
12
|
+
constructor(message: string, status: number);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* opencode v2 drives Google models through its own native client, which takes a `baseURL` but no
|
|
16
|
+
* custom `fetch`. This loopback server sits behind that `baseURL` and hands each request to the
|
|
17
|
+
* v1 `fetch(url, init)` pipeline as if it were addressed to generativelanguage.googleapis.com.
|
|
18
|
+
*
|
|
19
|
+
* It listens on 127.0.0.1 only, and every path must start with a random per-process secret so
|
|
20
|
+
* other local processes cannot spend the signed-in accounts' quota.
|
|
21
|
+
*/
|
|
22
|
+
export declare function startLoopbackProxy(handler: ProxyHandler): Promise<LoopbackProxy>;
|
|
23
|
+
//# sourceMappingURL=proxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../../src/opencode-v2/proxy.ts"],"names":[],"mappings":"AAUA,+EAA+E;AAC/E,eAAO,MAAM,eAAe,8CAA8C,CAAC;AAwB3E,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEjF,MAAM,WAAW,aAAa;IAC5B,uFAAuF;IACvF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,2EAA2E;AAC3E,qBAAa,iBAAkB,SAAQ,KAAK;IAGxC,QAAQ,CAAC,MAAM,EAAE,MAAM;gBADvB,OAAO,EAAE,MAAM,EACN,MAAM,EAAE,MAAM;CAK1B;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CA+BtF"}
|