gemini-proxy-client 1.0.16 → 1.0.18

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.
@@ -37,6 +37,8 @@ export class BrowserManager {
37
37
  disable_coop: true,
38
38
  // 允许在主世界执行脚本,用于 iframe 内的 evaluate
39
39
  main_world_eval: true,
40
+ // 忽略 disable_coop 警告
41
+ i_know_what_im_doing: true,
40
42
  });
41
43
  this.context = await this.browser.newContext({
42
44
  viewport: fingerprint.viewport,
package/dist/cli.js CHANGED
@@ -7,19 +7,26 @@ import fs from 'fs';
7
7
  import { startClient } from './commands/start.js';
8
8
  import { loginCommand } from './commands/login.js';
9
9
  import { statusCommand } from './commands/status.js';
10
+ import { fileURLToPath } from 'url';
11
+ const __filename = fileURLToPath(import.meta.url);
12
+ const __dirname = path.dirname(__filename);
13
+ // 从 package.json 读取版本号
14
+ const packageJsonPath = path.join(__dirname, '..', 'package.json');
15
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
10
16
  const DEFAULT_DATA_DIR = path.join(os.homedir(), '.gemini-client');
11
17
  const program = new Command();
12
18
  program
13
19
  .name('gemini-client')
14
20
  .description('Gemini Proxy Build App 客户端 - 使用 Camoufox 自动保持连接')
15
- .version('1.0.15');
21
+ .version(packageJson.version);
16
22
  program
17
23
  .command('start')
18
24
  .description('启动客户端,连接到代理服务器')
19
25
  .option('-s, --server <url>', '代理服务器 WebSocket 地址', 'ws://localhost:5345/v1/ws')
20
26
  .option('-t, --token <token>', '客户端认证令牌 (不指定则自动生成)')
21
27
  .option('-d, --daemon', '后台运行模式')
22
- .option('--headless', '强制无头模式 (需要已有登录状态)')
28
+ .option('--headless', '强制无头模式 (可能有兼容性问题)')
29
+ .option('--virtual', '虚拟显示模式 (需要安装 xvfb,推荐)')
23
30
  .option('--data-dir <path>', '数据目录路径', DEFAULT_DATA_DIR)
24
31
  .action(async (options) => {
25
32
  try {
@@ -65,17 +65,22 @@ export async function startClient(options) {
65
65
  console.log(chalk.gray('─'.repeat(50)));
66
66
  const cookiesPath = path.join(dataDir, 'cookies.json');
67
67
  const hasCookies = fs.existsSync(cookiesPath);
68
- // 决定是否使用无头模式
68
+ // 决定使用哪种模式: false (有界面) / true (无头) / 'virtual' (虚拟显示)
69
69
  let headless = options.headless ?? false;
70
+ // 如果指定了 --virtual,使用虚拟显示模式
71
+ if (options.virtual) {
72
+ headless = 'virtual';
73
+ }
70
74
  if (!hasCookies) {
71
75
  console.log(chalk.yellow('⚠️ 未检测到 Google 登录状态'));
72
76
  console.log(chalk.white(' 将打开浏览器,请登录您的 Google 账号...'));
73
77
  headless = false;
74
78
  }
75
- else if (!options.headless) {
76
- // 有 cookies,默认使用无头模式
77
- headless = true;
79
+ else if (!options.headless && !options.virtual) {
80
+ // 有 cookies,默认使用虚拟显示模式(如果可用)或无头模式
81
+ headless = 'virtual';
78
82
  console.log(chalk.green('📂 检测到已保存的登录状态'));
83
+ console.log(chalk.gray(' 尝试使用虚拟显示模式 (需要 xvfb)'));
79
84
  }
80
85
  const spinner = ora('启动 Camoufox 浏览器...').start();
81
86
  try {
@@ -103,19 +108,19 @@ export async function startClient(options) {
103
108
  // 保存 cookies
104
109
  await browserManager.saveCookies();
105
110
  console.log(chalk.green('✅ Google 登录成功!已保存登录状态'));
106
- // 关闭有界面的浏览器,以无头模式重新启动
107
- console.log(chalk.gray('🔄 切换到无头模式...'));
111
+ // 关闭有界面的浏览器,以虚拟显示模式重新启动
112
+ console.log(chalk.gray('🔄 切换到虚拟显示模式...'));
108
113
  await browserManager.close();
109
- // 创建新的无头浏览器实例
114
+ // 创建新的虚拟显示模式浏览器实例
110
115
  browserManager = new BrowserManager({
111
- headless: true,
116
+ headless: 'virtual',
112
117
  dataDir,
113
118
  serverUrl: server,
114
119
  token,
115
120
  });
116
121
  // 重新设置信号处理
117
122
  setupSignalHandlers(browserManager);
118
- spinner.start('以无头模式重新启动...');
123
+ spinner.start('以虚拟显示模式重新启动...');
119
124
  await browserManager.launch();
120
125
  spinner.text = '打开 Build App 页面...';
121
126
  await browserManager.openBuildApp();
@@ -124,8 +129,9 @@ export async function startClient(options) {
124
129
  spinner.text = '点击 ws connect 按钮...';
125
130
  await browserManager.clickConnectButton();
126
131
  spinner.succeed(chalk.green('已连接到代理服务器!'));
132
+ const modeText = headless === 'virtual' ? '虚拟显示模式' : (headless ? '无头模式' : '有界面模式');
127
133
  console.log(chalk.gray('─'.repeat(50)));
128
- console.log(chalk.green(`✅ 客户端已启动 (无头模式)`));
134
+ console.log(chalk.green(`✅ 客户端已启动 (${modeText})`));
129
135
  console.log(chalk.white(` Token: ${token}`));
130
136
  console.log(chalk.gray(' 按 Ctrl+C 退出'));
131
137
  console.log(chalk.gray('─'.repeat(50)));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gemini-proxy-client",
3
- "version": "1.0.16",
3
+ "version": "1.0.18",
4
4
  "description": "Gemini Proxy Build App 客户端 - 使用 Camoufox 自动保持连接",
5
5
  "main": "dist/index.js",
6
6
  "bin": {