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.
- package/README.md +13 -6
- package/dist/auth/oauth.d.ts +19 -0
- package/dist/auth/oauth.d.ts.map +1 -0
- package/dist/auth/oauth.js +266 -0
- package/dist/auth/oauth.js.map +1 -0
- package/dist/commands/auth.d.ts +9 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +72 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +17 -12
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/edit.d.ts.map +1 -1
- package/dist/commands/edit.js +1 -1
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +54 -1
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/index.d.ts +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +1 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +1 -1
- package/dist/commands/mcp.js.map +1 -1
- package/dist/config/config.d.ts +26 -0
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +44 -1
- package/dist/config/config.js.map +1 -1
- package/dist/index.js +19 -6
- package/dist/index.js.map +1 -1
- package/dist/mcp/stdio-proxy.d.ts.map +1 -1
- package/dist/mcp/stdio-proxy.js +40 -30
- package/dist/mcp/stdio-proxy.js.map +1 -1
- package/dist/transport/mcp-client.d.ts +22 -3
- package/dist/transport/mcp-client.d.ts.map +1 -1
- package/dist/transport/mcp-client.js +68 -21
- package/dist/transport/mcp-client.js.map +1 -1
- package/dist/transport/rest-client.d.ts +14 -1
- package/dist/transport/rest-client.d.ts.map +1 -1
- package/dist/transport/rest-client.js +28 -4
- package/dist/transport/rest-client.js.map +1 -1
- package/dist/utils/file-handler.d.ts +4 -0
- package/dist/utils/file-handler.d.ts.map +1 -1
- package/dist/utils/file-handler.js +36 -10
- package/dist/utils/file-handler.js.map +1 -1
- 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
|
|
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
|
|
35
|
+
claude mcp add --transport http go-bananas https://gobananasai.com/mcp
|
|
32
36
|
```
|
|
33
37
|
|
|
34
|
-
|
|
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 (
|
|
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;
|
|
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"}
|
package/dist/commands/config.js
CHANGED
|
@@ -4,13 +4,11 @@
|
|
|
4
4
|
* Commands for managing CLI configuration.
|
|
5
5
|
*/
|
|
6
6
|
import { Command } from 'commander';
|
|
7
|
-
import { getConfig, setConfig,
|
|
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' ||
|
|
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 (!
|
|
125
|
-
output.warn('
|
|
126
|
-
output.tip('
|
|
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 (!
|
|
149
|
-
output.error('
|
|
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
|
|
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
|
|
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":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,SAAS,EACT,SAAS,
|
|
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,
|
|
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"}
|
package/dist/commands/edit.js
CHANGED
|
@@ -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
|
-
'
|
|
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,
|