@redplanethq/corebrain 2.8.31 → 2.8.33

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 ADDED
@@ -0,0 +1,229 @@
1
+ # @corebrain/cli — Gateway HTTP API
2
+
3
+ The `corebrain gateway start` command launches a local daemon that serves an HTTP + WebSocket API on `0.0.0.0:7787` (default). Every route lives in `src/server/api/`; this document is the authoritative index.
4
+
5
+ ## Running a gateway
6
+
7
+ ```bash
8
+ corebrain login # once, per host
9
+ corebrain gateway config # register this host with the control plane
10
+ corebrain gateway start # start as a background service (launchd / systemd)
11
+ corebrain gateway start --foreground # attach to stdout (Docker / Railway)
12
+ ```
13
+
14
+ Port override: `COREBRAIN_GATEWAY_HTTP_PORT=8000` or `preferences.gateway.httpPort`.
15
+
16
+ ## Auth
17
+
18
+ Every request needs a bearer token:
19
+
20
+ ```
21
+ Authorization: Bearer <securityKey>
22
+ ```
23
+
24
+ The raw key is set by `corebrain gateway register`; the gateway stores `sha256(key)` and compares in constant time. Two exceptions:
25
+
26
+ - `GET /healthz/public` — no auth.
27
+ - `GET /api/coding/coding_xterm_session` — accepts `?ticket=<hmac>&session_id=<id>` in place of Bearer, for browser-direct WebSocket attaches.
28
+
29
+ Any other request without a valid Bearer returns `401 {ok: false, error: {code: "UNAUTHORIZED", ...}}`.
30
+
31
+ ## Response envelope
32
+
33
+ Tool routes (POST `/api/{group}/{tool_name}`) return:
34
+
35
+ ```json
36
+ { "ok": true, "result": <tool-specific> }
37
+ ```
38
+
39
+ On failure:
40
+
41
+ ```json
42
+ { "ok": false, "error": { "code": "TOOL_ERROR", "message": "..." } }
43
+ ```
44
+
45
+ The fastify error handler shapes non-tool errors the same way.
46
+
47
+ ## Slot toggles
48
+
49
+ The `coding`, `browser`, `exec`, `files` groups are gated by `preferences.gateway.slots.<slot>.enabled`. A disabled slot hides both the manifest entries and the HTTP routes. `utils`, `folders`, `shell` and ops are always on.
50
+
51
+ Env override: `COREBRAIN_SLOT_<SLOT>=false` (e.g. `COREBRAIN_SLOT_EXEC=false`) wins over the on-disk toggle.
52
+
53
+ ---
54
+
55
+ ## Ops (always on)
56
+
57
+ | Method | Path | Description |
58
+ |---|---|---|
59
+ | GET | `/manifest` | Full gateway manifest — tools, folders, agents, capabilities. Emits `etag` header. |
60
+ | GET | `/healthz` | Authenticated liveness: `{status, manifestEtag, uptimeSec}`. |
61
+ | GET | `/healthz/public` | Unauthenticated ping: `{status: "ok"}`. |
62
+ | GET | `/verify` | Identity probe: `{ok, gatewayId, hostname, platform}`. Used during registration. |
63
+
64
+ Source: `src/server/api/ops.ts`.
65
+
66
+ ---
67
+
68
+ ## `/api/coding` (slot: `coding`)
69
+
70
+ Drives coding agents (`claude-code`, `codex-cli`, `opencode`) on registered folders.
71
+
72
+ ### Tools
73
+
74
+ Each is `POST /api/coding/<name>` with a JSON body of the tool's params.
75
+
76
+ | Tool | Purpose |
77
+ |---|---|
78
+ | `coding_ask` | Start or continue a session. Body: `{prompt, dir, agent?, sessionId?, model?, systemPrompt?, worktree?, baseBranch?, branch?}`. Poll with `coding_read_session` for output. |
79
+ | `coding_read_session` | Read structured conversation turns + `status` (`initializing` / `working` / `idle` / `ended` / `failed`). Body: `{sessionId}`. |
80
+ | `coding_list_sessions` | List sessions from on-disk agent transcripts. Body: `{agent?, since?, limit?, offset?}`. |
81
+ | `coding_search_sessions` | Search past session titles / first messages. Body: `{query, dir?, limit?}`. |
82
+ | `coding_close_session` | Stop a session. Body: `{sessionId}`. |
83
+ | `coding_close_all` | Stop every running session and clean up worktrees. Body: `{}`. |
84
+ | `coding_list_agents` | Which agents are configured, and which is default. Body: `{}`. |
85
+
86
+ ### Interactive PTY
87
+
88
+ - `POST /api/coding/spawn` — spawn or resume an agent's TUI so a WebSocket has a PTY to attach to. Body: `{agent, dir, sessionId?}`. Returns `{sessionId, pid, status: "new"|"reconnect"|"resumed"}`. Webapp-only primitive; LLM callers use `coding_ask`.
89
+ - `GET /api/coding/coding_xterm_session?session_id=<id>` — **WebSocket**. Attaches to the PTY. Replays a scrollback buffer (≤256 KB), then streams live output. Send raw text or `{"kind":"input","data":"..."}` / `{"kind":"resize","cols":N,"rows":M}` JSON envelopes. Accepts HMAC `?ticket=` for browser-direct attaches.
90
+
91
+ Source: `src/server/api/coding/`, `src/server/tools/coding-tools.ts`.
92
+
93
+ ---
94
+
95
+ ## `/api/browser` (slot: `browser`)
96
+
97
+ Playwright-driven Chromium sessions bound to persistent profiles.
98
+
99
+ ### Tools
100
+
101
+ | Tool | Purpose |
102
+ |---|---|
103
+ | `browser_navigate` | Go to a URL. |
104
+ | `browser_snapshot` | Get an ARIA accessibility tree — call before interacting to discover element refs. |
105
+ | `browser_click` | Click by text description or ref. |
106
+ | `browser_fill` | Clear then fill an input. |
107
+ | `browser_type` | Type character-by-character (real-user simulation). |
108
+ | `browser_press_key` | Press a key (Enter, Tab, ArrowDown, etc.). |
109
+ | `browser_select_option` | Choose a `<select>` option. |
110
+ | `browser_screenshot` | Base64 PNG of the viewport. |
111
+ | `browser_wait_for` | Wait on `load` / `domcontentloaded` / `networkidle`. |
112
+ | `browser_evaluate` | Run a JS expression in the page context. |
113
+ | `browser_go_back` / `browser_go_forward` | History navigation. |
114
+ | `browser_scroll` | Scroll by pixels. |
115
+ | `browser_list_sessions` | List configured sessions, their profiles, and live status. |
116
+ | `browser_create_session` | Bind a new session name to a profile. Body: `{session, profile}`. |
117
+ | `browser_delete_session` | Remove a session from config (closes it if running; profile data preserved). |
118
+ | `browser_close_session` | Close a live session (config kept). |
119
+ | `browser_close_all` | Close every running session. |
120
+
121
+ ### Live view + lifecycle
122
+
123
+ - `POST /api/browser/launch` — lazy-launch (or reattach to) a session by name. Body: `{session}`. Always headless — live view goes over CDP.
124
+ - `GET /api/browser/cdp/:session` — **WebSocket** proxy for Chrome DevTools Protocol. Pipes frames between the client and the headless Chromium's `--remote-debugging-port`. Closes with `4404` if the session isn't running, `4502` if the upstream handshake fails.
125
+
126
+ Source: `src/server/api/browser/`, `src/server/tools/browser-tools.ts`.
127
+
128
+ ---
129
+
130
+ ## `/api/exec` (slot: `exec`)
131
+
132
+ - `POST /api/exec/exec_command` — run a shell command. Enforces the `slots.exec.allow` / `slots.exec.deny` patterns from preferences.
133
+
134
+ Source: `src/server/api/exec/`, `src/server/tools/exec-tools.ts`.
135
+
136
+ ---
137
+
138
+ ## `/api/files` (slot: `files`)
139
+
140
+ Scoped to folders registered with the `files` scope.
141
+
142
+ | Tool | Purpose |
143
+ |---|---|
144
+ | `files_read` | Read a file as UTF-8 with `cat -n` style line numbers. |
145
+ | `files_write` | Create or overwrite a file (parent dirs auto-created). |
146
+ | `files_edit` | Replace an exact string region. Fails on non-unique matches unless `replace_all: true`. |
147
+ | `files_glob` | Glob search; returns absolute paths sorted by mtime (newest first). |
148
+ | `files_grep` | Ripgrep over file contents. Supports `path` / `glob` / `type` filters, three output modes, context lines. Requires `rg` on PATH. |
149
+
150
+ Source: `src/server/api/files/`, `src/server/tools/files-tools.ts`.
151
+
152
+ ---
153
+
154
+ ## `/api/utils` (always on)
155
+
156
+ - `POST /api/utils/sleep` — pause for 1–300 seconds. Body: `{seconds, reason?}`.
157
+
158
+ Source: `src/server/api/utils/`, `src/server/tools/utils-tools.ts`.
159
+
160
+ ---
161
+
162
+ ## `/api/folders` (always on)
163
+
164
+ Register the on-disk paths the gateway is allowed to touch.
165
+
166
+ | Method | Path | Body / Params | Description |
167
+ |---|---|---|---|
168
+ | GET | `/api/folders` | — | List registered folders. |
169
+ | POST | `/api/folders/local` | `{name?, path, scopes?}` | Register an existing directory. `scopes` defaults to `["files","coding","exec"]`. |
170
+ | POST | `/api/folders/git` | `{name?, url, branch?}` | `git clone --depth 1` into `COREBRAIN_DEFAULT_WORKSPACE` (default `/app`) and register the result. |
171
+ | DELETE | `/api/folders/:idOrName` | — | Unregister. Does not delete files. |
172
+
173
+ Source: `src/server/api/folders/index.ts`.
174
+
175
+ ---
176
+
177
+ ## `/api/shell` (always on)
178
+
179
+ Singleton PTY for the webapp Terminal tab.
180
+
181
+ - `POST /api/shell/spawn` — spawn or reattach. Body: `{cwd?, fresh?}`. Returns `{sessionId, pid, resumed}`. Resolves shell in order `$SHELL → /bin/zsh → /bin/bash → /bin/sh`. Attach to the returned `sessionId` over `/api/coding/coding_xterm_session` (same PTY manager).
182
+
183
+ Source: `src/server/api/shell/index.ts`.
184
+
185
+ ---
186
+
187
+ ## Manifest shape
188
+
189
+ `GET /manifest` returns a validated `Manifest` (schema in `@redplanethq/gateway-protocol`):
190
+
191
+ ```ts
192
+ {
193
+ protocolVersion: "1",
194
+ gateway: { id, name, description?, version, platform, hostname, deployMode },
195
+ capabilities: {
196
+ browser: { enabled, engines?: string[] },
197
+ directXterm?: boolean, // HMAC-ticket xterm auth supported
198
+ },
199
+ folders: Folder[], // registered on-disk paths + scopes
200
+ tools: GatewayTool[], // one per enabled tool, name/description/inputSchema
201
+ agents: string[], // configured coding agents
202
+ availableAgents: AvailableAgent[], // detected on PATH
203
+ }
204
+ ```
205
+
206
+ `deployMode` is `native` / `docker` / `railway`, derived from `COREBRAIN_DEPLOY_MODE` or `/.dockerenv`.
207
+
208
+ ---
209
+
210
+ ## Errors
211
+
212
+ Consistent envelope on any failure:
213
+
214
+ ```json
215
+ { "ok": false, "error": { "code": "UNAUTHORIZED" | "TOOL_ERROR" | "INTERNAL" | "...", "message": "..." } }
216
+ ```
217
+
218
+ Common statuses:
219
+
220
+ | Status | When |
221
+ |---|---|
222
+ | 400 | Missing or invalid params (zod validation, missing required body field). |
223
+ | 401 | Bearer / ticket verification failed. |
224
+ | 403 | Folder scope check rejected the path. |
225
+ | 404 | Resource not found (session, folder, browser session). |
226
+ | 500 | Internal — see gateway log (`~/.corebrain/logs/gateway.log`). |
227
+ | 502 | Upstream failure (git clone, CDP handshake). |
228
+
229
+ For WebSocket routes, close codes carry the same signal: `4400` (bad request), `4404` (not found), `4500` (server error), `4502` (upstream error), `1000` (normal close).
Binary file
@@ -0,0 +1,17 @@
1
+ import zod from 'zod';
2
+ export declare const description = "Log in to a subscription (Claude, Codex, Antigravity, xAI) on a bundled gateway. Drives CLIProxyAPI\u2019s OAuth flow through the gateway so tokens land directly on it.";
3
+ export declare const options: zod.ZodObject<{
4
+ login: zod.ZodEnum<{
5
+ claude: "claude";
6
+ codex: "codex";
7
+ antigravity: "antigravity";
8
+ xai: "xai";
9
+ }>;
10
+ gateway: zod.ZodOptional<zod.ZodString>;
11
+ }, zod.core.$strip>;
12
+ type Props = {
13
+ options: zod.infer<typeof options>;
14
+ };
15
+ export default function GatewayLLMProxy({ options: opts }: Props): null;
16
+ export {};
17
+ //# sourceMappingURL=llmproxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llmproxy.d.ts","sourceRoot":"","sources":["../../../src/commands/gateway/llmproxy.tsx"],"names":[],"mappings":"AAIA,OAAO,GAAG,MAAM,KAAK,CAAC;AAItB,eAAO,MAAM,WAAW,6KAC8I,CAAC;AAWvK,eAAO,MAAM,OAAO;;;;;;;;mBAQlB,CAAC;AAEH,KAAK,KAAK,GAAG;IAAC,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAA;CAAC,CAAC;AA0WlD,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAC,OAAO,EAAE,IAAI,EAAC,EAAE,KAAK,QAM7D"}
@@ -0,0 +1,297 @@
1
+ import { useEffect } from 'react';
2
+ import { useApp } from 'ink';
3
+ import * as p from '@clack/prompts';
4
+ import chalk from 'chalk';
5
+ import zod from 'zod';
6
+ import http from 'node:http';
7
+ import { listGateways } from '../../server/api/gateways.js';
8
+ export const description = 'Log in to a subscription (Claude, Codex, Antigravity, xAI) on a bundled gateway. Drives CLIProxyAPI’s OAuth flow through the gateway so tokens land directly on it.';
9
+ /**
10
+ * Providers supported by the built-in gateway llmproxy. Kept as a string
11
+ * enum for CLI validation, but the authoritative list lives in
12
+ * `<gateway>/api/llmproxy/providers` — we bail with a clean error if the
13
+ * requested provider isn't in the gateway's response.
14
+ */
15
+ const LOGIN_CHOICES = ['claude', 'codex', 'antigravity', 'xai'];
16
+ export const options = zod.object({
17
+ login: zod
18
+ .enum(LOGIN_CHOICES)
19
+ .describe('Which subscription to log in to. One of: claude, codex, antigravity, xai.'),
20
+ gateway: zod
21
+ .string()
22
+ .optional()
23
+ .describe('Gateway name or id (only needed when multiple gateways are registered).'),
24
+ });
25
+ /** Turn `https://foo/` + `/api/x` into `https://foo/api/x` (no double slash). */
26
+ function joinUrl(base, path) {
27
+ return `${base.replace(/\/$/, '')}${path.startsWith('/') ? path : `/${path}`}`;
28
+ }
29
+ async function fetchProviders(gatewayUrl) {
30
+ const res = await fetch(joinUrl(gatewayUrl, '/api/llmproxy/providers'), {
31
+ signal: AbortSignal.timeout(10_000),
32
+ });
33
+ if (!res.ok) {
34
+ throw new Error(`gateway did not return provider list (HTTP ${res.status}). Is this the bundled gateway image (with cliproxy)?`);
35
+ }
36
+ const body = (await res.json());
37
+ if (!body.providers)
38
+ throw new Error('malformed /api/llmproxy/providers response');
39
+ return body.providers;
40
+ }
41
+ async function startLogin(gatewayUrl, provider) {
42
+ const res = await fetch(joinUrl(gatewayUrl, `/api/llmproxy/login/${provider}`), {
43
+ method: 'POST',
44
+ signal: AbortSignal.timeout(30_000),
45
+ });
46
+ const body = (await res.json());
47
+ if (!res.ok || !body.ok) {
48
+ throw new Error(body.error ?? `gateway returned HTTP ${res.status}`);
49
+ }
50
+ return body;
51
+ }
52
+ async function pollStatus(gatewayUrl, provider) {
53
+ const res = await fetch(joinUrl(gatewayUrl, `/api/llmproxy/login/${provider}/status`), {
54
+ signal: AbortSignal.timeout(5_000),
55
+ });
56
+ return (await res.json());
57
+ }
58
+ /**
59
+ * Start a tiny local HTTP server on the OAuth callback port. When the user's
60
+ * browser is redirected to `http://localhost:<port>/callback?code=...` after
61
+ * approving on the provider's OAuth page, this catches the request, forwards
62
+ * the raw query to the gateway (`/llmproxy-oauth/<provider>/callback?...`),
63
+ * and returns a friendly page to the browser.
64
+ */
65
+ function bindLocalCallback(provider, port, callbackPath, gatewayUrl) {
66
+ let resolve;
67
+ const received = new Promise((r) => {
68
+ resolve = r;
69
+ });
70
+ const server = http.createServer(async (req, res) => {
71
+ const path = req.url ?? '/';
72
+ // Only forward the actual callback — ignore favicon.ico, HEAD probes, etc.
73
+ // Match `callbackPath` optionally followed by `?...` (query string).
74
+ const pathOnly = path.split('?')[0] ?? path;
75
+ if (pathOnly !== callbackPath) {
76
+ res.writeHead(404, { 'content-type': 'text/plain' });
77
+ res.end('not the callback');
78
+ return;
79
+ }
80
+ const query = path.includes('?') ? path.slice(path.indexOf('?')) : '';
81
+ const targetUrl = joinUrl(gatewayUrl, `/llmproxy-oauth/${provider}${callbackPath}${query}`);
82
+ try {
83
+ const forward = await fetch(targetUrl, {
84
+ method: 'GET',
85
+ signal: AbortSignal.timeout(30_000),
86
+ redirect: 'manual',
87
+ });
88
+ // Regardless of what the gateway/cliproxy returns, show the user a
89
+ // clean confirmation page. Success/failure details come from polling
90
+ // /api/llmproxy/login/:provider/status back in the main flow.
91
+ res.writeHead(forward.ok ? 200 : forward.status, { 'content-type': 'text/html' });
92
+ res.end(`<!doctype html>
93
+ <meta charset="utf-8">
94
+ <title>Login complete</title>
95
+ <div style="font-family: -apple-system, sans-serif; max-width: 480px; margin: 8rem auto; text-align: center;">
96
+ <h2>${forward.ok ? 'Login complete' : 'Login failed'}</h2>
97
+ <p>You can close this tab and return to your terminal.</p>
98
+ </div>`);
99
+ resolve({ ok: forward.ok, error: forward.ok ? undefined : `gateway returned HTTP ${forward.status}` });
100
+ }
101
+ catch (err) {
102
+ res.writeHead(502, { 'content-type': 'text/plain' });
103
+ res.end('failed to relay callback to gateway');
104
+ resolve({ ok: false, error: err instanceof Error ? err.message : String(err) });
105
+ }
106
+ });
107
+ server.listen(port, '127.0.0.1');
108
+ const close = () => new Promise((r) => {
109
+ server.close(() => r());
110
+ });
111
+ return { close, received };
112
+ }
113
+ async function pickGateway(name) {
114
+ const gateways = await listGateways();
115
+ if (gateways.length === 0) {
116
+ p.log.error(`No gateways registered with your CORE workspace. Deploy one first (${chalk.cyan('corebrain gateway setup')}) or register via the webapp.`);
117
+ return null;
118
+ }
119
+ if (name) {
120
+ const match = gateways.find((g) => g.id === name || g.name === name);
121
+ if (!match) {
122
+ p.log.error(`No gateway named or ID'd ${chalk.bold(name)}. Available:\n ${gateways
123
+ .map((g) => `${g.name} (${g.id})`)
124
+ .join('\n ')}`);
125
+ return null;
126
+ }
127
+ return match;
128
+ }
129
+ if (gateways.length === 1)
130
+ return gateways[0];
131
+ const choice = await p.select({
132
+ message: 'Which gateway do you want to log in to?',
133
+ options: gateways.map((g) => ({
134
+ value: g.id,
135
+ label: `${g.name} (${g.baseUrl})`,
136
+ hint: g.status === 'CONNECTED' ? 'connected' : 'disconnected',
137
+ })),
138
+ });
139
+ if (p.isCancel(choice))
140
+ return null;
141
+ return gateways.find((g) => g.id === choice) ?? null;
142
+ }
143
+ async function runLoginFlow(opts) {
144
+ const gateway = await pickGateway(opts.gateway);
145
+ if (!gateway) {
146
+ process.exitCode = 1;
147
+ return;
148
+ }
149
+ p.log.info(`Using gateway ${chalk.bold(gateway.name)} at ${gateway.baseUrl}`);
150
+ const providersSpinner = p.spinner();
151
+ providersSpinner.start('Fetching provider list from gateway...');
152
+ let providers;
153
+ try {
154
+ providers = await fetchProviders(gateway.baseUrl);
155
+ }
156
+ catch (err) {
157
+ providersSpinner.stop(chalk.red('Failed to reach gateway.'));
158
+ p.log.error(err instanceof Error ? err.message : String(err));
159
+ process.exitCode = 1;
160
+ return;
161
+ }
162
+ providersSpinner.stop(`Gateway supports ${Object.keys(providers).length} providers`);
163
+ const meta = providers[opts.login];
164
+ if (!meta) {
165
+ p.log.error(`Gateway does not expose the ${chalk.bold(opts.login)} provider. Available: ${Object.keys(providers).join(', ')}`);
166
+ process.exitCode = 1;
167
+ return;
168
+ }
169
+ // For callback flow: bind the local port BEFORE asking the gateway to
170
+ // start the login. If the port is taken, we'd rather fail here than after
171
+ // spawning the subprocess.
172
+ let localServer = null;
173
+ if (meta.flow === 'callback') {
174
+ if (!meta.port || !meta.callbackPath) {
175
+ p.log.error(`Provider ${opts.login} is marked as callback flow but missing port/callbackPath in the gateway config.`);
176
+ process.exitCode = 1;
177
+ return;
178
+ }
179
+ try {
180
+ localServer = bindLocalCallback(opts.login, meta.port, meta.callbackPath, gateway.baseUrl);
181
+ }
182
+ catch (err) {
183
+ p.log.error(`Could not bind localhost:${meta.port} for the OAuth callback. Another process may be listening there. ${err instanceof Error ? err.message : String(err)}`);
184
+ process.exitCode = 1;
185
+ return;
186
+ }
187
+ }
188
+ const loginSpinner = p.spinner();
189
+ loginSpinner.start('Asking gateway to start the login flow...');
190
+ let start;
191
+ try {
192
+ start = await startLogin(gateway.baseUrl, opts.login);
193
+ }
194
+ catch (err) {
195
+ loginSpinner.stop(chalk.red('Gateway rejected the login request.'));
196
+ p.log.error(err instanceof Error ? err.message : String(err));
197
+ if (localServer)
198
+ await localServer.close();
199
+ process.exitCode = 1;
200
+ return;
201
+ }
202
+ loginSpinner.stop('Got login details from gateway');
203
+ // Show the user the URL (both flows) and, for device-code, the short code.
204
+ const noteLines = [
205
+ chalk.bold(`Open this URL in your browser to sign in to ${meta.displayName}:`),
206
+ '',
207
+ chalk.cyan(start.authUrl ?? ''),
208
+ ];
209
+ if (meta.flow === 'device-code' && start.userCode) {
210
+ noteLines.push('', `${chalk.bold('Then enter this code on the page:')} ${chalk.yellow.bold(start.userCode)}`);
211
+ }
212
+ else if (meta.flow === 'callback') {
213
+ noteLines.push('', chalk.dim('This CLI is listening on'), chalk.dim(` http://localhost:${meta.port}${meta.callbackPath}`), chalk.dim('and will forward the OAuth callback to your gateway automatically.'));
214
+ }
215
+ p.note(noteLines.join('\n'), `Log in to ${meta.displayName}`);
216
+ const waitSpinner = p.spinner();
217
+ waitSpinner.start(meta.flow === 'device-code'
218
+ ? 'Waiting for you to approve on the provider website...'
219
+ : 'Waiting for you to complete the browser flow...');
220
+ // Poll status until completed / failed. For callback flow, also race
221
+ // against the local server receiving the OAuth redirect — either signal
222
+ // finishes the wait.
223
+ const timeoutMs = 5 * 60_000;
224
+ const startedAt = Date.now();
225
+ let outcome = null;
226
+ while (Date.now() - startedAt < timeoutMs && !outcome) {
227
+ const waits = [
228
+ new Promise((r) => setTimeout(() => r({ from: 'poll' }), 2_000)),
229
+ ];
230
+ if (localServer) {
231
+ waits.push(localServer.received.then((r) => ({ from: 'callback', r })));
232
+ }
233
+ const raced = await Promise.race(waits);
234
+ if (raced.from === 'callback') {
235
+ outcome = raced.r;
236
+ break;
237
+ }
238
+ try {
239
+ const status = await pollStatus(gateway.baseUrl, opts.login);
240
+ if (status.status === 'completed') {
241
+ outcome = { ok: true };
242
+ break;
243
+ }
244
+ if (status.status === 'failed') {
245
+ outcome = { ok: false, error: status.error ?? 'unknown gateway error' };
246
+ break;
247
+ }
248
+ }
249
+ catch {
250
+ // transient poll failure — keep waiting
251
+ }
252
+ }
253
+ if (localServer)
254
+ await localServer.close();
255
+ if (!outcome) {
256
+ waitSpinner.stop(chalk.red('Timed out waiting for authorization.'));
257
+ p.log.error(`No response within ${timeoutMs / 1000}s. Re-run the command to try again.`);
258
+ process.exitCode = 1;
259
+ return;
260
+ }
261
+ if (!outcome.ok) {
262
+ waitSpinner.stop(chalk.red('Login failed.'));
263
+ p.log.error(outcome.error ?? 'unknown error');
264
+ process.exitCode = 1;
265
+ return;
266
+ }
267
+ waitSpinner.stop(chalk.green('Login complete'));
268
+ p.note([
269
+ `${chalk.bold('BYOK base URL:')} ${gateway.baseUrl.replace(/\/$/, '')}/llmproxy/v1`,
270
+ `${chalk.bold('API key:')} your ${chalk.dim('COREBRAIN_GATEWAY_SECURITY_KEY')} value`,
271
+ '',
272
+ `Paste both into ${chalk.cyan('CORE → Workspace Settings → Models → BYOK')}.`,
273
+ `Then set a workspace model like ${chalk.cyan(`openai/${defaultModelFor(opts.login)}`)}.`,
274
+ ].join('\n'), 'Wire into CORE');
275
+ }
276
+ function defaultModelFor(provider) {
277
+ switch (provider) {
278
+ case 'claude':
279
+ return 'claude-sonnet-4-6';
280
+ case 'codex':
281
+ return 'gpt-4o';
282
+ case 'antigravity':
283
+ return 'gemini-2.0-flash';
284
+ case 'xai':
285
+ return 'grok-2-latest';
286
+ default:
287
+ return provider;
288
+ }
289
+ }
290
+ export default function GatewayLLMProxy({ options: opts }) {
291
+ const { exit } = useApp();
292
+ useEffect(() => {
293
+ runLoginFlow(opts).finally(() => setTimeout(() => exit(), 100));
294
+ }, [exit, opts]);
295
+ return null;
296
+ }
297
+ //# sourceMappingURL=llmproxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llmproxy.js","sourceRoot":"","sources":["../../../src/commands/gateway/llmproxy.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/server/api/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,cAAc,EAAE,YAAY,EAAC,MAAM,SAAS,CAAC;AAG1D,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAQvE;AAED,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAGvE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAC3B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,SAAS,EAAE,MAAM,GACf,OAAO,CAoCT;AAWD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,GAAE,MAAM,EAAwB,IACjC,KAAK,cAAc,EAAE,OAAO,YAAY,mBAyBvE"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/server/api/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,cAAc,EAAE,YAAY,EAAC,MAAM,SAAS,CAAC;AAG1D,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAQvE;AAED,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAGvE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAC3B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,SAAS,EAAE,MAAM,GACf,OAAO,CAoCT;AAWD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,GAAE,MAAM,EAAwB,IAKjC,KAAK,cAAc,EAAE,OAAO,YAAY,mBA6BvE"}
@@ -96,8 +96,17 @@ const TICKET_PATHS = new Set([
96
96
  * Bearer securityKey — there is no loopback bypass.
97
97
  */
98
98
  export function makeAuthHook(skip = ['/healthz/public']) {
99
+ // Entries ending in "/" match by prefix (e.g. "/api/llmproxy/" skips
100
+ // every subpath). Entries without a trailing slash match exactly, with
101
+ // an optional query string. Keep prefix entries narrow — they bypass the
102
+ // gateway's security key.
99
103
  return async function authHook(req, reply) {
100
- if (skip.some((s) => req.url === s || req.url.startsWith(s + '?')))
104
+ const matched = skip.some((s) => {
105
+ if (s.endsWith('/'))
106
+ return req.url === s.slice(0, -1) || req.url.startsWith(s);
107
+ return req.url === s || req.url.startsWith(s + '?');
108
+ });
109
+ if (matched)
101
110
  return;
102
111
  // Ticket auth for the browser-direct xterm WS. A request that targets
103
112
  // a TICKET_PATH and supplies `?ticket=…` is verified via HMAC instead
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/server/api/auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/server/api/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { FastifyPluginAsync } from 'fastify';
2
+ export declare const llmproxyRoutes: FastifyPluginAsync;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/server/api/llmproxy/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,SAAS,CAAC;AAwMhD,eAAO,MAAM,cAAc,EAAE,kBAsF5B,CAAC"}