opencode-ag-auth 1.5.2
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 +749 -0
- 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/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 +138 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +220 -0
- package/dist/src/constants.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 +237 -0
- package/dist/src/hooks/auto-update-checker/checker.js.map +1 -0
- package/dist/src/hooks/auto-update-checker/constants.d.ts +9 -0
- package/dist/src/hooks/auto-update-checker/constants.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/constants.js +23 -0
- package/dist/src/hooks/auto-update-checker/constants.js.map +1 -0
- package/dist/src/hooks/auto-update-checker/index.d.ts +34 -0
- package/dist/src/hooks/auto-update-checker/index.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/index.js +125 -0
- package/dist/src/hooks/auto-update-checker/index.js.map +1 -0
- package/dist/src/hooks/auto-update-checker/types.d.ts +25 -0
- package/dist/src/hooks/auto-update-checker/types.d.ts.map +1 -0
- package/dist/src/hooks/auto-update-checker/types.js +1 -0
- package/dist/src/hooks/auto-update-checker/types.js.map +1 -0
- package/dist/src/plugin/accounts.d.ts +173 -0
- package/dist/src/plugin/accounts.d.ts.map +1 -0
- package/dist/src/plugin/accounts.js +1035 -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 +27 -0
- package/dist/src/plugin/cli.d.ts.map +1 -0
- package/dist/src/plugin/cli.js +130 -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 +37 -0
- package/dist/src/plugin/config/loader.d.ts.map +1 -0
- package/dist/src/plugin/config/loader.js +196 -0
- package/dist/src/plugin/config/loader.js.map +1 -0
- package/dist/src/plugin/config/models.d.ts +27 -0
- package/dist/src/plugin/config/models.d.ts.map +1 -0
- package/dist/src/plugin/config/models.js +70 -0
- package/dist/src/plugin/config/models.js.map +1 -0
- package/dist/src/plugin/config/schema.d.ts +133 -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 +418 -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 +64 -0
- package/dist/src/plugin/fingerprint.d.ts.map +1 -0
- package/dist/src/plugin/fingerprint.js +125 -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 +54 -0
- package/dist/src/plugin/logger.d.ts.map +1 -0
- package/dist/src/plugin/logger.js +120 -0
- package/dist/src/plugin/logger.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 +234 -0
- package/dist/src/plugin/project.js.map +1 -0
- package/dist/src/plugin/proxy.d.ts +2 -0
- package/dist/src/plugin/proxy.d.ts.map +1 -0
- package/dist/src/plugin/proxy.js +20 -0
- package/dist/src/plugin/proxy.js.map +1 -0
- package/dist/src/plugin/quota.d.ts +35 -0
- package/dist/src/plugin/quota.d.ts.map +1 -0
- package/dist/src/plugin/quota.js +273 -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 +378 -0
- package/dist/src/plugin/recovery.js.map +1 -0
- package/dist/src/plugin/refresh-queue.d.ts +101 -0
- package/dist/src/plugin/refresh-queue.d.ts.map +1 -0
- package/dist/src/plugin/refresh-queue.js +248 -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 +2319 -0
- package/dist/src/plugin/request-helpers.js.map +1 -0
- package/dist/src/plugin/request.d.ts +93 -0
- package/dist/src/plugin/request.d.ts.map +1 -0
- package/dist/src/plugin/request.js +1352 -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 +136 -0
- package/dist/src/plugin/storage.d.ts.map +1 -0
- package/dist/src/plugin/storage.js +588 -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 +465 -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 +104 -0
- package/dist/src/plugin/transform/model-resolver.d.ts.map +1 -0
- package/dist/src/plugin/transform/model-resolver.js +361 -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 +30 -0
- package/dist/src/plugin.d.ts.map +1 -0
- package/dist/src/plugin.js +3050 -0
- package/dist/src/plugin.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google Search Tool Implementation
|
|
3
|
+
*
|
|
4
|
+
* Due to Gemini API limitations, native search tools (googleSearch, urlContext)
|
|
5
|
+
* cannot be combined with function declarations. This module implements a
|
|
6
|
+
* wrapper that makes separate API calls with only the grounding tools enabled.
|
|
7
|
+
*/
|
|
8
|
+
export interface SearchArgs {
|
|
9
|
+
query: string;
|
|
10
|
+
urls?: string[];
|
|
11
|
+
thinking?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface SearchResult {
|
|
14
|
+
text: string;
|
|
15
|
+
sources: Array<{
|
|
16
|
+
title: string;
|
|
17
|
+
url: string;
|
|
18
|
+
}>;
|
|
19
|
+
searchQueries: string[];
|
|
20
|
+
urlsRetrieved: Array<{
|
|
21
|
+
url: string;
|
|
22
|
+
status: string;
|
|
23
|
+
}>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Execute a Google Search using the Gemini grounding API.
|
|
27
|
+
*
|
|
28
|
+
* This makes a SEPARATE API call with only googleSearch/urlContext tools,
|
|
29
|
+
* which is required because these tools cannot be combined with function declarations.
|
|
30
|
+
*/
|
|
31
|
+
export declare function executeSearch(args: SearchArgs, accessToken: string, projectId: string, abortSignal?: AbortSignal): Promise<string>;
|
|
32
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/plugin/search.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA6EH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvD;AA0HD;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,UAAU,EAChB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,MAAM,CAAC,CAqFjB"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google Search Tool Implementation
|
|
3
|
+
*
|
|
4
|
+
* Due to Gemini API limitations, native search tools (googleSearch, urlContext)
|
|
5
|
+
* cannot be combined with function declarations. This module implements a
|
|
6
|
+
* wrapper that makes separate API calls with only the grounding tools enabled.
|
|
7
|
+
*/
|
|
8
|
+
import { ANTIGRAVITY_ENDPOINT, getAntigravityHeaders, SEARCH_MODEL, SEARCH_TIMEOUT_MS, SEARCH_SYSTEM_INSTRUCTION, } from "../constants";
|
|
9
|
+
import { createLogger } from "./logger";
|
|
10
|
+
const log = createLogger("search");
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Helper Functions
|
|
13
|
+
// ============================================================================
|
|
14
|
+
let sessionCounter = 0;
|
|
15
|
+
const sessionPrefix = `search-${Date.now().toString(36)}`;
|
|
16
|
+
function generateRequestId() {
|
|
17
|
+
return `search-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
|
|
18
|
+
}
|
|
19
|
+
function getSessionId() {
|
|
20
|
+
sessionCounter++;
|
|
21
|
+
return `${sessionPrefix}-${sessionCounter}`;
|
|
22
|
+
}
|
|
23
|
+
function formatSearchResult(result) {
|
|
24
|
+
const lines = [];
|
|
25
|
+
lines.push("## Search Results\n");
|
|
26
|
+
lines.push(result.text);
|
|
27
|
+
lines.push("");
|
|
28
|
+
if (result.sources.length > 0) {
|
|
29
|
+
lines.push("### Sources");
|
|
30
|
+
for (const source of result.sources) {
|
|
31
|
+
lines.push(`- [${source.title}](${source.url})`);
|
|
32
|
+
}
|
|
33
|
+
lines.push("");
|
|
34
|
+
}
|
|
35
|
+
if (result.urlsRetrieved.length > 0) {
|
|
36
|
+
lines.push("### URLs Retrieved");
|
|
37
|
+
for (const url of result.urlsRetrieved) {
|
|
38
|
+
const status = url.status === "URL_RETRIEVAL_STATUS_SUCCESS" ? "✓" : "✗";
|
|
39
|
+
lines.push(`- ${status} ${url.url}`);
|
|
40
|
+
}
|
|
41
|
+
lines.push("");
|
|
42
|
+
}
|
|
43
|
+
if (result.searchQueries.length > 0) {
|
|
44
|
+
lines.push("### Search Queries Used");
|
|
45
|
+
for (const q of result.searchQueries) {
|
|
46
|
+
lines.push(`- "${q}"`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return lines.join("\n");
|
|
50
|
+
}
|
|
51
|
+
function parseSearchResponse(data) {
|
|
52
|
+
const result = {
|
|
53
|
+
text: "",
|
|
54
|
+
sources: [],
|
|
55
|
+
searchQueries: [],
|
|
56
|
+
urlsRetrieved: [],
|
|
57
|
+
};
|
|
58
|
+
const response = data.response;
|
|
59
|
+
if (!response || !response.candidates || response.candidates.length === 0) {
|
|
60
|
+
if (data.error) {
|
|
61
|
+
result.text = `Error: ${data.error.message ?? "Unknown error"}`;
|
|
62
|
+
}
|
|
63
|
+
else if (response?.error) {
|
|
64
|
+
result.text = `Error: ${response.error.message ?? "Unknown error"}`;
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
const candidate = response.candidates[0];
|
|
69
|
+
if (!candidate) {
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
// Extract text content
|
|
73
|
+
if (candidate.content?.parts) {
|
|
74
|
+
result.text = candidate.content.parts
|
|
75
|
+
.map((p) => p.text ?? "")
|
|
76
|
+
.filter(Boolean)
|
|
77
|
+
.join("\n");
|
|
78
|
+
}
|
|
79
|
+
// Extract grounding metadata
|
|
80
|
+
if (candidate.groundingMetadata) {
|
|
81
|
+
const gm = candidate.groundingMetadata;
|
|
82
|
+
if (gm.webSearchQueries) {
|
|
83
|
+
result.searchQueries = gm.webSearchQueries;
|
|
84
|
+
}
|
|
85
|
+
if (gm.groundingChunks) {
|
|
86
|
+
for (const chunk of gm.groundingChunks) {
|
|
87
|
+
if (chunk.web?.uri && chunk.web?.title) {
|
|
88
|
+
result.sources.push({
|
|
89
|
+
title: chunk.web.title,
|
|
90
|
+
url: chunk.web.uri,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Extract URL context metadata
|
|
97
|
+
if (candidate.urlContextMetadata?.url_metadata) {
|
|
98
|
+
for (const meta of candidate.urlContextMetadata.url_metadata) {
|
|
99
|
+
if (meta.retrieved_url) {
|
|
100
|
+
result.urlsRetrieved.push({
|
|
101
|
+
url: meta.retrieved_url,
|
|
102
|
+
status: meta.url_retrieval_status ?? "UNKNOWN",
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
109
|
+
// ============================================================================
|
|
110
|
+
// Main Search Function
|
|
111
|
+
// ============================================================================
|
|
112
|
+
/**
|
|
113
|
+
* Execute a Google Search using the Gemini grounding API.
|
|
114
|
+
*
|
|
115
|
+
* This makes a SEPARATE API call with only googleSearch/urlContext tools,
|
|
116
|
+
* which is required because these tools cannot be combined with function declarations.
|
|
117
|
+
*/
|
|
118
|
+
export async function executeSearch(args, accessToken, projectId, abortSignal) {
|
|
119
|
+
const { query, urls, thinking = true } = args;
|
|
120
|
+
// Build prompt with optional URLs
|
|
121
|
+
let prompt = query;
|
|
122
|
+
if (urls && urls.length > 0) {
|
|
123
|
+
const urlList = urls.join("\n");
|
|
124
|
+
prompt = `${query}\n\nURLs to analyze:\n${urlList}`;
|
|
125
|
+
}
|
|
126
|
+
// Build tools array - only grounding tools, no function declarations
|
|
127
|
+
const tools = [];
|
|
128
|
+
tools.push({ googleSearch: {} });
|
|
129
|
+
if (urls && urls.length > 0) {
|
|
130
|
+
tools.push({ urlContext: {} });
|
|
131
|
+
}
|
|
132
|
+
const requestPayload = {
|
|
133
|
+
systemInstruction: {
|
|
134
|
+
parts: [{ text: SEARCH_SYSTEM_INSTRUCTION }],
|
|
135
|
+
},
|
|
136
|
+
contents: [
|
|
137
|
+
{
|
|
138
|
+
role: "user",
|
|
139
|
+
parts: [{ text: prompt }],
|
|
140
|
+
},
|
|
141
|
+
],
|
|
142
|
+
tools,
|
|
143
|
+
generationConfig: {
|
|
144
|
+
temperature: 0,
|
|
145
|
+
topP: 1,
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
// Wrap in Antigravity format
|
|
149
|
+
const wrappedBody = {
|
|
150
|
+
project: projectId,
|
|
151
|
+
model: SEARCH_MODEL,
|
|
152
|
+
userAgent: "antigravity",
|
|
153
|
+
requestId: generateRequestId(),
|
|
154
|
+
request: {
|
|
155
|
+
...requestPayload,
|
|
156
|
+
sessionId: getSessionId(),
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
// Use non-streaming endpoint for search
|
|
160
|
+
const url = `${ANTIGRAVITY_ENDPOINT}/v1internal:generateContent`;
|
|
161
|
+
log.debug("Executing search", {
|
|
162
|
+
query,
|
|
163
|
+
urlCount: urls?.length ?? 0,
|
|
164
|
+
thinking,
|
|
165
|
+
});
|
|
166
|
+
try {
|
|
167
|
+
const response = await fetch(url, {
|
|
168
|
+
method: "POST",
|
|
169
|
+
headers: {
|
|
170
|
+
...getAntigravityHeaders(),
|
|
171
|
+
Authorization: `Bearer ${accessToken}`,
|
|
172
|
+
"Content-Type": "application/json",
|
|
173
|
+
},
|
|
174
|
+
body: JSON.stringify(wrappedBody),
|
|
175
|
+
signal: abortSignal ?? AbortSignal.timeout(SEARCH_TIMEOUT_MS),
|
|
176
|
+
});
|
|
177
|
+
if (!response.ok) {
|
|
178
|
+
const errorText = await response.text();
|
|
179
|
+
log.debug("Search API error", { status: response.status, error: errorText });
|
|
180
|
+
return `## Search Error\n\nFailed to execute search: ${response.status} ${response.statusText}\n\n${errorText}\n\nPlease try again with a different query.`;
|
|
181
|
+
}
|
|
182
|
+
const data = (await response.json());
|
|
183
|
+
log.debug("Search response received", { hasResponse: !!data.response });
|
|
184
|
+
const result = parseSearchResponse(data);
|
|
185
|
+
const formatted = formatSearchResult(result);
|
|
186
|
+
log.debug("Search response formatted", { resultLength: formatted.length });
|
|
187
|
+
return formatted;
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
191
|
+
log.debug("Search execution error", { error: message });
|
|
192
|
+
return `## Search Error\n\nFailed to execute search: ${message}. Please try again with a different query.`;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/plugin/search.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,YAAY,EACZ,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;AA+EnC,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E,IAAI,cAAc,GAAG,CAAC,CAAC;AACvB,MAAM,aAAa,GAAG,UAAU,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;AAE1D,SAAS,iBAAiB;IACxB,OAAO,UAAU,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AACvF,CAAC;AAED,SAAS,YAAY;IACnB,cAAc,EAAE,CAAC;IACjB,OAAO,GAAG,aAAa,IAAI,cAAc,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAoB;IAC9C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAClC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC1B,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;QACnD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,KAAK,8BAA8B,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACzE,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;QACvC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACtC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,mBAAmB,CAAC,IAA+B;IAC1D,MAAM,MAAM,GAAiB;QAC3B,IAAI,EAAE,EAAE;QACR,OAAO,EAAE,EAAE;QACX,aAAa,EAAE,EAAE;QACjB,aAAa,EAAE,EAAE;KAClB,CAAC;IAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC/B,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1E,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,GAAG,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,eAAe,EAAE,CAAC;QAClE,CAAC;aAAM,IAAI,QAAQ,EAAE,KAAK,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,GAAG,UAAU,QAAQ,CAAC,KAAK,CAAC,OAAO,IAAI,eAAe,EAAE,CAAC;QACtE,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACzC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,uBAAuB;IACvB,IAAI,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK;aAClC,GAAG,CAAC,CAAC,CAAoB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;aAC3C,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAED,6BAA6B;IAC7B,IAAI,SAAS,CAAC,iBAAiB,EAAE,CAAC;QAChC,MAAM,EAAE,GAAG,SAAS,CAAC,iBAAiB,CAAC;QAEvC,IAAI,EAAE,CAAC,gBAAgB,EAAE,CAAC;YACxB,MAAM,CAAC,aAAa,GAAG,EAAE,CAAC,gBAAgB,CAAC;QAC7C,CAAC;QAED,IAAI,EAAE,CAAC,eAAe,EAAE,CAAC;YACvB,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,eAAe,EAAE,CAAC;gBACvC,IAAI,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;oBACvC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;wBAClB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK;wBACtB,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG;qBACnB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,IAAI,SAAS,CAAC,kBAAkB,EAAE,YAAY,EAAE,CAAC;QAC/C,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,kBAAkB,CAAC,YAAY,EAAE,CAAC;YAC7D,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvB,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;oBACxB,GAAG,EAAE,IAAI,CAAC,aAAa;oBACvB,MAAM,EAAE,IAAI,CAAC,oBAAoB,IAAI,SAAS;iBAC/C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+EAA+E;AAC/E,uBAAuB;AACvB,+EAA+E;AAE/E;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAgB,EAChB,WAAmB,EACnB,SAAiB,EACjB,WAAyB;IAEzB,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;IAE9C,kCAAkC;IAClC,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,GAAG,GAAG,KAAK,yBAAyB,OAAO,EAAE,CAAC;IACtD,CAAC;IAED,qEAAqE;IACrE,MAAM,KAAK,GAAmC,EAAE,CAAC;IACjD,KAAK,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;IACjC,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,cAAc,GAAG;QACrB,iBAAiB,EAAE;YACjB,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,CAAC;SAC7C;QACD,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;aAC1B;SACF;QACD,KAAK;QACL,gBAAgB,EAAE;YAChB,WAAW,EAAE,CAAC;YACd,IAAI,EAAE,CAAC;SACR;KACF,CAAC;IAEF,6BAA6B;IAC7B,MAAM,WAAW,GAAG;QAClB,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,YAAY;QACnB,SAAS,EAAE,aAAa;QACxB,SAAS,EAAE,iBAAiB,EAAE;QAC9B,OAAO,EAAE;YACP,GAAG,cAAc;YACjB,SAAS,EAAE,YAAY,EAAE;SAC1B;KACF,CAAC;IAEF,wCAAwC;IACxC,MAAM,GAAG,GAAG,GAAG,oBAAoB,6BAA6B,CAAC;IAEjE,GAAG,CAAC,KAAK,CAAC,kBAAkB,EAAE;QAC5B,KAAK;QACL,QAAQ,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;QAC3B,QAAQ;KACT,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,GAAG,qBAAqB,EAAE;gBAC1B,aAAa,EAAE,UAAU,WAAW,EAAE;gBACtC,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;YACjC,MAAM,EAAE,WAAW,IAAI,WAAW,CAAC,OAAO,CAAC,iBAAiB,CAAC;SAC9D,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACxC,GAAG,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAC7E,OAAO,gDAAgD,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,OAAO,SAAS,8CAA8C,CAAC;QAC9J,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA8B,CAAC;QAClE,GAAG,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAExE,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC7C,GAAG,CAAC,KAAK,CAAC,2BAA2B,EAAE,EAAE,YAAY,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3E,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,GAAG,CAAC,KAAK,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACxD,OAAO,gDAAgD,OAAO,4CAA4C,CAAC;IAC7G,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
interface OAuthListenerOptions {
|
|
2
|
+
/**
|
|
3
|
+
* How long to wait for the OAuth redirect before timing out (in milliseconds).
|
|
4
|
+
*/
|
|
5
|
+
timeoutMs?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface OAuthListener {
|
|
8
|
+
/**
|
|
9
|
+
* Resolves with the callback URL once Google redirects back to the local server.
|
|
10
|
+
*/
|
|
11
|
+
waitForCallback(): Promise<URL>;
|
|
12
|
+
/**
|
|
13
|
+
* Cleanly stop listening for callbacks.
|
|
14
|
+
*/
|
|
15
|
+
close(): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Starts a lightweight HTTP server that listens for the Antigravity OAuth redirect
|
|
19
|
+
* and resolves with the captured callback URL.
|
|
20
|
+
*/
|
|
21
|
+
export declare function startOAuthListener({ timeoutMs }?: OAuthListenerOptions): Promise<OAuthListener>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/plugin/server.ts"],"names":[],"mappings":"AAKA,UAAU,oBAAoB;IAC5B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAkHD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,EAAE,SAAyB,EAAE,GAAE,oBAAyB,GACvD,OAAO,CAAC,aAAa,CAAC,CAgOxB"}
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import { createServer } from "node:http";
|
|
2
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
3
|
+
import { ANTIGRAVITY_REDIRECT_URI } from "../constants";
|
|
4
|
+
const redirectUri = new URL(ANTIGRAVITY_REDIRECT_URI);
|
|
5
|
+
const callbackPath = redirectUri.pathname || "/";
|
|
6
|
+
/**
|
|
7
|
+
* Detect if running in OrbStack Docker with --network host mode.
|
|
8
|
+
* OrbStack's host networking only forwards ports bound to 127.0.0.1 to macOS.
|
|
9
|
+
*/
|
|
10
|
+
function isOrbStackDockerHost() {
|
|
11
|
+
// Check if we're in Docker
|
|
12
|
+
if (!existsSync("/.dockerenv")) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
// Check for OrbStack-specific indicators
|
|
16
|
+
// OrbStack sets specific environment variables or has identifiable characteristics
|
|
17
|
+
try {
|
|
18
|
+
// OrbStack containers often have /run/.containerenv or specific mount patterns
|
|
19
|
+
// Also check if /proc/version contains orbstack
|
|
20
|
+
if (existsSync("/proc/version")) {
|
|
21
|
+
const version = readFileSync("/proc/version", "utf8").toLowerCase();
|
|
22
|
+
if (version.includes("orbstack")) {
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// Check hostname pattern (OrbStack uses specific patterns)
|
|
27
|
+
const hostname = process.env.HOSTNAME || "";
|
|
28
|
+
if (hostname.startsWith("orbstack-") || hostname.endsWith(".orb") || hostname === "orbstack") {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
// Check for OrbStack's network host mode by looking at resolv.conf
|
|
32
|
+
// OrbStack with --network host has specific DNS configuration
|
|
33
|
+
if (existsSync("/etc/resolv.conf")) {
|
|
34
|
+
const resolv = readFileSync("/etc/resolv.conf", "utf8");
|
|
35
|
+
if (resolv.includes("orb.local") || resolv.includes("orbstack")) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// Fallback: Check if running on macOS/Darwin host via Docker
|
|
40
|
+
// This is a heuristic - if in Docker on Linux but /proc/version shows darwin-like patterns
|
|
41
|
+
if (process.platform === "linux" && existsSync("/.dockerenv")) {
|
|
42
|
+
// Most OrbStack containers will have been caught above
|
|
43
|
+
// For safety, also check common OrbStack mount patterns
|
|
44
|
+
if (existsSync("/run/host-services")) {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Ignore errors, fall through to default
|
|
51
|
+
}
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Detect WSL (Windows Subsystem for Linux) environment.
|
|
56
|
+
*/
|
|
57
|
+
function isWSL() {
|
|
58
|
+
if (process.platform !== "linux")
|
|
59
|
+
return false;
|
|
60
|
+
try {
|
|
61
|
+
const release = readFileSync("/proc/version", "utf8").toLowerCase();
|
|
62
|
+
return release.includes("microsoft") || release.includes("wsl");
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Detect remote/SSH environment where localhost may not be accessible from browser.
|
|
70
|
+
*/
|
|
71
|
+
function isRemoteEnvironment() {
|
|
72
|
+
if (process.env.SSH_CLIENT || process.env.SSH_TTY || process.env.SSH_CONNECTION) {
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
if (process.env.REMOTE_CONTAINERS || process.env.CODESPACES) {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Determine the best bind address for the OAuth callback server.
|
|
82
|
+
*
|
|
83
|
+
* Priority:
|
|
84
|
+
* 1. OPENCODE_ANTIGRAVITY_OAUTH_BIND environment variable (user override)
|
|
85
|
+
* 2. OrbStack Docker with --network host: 127.0.0.1 (required for port forwarding)
|
|
86
|
+
* 3. WSL/SSH/Remote: 0.0.0.0 (needed for cross-network access)
|
|
87
|
+
* 4. Default: 127.0.0.1 (most secure for local development)
|
|
88
|
+
*/
|
|
89
|
+
function getBindAddress() {
|
|
90
|
+
// Allow user override via environment variable
|
|
91
|
+
const envBind = process.env.OPENCODE_ANTIGRAVITY_OAUTH_BIND;
|
|
92
|
+
if (envBind) {
|
|
93
|
+
return envBind;
|
|
94
|
+
}
|
|
95
|
+
// OrbStack Docker needs 127.0.0.1 for --network host port forwarding
|
|
96
|
+
if (isOrbStackDockerHost()) {
|
|
97
|
+
return "127.0.0.1";
|
|
98
|
+
}
|
|
99
|
+
// WSL and remote environments need 0.0.0.0 to be reachable
|
|
100
|
+
if (isWSL() || isRemoteEnvironment()) {
|
|
101
|
+
return "0.0.0.0";
|
|
102
|
+
}
|
|
103
|
+
// Default to 127.0.0.1 for security (local-only access)
|
|
104
|
+
return "127.0.0.1";
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Starts a lightweight HTTP server that listens for the Antigravity OAuth redirect
|
|
108
|
+
* and resolves with the captured callback URL.
|
|
109
|
+
*/
|
|
110
|
+
export async function startOAuthListener({ timeoutMs = 5 * 60 * 1000 } = {}) {
|
|
111
|
+
const port = redirectUri.port
|
|
112
|
+
? Number.parseInt(redirectUri.port, 10)
|
|
113
|
+
: redirectUri.protocol === "https:"
|
|
114
|
+
? 443
|
|
115
|
+
: 80;
|
|
116
|
+
const origin = `${redirectUri.protocol}//${redirectUri.host}`;
|
|
117
|
+
let settled = false;
|
|
118
|
+
let resolveCallback;
|
|
119
|
+
let rejectCallback;
|
|
120
|
+
let timeoutHandle;
|
|
121
|
+
const callbackPromise = new Promise((resolve, reject) => {
|
|
122
|
+
resolveCallback = (url) => {
|
|
123
|
+
if (settled)
|
|
124
|
+
return;
|
|
125
|
+
settled = true;
|
|
126
|
+
if (timeoutHandle)
|
|
127
|
+
clearTimeout(timeoutHandle);
|
|
128
|
+
resolve(url);
|
|
129
|
+
};
|
|
130
|
+
rejectCallback = (error) => {
|
|
131
|
+
if (settled)
|
|
132
|
+
return;
|
|
133
|
+
settled = true;
|
|
134
|
+
if (timeoutHandle)
|
|
135
|
+
clearTimeout(timeoutHandle);
|
|
136
|
+
reject(error);
|
|
137
|
+
};
|
|
138
|
+
});
|
|
139
|
+
const successResponse = `<!DOCTYPE html>
|
|
140
|
+
<html lang="en">
|
|
141
|
+
<head>
|
|
142
|
+
<meta charset="utf-8" />
|
|
143
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
144
|
+
<title>Authentication Successful</title>
|
|
145
|
+
<style>
|
|
146
|
+
:root {
|
|
147
|
+
--bg: #FAFAFA;
|
|
148
|
+
--card-bg: #FFFFFF;
|
|
149
|
+
--text-primary: #1F2937;
|
|
150
|
+
--text-secondary: #6B7280;
|
|
151
|
+
--accent: #2563EB;
|
|
152
|
+
--success: #10B981;
|
|
153
|
+
--border: #E5E7EB;
|
|
154
|
+
}
|
|
155
|
+
@media (prefers-color-scheme: dark) {
|
|
156
|
+
:root {
|
|
157
|
+
--bg: #111827;
|
|
158
|
+
--card-bg: #1F2937;
|
|
159
|
+
--text-primary: #F9FAFB;
|
|
160
|
+
--text-secondary: #9CA3AF;
|
|
161
|
+
--accent: #3B82F6;
|
|
162
|
+
--success: #34D399;
|
|
163
|
+
--border: #374151;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
body {
|
|
167
|
+
margin: 0;
|
|
168
|
+
min-height: 100vh;
|
|
169
|
+
display: flex;
|
|
170
|
+
align-items: center;
|
|
171
|
+
justify-content: center;
|
|
172
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
173
|
+
background: var(--bg);
|
|
174
|
+
color: var(--text-primary);
|
|
175
|
+
padding: 1rem;
|
|
176
|
+
}
|
|
177
|
+
.card {
|
|
178
|
+
background: var(--card-bg);
|
|
179
|
+
border-radius: 16px;
|
|
180
|
+
padding: 3rem 2rem;
|
|
181
|
+
width: 100%;
|
|
182
|
+
max-width: 400px;
|
|
183
|
+
text-align: center;
|
|
184
|
+
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
|
|
185
|
+
border: 1px solid var(--border);
|
|
186
|
+
}
|
|
187
|
+
.icon-wrapper {
|
|
188
|
+
width: 64px;
|
|
189
|
+
height: 64px;
|
|
190
|
+
background: rgba(16, 185, 129, 0.1);
|
|
191
|
+
border-radius: 50%;
|
|
192
|
+
display: flex;
|
|
193
|
+
align-items: center;
|
|
194
|
+
justify-content: center;
|
|
195
|
+
margin: 0 auto 1.5rem;
|
|
196
|
+
}
|
|
197
|
+
.icon {
|
|
198
|
+
width: 32px;
|
|
199
|
+
height: 32px;
|
|
200
|
+
color: var(--success);
|
|
201
|
+
}
|
|
202
|
+
h1 {
|
|
203
|
+
font-size: 1.5rem;
|
|
204
|
+
font-weight: 600;
|
|
205
|
+
margin: 0 0 0.5rem;
|
|
206
|
+
letter-spacing: -0.025em;
|
|
207
|
+
}
|
|
208
|
+
p {
|
|
209
|
+
color: var(--text-secondary);
|
|
210
|
+
font-size: 0.95rem;
|
|
211
|
+
line-height: 1.5;
|
|
212
|
+
margin: 0 0 2rem;
|
|
213
|
+
}
|
|
214
|
+
.btn {
|
|
215
|
+
display: inline-flex;
|
|
216
|
+
align-items: center;
|
|
217
|
+
justify-content: center;
|
|
218
|
+
background: var(--text-primary);
|
|
219
|
+
color: var(--card-bg);
|
|
220
|
+
font-weight: 500;
|
|
221
|
+
padding: 0.75rem 1.5rem;
|
|
222
|
+
border-radius: 8px;
|
|
223
|
+
text-decoration: none;
|
|
224
|
+
transition: opacity 0.2s;
|
|
225
|
+
font-size: 0.95rem;
|
|
226
|
+
border: none;
|
|
227
|
+
cursor: pointer;
|
|
228
|
+
width: 100%;
|
|
229
|
+
box-sizing: border-box;
|
|
230
|
+
}
|
|
231
|
+
.btn:hover {
|
|
232
|
+
opacity: 0.9;
|
|
233
|
+
}
|
|
234
|
+
.sub-text {
|
|
235
|
+
margin-top: 1rem;
|
|
236
|
+
font-size: 0.8rem;
|
|
237
|
+
color: var(--text-secondary);
|
|
238
|
+
}
|
|
239
|
+
</style>
|
|
240
|
+
</head>
|
|
241
|
+
<body>
|
|
242
|
+
<div class="card">
|
|
243
|
+
<div class="icon-wrapper">
|
|
244
|
+
<svg class="icon" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
245
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M5 13l4 4L19 7" />
|
|
246
|
+
</svg>
|
|
247
|
+
</div>
|
|
248
|
+
<h1>All set!</h1>
|
|
249
|
+
<p>You've successfully authenticated with Antigravity. You can now return to Opencode.</p>
|
|
250
|
+
<button class="btn" onclick="closeWindow()">Close this tab</button>
|
|
251
|
+
<div class="sub-text">Usage Tip: Most browsers block auto-closing. If the button doesn't work, please close the tab manually.</div>
|
|
252
|
+
</div>
|
|
253
|
+
<script>
|
|
254
|
+
function closeWindow() {
|
|
255
|
+
window.close();
|
|
256
|
+
// Fallback if window.close() is blocked
|
|
257
|
+
document.querySelector('.btn').textContent = "Tab cannot be closed automatically";
|
|
258
|
+
document.querySelector('.btn').style.opacity = "0.5";
|
|
259
|
+
document.querySelector('.btn').style.cursor = "default";
|
|
260
|
+
}
|
|
261
|
+
</script>
|
|
262
|
+
</body>
|
|
263
|
+
</html>`;
|
|
264
|
+
timeoutHandle = setTimeout(() => {
|
|
265
|
+
rejectCallback(new Error("Timed out waiting for OAuth callback"));
|
|
266
|
+
}, timeoutMs);
|
|
267
|
+
timeoutHandle.unref?.();
|
|
268
|
+
const server = createServer((request, response) => {
|
|
269
|
+
if (!request.url) {
|
|
270
|
+
response.writeHead(400, { "Content-Type": "text/plain" });
|
|
271
|
+
response.end("Invalid request");
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
const url = new URL(request.url, origin);
|
|
275
|
+
if (url.pathname !== callbackPath) {
|
|
276
|
+
response.writeHead(404, { "Content-Type": "text/plain" });
|
|
277
|
+
response.end("Not found");
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
response.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
|
|
281
|
+
response.end(successResponse);
|
|
282
|
+
resolveCallback(url);
|
|
283
|
+
setImmediate(() => {
|
|
284
|
+
server.close();
|
|
285
|
+
});
|
|
286
|
+
});
|
|
287
|
+
const bindAddress = getBindAddress();
|
|
288
|
+
await new Promise((resolve, reject) => {
|
|
289
|
+
const handleError = (error) => {
|
|
290
|
+
server.off("error", handleError);
|
|
291
|
+
if (error.code === "EADDRINUSE") {
|
|
292
|
+
reject(new Error(`Port ${port} is already in use. ` +
|
|
293
|
+
`Another process is occupying this port. ` +
|
|
294
|
+
`Please terminate the process or try again later.`));
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
reject(error);
|
|
298
|
+
};
|
|
299
|
+
server.once("error", handleError);
|
|
300
|
+
server.listen(port, bindAddress, () => {
|
|
301
|
+
server.off("error", handleError);
|
|
302
|
+
resolve();
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
server.on("error", (error) => {
|
|
306
|
+
rejectCallback(error instanceof Error ? error : new Error(String(error)));
|
|
307
|
+
});
|
|
308
|
+
return {
|
|
309
|
+
waitForCallback: () => callbackPromise,
|
|
310
|
+
close: () => new Promise((resolve, reject) => {
|
|
311
|
+
server.close((error) => {
|
|
312
|
+
if (error && error.code !== "ERR_SERVER_NOT_RUNNING") {
|
|
313
|
+
reject(error);
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
if (!settled) {
|
|
317
|
+
rejectCallback(new Error("OAuth listener closed before callback"));
|
|
318
|
+
}
|
|
319
|
+
resolve();
|
|
320
|
+
});
|
|
321
|
+
}),
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/plugin/server.ts"],"names":[],"mappings":"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"}
|