opencode-antigravity-auth 1.3.1 → 1.3.2-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/README.md +15 -0
  2. package/dist/src/antigravity/oauth.d.ts.map +1 -1
  3. package/dist/src/antigravity/oauth.js +10 -4
  4. package/dist/src/antigravity/oauth.js.map +1 -1
  5. package/dist/src/constants.d.ts +30 -3
  6. package/dist/src/constants.d.ts.map +1 -1
  7. package/dist/src/constants.js +80 -3
  8. package/dist/src/constants.js.map +1 -1
  9. package/dist/src/plugin/accounts.d.ts +39 -3
  10. package/dist/src/plugin/accounts.d.ts.map +1 -1
  11. package/dist/src/plugin/accounts.js +163 -17
  12. package/dist/src/plugin/accounts.js.map +1 -1
  13. package/dist/src/plugin/cli.d.ts +15 -12
  14. package/dist/src/plugin/cli.d.ts.map +1 -1
  15. package/dist/src/plugin/cli.js +40 -13
  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 +0 -13
  19. package/dist/src/plugin/config/loader.js.map +1 -1
  20. package/dist/src/plugin/config/schema.d.ts +38 -319
  21. package/dist/src/plugin/config/schema.d.ts.map +1 -1
  22. package/dist/src/plugin/config/schema.js +66 -27
  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 +37 -6
  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/debug.d.ts.map +1 -1
  29. package/dist/src/plugin/debug.js +14 -1
  30. package/dist/src/plugin/debug.js.map +1 -1
  31. package/dist/src/plugin/fingerprint.d.ts +70 -0
  32. package/dist/src/plugin/fingerprint.d.ts.map +1 -0
  33. package/dist/src/plugin/fingerprint.js +155 -0
  34. package/dist/src/plugin/fingerprint.js.map +1 -0
  35. package/dist/src/plugin/request-helpers.d.ts.map +1 -1
  36. package/dist/src/plugin/request-helpers.js +61 -23
  37. package/dist/src/plugin/request-helpers.js.map +1 -1
  38. package/dist/src/plugin/request.d.ts +4 -1
  39. package/dist/src/plugin/request.d.ts.map +1 -1
  40. package/dist/src/plugin/request.js +60 -13
  41. package/dist/src/plugin/request.js.map +1 -1
  42. package/dist/src/plugin/rotation.d.ts +5 -4
  43. package/dist/src/plugin/rotation.d.ts.map +1 -1
  44. package/dist/src/plugin/rotation.js +35 -9
  45. package/dist/src/plugin/rotation.js.map +1 -1
  46. package/dist/src/plugin/search.d.ts +32 -0
  47. package/dist/src/plugin/search.d.ts.map +1 -0
  48. package/dist/src/plugin/search.js +197 -0
  49. package/dist/src/plugin/search.js.map +1 -0
  50. package/dist/src/plugin/storage.d.ts +2 -0
  51. package/dist/src/plugin/storage.d.ts.map +1 -1
  52. package/dist/src/plugin/storage.js +15 -2
  53. package/dist/src/plugin/storage.js.map +1 -1
  54. package/dist/src/plugin/transform/gemini.d.ts +1 -13
  55. package/dist/src/plugin/transform/gemini.d.ts.map +1 -1
  56. package/dist/src/plugin/transform/gemini.js +49 -12
  57. package/dist/src/plugin/transform/gemini.js.map +1 -1
  58. package/dist/src/plugin/transform/model-resolver.d.ts.map +1 -1
  59. package/dist/src/plugin/transform/model-resolver.js +4 -2
  60. package/dist/src/plugin/transform/model-resolver.js.map +1 -1
  61. package/dist/src/plugin/transform/types.d.ts +5 -0
  62. package/dist/src/plugin/transform/types.d.ts.map +1 -1
  63. package/dist/src/plugin/types.d.ts +1 -0
  64. package/dist/src/plugin/types.d.ts.map +1 -1
  65. package/dist/src/plugin/ui/ansi.d.ts +32 -0
  66. package/dist/src/plugin/ui/ansi.d.ts.map +1 -0
  67. package/dist/src/plugin/ui/ansi.js +52 -0
  68. package/dist/src/plugin/ui/ansi.js.map +1 -0
  69. package/dist/src/plugin/ui/auth-menu.d.ts +24 -0
  70. package/dist/src/plugin/ui/auth-menu.d.ts.map +1 -0
  71. package/dist/src/plugin/ui/auth-menu.js +92 -0
  72. package/dist/src/plugin/ui/auth-menu.js.map +1 -0
  73. package/dist/src/plugin/ui/confirm.d.ts +2 -0
  74. package/dist/src/plugin/ui/confirm.d.ts.map +1 -0
  75. package/dist/src/plugin/ui/confirm.js +15 -0
  76. package/dist/src/plugin/ui/confirm.js.map +1 -0
  77. package/dist/src/plugin/ui/select.d.ts +14 -0
  78. package/dist/src/plugin/ui/select.d.ts.map +1 -0
  79. package/dist/src/plugin/ui/select.js +174 -0
  80. package/dist/src/plugin/ui/select.js.map +1 -0
  81. package/dist/src/plugin.d.ts.map +1 -1
  82. package/dist/src/plugin.js +317 -76
  83. package/dist/src/plugin.js.map +1 -1
  84. package/package.json +4 -4
@@ -0,0 +1,92 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-menu.js","sourceRoot":"","sources":["../../../../src/plugin/ui/auth-menu.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function confirm(message: string, defaultYes?: boolean): Promise<boolean>;
2
+ //# sourceMappingURL=confirm.d.ts.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,15 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,14 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,174 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.js","sourceRoot":"","sources":["../../../../src/plugin/ui/select.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"AA0CA,OAAO,KAAK,EAGV,aAAa,EACb,YAAY,EAGb,MAAM,gBAAgB,CAAC;AAylBxB;;GAEG;AACH,eAAO,MAAM,uBAAuB,GAAI,YAAY,MAAM,MACxD,uBAAuB,aAAa,KACnC,OAAO,CAAC,YAAY,CA+zCtB,CAAC;AAEF,eAAO,MAAM,yBAAyB,0BAl0Cb,aAAa,KACnC,OAAO,CAAC,YAAY,CAi0CkE,CAAC;AAC1F,eAAO,MAAM,iBAAiB,0BAn0CL,aAAa,KACnC,OAAO,CAAC,YAAY,CAk0CmC,CAAC"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EAGV,aAAa,EACb,YAAY,EAGb,MAAM,gBAAgB,CAAC;AAynBxB;;GAEG;AACH,eAAO,MAAM,uBAAuB,GAAI,YAAY,MAAM,MACxD,uBAAuB,aAAa,KACnC,OAAO,CAAC,YAAY,CA+iDtB,CAAC;AAEF,eAAO,MAAM,yBAAyB,0BAljDb,aAAa,KACnC,OAAO,CAAC,YAAY,CAijDkE,CAAC;AAC1F,eAAO,MAAM,iBAAiB,0BAnjDL,aAAa,KACnC,OAAO,CAAC,YAAY,CAkjDmC,CAAC"}