flockbay 0.10.40 → 0.10.41
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/dist/{index-COD6HpzC.mjs → index-4XOVLZZ1.mjs} +10 -533
- package/dist/{index-hc8sYVfl.cjs → index-X_0a6dpP.cjs} +12 -535
- package/dist/index.cjs +4 -5
- package/dist/index.mjs +4 -5
- package/dist/lib.cjs +3 -1
- package/dist/lib.d.cts +3 -0
- package/dist/lib.d.mts +3 -0
- package/dist/lib.mjs +3 -1
- package/dist/{migratePlugin-DNHywpj6.cjs → migratePlugin-8J2c5CrP.cjs} +3 -1
- package/dist/{migratePlugin-Beo3Vgvz.mjs → migratePlugin-D-oSS5d1.mjs} +3 -1
- package/dist/{runCodex-BAbRZt7Y.mjs → runCodex-B10NJHEL.mjs} +4 -5
- package/dist/{runCodex-B3Qjwkr6.cjs → runCodex-BfUYEEBp.cjs} +4 -5
- package/dist/{runGemini-D9WGwILY.mjs → runGemini-B4kutwSV.mjs} +4 -5
- package/dist/{runGemini-BED5hBNz.cjs → runGemini-CnyDdQAY.cjs} +4 -5
- package/dist/{types-2Bs_CNcy.cjs → types-2vFbaIZJ.cjs} +772 -2
- package/dist/{types-4acLcOdW.mjs → types-DQ-HKKy4.mjs} +769 -4
- package/package.json +1 -1
|
@@ -2,7 +2,7 @@ import{createRequire as _pkgrollCR}from"node:module";const require=_pkgrollCR(im
|
|
|
2
2
|
import * as os from 'node:os';
|
|
3
3
|
import os__default, { homedir } from 'node:os';
|
|
4
4
|
import { randomUUID, createCipheriv, randomBytes, createHash as createHash$1 } from 'node:crypto';
|
|
5
|
-
import { l as logger, b as projectPath, d as backoff, e as delay, R as RawJSONLinesSchema, c as configuration, f as readDaemonState, g as clearDaemonState, p as packageJson, r as readSettings, h as readCredentials, u as updateSettings, w as writeCredentials, j as unrealMcpPythonDir, k as acquireDaemonLock, m as writeDaemonState, n as ApiMachineClient,
|
|
5
|
+
import { l as logger, b as projectPath, d as backoff, e as delay, R as RawJSONLinesSchema, c as configuration, f as readDaemonState, g as clearDaemonState, p as packageJson, r as readSettings, h as readCredentials, u as updateSettings, o as openBrowser, w as writeCredentials, j as unrealMcpPythonDir, k as acquireDaemonLock, m as writeDaemonState, n as ApiMachineClient, q as releaseDaemonLock, s as sendUnrealMcpTcpCommand, A as ApiClient, v as validatePath, t as run, x as run$1, y as buildShellInvocation, z as clearCredentials, B as clearMachineId, C as authenticateCodex, D as syncCodexCliAuth, E as authenticateClaude, F as authenticateGemini, i as installUnrealMcpPluginToEngine, G as buildAndInstallUnrealMcpPlugin, H as getLatestDaemonLog, I as normalizeServerUrlForNode } from './types-DQ-HKKy4.mjs';
|
|
6
6
|
import { spawn, execFileSync, execSync } from 'node:child_process';
|
|
7
7
|
import * as path from 'node:path';
|
|
8
8
|
import path__default, { resolve, join, dirname } from 'node:path';
|
|
@@ -10,7 +10,7 @@ import { createInterface } from 'node:readline';
|
|
|
10
10
|
import * as fs from 'node:fs';
|
|
11
11
|
import fs__default, { existsSync, readFileSync, mkdirSync, readdirSync, accessSync, constants, statSync, createReadStream, writeFileSync, unlinkSync } from 'node:fs';
|
|
12
12
|
import process$1 from 'node:process';
|
|
13
|
-
import fs$1, { readFile, access as access$1, mkdir, readdir, stat, writeFile, copyFile, rename, open
|
|
13
|
+
import fs$1, { readFile, access as access$1, mkdir, readdir, stat, writeFile, copyFile, rename, open } from 'node:fs/promises';
|
|
14
14
|
import fs$2, { watch, access, mkdir as mkdir$1, writeFile as writeFile$1, rm } from 'fs/promises';
|
|
15
15
|
import { useStdout, useInput, Box, Text, render } from 'ink';
|
|
16
16
|
import React, { useState, useRef, useEffect, useCallback } from 'react';
|
|
@@ -18,16 +18,17 @@ import { fileURLToPath } from 'node:url';
|
|
|
18
18
|
import axios from 'axios';
|
|
19
19
|
import { EventEmitter } from 'node:events';
|
|
20
20
|
import 'socket.io-client';
|
|
21
|
-
import { spawn as spawn$1, execFileSync as execFileSync$1
|
|
22
|
-
import { createHash
|
|
21
|
+
import { spawn as spawn$1, execFileSync as execFileSync$1 } from 'child_process';
|
|
22
|
+
import { createHash } from 'crypto';
|
|
23
23
|
import { join as join$1, basename, dirname as dirname$1 } from 'path';
|
|
24
24
|
import os$1 from 'os';
|
|
25
25
|
import 'node:net';
|
|
26
|
+
import 'http';
|
|
27
|
+
import 'open';
|
|
26
28
|
import { readFileSync as readFileSync$1, mkdirSync as mkdirSync$1, writeFileSync as writeFileSync$1, existsSync as existsSync$1, unlinkSync as unlinkSync$1 } from 'fs';
|
|
27
29
|
import psList from 'ps-list';
|
|
28
30
|
import spawn$2 from 'cross-spawn';
|
|
29
31
|
import * as tmp from 'tmp';
|
|
30
|
-
import open from 'open';
|
|
31
32
|
import fastify from 'fastify';
|
|
32
33
|
import { z } from 'zod';
|
|
33
34
|
import { validatorCompiler, serializerCompiler } from 'fastify-type-provider-zod';
|
|
@@ -35,8 +36,6 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
|
35
36
|
import { createServer } from 'node:http';
|
|
36
37
|
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
37
38
|
import 'tweetnacl';
|
|
38
|
-
import { createServer as createServer$1 } from 'http';
|
|
39
|
-
import { promisify } from 'util';
|
|
40
39
|
import { deflateSync } from 'node:zlib';
|
|
41
40
|
|
|
42
41
|
class Session {
|
|
@@ -5180,23 +5179,6 @@ ${typeLabels[type] || type}:`));
|
|
|
5180
5179
|
console.log(chalk.green("\n\u2705 Doctor diagnosis complete!\n"));
|
|
5181
5180
|
}
|
|
5182
5181
|
|
|
5183
|
-
async function openBrowser(url) {
|
|
5184
|
-
try {
|
|
5185
|
-
const forceOpen = process.env.FLOCKBAY_FORCE_BROWSER === "1" || process.env.FLOCKBAY_FORCE_BROWSER === "true";
|
|
5186
|
-
if (!forceOpen && (!process.stdout.isTTY || process.env.CI || process.env.HEADLESS)) {
|
|
5187
|
-
logger.debug("[browser] Headless/non-interactive environment detected, skipping browser open");
|
|
5188
|
-
return false;
|
|
5189
|
-
}
|
|
5190
|
-
logger.debug(`[browser] Attempting to open URL: ${url}`);
|
|
5191
|
-
await open(url, { wait: false });
|
|
5192
|
-
logger.debug("[browser] Browser opened successfully");
|
|
5193
|
-
return true;
|
|
5194
|
-
} catch (error) {
|
|
5195
|
-
logger.debug("[browser] Failed to open browser:", error);
|
|
5196
|
-
return false;
|
|
5197
|
-
}
|
|
5198
|
-
}
|
|
5199
|
-
|
|
5200
5182
|
async function loginWithClerkAndPairMachine() {
|
|
5201
5183
|
logger.debug("[AUTH] Starting Clerk-based CLI login + machine pairing");
|
|
5202
5184
|
const settings = await updateSettings(async (s) => {
|
|
@@ -7877,7 +7859,7 @@ function detectImageMimeTypeFromBuffer$1(buf) {
|
|
|
7877
7859
|
return null;
|
|
7878
7860
|
}
|
|
7879
7861
|
async function readFileHeader(filePath, bytes) {
|
|
7880
|
-
const fh = await open
|
|
7862
|
+
const fh = await open(filePath, "r");
|
|
7881
7863
|
try {
|
|
7882
7864
|
const maxBytes = Math.max(1, Math.floor(bytes));
|
|
7883
7865
|
const buf = Buffer.allocUnsafe(maxBytes);
|
|
@@ -13806,511 +13788,6 @@ ${chalk.bold("Usage:")}
|
|
|
13806
13788
|
`);
|
|
13807
13789
|
}
|
|
13808
13790
|
|
|
13809
|
-
const CLIENT_ID$2 = "app_EMoamEEZ73f0CkXaXp7hrann";
|
|
13810
|
-
const AUTH_BASE_URL = "https://auth.openai.com";
|
|
13811
|
-
const DEFAULT_PORT$2 = 1455;
|
|
13812
|
-
function generatePKCE$2() {
|
|
13813
|
-
const verifier = randomBytes$1(32).toString("base64url").replace(/[^a-zA-Z0-9\-._~]/g, "");
|
|
13814
|
-
const challenge = createHash("sha256").update(verifier).digest("base64url").replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
|
|
13815
|
-
return { verifier, challenge };
|
|
13816
|
-
}
|
|
13817
|
-
function generateState$2() {
|
|
13818
|
-
return randomBytes$1(16).toString("hex");
|
|
13819
|
-
}
|
|
13820
|
-
function parseJWT(token) {
|
|
13821
|
-
const parts = token.split(".");
|
|
13822
|
-
if (parts.length !== 3) {
|
|
13823
|
-
throw new Error("Invalid JWT format");
|
|
13824
|
-
}
|
|
13825
|
-
const payload = Buffer.from(parts[1], "base64url").toString();
|
|
13826
|
-
return JSON.parse(payload);
|
|
13827
|
-
}
|
|
13828
|
-
async function findAvailablePort$2() {
|
|
13829
|
-
return new Promise((resolve) => {
|
|
13830
|
-
const server = createServer$1();
|
|
13831
|
-
server.listen(0, "127.0.0.1", () => {
|
|
13832
|
-
const port = server.address().port;
|
|
13833
|
-
server.close(() => resolve(port));
|
|
13834
|
-
});
|
|
13835
|
-
});
|
|
13836
|
-
}
|
|
13837
|
-
async function isPortAvailable$2(port) {
|
|
13838
|
-
return new Promise((resolve) => {
|
|
13839
|
-
const testServer = createServer$1();
|
|
13840
|
-
testServer.once("error", () => {
|
|
13841
|
-
testServer.close();
|
|
13842
|
-
resolve(false);
|
|
13843
|
-
});
|
|
13844
|
-
testServer.listen(port, "127.0.0.1", () => {
|
|
13845
|
-
testServer.close(() => resolve(true));
|
|
13846
|
-
});
|
|
13847
|
-
});
|
|
13848
|
-
}
|
|
13849
|
-
async function exchangeCodeForTokens$2(code, verifier, port) {
|
|
13850
|
-
const response = await fetch(`${AUTH_BASE_URL}/oauth/token`, {
|
|
13851
|
-
method: "POST",
|
|
13852
|
-
headers: {
|
|
13853
|
-
"Content-Type": "application/x-www-form-urlencoded"
|
|
13854
|
-
},
|
|
13855
|
-
body: new URLSearchParams({
|
|
13856
|
-
grant_type: "authorization_code",
|
|
13857
|
-
client_id: CLIENT_ID$2,
|
|
13858
|
-
code,
|
|
13859
|
-
code_verifier: verifier,
|
|
13860
|
-
redirect_uri: `http://localhost:${port}/auth/callback`
|
|
13861
|
-
})
|
|
13862
|
-
});
|
|
13863
|
-
if (!response.ok) {
|
|
13864
|
-
const error = await response.text();
|
|
13865
|
-
throw new Error(`Token exchange failed: ${error}`);
|
|
13866
|
-
}
|
|
13867
|
-
const data = await response.json();
|
|
13868
|
-
const idTokenPayload = parseJWT(data.id_token);
|
|
13869
|
-
let accountId = idTokenPayload.chatgpt_account_id;
|
|
13870
|
-
if (!accountId) {
|
|
13871
|
-
const authClaim = idTokenPayload["https://api.openai.com/auth"];
|
|
13872
|
-
if (authClaim && typeof authClaim === "object") {
|
|
13873
|
-
accountId = authClaim.chatgpt_account_id || authClaim.account_id;
|
|
13874
|
-
}
|
|
13875
|
-
}
|
|
13876
|
-
return {
|
|
13877
|
-
id_token: data.id_token,
|
|
13878
|
-
access_token: data.access_token || data.id_token,
|
|
13879
|
-
refresh_token: data.refresh_token,
|
|
13880
|
-
account_id: accountId
|
|
13881
|
-
};
|
|
13882
|
-
}
|
|
13883
|
-
async function startCallbackServer$2(state, verifier, port) {
|
|
13884
|
-
return new Promise((resolve, reject) => {
|
|
13885
|
-
const server = createServer$1(async (req, res) => {
|
|
13886
|
-
const url = new URL(req.url, `http://localhost:${port}`);
|
|
13887
|
-
if (url.pathname === "/auth/callback") {
|
|
13888
|
-
const code = url.searchParams.get("code");
|
|
13889
|
-
const receivedState = url.searchParams.get("state");
|
|
13890
|
-
if (receivedState !== state) {
|
|
13891
|
-
res.writeHead(400);
|
|
13892
|
-
res.end("Invalid state parameter");
|
|
13893
|
-
server.close();
|
|
13894
|
-
reject(new Error("Invalid state parameter"));
|
|
13895
|
-
return;
|
|
13896
|
-
}
|
|
13897
|
-
if (!code) {
|
|
13898
|
-
res.writeHead(400);
|
|
13899
|
-
res.end("No authorization code received");
|
|
13900
|
-
server.close();
|
|
13901
|
-
reject(new Error("No authorization code received"));
|
|
13902
|
-
return;
|
|
13903
|
-
}
|
|
13904
|
-
try {
|
|
13905
|
-
const tokens = await exchangeCodeForTokens$2(code, verifier, port);
|
|
13906
|
-
res.writeHead(200, { "Content-Type": "text/html" });
|
|
13907
|
-
res.end(`
|
|
13908
|
-
<html>
|
|
13909
|
-
<body style="font-family: sans-serif; padding: 20px;">
|
|
13910
|
-
<h2>\u2705 Authentication Successful!</h2>
|
|
13911
|
-
<p>You can close this window and return to your terminal.</p>
|
|
13912
|
-
<script>setTimeout(() => window.close(), 3000);<\/script>
|
|
13913
|
-
</body>
|
|
13914
|
-
</html>
|
|
13915
|
-
`);
|
|
13916
|
-
server.close();
|
|
13917
|
-
resolve(tokens);
|
|
13918
|
-
} catch (error) {
|
|
13919
|
-
res.writeHead(500);
|
|
13920
|
-
res.end("Token exchange failed");
|
|
13921
|
-
server.close();
|
|
13922
|
-
reject(error);
|
|
13923
|
-
}
|
|
13924
|
-
}
|
|
13925
|
-
});
|
|
13926
|
-
server.listen(port, "127.0.0.1", () => {
|
|
13927
|
-
});
|
|
13928
|
-
setTimeout(() => {
|
|
13929
|
-
server.close();
|
|
13930
|
-
reject(new Error("Authentication timeout"));
|
|
13931
|
-
}, 5 * 60 * 1e3);
|
|
13932
|
-
});
|
|
13933
|
-
}
|
|
13934
|
-
async function authenticateCodex() {
|
|
13935
|
-
const { verifier, challenge } = generatePKCE$2();
|
|
13936
|
-
const state = generateState$2();
|
|
13937
|
-
let port = DEFAULT_PORT$2;
|
|
13938
|
-
const portAvailable = await isPortAvailable$2(port);
|
|
13939
|
-
if (!portAvailable) {
|
|
13940
|
-
port = await findAvailablePort$2();
|
|
13941
|
-
}
|
|
13942
|
-
const serverPromise = startCallbackServer$2(state, verifier, port);
|
|
13943
|
-
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
13944
|
-
const redirect_uri = `http://localhost:${port}/auth/callback`;
|
|
13945
|
-
const params = [
|
|
13946
|
-
["response_type", "code"],
|
|
13947
|
-
["client_id", CLIENT_ID$2],
|
|
13948
|
-
["redirect_uri", redirect_uri],
|
|
13949
|
-
["scope", "openid profile email offline_access"],
|
|
13950
|
-
["code_challenge", challenge],
|
|
13951
|
-
["code_challenge_method", "S256"],
|
|
13952
|
-
["id_token_add_organizations", "true"],
|
|
13953
|
-
["codex_cli_simplified_flow", "true"],
|
|
13954
|
-
["state", state]
|
|
13955
|
-
];
|
|
13956
|
-
const queryString = params.map(([key, value]) => `${key}=${encodeURIComponent(value)}`).join("&");
|
|
13957
|
-
const authUrl = `${AUTH_BASE_URL}/oauth/authorize?${queryString}`;
|
|
13958
|
-
console.log("\u{1F4CB} Opening browser for authentication...");
|
|
13959
|
-
console.log(`If browser doesn't open, visit:
|
|
13960
|
-
${authUrl}
|
|
13961
|
-
`);
|
|
13962
|
-
await openBrowser(authUrl);
|
|
13963
|
-
const tokens = await serverPromise;
|
|
13964
|
-
console.log("\u{1F389} Authentication successful!");
|
|
13965
|
-
return tokens;
|
|
13966
|
-
}
|
|
13967
|
-
|
|
13968
|
-
const CLIENT_ID$1 = "9d1c250a-e61b-44d9-88ed-5944d1962f5e";
|
|
13969
|
-
const CLAUDE_AI_AUTHORIZE_URL = "https://claude.ai/oauth/authorize";
|
|
13970
|
-
const TOKEN_URL$1 = "https://console.anthropic.com/v1/oauth/token";
|
|
13971
|
-
const DEFAULT_PORT$1 = 54545;
|
|
13972
|
-
const SCOPE = "user:inference";
|
|
13973
|
-
function generatePKCE$1() {
|
|
13974
|
-
const verifier = randomBytes$1(32).toString("base64url").replace(/[^a-zA-Z0-9\-._~]/g, "");
|
|
13975
|
-
const challenge = createHash("sha256").update(verifier).digest("base64url").replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
|
|
13976
|
-
return { verifier, challenge };
|
|
13977
|
-
}
|
|
13978
|
-
function generateState$1() {
|
|
13979
|
-
return randomBytes$1(32).toString("base64url");
|
|
13980
|
-
}
|
|
13981
|
-
async function findAvailablePort$1() {
|
|
13982
|
-
return new Promise((resolve) => {
|
|
13983
|
-
const server = createServer$1();
|
|
13984
|
-
server.listen(0, "127.0.0.1", () => {
|
|
13985
|
-
const port = server.address().port;
|
|
13986
|
-
server.close(() => resolve(port));
|
|
13987
|
-
});
|
|
13988
|
-
});
|
|
13989
|
-
}
|
|
13990
|
-
async function isPortAvailable$1(port) {
|
|
13991
|
-
return new Promise((resolve) => {
|
|
13992
|
-
const testServer = createServer$1();
|
|
13993
|
-
testServer.once("error", () => {
|
|
13994
|
-
testServer.close();
|
|
13995
|
-
resolve(false);
|
|
13996
|
-
});
|
|
13997
|
-
testServer.listen(port, "127.0.0.1", () => {
|
|
13998
|
-
testServer.close(() => resolve(true));
|
|
13999
|
-
});
|
|
14000
|
-
});
|
|
14001
|
-
}
|
|
14002
|
-
async function exchangeCodeForTokens$1(code, verifier, port, state) {
|
|
14003
|
-
const tokenResponse = await fetch(TOKEN_URL$1, {
|
|
14004
|
-
method: "POST",
|
|
14005
|
-
headers: {
|
|
14006
|
-
"Content-Type": "application/json"
|
|
14007
|
-
},
|
|
14008
|
-
body: JSON.stringify({
|
|
14009
|
-
grant_type: "authorization_code",
|
|
14010
|
-
code,
|
|
14011
|
-
redirect_uri: `http://localhost:${port}/callback`,
|
|
14012
|
-
client_id: CLIENT_ID$1,
|
|
14013
|
-
code_verifier: verifier,
|
|
14014
|
-
state
|
|
14015
|
-
})
|
|
14016
|
-
});
|
|
14017
|
-
if (!tokenResponse.ok) {
|
|
14018
|
-
throw new Error(`Token exchange failed: ${tokenResponse.statusText}`);
|
|
14019
|
-
}
|
|
14020
|
-
const tokenData = await tokenResponse.json();
|
|
14021
|
-
return {
|
|
14022
|
-
raw: tokenData,
|
|
14023
|
-
token: tokenData.access_token,
|
|
14024
|
-
expires: Date.now() + tokenData.expires_in * 1e3
|
|
14025
|
-
};
|
|
14026
|
-
}
|
|
14027
|
-
async function startCallbackServer$1(state, verifier, port) {
|
|
14028
|
-
return new Promise((resolve, reject) => {
|
|
14029
|
-
const server = createServer$1(async (req, res) => {
|
|
14030
|
-
const url = new URL(req.url, `http://localhost:${port}`);
|
|
14031
|
-
if (url.pathname === "/callback") {
|
|
14032
|
-
const code = url.searchParams.get("code");
|
|
14033
|
-
const receivedState = url.searchParams.get("state");
|
|
14034
|
-
if (receivedState !== state) {
|
|
14035
|
-
res.writeHead(400);
|
|
14036
|
-
res.end("Invalid state parameter");
|
|
14037
|
-
server.close();
|
|
14038
|
-
reject(new Error("Invalid state parameter"));
|
|
14039
|
-
return;
|
|
14040
|
-
}
|
|
14041
|
-
if (!code) {
|
|
14042
|
-
res.writeHead(400);
|
|
14043
|
-
res.end("No authorization code received");
|
|
14044
|
-
server.close();
|
|
14045
|
-
reject(new Error("No authorization code received"));
|
|
14046
|
-
return;
|
|
14047
|
-
}
|
|
14048
|
-
try {
|
|
14049
|
-
const tokens = await exchangeCodeForTokens$1(code, verifier, port, state);
|
|
14050
|
-
res.writeHead(302, {
|
|
14051
|
-
"Location": "https://console.anthropic.com/oauth/code/success?app=claude-code"
|
|
14052
|
-
});
|
|
14053
|
-
res.end();
|
|
14054
|
-
server.close();
|
|
14055
|
-
resolve(tokens);
|
|
14056
|
-
} catch (error) {
|
|
14057
|
-
res.writeHead(500);
|
|
14058
|
-
res.end("Token exchange failed");
|
|
14059
|
-
server.close();
|
|
14060
|
-
reject(error);
|
|
14061
|
-
}
|
|
14062
|
-
}
|
|
14063
|
-
});
|
|
14064
|
-
server.listen(port, "127.0.0.1", () => {
|
|
14065
|
-
});
|
|
14066
|
-
setTimeout(() => {
|
|
14067
|
-
server.close();
|
|
14068
|
-
reject(new Error("Authentication timeout"));
|
|
14069
|
-
}, 5 * 60 * 1e3);
|
|
14070
|
-
});
|
|
14071
|
-
}
|
|
14072
|
-
async function authenticateClaude() {
|
|
14073
|
-
console.log("\u{1F680} Starting Anthropic Claude authentication...");
|
|
14074
|
-
const { verifier, challenge } = generatePKCE$1();
|
|
14075
|
-
const state = generateState$1();
|
|
14076
|
-
let port = DEFAULT_PORT$1;
|
|
14077
|
-
const portAvailable = await isPortAvailable$1(port);
|
|
14078
|
-
if (!portAvailable) {
|
|
14079
|
-
console.log(`Port ${port} is in use, finding an available port...`);
|
|
14080
|
-
port = await findAvailablePort$1();
|
|
14081
|
-
}
|
|
14082
|
-
console.log(`\u{1F4E1} Using callback port: ${port}`);
|
|
14083
|
-
const serverPromise = startCallbackServer$1(state, verifier, port);
|
|
14084
|
-
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
14085
|
-
const redirect_uri = `http://localhost:${port}/callback`;
|
|
14086
|
-
const params = new URLSearchParams({
|
|
14087
|
-
code: "true",
|
|
14088
|
-
// This tells Claude.ai to show the code AND redirect
|
|
14089
|
-
client_id: CLIENT_ID$1,
|
|
14090
|
-
response_type: "code",
|
|
14091
|
-
redirect_uri,
|
|
14092
|
-
scope: SCOPE,
|
|
14093
|
-
code_challenge: challenge,
|
|
14094
|
-
code_challenge_method: "S256",
|
|
14095
|
-
state
|
|
14096
|
-
});
|
|
14097
|
-
const authUrl = `${CLAUDE_AI_AUTHORIZE_URL}?${params}`;
|
|
14098
|
-
console.log("\u{1F4CB} Opening browser for authentication...");
|
|
14099
|
-
console.log("If browser doesn't open, visit this URL:");
|
|
14100
|
-
console.log();
|
|
14101
|
-
console.log(`${authUrl}`);
|
|
14102
|
-
console.log();
|
|
14103
|
-
await openBrowser(authUrl);
|
|
14104
|
-
try {
|
|
14105
|
-
const tokens = await serverPromise;
|
|
14106
|
-
console.log("\u{1F389} Authentication successful!");
|
|
14107
|
-
console.log("\u2705 OAuth tokens received");
|
|
14108
|
-
return tokens;
|
|
14109
|
-
} catch (error) {
|
|
14110
|
-
console.error("\n\u274C Failed to authenticate with Anthropic");
|
|
14111
|
-
throw error;
|
|
14112
|
-
}
|
|
14113
|
-
}
|
|
14114
|
-
|
|
14115
|
-
const execAsync = promisify(exec);
|
|
14116
|
-
const CLIENT_ID = "681255809395-oo8ft2oprdrnp9e3aqf6av3hmdib135j.apps.googleusercontent.com";
|
|
14117
|
-
const CLIENT_SECRET = "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";
|
|
14118
|
-
const AUTHORIZE_URL = "https://accounts.google.com/o/oauth2/v2/auth";
|
|
14119
|
-
const TOKEN_URL = "https://oauth2.googleapis.com/token";
|
|
14120
|
-
const DEFAULT_PORT = 54545;
|
|
14121
|
-
const SCOPES = [
|
|
14122
|
-
"https://www.googleapis.com/auth/cloud-platform",
|
|
14123
|
-
"https://www.googleapis.com/auth/userinfo.email",
|
|
14124
|
-
"https://www.googleapis.com/auth/userinfo.profile"
|
|
14125
|
-
].join(" ");
|
|
14126
|
-
function generatePKCE() {
|
|
14127
|
-
const verifier = randomBytes$1(32).toString("base64url").replace(/[^a-zA-Z0-9\-._~]/g, "");
|
|
14128
|
-
const challenge = createHash("sha256").update(verifier).digest("base64url").replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
|
|
14129
|
-
return { verifier, challenge };
|
|
14130
|
-
}
|
|
14131
|
-
function generateState() {
|
|
14132
|
-
return randomBytes$1(32).toString("hex");
|
|
14133
|
-
}
|
|
14134
|
-
async function findAvailablePort() {
|
|
14135
|
-
return new Promise((resolve) => {
|
|
14136
|
-
const server = createServer$1();
|
|
14137
|
-
server.listen(0, "127.0.0.1", () => {
|
|
14138
|
-
const port = server.address().port;
|
|
14139
|
-
server.close(() => resolve(port));
|
|
14140
|
-
});
|
|
14141
|
-
});
|
|
14142
|
-
}
|
|
14143
|
-
async function isPortAvailable(port) {
|
|
14144
|
-
return new Promise((resolve) => {
|
|
14145
|
-
const testServer = createServer$1();
|
|
14146
|
-
testServer.once("error", () => {
|
|
14147
|
-
testServer.close();
|
|
14148
|
-
resolve(false);
|
|
14149
|
-
});
|
|
14150
|
-
testServer.listen(port, "127.0.0.1", () => {
|
|
14151
|
-
testServer.close(() => resolve(true));
|
|
14152
|
-
});
|
|
14153
|
-
});
|
|
14154
|
-
}
|
|
14155
|
-
async function exchangeCodeForTokens(code, verifier, port) {
|
|
14156
|
-
const response = await fetch(TOKEN_URL, {
|
|
14157
|
-
method: "POST",
|
|
14158
|
-
headers: {
|
|
14159
|
-
"Content-Type": "application/x-www-form-urlencoded"
|
|
14160
|
-
},
|
|
14161
|
-
body: new URLSearchParams({
|
|
14162
|
-
grant_type: "authorization_code",
|
|
14163
|
-
client_id: CLIENT_ID,
|
|
14164
|
-
client_secret: CLIENT_SECRET,
|
|
14165
|
-
code,
|
|
14166
|
-
code_verifier: verifier,
|
|
14167
|
-
redirect_uri: `http://localhost:${port}/oauth2callback`
|
|
14168
|
-
})
|
|
14169
|
-
});
|
|
14170
|
-
if (!response.ok) {
|
|
14171
|
-
const error = await response.text();
|
|
14172
|
-
throw new Error(`Token exchange failed: ${error}`);
|
|
14173
|
-
}
|
|
14174
|
-
const data = await response.json();
|
|
14175
|
-
return data;
|
|
14176
|
-
}
|
|
14177
|
-
async function startCallbackServer(state, verifier, port) {
|
|
14178
|
-
return new Promise((resolve, reject) => {
|
|
14179
|
-
const server = createServer$1(async (req, res) => {
|
|
14180
|
-
const url = new URL(req.url, `http://localhost:${port}`);
|
|
14181
|
-
if (url.pathname === "/oauth2callback") {
|
|
14182
|
-
const code = url.searchParams.get("code");
|
|
14183
|
-
const receivedState = url.searchParams.get("state");
|
|
14184
|
-
const error = url.searchParams.get("error");
|
|
14185
|
-
if (error) {
|
|
14186
|
-
res.writeHead(302, {
|
|
14187
|
-
"Location": "https://developers.google.com/gemini-code-assist/auth_failure_gemini"
|
|
14188
|
-
});
|
|
14189
|
-
res.end();
|
|
14190
|
-
server.close();
|
|
14191
|
-
reject(new Error(`Authentication error: ${error}`));
|
|
14192
|
-
return;
|
|
14193
|
-
}
|
|
14194
|
-
if (receivedState !== state) {
|
|
14195
|
-
res.writeHead(400);
|
|
14196
|
-
res.end("State mismatch. Possible CSRF attack");
|
|
14197
|
-
server.close();
|
|
14198
|
-
reject(new Error("Invalid state parameter"));
|
|
14199
|
-
return;
|
|
14200
|
-
}
|
|
14201
|
-
if (!code) {
|
|
14202
|
-
res.writeHead(400);
|
|
14203
|
-
res.end("No authorization code received");
|
|
14204
|
-
server.close();
|
|
14205
|
-
reject(new Error("No authorization code received"));
|
|
14206
|
-
return;
|
|
14207
|
-
}
|
|
14208
|
-
try {
|
|
14209
|
-
const tokens = await exchangeCodeForTokens(code, verifier, port);
|
|
14210
|
-
res.writeHead(302, {
|
|
14211
|
-
"Location": "https://developers.google.com/gemini-code-assist/auth_success_gemini"
|
|
14212
|
-
});
|
|
14213
|
-
res.end();
|
|
14214
|
-
server.close();
|
|
14215
|
-
resolve(tokens);
|
|
14216
|
-
} catch (error2) {
|
|
14217
|
-
res.writeHead(500);
|
|
14218
|
-
res.end("Token exchange failed");
|
|
14219
|
-
server.close();
|
|
14220
|
-
reject(error2);
|
|
14221
|
-
}
|
|
14222
|
-
}
|
|
14223
|
-
});
|
|
14224
|
-
server.listen(port, "127.0.0.1", () => {
|
|
14225
|
-
});
|
|
14226
|
-
setTimeout(() => {
|
|
14227
|
-
server.close();
|
|
14228
|
-
reject(new Error("Authentication timeout"));
|
|
14229
|
-
}, 5 * 60 * 1e3);
|
|
14230
|
-
});
|
|
14231
|
-
}
|
|
14232
|
-
async function authenticateGemini() {
|
|
14233
|
-
console.log("\u{1F680} Starting Google Gemini authentication...");
|
|
14234
|
-
const { verifier, challenge } = generatePKCE();
|
|
14235
|
-
const state = generateState();
|
|
14236
|
-
let port = DEFAULT_PORT;
|
|
14237
|
-
const portAvailable = await isPortAvailable(port);
|
|
14238
|
-
if (!portAvailable) {
|
|
14239
|
-
console.log(`Port ${port} is in use, finding an available port...`);
|
|
14240
|
-
port = await findAvailablePort();
|
|
14241
|
-
}
|
|
14242
|
-
console.log(`\u{1F4E1} Using callback port: ${port}`);
|
|
14243
|
-
const serverPromise = startCallbackServer(state, verifier, port);
|
|
14244
|
-
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
14245
|
-
const redirect_uri = `http://localhost:${port}/oauth2callback`;
|
|
14246
|
-
const params = new URLSearchParams({
|
|
14247
|
-
client_id: CLIENT_ID,
|
|
14248
|
-
response_type: "code",
|
|
14249
|
-
redirect_uri,
|
|
14250
|
-
scope: SCOPES,
|
|
14251
|
-
access_type: "offline",
|
|
14252
|
-
// To get refresh token
|
|
14253
|
-
code_challenge: challenge,
|
|
14254
|
-
code_challenge_method: "S256",
|
|
14255
|
-
state,
|
|
14256
|
-
prompt: "consent"
|
|
14257
|
-
// Force consent to get refresh token
|
|
14258
|
-
});
|
|
14259
|
-
const authUrl = `${AUTHORIZE_URL}?${params}`;
|
|
14260
|
-
console.log("\n\u{1F4CB} Opening browser for authentication...");
|
|
14261
|
-
console.log("If browser doesn't open, visit this URL:");
|
|
14262
|
-
console.log(`
|
|
14263
|
-
${authUrl}
|
|
14264
|
-
`);
|
|
14265
|
-
const platform = process.platform;
|
|
14266
|
-
const openCommand = platform === "darwin" ? "open" : platform === "win32" ? "start" : "xdg-open";
|
|
14267
|
-
try {
|
|
14268
|
-
await execAsync(`${openCommand} "${authUrl}"`);
|
|
14269
|
-
} catch {
|
|
14270
|
-
console.log("\u26A0\uFE0F Could not open browser automatically");
|
|
14271
|
-
}
|
|
14272
|
-
try {
|
|
14273
|
-
const tokens = await serverPromise;
|
|
14274
|
-
console.log("\n\u{1F389} Authentication successful!");
|
|
14275
|
-
console.log("\u2705 OAuth tokens received");
|
|
14276
|
-
return tokens;
|
|
14277
|
-
} catch (error) {
|
|
14278
|
-
console.error("\n\u274C Failed to authenticate with Google");
|
|
14279
|
-
throw error;
|
|
14280
|
-
}
|
|
14281
|
-
}
|
|
14282
|
-
|
|
14283
|
-
async function syncCodexCliAuth(tokens) {
|
|
14284
|
-
const authFilePath = path__default.join(os__default.homedir(), ".codex", "auth.json");
|
|
14285
|
-
const authDir = path__default.dirname(authFilePath);
|
|
14286
|
-
let previousAccountId;
|
|
14287
|
-
let previousApiKey = null;
|
|
14288
|
-
try {
|
|
14289
|
-
const existingRaw = await fs$1.readFile(authFilePath, "utf8");
|
|
14290
|
-
const existing = JSON.parse(existingRaw);
|
|
14291
|
-
previousAccountId = existing?.tokens?.account_id;
|
|
14292
|
-
previousApiKey = typeof existing?.OPENAI_API_KEY === "string" ? existing.OPENAI_API_KEY : null;
|
|
14293
|
-
} catch {
|
|
14294
|
-
}
|
|
14295
|
-
await fs$1.mkdir(authDir, { recursive: true });
|
|
14296
|
-
const next = {
|
|
14297
|
-
OPENAI_API_KEY: previousApiKey,
|
|
14298
|
-
tokens: {
|
|
14299
|
-
id_token: tokens.id_token,
|
|
14300
|
-
access_token: tokens.access_token,
|
|
14301
|
-
refresh_token: tokens.refresh_token,
|
|
14302
|
-
account_id: tokens.account_id
|
|
14303
|
-
},
|
|
14304
|
-
last_refresh: (/* @__PURE__ */ new Date()).toISOString()
|
|
14305
|
-
};
|
|
14306
|
-
await fs$1.writeFile(authFilePath, JSON.stringify(next, null, 2) + "\n", "utf8");
|
|
14307
|
-
return {
|
|
14308
|
-
authFilePath,
|
|
14309
|
-
previousAccountId,
|
|
14310
|
-
newAccountId: tokens.account_id
|
|
14311
|
-
};
|
|
14312
|
-
}
|
|
14313
|
-
|
|
14314
13791
|
async function handleConnectCommand(args) {
|
|
14315
13792
|
const subcommand = args[0];
|
|
14316
13793
|
const flags = args.slice(1);
|
|
@@ -15540,7 +15017,7 @@ async function authAndSetupMachineIfNeeded() {
|
|
|
15540
15017
|
process.exit(1);
|
|
15541
15018
|
}
|
|
15542
15019
|
try {
|
|
15543
|
-
const { migrateUnrealMcpToFlockbayMcp } = await import('./migratePlugin-
|
|
15020
|
+
const { migrateUnrealMcpToFlockbayMcp } = await import('./migratePlugin-D-oSS5d1.mjs');
|
|
15544
15021
|
const result = migrateUnrealMcpToFlockbayMcp({
|
|
15545
15022
|
engineRoot,
|
|
15546
15023
|
projectUprojectPath: project || void 0,
|
|
@@ -15679,7 +15156,7 @@ ${engineRoot}`, {
|
|
|
15679
15156
|
} else if (subcommand === "codex") {
|
|
15680
15157
|
try {
|
|
15681
15158
|
await chdirToNearestUprojectRootIfPresent();
|
|
15682
|
-
const { runCodex } = await import('./runCodex-
|
|
15159
|
+
const { runCodex } = await import('./runCodex-B10NJHEL.mjs');
|
|
15683
15160
|
let startedBy = void 0;
|
|
15684
15161
|
let sessionId = void 0;
|
|
15685
15162
|
for (let i = 1; i < args.length; i++) {
|
|
@@ -15781,7 +15258,7 @@ ${engineRoot}`, {
|
|
|
15781
15258
|
}
|
|
15782
15259
|
try {
|
|
15783
15260
|
await chdirToNearestUprojectRootIfPresent();
|
|
15784
|
-
const { runGemini } = await import('./runGemini-
|
|
15261
|
+
const { runGemini } = await import('./runGemini-B4kutwSV.mjs');
|
|
15785
15262
|
let startedBy = void 0;
|
|
15786
15263
|
let sessionId = void 0;
|
|
15787
15264
|
for (let i = 1; i < args.length; i++) {
|