gobananas-cli 1.0.7 → 1.0.9

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 (47) hide show
  1. package/README.md +13 -6
  2. package/dist/auth/oauth.d.ts +19 -0
  3. package/dist/auth/oauth.d.ts.map +1 -0
  4. package/dist/auth/oauth.js +266 -0
  5. package/dist/auth/oauth.js.map +1 -0
  6. package/dist/commands/auth.d.ts +9 -0
  7. package/dist/commands/auth.d.ts.map +1 -0
  8. package/dist/commands/auth.js +72 -0
  9. package/dist/commands/auth.js.map +1 -0
  10. package/dist/commands/config.d.ts.map +1 -1
  11. package/dist/commands/config.js +17 -12
  12. package/dist/commands/config.js.map +1 -1
  13. package/dist/commands/edit.d.ts.map +1 -1
  14. package/dist/commands/edit.js +1 -1
  15. package/dist/commands/edit.js.map +1 -1
  16. package/dist/commands/generate.d.ts.map +1 -1
  17. package/dist/commands/generate.js +54 -1
  18. package/dist/commands/generate.js.map +1 -1
  19. package/dist/commands/index.d.ts +1 -0
  20. package/dist/commands/index.d.ts.map +1 -1
  21. package/dist/commands/index.js +1 -0
  22. package/dist/commands/index.js.map +1 -1
  23. package/dist/commands/mcp.d.ts.map +1 -1
  24. package/dist/commands/mcp.js +1 -1
  25. package/dist/commands/mcp.js.map +1 -1
  26. package/dist/config/config.d.ts +26 -0
  27. package/dist/config/config.d.ts.map +1 -1
  28. package/dist/config/config.js +44 -1
  29. package/dist/config/config.js.map +1 -1
  30. package/dist/index.js +19 -6
  31. package/dist/index.js.map +1 -1
  32. package/dist/mcp/stdio-proxy.d.ts.map +1 -1
  33. package/dist/mcp/stdio-proxy.js +40 -30
  34. package/dist/mcp/stdio-proxy.js.map +1 -1
  35. package/dist/transport/mcp-client.d.ts +22 -3
  36. package/dist/transport/mcp-client.d.ts.map +1 -1
  37. package/dist/transport/mcp-client.js +68 -21
  38. package/dist/transport/mcp-client.js.map +1 -1
  39. package/dist/transport/rest-client.d.ts +14 -1
  40. package/dist/transport/rest-client.d.ts.map +1 -1
  41. package/dist/transport/rest-client.js +28 -4
  42. package/dist/transport/rest-client.js.map +1 -1
  43. package/dist/utils/file-handler.d.ts +4 -0
  44. package/dist/utils/file-handler.d.ts.map +1 -1
  45. package/dist/utils/file-handler.js +36 -10
  46. package/dist/utils/file-handler.js.map +1 -1
  47. package/package.json +2 -2
package/README.md CHANGED
@@ -2,6 +2,11 @@
2
2
 
3
3
  Interactive command-line interface and MCP proxy for [Go Bananas](https://gobananasai.com) AI image generation.
4
4
 
5
+ ## What's New (v1.0.6)
6
+
7
+ - **Prompt Optimization**: New `enhance_prompt` parameter enriches short prompts with AI-powered visual details (lighting, composition, style) before generation
8
+ - **Timeout Fix**: Fixed MCP SDK 60s timeout causing `-32001` errors on parallel Pro model requests. Now uses 10-minute timeout with progress-based keep-alive.
9
+
5
10
  ## Install
6
11
 
7
12
  ```bash
@@ -23,15 +28,17 @@ npx gobananas-cli
23
28
 
24
29
  ## MCP Setup
25
30
 
26
- For MCP client integration (Claude Desktop, Cursor, Claude Code), use the dedicated [`gobananas-mcp`](https://www.npmjs.com/package/gobananas-mcp) package.
27
-
28
- **Claude Code (one-command install):**
31
+ For Claude Code, Claude Desktop, claude.ai, and other clients that support remote HTTP MCP
32
+ servers, use the hosted endpoint and browser OAuth. This is the recommended production flow:
29
33
 
30
34
  ```bash
31
- claude mcp add go-bananas -e GO_BANANAS_API_KEY=sk_live_your_api_key_here -e GO_BANANAS_SERVER_URL=https://gobananasai.com -e GO_BANANAS_MCP_TRANSPORT=streamable-http -- npx -y gobananas-mcp
35
+ claude mcp add --transport http go-bananas https://gobananasai.com/mcp
32
36
  ```
33
37
 
34
- **Other clients** add to your MCP config file:
38
+ Then run `/mcp` in Claude Code and complete the Go Bananas browser login.
39
+
40
+ Use the local STDIO proxy only for MCP clients that cannot connect to remote HTTP servers.
41
+ STDIO does not support the native MCP OAuth browser flow, so this legacy mode still needs an API key:
35
42
 
36
43
  ```json
37
44
  {
@@ -55,7 +62,7 @@ See the [`gobananas-mcp` README](https://www.npmjs.com/package/gobananas-mcp) fo
55
62
 
56
63
  | Variable | Default | Description |
57
64
  |----------|---------|-------------|
58
- | `GO_BANANAS_API_KEY` | — | Your API key (required) |
65
+ | `GO_BANANAS_API_KEY` | — | Your API key (legacy STDIO proxy only) |
59
66
  | `GO_BANANAS_SERVER_URL` | `https://gobananasai.com` | Server URL |
60
67
  | `GO_BANANAS_MCP_TRANSPORT` | `streamable-http` | Transport protocol |
61
68
 
@@ -0,0 +1,19 @@
1
+ import { type OAuthConfig } from '../config/config.js';
2
+ export interface LoginOptions {
3
+ serverUrl?: string;
4
+ openBrowser?: boolean;
5
+ timeoutMs?: number;
6
+ scope?: string;
7
+ }
8
+ export interface LoginResult {
9
+ serverUrl: string;
10
+ clientId: string;
11
+ scope: string;
12
+ expiresAt: number;
13
+ }
14
+ export declare function refreshOAuthAccessToken(oauth: OAuthConfig, baseUrl?: string): Promise<OAuthConfig | null>;
15
+ export declare function getOAuthAccessToken(baseUrl?: string): Promise<string | null>;
16
+ export declare function getAuthHeaders(explicitApiKey?: string, baseUrl?: string): Promise<Record<string, string>>;
17
+ export declare function loginWithBrowser(options?: LoginOptions): Promise<LoginResult>;
18
+ export declare function logoutOAuth(): void;
19
+ //# sourceMappingURL=oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/auth/oauth.ts"],"names":[],"mappings":"AAGA,OAAO,EAA+C,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAkBpG,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAkMD,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,WAAW,EAClB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAoC7B;AAED,wBAAsB,mBAAmB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgBlF;AAED,wBAAsB,cAAc,CAClC,cAAc,CAAC,EAAE,MAAM,EACvB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAYjC;AAED,wBAAsB,gBAAgB,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CA8DvF;AAED,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
@@ -0,0 +1,266 @@
1
+ import { createHash, randomBytes } from 'node:crypto';
2
+ import { spawn } from 'node:child_process';
3
+ import http from 'node:http';
4
+ import { clearOAuthConfig, getConfig, setOAuthConfig } from '../config/config.js';
5
+ const OAUTH_REFRESH_SKEW_MS = 60_000;
6
+ const DEFAULT_SCOPES = [
7
+ 'images:generate',
8
+ 'images:edit',
9
+ 'images:read',
10
+ 'images:delete',
11
+ 'characters:manage',
12
+ 'characters:read',
13
+ 'products:manage',
14
+ 'products:read',
15
+ 'styles:manage',
16
+ 'styles:read',
17
+ 'sessions:read',
18
+ 'analytics:read',
19
+ ].join(' ');
20
+ function normalizeBaseUrl(input) {
21
+ const trimmed = input.trim().replace(/\/+$/, '');
22
+ new URL(trimmed);
23
+ return trimmed;
24
+ }
25
+ function base64Url(bytes) {
26
+ return bytes.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
27
+ }
28
+ function createPkcePair() {
29
+ const verifier = base64Url(randomBytes(32));
30
+ const challenge = base64Url(createHash('sha256').update(verifier).digest());
31
+ return { verifier, challenge };
32
+ }
33
+ function buildResource(baseUrl) {
34
+ return `${baseUrl}/mcp`;
35
+ }
36
+ async function fetchScopes(baseUrl) {
37
+ try {
38
+ const response = await fetch(`${baseUrl}/.well-known/oauth-protected-resource`);
39
+ if (!response.ok) {
40
+ return DEFAULT_SCOPES;
41
+ }
42
+ const body = (await response.json());
43
+ if (!Array.isArray(body.scopes_supported)) {
44
+ return DEFAULT_SCOPES;
45
+ }
46
+ const scopes = body.scopes_supported.filter((scope) => typeof scope === 'string');
47
+ return scopes.length ? scopes.join(' ') : DEFAULT_SCOPES;
48
+ }
49
+ catch {
50
+ return DEFAULT_SCOPES;
51
+ }
52
+ }
53
+ async function registerClient(baseUrl, redirectUri, scope) {
54
+ const response = await fetch(`${baseUrl}/oauth/register`, {
55
+ method: 'POST',
56
+ headers: { 'Content-Type': 'application/json' },
57
+ body: JSON.stringify({
58
+ client_name: 'Go Bananas CLI',
59
+ redirect_uris: [redirectUri],
60
+ grant_types: ['authorization_code', 'refresh_token'],
61
+ token_endpoint_auth_method: 'none',
62
+ scope,
63
+ }),
64
+ });
65
+ if (!response.ok) {
66
+ throw new Error(`OAuth client registration failed: ${await response.text()}`);
67
+ }
68
+ return (await response.json());
69
+ }
70
+ function startCallbackServer(timeoutMs) {
71
+ return new Promise((resolve, reject) => {
72
+ let timeout = null;
73
+ const server = http.createServer((req, res) => {
74
+ const requestUrl = new URL(req.url ?? '/', 'http://127.0.0.1');
75
+ const code = requestUrl.searchParams.get('code');
76
+ const state = requestUrl.searchParams.get('state');
77
+ const error = requestUrl.searchParams.get('error');
78
+ if (error) {
79
+ res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
80
+ res.end('<h1>Go Bananas authorization failed</h1><p>You can close this tab.</p>');
81
+ codeResolver.reject(new Error(`OAuth authorization failed: ${error}`));
82
+ return;
83
+ }
84
+ if (!code) {
85
+ res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });
86
+ res.end('Not found');
87
+ return;
88
+ }
89
+ res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
90
+ res.end('<h1>Go Bananas authorized</h1><p>You can close this tab and return to your terminal.</p>');
91
+ codeResolver.resolve({ code, state });
92
+ });
93
+ let codeResolver;
94
+ const waitForCode = new Promise((resolveCode, rejectCode) => {
95
+ codeResolver = { resolve: resolveCode, reject: rejectCode };
96
+ });
97
+ server.once('error', (error) => {
98
+ if (timeout) {
99
+ clearTimeout(timeout);
100
+ }
101
+ reject(error);
102
+ });
103
+ server.listen(0, '127.0.0.1', () => {
104
+ const address = server.address();
105
+ if (!address || typeof address === 'string') {
106
+ reject(new Error('Failed to allocate local OAuth callback port'));
107
+ return;
108
+ }
109
+ timeout = setTimeout(() => {
110
+ codeResolver.reject(new Error('Timed out waiting for OAuth authorization'));
111
+ }, timeoutMs);
112
+ resolve({
113
+ redirectUri: `http://127.0.0.1:${address.port}/callback`,
114
+ waitForCode,
115
+ close: () => new Promise((resolveClose) => {
116
+ if (timeout) {
117
+ clearTimeout(timeout);
118
+ }
119
+ server.close(() => resolveClose());
120
+ }),
121
+ });
122
+ });
123
+ });
124
+ }
125
+ function openUrl(url) {
126
+ const command = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'cmd' : 'xdg-open';
127
+ const args = process.platform === 'win32' ? ['/c', 'start', '', url] : [url];
128
+ const child = spawn(command, args, { detached: true, stdio: 'ignore' });
129
+ child.unref();
130
+ }
131
+ async function exchangeAuthorizationCode(params) {
132
+ const body = new URLSearchParams({
133
+ grant_type: 'authorization_code',
134
+ client_id: params.clientId,
135
+ code: params.code,
136
+ code_verifier: params.verifier,
137
+ redirect_uri: params.redirectUri,
138
+ resource: params.resource,
139
+ });
140
+ const response = await fetch(`${params.baseUrl}/oauth/token`, {
141
+ method: 'POST',
142
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
143
+ body,
144
+ });
145
+ if (!response.ok) {
146
+ throw new Error(`OAuth token exchange failed: ${await response.text()}`);
147
+ }
148
+ return (await response.json());
149
+ }
150
+ export async function refreshOAuthAccessToken(oauth, baseUrl) {
151
+ if (!oauth.clientId || !oauth.refreshToken) {
152
+ return null;
153
+ }
154
+ const serverUrl = normalizeBaseUrl(baseUrl ?? getConfig().serverUrl);
155
+ const resource = oauth.resource ?? buildResource(serverUrl);
156
+ const body = new URLSearchParams({
157
+ grant_type: 'refresh_token',
158
+ client_id: oauth.clientId,
159
+ refresh_token: oauth.refreshToken,
160
+ resource,
161
+ });
162
+ const response = await fetch(`${serverUrl}/oauth/token`, {
163
+ method: 'POST',
164
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
165
+ body,
166
+ });
167
+ if (!response.ok) {
168
+ return null;
169
+ }
170
+ const tokens = (await response.json());
171
+ const refreshed = {
172
+ clientId: oauth.clientId,
173
+ accessToken: tokens.access_token,
174
+ refreshToken: tokens.refresh_token ?? oauth.refreshToken,
175
+ expiresAt: Date.now() + tokens.expires_in * 1000,
176
+ scope: tokens.scope ?? oauth.scope,
177
+ resource,
178
+ tokenType: tokens.token_type,
179
+ };
180
+ setOAuthConfig(refreshed);
181
+ return refreshed;
182
+ }
183
+ export async function getOAuthAccessToken(baseUrl) {
184
+ const oauth = getConfig().oauth;
185
+ if (!oauth.accessToken && !oauth.refreshToken) {
186
+ return null;
187
+ }
188
+ if (oauth.accessToken &&
189
+ oauth.expiresAt &&
190
+ oauth.expiresAt - OAUTH_REFRESH_SKEW_MS > Date.now()) {
191
+ return oauth.accessToken;
192
+ }
193
+ const refreshed = await refreshOAuthAccessToken(oauth, baseUrl);
194
+ return refreshed?.accessToken ?? null;
195
+ }
196
+ export async function getAuthHeaders(explicitApiKey, baseUrl) {
197
+ if (explicitApiKey) {
198
+ return { 'X-API-Key': explicitApiKey };
199
+ }
200
+ const accessToken = await getOAuthAccessToken(baseUrl);
201
+ if (accessToken) {
202
+ return { Authorization: `Bearer ${accessToken}` };
203
+ }
204
+ const apiKey = getConfig().apiKey;
205
+ return apiKey ? { 'X-API-Key': apiKey } : {};
206
+ }
207
+ export async function loginWithBrowser(options = {}) {
208
+ const config = getConfig();
209
+ const baseUrl = normalizeBaseUrl(options.serverUrl ?? config.serverUrl);
210
+ const scope = options.scope ?? (await fetchScopes(baseUrl));
211
+ const resource = buildResource(baseUrl);
212
+ const callback = await startCallbackServer(options.timeoutMs ?? 10 * 60_000);
213
+ const state = base64Url(randomBytes(16));
214
+ const pkce = createPkcePair();
215
+ try {
216
+ const client = await registerClient(baseUrl, callback.redirectUri, scope);
217
+ const authorizeUrl = new URL(`${baseUrl}/oauth/authorize`);
218
+ authorizeUrl.searchParams.set('response_type', 'code');
219
+ authorizeUrl.searchParams.set('client_id', client.client_id);
220
+ authorizeUrl.searchParams.set('redirect_uri', callback.redirectUri);
221
+ authorizeUrl.searchParams.set('scope', client.scope ?? scope);
222
+ authorizeUrl.searchParams.set('state', state);
223
+ authorizeUrl.searchParams.set('code_challenge', pkce.challenge);
224
+ authorizeUrl.searchParams.set('code_challenge_method', 'S256');
225
+ authorizeUrl.searchParams.set('resource', resource);
226
+ if (options.openBrowser !== false) {
227
+ openUrl(authorizeUrl.toString());
228
+ }
229
+ process.stdout.write(`Open this URL to authorize Go Bananas:\n${authorizeUrl.toString()}\n\n`);
230
+ const result = await callback.waitForCode;
231
+ if (result.state !== state) {
232
+ throw new Error('OAuth state mismatch; authorization was not saved');
233
+ }
234
+ const tokens = await exchangeAuthorizationCode({
235
+ baseUrl,
236
+ clientId: client.client_id,
237
+ code: result.code,
238
+ verifier: pkce.verifier,
239
+ redirectUri: callback.redirectUri,
240
+ resource,
241
+ });
242
+ const oauth = {
243
+ clientId: client.client_id,
244
+ accessToken: tokens.access_token,
245
+ refreshToken: tokens.refresh_token,
246
+ expiresAt: Date.now() + tokens.expires_in * 1000,
247
+ scope: tokens.scope ?? client.scope ?? scope,
248
+ resource,
249
+ tokenType: tokens.token_type,
250
+ };
251
+ setOAuthConfig(oauth);
252
+ return {
253
+ serverUrl: baseUrl,
254
+ clientId: client.client_id,
255
+ scope: oauth.scope ?? scope,
256
+ expiresAt: oauth.expiresAt ?? Date.now(),
257
+ };
258
+ }
259
+ finally {
260
+ await callback.close();
261
+ }
262
+ }
263
+ export function logoutOAuth() {
264
+ clearOAuthConfig();
265
+ }
266
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/auth/oauth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Auth Commands
3
+ *
4
+ * Browser-based OAuth login for MCP clients that cannot run native remote
5
+ * HTTP OAuth themselves.
6
+ */
7
+ import { Command } from 'commander';
8
+ export declare function createAuthCommand(): Command;
9
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,iBAAiB,IAAI,OAAO,CA8D3C"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Auth Commands
3
+ *
4
+ * Browser-based OAuth login for MCP clients that cannot run native remote
5
+ * HTTP OAuth themselves.
6
+ */
7
+ import { Command } from 'commander';
8
+ import { getConfig, hasApiKey, hasOAuthTokens } from '../config/config.js';
9
+ import { loginWithBrowser, logoutOAuth } from '../auth/oauth.js';
10
+ import * as output from '../utils/output.js';
11
+ function formatExpiry(expiresAt) {
12
+ if (!expiresAt) {
13
+ return '(unknown)';
14
+ }
15
+ return new Date(expiresAt).toLocaleString();
16
+ }
17
+ export function createAuthCommand() {
18
+ const cmd = new Command('auth').description('Manage browser-login authorization');
19
+ cmd
20
+ .command('login')
21
+ .description('Authorize Go Bananas in your browser and save OAuth tokens locally')
22
+ .option('--server <url>', 'Go Bananas server URL')
23
+ .option('--no-open', 'Print the authorization URL without opening a browser')
24
+ .option('--scope <scope>', 'Space-separated OAuth scopes to request')
25
+ .option('--timeout <seconds>', 'Seconds to wait for browser authorization', '600')
26
+ .action(async (options) => {
27
+ const timeoutSeconds = Number.parseInt(options.timeout, 10);
28
+ if (!Number.isFinite(timeoutSeconds) || timeoutSeconds <= 0) {
29
+ output.error('--timeout must be a positive number of seconds');
30
+ process.exit(1);
31
+ }
32
+ output.header('Go Bananas Browser Login');
33
+ output.info('Starting a local callback server for OAuth authorization.');
34
+ try {
35
+ const result = await loginWithBrowser({
36
+ serverUrl: options.server,
37
+ openBrowser: options.open,
38
+ scope: options.scope,
39
+ timeoutMs: timeoutSeconds * 1000,
40
+ });
41
+ output.success('Authorization saved.');
42
+ output.keyValue('Server', result.serverUrl);
43
+ output.keyValue('Client ID', result.clientId);
44
+ output.keyValue('Token expires', formatExpiry(result.expiresAt));
45
+ }
46
+ catch (error) {
47
+ output.error(error instanceof Error ? error.message : String(error));
48
+ process.exit(1);
49
+ }
50
+ });
51
+ cmd
52
+ .command('status')
53
+ .description('Show current authorization status')
54
+ .action(() => {
55
+ const config = getConfig();
56
+ output.header('Go Bananas Authorization');
57
+ output.keyValue('Server URL', config.serverUrl);
58
+ output.keyValue('OAuth login', hasOAuthTokens() ? 'Configured' : 'Not configured');
59
+ output.keyValue('OAuth client', config.oauth.clientId ?? '(none)');
60
+ output.keyValue('OAuth token expires', formatExpiry(config.oauth.expiresAt));
61
+ output.keyValue('API key fallback', hasApiKey() ? 'Configured' : 'Not configured');
62
+ });
63
+ cmd
64
+ .command('logout')
65
+ .description('Clear saved OAuth tokens')
66
+ .action(() => {
67
+ logoutOAuth();
68
+ output.success('OAuth authorization cleared.');
69
+ });
70
+ return cmd;
71
+ }
72
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,mBAAmB,IAAI,OAAO,CA2L7C"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,wBAAgB,mBAAmB,IAAI,OAAO,CAyM7C"}
@@ -4,13 +4,11 @@
4
4
  * Commands for managing CLI configuration.
5
5
  */
6
6
  import { Command } from 'commander';
7
- import { getConfig, setConfig, hasApiKey, getConfigPath, clearConfig, } from '../config/config.js';
7
+ import { getConfig, setConfig, hasAuthCredential, hasOAuthTokens, getConfigPath, clearConfig, } from '../config/config.js';
8
8
  import { RestClient } from '../transport/rest-client.js';
9
9
  import * as output from '../utils/output.js';
10
10
  export function createConfigCommand() {
11
- const cmd = new Command('config')
12
- .alias('cfg')
13
- .description('Manage CLI configuration');
11
+ const cmd = new Command('config').alias('cfg').description('Manage CLI configuration');
14
12
  // Generic setter (matches README usage: `gb config set apiKey ...`)
15
13
  cmd
16
14
  .command('set <key> <value>')
@@ -34,7 +32,9 @@ export function createConfigCommand() {
34
32
  setOutputDir(value);
35
33
  return;
36
34
  }
37
- if (normalized === 'defaultAspectRatio' || normalized === 'aspect' || normalized === 'ratio') {
35
+ if (normalized === 'defaultAspectRatio' ||
36
+ normalized === 'aspect' ||
37
+ normalized === 'ratio') {
38
38
  setAspectRatio(value);
39
39
  return;
40
40
  }
@@ -59,6 +59,9 @@ export function createConfigCommand() {
59
59
  output.newline();
60
60
  output.keyValue('Server URL', config.serverUrl);
61
61
  output.keyValue('API Key', config.apiKey ? maskApiKey(config.apiKey) : '(not set)');
62
+ output.keyValue('OAuth Login', hasOAuthTokens() ? 'Configured' : '(not set)');
63
+ output.keyValue('OAuth Client', config.oauth.clientId || '(none)');
64
+ output.keyValue('OAuth Expires', config.oauth.expiresAt ? new Date(config.oauth.expiresAt).toLocaleString() : '(unknown)');
62
65
  output.keyValue('Transport', config.transport);
63
66
  output.keyValue('Output Dir', config.outputDir);
64
67
  output.keyValue('Default Aspect', config.defaultAspectRatio);
@@ -112,18 +115,20 @@ export function createConfigCommand() {
112
115
  const config = getConfig();
113
116
  output.info('Current settings:');
114
117
  output.keyValue(' Server URL', config.serverUrl);
118
+ output.keyValue(' OAuth Login', hasOAuthTokens() ? 'Set' : 'Not set');
115
119
  output.keyValue(' API Key', config.apiKey ? 'Set' : 'Not set');
116
120
  output.keyValue(' Transport', config.transport);
117
121
  output.newline();
118
122
  output.info('To configure, use these commands:');
123
+ console.log(' gb auth login - Authorize in your browser');
119
124
  console.log(' gb config server <url> - Set server URL');
120
125
  console.log(' gb config key <api-key> - Set API key');
121
126
  console.log(' gb config transport <mode> - Set transport (auto/mcp/rest)');
122
127
  console.log(' gb config output-dir <dir> - Set download directory');
123
128
  output.newline();
124
- if (!hasApiKey()) {
125
- output.warn('API key not set. You must set an API key to use Go Bananas.');
126
- output.tip('Get your API key from your Go Bananas console.');
129
+ if (!hasAuthCredential()) {
130
+ output.warn('Authorization not set. You must authorize to use Go Bananas.');
131
+ output.tip('Run "gb auth login" for browser login, or get an API key from your Go Bananas console.');
127
132
  }
128
133
  });
129
134
  // Reset config
@@ -145,8 +150,8 @@ export function createConfigCommand() {
145
150
  .command('test')
146
151
  .description('Test connection to Go Bananas server')
147
152
  .action(async () => {
148
- if (!hasApiKey()) {
149
- output.error('API key not set. Use "gb config key <api-key>" first.');
153
+ if (!hasAuthCredential()) {
154
+ output.error('Authorization not set. Use "gb auth login" or "gb config key <api-key>" first.');
150
155
  process.exit(1);
151
156
  }
152
157
  const config = getConfig();
@@ -160,7 +165,7 @@ export function createConfigCommand() {
160
165
  output.keyValue('Transport', config.transport);
161
166
  }
162
167
  else {
163
- output.error('Connection failed. Check your server URL and API key.');
168
+ output.error('Connection failed. Check your server URL and authorization.');
164
169
  process.exit(1);
165
170
  }
166
171
  });
@@ -205,7 +210,7 @@ async function setApiKey(apiKey) {
205
210
  output.success('Connection successful!');
206
211
  }
207
212
  else {
208
- output.warn('Could not verify connection. Check your server URL and API key.');
213
+ output.warn('Could not verify connection. Check your server URL and authorization.');
209
214
  }
210
215
  }
211
216
  function setTransport(mode) {
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CA8E3C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CA6E/C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CA6G7C"}
1
+ {"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAgF3C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,CA+E/C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CA6G7C"}
@@ -230,7 +230,7 @@ export function createUploadCommand() {
230
230
  // Local file upload MUST use REST (MCP blocks base64 due to token limits)
231
231
  if (!transport.rest) {
232
232
  throw new Error('Local file upload requires REST transport. ' +
233
- 'Configure your API key to enable REST API access.');
233
+ 'Run "gb auth login" or configure an API key to enable REST API access.');
234
234
  }
235
235
  const restResult = await transport.rest.uploadImageFromFile({
236
236
  imageData: localImage.base64Data,