panrouter 4.2.0 → 4.3.0

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 (2) hide show
  1. package/cli.mjs +42 -3
  2. package/package.json +1 -1
package/cli.mjs CHANGED
@@ -10,7 +10,7 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url));
10
10
  const HOME = process.env.USERPROFILE || process.env.HOME;
11
11
  const CLAUDE_DIR = path.join(HOME, ".claude");
12
12
  const SETTINGS_PATH = path.join(CLAUDE_DIR, "settings.json");
13
- const VERSION = "4.2.0";
13
+ const VERSION = "4.3.0";
14
14
  const RELAY_PATH = path.join(__dirname, "relay_client.cjs");
15
15
 
16
16
  function log(label, msg, color = "") {
@@ -113,16 +113,51 @@ function openLogs() {
113
113
  }
114
114
  }
115
115
 
116
+ async function checkUpdate() {
117
+ log("..", "正在检查更新...", "cyan");
118
+ try {
119
+ const raw = execSync("npm view panrouter version", { encoding: "utf8", timeout: 10000 }).toString().trim();
120
+ const latest = raw.replace(/\n.*/s, "").trim();
121
+ if (!latest) { log("!!", "无法获取最新版本", "red"); return; }
122
+ if (latest === VERSION) {
123
+ log("OK", `已是最新版本 v${VERSION}`, "green");
124
+ return;
125
+ }
126
+ log("..", `发现新版本 v${latest} (当前 v${VERSION})`, "yellow");
127
+ return latest;
128
+ } catch (e) {
129
+ log("!!", "检查更新失败,请检查网络连接", "red");
130
+ return null;
131
+ }
132
+ }
133
+
134
+ async function updatePackage() {
135
+ console.log(`\n\x1b[36m=== Pan Router 更新 ===\x1b[0m\n`);
136
+ const latest = await checkUpdate();
137
+ if (!latest) return;
138
+ if (latest === VERSION) return;
139
+
140
+ stopAll();
141
+ log("..", "正在更新...", "yellow");
142
+ try {
143
+ execSync("npm install -g panrouter@latest", { stdio: "inherit", timeout: 60000 });
144
+ log("OK", `更新完成!v${VERSION} → v${latest}`, "green");
145
+ log("..", "请重新运行 panrouter 启动服务", "cyan");
146
+ } catch (e) {
147
+ log("!!", "更新失败,请手动运行: npm install -g panrouter@latest", "red");
148
+ }
149
+ }
150
+
116
151
  function startRelay() {
117
152
  if (!fs.existsSync(RELAY_PATH)) {
118
153
  log("!!", "中继客户端文件不存在: relay_client.cjs", "red");
119
154
  return false;
120
155
  }
121
156
  const relayLog = path.join(process.env.TEMP, "panrouter_relay.log");
122
- const logStream = fs.createWriteStream(relayLog, { flags: "a" });
157
+ const fd = fs.openSync(relayLog, "a");
123
158
  const relay = spawn(process.execPath, [RELAY_PATH], {
124
159
  cwd: __dirname,
125
- stdio: ["ignore", logStream, logStream],
160
+ stdio: ["ignore", fd, fd],
126
161
  windowsHide: true,
127
162
  detached: true
128
163
  });
@@ -231,6 +266,7 @@ function printHelp() {
231
266
  | \x1b[33mpanrouter --server\x1b[0m | 前台窗口模式 |
232
267
  | \x1b[33mpanrouter --relay\x1b[0m | 单独启动中继客户端 |
233
268
  | \x1b[33mpanrouter --relay-stop\x1b[0m | 单独停止中继客户端 |
269
+ | \x1b[33mpanrouter --update\x1b[0m | 检查并更新到最新版 |
234
270
  | \x1b[33mpanrouter --logs\x1b[0m | 打开日志 |
235
271
  | \x1b[33mpanrouter --version\x1b[0m | 版本号 |
236
272
  | \x1b[33mpanrouter --help\x1b[0m | 帮助 |
@@ -259,6 +295,9 @@ async function main() {
259
295
  case "--stop":
260
296
  stopAll();
261
297
  break;
298
+ case "--update":
299
+ await updatePackage();
300
+ break;
262
301
  case "--logs":
263
302
  openLogs();
264
303
  break;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "panrouter",
3
- "version": "4.2.0",
3
+ "version": "4.3.0",
4
4
  "description": "Pan Router 客户端 — 让 Claude Code 免费使用 DeepSeek 等模型,无需 API Key。集成代理服务与 OpenCode AI 中继客户端",
5
5
  "type": "module",
6
6
  "bin": {