opencode-antigravity-auth 1.3.1-beta.2 → 1.3.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.
Files changed (81) hide show
  1. package/README.md +21 -15
  2. package/dist/src/antigravity/oauth.d.ts.map +1 -1
  3. package/dist/src/antigravity/oauth.js +4 -10
  4. package/dist/src/antigravity/oauth.js.map +1 -1
  5. package/dist/src/constants.d.ts +3 -24
  6. package/dist/src/constants.d.ts.map +1 -1
  7. package/dist/src/constants.js +3 -39
  8. package/dist/src/constants.js.map +1 -1
  9. package/dist/src/plugin/accounts.d.ts +3 -39
  10. package/dist/src/plugin/accounts.d.ts.map +1 -1
  11. package/dist/src/plugin/accounts.js +16 -152
  12. package/dist/src/plugin/accounts.js.map +1 -1
  13. package/dist/src/plugin/cli.d.ts +12 -15
  14. package/dist/src/plugin/cli.d.ts.map +1 -1
  15. package/dist/src/plugin/cli.js +13 -40
  16. package/dist/src/plugin/cli.js.map +1 -1
  17. package/dist/src/plugin/config/loader.d.ts.map +1 -1
  18. package/dist/src/plugin/config/loader.js +13 -0
  19. package/dist/src/plugin/config/loader.js.map +1 -1
  20. package/dist/src/plugin/config/schema.d.ts +319 -37
  21. package/dist/src/plugin/config/schema.d.ts.map +1 -1
  22. package/dist/src/plugin/config/schema.js +27 -57
  23. package/dist/src/plugin/config/schema.js.map +1 -1
  24. package/dist/src/plugin/core/streaming/transformer.d.ts.map +1 -1
  25. package/dist/src/plugin/core/streaming/transformer.js +6 -16
  26. package/dist/src/plugin/core/streaming/transformer.js.map +1 -1
  27. package/dist/src/plugin/core/streaming/types.d.ts.map +1 -1
  28. package/dist/src/plugin/request-helpers.d.ts.map +1 -1
  29. package/dist/src/plugin/request-helpers.js +23 -61
  30. package/dist/src/plugin/request-helpers.js.map +1 -1
  31. package/dist/src/plugin/request.d.ts +1 -4
  32. package/dist/src/plugin/request.d.ts.map +1 -1
  33. package/dist/src/plugin/request.js +11 -72
  34. package/dist/src/plugin/request.js.map +1 -1
  35. package/dist/src/plugin/rotation.d.ts +4 -5
  36. package/dist/src/plugin/rotation.d.ts.map +1 -1
  37. package/dist/src/plugin/rotation.js +9 -35
  38. package/dist/src/plugin/rotation.js.map +1 -1
  39. package/dist/src/plugin/storage.d.ts +0 -2
  40. package/dist/src/plugin/storage.d.ts.map +1 -1
  41. package/dist/src/plugin/storage.js +2 -15
  42. package/dist/src/plugin/storage.js.map +1 -1
  43. package/dist/src/plugin/transform/gemini.d.ts +13 -1
  44. package/dist/src/plugin/transform/gemini.d.ts.map +1 -1
  45. package/dist/src/plugin/transform/gemini.js +12 -49
  46. package/dist/src/plugin/transform/gemini.js.map +1 -1
  47. package/dist/src/plugin/transform/model-resolver.d.ts.map +1 -1
  48. package/dist/src/plugin/transform/model-resolver.js +2 -4
  49. package/dist/src/plugin/transform/model-resolver.js.map +1 -1
  50. package/dist/src/plugin/transform/types.d.ts +0 -5
  51. package/dist/src/plugin/transform/types.d.ts.map +1 -1
  52. package/dist/src/plugin/types.d.ts +0 -1
  53. package/dist/src/plugin/types.d.ts.map +1 -1
  54. package/dist/src/plugin.d.ts.map +1 -1
  55. package/dist/src/plugin.js +76 -294
  56. package/dist/src/plugin.js.map +1 -1
  57. package/package.json +5 -5
  58. package/dist/src/plugin/fingerprint.d.ts +0 -69
  59. package/dist/src/plugin/fingerprint.d.ts.map +0 -1
  60. package/dist/src/plugin/fingerprint.js +0 -153
  61. package/dist/src/plugin/fingerprint.js.map +0 -1
  62. package/dist/src/plugin/search.d.ts +0 -32
  63. package/dist/src/plugin/search.d.ts.map +0 -1
  64. package/dist/src/plugin/search.js +0 -197
  65. package/dist/src/plugin/search.js.map +0 -1
  66. package/dist/src/plugin/ui/ansi.d.ts +0 -32
  67. package/dist/src/plugin/ui/ansi.d.ts.map +0 -1
  68. package/dist/src/plugin/ui/ansi.js +0 -52
  69. package/dist/src/plugin/ui/ansi.js.map +0 -1
  70. package/dist/src/plugin/ui/auth-menu.d.ts +0 -24
  71. package/dist/src/plugin/ui/auth-menu.d.ts.map +0 -1
  72. package/dist/src/plugin/ui/auth-menu.js +0 -92
  73. package/dist/src/plugin/ui/auth-menu.js.map +0 -1
  74. package/dist/src/plugin/ui/confirm.d.ts +0 -2
  75. package/dist/src/plugin/ui/confirm.d.ts.map +0 -1
  76. package/dist/src/plugin/ui/confirm.js +0 -15
  77. package/dist/src/plugin/ui/confirm.js.map +0 -1
  78. package/dist/src/plugin/ui/select.d.ts +0 -14
  79. package/dist/src/plugin/ui/select.d.ts.map +0 -1
  80. package/dist/src/plugin/ui/select.js +0 -174
  81. package/dist/src/plugin/ui/select.js.map +0 -1
@@ -1,197 +0,0 @@
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, ANTIGRAVITY_HEADERS, 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
- thinkingConfig: {
145
- thinkingLevel: thinking ? "high" : "low",
146
- includeThoughts: false,
147
- },
148
- },
149
- };
150
- // Wrap in Antigravity format
151
- const wrappedBody = {
152
- project: projectId,
153
- model: SEARCH_MODEL,
154
- userAgent: "antigravity",
155
- requestId: generateRequestId(),
156
- request: {
157
- ...requestPayload,
158
- sessionId: getSessionId(),
159
- },
160
- };
161
- // Use non-streaming endpoint for search
162
- const url = `${ANTIGRAVITY_ENDPOINT}/v1internal:generateContent`;
163
- log.debug("Executing search", {
164
- query,
165
- urlCount: urls?.length ?? 0,
166
- thinking,
167
- });
168
- try {
169
- const response = await fetch(url, {
170
- method: "POST",
171
- headers: {
172
- ...ANTIGRAVITY_HEADERS,
173
- Authorization: `Bearer ${accessToken}`,
174
- "Content-Type": "application/json",
175
- },
176
- body: JSON.stringify(wrappedBody),
177
- signal: abortSignal ?? AbortSignal.timeout(SEARCH_TIMEOUT_MS),
178
- });
179
- if (!response.ok) {
180
- const errorText = await response.text();
181
- log.debug("Search API error", { status: response.status, error: errorText });
182
- return `## Search Error\n\nFailed to execute search: ${response.status} ${response.statusText}\n\n${errorText}\n\nPlease try again with a different query.`;
183
- }
184
- const data = (await response.json());
185
- log.debug("Search response received", { hasResponse: !!data.response });
186
- const result = parseSearchResponse(data);
187
- const formatted = formatSearchResult(result);
188
- log.debug("Search response formatted", { resultLength: formatted.length });
189
- return formatted;
190
- }
191
- catch (error) {
192
- const message = error instanceof Error ? error.message : String(error);
193
- log.debug("Search execution error", { error: message });
194
- return `## Search Error\n\nFailed to execute search: ${message}. Please try again with a different query.`;
195
- }
196
- }
197
- //# sourceMappingURL=search.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/plugin/search.ts"],"names":[],"mappings":"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"}
@@ -1,32 +0,0 @@
1
- /**
2
- * ANSI escape codes and key parsing for interactive CLI menus.
3
- * Works cross-platform (Windows/Mac/Linux).
4
- */
5
- export declare const ANSI: {
6
- readonly hide: "\u001B[?25l";
7
- readonly show: "\u001B[?25h";
8
- readonly up: (n?: number) => string;
9
- readonly down: (n?: number) => string;
10
- readonly clearLine: "\u001B[2K";
11
- readonly clearScreen: "\u001B[2J";
12
- readonly moveTo: (row: number, col: number) => string;
13
- readonly cyan: "\u001B[36m";
14
- readonly green: "\u001B[32m";
15
- readonly red: "\u001B[31m";
16
- readonly yellow: "\u001B[33m";
17
- readonly dim: "\u001B[2m";
18
- readonly bold: "\u001B[1m";
19
- readonly reset: "\u001B[0m";
20
- readonly inverse: "\u001B[7m";
21
- };
22
- export type KeyAction = 'up' | 'down' | 'enter' | 'escape' | 'escape-start' | null;
23
- /**
24
- * Parse raw keyboard input buffer into a key action.
25
- * Handles Windows/Mac/Linux differences in arrow key sequences.
26
- */
27
- export declare function parseKey(data: Buffer): KeyAction;
28
- /**
29
- * Check if the terminal supports interactive input.
30
- */
31
- export declare function isTTY(): boolean;
32
- //# sourceMappingURL=ansi.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ansi.d.ts","sourceRoot":"","sources":["../../../../src/plugin/ui/ansi.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,IAAI;;;;;;;2BAQD,MAAM,OAAO,MAAM;;;;;;;;;CAWzB,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,cAAc,GAAG,IAAI,CAAC;AAEnF;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAiBhD;AAED;;GAEG;AACH,wBAAgB,KAAK,IAAI,OAAO,CAE/B"}
@@ -1,52 +0,0 @@
1
- /**
2
- * ANSI escape codes and key parsing for interactive CLI menus.
3
- * Works cross-platform (Windows/Mac/Linux).
4
- */
5
- export const ANSI = {
6
- // Cursor control
7
- hide: '\x1b[?25l',
8
- show: '\x1b[?25h',
9
- up: (n = 1) => `\x1b[${n}A`,
10
- down: (n = 1) => `\x1b[${n}B`,
11
- clearLine: '\x1b[2K',
12
- clearScreen: '\x1b[2J',
13
- moveTo: (row, col) => `\x1b[${row};${col}H`,
14
- // Styles
15
- cyan: '\x1b[36m',
16
- green: '\x1b[32m',
17
- red: '\x1b[31m',
18
- yellow: '\x1b[33m',
19
- dim: '\x1b[2m',
20
- bold: '\x1b[1m',
21
- reset: '\x1b[0m',
22
- inverse: '\x1b[7m',
23
- };
24
- /**
25
- * Parse raw keyboard input buffer into a key action.
26
- * Handles Windows/Mac/Linux differences in arrow key sequences.
27
- */
28
- export function parseKey(data) {
29
- const s = data.toString();
30
- // Arrow keys (ANSI escape sequences)
31
- // Standard: \x1b[A (up), \x1b[B (down)
32
- // Application mode: \x1bOA (up), \x1bOB (down)
33
- if (s === '\x1b[A' || s === '\x1bOA')
34
- return 'up';
35
- if (s === '\x1b[B' || s === '\x1bOB')
36
- return 'down';
37
- // Enter (CR or LF)
38
- if (s === '\r' || s === '\n')
39
- return 'enter';
40
- if (s === '\x03')
41
- return 'escape';
42
- if (s === '\x1b')
43
- return 'escape-start';
44
- return null;
45
- }
46
- /**
47
- * Check if the terminal supports interactive input.
48
- */
49
- export function isTTY() {
50
- return Boolean(process.stdin.isTTY);
51
- }
52
- //# sourceMappingURL=ansi.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ansi.js","sourceRoot":"","sources":["../../../../src/plugin/ui/ansi.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,iBAAiB;IACjB,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,WAAW;IACjB,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG;IAC3B,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG;IAC7B,SAAS,EAAE,SAAS;IACpB,WAAW,EAAE,SAAS;IACtB,MAAM,EAAE,CAAC,GAAW,EAAE,GAAW,EAAE,EAAE,CAAC,QAAQ,GAAG,IAAI,GAAG,GAAG;IAE3D,SAAS;IACT,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,UAAU;IACjB,GAAG,EAAE,UAAU;IACf,MAAM,EAAE,UAAU;IAClB,GAAG,EAAE,SAAS;IACd,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE,SAAS;CACV,CAAC;AAIX;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;IAE1B,qCAAqC;IACrC,uCAAuC;IACvC,+CAA+C;IAC/C,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAClD,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAEpD,mBAAmB;IACnB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,OAAO,CAAC;IAE7C,IAAI,CAAC,KAAK,MAAM;QAAE,OAAO,QAAQ,CAAC;IAElC,IAAI,CAAC,KAAK,MAAM;QAAE,OAAO,cAAc,CAAC;IAExC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK;IACnB,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC"}
@@ -1,24 +0,0 @@
1
- export type AccountStatus = 'active' | 'rate-limited' | 'expired' | 'unknown';
2
- export interface AccountInfo {
3
- email?: string;
4
- index: number;
5
- addedAt?: number;
6
- lastUsed?: number;
7
- status?: AccountStatus;
8
- isCurrentAccount?: boolean;
9
- }
10
- export type AuthMenuAction = {
11
- type: 'add';
12
- } | {
13
- type: 'select-account';
14
- account: AccountInfo;
15
- } | {
16
- type: 'delete-all';
17
- } | {
18
- type: 'cancel';
19
- };
20
- export type AccountAction = 'back' | 'delete' | 'refresh' | 'cancel';
21
- export declare function showAuthMenu(accounts: AccountInfo[]): Promise<AuthMenuAction>;
22
- export declare function showAccountDetails(account: AccountInfo): Promise<AccountAction>;
23
- export { isTTY } from './ansi';
24
- //# sourceMappingURL=auth-menu.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-menu.d.ts","sourceRoot":"","sources":["../../../../src/plugin/ui/auth-menu.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,cAAc,GAAG,SAAS,GAAG,SAAS,CAAC;AAE9E,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GACf;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEvB,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AA0BrE,wBAAsB,YAAY,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAkCnF;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAgCrF;AAED,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC"}
@@ -1,92 +0,0 @@
1
- import { ANSI } from './ansi';
2
- import { select } from './select';
3
- import { confirm } from './confirm';
4
- function formatRelativeTime(timestamp) {
5
- if (!timestamp)
6
- return 'never';
7
- const days = Math.floor((Date.now() - timestamp) / 86400000);
8
- if (days === 0)
9
- return 'today';
10
- if (days === 1)
11
- return 'yesterday';
12
- if (days < 7)
13
- return `${days}d ago`;
14
- if (days < 30)
15
- return `${Math.floor(days / 7)}w ago`;
16
- return new Date(timestamp).toLocaleDateString();
17
- }
18
- function formatDate(timestamp) {
19
- if (!timestamp)
20
- return 'unknown';
21
- return new Date(timestamp).toLocaleDateString();
22
- }
23
- function getStatusBadge(status) {
24
- switch (status) {
25
- case 'active': return `${ANSI.green}[active]${ANSI.reset}`;
26
- case 'rate-limited': return `${ANSI.yellow}[rate-limited]${ANSI.reset}`;
27
- case 'expired': return `${ANSI.red}[expired]${ANSI.reset}`;
28
- default: return '';
29
- }
30
- }
31
- export async function showAuthMenu(accounts) {
32
- const items = [
33
- { label: 'Add new account', value: { type: 'add' } },
34
- ...accounts.map(account => {
35
- const badge = getStatusBadge(account.status);
36
- const label = account.email || `Account ${account.index + 1}`;
37
- const fullLabel = badge ? `${label} ${badge}` : label;
38
- return {
39
- label: fullLabel,
40
- hint: account.lastUsed ? `used ${formatRelativeTime(account.lastUsed)}` : '',
41
- value: { type: 'select-account', account },
42
- };
43
- }),
44
- { label: 'Delete all accounts', value: { type: 'delete-all' }, color: 'red' },
45
- ];
46
- while (true) {
47
- const result = await select(items, {
48
- message: 'Manage accounts',
49
- subtitle: 'Select account'
50
- });
51
- if (!result)
52
- return { type: 'cancel' };
53
- if (result.type === 'delete-all') {
54
- const confirmed = await confirm('Delete ALL accounts? This cannot be undone.');
55
- if (!confirmed)
56
- continue;
57
- }
58
- return result;
59
- }
60
- }
61
- export async function showAccountDetails(account) {
62
- const label = account.email || `Account ${account.index + 1}`;
63
- const badge = getStatusBadge(account.status);
64
- console.log('');
65
- console.log(`${ANSI.bold}Account: ${label}${badge ? ' ' + badge : ''}${ANSI.reset}`);
66
- console.log(`${ANSI.dim}Added: ${formatDate(account.addedAt)}${ANSI.reset}`);
67
- console.log(`${ANSI.dim}Last used: ${formatRelativeTime(account.lastUsed)}${ANSI.reset}`);
68
- console.log('');
69
- while (true) {
70
- const result = await select([
71
- { label: 'Back', value: 'back' },
72
- { label: 'Refresh token', value: 'refresh', color: 'cyan' },
73
- { label: 'Delete this account', value: 'delete', color: 'red' },
74
- ], {
75
- message: 'Account options',
76
- subtitle: 'Select action'
77
- });
78
- if (result === 'delete') {
79
- const confirmed = await confirm(`Delete ${label}?`);
80
- if (!confirmed)
81
- continue;
82
- }
83
- if (result === 'refresh') {
84
- const confirmed = await confirm(`Re-authenticate ${label}?`);
85
- if (!confirmed)
86
- continue;
87
- }
88
- return result ?? 'cancel';
89
- }
90
- }
91
- export { isTTY } from './ansi';
92
- //# sourceMappingURL=auth-menu.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-menu.js","sourceRoot":"","sources":["../../../../src/plugin/ui/auth-menu.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export declare function confirm(message: string, defaultYes?: boolean): Promise<boolean>;
2
- //# sourceMappingURL=confirm.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"confirm.d.ts","sourceRoot":"","sources":["../../../../src/plugin/ui/confirm.ts"],"names":[],"mappings":"AAEA,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAanF"}
@@ -1,15 +0,0 @@
1
- import { select } from './select';
2
- export async function confirm(message, defaultYes = false) {
3
- const items = defaultYes
4
- ? [
5
- { label: 'Yes', value: true },
6
- { label: 'No', value: false },
7
- ]
8
- : [
9
- { label: 'No', value: false },
10
- { label: 'Yes', value: true },
11
- ];
12
- const result = await select(items, { message });
13
- return result ?? false;
14
- }
15
- //# sourceMappingURL=confirm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"confirm.js","sourceRoot":"","sources":["../../../../src/plugin/ui/confirm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAe,EAAE,UAAU,GAAG,KAAK;IAC/D,MAAM,KAAK,GAAG,UAAU;QACtB,CAAC,CAAC;YACE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;YAC7B,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;SAC9B;QACH,CAAC,CAAC;YACE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;YAC7B,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;SAC9B,CAAC;IAEN,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAChD,OAAO,MAAM,IAAI,KAAK,CAAC;AACzB,CAAC"}
@@ -1,14 +0,0 @@
1
- export interface MenuItem<T = string> {
2
- label: string;
3
- value: T;
4
- hint?: string;
5
- disabled?: boolean;
6
- separator?: boolean;
7
- color?: 'red' | 'green' | 'yellow' | 'cyan';
8
- }
9
- export interface SelectOptions {
10
- message: string;
11
- subtitle?: string;
12
- }
13
- export declare function select<T>(items: MenuItem<T>[], options: SelectOptions): Promise<T | null>;
14
- //# sourceMappingURL=select.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../../../src/plugin/ui/select.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,QAAQ,CAAC,CAAC,GAAG,MAAM;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,CAAC;IACT,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;CAC7C;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAcD,wBAAsB,MAAM,CAAC,CAAC,EAC5B,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EACpB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAsLnB"}
@@ -1,174 +0,0 @@
1
- import { ANSI, isTTY, parseKey } from './ansi';
2
- const ESCAPE_TIMEOUT_MS = 50;
3
- function getColorCode(color) {
4
- switch (color) {
5
- case 'red': return ANSI.red;
6
- case 'green': return ANSI.green;
7
- case 'yellow': return ANSI.yellow;
8
- case 'cyan': return ANSI.cyan;
9
- default: return '';
10
- }
11
- }
12
- export async function select(items, options) {
13
- if (!isTTY()) {
14
- throw new Error('Interactive select requires a TTY terminal');
15
- }
16
- if (items.length === 0) {
17
- throw new Error('No menu items provided');
18
- }
19
- const enabledItems = items.filter(i => !i.disabled && !i.separator);
20
- if (enabledItems.length === 0) {
21
- throw new Error('All items disabled');
22
- }
23
- if (enabledItems.length === 1) {
24
- return enabledItems[0].value;
25
- }
26
- const { message, subtitle } = options;
27
- const { stdin, stdout } = process;
28
- let cursor = items.findIndex(i => !i.disabled && !i.separator);
29
- if (cursor === -1)
30
- cursor = 0; // Fallback, though validation above should prevent this
31
- let escapeTimeout = null;
32
- let isCleanedUp = false;
33
- let isFirstRender = true;
34
- const getTotalLines = () => {
35
- const subtitleLines = subtitle ? 3 : 0;
36
- return 1 + subtitleLines + items.length + 1 + 1;
37
- };
38
- const render = () => {
39
- const totalLines = getTotalLines();
40
- if (!isFirstRender) {
41
- stdout.write(ANSI.up(totalLines) + '\r');
42
- }
43
- isFirstRender = false;
44
- stdout.write(`${ANSI.clearLine}${ANSI.dim}┌ ${ANSI.reset}${message}\n`);
45
- if (subtitle) {
46
- stdout.write(`${ANSI.clearLine}${ANSI.dim}│${ANSI.reset}\n`);
47
- stdout.write(`${ANSI.clearLine}${ANSI.cyan}◆${ANSI.reset} ${subtitle}\n`);
48
- stdout.write(`${ANSI.clearLine}\n`);
49
- }
50
- for (let i = 0; i < items.length; i++) {
51
- const item = items[i];
52
- if (!item)
53
- continue;
54
- if (item.separator) {
55
- stdout.write(`${ANSI.clearLine}${ANSI.dim}│${ANSI.reset}\n`);
56
- continue;
57
- }
58
- const isSelected = i === cursor;
59
- const colorCode = getColorCode(item.color);
60
- let labelText;
61
- if (item.disabled) {
62
- labelText = `${ANSI.dim}${item.label} (unavailable)${ANSI.reset}`;
63
- }
64
- else if (isSelected) {
65
- labelText = colorCode ? `${colorCode}${item.label}${ANSI.reset}` : item.label;
66
- if (item.hint)
67
- labelText += ` ${ANSI.dim}${item.hint}${ANSI.reset}`;
68
- }
69
- else {
70
- labelText = colorCode
71
- ? `${ANSI.dim}${colorCode}${item.label}${ANSI.reset}`
72
- : `${ANSI.dim}${item.label}${ANSI.reset}`;
73
- if (item.hint)
74
- labelText += ` ${ANSI.dim}${item.hint}${ANSI.reset}`;
75
- }
76
- if (isSelected) {
77
- stdout.write(`${ANSI.clearLine}${ANSI.cyan}│${ANSI.reset} ${ANSI.green}●${ANSI.reset} ${labelText}\n`);
78
- }
79
- else {
80
- stdout.write(`${ANSI.clearLine}${ANSI.cyan}│${ANSI.reset} ${ANSI.dim}○${ANSI.reset} ${labelText}\n`);
81
- }
82
- }
83
- stdout.write(`${ANSI.clearLine}${ANSI.cyan}│${ANSI.reset} ${ANSI.dim}↑/↓ to select • Enter: confirm${ANSI.reset}\n`);
84
- stdout.write(`${ANSI.clearLine}${ANSI.cyan}└${ANSI.reset}\n`);
85
- };
86
- return new Promise((resolve) => {
87
- const wasRaw = stdin.isRaw ?? false;
88
- const cleanup = () => {
89
- if (isCleanedUp)
90
- return;
91
- isCleanedUp = true;
92
- if (escapeTimeout) {
93
- clearTimeout(escapeTimeout);
94
- escapeTimeout = null;
95
- }
96
- try {
97
- stdin.removeListener('data', onKey);
98
- stdin.setRawMode(wasRaw);
99
- stdin.pause();
100
- stdout.write(ANSI.show);
101
- }
102
- catch {
103
- // Intentionally ignored - cleanup is best-effort
104
- }
105
- process.removeListener('SIGINT', onSignal);
106
- process.removeListener('SIGTERM', onSignal);
107
- };
108
- const onSignal = () => {
109
- cleanup();
110
- resolve(null);
111
- };
112
- const finishWithValue = (value) => {
113
- cleanup();
114
- resolve(value);
115
- };
116
- const findNextSelectable = (from, direction) => {
117
- if (items.length === 0)
118
- return from;
119
- let next = from;
120
- do {
121
- next = (next + direction + items.length) % items.length;
122
- } while (items[next]?.disabled || items[next]?.separator);
123
- return next;
124
- };
125
- const onKey = (data) => {
126
- if (escapeTimeout) {
127
- clearTimeout(escapeTimeout);
128
- escapeTimeout = null;
129
- }
130
- const action = parseKey(data);
131
- switch (action) {
132
- case 'up':
133
- cursor = findNextSelectable(cursor, -1);
134
- render();
135
- return;
136
- case 'down':
137
- cursor = findNextSelectable(cursor, 1);
138
- render();
139
- return;
140
- case 'enter':
141
- finishWithValue(items[cursor]?.value ?? null);
142
- return;
143
- case 'escape':
144
- finishWithValue(null);
145
- return;
146
- case 'escape-start':
147
- // Bare escape byte - wait to see if more bytes coming (arrow key sequence)
148
- escapeTimeout = setTimeout(() => {
149
- finishWithValue(null);
150
- }, ESCAPE_TIMEOUT_MS);
151
- return;
152
- default:
153
- // Unknown key - ignore
154
- return;
155
- }
156
- };
157
- process.once('SIGINT', onSignal);
158
- process.once('SIGTERM', onSignal);
159
- try {
160
- stdin.setRawMode(true);
161
- }
162
- catch {
163
- // Failed to enable raw mode - cleanup and return null
164
- cleanup();
165
- resolve(null);
166
- return;
167
- }
168
- stdin.resume();
169
- stdout.write(ANSI.hide);
170
- render();
171
- stdin.on('data', onKey);
172
- });
173
- }
174
- //# sourceMappingURL=select.js.map