claude-opencode-viewer 2.6.27 → 2.6.29

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/package.json +1 -1
  2. package/server.js +16 -8
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-opencode-viewer",
3
- "version": "2.6.27",
3
+ "version": "2.6.29",
4
4
  "description": "A unified terminal viewer for Claude Code and OpenCode with seamless switching",
5
5
  "type": "module",
6
6
  "main": "server.js",
package/server.js CHANGED
@@ -53,9 +53,9 @@ async function getOrCreateCert() {
53
53
  return { key: pems.private, cert: pems.cert };
54
54
  }
55
55
 
56
- // OpenCode 数据库路径(支持环境变量覆盖,自动检测 /halo 环境)
57
- const OPENCODE_DB_PATH = process.env.OPENCODE_DB_PATH || join(
58
- existsSync('/halo') ? '/halo/.local/share' : (process.env.XDG_DATA_HOME || join(homedir(), '.local/share')),
56
+ // OpenCode 数据库路径(优先读 OPENCODE_DB 环境变量,兼容本地盘 DB 方案)
57
+ const OPENCODE_DB_PATH = process.env.OPENCODE_DB || process.env.OPENCODE_DB_PATH || join(
58
+ process.env.XDG_DATA_HOME || join(homedir(), '.local/share'),
59
59
  'opencode/opencode.db'
60
60
  );
61
61
 
@@ -222,10 +222,6 @@ async function spawnProcess(mode, sessionId = null) {
222
222
  }
223
223
 
224
224
  const spawnEnv = { ...process.env };
225
- // 如果 /halo 存在,将 opencode 数据持久化到 NAS
226
- if (mode === 'opencode' && existsSync('/halo')) {
227
- spawnEnv.XDG_DATA_HOME = '/halo/.local/share';
228
- }
229
225
 
230
226
  // 恢复会话时,使用会话记录的工作目录
231
227
  let spawnCwd = process.cwd();
@@ -774,7 +770,7 @@ let hasEverConnected = false;
774
770
  function startNoClientTimer() {
775
771
  if (noClientTimer) return;
776
772
  if (wss && wss.clients.size > 0) return;
777
- const timeout = hasEverConnected ? 30000 : 180000;
773
+ const timeout = hasEverConnected ? 10000 : 180000;
778
774
  noClientTimer = setTimeout(() => {
779
775
  if (!wss || wss.clients.size === 0) {
780
776
  LOG(`[auto-exit] ${timeout / 1000}秒无客户端连接,自动退出`);
@@ -1093,6 +1089,18 @@ function startServer() {
1093
1089
  LOG('\n按 Ctrl+C 停止服务\n');
1094
1090
  }
1095
1091
 
1092
+ // 清理上次 cov 崩溃残留的孤儿进程(PPID=1 的 opencode/claude)
1093
+ try {
1094
+ const orphans = execSync(
1095
+ "ps -eo pid,ppid,comm 2>/dev/null | awk '$2==1 && (/opencode/||/claude/) {print $1}'",
1096
+ { encoding: 'utf-8', timeout: 5000 }
1097
+ ).trim().split(/\s+/).filter(Boolean).map(Number);
1098
+ for (const pid of orphans) {
1099
+ try { process.kill(pid, 'SIGTERM'); } catch {}
1100
+ }
1101
+ if (orphans.length > 0) LOG(`[startup] 清理孤儿进程: ${orphans.join(', ')}`);
1102
+ } catch {}
1103
+
1096
1104
  // 尝试恢复最近的会话,如果没有则新建
1097
1105
  let lastSessionId = null;
1098
1106
  try {