From bd044a2de7252913a515cf817e019f6ec9165bf8 Mon Sep 17 00:00:00 2001 From: bfly Date: Fri, 19 Dec 2025 15:58:58 +0800 Subject: [PATCH 001/153] Revert "fix: resolve bridge process crash and message forwarding issues" This reverts commit fd6b6f2dcaa17ea508aa5331a6ed80f793ad0595. --- ccb | 12 ++---------- lib/codex_comm.py | 22 +++++++++++----------- lib/codex_dual_bridge.py | 11 ----------- lib/terminal.py | 2 +- 4 files changed, 14 insertions(+), 33 deletions(-) diff --git a/ccb b/ccb index 26b8d67..a62e8c4 100755 --- a/ccb +++ b/ccb @@ -435,19 +435,11 @@ if ! tmux has-session -t "$TMUX_SESSION" 2>/dev/null; then fi tmux pipe-pane -o -t "$TMUX_SESSION" "cat >> '$TMUX_LOG_FILE'" -echo "=== Wrapper Start ===" > "$RUNTIME_DIR/debug.log" -date >> "$RUNTIME_DIR/debug.log" -pwd >> "$RUNTIME_DIR/debug.log" -env >> "$RUNTIME_DIR/debug.log" -echo "Python: $PYTHON_BIN" >> "$RUNTIME_DIR/debug.log" -echo "Script: $BRIDGE_SCRIPT" >> "$RUNTIME_DIR/debug.log" - -nohup "$PYTHON_BIN" "$BRIDGE_SCRIPT" --runtime-dir "$RUNTIME_DIR" --session-id "$SESSION_ID" >>"$RUNTIME_DIR/bridge.log" 2>&1 & +"$PYTHON_BIN" "$BRIDGE_SCRIPT" --runtime-dir "$RUNTIME_DIR" --session-id "$SESSION_ID" >>"$RUNTIME_DIR/bridge.log" 2>&1 & BRIDGE_PID=$! -echo "Bridge PID: $BRIDGE_PID" >> "$RUNTIME_DIR/debug.log" echo $BRIDGE_PID > "$RUNTIME_DIR/bridge.pid" -disown $BRIDGE_PID +trap 'kill -TERM "$BRIDGE_PID" 2>/dev/null' EXIT exec tmux attach -t "$TMUX_SESSION" ''' script_file = runtime / "wrapper.sh" diff --git a/lib/codex_comm.py b/lib/codex_comm.py index f3f9b51..89237d9 100644 --- a/lib/codex_comm.py +++ b/lib/codex_comm.py @@ -327,17 +327,17 @@ def _check_session_health_impl(self, probe_terminal: bool): return False, f"{self.terminal} pane 不存在: {self.pane_id}" return True, "会话正常" - # tmux 模式:检查 tmux 会话是否存活 - # 注意:不再检查 codex.pid,因为 wrapper.sh 使用 exec tmux attach 后 PID 会失效 - tmux_session = self.session_info.get("tmux_session") - if tmux_session and probe_terminal: - import subprocess - result = subprocess.run( - ["tmux", "has-session", "-t", tmux_session], - capture_output=True - ) - if result.returncode != 0: - return False, f"Tmux会话不存在: {tmux_session}" + # tmux 模式:依赖 wrapper 写入 codex.pid 与 FIFO + codex_pid_file = self.runtime_dir / "codex.pid" + if not codex_pid_file.exists(): + return False, "Codex进程PID文件不存在" + + with open(codex_pid_file, "r", encoding="utf-8") as f: + codex_pid = int(f.read().strip()) + try: + os.kill(codex_pid, 0) + except OSError: + return False, f"Codex进程(PID:{codex_pid})已退出" if not self.input_fifo.exists(): return False, "通信管道不存在" diff --git a/lib/codex_dual_bridge.py b/lib/codex_dual_bridge.py index 6dcc559..563ff8a 100644 --- a/lib/codex_dual_bridge.py +++ b/lib/codex_dual_bridge.py @@ -46,17 +46,6 @@ def __init__(self, runtime_dir: Path, session_id: str): terminal_type = os.environ.get("CODEX_TERMINAL", "tmux") pane_id = os.environ.get("CODEX_WEZTERM_PANE") if terminal_type == "wezterm" else os.environ.get("CODEX_TMUX_SESSION") - - # If pane_id not in env, try to read from .codex-session file - if not pane_id and terminal_type == "tmux": - session_file = Path.cwd() / ".codex-session" - if session_file.exists(): - try: - data = json.loads(session_file.read_text()) - pane_id = data.get("tmux_session") - except Exception: - pass - if not pane_id: raise RuntimeError(f"缺少 {'CODEX_WEZTERM_PANE' if terminal_type == 'wezterm' else 'CODEX_TMUX_SESSION'} 环境变量") diff --git a/lib/terminal.py b/lib/terminal.py index 52262d0..5068d6d 100644 --- a/lib/terminal.py +++ b/lib/terminal.py @@ -133,7 +133,7 @@ def send_text(self, session: str, text: str) -> None: encoded = (sanitized + "\n").encode("utf-8") subprocess.run(["tmux", "load-buffer", "-b", buffer_name, "-"], input=encoded, check=True) subprocess.run(["tmux", "paste-buffer", "-t", session, "-b", buffer_name, "-p"], check=True) - time.sleep(0.5) + time.sleep(0.02) subprocess.run(["tmux", "send-keys", "-t", session, "Enter"], check=True) subprocess.run(["tmux", "delete-buffer", "-b", buffer_name], stderr=subprocess.DEVNULL) From d300c8b026d7d9d9d6ec32a599e6cd771d4b6c85 Mon Sep 17 00:00:00 2001 From: bfly Date: Fri, 19 Dec 2025 15:44:48 +0800 Subject: [PATCH 002/153] fix: bridge stability (macOS/tmux) --- ccb | 50 ++++++++++++++++++++++++++++++++-------- lib/codex_comm.py | 15 +++++++++++- lib/codex_dual_bridge.py | 26 ++++++++++++++++++--- lib/terminal.py | 29 ++++++++++++++++++----- 4 files changed, 101 insertions(+), 19 deletions(-) diff --git a/ccb b/ccb index a62e8c4..58c53ca 100755 --- a/ccb +++ b/ccb @@ -110,6 +110,26 @@ class AILauncher: return term return "tmux" + def _launch_script_in_macos_terminal(self, script_file: Path) -> bool: + """macOS: 使用 Terminal.app 打开新窗口执行脚本(避免 tmux launcher 嵌套导致交互失败)""" + if platform.system() != "Darwin": + return False + if not shutil.which("osascript"): + return False + env = os.environ.copy() + env["CCB_WRAPPER_SCRIPT"] = str(script_file) + subprocess.Popen( + [ + "osascript", + "-e", + 'tell application "Terminal" to do script "/bin/bash " & quoted form of (system attribute "CCB_WRAPPER_SCRIPT")', + "-e", + 'tell application "Terminal" to activate', + ], + env=env, + ) + return True + def _start_provider(self, provider: str) -> bool: # 处理未检测到终端的情况 if self.terminal_type is None: @@ -431,7 +451,6 @@ CODEX_START_CMD={json.dumps(start_cmd)} if ! tmux has-session -t "$TMUX_SESSION" 2>/dev/null; then cd "$WORK_DIR" tmux new-session -d -s "$TMUX_SESSION" "$CODEX_START_CMD" - sleep 1 fi tmux pipe-pane -o -t "$TMUX_SESSION" "cat >> '$TMUX_LOG_FILE'" @@ -450,7 +469,10 @@ exec tmux attach -t "$TMUX_SESSION" terminal = self._detect_launch_terminal() if terminal == "tmux": - subprocess.run(["tmux", "new-session", "-d", "-s", f"launcher-{tmux_session}", str(script_file)], check=True) + if self._launch_script_in_macos_terminal(script_file): + pass + else: + subprocess.run(["tmux", "new-session", "-d", "-s", f"launcher-{tmux_session}", str(script_file)], check=True) else: subprocess.Popen([terminal, "-e", str(script_file)]) @@ -479,10 +501,23 @@ exec tmux attach -t "$TMUX_SESSION" terminal = self._detect_launch_terminal() if terminal == "tmux": - # 纯 tmux 模式 - subprocess.run(["tmux", "new-session", "-d", "-s", tmux_session], check=True, cwd=os.getcwd()) - time.sleep(0.3) - subprocess.run(["tmux", "send-keys", "-t", tmux_session, start_cmd, "Enter"], check=True) + if self._launch_script_in_macos_terminal(script_file): + pass + else: + # 纯 tmux 模式 + subprocess.run(["tmux", "new-session", "-d", "-s", tmux_session], check=True, cwd=os.getcwd()) + backend = TmuxBackend() + deadline = time.time() + 1.0 + sleep_s = 0.05 + while True: + try: + backend.send_text(tmux_session, start_cmd) + break + except subprocess.CalledProcessError: + if time.time() >= deadline: + raise + time.sleep(sleep_s) + sleep_s = min(0.2, sleep_s * 2) else: # 打开新终端窗口 subprocess.Popen([terminal, "--", str(script_file)]) @@ -720,11 +755,8 @@ exec tmux attach -t "$TMUX_SESSION" for provider in providers: if not self._start_provider(provider): return 1 - time.sleep(1) self._warmup_provider(provider) - time.sleep(2) - if self.no_claude: print("✅ 后端已启动(--no-claude 模式)") print() diff --git a/lib/codex_comm.py b/lib/codex_comm.py index 89237d9..74a6f71 100644 --- a/lib/codex_comm.py +++ b/lib/codex_comm.py @@ -199,7 +199,7 @@ def ensure_log() -> Path: offset = 0 if not block: return None, {"log_path": current_path, "offset": offset} - time.sleep(0.05) + time.sleep(self._poll_interval) last_rescan = time.time() continue last_rescan = time.time() @@ -339,6 +339,19 @@ def _check_session_health_impl(self, probe_terminal: bool): except OSError: return False, f"Codex进程(PID:{codex_pid})已退出" + bridge_pid_file = self.runtime_dir / "bridge.pid" + if not bridge_pid_file.exists(): + return False, "Bridge进程PID文件不存在" + try: + with bridge_pid_file.open("r", encoding="utf-8") as handle: + bridge_pid = int(handle.read().strip()) + except Exception: + return False, "Bridge进程PID读取失败" + try: + os.kill(bridge_pid, 0) + except OSError: + return False, f"Bridge进程(PID:{bridge_pid})已退出" + if not self.input_fifo.exists(): return False, "通信管道不存在" diff --git a/lib/codex_dual_bridge.py b/lib/codex_dual_bridge.py index 563ff8a..c1e6c0c 100644 --- a/lib/codex_dual_bridge.py +++ b/lib/codex_dual_bridge.py @@ -18,6 +18,17 @@ from terminal import TmuxBackend, WeztermBackend +def _env_float(name: str, default: float) -> float: + raw = os.environ.get(name) + if raw is None: + return default + try: + value = float(raw) + except ValueError: + return default + return max(0.0, value) + + class TerminalCodexSession: """通过终端会话向 Codex CLI 注入指令""" @@ -60,19 +71,28 @@ def _handle_signal(self, signum: int, _: Any) -> None: def run(self) -> int: self._log_console("🔌 Codex桥接器已启动,等待Claude指令...") + idle_sleep = _env_float("CCB_BRIDGE_IDLE_SLEEP", 0.05) + error_backoff_min = _env_float("CCB_BRIDGE_ERROR_BACKOFF_MIN", 0.05) + error_backoff_max = _env_float("CCB_BRIDGE_ERROR_BACKOFF_MAX", 0.2) + error_backoff = max(0.0, min(error_backoff_min, error_backoff_max)) while self._running: try: payload = self._read_request() if payload is None: - time.sleep(0.1) + if idle_sleep: + time.sleep(idle_sleep) continue self._process_request(payload) + error_backoff = max(0.0, min(error_backoff_min, error_backoff_max)) except KeyboardInterrupt: self._running = False except Exception as exc: self._log_console(f"❌ 处理消息失败: {exc}") self._log_bridge(f"error: {exc}") - time.sleep(0.5) + if error_backoff: + time.sleep(error_backoff) + if error_backoff_max: + error_backoff = min(error_backoff_max, max(error_backoff_min, error_backoff * 2)) self._log_console("👋 Codex桥接器已退出") return 0 @@ -86,7 +106,7 @@ def _read_request(self) -> Optional[Dict[str, Any]]: if not line: return None return json.loads(line) - except json.JSONDecodeError: + except (OSError, json.JSONDecodeError): return None def _process_request(self, payload: Dict[str, Any]) -> None: diff --git a/lib/terminal.py b/lib/terminal.py index 5068d6d..238c028 100644 --- a/lib/terminal.py +++ b/lib/terminal.py @@ -13,6 +13,17 @@ from typing import Optional +def _env_float(name: str, default: float) -> float: + raw = os.environ.get(name) + if raw is None: + return default + try: + value = float(raw) + except ValueError: + return default + return max(0.0, value) + + def is_windows() -> bool: return platform.system() == "Windows" @@ -130,12 +141,16 @@ def send_text(self, session: str, text: str) -> None: return buffer_name = f"tb-{os.getpid()}-{int(time.time() * 1000)}" - encoded = (sanitized + "\n").encode("utf-8") + encoded = sanitized.encode("utf-8") subprocess.run(["tmux", "load-buffer", "-b", buffer_name, "-"], input=encoded, check=True) - subprocess.run(["tmux", "paste-buffer", "-t", session, "-b", buffer_name, "-p"], check=True) - time.sleep(0.02) - subprocess.run(["tmux", "send-keys", "-t", session, "Enter"], check=True) - subprocess.run(["tmux", "delete-buffer", "-b", buffer_name], stderr=subprocess.DEVNULL) + try: + subprocess.run(["tmux", "paste-buffer", "-t", session, "-b", buffer_name, "-p"], check=True) + enter_delay = _env_float("CCB_TMUX_ENTER_DELAY", 0.0) + if enter_delay: + time.sleep(enter_delay) + subprocess.run(["tmux", "send-keys", "-t", session, "Enter"], check=True) + finally: + subprocess.run(["tmux", "delete-buffer", "-b", buffer_name], stderr=subprocess.DEVNULL) def is_alive(self, session: str) -> bool: result = subprocess.run(["tmux", "has-session", "-t", session], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) @@ -280,7 +295,9 @@ def send_text(self, pane_id: str, text: str) -> None: check=True, ) # 给 TUI 一点时间退出“粘贴/突发输入”路径,再发送 Enter 更像真实按键 - time.sleep(0.01) + enter_delay = _env_float("CCB_WEZTERM_ENTER_DELAY", 0.0) + if enter_delay: + time.sleep(enter_delay) try: subprocess.run( [*self._cli_base_args(), "send-text", "--pane-id", pane_id, "--no-paste"], From f8cf9ccc6f2fd959ae015e185ffc2890334181e5 Mon Sep 17 00:00:00 2001 From: bfly Date: Fri, 19 Dec 2025 16:15:53 +0800 Subject: [PATCH 003/153] fix(windows): add Windows compatibility fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix Python version check in install.ps1 (single call) - Add lib/compat.py for Windows UTF-8 console encoding - Add _find_claude_cmd() for Windows Claude CLI discovery - Add encoding='utf-8' to subprocess.run calls - Add error handling to WezTerm create_pane - Add tmp/ to .gitignore 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .gitignore | 1 + bin/cask | 2 ++ bin/cask-w | 2 ++ bin/cpend | 2 ++ bin/cping | 3 ++- bin/gask | 2 ++ bin/gask-w | 2 ++ bin/gpend | 2 ++ bin/gping | 2 ++ ccb | 39 ++++++++++++++++++++++++++++++++++++--- install.ps1 | 16 ++++++---------- lib/compat.py | 9 +++++++++ lib/terminal.py | 7 +++++-- 13 files changed, 73 insertions(+), 16 deletions(-) create mode 100644 lib/compat.py diff --git a/.gitignore b/.gitignore index 0fc67c8..1bc656e 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ __pycache__/ .claude-session .claude/ *.mp4 +tmp/ diff --git a/bin/cask b/bin/cask index 27a053c..2a4a3bc 100755 --- a/bin/cask +++ b/bin/cask @@ -12,6 +12,8 @@ from typing import Optional, Tuple script_dir = Path(__file__).resolve().parent lib_dir = script_dir.parent / "lib" sys.path.insert(0, str(lib_dir)) +from compat import setup_windows_encoding +setup_windows_encoding() from terminal import get_backend_for_session, get_pane_id_from_session diff --git a/bin/cask-w b/bin/cask-w index 822cc7b..6ed97d1 100755 --- a/bin/cask-w +++ b/bin/cask-w @@ -9,6 +9,8 @@ from pathlib import Path script_dir = Path(__file__).resolve().parent lib_dir = script_dir.parent / "lib" sys.path.insert(0, str(lib_dir)) +from compat import setup_windows_encoding +setup_windows_encoding() from codex_comm import CodexCommunicator diff --git a/bin/cpend b/bin/cpend index b971983..e6007e0 100755 --- a/bin/cpend +++ b/bin/cpend @@ -10,6 +10,8 @@ from pathlib import Path script_dir = Path(__file__).resolve().parent lib_dir = script_dir.parent / "lib" sys.path.insert(0, str(lib_dir)) +from compat import setup_windows_encoding +setup_windows_encoding() try: from codex_comm import CodexCommunicator diff --git a/bin/cping b/bin/cping index 730ca0e..8924c71 100755 --- a/bin/cping +++ b/bin/cping @@ -8,10 +8,11 @@ import sys import os from pathlib import Path -# 添加lib目录到Python路径 script_dir = Path(__file__).resolve().parent lib_dir = script_dir.parent / "lib" sys.path.insert(0, str(lib_dir)) +from compat import setup_windows_encoding +setup_windows_encoding() try: from codex_comm import CodexCommunicator diff --git a/bin/gask b/bin/gask index c194292..97204c1 100755 --- a/bin/gask +++ b/bin/gask @@ -11,6 +11,8 @@ from pathlib import Path script_dir = Path(__file__).resolve().parent lib_dir = script_dir.parent / "lib" sys.path.insert(0, str(lib_dir)) +from compat import setup_windows_encoding +setup_windows_encoding() from gemini_comm import GeminiCommunicator diff --git a/bin/gask-w b/bin/gask-w index 518f1be..ee14acc 100755 --- a/bin/gask-w +++ b/bin/gask-w @@ -11,6 +11,8 @@ from pathlib import Path script_dir = Path(__file__).resolve().parent lib_dir = script_dir.parent / "lib" sys.path.insert(0, str(lib_dir)) +from compat import setup_windows_encoding +setup_windows_encoding() from gemini_comm import GeminiCommunicator diff --git a/bin/gpend b/bin/gpend index 7c463d3..1cbcb85 100755 --- a/bin/gpend +++ b/bin/gpend @@ -9,6 +9,8 @@ from pathlib import Path script_dir = Path(__file__).resolve().parent lib_dir = script_dir.parent / "lib" sys.path.insert(0, str(lib_dir)) +from compat import setup_windows_encoding +setup_windows_encoding() try: from gemini_comm import GeminiCommunicator diff --git a/bin/gping b/bin/gping index cff918f..184d0f5 100755 --- a/bin/gping +++ b/bin/gping @@ -9,6 +9,8 @@ from pathlib import Path script_dir = Path(__file__).resolve().parent lib_dir = script_dir.parent / "lib" sys.path.insert(0, str(lib_dir)) +from compat import setup_windows_encoding +setup_windows_encoding() try: from gemini_comm import GeminiCommunicator diff --git a/ccb b/ccb index 58c53ca..cde6967 100755 --- a/ccb +++ b/ccb @@ -24,6 +24,9 @@ from pathlib import Path script_dir = Path(__file__).resolve().parent sys.path.insert(0, str(script_dir / "lib")) from terminal import TmuxBackend, WeztermBackend, Iterm2Backend, detect_terminal, is_wsl, get_shell_type +from compat import setup_windows_encoding + +setup_windows_encoding() VERSION = "2.1" @@ -32,7 +35,7 @@ def _get_git_info() -> str: try: result = subprocess.run( ["git", "-C", str(script_dir), "log", "-1", "--format=%h %ci"], - capture_output=True, text=True, timeout=2 + capture_output=True, text=True, encoding='utf-8', errors='replace', timeout=2 ) if result.returncode == 0: return result.stdout.strip() @@ -385,6 +388,8 @@ class AILauncher: cwd=str(Path.cwd()), capture_output=True, text=True, + encoding='utf-8', + errors='replace', ) if last_result.returncode == 0: out = (last_result.stdout or "").strip() @@ -629,6 +634,28 @@ exec tmux attach -t "$TMUX_SESSION" latest = max(uuid_sessions, key=lambda p: p.stat().st_mtime) return latest.stem, True + def _find_claude_cmd(self) -> str: + """Find Claude CLI executable""" + if sys.platform == "win32": + for cmd in ["claude.exe", "claude.cmd", "claude.bat", "claude"]: + path = shutil.which(cmd) + if path: + return path + npm_paths = [ + Path(os.environ.get("APPDATA", "")) / "npm" / "claude.cmd", + Path(os.environ.get("ProgramFiles", "")) / "nodejs" / "claude.cmd", + ] + for npm_path in npm_paths: + if npm_path.exists(): + return str(npm_path) + else: + path = shutil.which("claude") + if path: + return path + raise FileNotFoundError( + "❌ Claude CLI not found. Install: npm install -g @anthropic-ai/claude-code" + ) + def _start_claude(self) -> int: print("🚀 启动 Claude...") @@ -659,7 +686,13 @@ exec tmux attach -t "$TMUX_SESSION" else: env["GEMINI_TMUX_SESSION"] = self.tmux_sessions.get("gemini", "") - cmd = ["claude"] + try: + claude_cmd = self._find_claude_cmd() + except FileNotFoundError as e: + print(str(e)) + return 1 + + cmd = [claude_cmd] if self.auto: cmd.append("--dangerously-skip-permissions") local_session_id: str | None = None @@ -1009,7 +1042,7 @@ def cmd_update(args): print("📦 Updating via git pull...") result = subprocess.run( ["git", "-C", str(install_dir), "pull", "--ff-only"], - capture_output=True, text=True + capture_output=True, text=True, encoding='utf-8', errors='replace' ) if result.returncode == 0: print(result.stdout.strip() if result.stdout.strip() else "Already up to date.") diff --git a/install.ps1 b/install.ps1 index b6fb456..96f207e 100644 --- a/install.ps1 +++ b/install.ps1 @@ -38,20 +38,16 @@ function Require-Python310 { } try { - $version = & $exe @args -c "import sys; print('{}.{}.{}'.format(sys.version_info[0], sys.version_info[1], sys.version_info[2]))" + $vinfo = & $exe @args -c "import sys; v=sys.version_info; print(f'{v.major}.{v.minor}.{v.micro} {v.major} {v.minor}')" + $parts = $vinfo.Trim() -split " " + $version = $parts[0] + $major = [int]$parts[1] + $minor = [int]$parts[2] } catch { - Write-Host "Failed to query Python version using: $PythonCmd" + Write-Host "❌ Failed to query Python version using: $PythonCmd" exit 1 } - $verParts = ($version -split "\\.") | Where-Object { $_ } - if ($verParts.Length -lt 2) { - Write-Host "❌ Unable to parse Python version: $version" - exit 1 - } - $major = [int]$verParts[0] - $minor = [int]$verParts[1] - if (($major -ne 3) -or ($minor -lt 10)) { Write-Host "❌ Python version too old: $version" Write-Host " ccb requires Python 3.10+" diff --git a/lib/compat.py b/lib/compat.py new file mode 100644 index 0000000..50f17af --- /dev/null +++ b/lib/compat.py @@ -0,0 +1,9 @@ +"""Windows compatibility utilities""" +import sys + +def setup_windows_encoding(): + """Configure UTF-8 encoding for Windows console""" + if sys.platform == "win32": + import io + sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace') + sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8', errors='replace') diff --git a/lib/terminal.py b/lib/terminal.py index 238c028..c9c32fa 100644 --- a/lib/terminal.py +++ b/lib/terminal.py @@ -364,8 +364,11 @@ def create_pane(self, cmd: str, cwd: str, direction: str = "right", percent: int args.extend(["--pane-id", parent_pane]) shell, flag = _default_shell() args.extend(["--", shell, flag, cmd]) - result = subprocess.run(args, capture_output=True, text=True, check=True) - return result.stdout.strip() + try: + result = subprocess.run(args, capture_output=True, text=True, check=True) + return result.stdout.strip() + except subprocess.CalledProcessError as e: + raise RuntimeError(f"WezTerm split-pane failed:\nCommand: {' '.join(args)}\nStderr: {e.stderr}") from e _backend_cache: Optional[TerminalBackend] = None From c28565220cb186c3e71bee8e1165e409d1af60b6 Mon Sep 17 00:00:00 2001 From: bfly Date: Fri, 19 Dec 2025 22:32:36 +0800 Subject: [PATCH 004/153] feat(windows): add BackendEnv config and install confirmation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Runtime config: - Add lib/ccb_config.py for BackendEnv (wsl/windows) configuration - Support .ccb-config.json and CCB_BACKEND_ENV env var - Auto-inject WSL session paths for Windows+WSL scenarios - Update terminal.py to force WSL launch when BackendEnv=wsl Install confirmation: - Add WSL environment confirmation in install.sh - Add Windows environment confirmation in install.ps1 - Support -Yes flag and CCB_INSTALL_ASSUME_YES=1 to skip 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- ccb | 5 +++ install.ps1 | 32 +++++++++++++++++- install.sh | 35 +++++++++++++++++++ lib/ccb_config.py | 83 ++++++++++++++++++++++++++++++++++++++++++++++ lib/codex_comm.py | 3 ++ lib/gemini_comm.py | 3 ++ lib/terminal.py | 9 +++-- 7 files changed, 167 insertions(+), 3 deletions(-) create mode 100644 lib/ccb_config.py diff --git a/ccb b/ccb index cde6967..86500b7 100755 --- a/ccb +++ b/ccb @@ -25,9 +25,14 @@ script_dir = Path(__file__).resolve().parent sys.path.insert(0, str(script_dir / "lib")) from terminal import TmuxBackend, WeztermBackend, Iterm2Backend, detect_terminal, is_wsl, get_shell_type from compat import setup_windows_encoding +from ccb_config import get_backend_env setup_windows_encoding() +backend_env = get_backend_env() +if backend_env and not os.environ.get("CCB_BACKEND_ENV"): + os.environ["CCB_BACKEND_ENV"] = backend_env + VERSION = "2.1" diff --git a/install.ps1 b/install.ps1 index 96f207e..895a8c4 100644 --- a/install.ps1 +++ b/install.ps1 @@ -2,7 +2,8 @@ param( [Parameter(Position = 0)] [ValidateSet("install", "uninstall", "help")] [string]$Command = "help", - [string]$InstallPrefix = "$env:LOCALAPPDATA\codex-dual" + [string]$InstallPrefix = "$env:LOCALAPPDATA\codex-dual", + [switch]$Yes ) $ErrorActionPreference = "Stop" @@ -57,7 +58,36 @@ function Require-Python310 { Write-Host "✓ Python $version" } +function Confirm-BackendEnv { + if ($Yes -or $env:CCB_INSTALL_ASSUME_YES -eq "1") { return } + + if (-not [Environment]::UserInteractive) { + Write-Host "❌ 非交互环境下默认中止,避免 Windows/WSL 环境错配。" + Write-Host " 若确认 codex/gemini 将在 Windows 原生运行:" + Write-Host " 重新运行: powershell -ExecutionPolicy Bypass -File .\install.ps1 install -Yes" + exit 1 + } + + Write-Host "" + Write-Host "================================================================" + Write-Host "⚠️ 你正在 Windows 原生环境安装 ccb" + Write-Host "================================================================" + Write-Host "ccb/cask-w 必须与 codex/gemini 在同一环境运行。" + Write-Host "" + Write-Host "请确认:你将把 codex/gemini 安装并运行在 Windows 原生(而不是 WSL 内)。" + Write-Host "如果你计划在 WSL 内运行 codex/gemini,请退出并在 WSL 中运行:" + Write-Host " ./install.sh install" + Write-Host "================================================================" + $reply = Read-Host "确认继续在 Windows 中安装?(y/N)" + if ($reply.Trim().ToLower() -notin @("y", "yes")) { + Write-Host "已取消安装" + exit 1 + } +} + function Install-Native { + Confirm-BackendEnv + $binDir = Join-Path $InstallPrefix "bin" $pythonCmd = Find-Python diff --git a/install.sh b/install.sh index 0900572..67ce92c 100755 --- a/install.sh +++ b/install.sh @@ -136,6 +136,40 @@ check_wsl_compatibility() { fi } +confirm_backend_env_wsl() { + if ! is_wsl; then + return + fi + + if [[ "${CCB_INSTALL_ASSUME_YES:-}" == "1" ]]; then + return + fi + + if [[ ! -t 0 ]]; then + echo "❌ 当前在 WSL 中安装,但检测到非交互终端;为避免环境错配,已中止。" + echo " 如果你确认 codex/gemini 将安装并运行在 WSL:" + echo " 重新运行: CCB_INSTALL_ASSUME_YES=1 ./install.sh install" + exit 1 + fi + + echo + echo "================================================================" + echo "⚠️ 检测到 WSL 环境" + echo "================================================================" + echo "ccb/cask-w 必须与 codex/gemini 在同一环境运行。" + echo + echo "请确认:你将把 codex/gemini 安装并运行在 WSL(而不是 Windows 原生)。" + echo "如果你计划在 Windows 原生运行 codex/gemini,请退出并在 Windows 侧运行:" + echo " powershell -ExecutionPolicy Bypass -File .\\install.ps1 install" + echo "================================================================" + echo + read -r -p "确认继续在 WSL 中安装?(y/N): " reply + case "$reply" in + y|Y|yes|YES) ;; + *) echo "已取消安装"; exit 1 ;; + esac +} + print_tmux_install_hint() { local platform platform="$(detect_platform)" @@ -668,6 +702,7 @@ with open('$settings_file', 'w') as f: install_requirements() { check_wsl_compatibility + confirm_backend_env_wsl require_command python3 python3 require_python_version require_terminal_backend diff --git a/lib/ccb_config.py b/lib/ccb_config.py new file mode 100644 index 0000000..15ac039 --- /dev/null +++ b/lib/ccb_config.py @@ -0,0 +1,83 @@ +"""CCB configuration for Windows/WSL backend environment""" +import json +import os +import subprocess +import sys +from pathlib import Path + + +def get_backend_env() -> str | None: + """Get BackendEnv from env var or .ccb-config.json""" + v = (os.environ.get("CCB_BACKEND_ENV") or "").strip().lower() + if v in {"wsl", "windows"}: + return v + path = Path.cwd() / ".ccb-config.json" + if path.exists(): + try: + data = json.loads(path.read_text(encoding="utf-8")) + v = (data.get("BackendEnv") or "").strip().lower() + if v in {"wsl", "windows"}: + return v + except Exception: + pass + return "windows" if sys.platform == "win32" else None + + +def _wsl_probe_distro_and_home() -> tuple[str, str]: + """Probe default WSL distro and home directory""" + try: + r = subprocess.run( + ["wsl.exe", "-e", "sh", "-lc", "echo $WSL_DISTRO_NAME; echo $HOME"], + capture_output=True, text=True, encoding="utf-8", errors="replace", timeout=10 + ) + if r.returncode == 0: + lines = r.stdout.strip().split("\n") + if len(lines) >= 2: + return lines[0].strip(), lines[1].strip() + except Exception: + pass + try: + r = subprocess.run( + ["wsl.exe", "-l", "-q"], + capture_output=True, text=True, encoding="utf-16-le", errors="replace", timeout=5 + ) + if r.returncode == 0: + for line in r.stdout.strip().split("\n"): + distro = line.strip().strip("\x00") + if distro: + break + else: + distro = "Ubuntu" + else: + distro = "Ubuntu" + except Exception: + distro = "Ubuntu" + try: + r = subprocess.run( + ["wsl.exe", "-d", distro, "-e", "sh", "-lc", "echo $HOME"], + capture_output=True, text=True, encoding="utf-8", errors="replace", timeout=5 + ) + home = r.stdout.strip() if r.returncode == 0 else "/root" + except Exception: + home = "/root" + return distro, home + + +def apply_backend_env() -> None: + """Apply BackendEnv=wsl settings (set session root paths for Windows to access WSL)""" + if sys.platform != "win32" or get_backend_env() != "wsl": + return + if os.environ.get("CODEX_SESSION_ROOT") and os.environ.get("GEMINI_ROOT"): + return + distro, home = _wsl_probe_distro_and_home() + for base in (fr"\\wsl.localhost\{distro}", fr"\\wsl$\{distro}"): + prefix = base + home.replace("/", "\\") + codex_path = prefix + r"\.codex\sessions" + gemini_path = prefix + r"\.gemini\tmp" + if Path(codex_path).exists() or Path(gemini_path).exists(): + os.environ.setdefault("CODEX_SESSION_ROOT", codex_path) + os.environ.setdefault("GEMINI_ROOT", gemini_path) + return + prefix = fr"\\wsl.localhost\{distro}" + home.replace("/", "\\") + os.environ.setdefault("CODEX_SESSION_ROOT", prefix + r"\.codex\sessions") + os.environ.setdefault("GEMINI_ROOT", prefix + r"\.gemini\tmp") diff --git a/lib/codex_comm.py b/lib/codex_comm.py index 74a6f71..65eb6aa 100644 --- a/lib/codex_comm.py +++ b/lib/codex_comm.py @@ -16,6 +16,9 @@ from typing import Optional, Tuple, Dict, Any from terminal import get_backend_for_session, get_pane_id_from_session +from ccb_config import apply_backend_env + +apply_backend_env() SESSION_ROOT = Path(os.environ.get("CODEX_SESSION_ROOT") or (Path.home() / ".codex" / "sessions")).expanduser() SESSION_ID_PATTERN = re.compile( diff --git a/lib/gemini_comm.py b/lib/gemini_comm.py index 305cfb9..e9dcdbb 100755 --- a/lib/gemini_comm.py +++ b/lib/gemini_comm.py @@ -14,6 +14,9 @@ from typing import Optional, Tuple, Dict, Any from terminal import get_backend_for_session, get_pane_id_from_session +from ccb_config import apply_backend_env + +apply_backend_env() GEMINI_ROOT = Path(os.environ.get("GEMINI_ROOT") or (Path.home() / ".gemini" / "tmp")).expanduser() diff --git a/lib/terminal.py b/lib/terminal.py index c9c32fa..739d601 100644 --- a/lib/terminal.py +++ b/lib/terminal.py @@ -110,6 +110,8 @@ def _default_shell() -> tuple[str, str]: def get_shell_type() -> str: + if is_windows() and os.environ.get("CCB_BACKEND_ENV", "").lower() == "wsl": + return "bash" shell, _ = _default_shell() if shell in ("pwsh", "powershell"): return "powershell" @@ -329,7 +331,9 @@ def activate(self, pane_id: str) -> None: def create_pane(self, cmd: str, cwd: str, direction: str = "right", percent: int = 50, parent_pane: Optional[str] = None) -> str: args = [*self._cli_base_args(), "split-pane"] - if is_wsl() and _is_windows_wezterm(): + force_wsl = os.environ.get("CCB_BACKEND_ENV", "").lower() == "wsl" + use_wsl_launch = (is_wsl() and _is_windows_wezterm()) or (force_wsl and is_windows()) + if use_wsl_launch: in_wsl_pane = bool(os.environ.get("WSL_DISTRO_NAME") or os.environ.get("WSL_INTEROP")) wsl_cwd = cwd wsl_localhost_match = re.match(r'^[/\\]{1,2}wsl\.localhost[/\\][^/\\]+(.+)$', cwd, re.IGNORECASE) @@ -337,7 +341,8 @@ def create_pane(self, cmd: str, cwd: str, direction: str = "right", percent: int wsl_cwd = wsl_localhost_match.group(1).replace('\\', '/') elif "\\" in cwd or (len(cwd) > 2 and cwd[1] == ":"): try: - result = subprocess.run(["wslpath", "-a", cwd], capture_output=True, text=True, check=True) + wslpath_cmd = ["wslpath", "-a", cwd] if is_wsl() else ["wsl.exe", "wslpath", "-a", cwd] + result = subprocess.run(wslpath_cmd, capture_output=True, text=True, check=True) wsl_cwd = result.stdout.strip() except Exception: pass From 270188fec76e2acde73cd33aa5fc0531c7adad38 Mon Sep 17 00:00:00 2001 From: bfly Date: Fri, 19 Dec 2025 22:47:34 +0800 Subject: [PATCH 005/153] fix: add session file permission check and friendly error messages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 lib/session_utils.py 权限检查工具 - ccb: _write_*_session() 添加预检查和清晰错误提示 - codex_comm.py/gemini_comm.py: 异常时输出警告而非静默吞掉 用户遇到权限问题时将看到具体原因和修复命令 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- ccb | 31 +++++++++++- lib/codex_comm.py | 8 ++- lib/gemini_comm.py | 11 ++++- lib/session_utils.py | 114 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 160 insertions(+), 4 deletions(-) create mode 100644 lib/session_utils.py diff --git a/ccb b/ccb index 86500b7..b363a3f 100755 --- a/ccb +++ b/ccb @@ -26,6 +26,7 @@ sys.path.insert(0, str(script_dir / "lib")) from terminal import TmuxBackend, WeztermBackend, Iterm2Backend, detect_terminal, is_wsl, get_shell_type from compat import setup_windows_encoding from ccb_config import get_backend_env +from session_utils import safe_write_session, check_session_writable setup_windows_encoding() @@ -537,6 +538,14 @@ exec tmux attach -t "$TMUX_SESSION" def _write_codex_session(self, runtime, tmux_session, input_fifo, output_fifo, pane_id=None): session_file = Path.cwd() / ".codex-session" + + # 预检查权限 + writable, reason, fix = check_session_writable(session_file) + if not writable: + print(f"❌ 无法写入 {session_file.name}: {reason}", file=sys.stderr) + print(f"💡 解决方案: {fix}", file=sys.stderr) + return False + data = {} if session_file.exists(): try: @@ -557,10 +566,23 @@ exec tmux attach -t "$TMUX_SESSION" "active": True, "started_at": time.strftime("%Y-%m-%d %H:%M:%S"), }) - session_file.write_text(json.dumps(data, ensure_ascii=False, indent=2)) + + ok, err = safe_write_session(session_file, json.dumps(data, ensure_ascii=False, indent=2)) + if not ok: + print(err, file=sys.stderr) + return False + return True def _write_gemini_session(self, runtime, tmux_session, pane_id=None): session_file = Path.cwd() / ".gemini-session" + + # 预检查权限 + writable, reason, fix = check_session_writable(session_file) + if not writable: + print(f"❌ 无法写入 {session_file.name}: {reason}", file=sys.stderr) + print(f"💡 解决方案: {fix}", file=sys.stderr) + return False + data = { "session_id": self.session_id, "runtime_dir": str(runtime), @@ -571,7 +593,12 @@ exec tmux attach -t "$TMUX_SESSION" "active": True, "started_at": time.strftime("%Y-%m-%d %H:%M:%S"), } - session_file.write_text(json.dumps(data, ensure_ascii=False, indent=2)) + + ok, err = safe_write_session(session_file, json.dumps(data, ensure_ascii=False, indent=2)) + if not ok: + print(err, file=sys.stderr) + return False + return True def _claude_project_dir(self, work_dir: Path) -> Path: projects_root = Path.home() / ".claude" / "projects" diff --git a/lib/codex_comm.py b/lib/codex_comm.py index 65eb6aa..89726e2 100644 --- a/lib/codex_comm.py +++ b/lib/codex_comm.py @@ -543,7 +543,13 @@ def _remember_codex_session(self, log_path: Optional[Path]) -> None: with tmp_file.open("w", encoding="utf-8") as handle: json.dump(data, handle, ensure_ascii=False, indent=2) os.replace(tmp_file, project_file) - except Exception: + except PermissionError as e: + print(f"⚠️ 无法更新 {project_file.name}: {e}", file=sys.stderr) + print(f"💡 尝试: sudo chown $USER:$USER {project_file}", file=sys.stderr) + if tmp_file.exists(): + tmp_file.unlink(missing_ok=True) + except Exception as e: + print(f"⚠️ 更新 {project_file.name} 失败: {e}", file=sys.stderr) if tmp_file.exists(): tmp_file.unlink(missing_ok=True) diff --git a/lib/gemini_comm.py b/lib/gemini_comm.py index e9dcdbb..f2d38f7 100755 --- a/lib/gemini_comm.py +++ b/lib/gemini_comm.py @@ -554,7 +554,16 @@ def _remember_gemini_session(self, session_path: Path) -> None: with tmp_file.open("w", encoding="utf-8") as handle: json.dump(data, handle, ensure_ascii=False, indent=2) os.replace(tmp_file, project_file) - except Exception: + except PermissionError as e: + print(f"⚠️ 无法更新 {project_file.name}: {e}", file=sys.stderr) + print(f"💡 尝试: sudo chown $USER:$USER {project_file}", file=sys.stderr) + try: + if tmp_file.exists(): + tmp_file.unlink(missing_ok=True) + except Exception: + pass + except Exception as e: + print(f"⚠️ 更新 {project_file.name} 失败: {e}", file=sys.stderr) try: if tmp_file.exists(): tmp_file.unlink(missing_ok=True) diff --git a/lib/session_utils.py b/lib/session_utils.py new file mode 100644 index 0000000..65754e6 --- /dev/null +++ b/lib/session_utils.py @@ -0,0 +1,114 @@ +#!/usr/bin/env python3 +""" +session_utils.py - Session 文件权限检查工具 +""" +from __future__ import annotations +import os +import stat +from pathlib import Path +from typing import Tuple, Optional + + +def check_session_writable(session_file: Path) -> Tuple[bool, Optional[str], Optional[str]]: + """ + 检查 session 文件是否可写 + + Returns: + (可写, 错误原因, 解决建议) + """ + session_file = Path(session_file) + parent = session_file.parent + + # 1. 检查父目录是否存在且可进入 + if not parent.exists(): + return False, f"目录不存在: {parent}", f"mkdir -p {parent}" + + if not os.access(parent, os.X_OK): + return False, f"目录无法访问(缺少x权限): {parent}", f"chmod +x {parent}" + + # 2. 检查父目录是否可写 + if not os.access(parent, os.W_OK): + return False, f"目录不可写: {parent}", f"chmod u+w {parent}" + + # 3. 如果文件不存在,目录可写就行 + if not session_file.exists(): + return True, None, None + + # 4. 检查是否是普通文件 + if session_file.is_symlink(): + target = session_file.resolve() + return False, f"是符号链接指向 {target}", f"rm -f {session_file}" + + if session_file.is_dir(): + return False, "是目录而非文件", f"rmdir {session_file} 或 rm -rf {session_file}" + + if not session_file.is_file(): + return False, "不是普通文件", f"rm -f {session_file}" + + # 5. 检查文件归属 + try: + file_stat = session_file.stat() + file_uid = file_stat.st_uid + current_uid = os.getuid() + + if file_uid != current_uid: + import pwd + try: + owner_name = pwd.getpwuid(file_uid).pw_name + except KeyError: + owner_name = str(file_uid) + current_name = pwd.getpwuid(current_uid).pw_name + return False, f"文件归属为 {owner_name} (当前用户: {current_name})", \ + f"sudo chown {current_name}:{current_name} {session_file}" + except Exception: + pass + + # 6. 检查文件是否可写 + if not os.access(session_file, os.W_OK): + mode = stat.filemode(session_file.stat().st_mode) + return False, f"文件不可写 (权限: {mode})", f"chmod u+w {session_file}" + + return True, None, None + + +def safe_write_session(session_file: Path, content: str) -> Tuple[bool, Optional[str]]: + """ + 安全写入 session 文件,失败时返回友好错误 + + Returns: + (成功, 错误信息) + """ + session_file = Path(session_file) + + # 预检查 + writable, reason, fix = check_session_writable(session_file) + if not writable: + return False, f"❌ 无法写入 {session_file.name}: {reason}\n💡 解决方案: {fix}" + + # 尝试原子写入 + tmp_file = session_file.with_suffix(".tmp") + try: + tmp_file.write_text(content, encoding="utf-8") + os.replace(tmp_file, session_file) + return True, None + except PermissionError as e: + if tmp_file.exists(): + try: + tmp_file.unlink() + except Exception: + pass + return False, f"❌ 无法写入 {session_file.name}: {e}\n💡 尝试: rm -f {session_file} 后重试" + except Exception as e: + if tmp_file.exists(): + try: + tmp_file.unlink() + except Exception: + pass + return False, f"❌ 写入失败: {e}" + + +def print_session_error(msg: str, to_stderr: bool = True) -> None: + """输出 session 相关错误""" + import sys + output = sys.stderr if to_stderr else sys.stdout + print(msg, file=output) From cae1d3353668e23f4467321c8d5d69904ee45e6a Mon Sep 17 00:00:00 2001 From: bfly Date: Fri, 19 Dec 2025 22:56:02 +0800 Subject: [PATCH 006/153] docs: add WezTerm installation note for Windows users MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Windows 用户必须使用原生 exe 安装 WezTerm,即使使用 WSL 也是如此 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 784b4ec..cf32225 100644 --- a/README.md +++ b/README.md @@ -184,6 +184,8 @@ ccb update # Update to latest version - Python 3.10+ - tmux or WezTerm (at least one; WezTerm recommended) +> **⚠️ Windows Users:** Always install WezTerm using the **native Windows .exe installer** from [wezfurlong.org/wezterm](https://wezfurlong.org/wezterm/), even if you use WSL. Do NOT install WezTerm inside WSL. After installation, configure WezTerm to connect to WSL via `wsl.exe` as the default shell. This ensures proper split-pane functionality. + ## Uninstall ```bash @@ -370,8 +372,9 @@ ccb update # 更新到最新版本 ## 依赖 - Python 3.10+ -- tmux 或 WezTerm(至少安装一个),强烈推荐wezterm +- tmux 或 WezTerm(至少安装一个),强烈推荐 WezTerm +> **⚠️ Windows 用户注意:** 必须使用 **Windows 原生 .exe 安装包** 安装 WezTerm([下载地址](https://wezfurlong.org/wezterm/)),即使你使用 WSL 也是如此。**不要在 WSL 内部安装 WezTerm**。安装完成后,可在 WezTerm 设置中将默认 shell 配置为 `wsl.exe`,即可无缝接入 WSL 环境,同时保证分屏功能正常工作。 ## 卸载 From 4324fe3c3a73ed07d40d48c915741f54984a67ea Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 20 Dec 2025 10:19:47 +0800 Subject: [PATCH 007/153] fix(wezterm): improve send_text reliability for enter key MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Use command argument instead of stdin for text and enter - Add fallback sequence: \r -> \n -> \r\n -> stdin - Set default enter delay to 0.01s for TUI compatibility - Also strip \n from text before sending - Update AI collaboration rules in install.sh 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- ccb | 45 +++++++++++++++++++++++++++++++++++++++++++- install.sh | 50 +++++++++++++++++++++++++++++-------------------- lib/terminal.py | 36 +++++++++++++++++------------------ 3 files changed, 91 insertions(+), 40 deletions(-) diff --git a/ccb b/ccb index b363a3f..aafd9ac 100755 --- a/ccb +++ b/ccb @@ -1086,9 +1086,52 @@ def cmd_update(args): print(f"⚠️ Git pull failed: {result.stderr.strip()}") print("Falling back to tarball download...") + def _pick_temp_base_dir() -> Path: + candidates: list[Path] = [] + for key in ("CCB_TMPDIR", "TMPDIR", "TEMP", "TMP"): + value = (os.environ.get(key) or "").strip() + if value: + candidates.append(Path(value).expanduser()) + try: + candidates.append(Path(tempfile.gettempdir())) + except Exception: + pass + candidates.extend( + [ + Path("/tmp"), + Path("/var/tmp"), + Path("/usr/tmp"), + Path.home() / ".cache" / "ccb" / "tmp", + install_dir / ".tmp", + Path.cwd() / ".tmp", + ] + ) + + for base in candidates: + try: + base.mkdir(parents=True, exist_ok=True) + probe = base / f".ccb_tmp_probe_{os.getpid()}_{int(time.time() * 1000)}" + probe.write_bytes(b"1") + probe.unlink(missing_ok=True) + return base + except Exception: + continue + + raise RuntimeError( + "❌ No usable temporary directory found.\n" + "Fix options:\n" + " - Create /tmp (Linux/WSL): sudo mkdir -p /tmp && sudo chmod 1777 /tmp\n" + " - Or set TMPDIR/CCB_TMPDIR to a writable path (e.g. export TMPDIR=$HOME/.cache/tmp)" + ) + # Method 2: Download tarball tarball_url = f"{repo_url}/archive/refs/heads/main.tar.gz" - tmp_dir = Path(tempfile.gettempdir()) / "ccb_update" + try: + tmp_base = _pick_temp_base_dir() + except Exception as exc: + print(str(exc)) + return 1 + tmp_dir = tmp_base / "ccb_update" try: print(f"📥 Downloading latest version...") diff --git a/install.sh b/install.sh index 67ce92c..8e88c82 100755 --- a/install.sh +++ b/install.sh @@ -584,8 +584,8 @@ with open('$claude_md', 'w', encoding='utf-8') as f: Codex is another AI assistant running in a separate terminal session (WezTerm, iTerm2 or tmux). When user intent involves asking/consulting/collaborating with Codex: Fast path (minimize latency): -- If the user message starts with any of: `调取codex`, `@codex`, `codex:`, `codex:`, `问codex`, `让codex` then immediately run: - - `cask-w ""` (no extra analysis, no pre-checks like cping) +- If the user message starts with any of: `@codex`, `codex:`, `ask codex`, `let codex` then immediately run: + - `Bash(cask-w "", run_in_background=true)` (background send, continue immediately) - If user message is only the prefix (no content), ask a 1-line clarification for what to send. Trigger conditions (any match): @@ -594,23 +594,28 @@ Trigger conditions (any match): - User asks about codex's status or previous reply Command selection: -- Default ask/collaborate → `cask-w ""` (sync, waits for reply) -- Send without waiting → `cask ""` (async, returns immediately) -- Check connectivity → `cping` -- View previous reply → `cpend` +- Default ask/collaborate -> `Bash(cask-w "", run_in_background=true)` + - Sends in background, returns task_id immediately + - Continue with other work, do not wait + - Use `TaskOutput(task_id, block=true)` when result is needed +- Send without waiting -> `cask ""` (async, returns immediately) +- Check connectivity -> `cping` +- View previous reply -> `cpend` +- Get background result -> `TaskOutput(task_id="xxx", block=true)` Examples: -- "what does codex think" → cask-w -- "ask codex to review this" → cask-w -- "is codex alive" → cping -- "don't wait for reply" → cask +- "what does codex think" -> Bash(cask-w, run_in_background=true), then continue +- "ask codex to review this" -> Bash(cask-w, run_in_background=true), then continue +- "is codex alive" -> cping +- "don't wait for reply" -> cask +- "get codex result" -> TaskOutput(task_id) or cpend ## Gemini Collaboration Rules Gemini is another AI assistant running in a separate terminal session (WezTerm, iTerm2 or tmux). When user intent involves asking/consulting/collaborating with Gemini: Fast path (minimize latency): -- If the user message starts with any of: `调取gemini`, `@gemini`, `gemini:`, `gemini:`, `问gemini`, `让gemini` then immediately run: - - `gask-w ""` (no extra analysis, no pre-checks like gping) +- If the user message starts with any of: `@gemini`, `gemini:`, `ask gemini`, `let gemini` then immediately run: + - `Bash(gask-w "", run_in_background=true)` (background send, continue immediately) - If user message is only the prefix (no content), ask a 1-line clarification for what to send. Trigger conditions (any match): @@ -619,16 +624,21 @@ Trigger conditions (any match): - User asks about gemini's status or previous reply Command selection: -- Default ask/collaborate → `gask-w ""` (sync, waits for reply) -- Send without waiting → `gask ""` (async, returns immediately) -- Check connectivity → `gping` -- View previous reply → `gpend` +- Default ask/collaborate -> `Bash(gask-w "", run_in_background=true)` + - Sends in background, returns task_id immediately + - Continue with other work, do not wait + - Use `TaskOutput(task_id, block=true)` when result is needed +- Send without waiting -> `gask ""` (async, returns immediately) +- Check connectivity -> `gping` +- View previous reply -> `gpend` +- Get background result -> `TaskOutput(task_id="xxx", block=true)` Examples: -- "what does gemini think" → gask-w -- "ask gemini to review this" → gask-w -- "is gemini alive" → gping -- "don't wait for reply" → gask +- "what does gemini think" -> Bash(gask-w, run_in_background=true), then continue +- "ask gemini to review this" -> Bash(gask-w, run_in_background=true), then continue +- "is gemini alive" -> gping +- "don't wait for reply" -> gask +- "get gemini result" -> TaskOutput(task_id) or gpend AI_RULES echo "Updated AI collaboration rules in $claude_md" diff --git a/lib/terminal.py b/lib/terminal.py index 739d601..c4158ee 100644 --- a/lib/terminal.py +++ b/lib/terminal.py @@ -286,32 +286,30 @@ def _bin(cls) -> str: return cls._wezterm_bin def send_text(self, pane_id: str, text: str) -> None: - sanitized = text.replace("\r", "").strip() + sanitized = text.replace("\r", "").replace("\n", "").strip() if not sanitized: return - # tmux 可单独发 Enter 键;wezterm cli 没有 send-key,只能用 send-text 发送控制字符。 - # 经验上,很多交互式 CLI 在“粘贴/多行输入”里不会自动执行;这里将文本和 Enter 分两次发送更可靠。 subprocess.run( - [*self._cli_base_args(), "send-text", "--pane-id", pane_id, "--no-paste"], - input=sanitized.encode("utf-8"), + [*self._cli_base_args(), "send-text", "--pane-id", pane_id, "--no-paste", sanitized], check=True, ) - # 给 TUI 一点时间退出“粘贴/突发输入”路径,再发送 Enter 更像真实按键 - enter_delay = _env_float("CCB_WEZTERM_ENTER_DELAY", 0.0) + enter_delay = _env_float("CCB_WEZTERM_ENTER_DELAY", 0.01) if enter_delay: time.sleep(enter_delay) - try: - subprocess.run( - [*self._cli_base_args(), "send-text", "--pane-id", pane_id, "--no-paste"], - input=b"\r", - check=True, - ) - except subprocess.CalledProcessError: - subprocess.run( - [*self._cli_base_args(), "send-text", "--pane-id", pane_id, "--no-paste"], - input=b"\n", - check=True, - ) + for char in ["\r", "\n", "\r\n"]: + try: + subprocess.run( + [*self._cli_base_args(), "send-text", "--pane-id", pane_id, "--no-paste", char], + check=True, + ) + return + except subprocess.CalledProcessError: + continue + subprocess.run( + [*self._cli_base_args(), "send-text", "--pane-id", pane_id, "--no-paste"], + input=b"\r", + check=False, + ) def is_alive(self, pane_id: str) -> bool: try: From 2e92e89489f9dff359f93753435673ce7c236433 Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 20 Dec 2025 10:46:59 +0800 Subject: [PATCH 008/153] feat(commands): update cask-w/gask-w to use background mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Use run_in_background=true for non-blocking execution - Add TaskOutput usage for retrieving results - Update workflow documentation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- commands/cask-w.md | 27 ++++++++++++++------------- commands/gask-w.md | 23 +++++++++++++++-------- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/commands/cask-w.md b/commands/cask-w.md index 20ee42f..e3f3ae7 100644 --- a/commands/cask-w.md +++ b/commands/cask-w.md @@ -1,24 +1,25 @@ 通过 `cask-w` 命令将指令转发到 Codex 会话并等待回复(支持 tmux / WezTerm,仅转发,不在当前 Claude 进程执行)。 执行方式: -- 沉默运行 `Bash(cask-w "<转发内容>")`,执行完毕后不做其他分析、推理或额外操作 -- 在终端中也可执行 `cask-w <转发内容>`,效果等同 +- 后台运行 `Bash(cask-w "<转发内容>", run_in_background=true)` +- 发送后立即继续对话,不阻塞等待 +- 需要结果时使用 `TaskOutput(task_id, block=true)` 获取 参数说明: -- `<转发内容>` 必填,会被转发到 Codex 会话(例如 `pwd`、`ls` 等命令) -- ⚠️ 注意:cask-w 转发后会等待 Codex 回复(默认无超时,`Ctrl-C` 可中断) +- `<转发内容>` 必填,会被转发到 Codex 会话 +- 返回 task_id,可用于后续获取结果 交互流程: -1. 转发命令到 Codex tmux 会话 -2. 捕获当前日志状态 -3. 等待新的回复消息 -4. 打印回复内容后返回 +1. 后台发送到 Codex +2. 立即返回 task_id +3. Claude 继续处理其他任务 +4. 需要时通过 TaskOutput 获取回复 示例: -- `Bash(cask-w "pwd")` -- `Bash(cask-w "echo test")` +- `Bash(cask-w "1+2", run_in_background=true)` -> 返回 task_id +- `TaskOutput(task_id, block=true)` -> 获取 Codex 回复 提示: -- cask-w 会阻塞等待 Codex 回复,适合需要立即看到结果的场景 -- 如不需要等待,使用 `/cask` 即可 -- cask-w 返回后表示已获取回复,无需继续执行任何操作 +- 发送后可继续对话,无需等待 +- 使用 `/cpend` 查看最新回复 +- 使用 `TaskOutput` 获取特定任务结果 diff --git a/commands/gask-w.md b/commands/gask-w.md index 62e88e3..3c8c0ac 100644 --- a/commands/gask-w.md +++ b/commands/gask-w.md @@ -1,18 +1,25 @@ 通过 `gask-w` 命令将指令转发到 Gemini 会话,并同步等待回复(支持 tmux / WezTerm)。 执行方式: -- 沉默运行 `Bash(gask-w "<转发内容>")`,执行完毕后不做其他分析、推理或额外操作 -- 在终端中也可执行 `gask-w <转发内容>`,效果等同 +- 后台运行 `Bash(gask-w "<转发内容>", run_in_background=true)` +- 发送后立即继续对话,不阻塞等待 +- 需要结果时使用 `TaskOutput(task_id, block=true)` 获取 参数说明: - `<转发内容>` 必填,会被转发到 Gemini 会话 -- ⚠️ 注意:gask-w 会等待 Gemini 回复后再返回 +- 返回 task_id,可用于后续获取结果 + +交互流程: +1. 后台发送到 Gemini +2. 立即返回 task_id +3. Claude 继续处理其他任务 +4. 需要时通过 TaskOutput 获取回复 示例: -- `Bash(gask-w "解释一下这段代码")` -- `Bash(gask-w "这个方案有什么建议?")` +- `Bash(gask-w "解释一下这段代码", run_in_background=true)` -> 返回 task_id +- `TaskOutput(task_id, block=true)` -> 获取 Gemini 回复 提示: -- gask-w 会阻塞等待 Gemini 回复 -- 默认无超时,`Ctrl-C` 可中断(如需非阻塞,使用 `/gask`) -- 适合需要获取 Gemini 反馈的场景 +- 发送后可继续对话,无需等待 +- 使用 `/gpend` 查看最新回复 +- 使用 `TaskOutput` 获取特定任务结果 From e6037e7ac0f047cf447ebf5a6942b01438939dae Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 20 Dec 2025 10:54:13 +0800 Subject: [PATCH 009/153] feat(install): use marker block for CLAUDE.md config MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add CCB_CONFIG_START/END markers to isolate ccb config - Install: update existing block or append new one - Uninstall: only remove marked block, preserve user content - Keep backward compatibility with legacy rules 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- install.sh | 97 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 66 insertions(+), 31 deletions(-) diff --git a/install.sh b/install.sh index 8e88c82..ce2a546 100755 --- a/install.sh +++ b/install.sh @@ -491,7 +491,8 @@ install_claude_commands() { echo "已更新 Claude 命令目录: $claude_dir" } -RULE_MARKER="## Codex Collaboration Rules" +CCB_START_MARKER="" +CCB_END_MARKER="" LEGACY_RULE_MARKER="## Codex 协作规则" remove_codex_mcp() { @@ -554,32 +555,9 @@ install_claude_md_config() { local claude_md="$HOME/.claude/CLAUDE.md" mkdir -p "$HOME/.claude" - # Remove old rules (both legacy Chinese and new English versions) - if [[ -f "$claude_md" ]]; then - if grep -qE "$RULE_MARKER|$LEGACY_RULE_MARKER|## Gemini" "$claude_md" 2>/dev/null; then - echo "Removing old collaboration rules..." - python3 -c " -import re -with open('$claude_md', 'r', encoding='utf-8') as f: - content = f.read() -# Remove all collaboration rule sections -patterns = [ - r'## Codex Collaboration Rules.*?(?=\n## |\Z)', - r'## Codex 协作规则.*?(?=\n## |\Z)', - r'## Gemini Collaboration Rules.*?(?=\n## |\Z)', - r'## Gemini 协作规则.*?(?=\n## |\Z)', -] -for p in patterns: - content = re.sub(p, '', content, flags=re.DOTALL) -content = content.rstrip() + '\n' -with open('$claude_md', 'w', encoding='utf-8') as f: - f.write(content) -" - fi - fi - - cat >> "$claude_md" << 'AI_RULES' - + local ccb_content + ccb_content=$(cat << 'AI_RULES' + ## Codex Collaboration Rules Codex is another AI assistant running in a separate terminal session (WezTerm, iTerm2 or tmux). When user intent involves asking/consulting/collaborating with Codex: @@ -639,7 +617,48 @@ Examples: - "is gemini alive" -> gping - "don't wait for reply" -> gask - "get gemini result" -> TaskOutput(task_id) or gpend + AI_RULES +) + + if [[ -f "$claude_md" ]]; then + if grep -q "$CCB_START_MARKER" "$claude_md" 2>/dev/null; then + echo "Updating existing CCB config block..." + python3 -c " +import re +with open('$claude_md', 'r', encoding='utf-8') as f: + content = f.read() +pattern = r'.*?' +new_block = '''$ccb_content''' +content = re.sub(pattern, new_block, content, flags=re.DOTALL) +with open('$claude_md', 'w', encoding='utf-8') as f: + f.write(content) +" + elif grep -qE "$LEGACY_RULE_MARKER|## Codex Collaboration Rules|## Gemini" "$claude_md" 2>/dev/null; then + echo "Removing legacy rules and adding new CCB config block..." + python3 -c " +import re +with open('$claude_md', 'r', encoding='utf-8') as f: + content = f.read() +patterns = [ + r'## Codex Collaboration Rules.*?(?=\n## (?!Gemini)|\Z)', + r'## Codex 协作规则.*?(?=\n## |\Z)', + r'## Gemini Collaboration Rules.*?(?=\n## |\Z)', + r'## Gemini 协作规则.*?(?=\n## |\Z)', +] +for p in patterns: + content = re.sub(p, '', content, flags=re.DOTALL) +content = content.rstrip() + '\n' +with open('$claude_md', 'w', encoding='utf-8') as f: + f.write(content) +" + echo "$ccb_content" >> "$claude_md" + else + echo "$ccb_content" >> "$claude_md" + fi + else + echo "$ccb_content" > "$claude_md" + fi echo "Updated AI collaboration rules in $claude_md" } @@ -751,16 +770,32 @@ uninstall_claude_md_config() { return fi - if grep -qE "$RULE_MARKER|$LEGACY_RULE_MARKER|## Gemini" "$claude_md" 2>/dev/null; then - echo "正在移除 CLAUDE.md 中的协作规则..." + if grep -q "$CCB_START_MARKER" "$claude_md" 2>/dev/null; then + echo "正在移除 CLAUDE.md 中的 CCB 配置块..." + if command -v python3 >/dev/null 2>&1; then + python3 -c " +import re +with open('$claude_md', 'r', encoding='utf-8') as f: + content = f.read() +pattern = r'\n?.*?\n?' +content = re.sub(pattern, '\n', content, flags=re.DOTALL) +content = content.strip() + '\n' +with open('$claude_md', 'w', encoding='utf-8') as f: + f.write(content) +" + echo "已移除 CLAUDE.md 中的 CCB 配置" + else + echo "⚠️ 需要 python3 来清理 CLAUDE.md,请手动移除 CCB_CONFIG 区块" + fi + elif grep -qE "$LEGACY_RULE_MARKER|## Codex Collaboration Rules|## Gemini" "$claude_md" 2>/dev/null; then + echo "正在移除 CLAUDE.md 中的旧版协作规则..." if command -v python3 >/dev/null 2>&1; then python3 -c " import re with open('$claude_md', 'r', encoding='utf-8') as f: content = f.read() -# Remove all collaboration rule sections patterns = [ - r'## Codex Collaboration Rules.*?(?=\n## |\Z)', + r'## Codex Collaboration Rules.*?(?=\n## (?!Gemini)|\Z)', r'## Codex 协作规则.*?(?=\n## |\Z)', r'## Gemini Collaboration Rules.*?(?=\n## |\Z)', r'## Gemini 协作规则.*?(?=\n## |\Z)', From ccedf85ad1cc0e7c6fbe6f30b43c665e1b89e5dc Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 20 Dec 2025 10:55:36 +0800 Subject: [PATCH 010/153] fix(uninstall): clean commands from all possible locations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Check all candidate directories instead of just the first one - Remove commands from ~/.claude, ~/.config/claude, ~/.local/share/claude 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- install.sh | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/install.sh b/install.sh index ce2a546..77e4aca 100755 --- a/install.sh +++ b/install.sh @@ -893,13 +893,20 @@ uninstall_all() { done echo "已移除 bin 链接: $BIN_DIR" - # 3. 移除 Claude 命令文件 - local claude_dir - claude_dir="$(detect_claude_dir)" - for doc in "${CLAUDE_MARKDOWN[@]}"; do - rm -f "$claude_dir/$doc" + # 3. 移除 Claude 命令文件(清理所有可能的位置) + local cmd_dirs=( + "$HOME/.claude/commands" + "$HOME/.config/claude/commands" + "$HOME/.local/share/claude/commands" + ) + for dir in "${cmd_dirs[@]}"; do + if [[ -d "$dir" ]]; then + for doc in "${CLAUDE_MARKDOWN[@]}"; do + rm -f "$dir/$doc" + done + echo "已清理命令目录: $dir" + fi done - echo "已移除 Claude 命令: $claude_dir" # 4. 移除 CLAUDE.md 中的协作规则 uninstall_claude_md_config From 36b9f4b0918941e147770e0858f96b5f23fb1b30 Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 20 Dec 2025 12:32:34 +0800 Subject: [PATCH 011/153] refactor(i18n): convert project to English MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Convert all Chinese strings to English across: - lib/*.py (5 files): docstrings, comments, error messages - ccb: CLI help text and status messages - bin/* (8 files): script descriptions and error messages - commands/*.md (8 files): skill definitions - install.sh/install.ps1: prompts and messages - CLAUDE.md: project instructions Intentionally unchanged: - README.md: stays bilingual - install.sh legacy regex: matches old Chinese rules for cleanup 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- CLAUDE.md | 2 +- bin/cask | 14 +-- bin/cask-w | 6 +- bin/cpend | 12 +- bin/cping | 10 +- bin/gask | 6 +- bin/gask-w | 6 +- bin/gpend | 8 +- bin/gping | 6 +- ccb | 186 ++++++++++++++--------------- commands/cask-w.md | 40 +++---- commands/cask.md | 24 ++-- commands/cpend.md | 30 ++--- commands/cping.md | 30 ++--- commands/gask-w.md | 40 +++---- commands/gask.md | 28 ++--- commands/gpend.md | 14 +-- commands/gping.md | 14 +-- install.ps1 | 18 +-- install.sh | 246 +++++++++++++++++++-------------------- lib/codex_comm.py | 118 +++++++++---------- lib/codex_dual_bridge.py | 28 ++--- lib/gemini_comm.py | 116 +++++++++--------- lib/session_utils.py | 50 ++++---- lib/terminal.py | 40 +++---- 25 files changed, 546 insertions(+), 546 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 6f8b745..71c1623 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1 +1 @@ -- 该文件夹是 claude_code_bridge (ccb) 开发文件夹,要注意兼容性,同时修改代码注意同时修改install,安装使用install安装,完成后要git增加版本并推送 \ No newline at end of file +- This is the claude_code_bridge (ccb) development folder. Pay attention to compatibility. When modifying code, also update install scripts. Use install.sh/install.ps1 to install. After completion, git commit and push. \ No newline at end of file diff --git a/bin/cask b/bin/cask index 2a4a3bc..11c2da2 100755 --- a/bin/cask +++ b/bin/cask @@ -1,6 +1,6 @@ #!/usr/bin/env python3 """ -cask - 将消息转发到 Codex 会话 +cask - Forward message to Codex session """ from __future__ import annotations import json @@ -19,7 +19,7 @@ from terminal import get_backend_for_session, get_pane_id_from_session def _usage() -> None: - print("用法: cask <消息>", file=sys.stderr) + print("Usage: cask ", file=sys.stderr) def _load_session() -> Optional[dict]: @@ -48,10 +48,10 @@ def _load_session() -> Optional[dict]: def _resolve_session() -> Tuple[dict, str]: data = _load_session() if not data: - raise RuntimeError("❌ 未找到 Codex 会话,请先运行 ccb up codex") + raise RuntimeError("❌ Codex session not found, please run ccb up codex first") pane_id = get_pane_id_from_session(data) if not pane_id: - raise RuntimeError("❌ 会话配置无效") + raise RuntimeError("❌ Session config invalid") return data, pane_id @@ -69,12 +69,12 @@ def main(argv: list[str]) -> int: data, pane_id = _resolve_session() backend = get_backend_for_session(data) if not backend: - raise RuntimeError("❌ 无法初始化终端后端") + raise RuntimeError("❌ Cannot initialize terminal backend") if not backend.is_alive(pane_id): terminal = data.get("terminal", "tmux") - raise RuntimeError(f"❌ {terminal} 会话不存在: {pane_id}\n提示: 请确认 ccb 正在运行") + raise RuntimeError(f"❌ {terminal} session not found: {pane_id}\nHint: Please confirm ccb is running") backend.send_text(pane_id, raw_command) - print(f"✅ 已发送到 Codex ({pane_id})") + print(f"✅ Sent to Codex ({pane_id})") return 0 except Exception as exc: print(exc, file=sys.stderr) diff --git a/bin/cask-w b/bin/cask-w index 6ed97d1..29f3710 100755 --- a/bin/cask-w +++ b/bin/cask-w @@ -1,6 +1,6 @@ #!/usr/bin/env python3 """ -cask-w - 同步发送消息到 Codex 并等待回复 +cask-w - Sync send message to Codex and wait for reply """ from __future__ import annotations import sys @@ -17,12 +17,12 @@ from codex_comm import CodexCommunicator def main(argv: list[str]) -> int: if len(argv) <= 1: - print("用法: cask-w <消息>", file=sys.stderr) + print("Usage: cask-w ", file=sys.stderr) return 1 message = " ".join(argv[1:]).strip() if not message: - print("❌ 消息内容不能为空", file=sys.stderr) + print("❌ Message cannot be empty", file=sys.stderr) return 1 try: diff --git a/bin/cpend b/bin/cpend index e6007e0..c00236b 100755 --- a/bin/cpend +++ b/bin/cpend @@ -1,6 +1,6 @@ #!/usr/bin/env python3 """ -cpend - 查看 Codex 最新回复 +cpend - View latest Codex reply """ import json @@ -16,12 +16,12 @@ setup_windows_encoding() try: from codex_comm import CodexCommunicator except ImportError as exc: - print(f"导入失败: {exc}") + print(f"Import failed: {exc}") sys.exit(1) def _load_pending_state() -> dict: - """从 .codex-session 加载 cask-w 超时时保存的状态""" + """Load pending state saved by cask-w timeout from .codex-session""" session_file = Path.cwd() / ".codex-session" if not session_file.exists(): return {} @@ -34,7 +34,7 @@ def _load_pending_state() -> dict: def _clear_pending_state() -> None: - """清除 pending_state""" + """Clear pending_state""" session_file = Path.cwd() / ".codex-session" if not session_file.exists(): return @@ -69,10 +69,10 @@ def main() -> int: if output: print(output) else: - print('暂无 Codex 回复') + print('No Codex reply available') return 0 except Exception as exc: - print(f"❌ 执行失败: {exc}") + print(f"❌ Execution failed: {exc}") return 1 diff --git a/bin/cping b/bin/cping index 8924c71..79bad6d 100755 --- a/bin/cping +++ b/bin/cping @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """ -cping 命令入口点 -测试与 Codex 的连通性 +cping command entry point +Test connectivity with Codex """ import sys @@ -25,13 +25,13 @@ try: return 0 if healthy else 1 except Exception as e: - print(f"❌ 连通性测试失败: {e}") + print(f"❌ Connectivity test failed: {e}") return 1 if __name__ == "__main__": sys.exit(main()) except ImportError as e: - print(f"❌ 导入模块失败: {e}") - print("请确保 codex_comm.py 在同一目录下") + print(f"❌ Module import failed: {e}") + print("Please ensure codex_comm.py is in the same directory") sys.exit(1) diff --git a/bin/gask b/bin/gask index 97204c1..dba7dc8 100755 --- a/bin/gask +++ b/bin/gask @@ -1,6 +1,6 @@ #!/usr/bin/env python3 """ -gask - 异步发送消息到 Gemini +gask - Async send message to Gemini """ from __future__ import annotations @@ -19,12 +19,12 @@ from gemini_comm import GeminiCommunicator def main(argv: list[str]) -> int: if len(argv) <= 1: - print("用法: gask <消息>", file=sys.stderr) + print("Usage: gask ", file=sys.stderr) return 1 message = " ".join(argv[1:]).strip() if not message: - print("❌ 消息内容不能为空", file=sys.stderr) + print("❌ Message cannot be empty", file=sys.stderr) return 1 try: diff --git a/bin/gask-w b/bin/gask-w index ee14acc..c1a1d0b 100755 --- a/bin/gask-w +++ b/bin/gask-w @@ -1,6 +1,6 @@ #!/usr/bin/env python3 """ -gask-w - 同步发送消息到 Gemini 并等待回复 +gask-w - Sync send message to Gemini and wait for reply """ from __future__ import annotations @@ -19,12 +19,12 @@ from gemini_comm import GeminiCommunicator def main(argv: list[str]) -> int: if len(argv) <= 1: - print("用法: gask-w <消息>", file=sys.stderr) + print("Usage: gask-w ", file=sys.stderr) return 1 message = " ".join(argv[1:]).strip() if not message: - print("❌ 消息内容不能为空", file=sys.stderr) + print("❌ Message cannot be empty", file=sys.stderr) return 1 try: diff --git a/bin/gpend b/bin/gpend index 1cbcb85..03967a9 100755 --- a/bin/gpend +++ b/bin/gpend @@ -1,6 +1,6 @@ #!/usr/bin/env python3 """ -gpend - 查看 Gemini 最新回复 +gpend - View latest Gemini reply """ import sys @@ -15,7 +15,7 @@ setup_windows_encoding() try: from gemini_comm import GeminiCommunicator except ImportError as exc: - print(f"导入失败: {exc}") + print(f"Import failed: {exc}") sys.exit(1) @@ -26,10 +26,10 @@ def main() -> int: if output: print(output) else: - print('暂无 Gemini 回复') + print('No Gemini reply available') return 0 except Exception as exc: - print(f"❌ 执行失败: {exc}") + print(f"❌ Execution failed: {exc}") return 1 diff --git a/bin/gping b/bin/gping index 184d0f5..d78e07f 100755 --- a/bin/gping +++ b/bin/gping @@ -1,6 +1,6 @@ #!/usr/bin/env python3 """ -gping - 测试 Gemini 连通性 +gping - Test Gemini connectivity """ import sys @@ -22,12 +22,12 @@ try: print(message) return 0 if healthy else 1 except Exception as e: - print(f"❌ Gemini 连通性测试失败: {e}") + print(f"❌ Gemini connectivity test failed: {e}") return 1 if __name__ == "__main__": sys.exit(main()) except ImportError as e: - print(f"❌ 导入模块失败: {e}") + print(f"❌ Module import failed: {e}") sys.exit(1) diff --git a/ccb b/ccb index aafd9ac..32cef31 100755 --- a/ccb +++ b/ccb @@ -1,8 +1,8 @@ #!/usr/bin/env python3 """ -ccb (Claude Code Bridge) - 统一 AI 启动器 -支持 Claude + Codex / Claude + Gemini / 三者同时 -支持 tmux、WezTerm 和 iTerm2 终端 +ccb (Claude Code Bridge) - Unified AI Launcher +Supports Claude + Codex / Claude + Gemini / all three simultaneously +Supports tmux, WezTerm and iTerm2 terminals """ import sys @@ -87,32 +87,32 @@ class AILauncher: self.processes = {} def _detect_terminal_type(self): - # 环境变量强制指定 + # Forced by environment variable forced = (os.environ.get("CCB_TERMINAL") or os.environ.get("CODEX_TERMINAL") or "").strip().lower() if forced in {"wezterm", "tmux"}: return forced - # 在 WezTerm pane 内时,强制使用 wezterm,完全不依赖 tmux + # When inside WezTerm pane, force wezterm, no tmux dependency if os.environ.get("WEZTERM_PANE"): return "wezterm" - # 只有在 iTerm2 环境中才用 iTerm2 分屏 + # Only use iTerm2 split when in iTerm2 environment if os.environ.get("ITERM_SESSION_ID"): return "iterm2" - # 使用 detect_terminal() 自动检测(WezTerm 优先) + # Use detect_terminal() for auto-detection (WezTerm preferred) detected = detect_terminal() if detected: return detected - # 兜底:如果都没有,返回 None 让后续逻辑处理 + # Fallback: if nothing found, return None for later handling return None def _detect_launch_terminal(self): - """选择用于启动新窗口的终端程序(仅 tmux 模式下使用)""" - # WezTerm 模式不需要外部终端程序 + """Select terminal program for launching new windows (tmux mode only)""" + # WezTerm mode doesn't need external terminal program if self.terminal_type == "wezterm": return None - # tmux 模式下选择终端 + # tmux mode: select terminal terminals = ["gnome-terminal", "konsole", "alacritty", "xterm"] for term in terminals: if shutil.which(term): @@ -120,7 +120,7 @@ class AILauncher: return "tmux" def _launch_script_in_macos_terminal(self, script_file: Path) -> bool: - """macOS: 使用 Terminal.app 打开新窗口执行脚本(避免 tmux launcher 嵌套导致交互失败)""" + """macOS: Use Terminal.app to open new window for script (avoid tmux launcher nesting issues)""" if platform.system() != "Darwin": return False if not shutil.which("osascript"): @@ -140,35 +140,35 @@ class AILauncher: return True def _start_provider(self, provider: str) -> bool: - # 处理未检测到终端的情况 + # Handle case when no terminal detected if self.terminal_type is None: - print("❌ 未检测到可用的终端后端(WezTerm 或 tmux)") - print(" 解决方案:") - print(" - 安装 WezTerm(推荐): https://wezfurlong.org/wezterm/") - print(" - 或安装 tmux") - print(" - 或设置环境变量 CCB_TERMINAL=wezterm 并配置 CODEX_WEZTERM_BIN") + print("❌ No terminal backend detected (WezTerm or tmux)") + print(" Solutions:") + print(" - Install WezTerm (recommended): https://wezfurlong.org/wezterm/") + print(" - Or install tmux") + print(" - Or set CCB_TERMINAL=wezterm and configure CODEX_WEZTERM_BIN") return False - # WezTerm 模式:完全不依赖 tmux + # WezTerm mode: no tmux dependency if self.terminal_type == "wezterm": - print(f"🚀 启动 {provider.capitalize()} 后端 (wezterm)...") + print(f"🚀 Starting {provider.capitalize()} backend (wezterm)...") return self._start_provider_wezterm(provider) elif self.terminal_type == "iterm2": return self._start_provider_iterm2(provider) - # tmux 模式:检查 tmux 是否可用 + # tmux mode: check if tmux is available if not shutil.which("tmux"): - # 尝试 fallback 到 WezTerm + # Try fallback to WezTerm if detect_terminal() == "wezterm": self.terminal_type = "wezterm" - print(f"🚀 启动 {provider.capitalize()} 后端 (wezterm - tmux 不可用)...") + print(f"🚀 Starting {provider.capitalize()} backend (wezterm - tmux unavailable)...") return self._start_provider_wezterm(provider) else: - print("❌ tmux 未安装,且 WezTerm 不可用") - print(" 解决方案: 安装 WezTerm(推荐)或 tmux") + print("❌ tmux not installed and WezTerm unavailable") + print(" Solution: Install WezTerm (recommended) or tmux") return False - print(f"🚀 启动 {provider.capitalize()} 后端 (tmux)...") + print(f"🚀 Starting {provider.capitalize()} backend (tmux)...") tmux_session = f"{provider}-{int(time.time()) % 100000}-{os.getpid()}" self.tmux_sessions[provider] = tmux_session @@ -178,7 +178,7 @@ class AILauncher: elif provider == "gemini": return self._start_gemini(tmux_session) else: - print(f"❌ 未知的 provider: {provider}") + print(f"❌ Unknown provider: {provider}") return False def _start_provider_wezterm(self, provider: str) -> bool: @@ -206,12 +206,12 @@ class AILauncher: if provider == "codex": input_fifo = runtime / "input.fifo" output_fifo = runtime / "output.fifo" - # WezTerm 模式通过 pane 注入文本,不强依赖 FIFO;Windows/WSL 场景也不一定支持 mkfifo。 + # WezTerm mode injects text via pane, no strong FIFO dependency; Windows/WSL may not support mkfifo self._write_codex_session(runtime, None, input_fifo, output_fifo, pane_id=pane_id) else: self._write_gemini_session(runtime, None, pane_id=pane_id) - print(f"✅ {provider.capitalize()} 已启动 (wezterm pane: {pane_id})") + print(f"✅ {provider.capitalize()} started (wezterm pane: {pane_id})") return True def _start_provider_iterm2(self, provider: str) -> bool: @@ -219,7 +219,7 @@ class AILauncher: runtime.mkdir(parents=True, exist_ok=True) start_cmd = self._get_start_cmd(provider) - # iTerm2 分屏里,进程退出会导致 pane 直接关闭;默认保持 pane 打开便于查看退出信息。 + # In iTerm2 split, process exit will close pane; keep pane open by default to view exit info keep_open = os.environ.get("CODEX_ITERM2_KEEP_OPEN", "1").lower() not in {"0", "false", "no", "off"} if keep_open: start_cmd = ( @@ -245,12 +245,12 @@ class AILauncher: if provider == "codex": input_fifo = runtime / "input.fifo" output_fifo = runtime / "output.fifo" - # iTerm2 模式通过 pane 注入文本,不强依赖 FIFO + # iTerm2 mode injects text via pane, no strong FIFO dependency self._write_codex_session(runtime, None, input_fifo, output_fifo, pane_id=pane_id) else: self._write_gemini_session(runtime, None, pane_id=pane_id) - print(f"✅ {provider.capitalize()} 已启动 (iterm2 session: {pane_id})") + print(f"✅ {provider.capitalize()} started (iterm2 session: {pane_id})") return True def _work_dir_strings(self, work_dir: Path) -> list[str]: @@ -414,8 +414,8 @@ class AILauncher: def _get_start_cmd(self, provider: str) -> str: if provider == "codex": - # NOTE: Codex TUI 有 paste-burst 检测;终端注入(wezterm send-text/tmux paste-buffer) - # 往往会被识别为“粘贴”,导致回车仅换行不提交。默认关闭该检测,保证自动通信可用。 + # NOTE: Codex TUI has paste-burst detection; terminal injection (wezterm send-text/tmux paste-buffer) + # is often detected as "paste", causing Enter to only line-break not submit. Disable detection by default. return self._build_codex_start_cmd() elif provider == "gemini": return self._build_gemini_start_cmd() @@ -487,7 +487,7 @@ exec tmux attach -t "$TMUX_SESSION" else: subprocess.Popen([terminal, "-e", str(script_file)]) - print(f"✅ Codex 已启动 (tmux: {tmux_session})") + print(f"✅ Codex started (tmux: {tmux_session})") return True def _start_gemini(self, tmux_session: str) -> bool: @@ -500,7 +500,7 @@ exec tmux attach -t "$TMUX_SESSION" self._write_gemini_session(runtime, tmux_session) - # 创建启动脚本 + # Create startup script wrapper = f'''#!/bin/bash cd "{os.getcwd()}" tmux new-session -d -s "{tmux_session}" 2>/dev/null || true @@ -515,7 +515,7 @@ exec tmux attach -t "$TMUX_SESSION" if self._launch_script_in_macos_terminal(script_file): pass else: - # 纯 tmux 模式 + # Pure tmux mode subprocess.run(["tmux", "new-session", "-d", "-s", tmux_session], check=True, cwd=os.getcwd()) backend = TmuxBackend() deadline = time.time() + 1.0 @@ -530,20 +530,20 @@ exec tmux attach -t "$TMUX_SESSION" time.sleep(sleep_s) sleep_s = min(0.2, sleep_s * 2) else: - # 打开新终端窗口 + # Open new terminal window subprocess.Popen([terminal, "--", str(script_file)]) - print(f"✅ Gemini 已启动 (tmux: {tmux_session})") + print(f"✅ Gemini started (tmux: {tmux_session})") return True def _write_codex_session(self, runtime, tmux_session, input_fifo, output_fifo, pane_id=None): session_file = Path.cwd() / ".codex-session" - # 预检查权限 + # Pre-check permissions writable, reason, fix = check_session_writable(session_file) if not writable: - print(f"❌ 无法写入 {session_file.name}: {reason}", file=sys.stderr) - print(f"💡 解决方案: {fix}", file=sys.stderr) + print(f"❌ Cannot write {session_file.name}: {reason}", file=sys.stderr) + print(f"💡 Fix: {fix}", file=sys.stderr) return False data = {} @@ -576,11 +576,11 @@ exec tmux attach -t "$TMUX_SESSION" def _write_gemini_session(self, runtime, tmux_session, pane_id=None): session_file = Path.cwd() / ".gemini-session" - # 预检查权限 + # Pre-check permissions writable, reason, fix = check_session_writable(session_file) if not writable: - print(f"❌ 无法写入 {session_file.name}: {reason}", file=sys.stderr) - print(f"💡 解决方案: {fix}", file=sys.stderr) + print(f"❌ Cannot write {session_file.name}: {reason}", file=sys.stderr) + print(f"💡 Fix: {fix}", file=sys.stderr) return False data = { @@ -689,7 +689,7 @@ exec tmux attach -t "$TMUX_SESSION" ) def _start_claude(self) -> int: - print("🚀 启动 Claude...") + print("🚀 Starting Claude...") env = os.environ.copy() if "codex" in self.providers: @@ -744,29 +744,29 @@ exec tmux attach -t "$TMUX_SESSION" cmd.extend(["--session-id", new_id]) self._write_local_claude_session(new_id, active=True) - print(f"📋 会话ID: {self.session_id}") - print(f"📁 运行目录: {self.runtime_dir}") - print(f"🔌 活跃后端: {', '.join(self.providers)}") + print(f"📋 Session ID: {self.session_id}") + print(f"📁 Runtime dir: {self.runtime_dir}") + print(f"🔌 Active backends: {', '.join(self.providers)}") print() - print("🎯 可用命令:") + print("🎯 Available commands:") if "codex" in self.providers: - print(" cask/cask-w/cping/cpend - Codex 通信") + print(" cask/cask-w/cping/cpend - Codex communication") if "gemini" in self.providers: - print(" gask/gask-w/gping/gpend - Gemini 通信") + print(" gask/gask-w/gping/gpend - Gemini communication") print() - print(f"执行: {' '.join(cmd)}") + print(f"Executing: {' '.join(cmd)}") try: return subprocess.run(cmd, stdin=sys.stdin, stdout=sys.stdout, stderr=sys.stderr, env=env).returncode except KeyboardInterrupt: - print("\n⚠️ 用户中断") + print("\n⚠️ User interrupted") return 130 def cleanup(self): if self._cleaned: return self._cleaned = True - print("\n🧹 清理会话资源...") + print("\n🧹 Cleaning up session resources...") if self.terminal_type == "wezterm": backend = WeztermBackend() @@ -797,14 +797,14 @@ exec tmux attach -t "$TMUX_SESSION" if self.runtime_dir.exists(): shutil.rmtree(self.runtime_dir, ignore_errors=True) - print("✅ 清理完成") + print("✅ Cleanup complete") def run_up(self) -> int: git_info = _get_git_info() version_str = f"v{VERSION}" + (f" ({git_info})" if git_info else "") print(f"🚀 Claude Code Bridge {version_str}") print(f"📅 {time.strftime('%Y-%m-%d %H:%M:%S')}") - print(f"🔌 后端: {', '.join(self.providers)}") + print(f"🔌 Backends: {', '.join(self.providers)}") print("=" * 50) atexit.register(self.cleanup) @@ -823,7 +823,7 @@ exec tmux attach -t "$TMUX_SESSION" self._warmup_provider(provider) if self.no_claude: - print("✅ 后端已启动(--no-claude 模式)") + print("✅ Backends started (--no-claude mode)") print() for provider in self.providers: if self.terminal_type == "wezterm": @@ -839,7 +839,7 @@ exec tmux attach -t "$TMUX_SESSION" if tmux: print(f" {provider}: tmux attach -t {tmux}") print() - print(f"终止: ccb kill {' '.join(self.providers)}") + print(f"Kill: ccb kill {' '.join(self.providers)}") atexit.unregister(self.cleanup) return 0 @@ -866,7 +866,7 @@ def cmd_status(args): for provider in providers: session_file = Path.cwd() / f".{provider}-session" if not session_file.exists(): - results[provider] = {"status": "未配置", "active": False} + results[provider] = {"status": "Not configured", "active": False} continue try: @@ -888,16 +888,16 @@ def cmd_status(args): alive = False results[provider] = { - "status": "运行中" if (active and alive) else "已停止", + "status": "Running" if (active and alive) else "Stopped", "active": active and alive, "terminal": terminal, "pane_id": pane_id, "runtime_dir": data.get("runtime_dir", ""), } except Exception as e: - results[provider] = {"status": f"错误: {e}", "active": False} + results[provider] = {"status": f"Error: {e}", "active": False} - print("📊 AI 后端状态:") + print("📊 AI backend status:") for provider, info in results.items(): icon = "✅" if info.get("active") else "❌" print(f" {icon} {provider.capitalize()}: {info['status']}") @@ -913,7 +913,7 @@ def cmd_kill(args): for provider in providers: session_file = Path.cwd() / f".{provider}-session" if not session_file.exists(): - print(f"⚠️ {provider}: 未找到会话文件") + print(f"⚠️ {provider}: Session file not found") continue try: @@ -935,7 +935,7 @@ def cmd_kill(args): data["ended_at"] = time.strftime("%Y-%m-%d %H:%M:%S") session_file.write_text(json.dumps(data, ensure_ascii=False, indent=2)) - print(f"✅ {provider.capitalize()} 已终止") + print(f"✅ {provider.capitalize()} terminated") except Exception as e: print(f"❌ {provider}: {e}") @@ -948,7 +948,7 @@ def cmd_restore(args): for provider in providers: session_file = Path.cwd() / f".{provider}-session" if not session_file.exists(): - print(f"⚠️ {provider}: 未找到会话文件") + print(f"⚠️ {provider}: Session file not found") continue try: @@ -1037,14 +1037,14 @@ def cmd_restore(args): break if has_history: - print(f"ℹ️ {provider}: 会话已结束,但可恢复历史会话") + print(f"ℹ️ {provider}: Session ended but history recoverable") if session_id: - print(f" 会话ID: {session_id[:8]}...") - print(f" 使用: ccb up {provider} -r") + print(f" Session ID: {session_id[:8]}...") + print(f" Use: ccb up {provider} -r") else: - print(f"⚠️ {provider}: 会话已结束,无可恢复历史") + print(f"⚠️ {provider}: Session ended, no recoverable history") else: - print(f"⚠️ {provider}: 会话已丢失,使用 ccb up {provider} -r 重启") + print(f"⚠️ {provider}: Session lost, use ccb up {provider} -r to restart") except Exception as e: print(f"❌ {provider}: {e}") @@ -1140,7 +1140,7 @@ def cmd_update(args): tmp_dir.mkdir(parents=True, exist_ok=True) tarball_path = tmp_dir / "main.tar.gz" - # 优先使用 curl/wget(更好的证书处理) + # Prefer curl/wget (better certificate handling) downloaded = False if shutil.which("curl"): result = subprocess.run( @@ -1155,12 +1155,12 @@ def cmd_update(args): ) downloaded = result.returncode == 0 if not downloaded: - # 回退到 urllib(可能有 SSL 问题) + # Fallback to urllib (may have SSL issues) import ssl try: urllib.request.urlretrieve(tarball_url, tarball_path) except ssl.SSLError: - print("⚠️ SSL 证书验证失败,尝试跳过验证...") + print("⚠️ SSL certificate verification failed, trying to skip...") ctx = ssl.create_default_context() ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE @@ -1187,7 +1187,7 @@ def cmd_update(args): subprocess.run([str(extracted_dir / "install.sh"), "install"], check=True, env=env) print("✅ Update complete!") - print("💡 推荐:安装 WezTerm 作为终端前端(分屏/滚动体验更好),详情见 README。") + print("💡 Recommended: Install WezTerm as terminal frontend (better split/scroll experience), see README.") return 0 except Exception as e: @@ -1200,29 +1200,29 @@ def cmd_update(args): def main(): - parser = argparse.ArgumentParser(description="Claude AI 统一启动器", add_help=True) - subparsers = parser.add_subparsers(dest="command", help="子命令") + parser = argparse.ArgumentParser(description="Claude AI unified launcher", add_help=True) + subparsers = parser.add_subparsers(dest="command", help="Subcommands") - # up 子命令 - up_parser = subparsers.add_parser("up", help="启动 AI 后端") - up_parser.add_argument("providers", nargs="*", choices=["codex", "gemini"], help="要启动的后端") - up_parser.add_argument("-r", "--resume", action="store_true", help="恢复上下文") - up_parser.add_argument("-a", "--auto", action="store_true", help="全自动权限模式") - up_parser.add_argument("--no-claude", action="store_true", help="不启动 Claude 主窗口") + # up subcommand + up_parser = subparsers.add_parser("up", help="Start AI backends") + up_parser.add_argument("providers", nargs="*", choices=["codex", "gemini"], help="Backends to start") + up_parser.add_argument("-r", "--resume", action="store_true", help="Resume context") + up_parser.add_argument("-a", "--auto", action="store_true", help="Full auto permission mode") + up_parser.add_argument("--no-claude", action="store_true", help="Don't start Claude main window") - # status 子命令 - status_parser = subparsers.add_parser("status", help="检查状态") - status_parser.add_argument("providers", nargs="*", default=[], help="要检查的后端 (codex/gemini)") + # status subcommand + status_parser = subparsers.add_parser("status", help="Check status") + status_parser.add_argument("providers", nargs="*", default=[], help="Backends to check (codex/gemini)") - # kill 子命令 - kill_parser = subparsers.add_parser("kill", help="终止会话") - kill_parser.add_argument("providers", nargs="*", default=[], help="要终止的后端 (codex/gemini)") + # kill subcommand + kill_parser = subparsers.add_parser("kill", help="Terminate session") + kill_parser.add_argument("providers", nargs="*", default=[], help="Backends to terminate (codex/gemini)") - # restore 子命令 - restore_parser = subparsers.add_parser("restore", help="恢复/attach 会话") - restore_parser.add_argument("providers", nargs="*", default=[], help="要恢复的后端 (codex/gemini)") + # restore subcommand + restore_parser = subparsers.add_parser("restore", help="Restore/attach session") + restore_parser.add_argument("providers", nargs="*", default=[], help="Backends to restore (codex/gemini)") - # update 子命令 + # update subcommand update_parser = subparsers.add_parser("update", help="Update to latest version") args = parser.parse_args() diff --git a/commands/cask-w.md b/commands/cask-w.md index e3f3ae7..487d0c9 100644 --- a/commands/cask-w.md +++ b/commands/cask-w.md @@ -1,25 +1,25 @@ -通过 `cask-w` 命令将指令转发到 Codex 会话并等待回复(支持 tmux / WezTerm,仅转发,不在当前 Claude 进程执行)。 +Forward commands to Codex session and wait for reply via `cask-w` command (supports tmux / WezTerm, forward only, does not execute in current Claude process). -执行方式: -- 后台运行 `Bash(cask-w "<转发内容>", run_in_background=true)` -- 发送后立即继续对话,不阻塞等待 -- 需要结果时使用 `TaskOutput(task_id, block=true)` 获取 +Execution: +- Run in background `Bash(cask-w "", run_in_background=true)` +- Continue conversation immediately after sending, no blocking wait +- Use `TaskOutput(task_id, block=true)` to get result when needed -参数说明: -- `<转发内容>` 必填,会被转发到 Codex 会话 -- 返回 task_id,可用于后续获取结果 +Parameters: +- `` required, will be forwarded to Codex session +- Returns task_id for later result retrieval -交互流程: -1. 后台发送到 Codex -2. 立即返回 task_id -3. Claude 继续处理其他任务 -4. 需要时通过 TaskOutput 获取回复 +Workflow: +1. Send to Codex in background +2. Return task_id immediately +3. Claude continues with other tasks +4. Use TaskOutput to get reply when needed -示例: -- `Bash(cask-w "1+2", run_in_background=true)` -> 返回 task_id -- `TaskOutput(task_id, block=true)` -> 获取 Codex 回复 +Examples: +- `Bash(cask-w "1+2", run_in_background=true)` -> returns task_id +- `TaskOutput(task_id, block=true)` -> get Codex reply -提示: -- 发送后可继续对话,无需等待 -- 使用 `/cpend` 查看最新回复 -- 使用 `TaskOutput` 获取特定任务结果 +Hints: +- Can continue conversation after sending, no need to wait +- Use `/cpend` to view latest reply +- Use `TaskOutput` to get specific task result diff --git a/commands/cask.md b/commands/cask.md index 75a12e0..d8ec24f 100644 --- a/commands/cask.md +++ b/commands/cask.md @@ -1,18 +1,18 @@ -通过 `cask` 命令将指令转发到 Codex 会话(支持 tmux / WezTerm,仅转发,不在当前 Claude 进程执行)。 +Forward commands to Codex session via `cask` command (supports tmux / WezTerm, forward only, does not execute in current Claude process). -执行方式: -- 沉默运行 `Bash(cask "<转发内容>")`,执行完毕后不做其他分析、推理或额外操作 -- 在终端中也可执行 `cask <转发内容>`,效果等同 +Execution: +- Run silently `Bash(cask "")`, no additional analysis or operations after execution +- Can also run `cask ` in terminal with same effect -参数说明: -- `<转发内容>` 必填,会被转发到 Codex 会话(例如 `pwd`、`ls` 等命令) -- ⚠️ 注意:cask 仅负责转发,不在本 Claude 进程执行,返回后立即结束 +Parameters: +- `` required, will be forwarded to Codex session (e.g. `pwd`, `ls` commands) +- Note: cask only forwards, does not execute in Claude process, returns immediately after -示例: +Examples: - `Bash(cask "pwd")` - `Bash(cask "ls -la")` -提示: -- cask 发送命令后立即返回,不等待结果 -- 如需等待 Codex 回复,请使用 `/cask-w` -- cask 返回后表示转发完成,无需继续执行任何操作 +Hints: +- cask returns immediately after sending, does not wait for result +- Use `/cask-w` if you need to wait for Codex reply +- After cask returns, forwarding is complete, no further action needed diff --git a/commands/cpend.md b/commands/cpend.md index 6f2423a..a514e16 100644 --- a/commands/cpend.md +++ b/commands/cpend.md @@ -1,19 +1,19 @@ -使用 `cpend` 从 Codex 官方日志中抓取最新回复,适合异步模式或超时后的补充查询。 +Use `cpend` to fetch latest reply from Codex official logs, suitable for async mode or follow-up queries after timeout. -执行方式: -- Claude 端使用 `Bash(cpend)`,命令执行过程保持静默 -- 本地终端可直接运行 `cpend` +Execution: +- Use `Bash(cpend)` on Claude side, keep command execution silent +- Run `cpend` directly in local terminal -功能特点: -1. 解析 `.codex-session` 记录的日志路径,定位本次会话的最新 JSONL 文件 -2. 读取尾部消息并返回 Codex 最近一次输出 -3. 若无新内容,将提示“暂无 Codex 回复” +Features: +1. Parses log path recorded in `.codex-session`, locates latest JSONL file for current session +2. Reads tail messages and returns Codex's most recent output +3. If no new content, will prompt "No Codex reply yet" -常见场景: -- `cask` 异步提交多条任务后集中查看结果 -- `cask-w` 因超时退出后手动确认 Codex 是否已回应 -- 需要核对 Codex 回复与原始问题是否匹配 +Common scenarios: +- View results after submitting multiple tasks via `cask` async +- Manually confirm if Codex has responded after `cask-w` timeout exit +- Need to verify if Codex reply matches original question -提示: -- 日志文件通常位于 `~/.codex/sessions/.../rollout-.jsonl` -- 如果命令返回空,请先确认 Codex 会话仍在运行(可用 `/cping` 检查) +Hints: +- Log file usually located at `~/.codex/sessions/.../rollout-.jsonl` +- If command returns empty, first confirm Codex session is still running (use `/cping` to check) diff --git a/commands/cping.md b/commands/cping.md index 5b3a5bc..9be1f1c 100644 --- a/commands/cping.md +++ b/commands/cping.md @@ -1,19 +1,19 @@ -使用 `cping` 检查当前 Codex 会话是否健康,快速定位通信问题。 +Use `cping` to check if current Codex session is healthy, quickly locate communication issues. -执行方式: -- Claude 端运行 `Bash(cping)`,无需输出命令执行过程 -- 本地终端直接执行 `cping` +Execution: +- Run `Bash(cping)` on Claude side, no need to output command execution process +- Run `cping` directly in local terminal -检测内容: -1. `.codex-session` 是否标记为活跃,运行目录是否存在 -2. tmux 模式:FIFO 管道是否仍可访问 -3. tmux 模式:Codex 侧进程是否存活(根据 `codex.pid` 验证) -4. WezTerm 模式:pane 是否仍存在(根据 `wezterm cli list` 检测) +Detection items: +1. Is `.codex-session` marked as active, does runtime directory exist +2. tmux mode: Is FIFO pipe still accessible +3. tmux mode: Is Codex side process alive (verified by `codex.pid`) +4. WezTerm mode: Does pane still exist (detected via `wezterm cli list`) -输出说明: -- 成功:`✅ Codex连接正常 (...)` -- 失败:列出缺失的组件或异常信息,便于进一步排查 +Output: +- Success: `Codex connection OK (...)` +- Failure: Lists missing components or error info for further troubleshooting -提示: -- 若检测失败,可尝试重新运行 `ccb up codex` 或查看桥接日志 -- 在多次超时或无回复时,先执行 `cping` 再决定是否重启会话 +Hints: +- If detection fails, try re-running `ccb up codex` or check bridge logs +- On multiple timeouts or no response, run `cping` first before deciding to restart session diff --git a/commands/gask-w.md b/commands/gask-w.md index 3c8c0ac..2b9a72c 100644 --- a/commands/gask-w.md +++ b/commands/gask-w.md @@ -1,25 +1,25 @@ -通过 `gask-w` 命令将指令转发到 Gemini 会话,并同步等待回复(支持 tmux / WezTerm)。 +Forward commands to Gemini session and wait for reply via `gask-w` command (supports tmux / WezTerm). -执行方式: -- 后台运行 `Bash(gask-w "<转发内容>", run_in_background=true)` -- 发送后立即继续对话,不阻塞等待 -- 需要结果时使用 `TaskOutput(task_id, block=true)` 获取 +Execution: +- Run in background `Bash(gask-w "", run_in_background=true)` +- Continue conversation immediately after sending, no blocking wait +- Use `TaskOutput(task_id, block=true)` to get result when needed -参数说明: -- `<转发内容>` 必填,会被转发到 Gemini 会话 -- 返回 task_id,可用于后续获取结果 +Parameters: +- `` required, will be forwarded to Gemini session +- Returns task_id for later result retrieval -交互流程: -1. 后台发送到 Gemini -2. 立即返回 task_id -3. Claude 继续处理其他任务 -4. 需要时通过 TaskOutput 获取回复 +Workflow: +1. Send to Gemini in background +2. Return task_id immediately +3. Claude continues with other tasks +4. Use TaskOutput to get reply when needed -示例: -- `Bash(gask-w "解释一下这段代码", run_in_background=true)` -> 返回 task_id -- `TaskOutput(task_id, block=true)` -> 获取 Gemini 回复 +Examples: +- `Bash(gask-w "explain this code", run_in_background=true)` -> returns task_id +- `TaskOutput(task_id, block=true)` -> get Gemini reply -提示: -- 发送后可继续对话,无需等待 -- 使用 `/gpend` 查看最新回复 -- 使用 `TaskOutput` 获取特定任务结果 +Hints: +- Can continue conversation after sending, no need to wait +- Use `/gpend` to view latest reply +- Use `TaskOutput` to get specific task result diff --git a/commands/gask.md b/commands/gask.md index 2a0a8cf..f55acf9 100644 --- a/commands/gask.md +++ b/commands/gask.md @@ -1,18 +1,18 @@ -通过 `gask` 命令将指令转发到 Gemini 会话(支持 tmux / WezTerm,仅转发,不在当前 Claude 进程执行)。 +Forward commands to Gemini session via `gask` command (supports tmux / WezTerm, forward only, does not execute in current Claude process). -执行方式: -- 沉默运行 `Bash(gask "<转发内容>")`,执行完毕后不做其他分析、推理或额外操作 -- 在终端中也可执行 `gask <转发内容>`,效果等同 +Execution: +- Run silently `Bash(gask "")`, no additional analysis or operations after execution +- Can also run `gask ` in terminal with same effect -参数说明: -- `<转发内容>` 必填,会被转发到 Gemini 会话 -- ⚠️ 注意:gask 仅负责转发,不在本 Claude 进程执行,返回后立即结束 +Parameters: +- `` required, will be forwarded to Gemini session +- Note: gask only forwards, does not execute in Claude process, returns immediately after -示例: -- `Bash(gask "解释一下这段代码")` -- `Bash(gask "帮我优化这个函数")` +Examples: +- `Bash(gask "explain this code")` +- `Bash(gask "help me optimize this function")` -提示: -- gask 发送命令后立即返回,不等待结果 -- 如需等待 Gemini 回复,请使用 `/gask-w` -- gask 返回后表示转发完成,无需继续执行任何操作 +Hints: +- gask returns immediately after sending, does not wait for result +- Use `/gask-w` if you need to wait for Gemini reply +- After gask returns, forwarding is complete, no further action needed diff --git a/commands/gpend.md b/commands/gpend.md index 86b197b..389c268 100644 --- a/commands/gpend.md +++ b/commands/gpend.md @@ -1,9 +1,9 @@ -通过 `gpend` 命令查看 Gemini 最新回复。 +View latest Gemini reply via `gpend` command. -执行方式: -- 沉默运行 `Bash(gpend)`,执行完毕后不做其他分析、推理或额外操作 -- 在终端中也可执行 `gpend`,效果等同 +Execution: +- Run silently `Bash(gpend)`, no additional analysis or operations after execution +- Can also run `gpend` in terminal with same effect -提示: -- 用于查看 gask 异步发送后的回复 -- 或 gask-w 超时后继续获取回复 +Hints: +- Used to view reply after gask async send +- Or continue getting reply after gask-w timeout diff --git a/commands/gping.md b/commands/gping.md index e284a09..a02b33a 100644 --- a/commands/gping.md +++ b/commands/gping.md @@ -1,9 +1,9 @@ -通过 `gping` 命令测试与 Gemini 的连通性。 +Test connectivity with Gemini via `gping` command. -执行方式: -- 沉默运行 `Bash(gping)`,执行完毕后不做其他分析、推理或额外操作 -- 在终端中也可执行 `gping`,效果等同 +Execution: +- Run silently `Bash(gping)`, no additional analysis or operations after execution +- Can also run `gping` in terminal with same effect -提示: -- 返回 Gemini 会话状态 -- 用于检查 Gemini 是否正常运行 +Hints: +- Returns Gemini session status +- Used to check if Gemini is running normally diff --git a/install.ps1 b/install.ps1 index 895a8c4..50e2fb8 100644 --- a/install.ps1 +++ b/install.ps1 @@ -62,25 +62,25 @@ function Confirm-BackendEnv { if ($Yes -or $env:CCB_INSTALL_ASSUME_YES -eq "1") { return } if (-not [Environment]::UserInteractive) { - Write-Host "❌ 非交互环境下默认中止,避免 Windows/WSL 环境错配。" - Write-Host " 若确认 codex/gemini 将在 Windows 原生运行:" - Write-Host " 重新运行: powershell -ExecutionPolicy Bypass -File .\install.ps1 install -Yes" + Write-Host "❌ Non-interactive environment detected, aborting to prevent Windows/WSL mismatch." + Write-Host " If codex/gemini will run in native Windows:" + Write-Host " Re-run: powershell -ExecutionPolicy Bypass -File .\install.ps1 install -Yes" exit 1 } Write-Host "" Write-Host "================================================================" - Write-Host "⚠️ 你正在 Windows 原生环境安装 ccb" + Write-Host "⚠️ You are installing ccb in native Windows environment" Write-Host "================================================================" - Write-Host "ccb/cask-w 必须与 codex/gemini 在同一环境运行。" + Write-Host "ccb/cask-w must run in the same environment as codex/gemini." Write-Host "" - Write-Host "请确认:你将把 codex/gemini 安装并运行在 Windows 原生(而不是 WSL 内)。" - Write-Host "如果你计划在 WSL 内运行 codex/gemini,请退出并在 WSL 中运行:" + Write-Host "Please confirm: You will install and run codex/gemini in native Windows (not WSL)." + Write-Host "If you plan to run codex/gemini in WSL, exit and run in WSL:" Write-Host " ./install.sh install" Write-Host "================================================================" - $reply = Read-Host "确认继续在 Windows 中安装?(y/N)" + $reply = Read-Host "Continue installation in Windows? (y/N)" if ($reply.Trim().ToLower() -notin @("y", "yes")) { - Write-Host "已取消安装" + Write-Host "Installation cancelled" exit 1 } } diff --git a/install.sh b/install.sh index 77e4aca..99b9596 100755 --- a/install.sh +++ b/install.sh @@ -43,14 +43,14 @@ LEGACY_SCRIPTS=( usage() { cat <<'USAGE' -用法: - ./install.sh install # 安装或更新 Codex 双窗口工具 - ./install.sh uninstall # 卸载已安装内容 - -可选环境变量: - CODEX_INSTALL_PREFIX 安装目录 (默认: ~/.local/share/codex-dual) - CODEX_BIN_DIR 可执行文件目录 (默认: ~/.local/bin) - CODEX_CLAUDE_COMMAND_DIR 自定义 Claude 命令目录 (默认自动检测) +Usage: + ./install.sh install # Install or update Codex dual-window tools + ./install.sh uninstall # Uninstall installed content + +Optional environment variables: + CODEX_INSTALL_PREFIX Install directory (default: ~/.local/share/codex-dual) + CODEX_BIN_DIR Executable directory (default: ~/.local/bin) + CODEX_CLAUDE_COMMAND_DIR Custom Claude commands directory (default: auto-detect) USAGE } @@ -82,8 +82,8 @@ require_command() { local cmd="$1" local pkg="${2:-$1}" if ! command -v "$cmd" >/dev/null 2>&1; then - echo "❌ 缺少依赖: $cmd" - echo " 请先安装 $pkg,再重新运行 install.sh" + echo "❌ Missing dependency: $cmd" + echo " Please install $pkg first, then re-run install.sh" exit 1 fi } @@ -93,14 +93,14 @@ require_python_version() { local version version="$(python3 -c 'import sys; print("{}.{}.{}".format(sys.version_info[0], sys.version_info[1], sys.version_info[2]))' 2>/dev/null || echo unknown)" if ! python3 -c 'import sys; raise SystemExit(0 if sys.version_info >= (3, 10) else 1)'; then - echo "❌ Python 版本过低: $version" - echo " 需要 Python 3.10+,请升级后重试" + echo "❌ Python version too old: $version" + echo " Requires Python 3.10+, please upgrade and retry" exit 1 fi echo "✓ Python $version" } -# 根据 uname 返回 linux / macos / unknown +# Return linux / macos / unknown based on uname detect_platform() { local name name="$(uname -s 2>/dev/null || echo unknown)" @@ -128,11 +128,11 @@ check_wsl_compatibility() { local ver ver="$(get_wsl_version)" if [[ "$ver" == "1" ]]; then - echo "❌ WSL 1 不支持 FIFO 管道,请升级到 WSL 2" - echo " 运行: wsl --set-version 2" + echo "❌ WSL 1 does not support FIFO pipes, please upgrade to WSL 2" + echo " Run: wsl --set-version 2" exit 1 fi - echo "✅ 检测到 WSL 2 环境" + echo "✅ Detected WSL 2 environment" fi } @@ -146,27 +146,27 @@ confirm_backend_env_wsl() { fi if [[ ! -t 0 ]]; then - echo "❌ 当前在 WSL 中安装,但检测到非交互终端;为避免环境错配,已中止。" - echo " 如果你确认 codex/gemini 将安装并运行在 WSL:" - echo " 重新运行: CCB_INSTALL_ASSUME_YES=1 ./install.sh install" + echo "❌ Installing in WSL but detected non-interactive terminal; aborted to avoid env mismatch." + echo " If you confirm codex/gemini will be installed and run in WSL:" + echo " Re-run: CCB_INSTALL_ASSUME_YES=1 ./install.sh install" exit 1 fi echo echo "================================================================" - echo "⚠️ 检测到 WSL 环境" + echo "⚠️ Detected WSL environment" echo "================================================================" - echo "ccb/cask-w 必须与 codex/gemini 在同一环境运行。" + echo "ccb/cask-w must run in the same environment as codex/gemini." echo - echo "请确认:你将把 codex/gemini 安装并运行在 WSL(而不是 Windows 原生)。" - echo "如果你计划在 Windows 原生运行 codex/gemini,请退出并在 Windows 侧运行:" + echo "Please confirm: you will install and run codex/gemini in WSL (not Windows native)." + echo "If you plan to run codex/gemini in Windows native, exit and run on Windows side:" echo " powershell -ExecutionPolicy Bypass -File .\\install.ps1 install" echo "================================================================" echo - read -r -p "确认继续在 WSL 中安装?(y/N): " reply + read -r -p "Confirm continue installing in WSL? (y/N): " reply case "$reply" in y|Y|yes|YES) ;; - *) echo "已取消安装"; exit 1 ;; + *) echo "Installation cancelled"; exit 1 ;; esac } @@ -176,9 +176,9 @@ print_tmux_install_hint() { case "$platform" in macos) if command -v brew >/dev/null 2>&1; then - echo " macOS: 运行 'brew install tmux'" + echo " macOS: Run 'brew install tmux'" else - echo " macOS: 未检测到 Homebrew,可先安装 https://brew.sh 然后执行 'brew install tmux'" + echo " macOS: Homebrew not detected, install from https://brew.sh then run 'brew install tmux'" fi ;; linux) @@ -195,75 +195,75 @@ print_tmux_install_hint() { elif command -v zypper >/dev/null 2>&1; then echo " openSUSE: sudo zypper install -y tmux" else - echo " Linux: 请使用发行版自带的包管理器安装 tmux" + echo " Linux: Please use your distro's package manager to install tmux" fi ;; *) - echo " 请参考 https://github.com/tmux/tmux/wiki/Installing 获取 tmux 安装方法" + echo " See https://github.com/tmux/tmux/wiki/Installing for tmux installation" ;; esac } -# 检测是否在 iTerm2 环境中运行 +# Detect if running in iTerm2 environment is_iterm2_environment() { - # 检查 ITERM_SESSION_ID 环境变量 + # Check ITERM_SESSION_ID environment variable if [[ -n "${ITERM_SESSION_ID:-}" ]]; then return 0 fi - # 检查 TERM_PROGRAM + # Check TERM_PROGRAM if [[ "${TERM_PROGRAM:-}" == "iTerm.app" ]]; then return 0 fi - # macOS 上检查 iTerm2 是否正在运行 + # Check if iTerm2 is running on macOS if [[ "$(uname)" == "Darwin" ]] && pgrep -x "iTerm2" >/dev/null 2>&1; then return 0 fi return 1 } -# 安装 it2 CLI +# Install it2 CLI install_it2() { echo - echo "📦 正在安装 it2 CLI..." + echo "📦 Installing it2 CLI..." - # 检查 pip3 是否可用 + # Check if pip3 is available if ! command -v pip3 >/dev/null 2>&1; then - echo "❌ 未找到 pip3,无法自动安装 it2" - echo " 请手动运行: python3 -m pip install it2" + echo "❌ pip3 not found, cannot auto-install it2" + echo " Please run manually: python3 -m pip install it2" return 1 fi - # 安装 it2 + # Install it2 if pip3 install it2 --user 2>&1; then - echo "✅ it2 CLI 安装成功" + echo "✅ it2 CLI installed successfully" - # 检查是否在 PATH 中 + # Check if in PATH if ! command -v it2 >/dev/null 2>&1; then local user_bin user_bin="$(python3 -m site --user-base)/bin" echo - echo "⚠️ it2 可能不在 PATH 中,请添加以下路径到你的 shell 配置文件:" + echo "⚠️ it2 may not be in PATH, please add the following to your shell config:" echo " export PATH=\"$user_bin:\$PATH\"" fi return 0 else - echo "❌ it2 安装失败" + echo "❌ it2 installation failed" return 1 fi } -# 显示 iTerm2 Python API 启用提示 +# Show iTerm2 Python API enable reminder show_iterm2_api_reminder() { echo echo "================================================================" - echo "🔔 重要提示:请在 iTerm2 中启用 Python API" + echo "🔔 Important: Please enable Python API in iTerm2" echo "================================================================" - echo " 步骤:" - echo " 1. 打开 iTerm2" - echo " 2. 进入 Preferences (⌘ + ,)" - echo " 3. 选择 Magic 标签页" - echo " 4. 勾选 \"Enable Python API\"" - echo " 5. 确认警告对话框" + echo " Steps:" + echo " 1. Open iTerm2" + echo " 2. Go to Preferences (⌘ + ,)" + echo " 3. Select Magic tab" + echo " 4. Check \"Enable Python API\"" + echo " 5. Confirm the warning dialog" echo "================================================================" echo } @@ -272,34 +272,34 @@ require_terminal_backend() { local wezterm_override="${CODEX_WEZTERM_BIN:-${WEZTERM_BIN:-}}" # ============================================ - # 优先检测当前运行环境,确保使用正确的终端工具 + # Prioritize detecting current environment # ============================================ - # 1. 如果在 WezTerm 环境中运行 + # 1. If running in WezTerm environment if [[ -n "${WEZTERM_PANE:-}" ]]; then if [[ -n "${wezterm_override}" ]] && { command -v "${wezterm_override}" >/dev/null 2>&1 || [[ -f "${wezterm_override}" ]]; }; then - echo "✓ 检测到 WezTerm 环境 (${wezterm_override})" + echo "✓ Detected WezTerm environment (${wezterm_override})" return fi if command -v wezterm >/dev/null 2>&1 || command -v wezterm.exe >/dev/null 2>&1; then - echo "✓ 检测到 WezTerm 环境" + echo "✓ Detected WezTerm environment" return fi fi - # 2. 如果在 iTerm2 环境中运行 + # 2. If running in iTerm2 environment if is_iterm2_environment; then - # 检查是否已安装 it2 + # Check if it2 is installed if command -v it2 >/dev/null 2>&1; then - echo "✓ 检测到 iTerm2 环境 (it2 CLI 已安装)" - echo " 💡 请确保已启用 iTerm2 Python API (Preferences > Magic > Enable Python API)" + echo "✓ Detected iTerm2 environment (it2 CLI installed)" + echo " 💡 Please ensure iTerm2 Python API is enabled (Preferences > Magic > Enable Python API)" return fi - # 未安装 it2,询问是否安装 - echo "🍎 检测到 iTerm2 环境,但未安装 it2 CLI" + # it2 not installed, ask to install + echo "🍎 Detected iTerm2 environment but it2 CLI not installed" echo - read -p "是否自动安装 it2 CLI?(Y/n): " -n 1 -r + read -p "Auto-install it2 CLI? (Y/n): " -n 1 -r echo if [[ ! $REPLY =~ ^[Nn]$ ]]; then @@ -308,68 +308,68 @@ require_terminal_backend() { return fi else - echo "跳过 it2 安装,将使用 tmux 作为后备方案" + echo "Skipping it2 installation, will use tmux as fallback" fi fi - # 3. 如果在 tmux 环境中运行 + # 3. If running in tmux environment if [[ -n "${TMUX:-}" ]]; then - echo "✓ 检测到 tmux 环境" + echo "✓ Detected tmux environment" return fi # ============================================ - # 不在特定环境中,按可用性检测 + # Not in specific environment, detect by availability # ============================================ - # 4. 检查 WezTerm 环境变量覆盖 + # 4. Check WezTerm environment variable override if [[ -n "${wezterm_override}" ]]; then if command -v "${wezterm_override}" >/dev/null 2>&1 || [[ -f "${wezterm_override}" ]]; then - echo "✓ 检测到 WezTerm (${wezterm_override})" + echo "✓ Detected WezTerm (${wezterm_override})" return fi fi - # 5. 检查 WezTerm 命令 + # 5. Check WezTerm command if command -v wezterm >/dev/null 2>&1 || command -v wezterm.exe >/dev/null 2>&1; then - echo "✓ 检测到 WezTerm" + echo "✓ Detected WezTerm" return fi - # WSL 场景:Windows PATH 可能未注入 WSL,尝试常见安装路径 + # WSL: Windows PATH may not be injected, try common install paths if [[ -f "/proc/version" ]] && grep -qi microsoft /proc/version 2>/dev/null; then if [[ -x "/mnt/c/Program Files/WezTerm/wezterm.exe" ]] || [[ -f "/mnt/c/Program Files/WezTerm/wezterm.exe" ]]; then - echo "✓ 检测到 WezTerm (/mnt/c/Program Files/WezTerm/wezterm.exe)" + echo "✓ Detected WezTerm (/mnt/c/Program Files/WezTerm/wezterm.exe)" return fi if [[ -x "/mnt/c/Program Files (x86)/WezTerm/wezterm.exe" ]] || [[ -f "/mnt/c/Program Files (x86)/WezTerm/wezterm.exe" ]]; then - echo "✓ 检测到 WezTerm (/mnt/c/Program Files (x86)/WezTerm/wezterm.exe)" + echo "✓ Detected WezTerm (/mnt/c/Program Files (x86)/WezTerm/wezterm.exe)" return fi fi - # 6. 检查 it2 CLI + # 6. Check it2 CLI if command -v it2 >/dev/null 2>&1; then - echo "✓ 检测到 it2 CLI" + echo "✓ Detected it2 CLI" return fi - # 7. 检查 tmux + # 7. Check tmux if command -v tmux >/dev/null 2>&1; then - echo "✓ 检测到 tmux(建议同时安装 WezTerm 以获得更好体验)" + echo "✓ Detected tmux (recommend also installing WezTerm for better experience)" return fi - # 8. 没有找到任何可用的终端复用器 - echo "❌ 缺少依赖: WezTerm、tmux 或 it2 (至少需要安装其中一个)" - echo " WezTerm 官网: https://wezfurlong.org/wezterm/" + # 8. No terminal multiplexer found + echo "❌ Missing dependency: WezTerm, tmux or it2 (at least one required)" + echo " WezTerm website: https://wezfurlong.org/wezterm/" - # macOS 上额外提示 iTerm2 + it2 选项 + # Extra hint for macOS users about iTerm2 + it2 if [[ "$(uname)" == "Darwin" ]]; then echo - echo "💡 macOS 用户推荐选项:" - echo " - 如果你使用 iTerm2,可以安装 it2 CLI: pip3 install it2" - echo " - 或者安装 tmux: brew install tmux" + echo "💡 macOS user recommended options:" + echo " - If using iTerm2, install it2 CLI: pip3 install it2" + echo " - Or install tmux: brew install tmux" fi print_tmux_install_hint @@ -418,7 +418,7 @@ save_wezterm_config() { if [[ -n "$wezterm_path" ]]; then mkdir -p "$HOME/.config/ccb" echo "CODEX_WEZTERM_BIN=${wezterm_path}" > "$HOME/.config/ccb/env" - echo "✓ WezTerm 路径已缓存: $wezterm_path" + echo "✓ WezTerm path cached: $wezterm_path" fi } @@ -458,7 +458,7 @@ install_bin_links() { local name name="$(basename "$path")" if [[ ! -f "$INSTALL_PREFIX/$path" ]]; then - echo "⚠️ 未找到脚本 $INSTALL_PREFIX/$path,跳过创建链接" + echo "⚠️ Script not found $INSTALL_PREFIX/$path, skipping link creation" continue fi chmod +x "$INSTALL_PREFIX/$path" @@ -475,7 +475,7 @@ install_bin_links() { rm -f "$BIN_DIR/$legacy" done - echo "已在 $BIN_DIR 创建可执行入口" + echo "Created executable links in $BIN_DIR" } install_claude_commands() { @@ -488,7 +488,7 @@ install_claude_commands() { chmod 0644 "$claude_dir/$doc" 2>/dev/null || true done - echo "已更新 Claude 命令目录: $claude_dir" + echo "Updated Claude commands directory: $claude_dir" } CCB_START_MARKER="" @@ -503,7 +503,7 @@ remove_codex_mcp() { fi if ! command -v python3 >/dev/null 2>&1; then - echo "⚠️ 需要 python3 来检测 MCP 配置" + echo "⚠️ python3 required to detect MCP configuration" return fi @@ -528,7 +528,7 @@ except: " 2>/dev/null) if [[ "$has_codex_mcp" == "yes" ]]; then - echo "⚠️ 检测到 codex 相关的 MCP 配置,正在移除以避免冲突..." + echo "⚠️ Detected codex-related MCP configuration, removing to avoid conflicts..." python3 -c " import json with open('$claude_config', 'r') as f: @@ -543,11 +543,11 @@ for proj, cfg in data.get('projects', {}).items(): with open('$claude_config', 'w') as f: json.dump(data, f, indent=2) if removed: - print('已移除以下 MCP 配置:') + print('Removed the following MCP configurations:') for r in removed: print(f' - {r}') " - echo "✅ Codex MCP 配置已清理" + echo "✅ Codex MCP configuration cleaned" fi } @@ -723,9 +723,9 @@ with open('$settings_file', 'w') as f: done if [[ $added -eq 1 ]]; then - echo "已更新 $settings_file 权限配置" + echo "Updated $settings_file permissions" else - echo "权限配置已存在于 $settings_file" + echo "Permissions already exist in $settings_file" fi } @@ -738,9 +738,9 @@ install_requirements() { if ! has_wezterm; then echo echo "================================================================" - echo "⚠️ 建议安装 WezTerm 作为终端前端(体验更好,推荐 WSL2/Windows 用户)" - echo " - 官网: https://wezfurlong.org/wezterm/" - echo " - 优势: 更顺滑的分屏/滚动/字体渲染,WezTerm 模式下桥接更稳定" + echo "⚠️ Recommend installing WezTerm as terminal frontend (better experience, recommended for WSL2/Windows)" + echo " - Website: https://wezfurlong.org/wezterm/" + echo " - Benefits: Smoother split/scroll/font rendering, more stable bridging in WezTerm mode" echo "================================================================" echo fi @@ -755,12 +755,12 @@ install_all() { install_claude_commands install_claude_md_config install_settings_permissions - echo "✅ 安装完成" - echo " 项目目录 : $INSTALL_PREFIX" - echo " 可执行目录: $BIN_DIR" - echo " Claude 命令已更新" - echo " 全局 CLAUDE.md 已配置 Codex 协作规则" - echo " 全局 settings.json 已添加权限" + echo "✅ Installation complete" + echo " Project dir : $INSTALL_PREFIX" + echo " Executable dir : $BIN_DIR" + echo " Claude commands updated" + echo " Global CLAUDE.md configured with Codex collaboration rules" + echo " Global settings.json permissions added" } uninstall_claude_md_config() { @@ -771,7 +771,7 @@ uninstall_claude_md_config() { fi if grep -q "$CCB_START_MARKER" "$claude_md" 2>/dev/null; then - echo "正在移除 CLAUDE.md 中的 CCB 配置块..." + echo "Removing CCB config block from CLAUDE.md..." if command -v python3 >/dev/null 2>&1; then python3 -c " import re @@ -783,12 +783,12 @@ content = content.strip() + '\n' with open('$claude_md', 'w', encoding='utf-8') as f: f.write(content) " - echo "已移除 CLAUDE.md 中的 CCB 配置" + echo "Removed CCB config from CLAUDE.md" else - echo "⚠️ 需要 python3 来清理 CLAUDE.md,请手动移除 CCB_CONFIG 区块" + echo "⚠️ python3 required to clean CLAUDE.md, please manually remove CCB_CONFIG block" fi elif grep -qE "$LEGACY_RULE_MARKER|## Codex Collaboration Rules|## Gemini" "$claude_md" 2>/dev/null; then - echo "正在移除 CLAUDE.md 中的旧版协作规则..." + echo "Removing legacy collaboration rules from CLAUDE.md..." if command -v python3 >/dev/null 2>&1; then python3 -c " import re @@ -806,9 +806,9 @@ content = content.rstrip() + '\n' with open('$claude_md', 'w', encoding='utf-8') as f: f.write(content) " - echo "已移除 CLAUDE.md 中的协作规则" + echo "Removed collaboration rules from CLAUDE.md" else - echo "⚠️ 需要 python3 来清理 CLAUDE.md,请手动移除协作规则部分" + echo "⚠️ python3 required to clean CLAUDE.md, please manually remove collaboration rules" fi fi } @@ -841,7 +841,7 @@ uninstall_settings_permissions() { done if [[ $has_perms -eq 1 ]]; then - echo "正在移除 settings.json 中的权限配置..." + echo "Removing permission configuration from settings.json..." python3 -c " import json perms_to_remove = [ @@ -864,23 +864,23 @@ if 'permissions' in data and 'allow' in data['permissions']: with open('$settings_file', 'w') as f: json.dump(data, f, indent=2) " - echo "已移除 settings.json 中的权限配置" + echo "Removed permission configuration from settings.json" fi else - echo "⚠️ 需要 python3 来清理 settings.json,请手动移除相关权限" + echo "⚠️ python3 required to clean settings.json, please manually remove related permissions" fi } uninstall_all() { - echo "🧹 开始卸载 ccb..." + echo "🧹 Starting ccb uninstall..." - # 1. 移除项目目录 + # 1. Remove project directory if [[ -d "$INSTALL_PREFIX" ]]; then rm -rf "$INSTALL_PREFIX" - echo "已移除项目目录: $INSTALL_PREFIX" + echo "Removed project directory: $INSTALL_PREFIX" fi - # 2. 移除 bin 链接 + # 2. Remove bin links for path in "${SCRIPTS_TO_LINK[@]}"; do local name name="$(basename "$path")" @@ -891,9 +891,9 @@ uninstall_all() { for legacy in "${LEGACY_SCRIPTS[@]}"; do rm -f "$BIN_DIR/$legacy" done - echo "已移除 bin 链接: $BIN_DIR" + echo "Removed bin links: $BIN_DIR" - # 3. 移除 Claude 命令文件(清理所有可能的位置) + # 3. Remove Claude command files (clean all possible locations) local cmd_dirs=( "$HOME/.claude/commands" "$HOME/.config/claude/commands" @@ -904,18 +904,18 @@ uninstall_all() { for doc in "${CLAUDE_MARKDOWN[@]}"; do rm -f "$dir/$doc" done - echo "已清理命令目录: $dir" + echo "Cleaned commands directory: $dir" fi done - # 4. 移除 CLAUDE.md 中的协作规则 + # 4. Remove collaboration rules from CLAUDE.md uninstall_claude_md_config - # 5. 移除 settings.json 中的权限配置 + # 5. Remove permission configuration from settings.json uninstall_settings_permissions - echo "✅ 卸载完成" - echo " 💡 注意: 依赖项 (python3, tmux, wezterm, it2) 未被移除" + echo "✅ Uninstall complete" + echo " 💡 Note: Dependencies (python3, tmux, wezterm, it2) were not removed" } main() { diff --git a/lib/codex_comm.py b/lib/codex_comm.py index 89726e2..9a6bc90 100644 --- a/lib/codex_comm.py +++ b/lib/codex_comm.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """ -Codex 通信模块(日志驱动版本) -通过 FIFO 发送请求,并从 ~/.codex/sessions 下的官方日志解析回复。 +Codex communication module (log-driven version) +Sends requests via FIFO and parses replies from ~/.codex/sessions logs. """ from __future__ import annotations @@ -28,7 +28,7 @@ class CodexLogReader: - """读取 ~/.codex/sessions 内的 Codex 官方日志""" + """Reads Codex official logs from ~/.codex/sessions""" def __init__(self, root: Path = SESSION_ROOT, log_path: Optional[Path] = None, session_id_filter: Optional[str] = None): self.root = Path(root).expanduser() @@ -88,7 +88,7 @@ def current_log_path(self) -> Optional[Path]: return self._latest_log() def capture_state(self) -> Dict[str, Any]: - """记录当前日志与偏移""" + """Capture current log path and offset""" log = self._latest_log() offset = 0 if log and log.exists(): @@ -99,15 +99,15 @@ def capture_state(self) -> Dict[str, Any]: return {"log_path": log, "offset": offset} def wait_for_message(self, state: Dict[str, Any], timeout: float) -> Tuple[Optional[str], Dict[str, Any]]: - """阻塞等待新的回复""" + """Block and wait for new reply""" return self._read_since(state, timeout, block=True) def try_get_message(self, state: Dict[str, Any]) -> Tuple[Optional[str], Dict[str, Any]]: - """非阻塞读取回复""" + """Non-blocking read for reply""" return self._read_since(state, timeout=0.0, block=False) def latest_message(self) -> Optional[str]: - """直接获取最新一条回复""" + """Get the latest reply directly""" log_path = self._latest_log() if not log_path or not log_path.exists(): return None @@ -160,7 +160,7 @@ def ensure_log() -> Path: if latest: self._preferred_log = latest return latest - raise FileNotFoundError("未找到 Codex session 日志") + raise FileNotFoundError("Codex session log not found") while True: try: @@ -234,12 +234,12 @@ def _extract_message(entry: dict) -> Optional[str]: class CodexCommunicator: - """通过 FIFO 与 Codex 桥接器通信,并使用日志读取回复""" + """Communicates with Codex bridge via FIFO and reads replies from logs""" def __init__(self): self.session_info = self._load_session_info() if not self.session_info: - raise RuntimeError("❌ 未找到活跃的Codex会话,请先运行 ccb up codex") + raise RuntimeError("❌ No active Codex session found. Run 'ccb up codex' first") self.session_id = self.session_info["session_id"] self.runtime_dir = Path(self.session_info["runtime_dir"]) @@ -259,12 +259,12 @@ def __init__(self): healthy, msg = self._check_session_health() if not healthy: - raise RuntimeError(f"❌ 会话不健康: {msg}\n提示: 请运行 ccb up codex 启动新会话") + raise RuntimeError(f"❌ Session unhealthy: {msg}\nTip: Run 'ccb up codex' to start a new session") def _load_session_info(self): if "CODEX_SESSION_ID" in os.environ: terminal = os.environ.get("CODEX_TERMINAL", "tmux") - # 根据终端类型获取正确的 pane_id + # Get pane_id based on terminal type if terminal == "wezterm": pane_id = os.environ.get("CODEX_WEZTERM_PANE", "") elif terminal == "iterm2": @@ -307,7 +307,7 @@ def _load_session_info(self): return None def _prime_log_binding(self) -> None: - """确保在会话启动时尽早绑定日志路径和会话ID""" + """Ensure log path and session ID are bound early at session start""" log_hint = self.log_reader.current_log_path() if not log_hint: return @@ -319,52 +319,52 @@ def _check_session_health(self): def _check_session_health_impl(self, probe_terminal: bool): try: if not self.runtime_dir.exists(): - return False, "运行时目录不存在" + return False, "Runtime directory does not exist" - # WezTerm/iTerm2 模式:没有 tmux wrapper,因此通常不会生成 codex.pid; - # 以 pane 存活作为健康判定(与 Gemini 逻辑一致)。 + # WezTerm/iTerm2 mode: no tmux wrapper, so codex.pid usually not generated; + # use pane liveness as health check (consistent with Gemini logic). if self.terminal in ("wezterm", "iterm2"): if not self.pane_id: - return False, f"未找到 {self.terminal} pane_id" + return False, f"{self.terminal} pane_id not found" if probe_terminal and (not self.backend or not self.backend.is_alive(self.pane_id)): - return False, f"{self.terminal} pane 不存在: {self.pane_id}" - return True, "会话正常" + return False, f"{self.terminal} pane does not exist: {self.pane_id}" + return True, "Session healthy" - # tmux 模式:依赖 wrapper 写入 codex.pid 与 FIFO + # tmux mode: relies on wrapper to write codex.pid and FIFO codex_pid_file = self.runtime_dir / "codex.pid" if not codex_pid_file.exists(): - return False, "Codex进程PID文件不存在" + return False, "Codex process PID file not found" with open(codex_pid_file, "r", encoding="utf-8") as f: codex_pid = int(f.read().strip()) try: os.kill(codex_pid, 0) except OSError: - return False, f"Codex进程(PID:{codex_pid})已退出" + return False, f"Codex process (PID:{codex_pid}) has exited" bridge_pid_file = self.runtime_dir / "bridge.pid" if not bridge_pid_file.exists(): - return False, "Bridge进程PID文件不存在" + return False, "Bridge process PID file not found" try: with bridge_pid_file.open("r", encoding="utf-8") as handle: bridge_pid = int(handle.read().strip()) except Exception: - return False, "Bridge进程PID读取失败" + return False, "Failed to read bridge process PID" try: os.kill(bridge_pid, 0) except OSError: - return False, f"Bridge进程(PID:{bridge_pid})已退出" + return False, f"Bridge process (PID:{bridge_pid}) has exited" if not self.input_fifo.exists(): - return False, "通信管道不存在" + return False, "Communication pipe does not exist" - return True, "会话正常" + return True, "Session healthy" except Exception as exc: - return False, f"检查失败: {exc}" + return False, f"Health check failed: {exc}" def _send_via_terminal(self, content: str) -> None: if not self.backend or not self.pane_id: - raise RuntimeError("未配置终端会话") + raise RuntimeError("Terminal session not configured") self.backend.send_text(self.pane_id, content) def _send_message(self, content: str) -> Tuple[str, Dict[str, Any]]: @@ -377,7 +377,7 @@ def _send_message(self, content: str) -> Tuple[str, Dict[str, Any]]: state = self.log_reader.capture_state() - # tmux 模式优先通过 FIFO 驱动桥接器;WezTerm/iTerm2 模式则直接向 pane 注入文本 + # tmux mode drives bridge via FIFO; WezTerm/iTerm2 mode injects text directly to pane if self.terminal in ("wezterm", "iterm2"): self._send_via_terminal(content) else: @@ -394,29 +394,29 @@ def ask_async(self, question: str) -> bool: try: healthy, status = self._check_session_health_impl(probe_terminal=False) if not healthy: - raise RuntimeError(f"❌ 会话异常: {status}") + raise RuntimeError(f"❌ Session error: {status}") marker, state = self._send_message(question) log_hint = state.get("log_path") or self.log_reader.current_log_path() self._remember_codex_session(log_hint) - print(f"✅ 已发送到Codex (标记: {marker[:12]}...)") - print("提示: 使用 /cpend 查看最新回复") + print(f"✅ Sent to Codex (marker: {marker[:12]}...)") + print("Tip: Use /cpend to view latest reply") return True except Exception as exc: - print(f"❌ 发送失败: {exc}") + print(f"❌ Send failed: {exc}") return False def ask_sync(self, question: str, timeout: Optional[int] = None) -> Optional[str]: try: healthy, status = self._check_session_health_impl(probe_terminal=False) if not healthy: - raise RuntimeError(f"❌ 会话异常: {status}") + raise RuntimeError(f"❌ Session error: {status}") - print("🔔 发送问题到Codex...") + print("🔔 Sending question to Codex...") marker, state = self._send_message(question) wait_timeout = self.timeout if timeout is None else int(timeout) if wait_timeout == 0: - print("⏳ 等待 Codex 回复 (无超时,Ctrl-C 可中断)...") + print("⏳ Waiting for Codex reply (no timeout, Ctrl-C to interrupt)...") start_time = time.time() last_hint = 0 while True: @@ -427,29 +427,29 @@ def ask_sync(self, question: str, timeout: Optional[int] = None) -> Optional[str log_hint = self.log_reader.current_log_path() self._remember_codex_session(log_hint) if message: - print("🤖 Codex回复:") + print("🤖 Codex reply:") print(message) return message elapsed = int(time.time() - start_time) if elapsed >= last_hint + 30: last_hint = elapsed - print(f"⏳ 仍在等待... ({elapsed}s)") + print(f"⏳ Still waiting... ({elapsed}s)") - print(f"⏳ 等待Codex回复 (超时 {wait_timeout} 秒)...") + print(f"⏳ Waiting for Codex reply (timeout {wait_timeout}s)...") message, new_state = self.log_reader.wait_for_message(state, float(wait_timeout)) log_hint = (new_state or {}).get("log_path") if isinstance(new_state, dict) else None if not log_hint: log_hint = self.log_reader.current_log_path() self._remember_codex_session(log_hint) if message: - print("🤖 Codex回复:") + print("🤖 Codex reply:") print(message) return message - print("⏰ Codex未在限定时间内回复,可稍后执行 /cpend 获取最新答案") + print("⏰ Codex did not reply in time. Use /cpend later to get the latest answer") return None except Exception as exc: - print(f"❌ 同步询问失败: {exc}") + print(f"❌ Sync ask failed: {exc}") return None def consume_pending(self, display: bool = True): @@ -460,7 +460,7 @@ def consume_pending(self, display: bool = True): self._remember_codex_session(self.log_reader.current_log_path()) if not message: if display: - print("暂无 Codex 回复") + print("No Codex reply available") return None if display: print(message) @@ -468,7 +468,7 @@ def consume_pending(self, display: bool = True): def ping(self, display: bool = True) -> Tuple[bool, str]: healthy, status = self._check_session_health() - msg = f"✅ Codex连接正常 ({status})" if healthy else f"❌ Codex连接异常: {status}" + msg = f"✅ Codex connection OK ({status})" if healthy else f"❌ Codex connection error: {status}" if display: print(msg) return healthy, msg @@ -544,12 +544,12 @@ def _remember_codex_session(self, log_path: Optional[Path]) -> None: json.dump(data, handle, ensure_ascii=False, indent=2) os.replace(tmp_file, project_file) except PermissionError as e: - print(f"⚠️ 无法更新 {project_file.name}: {e}", file=sys.stderr) - print(f"💡 尝试: sudo chown $USER:$USER {project_file}", file=sys.stderr) + print(f"⚠️ Cannot update {project_file.name}: {e}", file=sys.stderr) + print(f"💡 Try: sudo chown $USER:$USER {project_file}", file=sys.stderr) if tmp_file.exists(): tmp_file.unlink(missing_ok=True) except Exception as e: - print(f"⚠️ 更新 {project_file.name} 失败: {e}", file=sys.stderr) + print(f"⚠️ Failed to update {project_file.name}: {e}", file=sys.stderr) if tmp_file.exists(): tmp_file.unlink(missing_ok=True) @@ -601,13 +601,13 @@ def _extract_session_id(log_path: Path) -> Optional[str]: def main() -> int: import argparse - parser = argparse.ArgumentParser(description="Codex 通信工具(日志驱动)") - parser.add_argument("question", nargs="*", help="要发送的问题") - parser.add_argument("--wait", "-w", action="store_true", help="同步等待回复") - parser.add_argument("--timeout", type=int, default=30, help="同步超时时间(秒)") - parser.add_argument("--ping", action="store_true", help="测试连通性") - parser.add_argument("--status", action="store_true", help="查看状态") - parser.add_argument("--pending", action="store_true", help="查看待处理回复") + parser = argparse.ArgumentParser(description="Codex communication tool (log-driven)") + parser.add_argument("question", nargs="*", help="Question to send") + parser.add_argument("--wait", "-w", action="store_true", help="Wait for reply synchronously") + parser.add_argument("--timeout", type=int, default=30, help="Sync timeout in seconds") + parser.add_argument("--ping", action="store_true", help="Test connectivity") + parser.add_argument("--status", action="store_true", help="Show status") + parser.add_argument("--pending", action="store_true", help="Show pending reply") args = parser.parse_args() @@ -618,7 +618,7 @@ def main() -> int: comm.ping() elif args.status: status = comm.get_status() - print("📊 Codex状态:") + print("📊 Codex status:") for key, value in status.items(): print(f" {key}: {value}") elif args.pending: @@ -629,18 +629,18 @@ def main() -> int: tokens = tokens[1:] question_text = " ".join(tokens).strip() if not question_text: - print("❌ 请提供问题内容") + print("❌ Please provide a question") return 1 if args.wait: comm.ask_sync(question_text, args.timeout) else: comm.ask_async(question_text) else: - print("请提供问题或使用 --ping/--status/--pending 选项") + print("Please provide a question or use --ping/--status/--pending options") return 1 return 0 except Exception as exc: - print(f"❌ 执行失败: {exc}") + print(f"❌ Execution failed: {exc}") return 1 diff --git a/lib/codex_dual_bridge.py b/lib/codex_dual_bridge.py index c1e6c0c..1da8876 100644 --- a/lib/codex_dual_bridge.py +++ b/lib/codex_dual_bridge.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """ -Codex 双窗口桥接器 -负责发送命令到 Codex,支持 tmux 和 WezTerm。 +Codex dual-window bridge +Sends commands to Codex, supports tmux and WezTerm. """ from __future__ import annotations @@ -30,7 +30,7 @@ def _env_float(name: str, default: float) -> float: class TerminalCodexSession: - """通过终端会话向 Codex CLI 注入指令""" + """Inject commands to Codex CLI via terminal session""" def __init__(self, terminal_type: str, pane_id: str): self.terminal_type = terminal_type @@ -44,7 +44,7 @@ def send(self, text: str) -> None: class DualBridge: - """Claude ↔ Codex 桥接主流程""" + """Claude ↔ Codex bridge main process""" def __init__(self, runtime_dir: Path, session_id: str): self.runtime_dir = runtime_dir @@ -58,7 +58,7 @@ def __init__(self, runtime_dir: Path, session_id: str): terminal_type = os.environ.get("CODEX_TERMINAL", "tmux") pane_id = os.environ.get("CODEX_WEZTERM_PANE") if terminal_type == "wezterm" else os.environ.get("CODEX_TMUX_SESSION") if not pane_id: - raise RuntimeError(f"缺少 {'CODEX_WEZTERM_PANE' if terminal_type == 'wezterm' else 'CODEX_TMUX_SESSION'} 环境变量") + raise RuntimeError(f"Missing {'CODEX_WEZTERM_PANE' if terminal_type == 'wezterm' else 'CODEX_TMUX_SESSION'} environment variable") self.codex_session = TerminalCodexSession(terminal_type, pane_id) self._running = True @@ -67,10 +67,10 @@ def __init__(self, runtime_dir: Path, session_id: str): def _handle_signal(self, signum: int, _: Any) -> None: self._running = False - self._log_console(f"⚠️ 收到信号 {signum},准备退出...") + self._log_console(f"⚠️ Received signal {signum}, exiting...") def run(self) -> int: - self._log_console("🔌 Codex桥接器已启动,等待Claude指令...") + self._log_console("🔌 Codex bridge started, waiting for Claude commands...") idle_sleep = _env_float("CCB_BRIDGE_IDLE_SLEEP", 0.05) error_backoff_min = _env_float("CCB_BRIDGE_ERROR_BACKOFF_MIN", 0.05) error_backoff_max = _env_float("CCB_BRIDGE_ERROR_BACKOFF_MAX", 0.2) @@ -87,14 +87,14 @@ def run(self) -> int: except KeyboardInterrupt: self._running = False except Exception as exc: - self._log_console(f"❌ 处理消息失败: {exc}") + self._log_console(f"❌ Failed to process message: {exc}") self._log_bridge(f"error: {exc}") if error_backoff: time.sleep(error_backoff) if error_backoff_max: error_backoff = min(error_backoff_max, max(error_backoff_min, error_backoff * 2)) - self._log_console("👋 Codex桥接器已退出") + self._log_console("👋 Codex bridge exited") return 0 def _read_request(self) -> Optional[Dict[str, Any]]: @@ -120,7 +120,7 @@ def _process_request(self, payload: Dict[str, Any]) -> None: try: self.codex_session.send(content) except Exception as exc: - msg = f"❌ 发送至 Codex 失败: {exc}" + msg = f"❌ Failed to send to Codex: {exc}" self._append_history("codex", msg, marker) self._log_console(msg) @@ -136,7 +136,7 @@ def _append_history(self, role: str, content: str, marker: str) -> None: json.dump(entry, handle, ensure_ascii=False) handle.write("\n") except Exception as exc: - self._log_console(f"⚠️ 写入历史失败: {exc}") + self._log_console(f"⚠️ Failed to write history: {exc}") def _log_bridge(self, message: str) -> None: try: @@ -159,9 +159,9 @@ def _log_console(message: str) -> None: def parse_args() -> argparse.Namespace: - parser = argparse.ArgumentParser(description="Claude-Codex 桥接器") - parser.add_argument("--runtime-dir", required=True, help="运行目录") - parser.add_argument("--session-id", required=True, help="会话ID") + parser = argparse.ArgumentParser(description="Claude-Codex bridge") + parser.add_argument("--runtime-dir", required=True, help="Runtime directory") + parser.add_argument("--session-id", required=True, help="Session ID") return parser.parse_args() diff --git a/lib/gemini_comm.py b/lib/gemini_comm.py index f2d38f7..daad994 100755 --- a/lib/gemini_comm.py +++ b/lib/gemini_comm.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 """ -Gemini 通信模块 -支持 tmux 和 WezTerm 终端发送请求,从 ~/.gemini/tmp//chats/session-*.json 读取回复 +Gemini communication module +Supports tmux and WezTerm terminals, reads replies from ~/.gemini/tmp//chats/session-*.json """ from __future__ import annotations @@ -22,10 +22,10 @@ def _get_project_hash(work_dir: Optional[Path] = None) -> str: - """计算项目目录的哈希值(与 gemini-cli 的 Storage.getFilePathHash 一致)""" + """Calculate project directory hash (consistent with gemini-cli's Storage.getFilePathHash)""" path = work_dir or Path.cwd() - # gemini-cli 使用的是 Node.js 的 path.resolve()(不会 realpath 解析符号链接), - # 因此这里使用 absolute() 而不是 resolve(),避免在 WSL/Windows 场景下 hash 不一致。 + # gemini-cli uses Node.js path.resolve() (doesn't resolve symlinks), + # so we use absolute() instead of resolve() to avoid hash mismatch on WSL/Windows. try: normalized = str(path.expanduser().absolute()) except Exception: @@ -34,7 +34,7 @@ def _get_project_hash(work_dir: Optional[Path] = None) -> str: class GeminiLogReader: - """读取 ~/.gemini/tmp//chats 内的 Gemini 会话文件""" + """Reads Gemini session files from ~/.gemini/tmp//chats""" def __init__(self, root: Path = GEMINI_ROOT, work_dir: Optional[Path] = None): self.root = Path(root).expanduser() @@ -60,7 +60,7 @@ def _chats_dir(self) -> Optional[Path]: return chats if chats.exists() else None def _scan_latest_session_any_project(self) -> Optional[Path]: - """在所有 projectHash 下扫描最新 session 文件(用于 Windows/WSL 路径哈希不一致的兜底)""" + """Scan latest session across all projectHash (fallback for Windows/WSL path hash mismatch)""" if not self.root.exists(): return None try: @@ -88,7 +88,7 @@ def _scan_latest_session(self) -> Optional[Path]: if sessions: return sessions[-1] - # fallback: projectHash 可能因路径规范化差异(Windows/WSL、符号链接等)而不匹配 + # fallback: projectHash may mismatch due to path normalization differences (Windows/WSL, symlinks, etc.) return self._scan_latest_session_any_project() def _latest_session(self) -> Optional[Path]: @@ -98,7 +98,7 @@ def _latest_session(self) -> Optional[Path]: if latest: self._preferred_session = latest try: - # 若是 fallback 扫描到的 session,则反向绑定 projectHash,后续避免全量扫描 + # If session found via fallback scan, bind projectHash to avoid future full scans project_hash = latest.parent.parent.name if project_hash: self._project_hash = project_hash @@ -120,7 +120,7 @@ def current_session_path(self) -> Optional[Path]: return self._latest_session() def capture_state(self) -> Dict[str, Any]: - """记录当前会话文件和消息数量""" + """Record current session file and message count""" session = self._latest_session() msg_count = 0 mtime = 0.0 @@ -154,15 +154,15 @@ def capture_state(self) -> Dict[str, Any]: } def wait_for_message(self, state: Dict[str, Any], timeout: float) -> Tuple[Optional[str], Dict[str, Any]]: - """阻塞等待新的 Gemini 回复""" + """Block and wait for new Gemini reply""" return self._read_since(state, timeout, block=True) def try_get_message(self, state: Dict[str, Any]) -> Tuple[Optional[str], Dict[str, Any]]: - """非阻塞读取回复""" + """Non-blocking read reply""" return self._read_since(state, timeout=0.0, block=False) def latest_message(self) -> Optional[str]: - """直接获取最新一条 Gemini 回复""" + """Get the latest Gemini reply directly""" session = self._latest_session() if not session or not session.exists(): return None @@ -188,18 +188,18 @@ def _read_since(self, state: Dict[str, Any], timeout: float, block: bool) -> Tup prev_session = state.get("session_path") prev_last_gemini_id = state.get("last_gemini_id") prev_last_gemini_hash = state.get("last_gemini_hash") - # 允许短 timeout 场景下也能扫描到新 session 文件(gask-w 默认 1s/次) + # Allow short timeout to scan new session files (gask-w defaults 1s/poll) rescan_interval = min(2.0, max(0.2, timeout / 2.0)) last_rescan = time.time() last_forced_read = time.time() while True: - # 定期重新扫描,检测是否有新会话文件 + # Periodically rescan to detect new session files if time.time() - last_rescan >= rescan_interval: latest = self._scan_latest_session() if latest and latest != self._preferred_session: self._preferred_session = latest - # 新会话文件,重置计数 + # New session file, reset counters if latest != prev_session: prev_count = 0 prev_mtime = 0.0 @@ -229,8 +229,8 @@ def _read_since(self, state: Dict[str, Any], timeout: float, block: bool) -> Tup current_mtime = stat.st_mtime current_mtime_ns = getattr(stat, "st_mtime_ns", int(current_mtime * 1_000_000_000)) current_size = stat.st_size - # Windows/WSL 场景下文件 mtime 可能是秒级精度,单靠 mtime 会漏掉快速写入的更新; - # 因此同时用文件大小作为变化信号。 + # On Windows/WSL, mtime may have second-level precision, which can miss rapid writes. + # Use file size as additional change signal. if block and current_mtime_ns <= prev_mtime_ns and current_size == prev_size: if time.time() - last_forced_read < self._force_read_interval: time.sleep(self._poll_interval) @@ -269,7 +269,7 @@ def _read_since(self, state: Dict[str, Any], timeout: float, block: bool) -> Tup } return content, new_state else: - # 有些版本会先写入空的 gemini 消息,再“原地更新 content”,消息数不变。 + # Some versions write empty gemini message first, then update content in-place. last = self._extract_last_gemini(data) if last: last_id, content = last @@ -340,12 +340,12 @@ def _extract_last_gemini(payload: dict) -> Optional[Tuple[Optional[str], str]]: class GeminiCommunicator: - """通过终端与 Gemini 通信,并从会话文件读取回复""" + """Communicate with Gemini via terminal and read replies from session files""" def __init__(self): self.session_info = self._load_session_info() if not self.session_info: - raise RuntimeError("❌ 未找到活跃的 Gemini 会话,请先运行 ccb up gemini") + raise RuntimeError("❌ No active Gemini session found, please run ccb up gemini first") self.session_id = self.session_info["session_id"] self.runtime_dir = Path(self.session_info["runtime_dir"]) @@ -363,7 +363,7 @@ def __init__(self): healthy, msg = self._check_session_health() if not healthy: - raise RuntimeError(f"❌ 会话不健康: {msg}\n提示: 请运行 ccb up gemini") + raise RuntimeError(f"❌ Session unhealthy: {msg}\nHint: Please run ccb up gemini") self._prime_log_binding() @@ -376,7 +376,7 @@ def _prime_log_binding(self) -> None: def _load_session_info(self): if "GEMINI_SESSION_ID" in os.environ: terminal = os.environ.get("GEMINI_TERMINAL", "tmux") - # 根据终端类型获取正确的 pane_id + # Get correct pane_id based on terminal type if terminal == "wezterm": pane_id = os.environ.get("GEMINI_WEZTERM_PANE", "") elif terminal == "iterm2": @@ -419,18 +419,18 @@ def _check_session_health(self) -> Tuple[bool, str]: def _check_session_health_impl(self, probe_terminal: bool) -> Tuple[bool, str]: try: if not self.runtime_dir.exists(): - return False, "运行时目录不存在" + return False, "Runtime directory not found" if not self.pane_id: - return False, "未找到会话 ID" + return False, "Session ID not found" if probe_terminal and self.backend and not self.backend.is_alive(self.pane_id): - return False, f"{self.terminal} 会话 {self.pane_id} 不存在" - return True, "会话正常" + return False, f"{self.terminal} session {self.pane_id} not found" + return True, "Session OK" except Exception as exc: - return False, f"检查失败: {exc}" + return False, f"Check failed: {exc}" def _send_via_terminal(self, content: str) -> bool: if not self.backend or not self.pane_id: - raise RuntimeError("未配置终端会话") + raise RuntimeError("Terminal session not configured") self.backend.send_text(self.pane_id, content) return True @@ -438,30 +438,30 @@ def ask_async(self, question: str) -> bool: try: healthy, status = self._check_session_health_impl(probe_terminal=False) if not healthy: - raise RuntimeError(f"❌ 会话异常: {status}") + raise RuntimeError(f"❌ Session error: {status}") self._send_via_terminal(question) - print(f"✅ 已发送到 Gemini") - print("提示: 使用 gpend 查看回复") + print(f"✅ Sent to Gemini") + print("Hint: Use gpend to view reply") return True except Exception as exc: - print(f"❌ 发送失败: {exc}") + print(f"❌ Send failed: {exc}") return False def ask_sync(self, question: str, timeout: Optional[int] = None) -> Optional[str]: try: healthy, status = self._check_session_health_impl(probe_terminal=False) if not healthy: - raise RuntimeError(f"❌ 会话异常: {status}") + raise RuntimeError(f"❌ Session error: {status}") - print("🔔 发送问题到 Gemini...") + print("🔔 Sending question to Gemini...") self._send_via_terminal(question) # Capture state after sending to reduce "question → send" latency. state = self.log_reader.capture_state() wait_timeout = self.timeout if timeout is None else int(timeout) if wait_timeout == 0: - print("⏳ 等待 Gemini 回复 (无超时,Ctrl-C 可中断)...") + print("⏳ Waiting for Gemini reply (no timeout, Ctrl-C to interrupt)...") start_time = time.time() last_hint = 0 while True: @@ -471,28 +471,28 @@ def ask_sync(self, question: str, timeout: Optional[int] = None) -> Optional[str if isinstance(session_path, Path): self._remember_gemini_session(session_path) if message: - print("🤖 Gemini 回复:") + print("🤖 Gemini reply:") print(message) return message elapsed = int(time.time() - start_time) if elapsed >= last_hint + 30: last_hint = elapsed - print(f"⏳ 仍在等待... ({elapsed}s)") + print(f"⏳ Still waiting... ({elapsed}s)") - print(f"⏳ 等待 Gemini 回复 (超时 {wait_timeout} 秒)...") + print(f"⏳ Waiting for Gemini reply (timeout {wait_timeout}s)...") message, new_state = self.log_reader.wait_for_message(state, float(wait_timeout)) session_path = (new_state or {}).get("session_path") if isinstance(new_state, dict) else None if isinstance(session_path, Path): self._remember_gemini_session(session_path) if message: - print("🤖 Gemini 回复:") + print("🤖 Gemini reply:") print(message) return message - print("⏰ Gemini 未在限定时间内回复,可稍后执行 gpend 获取答案") + print("⏰ Gemini did not reply in time, run gpend later to get the answer") return None except Exception as exc: - print(f"❌ 同步询问失败: {exc}") + print(f"❌ Sync ask failed: {exc}") return None def consume_pending(self, display: bool = True): @@ -502,7 +502,7 @@ def consume_pending(self, display: bool = True): message = self.log_reader.latest_message() if not message: if display: - print("暂无 Gemini 回复") + print("No Gemini reply yet") return None if display: print(message) @@ -555,15 +555,15 @@ def _remember_gemini_session(self, session_path: Path) -> None: json.dump(data, handle, ensure_ascii=False, indent=2) os.replace(tmp_file, project_file) except PermissionError as e: - print(f"⚠️ 无法更新 {project_file.name}: {e}", file=sys.stderr) - print(f"💡 尝试: sudo chown $USER:$USER {project_file}", file=sys.stderr) + print(f"⚠️ Cannot update {project_file.name}: {e}", file=sys.stderr) + print(f"💡 Try: sudo chown $USER:$USER {project_file}", file=sys.stderr) try: if tmp_file.exists(): tmp_file.unlink(missing_ok=True) except Exception: pass except Exception as e: - print(f"⚠️ 更新 {project_file.name} 失败: {e}", file=sys.stderr) + print(f"⚠️ Failed to update {project_file.name}: {e}", file=sys.stderr) try: if tmp_file.exists(): tmp_file.unlink(missing_ok=True) @@ -572,7 +572,7 @@ def _remember_gemini_session(self, session_path: Path) -> None: def ping(self, display: bool = True) -> Tuple[bool, str]: healthy, status = self._check_session_health() - msg = f"✅ Gemini 连接正常 ({status})" if healthy else f"❌ Gemini 连接异常: {status}" + msg = f"✅ Gemini connection OK ({status})" if healthy else f"❌ Gemini connection error: {status}" if display: print(msg) return healthy, msg @@ -592,13 +592,13 @@ def get_status(self) -> Dict[str, Any]: def main() -> int: import argparse - parser = argparse.ArgumentParser(description="Gemini 通信工具") - parser.add_argument("question", nargs="*", help="要发送的问题") - parser.add_argument("--wait", "-w", action="store_true", help="同步等待回复") - parser.add_argument("--timeout", type=int, default=60, help="同步超时时间(秒)") - parser.add_argument("--ping", action="store_true", help="测试连通性") - parser.add_argument("--status", action="store_true", help="查看状态") - parser.add_argument("--pending", action="store_true", help="查看待处理回复") + parser = argparse.ArgumentParser(description="Gemini communication tool") + parser.add_argument("question", nargs="*", help="Question to send") + parser.add_argument("--wait", "-w", action="store_true", help="Wait for reply synchronously") + parser.add_argument("--timeout", type=int, default=60, help="Sync timeout in seconds") + parser.add_argument("--ping", action="store_true", help="Test connectivity") + parser.add_argument("--status", action="store_true", help="View status") + parser.add_argument("--pending", action="store_true", help="View pending reply") args = parser.parse_args() @@ -609,7 +609,7 @@ def main() -> int: comm.ping() elif args.status: status = comm.get_status() - print("📊 Gemini 状态:") + print("📊 Gemini status:") for key, value in status.items(): print(f" {key}: {value}") elif args.pending: @@ -617,18 +617,18 @@ def main() -> int: elif args.question: question_text = " ".join(args.question).strip() if not question_text: - print("❌ 请提供问题内容") + print("❌ Please provide a question") return 1 if args.wait: comm.ask_sync(question_text, args.timeout) else: comm.ask_async(question_text) else: - print("请提供问题或使用 --ping/--status/--pending 选项") + print("Please provide a question or use --ping/--status/--pending") return 1 return 0 except Exception as exc: - print(f"❌ 执行失败: {exc}") + print(f"❌ Execution failed: {exc}") return 1 diff --git a/lib/session_utils.py b/lib/session_utils.py index 65754e6..3b3b3a7 100644 --- a/lib/session_utils.py +++ b/lib/session_utils.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 """ -session_utils.py - Session 文件权限检查工具 +session_utils.py - Session file permission check utility """ from __future__ import annotations import os @@ -11,41 +11,41 @@ def check_session_writable(session_file: Path) -> Tuple[bool, Optional[str], Optional[str]]: """ - 检查 session 文件是否可写 + Check if session file is writable Returns: - (可写, 错误原因, 解决建议) + (writable, error_reason, fix_suggestion) """ session_file = Path(session_file) parent = session_file.parent - # 1. 检查父目录是否存在且可进入 + # 1. Check if parent directory exists and is accessible if not parent.exists(): - return False, f"目录不存在: {parent}", f"mkdir -p {parent}" + return False, f"Directory not found: {parent}", f"mkdir -p {parent}" if not os.access(parent, os.X_OK): - return False, f"目录无法访问(缺少x权限): {parent}", f"chmod +x {parent}" + return False, f"Directory not accessible (missing x permission): {parent}", f"chmod +x {parent}" - # 2. 检查父目录是否可写 + # 2. Check if parent directory is writable if not os.access(parent, os.W_OK): - return False, f"目录不可写: {parent}", f"chmod u+w {parent}" + return False, f"Directory not writable: {parent}", f"chmod u+w {parent}" - # 3. 如果文件不存在,目录可写就行 + # 3. If file doesn't exist, directory writable is enough if not session_file.exists(): return True, None, None - # 4. 检查是否是普通文件 + # 4. Check if it's a regular file if session_file.is_symlink(): target = session_file.resolve() - return False, f"是符号链接指向 {target}", f"rm -f {session_file}" + return False, f"Is symlink pointing to {target}", f"rm -f {session_file}" if session_file.is_dir(): - return False, "是目录而非文件", f"rmdir {session_file} 或 rm -rf {session_file}" + return False, "Is directory, not file", f"rmdir {session_file} or rm -rf {session_file}" if not session_file.is_file(): - return False, "不是普通文件", f"rm -f {session_file}" + return False, "Not a regular file", f"rm -f {session_file}" - # 5. 检查文件归属 + # 5. Check file ownership try: file_stat = session_file.stat() file_uid = file_stat.st_uid @@ -58,34 +58,34 @@ def check_session_writable(session_file: Path) -> Tuple[bool, Optional[str], Opt except KeyError: owner_name = str(file_uid) current_name = pwd.getpwuid(current_uid).pw_name - return False, f"文件归属为 {owner_name} (当前用户: {current_name})", \ + return False, f"File owned by {owner_name} (current user: {current_name})", \ f"sudo chown {current_name}:{current_name} {session_file}" except Exception: pass - # 6. 检查文件是否可写 + # 6. Check if file is writable if not os.access(session_file, os.W_OK): mode = stat.filemode(session_file.stat().st_mode) - return False, f"文件不可写 (权限: {mode})", f"chmod u+w {session_file}" + return False, f"File not writable (mode: {mode})", f"chmod u+w {session_file}" return True, None, None def safe_write_session(session_file: Path, content: str) -> Tuple[bool, Optional[str]]: """ - 安全写入 session 文件,失败时返回友好错误 + Safely write session file, return friendly error on failure Returns: - (成功, 错误信息) + (success, error_message) """ session_file = Path(session_file) - # 预检查 + # Pre-check writable, reason, fix = check_session_writable(session_file) if not writable: - return False, f"❌ 无法写入 {session_file.name}: {reason}\n💡 解决方案: {fix}" + return False, f"❌ Cannot write {session_file.name}: {reason}\n💡 Fix: {fix}" - # 尝试原子写入 + # Attempt atomic write tmp_file = session_file.with_suffix(".tmp") try: tmp_file.write_text(content, encoding="utf-8") @@ -97,18 +97,18 @@ def safe_write_session(session_file: Path, content: str) -> Tuple[bool, Optional tmp_file.unlink() except Exception: pass - return False, f"❌ 无法写入 {session_file.name}: {e}\n💡 尝试: rm -f {session_file} 后重试" + return False, f"❌ Cannot write {session_file.name}: {e}\n💡 Try: rm -f {session_file} then retry" except Exception as e: if tmp_file.exists(): try: tmp_file.unlink() except Exception: pass - return False, f"❌ 写入失败: {e}" + return False, f"❌ Write failed: {e}" def print_session_error(msg: str, to_stderr: bool = True) -> None: - """输出 session 相关错误""" + """Output session-related error""" import sys output = sys.stderr if to_stderr else sys.stdout print(msg, file=output) diff --git a/lib/terminal.py b/lib/terminal.py index c4158ee..81c2aba 100644 --- a/lib/terminal.py +++ b/lib/terminal.py @@ -36,7 +36,7 @@ def is_wsl() -> bool: def _load_cached_wezterm_bin() -> str | None: - """读取安装时缓存的 WezTerm 路径""" + """Load cached WezTerm path from installation""" config = Path.home() / ".config/ccb/env" if config.exists(): try: @@ -54,11 +54,11 @@ def _load_cached_wezterm_bin() -> str | None: def _get_wezterm_bin() -> str | None: - """获取 WezTerm 路径(带缓存)""" + """Get WezTerm path (with cache)""" global _cached_wezterm_bin if _cached_wezterm_bin: return _cached_wezterm_bin - # 优先级: 环境变量 > 安装缓存 > PATH > 硬编码路径 + # Priority: env var > install cache > PATH > hardcoded paths override = os.environ.get("CODEX_WEZTERM_BIN") or os.environ.get("WEZTERM_BIN") if override and Path(override).exists(): _cached_wezterm_bin = override @@ -82,7 +82,7 @@ def _get_wezterm_bin() -> str | None: def _is_windows_wezterm() -> bool: - """检测 WezTerm 是否运行在 Windows 上""" + """Detect if WezTerm is running on Windows""" override = os.environ.get("CODEX_WEZTERM_BIN") or os.environ.get("WEZTERM_BIN") if override: if ".exe" in override.lower() or "/mnt/" in override: @@ -171,7 +171,7 @@ def create_pane(self, cmd: str, cwd: str, direction: str = "right", percent: int class Iterm2Backend(TerminalBackend): - """iTerm2 后端,使用 it2 CLI (pip install it2)""" + """iTerm2 backend, using it2 CLI (pip install it2)""" _it2_bin: Optional[str] = None @classmethod @@ -189,15 +189,15 @@ def send_text(self, session_id: str, text: str) -> None: sanitized = text.replace("\r", "").strip() if not sanitized: return - # 类似 WezTerm 的方式:先发送文本,再发送回车 - # it2 session send 发送文本(不带换行) + # Similar to WezTerm: send text first, then send Enter + # it2 session send sends text (without newline) subprocess.run( [self._bin(), "session", "send", sanitized, "--session", session_id], check=True, ) - # 等待一点时间,让 TUI 处理输入 + # Wait a bit for TUI to process input time.sleep(0.01) - # 发送回车键(使用 \r) + # Send Enter key (using \r) subprocess.run( [self._bin(), "session", "send", "\r", "--session", session_id], check=True, @@ -226,29 +226,29 @@ def activate(self, session_id: str) -> None: subprocess.run([self._bin(), "session", "focus", session_id]) def create_pane(self, cmd: str, cwd: str, direction: str = "right", percent: int = 50, parent_pane: Optional[str] = None) -> str: - # iTerm2 分屏:vertical 对应 right,horizontal 对应 bottom + # iTerm2 split: vertical corresponds to right, horizontal to bottom args = [self._bin(), "session", "split"] if direction == "right": args.append("--vertical") - # 如果有 parent_pane,指定目标 session + # If parent_pane specified, target that session if parent_pane: args.extend(["--session", parent_pane]) result = subprocess.run(args, capture_output=True, text=True, check=True) - # it2 输出格式: "Created new pane: " + # it2 output format: "Created new pane: " output = result.stdout.strip() if ":" in output: new_session_id = output.split(":")[-1].strip() else: - # 尝试从 stderr 或其他地方获取 + # Try to get from stderr or elsewhere new_session_id = output - # 在新 pane 中执行启动命令 + # Execute startup command in new pane if new_session_id and cmd: - # 先 cd 到工作目录,再执行命令 + # First cd to work directory, then execute command full_cmd = f"cd {shlex.quote(cwd)} && {cmd}" - time.sleep(0.2) # 等待 pane 就绪 - # 使用 send + 回车的方式,与 send_text 保持一致 + time.sleep(0.2) # Wait for pane ready + # Use send + Enter, consistent with send_text subprocess.run( [self._bin(), "session", "send", full_cmd, "--session", new_session_id], check=True @@ -378,20 +378,20 @@ def create_pane(self, cmd: str, cwd: str, direction: str = "right", percent: int def detect_terminal() -> Optional[str]: - # 优先检测当前环境变量(已在某终端中运行) + # Priority: check current env vars (already running in a terminal) if os.environ.get("WEZTERM_PANE"): return "wezterm" if os.environ.get("ITERM_SESSION_ID"): return "iterm2" if os.environ.get("TMUX"): return "tmux" - # 检查配置的二进制覆盖或缓存路径 + # Check configured binary override or cached path if _get_wezterm_bin(): return "wezterm" override = os.environ.get("CODEX_IT2_BIN") or os.environ.get("IT2_BIN") if override and Path(override).expanduser().exists(): return "iterm2" - # 检查可用的终端工具 + # Check available terminal tools if shutil.which("it2"): return "iterm2" if shutil.which("tmux") or shutil.which("tmux.exe"): From eed93b46c3ca97fc8b370fd6788615662afebec3 Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 20 Dec 2025 14:54:55 +0800 Subject: [PATCH 012/153] fix(gemini): verify actual session files before resume MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Calculate project hash directly (sha256 of cwd) instead of relying on stored value. Check if session-*.json files exist in ~/.gemini/tmp//chats/ before using --resume flag. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- ccb | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/ccb b/ccb index 32cef31..51da841 100755 --- a/ccb +++ b/ccb @@ -347,20 +347,23 @@ class AILauncher: Returns (project_hash, has_any_history_for_cwd). Gemini CLI stores sessions under ~/.gemini/tmp//chats/. """ - # Only trust local project state; deleting local dotfiles should reset resume behavior. - project_session = Path.cwd() / ".gemini-session" - if not project_session.exists(): - return None, False + # Calculate hash the same way Gemini CLI does (sha256 of absolute path) + import hashlib try: - data = json.loads(project_session.read_text()) + normalized = str(Path.cwd().expanduser().absolute()) except Exception: - data = {} - if not isinstance(data, dict): - return None, True - project_hash = data.get("gemini_project_hash") - if isinstance(project_hash, str) and project_hash.strip(): - return project_hash.strip(), True - return None, True + normalized = str(Path.cwd()) + project_hash = hashlib.sha256(normalized.encode()).hexdigest() + + # Check if actual session files exist + gemini_root = Path(os.environ.get("GEMINI_ROOT") or (Path.home() / ".gemini" / "tmp")).expanduser() + chats_dir = gemini_root / project_hash / "chats" + if not chats_dir.exists(): + return None, False + session_files = list(chats_dir.glob("session-*.json")) + if not session_files: + return None, False + return project_hash, True def _build_gemini_start_cmd(self) -> str: cmd = "gemini --yolo" if self.auto else "gemini" From a7e482ca8b7d6a6284e1b5cdfdcccffe0c45a4b5 Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 20 Dec 2025 15:06:37 +0800 Subject: [PATCH 013/153] fix(install.ps1): replace emoji with ASCII for PowerShell compatibility MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Windows PowerShell 5.x has poor UTF-8 emoji support, causing parse errors. Replace ❌→[ERROR], ✓→[OK], ⚠️→[WARNING] 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- install.ps1 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/install.ps1 b/install.ps1 index 50e2fb8..9669c50 100644 --- a/install.ps1 +++ b/install.ps1 @@ -45,24 +45,24 @@ function Require-Python310 { $major = [int]$parts[1] $minor = [int]$parts[2] } catch { - Write-Host "❌ Failed to query Python version using: $PythonCmd" + Write-Host "[ERROR] Failed to query Python version using: $PythonCmd" exit 1 } if (($major -ne 3) -or ($minor -lt 10)) { - Write-Host "❌ Python version too old: $version" + Write-Host "[ERROR] Python version too old: $version" Write-Host " ccb requires Python 3.10+" Write-Host " Download: https://www.python.org/downloads/" exit 1 } - Write-Host "✓ Python $version" + Write-Host "[OK] Python $version" } function Confirm-BackendEnv { if ($Yes -or $env:CCB_INSTALL_ASSUME_YES -eq "1") { return } if (-not [Environment]::UserInteractive) { - Write-Host "❌ Non-interactive environment detected, aborting to prevent Windows/WSL mismatch." + Write-Host "[ERROR] Non-interactive environment detected, aborting to prevent Windows/WSL mismatch." Write-Host " If codex/gemini will run in native Windows:" Write-Host " Re-run: powershell -ExecutionPolicy Bypass -File .\install.ps1 install -Yes" exit 1 @@ -70,7 +70,7 @@ function Confirm-BackendEnv { Write-Host "" Write-Host "================================================================" - Write-Host "⚠️ You are installing ccb in native Windows environment" + Write-Host "[WARNING] You are installing ccb in native Windows environment" Write-Host "================================================================" Write-Host "ccb/cask-w must run in the same environment as codex/gemini." Write-Host "" From f01605056f264c07d937e2e76a69f9182ec283f2 Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 20 Dec 2025 15:32:34 +0800 Subject: [PATCH 014/153] feat(i18n): add multi-language support with CCB_LANG MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implement i18n system supporting Chinese and English: - Add lib/i18n.py with language detection and message dictionary - Language detection priority: CCB_LANG env > system locale > default en - Update ccb, bin/*, lib/codex_comm.py, lib/gemini_comm.py - Add i18n functions to install.sh and install.ps1 Usage: Set CCB_LANG=zh for Chinese, CCB_LANG=en for English, or leave unset for auto-detection based on system locale. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- bin/cpend | 6 +- bin/gpend | 6 +- ccb | 55 +++++----- install.ps1 | 33 ++++++ install.sh | 75 ++++++++++++++ lib/codex_comm.py | 13 +-- lib/gemini_comm.py | 13 +-- lib/i18n.py | 245 +++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 403 insertions(+), 43 deletions(-) create mode 100644 lib/i18n.py diff --git a/bin/cpend b/bin/cpend index c00236b..65e6eae 100755 --- a/bin/cpend +++ b/bin/cpend @@ -13,6 +13,8 @@ sys.path.insert(0, str(lib_dir)) from compat import setup_windows_encoding setup_windows_encoding() +from i18n import t + try: from codex_comm import CodexCommunicator except ImportError as exc: @@ -69,10 +71,10 @@ def main() -> int: if output: print(output) else: - print('No Codex reply available') + print(t('no_reply_available', provider='Codex')) return 0 except Exception as exc: - print(f"❌ Execution failed: {exc}") + print(f"❌ {t('execution_failed', error=exc)}") return 1 diff --git a/bin/gpend b/bin/gpend index 03967a9..b7c5acd 100755 --- a/bin/gpend +++ b/bin/gpend @@ -12,6 +12,8 @@ sys.path.insert(0, str(lib_dir)) from compat import setup_windows_encoding setup_windows_encoding() +from i18n import t + try: from gemini_comm import GeminiCommunicator except ImportError as exc: @@ -26,10 +28,10 @@ def main() -> int: if output: print(output) else: - print('No Gemini reply available') + print(t('no_reply_available', provider='Gemini')) return 0 except Exception as exc: - print(f"❌ Execution failed: {exc}") + print(f"❌ {t('execution_failed', error=exc)}") return 1 diff --git a/ccb b/ccb index 51da841..dc2266e 100755 --- a/ccb +++ b/ccb @@ -27,6 +27,7 @@ from terminal import TmuxBackend, WeztermBackend, Iterm2Backend, detect_terminal from compat import setup_windows_encoding from ccb_config import get_backend_env from session_utils import safe_write_session, check_session_writable +from i18n import t setup_windows_encoding() @@ -142,16 +143,16 @@ class AILauncher: def _start_provider(self, provider: str) -> bool: # Handle case when no terminal detected if self.terminal_type is None: - print("❌ No terminal backend detected (WezTerm or tmux)") - print(" Solutions:") - print(" - Install WezTerm (recommended): https://wezfurlong.org/wezterm/") - print(" - Or install tmux") - print(" - Or set CCB_TERMINAL=wezterm and configure CODEX_WEZTERM_BIN") + print(f"❌ {t('no_terminal_backend')}") + print(f" {t('solutions')}") + print(f" - {t('install_wezterm')}") + print(f" - {t('or_install_tmux')}") + print(f" - {t('or_set_ccb_terminal')}") return False # WezTerm mode: no tmux dependency if self.terminal_type == "wezterm": - print(f"🚀 Starting {provider.capitalize()} backend (wezterm)...") + print(f"🚀 {t('starting_backend', provider=provider.capitalize(), terminal='wezterm')}") return self._start_provider_wezterm(provider) elif self.terminal_type == "iterm2": return self._start_provider_iterm2(provider) @@ -161,14 +162,14 @@ class AILauncher: # Try fallback to WezTerm if detect_terminal() == "wezterm": self.terminal_type = "wezterm" - print(f"🚀 Starting {provider.capitalize()} backend (wezterm - tmux unavailable)...") + print(f"🚀 {t('starting_backend', provider=provider.capitalize(), terminal='wezterm - tmux unavailable')}") return self._start_provider_wezterm(provider) else: - print("❌ tmux not installed and WezTerm unavailable") - print(" Solution: Install WezTerm (recommended) or tmux") + print(f"❌ {t('tmux_not_installed')}") + print(f" {t('install_wezterm_or_tmux')}") return False - print(f"🚀 Starting {provider.capitalize()} backend (tmux)...") + print(f"🚀 {t('starting_backend', provider=provider.capitalize(), terminal='tmux')}") tmux_session = f"{provider}-{int(time.time()) % 100000}-{os.getpid()}" self.tmux_sessions[provider] = tmux_session @@ -178,7 +179,7 @@ class AILauncher: elif provider == "gemini": return self._start_gemini(tmux_session) else: - print(f"❌ Unknown provider: {provider}") + print(f"❌ {t('unknown_provider', provider=provider)}") return False def _start_provider_wezterm(self, provider: str) -> bool: @@ -211,7 +212,7 @@ class AILauncher: else: self._write_gemini_session(runtime, None, pane_id=pane_id) - print(f"✅ {provider.capitalize()} started (wezterm pane: {pane_id})") + print(f"✅ {t('started_backend', provider=provider.capitalize(), terminal='wezterm pane', pane_id=pane_id)}") return True def _start_provider_iterm2(self, provider: str) -> bool: @@ -250,7 +251,7 @@ class AILauncher: else: self._write_gemini_session(runtime, None, pane_id=pane_id) - print(f"✅ {provider.capitalize()} started (iterm2 session: {pane_id})") + print(f"✅ {t('started_backend', provider=provider.capitalize(), terminal='iterm2 session', pane_id=pane_id)}") return True def _work_dir_strings(self, work_dir: Path) -> list[str]: @@ -335,11 +336,11 @@ class AILauncher: session_id, has_history = self._get_latest_codex_session_id() if session_id: cmd = f"{cmd} resume {session_id}" - print(f"🔁 Resuming Codex session: {session_id[:8]}...") + print(f"🔁 {t('resuming_session', provider='Codex', session_id=session_id[:8])}") codex_resumed = True if not codex_resumed: - print("ℹ️ No Codex history found, starting fresh") + print(f"ℹ️ {t('no_history_fresh', provider='Codex')}") return cmd def _get_latest_gemini_project_hash(self) -> tuple[str | None, bool]: @@ -371,9 +372,9 @@ class AILauncher: _, has_history = self._get_latest_gemini_project_hash() if has_history: cmd = f"{cmd} --resume latest" - print("🔁 Resuming Gemini session...") + print(f"🔁 {t('resuming_session', provider='Gemini', session_id='')}") else: - print("ℹ️ No Gemini history found, starting fresh") + print(f"ℹ️ {t('no_history_fresh', provider='Gemini')}") return cmd def _warmup_provider(self, provider: str, timeout: float = 8.0) -> bool: @@ -490,7 +491,7 @@ exec tmux attach -t "$TMUX_SESSION" else: subprocess.Popen([terminal, "-e", str(script_file)]) - print(f"✅ Codex started (tmux: {tmux_session})") + print(f"✅ {t('started_backend', provider='Codex', terminal='tmux', pane_id=tmux_session)}") return True def _start_gemini(self, tmux_session: str) -> bool: @@ -536,7 +537,7 @@ exec tmux attach -t "$TMUX_SESSION" # Open new terminal window subprocess.Popen([terminal, "--", str(script_file)]) - print(f"✅ Gemini started (tmux: {tmux_session})") + print(f"✅ {t('started_backend', provider='Gemini', terminal='tmux', pane_id=tmux_session)}") return True def _write_codex_session(self, runtime, tmux_session, input_fifo, output_fifo, pane_id=None): @@ -692,7 +693,7 @@ exec tmux attach -t "$TMUX_SESSION" ) def _start_claude(self) -> int: - print("🚀 Starting Claude...") + print(f"🚀 {t('starting_claude')}") env = os.environ.copy() if "codex" in self.providers: @@ -736,10 +737,10 @@ exec tmux attach -t "$TMUX_SESSION" # Only resume if Claude can actually find the session on disk. if local_session_id and (Path.home() / ".claude" / "session-env" / local_session_id).exists(): cmd.extend(["--resume", local_session_id]) - print(f"🔁 Resuming Claude session: {local_session_id[:8]}...") + print(f"🔁 {t('resuming_claude', session_id=local_session_id[:8])}") else: local_session_id = None - print("ℹ️ No local Claude session found, starting fresh") + print(f"ℹ️ {t('no_claude_session')}") # Always start Claude with an explicit session id when not resuming, so the id is local and resettable. if not local_session_id: @@ -762,14 +763,14 @@ exec tmux attach -t "$TMUX_SESSION" try: return subprocess.run(cmd, stdin=sys.stdin, stdout=sys.stdout, stderr=sys.stderr, env=env).returncode except KeyboardInterrupt: - print("\n⚠️ User interrupted") + print(f"\n⚠️ {t('user_interrupted')}") return 130 def cleanup(self): if self._cleaned: return self._cleaned = True - print("\n🧹 Cleaning up session resources...") + print(f"\n🧹 {t('cleaning_up')}") if self.terminal_type == "wezterm": backend = WeztermBackend() @@ -800,7 +801,7 @@ exec tmux attach -t "$TMUX_SESSION" if self.runtime_dir.exists(): shutil.rmtree(self.runtime_dir, ignore_errors=True) - print("✅ Cleanup complete") + print(f"✅ {t('cleanup_complete')}") def run_up(self) -> int: git_info = _get_git_info() @@ -826,7 +827,7 @@ exec tmux attach -t "$TMUX_SESSION" self._warmup_provider(provider) if self.no_claude: - print("✅ Backends started (--no-claude mode)") + print(f"✅ {t('backends_started_no_claude')}") print() for provider in self.providers: if self.terminal_type == "wezterm": @@ -900,7 +901,7 @@ def cmd_status(args): except Exception as e: results[provider] = {"status": f"Error: {e}", "active": False} - print("📊 AI backend status:") + print(f"📊 {t('backend_status')}") for provider, info in results.items(): icon = "✅" if info.get("active") else "❌" print(f" {icon} {provider.capitalize()}: {info['status']}") diff --git a/install.ps1 b/install.ps1 index 9669c50..c21d04b 100644 --- a/install.ps1 +++ b/install.ps1 @@ -9,6 +9,39 @@ param( $ErrorActionPreference = "Stop" $repoRoot = Split-Path -Parent $MyInvocation.MyCommand.Path +# i18n support +function Get-CCBLang { + $lang = $env:CCB_LANG + if ($lang -in @("zh", "cn", "chinese")) { return "zh" } + if ($lang -in @("en", "english")) { return "en" } + # Auto-detect from system + try { + $culture = (Get-Culture).Name + if ($culture -like "zh*") { return "zh" } + } catch {} + return "en" +} + +$script:CCBLang = Get-CCBLang + +function Get-Msg { + param([string]$Key, [string]$Arg1 = "", [string]$Arg2 = "") + $msgs = @{ + "install_complete" = @{ en = "Installation complete"; zh = "安装完成" } + "uninstall_complete" = @{ en = "Uninstall complete"; zh = "卸载完成" } + "python_old" = @{ en = "Python version too old: $Arg1"; zh = "Python 版本过旧: $Arg1" } + "requires_python" = @{ en = "ccb requires Python 3.10+"; zh = "ccb 需要 Python 3.10+" } + "confirm_windows" = @{ en = "Continue installation in Windows? (y/N)"; zh = "确认继续在 Windows 中安装?(y/N)" } + "cancelled" = @{ en = "Installation cancelled"; zh = "安装已取消" } + "windows_warning" = @{ en = "You are installing ccb in native Windows environment"; zh = "你正在 Windows 原生环境安装 ccb" } + "same_env" = @{ en = "ccb/cask-w must run in the same environment as codex/gemini."; zh = "ccb/cask-w 必须与 codex/gemini 在同一环境运行。" } + } + if ($msgs.ContainsKey($Key)) { + return $msgs[$Key][$script:CCBLang] + } + return $Key +} + function Show-Usage { Write-Host "Usage:" Write-Host " .\install.ps1 install # Install or update" diff --git a/install.sh b/install.sh index 99b9596..b294f91 100755 --- a/install.sh +++ b/install.sh @@ -6,6 +6,81 @@ INSTALL_PREFIX="${CODEX_INSTALL_PREFIX:-$HOME/.local/share/codex-dual}" BIN_DIR="${CODEX_BIN_DIR:-$HOME/.local/bin}" readonly REPO_ROOT INSTALL_PREFIX BIN_DIR +# i18n support +detect_lang() { + local lang="${CCB_LANG:-auto}" + case "$lang" in + zh|cn|chinese) echo "zh" ;; + en|english) echo "en" ;; + *) + local sys_lang="${LANG:-${LC_ALL:-${LC_MESSAGES:-}}}" + if [[ "$sys_lang" == zh* ]] || [[ "$sys_lang" == *chinese* ]]; then + echo "zh" + else + echo "en" + fi + ;; + esac +} + +CCB_LANG_DETECTED="$(detect_lang)" + +# Message function +msg() { + local key="$1" + shift + local en_msg zh_msg + case "$key" in + install_complete) + en_msg="Installation complete" + zh_msg="安装完成" ;; + uninstall_complete) + en_msg="Uninstall complete" + zh_msg="卸载完成" ;; + python_version_old) + en_msg="Python version too old: $1" + zh_msg="Python 版本过旧: $1" ;; + requires_python) + en_msg="Requires Python 3.10+" + zh_msg="需要 Python 3.10+" ;; + missing_dep) + en_msg="Missing dependency: $1" + zh_msg="缺少依赖: $1" ;; + detected_env) + en_msg="Detected $1 environment" + zh_msg="检测到 $1 环境" ;; + wsl1_not_supported) + en_msg="WSL 1 does not support FIFO pipes, please upgrade to WSL 2" + zh_msg="WSL 1 不支持 FIFO 管道,请升级到 WSL 2" ;; + confirm_wsl) + en_msg="Confirm continue installing in WSL? (y/N)" + zh_msg="确认继续在 WSL 中安装?(y/N)" ;; + cancelled) + en_msg="Installation cancelled" + zh_msg="安装已取消" ;; + wsl_warning) + en_msg="Detected WSL environment" + zh_msg="检测到 WSL 环境" ;; + same_env_required) + en_msg="ccb/cask-w must run in the same environment as codex/gemini." + zh_msg="ccb/cask-w 必须与 codex/gemini 在同一环境运行。" ;; + confirm_wsl_native) + en_msg="Please confirm: you will install and run codex/gemini in WSL (not Windows native)." + zh_msg="请确认:你将在 WSL 中安装并运行 codex/gemini(不是 Windows 原生)。" ;; + wezterm_recommended) + en_msg="Recommend installing WezTerm as terminal frontend" + zh_msg="推荐安装 WezTerm 作为终端前端" ;; + *) + en_msg="$key" + zh_msg="$key" ;; + esac + if [[ "$CCB_LANG_DETECTED" == "zh" ]]; then + echo "$zh_msg" + else + echo "$en_msg" + fi +} + SCRIPTS_TO_LINK=( bin/cask bin/cask-w diff --git a/lib/codex_comm.py b/lib/codex_comm.py index 9a6bc90..7f39e42 100644 --- a/lib/codex_comm.py +++ b/lib/codex_comm.py @@ -17,6 +17,7 @@ from terminal import get_backend_for_session, get_pane_id_from_session from ccb_config import apply_backend_env +from i18n import t apply_backend_env() @@ -412,11 +413,11 @@ def ask_sync(self, question: str, timeout: Optional[int] = None) -> Optional[str if not healthy: raise RuntimeError(f"❌ Session error: {status}") - print("🔔 Sending question to Codex...") + print(f"🔔 {t('sending_to', provider='Codex')}") marker, state = self._send_message(question) wait_timeout = self.timeout if timeout is None else int(timeout) if wait_timeout == 0: - print("⏳ Waiting for Codex reply (no timeout, Ctrl-C to interrupt)...") + print(f"⏳ {t('waiting_for_reply', provider='Codex')}") start_time = time.time() last_hint = 0 while True: @@ -427,7 +428,7 @@ def ask_sync(self, question: str, timeout: Optional[int] = None) -> Optional[str log_hint = self.log_reader.current_log_path() self._remember_codex_session(log_hint) if message: - print("🤖 Codex reply:") + print(f"🤖 {t('reply_from', provider='Codex')}") print(message) return message elapsed = int(time.time() - start_time) @@ -442,11 +443,11 @@ def ask_sync(self, question: str, timeout: Optional[int] = None) -> Optional[str log_hint = self.log_reader.current_log_path() self._remember_codex_session(log_hint) if message: - print("🤖 Codex reply:") + print(f"🤖 {t('reply_from', provider='Codex')}") print(message) return message - print("⏰ Codex did not reply in time. Use /cpend later to get the latest answer") + print(f"⏰ {t('timeout_no_reply', provider='Codex')}") return None except Exception as exc: print(f"❌ Sync ask failed: {exc}") @@ -460,7 +461,7 @@ def consume_pending(self, display: bool = True): self._remember_codex_session(self.log_reader.current_log_path()) if not message: if display: - print("No Codex reply available") + print(t('no_reply_available', provider='Codex')) return None if display: print(message) diff --git a/lib/gemini_comm.py b/lib/gemini_comm.py index daad994..4a89834 100755 --- a/lib/gemini_comm.py +++ b/lib/gemini_comm.py @@ -15,6 +15,7 @@ from terminal import get_backend_for_session, get_pane_id_from_session from ccb_config import apply_backend_env +from i18n import t apply_backend_env() @@ -454,14 +455,14 @@ def ask_sync(self, question: str, timeout: Optional[int] = None) -> Optional[str if not healthy: raise RuntimeError(f"❌ Session error: {status}") - print("🔔 Sending question to Gemini...") + print(f"🔔 {t('sending_to', provider='Gemini')}") self._send_via_terminal(question) # Capture state after sending to reduce "question → send" latency. state = self.log_reader.capture_state() wait_timeout = self.timeout if timeout is None else int(timeout) if wait_timeout == 0: - print("⏳ Waiting for Gemini reply (no timeout, Ctrl-C to interrupt)...") + print(f"⏳ {t('waiting_for_reply', provider='Gemini')}") start_time = time.time() last_hint = 0 while True: @@ -471,7 +472,7 @@ def ask_sync(self, question: str, timeout: Optional[int] = None) -> Optional[str if isinstance(session_path, Path): self._remember_gemini_session(session_path) if message: - print("🤖 Gemini reply:") + print(f"🤖 {t('reply_from', provider='Gemini')}") print(message) return message elapsed = int(time.time() - start_time) @@ -485,11 +486,11 @@ def ask_sync(self, question: str, timeout: Optional[int] = None) -> Optional[str if isinstance(session_path, Path): self._remember_gemini_session(session_path) if message: - print("🤖 Gemini reply:") + print(f"🤖 {t('reply_from', provider='Gemini')}") print(message) return message - print("⏰ Gemini did not reply in time, run gpend later to get the answer") + print(f"⏰ {t('timeout_no_reply', provider='Gemini')}") return None except Exception as exc: print(f"❌ Sync ask failed: {exc}") @@ -502,7 +503,7 @@ def consume_pending(self, display: bool = True): message = self.log_reader.latest_message() if not message: if display: - print("No Gemini reply yet") + print(t('no_reply_available', provider='Gemini')) return None if display: print(message) diff --git a/lib/i18n.py b/lib/i18n.py new file mode 100644 index 0000000..9d5332b --- /dev/null +++ b/lib/i18n.py @@ -0,0 +1,245 @@ +""" +i18n - Internationalization support for CCB + +Language detection priority: +1. CCB_LANG environment variable (zh/en/auto) +2. System locale (LANG/LC_ALL/LC_MESSAGES) +3. Default to English +""" + +import os +import locale + +_current_lang = None + +MESSAGES = { + "en": { + # Terminal detection + "no_terminal_backend": "No terminal backend detected (WezTerm or tmux)", + "solutions": "Solutions:", + "install_wezterm": "Install WezTerm (recommended): https://wezfurlong.org/wezterm/", + "or_install_tmux": "Or install tmux", + "or_set_ccb_terminal": "Or set CCB_TERMINAL=wezterm and configure CODEX_WEZTERM_BIN", + "tmux_not_installed": "tmux not installed and WezTerm unavailable", + "install_wezterm_or_tmux": "Solution: Install WezTerm (recommended) or tmux", + + # Startup messages + "starting_backend": "Starting {provider} backend ({terminal})...", + "started_backend": "{provider} started ({terminal}: {pane_id})", + "unknown_provider": "Unknown provider: {provider}", + "resuming_session": "Resuming {provider} session: {session_id}...", + "no_history_fresh": "No {provider} history found, starting fresh", + "warmup": "Warmup: {script}", + "warmup_failed": "Warmup failed: {provider}", + + # Claude + "starting_claude": "Starting Claude...", + "resuming_claude": "Resuming Claude session: {session_id}...", + "no_claude_session": "No local Claude session found, starting fresh", + "session_id": "Session ID: {session_id}", + "runtime_dir": "Runtime dir: {runtime_dir}", + "active_backends": "Active backends: {backends}", + "available_commands": "Available commands:", + "codex_commands": "cask/cask-w/cping/cpend - Codex communication", + "gemini_commands": "gask/gask-w/gping/gpend - Gemini communication", + "executing": "Executing: {cmd}", + "user_interrupted": "User interrupted", + "cleaning_up": "Cleaning up session resources...", + "cleanup_complete": "Cleanup complete", + + # Banner + "banner_title": "Claude Code Bridge {version}", + "banner_date": "{date}", + "banner_backends": "Backends: {backends}", + + # No-claude mode + "backends_started_no_claude": "Backends started (--no-claude mode)", + "switch_to_pane": "Switch to pane:", + "kill_hint": "Kill: ccb kill {providers}", + + # Status + "backend_status": "AI backend status:", + + # Errors + "cannot_write_session": "Cannot write {filename}: {reason}", + "fix_hint": "Fix: {fix}", + "error": "Error", + "execution_failed": "Execution failed: {error}", + "import_failed": "Import failed: {error}", + "module_import_failed": "Module import failed: {error}", + + # Connectivity + "connectivity_test_failed": "{provider} connectivity test failed: {error}", + "no_reply_available": "No {provider} reply available", + + # Commands + "usage": "Usage: {cmd}", + "sending_to": "Sending question to {provider}...", + "waiting_for_reply": "Waiting for {provider} reply (no timeout, Ctrl-C to interrupt)...", + "reply_from": "{provider} reply:", + "timeout_no_reply": "Timeout: no reply from {provider}", + "session_not_found": "No active {provider} session found", + + # Install messages + "install_complete": "Installation complete", + "uninstall_complete": "Uninstall complete", + "python_version_old": "Python version too old: {version}", + "requires_python": "Requires Python 3.10+", + "missing_dependency": "Missing dependency: {dep}", + "detected_env": "Detected {env} environment", + "wsl_not_supported": "WSL 1 does not support FIFO pipes, please upgrade to WSL 2", + "confirm_continue": "Confirm continue? (y/N)", + "cancelled": "Cancelled", + }, + "zh": { + # Terminal detection + "no_terminal_backend": "未检测到终端后端 (WezTerm 或 tmux)", + "solutions": "解决方案:", + "install_wezterm": "安装 WezTerm (推荐): https://wezfurlong.org/wezterm/", + "or_install_tmux": "或安装 tmux", + "or_set_ccb_terminal": "或设置 CCB_TERMINAL=wezterm 并配置 CODEX_WEZTERM_BIN", + "tmux_not_installed": "tmux 未安装且 WezTerm 不可用", + "install_wezterm_or_tmux": "解决方案:安装 WezTerm (推荐) 或 tmux", + + # Startup messages + "starting_backend": "正在启动 {provider} 后端 ({terminal})...", + "started_backend": "{provider} 已启动 ({terminal}: {pane_id})", + "unknown_provider": "未知提供者: {provider}", + "resuming_session": "正在恢复 {provider} 会话: {session_id}...", + "no_history_fresh": "未找到 {provider} 历史记录,全新启动", + "warmup": "预热: {script}", + "warmup_failed": "预热失败: {provider}", + + # Claude + "starting_claude": "正在启动 Claude...", + "resuming_claude": "正在恢复 Claude 会话: {session_id}...", + "no_claude_session": "未找到本地 Claude 会话,全新启动", + "session_id": "会话 ID: {session_id}", + "runtime_dir": "运行目录: {runtime_dir}", + "active_backends": "活动后端: {backends}", + "available_commands": "可用命令:", + "codex_commands": "cask/cask-w/cping/cpend - Codex 通信", + "gemini_commands": "gask/gask-w/gping/gpend - Gemini 通信", + "executing": "执行: {cmd}", + "user_interrupted": "用户中断", + "cleaning_up": "正在清理会话资源...", + "cleanup_complete": "清理完成", + + # Banner + "banner_title": "Claude Code Bridge {version}", + "banner_date": "{date}", + "banner_backends": "后端: {backends}", + + # No-claude mode + "backends_started_no_claude": "后端已启动 (--no-claude 模式)", + "switch_to_pane": "切换到面板:", + "kill_hint": "终止: ccb kill {providers}", + + # Status + "backend_status": "AI 后端状态:", + + # Errors + "cannot_write_session": "无法写入 {filename}: {reason}", + "fix_hint": "修复: {fix}", + "error": "错误", + "execution_failed": "执行失败: {error}", + "import_failed": "导入失败: {error}", + "module_import_failed": "模块导入失败: {error}", + + # Connectivity + "connectivity_test_failed": "{provider} 连通性测试失败: {error}", + "no_reply_available": "暂无 {provider} 回复", + + # Commands + "usage": "用法: {cmd}", + "sending_to": "正在发送问题到 {provider}...", + "waiting_for_reply": "等待 {provider} 回复 (无超时,Ctrl-C 中断)...", + "reply_from": "{provider} 回复:", + "timeout_no_reply": "超时: 未收到 {provider} 回复", + "session_not_found": "未找到活动的 {provider} 会话", + + # Install messages + "install_complete": "安装完成", + "uninstall_complete": "卸载完成", + "python_version_old": "Python 版本过旧: {version}", + "requires_python": "需要 Python 3.10+", + "missing_dependency": "缺少依赖: {dep}", + "detected_env": "检测到 {env} 环境", + "wsl_not_supported": "WSL 1 不支持 FIFO 管道,请升级到 WSL 2", + "confirm_continue": "确认继续?(y/N)", + "cancelled": "已取消", + }, +} + + +def detect_language() -> str: + """Detect language from environment. + + Priority: + 1. CCB_LANG environment variable (zh/en/auto) + 2. System locale + 3. Default to English + """ + ccb_lang = os.environ.get("CCB_LANG", "auto").lower() + + if ccb_lang in ("zh", "cn", "chinese"): + return "zh" + if ccb_lang in ("en", "english"): + return "en" + + # Auto-detect from system locale + try: + lang = os.environ.get("LANG", "") or os.environ.get("LC_ALL", "") or os.environ.get("LC_MESSAGES", "") + if not lang: + lang, _ = locale.getdefaultlocale() + lang = lang or "" + + lang = lang.lower() + if lang.startswith("zh") or "chinese" in lang: + return "zh" + except Exception: + pass + + return "en" + + +def get_lang() -> str: + """Get current language setting.""" + global _current_lang + if _current_lang is None: + _current_lang = detect_language() + return _current_lang + + +def set_lang(lang: str) -> None: + """Set language explicitly.""" + global _current_lang + if lang in ("zh", "en"): + _current_lang = lang + + +def t(key: str, **kwargs) -> str: + """Get translated message by key. + + Args: + key: Message key + **kwargs: Format arguments + + Returns: + Translated and formatted message + """ + lang = get_lang() + messages = MESSAGES.get(lang, MESSAGES["en"]) + + msg = messages.get(key) + if msg is None: + # Fallback to English + msg = MESSAGES["en"].get(key, key) + + if kwargs: + try: + msg = msg.format(**kwargs) + except (KeyError, ValueError): + pass + + return msg From 6417a52c608e516e116b9b3eb727c98c9f5db7a4 Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 20 Dec 2025 15:47:53 +0800 Subject: [PATCH 015/153] fix(cask-w): add flush=True and early startup signal for background mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add flush=True to print statements in codex_comm.py and gemini_comm.py to ensure immediate output in non-interactive/background mode - Add early "🚀 cask-w/gask-w started" message before initialization so Claude can detect process started and return immediately This should improve stability when using run_in_background=true. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- bin/cask-w | 3 +++ bin/gask-w | 3 +++ lib/codex_comm.py | 4 ++-- lib/gemini_comm.py | 4 ++-- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/bin/cask-w b/bin/cask-w index 29f3710..3017c05 100755 --- a/bin/cask-w +++ b/bin/cask-w @@ -25,6 +25,9 @@ def main(argv: list[str]) -> int: print("❌ Message cannot be empty", file=sys.stderr) return 1 + # Early startup signal for background mode detection + print("🚀 cask-w started", flush=True) + try: comm = CodexCommunicator() reply = comm.ask_sync(message, timeout=0) diff --git a/bin/gask-w b/bin/gask-w index c1a1d0b..4381dda 100755 --- a/bin/gask-w +++ b/bin/gask-w @@ -27,6 +27,9 @@ def main(argv: list[str]) -> int: print("❌ Message cannot be empty", file=sys.stderr) return 1 + # Early startup signal for background mode detection + print("🚀 gask-w started", flush=True) + try: comm = GeminiCommunicator() reply = comm.ask_sync(message, timeout=0) diff --git a/lib/codex_comm.py b/lib/codex_comm.py index 7f39e42..a711e23 100644 --- a/lib/codex_comm.py +++ b/lib/codex_comm.py @@ -413,11 +413,11 @@ def ask_sync(self, question: str, timeout: Optional[int] = None) -> Optional[str if not healthy: raise RuntimeError(f"❌ Session error: {status}") - print(f"🔔 {t('sending_to', provider='Codex')}") + print(f"🔔 {t('sending_to', provider='Codex')}", flush=True) marker, state = self._send_message(question) wait_timeout = self.timeout if timeout is None else int(timeout) if wait_timeout == 0: - print(f"⏳ {t('waiting_for_reply', provider='Codex')}") + print(f"⏳ {t('waiting_for_reply', provider='Codex')}", flush=True) start_time = time.time() last_hint = 0 while True: diff --git a/lib/gemini_comm.py b/lib/gemini_comm.py index 4a89834..e65e76e 100755 --- a/lib/gemini_comm.py +++ b/lib/gemini_comm.py @@ -455,14 +455,14 @@ def ask_sync(self, question: str, timeout: Optional[int] = None) -> Optional[str if not healthy: raise RuntimeError(f"❌ Session error: {status}") - print(f"🔔 {t('sending_to', provider='Gemini')}") + print(f"🔔 {t('sending_to', provider='Gemini')}", flush=True) self._send_via_terminal(question) # Capture state after sending to reduce "question → send" latency. state = self.log_reader.capture_state() wait_timeout = self.timeout if timeout is None else int(timeout) if wait_timeout == 0: - print(f"⏳ {t('waiting_for_reply', provider='Gemini')}") + print(f"⏳ {t('waiting_for_reply', provider='Gemini')}", flush=True) start_time = time.time() last_hint = 0 while True: From 50faee5df7b58f166df42ed14f71e8f39f3f4ecd Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 20 Dec 2025 15:51:28 +0800 Subject: [PATCH 016/153] feat(fast-path): add /cask-w and /gask-w to direct triggers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add /cask-w and /gask-w to the fast path triggers in CLAUDE.md config, so Claude will immediately call bash without going through skill system. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install.sh b/install.sh index b294f91..b155448 100755 --- a/install.sh +++ b/install.sh @@ -637,7 +637,7 @@ install_claude_md_config() { Codex is another AI assistant running in a separate terminal session (WezTerm, iTerm2 or tmux). When user intent involves asking/consulting/collaborating with Codex: Fast path (minimize latency): -- If the user message starts with any of: `@codex`, `codex:`, `ask codex`, `let codex` then immediately run: +- If the user message starts with any of: `@codex`, `codex:`, `ask codex`, `let codex`, `/cask-w` then immediately run: - `Bash(cask-w "", run_in_background=true)` (background send, continue immediately) - If user message is only the prefix (no content), ask a 1-line clarification for what to send. @@ -667,7 +667,7 @@ Examples: Gemini is another AI assistant running in a separate terminal session (WezTerm, iTerm2 or tmux). When user intent involves asking/consulting/collaborating with Gemini: Fast path (minimize latency): -- If the user message starts with any of: `@gemini`, `gemini:`, `ask gemini`, `let gemini` then immediately run: +- If the user message starts with any of: `@gemini`, `gemini:`, `ask gemini`, `let gemini`, `/gask-w` then immediately run: - `Bash(gask-w "", run_in_background=true)` (background send, continue immediately) - If user message is only the prefix (no content), ask a 1-line clarification for what to send. From b5e7674e41e1678f84bd00fbac375df48ea13ef9 Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 20 Dec 2025 16:47:21 +0800 Subject: [PATCH 017/153] perf(cask-w): optimize startup with lazy import and lazy init MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Optimizations: - Move imports after startup signal for faster first output - Add lazy_init parameter to CodexCommunicator and GeminiCommunicator - Defer log reader creation and health check until actually needed - Skip Windows encoding setup on Linux Performance improvement: - Startup to first output: 38-40ms -> 24-27ms (35-40% faster) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- bin/cask-w | 13 ++++++++----- bin/gask-w | 13 ++++++++----- lib/codex_comm.py | 35 +++++++++++++++++++++++++++-------- lib/gemini_comm.py | 41 ++++++++++++++++++++++++++++++----------- 4 files changed, 73 insertions(+), 29 deletions(-) diff --git a/bin/cask-w b/bin/cask-w index 3017c05..514f660 100755 --- a/bin/cask-w +++ b/bin/cask-w @@ -9,10 +9,6 @@ from pathlib import Path script_dir = Path(__file__).resolve().parent lib_dir = script_dir.parent / "lib" sys.path.insert(0, str(lib_dir)) -from compat import setup_windows_encoding -setup_windows_encoding() - -from codex_comm import CodexCommunicator def main(argv: list[str]) -> int: @@ -28,8 +24,15 @@ def main(argv: list[str]) -> int: # Early startup signal for background mode detection print("🚀 cask-w started", flush=True) + # Lazy imports after startup signal + if sys.platform == "win32": + from compat import setup_windows_encoding + setup_windows_encoding() + + from codex_comm import CodexCommunicator + try: - comm = CodexCommunicator() + comm = CodexCommunicator(lazy_init=True) reply = comm.ask_sync(message, timeout=0) return 0 if reply else 1 diff --git a/bin/gask-w b/bin/gask-w index 4381dda..13f3aac 100755 --- a/bin/gask-w +++ b/bin/gask-w @@ -11,10 +11,6 @@ from pathlib import Path script_dir = Path(__file__).resolve().parent lib_dir = script_dir.parent / "lib" sys.path.insert(0, str(lib_dir)) -from compat import setup_windows_encoding -setup_windows_encoding() - -from gemini_comm import GeminiCommunicator def main(argv: list[str]) -> int: @@ -30,8 +26,15 @@ def main(argv: list[str]) -> int: # Early startup signal for background mode detection print("🚀 gask-w started", flush=True) + # Lazy imports after startup signal + if sys.platform == "win32": + from compat import setup_windows_encoding + setup_windows_encoding() + + from gemini_comm import GeminiCommunicator + try: - comm = GeminiCommunicator() + comm = GeminiCommunicator(lazy_init=True) reply = comm.ask_sync(message, timeout=0) return 0 if reply else 1 diff --git a/lib/codex_comm.py b/lib/codex_comm.py index a711e23..0c6859f 100644 --- a/lib/codex_comm.py +++ b/lib/codex_comm.py @@ -237,7 +237,7 @@ def _extract_message(entry: dict) -> Optional[str]: class CodexCommunicator: """Communicates with Codex bridge via FIFO and reads replies from logs""" - def __init__(self): + def __init__(self, lazy_init: bool = False): self.session_info = self._load_session_info() if not self.session_info: raise RuntimeError("❌ No active Codex session found. Run 'ccb up codex' first") @@ -251,16 +251,35 @@ def __init__(self): self.timeout = int(os.environ.get("CODEX_SYNC_TIMEOUT", "30")) self.marker_prefix = "ask" - preferred_log = self.session_info.get("codex_session_path") - bound_session_id = self.session_info.get("codex_session_id") - self.log_reader = CodexLogReader(log_path=preferred_log, session_id_filter=bound_session_id) self.project_session_file = self.session_info.get("_session_file") - self._prime_log_binding() + # Lazy initialization: defer log reader and health check + self._log_reader: Optional[CodexLogReader] = None + self._log_reader_primed = False - healthy, msg = self._check_session_health() - if not healthy: - raise RuntimeError(f"❌ Session unhealthy: {msg}\nTip: Run 'ccb up codex' to start a new session") + if not lazy_init: + self._ensure_log_reader() + healthy, msg = self._check_session_health() + if not healthy: + raise RuntimeError(f"❌ Session unhealthy: {msg}\nTip: Run 'ccb up codex' to start a new session") + + @property + def log_reader(self) -> CodexLogReader: + """Lazy-load log reader on first access""" + if self._log_reader is None: + self._ensure_log_reader() + return self._log_reader + + def _ensure_log_reader(self) -> None: + """Initialize log reader if not already done""" + if self._log_reader is not None: + return + preferred_log = self.session_info.get("codex_session_path") + bound_session_id = self.session_info.get("codex_session_id") + self._log_reader = CodexLogReader(log_path=preferred_log, session_id_filter=bound_session_id) + if not self._log_reader_primed: + self._prime_log_binding() + self._log_reader_primed = True def _load_session_info(self): if "CODEX_SESSION_ID" in os.environ: diff --git a/lib/gemini_comm.py b/lib/gemini_comm.py index e65e76e..3ea6d1e 100755 --- a/lib/gemini_comm.py +++ b/lib/gemini_comm.py @@ -343,7 +343,7 @@ def _extract_last_gemini(payload: dict) -> Optional[Tuple[Optional[str], str]]: class GeminiCommunicator: """Communicate with Gemini via terminal and read replies from session files""" - def __init__(self): + def __init__(self, lazy_init: bool = False): self.session_info = self._load_session_info() if not self.session_info: raise RuntimeError("❌ No active Gemini session found, please run ccb up gemini first") @@ -353,20 +353,39 @@ def __init__(self): self.terminal = self.session_info.get("terminal", "tmux") self.pane_id = get_pane_id_from_session(self.session_info) self.timeout = int(os.environ.get("GEMINI_SYNC_TIMEOUT", "60")) - work_dir_hint = self.session_info.get("work_dir") - log_work_dir = Path(work_dir_hint) if isinstance(work_dir_hint, str) and work_dir_hint else None - self.log_reader = GeminiLogReader(work_dir=log_work_dir) - preferred_session = self.session_info.get("gemini_session_path") or self.session_info.get("session_path") - if preferred_session: - self.log_reader.set_preferred_session(Path(str(preferred_session))) self.project_session_file = self.session_info.get("_session_file") self.backend = get_backend_for_session(self.session_info) - healthy, msg = self._check_session_health() - if not healthy: - raise RuntimeError(f"❌ Session unhealthy: {msg}\nHint: Please run ccb up gemini") + # Lazy initialization: defer log reader and health check + self._log_reader: Optional[GeminiLogReader] = None + self._log_reader_primed = False - self._prime_log_binding() + if not lazy_init: + self._ensure_log_reader() + healthy, msg = self._check_session_health() + if not healthy: + raise RuntimeError(f"❌ Session unhealthy: {msg}\nHint: Please run ccb up gemini") + + @property + def log_reader(self) -> GeminiLogReader: + """Lazy-load log reader on first access""" + if self._log_reader is None: + self._ensure_log_reader() + return self._log_reader + + def _ensure_log_reader(self) -> None: + """Initialize log reader if not already done""" + if self._log_reader is not None: + return + work_dir_hint = self.session_info.get("work_dir") + log_work_dir = Path(work_dir_hint) if isinstance(work_dir_hint, str) and work_dir_hint else None + self._log_reader = GeminiLogReader(work_dir=log_work_dir) + preferred_session = self.session_info.get("gemini_session_path") or self.session_info.get("session_path") + if preferred_session: + self._log_reader.set_preferred_session(Path(str(preferred_session))) + if not self._log_reader_primed: + self._prime_log_binding() + self._log_reader_primed = True def _prime_log_binding(self) -> None: session_path = self.log_reader.current_session_path() From de73befa5364f0cb9ebf79f27a41ef8912115a5c Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 20 Dec 2025 17:03:24 +0800 Subject: [PATCH 018/153] perf(cask-w,gask-w): optimize startup with lazy import and lazy init MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove timeout=0 parameter from ask_sync calls - Use lazy imports for better startup performance - Simplify error output format - Use raise SystemExit instead of sys.exit 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- bin/cask-w | 2 +- bin/gask-w | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/bin/cask-w b/bin/cask-w index 514f660..49df19d 100755 --- a/bin/cask-w +++ b/bin/cask-w @@ -33,7 +33,7 @@ def main(argv: list[str]) -> int: try: comm = CodexCommunicator(lazy_init=True) - reply = comm.ask_sync(message, timeout=0) + reply = comm.ask_sync(message) return 0 if reply else 1 except Exception as exc: diff --git a/bin/gask-w b/bin/gask-w index 13f3aac..09ff623 100755 --- a/bin/gask-w +++ b/bin/gask-w @@ -2,9 +2,7 @@ """ gask-w - Sync send message to Gemini and wait for reply """ - from __future__ import annotations - import sys from pathlib import Path @@ -35,13 +33,13 @@ def main(argv: list[str]) -> int: try: comm = GeminiCommunicator(lazy_init=True) - reply = comm.ask_sync(message, timeout=0) + reply = comm.ask_sync(message) return 0 if reply else 1 except Exception as exc: - print(f"❌ {exc}", file=sys.stderr) + print(exc, file=sys.stderr) return 1 if __name__ == "__main__": - sys.exit(main(sys.argv)) + raise SystemExit(main(sys.argv)) From a8db8d3762c5363f6c156656ccb89d054320296d Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 20 Dec 2025 17:37:23 +0800 Subject: [PATCH 019/153] fix(cask-w,gask-w): stop after sending, wait for user input MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change behavior to STOP immediately after sending to Codex/Gemini instead of continuing with other work in background. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- commands/cask-w.md | 20 ++++++++------------ commands/gask-w.md | 20 ++++++++------------ install.sh | 42 ++++++++++++++++++++++-------------------- 3 files changed, 38 insertions(+), 44 deletions(-) diff --git a/commands/cask-w.md b/commands/cask-w.md index 487d0c9..cdfb49f 100644 --- a/commands/cask-w.md +++ b/commands/cask-w.md @@ -1,25 +1,21 @@ Forward commands to Codex session and wait for reply via `cask-w` command (supports tmux / WezTerm, forward only, does not execute in current Claude process). Execution: -- Run in background `Bash(cask-w "", run_in_background=true)` -- Continue conversation immediately after sending, no blocking wait -- Use `TaskOutput(task_id, block=true)` to get result when needed +- Run `Bash(cask-w "")` +- After sending, STOP immediately and wait for user input +- Do NOT continue with other tasks Parameters: - `` required, will be forwarded to Codex session -- Returns task_id for later result retrieval Workflow: -1. Send to Codex in background -2. Return task_id immediately -3. Claude continues with other tasks -4. Use TaskOutput to get reply when needed +1. Send to Codex and wait for reply +2. Display result to user +3. STOP and wait for user's next instruction Examples: -- `Bash(cask-w "1+2", run_in_background=true)` -> returns task_id -- `TaskOutput(task_id, block=true)` -> get Codex reply +- `Bash(cask-w "1+2")` -> wait for reply, then STOP Hints: -- Can continue conversation after sending, no need to wait - Use `/cpend` to view latest reply -- Use `TaskOutput` to get specific task result +- Use `cask` for fire-and-forget (no wait) diff --git a/commands/gask-w.md b/commands/gask-w.md index 2b9a72c..f480e33 100644 --- a/commands/gask-w.md +++ b/commands/gask-w.md @@ -1,25 +1,21 @@ Forward commands to Gemini session and wait for reply via `gask-w` command (supports tmux / WezTerm). Execution: -- Run in background `Bash(gask-w "", run_in_background=true)` -- Continue conversation immediately after sending, no blocking wait -- Use `TaskOutput(task_id, block=true)` to get result when needed +- Run `Bash(gask-w "")` +- After sending, STOP immediately and wait for user input +- Do NOT continue with other tasks Parameters: - `` required, will be forwarded to Gemini session -- Returns task_id for later result retrieval Workflow: -1. Send to Gemini in background -2. Return task_id immediately -3. Claude continues with other tasks -4. Use TaskOutput to get reply when needed +1. Send to Gemini and wait for reply +2. Display result to user +3. STOP and wait for user's next instruction Examples: -- `Bash(gask-w "explain this code", run_in_background=true)` -> returns task_id -- `TaskOutput(task_id, block=true)` -> get Gemini reply +- `Bash(gask-w "explain this code")` -> wait for reply, then STOP Hints: -- Can continue conversation after sending, no need to wait - Use `/gpend` to view latest reply -- Use `TaskOutput` to get specific task result +- Use `gask` for fire-and-forget (no wait) diff --git a/install.sh b/install.sh index b155448..f8fb73d 100755 --- a/install.sh +++ b/install.sh @@ -636,9 +636,11 @@ install_claude_md_config() { ## Codex Collaboration Rules Codex is another AI assistant running in a separate terminal session (WezTerm, iTerm2 or tmux). When user intent involves asking/consulting/collaborating with Codex: +**CRITICAL: After sending cask-w, DO NOT perform any additional actions. Stop and wait for user input.** + Fast path (minimize latency): - If the user message starts with any of: `@codex`, `codex:`, `ask codex`, `let codex`, `/cask-w` then immediately run: - - `Bash(cask-w "", run_in_background=true)` (background send, continue immediately) + - `Bash(cask-w "")` then STOP and wait for user - If user message is only the prefix (no content), ask a 1-line clarification for what to send. Trigger conditions (any match): @@ -647,28 +649,29 @@ Trigger conditions (any match): - User asks about codex's status or previous reply Command selection: -- Default ask/collaborate -> `Bash(cask-w "", run_in_background=true)` - - Sends in background, returns task_id immediately - - Continue with other work, do not wait - - Use `TaskOutput(task_id, block=true)` when result is needed -- Send without waiting -> `cask ""` (async, returns immediately) +- Default ask/collaborate -> `Bash(cask-w "")` + - After sending, STOP immediately and wait for user input + - Do NOT continue with other work +- Send without waiting -> `cask ""` (fire and forget) - Check connectivity -> `cping` - View previous reply -> `cpend` -- Get background result -> `TaskOutput(task_id="xxx", block=true)` Examples: -- "what does codex think" -> Bash(cask-w, run_in_background=true), then continue -- "ask codex to review this" -> Bash(cask-w, run_in_background=true), then continue +- "what does codex think" -> `Bash(cask-w "...")`, then STOP +- "ask codex to review this" -> `Bash(cask-w "...")`, then STOP +- "codex, help me with X" -> `Bash(cask-w "...")`, then STOP - "is codex alive" -> cping - "don't wait for reply" -> cask -- "get codex result" -> TaskOutput(task_id) or cpend +- "view codex reply" -> cpend ## Gemini Collaboration Rules Gemini is another AI assistant running in a separate terminal session (WezTerm, iTerm2 or tmux). When user intent involves asking/consulting/collaborating with Gemini: +**CRITICAL: After sending gask-w, DO NOT perform any additional actions. Stop and wait for user input.** + Fast path (minimize latency): - If the user message starts with any of: `@gemini`, `gemini:`, `ask gemini`, `let gemini`, `/gask-w` then immediately run: - - `Bash(gask-w "", run_in_background=true)` (background send, continue immediately) + - `Bash(gask-w "")` then STOP and wait for user - If user message is only the prefix (no content), ask a 1-line clarification for what to send. Trigger conditions (any match): @@ -677,21 +680,20 @@ Trigger conditions (any match): - User asks about gemini's status or previous reply Command selection: -- Default ask/collaborate -> `Bash(gask-w "", run_in_background=true)` - - Sends in background, returns task_id immediately - - Continue with other work, do not wait - - Use `TaskOutput(task_id, block=true)` when result is needed -- Send without waiting -> `gask ""` (async, returns immediately) +- Default ask/collaborate -> `Bash(gask-w "")` + - After sending, STOP immediately and wait for user input + - Do NOT continue with other work +- Send without waiting -> `gask ""` (fire and forget) - Check connectivity -> `gping` - View previous reply -> `gpend` -- Get background result -> `TaskOutput(task_id="xxx", block=true)` Examples: -- "what does gemini think" -> Bash(gask-w, run_in_background=true), then continue -- "ask gemini to review this" -> Bash(gask-w, run_in_background=true), then continue +- "what does gemini think" -> `Bash(gask-w "...")`, then STOP +- "ask gemini to review this" -> `Bash(gask-w "...")`, then STOP +- "gemini, help me with X" -> `Bash(gask-w "...")`, then STOP - "is gemini alive" -> gping - "don't wait for reply" -> gask -- "get gemini result" -> TaskOutput(task_id) or gpend +- "view gemini reply" -> gpend AI_RULES ) From d9ab3ac1ac3bc8db092280ff87fa4c42a2d1c8ba Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 20 Dec 2025 17:52:30 +0800 Subject: [PATCH 020/153] feat(cask-w,gask-w): non-blocking send with background reply wait MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - cask-w/gask-w now return immediately after sending - Background process waits for reply (up to 5 min) - Reply cached in ~/.cache/ccb/ for cpend/gpend to read - cpend/gpend check cache first before querying session 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- bin/cask-w | 60 +++++++++++++++++++++++++++++++++++++++++++++++------- bin/cpend | 22 ++++++++++++++++++++ bin/gask-w | 59 ++++++++++++++++++++++++++++++++++++++++++++++------- bin/gpend | 22 ++++++++++++++++++++ 4 files changed, 149 insertions(+), 14 deletions(-) diff --git a/bin/cask-w b/bin/cask-w index 49df19d..313f98d 100755 --- a/bin/cask-w +++ b/bin/cask-w @@ -1,8 +1,9 @@ #!/usr/bin/env python3 """ -cask-w - Sync send message to Codex and wait for reply +cask-w - Send message to Codex and wait for reply in background """ from __future__ import annotations +import os import sys from pathlib import Path @@ -21,10 +22,6 @@ def main(argv: list[str]) -> int: print("❌ Message cannot be empty", file=sys.stderr) return 1 - # Early startup signal for background mode detection - print("🚀 cask-w started", flush=True) - - # Lazy imports after startup signal if sys.platform == "win32": from compat import setup_windows_encoding setup_windows_encoding() @@ -33,8 +30,57 @@ def main(argv: list[str]) -> int: try: comm = CodexCommunicator(lazy_init=True) - reply = comm.ask_sync(message) - return 0 if reply else 1 + + # Check session health + healthy, status = comm._check_session_health_impl(probe_terminal=False) + if not healthy: + print(f"❌ Session error: {status}", file=sys.stderr) + return 1 + + # Send message + from i18n import t + print(f"🔔 {t('sending_to', provider='Codex')}", flush=True) + marker, state = comm._send_message(message) + print("✅ Message sent, waiting for reply in background...", flush=True) + + # Fork background process to wait for reply + pid = os.fork() if hasattr(os, 'fork') else None + + if pid is None: + # Windows: no fork, wait synchronously with short timeout + import time + message_reply, new_state = comm.log_reader.wait_for_message(state, 30.0) + if message_reply: + print(f"🤖 {t('reply_from', provider='Codex')}") + print(message_reply) + else: + print("⏰ Timeout waiting for reply") + return 0 + elif pid == 0: + # Child process: wait for reply silently + import time + try: + # Detach from terminal + os.setsid() + sys.stdin.close() + sys.stdout = open(os.devnull, 'w') + sys.stderr = open(os.devnull, 'w') + + # Wait for reply (up to 5 minutes) + message_reply, new_state = comm.log_reader.wait_for_message(state, 300.0) + + # Save reply to cache file for cpend to read + if message_reply: + cache_dir = Path.home() / ".cache" / "ccb" + cache_dir.mkdir(parents=True, exist_ok=True) + reply_file = cache_dir / "codex_last_reply.txt" + reply_file.write_text(message_reply, encoding="utf-8") + except Exception: + pass + os._exit(0) + else: + # Parent process: return immediately + return 0 except Exception as exc: print(exc, file=sys.stderr) diff --git a/bin/cpend b/bin/cpend index 65e6eae..e814572 100755 --- a/bin/cpend +++ b/bin/cpend @@ -22,6 +22,21 @@ except ImportError as exc: sys.exit(1) +def _load_cached_reply() -> str | None: + """Load cached reply from background cask-w process""" + cache_file = Path.home() / ".cache" / "ccb" / "codex_last_reply.txt" + if not cache_file.exists(): + return None + try: + content = cache_file.read_text(encoding="utf-8").strip() + if content: + cache_file.unlink() # Clear after reading + return content + except Exception: + pass + return None + + def _load_pending_state() -> dict: """Load pending state saved by cask-w timeout from .codex-session""" session_file = Path.cwd() / ".codex-session" @@ -53,6 +68,13 @@ def _clear_pending_state() -> None: def main() -> int: try: + # First check cached reply from background cask-w + cached = _load_cached_reply() + if cached: + print(f"🤖 Codex reply:") + print(cached) + return 0 + comm = CodexCommunicator() pending = _load_pending_state() diff --git a/bin/gask-w b/bin/gask-w index 09ff623..992068b 100755 --- a/bin/gask-w +++ b/bin/gask-w @@ -1,8 +1,9 @@ #!/usr/bin/env python3 """ -gask-w - Sync send message to Gemini and wait for reply +gask-w - Send message to Gemini and wait for reply in background """ from __future__ import annotations +import os import sys from pathlib import Path @@ -21,10 +22,6 @@ def main(argv: list[str]) -> int: print("❌ Message cannot be empty", file=sys.stderr) return 1 - # Early startup signal for background mode detection - print("🚀 gask-w started", flush=True) - - # Lazy imports after startup signal if sys.platform == "win32": from compat import setup_windows_encoding setup_windows_encoding() @@ -33,8 +30,56 @@ def main(argv: list[str]) -> int: try: comm = GeminiCommunicator(lazy_init=True) - reply = comm.ask_sync(message) - return 0 if reply else 1 + + # Check session health + healthy, status = comm._check_session_health_impl(probe_terminal=False) + if not healthy: + print(f"❌ Session error: {status}", file=sys.stderr) + return 1 + + # Send message + from i18n import t + print(f"🔔 {t('sending_to', provider='Gemini')}", flush=True) + comm._send_via_terminal(message) + state = comm.log_reader.capture_state() + print("✅ Message sent, waiting for reply in background...", flush=True) + + # Fork background process to wait for reply + pid = os.fork() if hasattr(os, 'fork') else None + + if pid is None: + # Windows: no fork, wait synchronously with short timeout + message_reply, new_state = comm.log_reader.wait_for_message(state, 30.0) + if message_reply: + print(f"🤖 {t('reply_from', provider='Gemini')}") + print(message_reply) + else: + print("⏰ Timeout waiting for reply") + return 0 + elif pid == 0: + # Child process: wait for reply silently + try: + # Detach from terminal + os.setsid() + sys.stdin.close() + sys.stdout = open(os.devnull, 'w') + sys.stderr = open(os.devnull, 'w') + + # Wait for reply (up to 5 minutes) + message_reply, new_state = comm.log_reader.wait_for_message(state, 300.0) + + # Save reply to cache file for gpend to read + if message_reply: + cache_dir = Path.home() / ".cache" / "ccb" + cache_dir.mkdir(parents=True, exist_ok=True) + reply_file = cache_dir / "gemini_last_reply.txt" + reply_file.write_text(message_reply, encoding="utf-8") + except Exception: + pass + os._exit(0) + else: + # Parent process: return immediately + return 0 except Exception as exc: print(exc, file=sys.stderr) diff --git a/bin/gpend b/bin/gpend index b7c5acd..0faf63c 100755 --- a/bin/gpend +++ b/bin/gpend @@ -21,8 +21,30 @@ except ImportError as exc: sys.exit(1) +def _load_cached_reply() -> str | None: + """Load cached reply from background gask-w process""" + cache_file = Path.home() / ".cache" / "ccb" / "gemini_last_reply.txt" + if not cache_file.exists(): + return None + try: + content = cache_file.read_text(encoding="utf-8").strip() + if content: + cache_file.unlink() # Clear after reading + return content + except Exception: + pass + return None + + def main() -> int: try: + # First check cached reply from background gask-w + cached = _load_cached_reply() + if cached: + print(f"🤖 Gemini reply:") + print(cached) + return 0 + comm = GeminiCommunicator() output = comm.consume_pending(display=False) if output: From 5fa59ce8d6f88661e10a96664ae323bde72b5772 Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 20 Dec 2025 18:07:24 +0800 Subject: [PATCH 021/153] fix(cask-w,gask-w): use double fork to fully detach background process MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prevents parent process from blocking on child stdout/stderr. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- bin/cask-w | 38 +++++++++++++++++++------------------- bin/gask-w | 36 +++++++++++++++++++----------------- 2 files changed, 38 insertions(+), 36 deletions(-) diff --git a/bin/cask-w b/bin/cask-w index 313f98d..6e24ac9 100755 --- a/bin/cask-w +++ b/bin/cask-w @@ -43,25 +43,19 @@ def main(argv: list[str]) -> int: marker, state = comm._send_message(message) print("✅ Message sent, waiting for reply in background...", flush=True) - # Fork background process to wait for reply - pid = os.fork() if hasattr(os, 'fork') else None - - if pid is None: - # Windows: no fork, wait synchronously with short timeout - import time - message_reply, new_state = comm.log_reader.wait_for_message(state, 30.0) - if message_reply: - print(f"🤖 {t('reply_from', provider='Codex')}") - print(message_reply) - else: - print("⏰ Timeout waiting for reply") - return 0 - elif pid == 0: - # Child process: wait for reply silently - import time + # Double fork to fully detach background process + if hasattr(os, 'fork'): + pid = os.fork() + if pid > 0: + # Parent: return immediately + return 0 + # First child: fork again and exit + os.setsid() + pid2 = os.fork() + if pid2 > 0: + os._exit(0) # First child exits + # Grandchild: wait for reply silently try: - # Detach from terminal - os.setsid() sys.stdin.close() sys.stdout = open(os.devnull, 'w') sys.stderr = open(os.devnull, 'w') @@ -79,7 +73,13 @@ def main(argv: list[str]) -> int: pass os._exit(0) else: - # Parent process: return immediately + # Windows: no fork, wait synchronously with short timeout + message_reply, new_state = comm.log_reader.wait_for_message(state, 30.0) + if message_reply: + print(f"🤖 {t('reply_from', provider='Codex')}") + print(message_reply) + else: + print("⏰ Timeout waiting for reply") return 0 except Exception as exc: diff --git a/bin/gask-w b/bin/gask-w index 992068b..ea9a6f3 100755 --- a/bin/gask-w +++ b/bin/gask-w @@ -44,23 +44,19 @@ def main(argv: list[str]) -> int: state = comm.log_reader.capture_state() print("✅ Message sent, waiting for reply in background...", flush=True) - # Fork background process to wait for reply - pid = os.fork() if hasattr(os, 'fork') else None - - if pid is None: - # Windows: no fork, wait synchronously with short timeout - message_reply, new_state = comm.log_reader.wait_for_message(state, 30.0) - if message_reply: - print(f"🤖 {t('reply_from', provider='Gemini')}") - print(message_reply) - else: - print("⏰ Timeout waiting for reply") - return 0 - elif pid == 0: - # Child process: wait for reply silently + # Double fork to fully detach background process + if hasattr(os, 'fork'): + pid = os.fork() + if pid > 0: + # Parent: return immediately + return 0 + # First child: fork again and exit + os.setsid() + pid2 = os.fork() + if pid2 > 0: + os._exit(0) # First child exits + # Grandchild: wait for reply silently try: - # Detach from terminal - os.setsid() sys.stdin.close() sys.stdout = open(os.devnull, 'w') sys.stderr = open(os.devnull, 'w') @@ -78,7 +74,13 @@ def main(argv: list[str]) -> int: pass os._exit(0) else: - # Parent process: return immediately + # Windows: no fork, wait synchronously with short timeout + message_reply, new_state = comm.log_reader.wait_for_message(state, 30.0) + if message_reply: + print(f"🤖 {t('reply_from', provider='Gemini')}") + print(message_reply) + else: + print("⏰ Timeout waiting for reply") return 0 except Exception as exc: From d77be60f80ff2a93243bb3797eecc9b0594e91b6 Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 20 Dec 2025 22:26:44 +0800 Subject: [PATCH 022/153] refactor(cask-w,gask-w): pure sync mode with Claude Code background task MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Simplify cask-w/gask-w to pure synchronous wait (no fork) - Use Claude Code's run_in_background=true for async execution - Fix _latest_log() to detect stale log file bindings - Update skill configs to use background task + TaskOutput pattern - Add pending_state save on timeout/interrupt for later retrieval 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- bin/cask-w | 91 +++++++++++++++++++++++++--------------------- bin/gask-w | 58 +++++++++-------------------- commands/cask-w.md | 22 +++++++---- commands/gask-w.md | 22 +++++++---- lib/codex_comm.py | 42 +++++++++++++++------ lib/gemini_comm.py | 32 ++++++++++------ 6 files changed, 147 insertions(+), 120 deletions(-) diff --git a/bin/cask-w b/bin/cask-w index 6e24ac9..c57c26b 100755 --- a/bin/cask-w +++ b/bin/cask-w @@ -1,11 +1,13 @@ #!/usr/bin/env python3 """ -cask-w - Send message to Codex and wait for reply in background +cask-w - Send message to Codex and wait for reply (pure sync mode) +Designed to be run with Claude Code's run_in_background=true """ from __future__ import annotations import os import sys from pathlib import Path +import json script_dir = Path(__file__).resolve().parent lib_dir = script_dir.parent / "lib" @@ -27,6 +29,25 @@ def main(argv: list[str]) -> int: setup_windows_encoding() from codex_comm import CodexCommunicator + from i18n import t + + def save_pending_state(state: dict) -> None: + session_file = Path.cwd() / ".codex-session" + if not session_file.exists(): + return + try: + with session_file.open("r", encoding="utf-8") as handle: + data = json.load(handle) + data["pending_state"] = { + "log_path": str(state.get("log_path")) if state.get("log_path") else None, + "offset": int(state.get("offset", 0) or 0), + } + tmp_file = session_file.with_suffix(".tmp") + with tmp_file.open("w", encoding="utf-8") as handle: + json.dump(data, handle, ensure_ascii=False, indent=2) + os.replace(tmp_file, session_file) + except Exception: + return try: comm = CodexCommunicator(lazy_init=True) @@ -38,52 +59,38 @@ def main(argv: list[str]) -> int: return 1 # Send message - from i18n import t print(f"🔔 {t('sending_to', provider='Codex')}", flush=True) marker, state = comm._send_message(message) - print("✅ Message sent, waiting for reply in background...", flush=True) - - # Double fork to fully detach background process - if hasattr(os, 'fork'): - pid = os.fork() - if pid > 0: - # Parent: return immediately - return 0 - # First child: fork again and exit - os.setsid() - pid2 = os.fork() - if pid2 > 0: - os._exit(0) # First child exits - # Grandchild: wait for reply silently - try: - sys.stdin.close() - sys.stdout = open(os.devnull, 'w') - sys.stderr = open(os.devnull, 'w') - - # Wait for reply (up to 5 minutes) - message_reply, new_state = comm.log_reader.wait_for_message(state, 300.0) - - # Save reply to cache file for cpend to read - if message_reply: - cache_dir = Path.home() / ".cache" / "ccb" - cache_dir.mkdir(parents=True, exist_ok=True) - reply_file = cache_dir / "codex_last_reply.txt" - reply_file.write_text(message_reply, encoding="utf-8") - except Exception: - pass - os._exit(0) + comm._remember_codex_session(state.get("log_path") or comm.log_reader.current_log_path()) + + # Pure sync wait (default 1 hour, configurable via CCB_SYNC_TIMEOUT) + sync_timeout = float(os.environ.get("CCB_SYNC_TIMEOUT", "3600.0")) + message_reply, _ = comm.log_reader.wait_for_message(state, sync_timeout) + + # Save to cache + cache_dir = Path.home() / ".cache" / "ccb" + cache_dir.mkdir(parents=True, exist_ok=True) + reply_file = cache_dir / "codex_last_reply.txt" + + if message_reply: + print(f"🤖 {t('reply_from', provider='Codex')}") + print(message_reply) + reply_file.write_text(message_reply, encoding="utf-8") else: - # Windows: no fork, wait synchronously with short timeout - message_reply, new_state = comm.log_reader.wait_for_message(state, 30.0) - if message_reply: - print(f"🤖 {t('reply_from', provider='Codex')}") - print(message_reply) - else: - print("⏰ Timeout waiting for reply") - return 0 + print(f"⏰ Timeout after {int(sync_timeout)}s") + save_pending_state(state) + return 0 + except KeyboardInterrupt: + # Best-effort: preserve pending state so /cpend can fetch later. + try: + save_pending_state(locals().get("state", {}) if isinstance(locals().get("state"), dict) else {}) + except Exception: + pass + print("❌ Interrupted", file=sys.stderr) + return 130 except Exception as exc: - print(exc, file=sys.stderr) + print(f"❌ {exc}", file=sys.stderr) return 1 diff --git a/bin/gask-w b/bin/gask-w index ea9a6f3..8f19b56 100755 --- a/bin/gask-w +++ b/bin/gask-w @@ -1,6 +1,7 @@ #!/usr/bin/env python3 """ -gask-w - Send message to Gemini and wait for reply in background +gask-w - Send message to Gemini and wait for reply (pure sync mode) +Designed to be run with Claude Code's run_in_background=true """ from __future__ import annotations import os @@ -27,6 +28,7 @@ def main(argv: list[str]) -> int: setup_windows_encoding() from gemini_comm import GeminiCommunicator + from i18n import t try: comm = GeminiCommunicator(lazy_init=True) @@ -38,53 +40,29 @@ def main(argv: list[str]) -> int: return 1 # Send message - from i18n import t print(f"🔔 {t('sending_to', provider='Gemini')}", flush=True) - comm._send_via_terminal(message) state = comm.log_reader.capture_state() - print("✅ Message sent, waiting for reply in background...", flush=True) + comm._send_via_terminal(message) - # Double fork to fully detach background process - if hasattr(os, 'fork'): - pid = os.fork() - if pid > 0: - # Parent: return immediately - return 0 - # First child: fork again and exit - os.setsid() - pid2 = os.fork() - if pid2 > 0: - os._exit(0) # First child exits - # Grandchild: wait for reply silently - try: - sys.stdin.close() - sys.stdout = open(os.devnull, 'w') - sys.stderr = open(os.devnull, 'w') + # Pure sync wait (default 1 hour, configurable via CCB_SYNC_TIMEOUT) + sync_timeout = float(os.environ.get("CCB_SYNC_TIMEOUT", "3600.0")) + message_reply, _ = comm.log_reader.wait_for_message(state, sync_timeout) - # Wait for reply (up to 5 minutes) - message_reply, new_state = comm.log_reader.wait_for_message(state, 300.0) + # Save to cache + cache_dir = Path.home() / ".cache" / "ccb" + cache_dir.mkdir(parents=True, exist_ok=True) + reply_file = cache_dir / "gemini_last_reply.txt" - # Save reply to cache file for gpend to read - if message_reply: - cache_dir = Path.home() / ".cache" / "ccb" - cache_dir.mkdir(parents=True, exist_ok=True) - reply_file = cache_dir / "gemini_last_reply.txt" - reply_file.write_text(message_reply, encoding="utf-8") - except Exception: - pass - os._exit(0) + if message_reply: + print(f"🤖 {t('reply_from', provider='Gemini')}") + print(message_reply) + reply_file.write_text(message_reply, encoding="utf-8") else: - # Windows: no fork, wait synchronously with short timeout - message_reply, new_state = comm.log_reader.wait_for_message(state, 30.0) - if message_reply: - print(f"🤖 {t('reply_from', provider='Gemini')}") - print(message_reply) - else: - print("⏰ Timeout waiting for reply") - return 0 + print(f"⏰ Timeout after {int(sync_timeout)}s") + return 0 except Exception as exc: - print(exc, file=sys.stderr) + print(f"❌ {exc}", file=sys.stderr) return 1 diff --git a/commands/cask-w.md b/commands/cask-w.md index cdfb49f..4fc26a9 100644 --- a/commands/cask-w.md +++ b/commands/cask-w.md @@ -1,21 +1,27 @@ Forward commands to Codex session and wait for reply via `cask-w` command (supports tmux / WezTerm, forward only, does not execute in current Claude process). Execution: -- Run `Bash(cask-w "")` -- After sending, STOP immediately and wait for user input -- Do NOT continue with other tasks +1. Run `Bash(cask-w "", run_in_background=true)` to start background task +2. Tell user the task_id and that Codex is processing +3. STOP immediately and wait for user input (do NOT call TaskOutput) Parameters: - `` required, will be forwarded to Codex session Workflow: -1. Send to Codex and wait for reply -2. Display result to user -3. STOP and wait for user's next instruction +1. Start cask-w in background -> get task_id +2. Inform user: "Codex processing in background (task: xxx), use /cpend to check reply" +3. STOP and continue conversation - do NOT block waiting + +When user wants result: +- User can say "check codex" or use `/cpend` to view reply +- Or use `TaskOutput(task_id, block=false)` to check status Examples: -- `Bash(cask-w "1+2")` -> wait for reply, then STOP +- `Bash(cask-w "analyze code", run_in_background=true)` -> inform user, STOP +- User: "check codex" -> `cpend` or `TaskOutput(task_id)` Hints: -- Use `/cpend` to view latest reply +- Do NOT use `TaskOutput(block=true)` - it blocks conversation +- Use `/cpend` to view latest reply anytime - Use `cask` for fire-and-forget (no wait) diff --git a/commands/gask-w.md b/commands/gask-w.md index f480e33..6dbf476 100644 --- a/commands/gask-w.md +++ b/commands/gask-w.md @@ -1,21 +1,27 @@ Forward commands to Gemini session and wait for reply via `gask-w` command (supports tmux / WezTerm). Execution: -- Run `Bash(gask-w "")` -- After sending, STOP immediately and wait for user input -- Do NOT continue with other tasks +1. Run `Bash(gask-w "", run_in_background=true)` to start background task +2. Tell user the task_id and that Gemini is processing +3. STOP immediately and wait for user input (do NOT call TaskOutput) Parameters: - `` required, will be forwarded to Gemini session Workflow: -1. Send to Gemini and wait for reply -2. Display result to user -3. STOP and wait for user's next instruction +1. Start gask-w in background -> get task_id +2. Inform user: "Gemini processing in background (task: xxx), use /gpend to check reply" +3. STOP and continue conversation - do NOT block waiting + +When user wants result: +- User can say "check gemini" or use `/gpend` to view reply +- Or use `TaskOutput(task_id, block=false)` to check status Examples: -- `Bash(gask-w "explain this code")` -> wait for reply, then STOP +- `Bash(gask-w "explain this", run_in_background=true)` -> inform user, STOP +- User: "check gemini" -> `gpend` or `TaskOutput(task_id)` Hints: -- Use `/gpend` to view latest reply +- Do NOT use `TaskOutput(block=true)` - it blocks conversation +- Use `/gpend` to view latest reply anytime - Use `gask` for fire-and-forget (no wait) diff --git a/lib/codex_comm.py b/lib/codex_comm.py index 0c6859f..ff4c2fb 100644 --- a/lib/codex_comm.py +++ b/lib/codex_comm.py @@ -9,6 +9,7 @@ import json import os import re +import sys import time import shlex from datetime import datetime @@ -78,12 +79,22 @@ def _scan_latest(self) -> Optional[Path]: def _latest_log(self) -> Optional[Path]: preferred = self._preferred_log - if preferred and preferred.exists(): - return preferred + # Always scan for latest to detect if preferred is stale latest = self._scan_latest() if latest: - self._preferred_log = latest - return latest + # If preferred is stale (different file or older), update it + if not preferred or not preferred.exists() or latest != preferred: + try: + preferred_mtime = preferred.stat().st_mtime if preferred and preferred.exists() else 0 + latest_mtime = latest.stat().st_mtime + if latest_mtime > preferred_mtime: + self._preferred_log = latest + return latest + except OSError: + self._preferred_log = latest + return latest + return preferred if preferred and preferred.exists() else latest + return preferred if preferred and preferred.exists() else None def current_log_path(self) -> Optional[Path]: return self._latest_log() @@ -173,15 +184,26 @@ def ensure_log() -> Path: continue with log_path.open("r", encoding="utf-8", errors="ignore") as fh: + try: + size = log_path.stat().st_size + except OSError: + size = None + if isinstance(size, int) and offset > size: + offset = size fh.seek(offset) while True: if block and time.time() >= deadline: return None, {"log_path": log_path, "offset": offset} - line = fh.readline() - if not line: + pos_before = fh.tell() + raw_line = fh.readline() + if not raw_line: + break + # If we hit EOF without a newline, the writer may still be appending this line. + if not raw_line.endswith("\n"): + fh.seek(pos_before) break offset = fh.tell() - line = line.strip() + line = raw_line.strip() if not line: continue try: @@ -197,10 +219,8 @@ def ensure_log() -> Path: if latest and latest != log_path: current_path = latest self._preferred_log = latest - try: - offset = latest.stat().st_size - except OSError: - offset = 0 + # When switching to a new log file (rotation/session change), start from the beginning. + offset = 0 if not block: return None, {"log_path": current_path, "offset": offset} time.sleep(self._poll_interval) diff --git a/lib/gemini_comm.py b/lib/gemini_comm.py index 3ea6d1e..49467e6 100755 --- a/lib/gemini_comm.py +++ b/lib/gemini_comm.py @@ -93,19 +93,29 @@ def _scan_latest_session(self) -> Optional[Path]: return self._scan_latest_session_any_project() def _latest_session(self) -> Optional[Path]: - if self._preferred_session and self._preferred_session.exists(): - return self._preferred_session + preferred = self._preferred_session + # Always scan for latest to detect if preferred is stale latest = self._scan_latest_session() if latest: - self._preferred_session = latest - try: - # If session found via fallback scan, bind projectHash to avoid future full scans - project_hash = latest.parent.parent.name - if project_hash: - self._project_hash = project_hash - except Exception: - pass - return latest + # If preferred is stale (different file or older), update it + if not preferred or not preferred.exists() or latest != preferred: + try: + preferred_mtime = preferred.stat().st_mtime if preferred and preferred.exists() else 0 + latest_mtime = latest.stat().st_mtime + if latest_mtime > preferred_mtime: + self._preferred_session = latest + try: + project_hash = latest.parent.parent.name + if project_hash: + self._project_hash = project_hash + except Exception: + pass + return latest + except OSError: + self._preferred_session = latest + return latest + return preferred + return preferred if preferred and preferred.exists() else None def set_preferred_session(self, session_path: Optional[Path]) -> None: if not session_path: From 0f9e1dd872288330dcf444ef0de2a5472c01136d Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 21 Dec 2025 12:09:41 +0800 Subject: [PATCH 023/153] fix(gask-w): align with cask-w implementation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add _send_message() and _generate_marker() to GeminiCommunicator - Add marker_prefix to GeminiCommunicator.__init__ - Add save_pending_state() for timeout/interrupt recovery - Use _send_message() instead of direct _send_via_terminal() - Add KeyboardInterrupt handling - Call _remember_gemini_session() after send and wait 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- bin/gask-w | 40 +++++++++++++++++++++++++++++++++++++--- lib/gemini_comm.py | 10 ++++++++++ 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/bin/gask-w b/bin/gask-w index 8f19b56..7d3166e 100755 --- a/bin/gask-w +++ b/bin/gask-w @@ -7,6 +7,7 @@ from __future__ import annotations import os import sys from pathlib import Path +import json script_dir = Path(__file__).resolve().parent lib_dir = script_dir.parent / "lib" @@ -30,6 +31,29 @@ def main(argv: list[str]) -> int: from gemini_comm import GeminiCommunicator from i18n import t + def save_pending_state(state: dict) -> None: + session_file = Path.cwd() / ".gemini-session" + if not session_file.exists(): + return + try: + with session_file.open("r", encoding="utf-8") as handle: + data = json.load(handle) + data["pending_state"] = { + "session_path": str(state.get("session_path")) if state.get("session_path") else None, + "msg_count": int(state.get("msg_count", 0) or 0), + "mtime": float(state.get("mtime", 0.0) or 0.0), + "mtime_ns": int(state.get("mtime_ns", 0) or 0), + "size": int(state.get("size", 0) or 0), + "last_gemini_id": state.get("last_gemini_id"), + "last_gemini_hash": state.get("last_gemini_hash"), + } + tmp_file = session_file.with_suffix(".tmp") + with tmp_file.open("w", encoding="utf-8") as handle: + json.dump(data, handle, ensure_ascii=False, indent=2) + os.replace(tmp_file, session_file) + except Exception: + return + try: comm = GeminiCommunicator(lazy_init=True) @@ -41,12 +65,14 @@ def main(argv: list[str]) -> int: # Send message print(f"🔔 {t('sending_to', provider='Gemini')}", flush=True) - state = comm.log_reader.capture_state() - comm._send_via_terminal(message) + marker, state = comm._send_message(message) + comm._remember_gemini_session(state.get("session_path") or comm.log_reader.current_session_path()) # Pure sync wait (default 1 hour, configurable via CCB_SYNC_TIMEOUT) sync_timeout = float(os.environ.get("CCB_SYNC_TIMEOUT", "3600.0")) - message_reply, _ = comm.log_reader.wait_for_message(state, sync_timeout) + message_reply, new_state = comm.log_reader.wait_for_message(state, sync_timeout) + state = new_state or state + comm._remember_gemini_session(state.get("session_path") or comm.log_reader.current_session_path()) # Save to cache cache_dir = Path.home() / ".cache" / "ccb" @@ -59,8 +85,16 @@ def main(argv: list[str]) -> int: reply_file.write_text(message_reply, encoding="utf-8") else: print(f"⏰ Timeout after {int(sync_timeout)}s") + save_pending_state(state) return 0 + except KeyboardInterrupt: + try: + save_pending_state(locals().get("state", {}) if isinstance(locals().get("state"), dict) else {}) + except Exception: + pass + print("❌ Interrupted", file=sys.stderr) + return 130 except Exception as exc: print(f"❌ {exc}", file=sys.stderr) return 1 diff --git a/lib/gemini_comm.py b/lib/gemini_comm.py index 49467e6..737dbc7 100755 --- a/lib/gemini_comm.py +++ b/lib/gemini_comm.py @@ -363,6 +363,7 @@ def __init__(self, lazy_init: bool = False): self.terminal = self.session_info.get("terminal", "tmux") self.pane_id = get_pane_id_from_session(self.session_info) self.timeout = int(os.environ.get("GEMINI_SYNC_TIMEOUT", "60")) + self.marker_prefix = "ask" self.project_session_file = self.session_info.get("_session_file") self.backend = get_backend_for_session(self.session_info) @@ -464,6 +465,15 @@ def _send_via_terminal(self, content: str) -> bool: self.backend.send_text(self.pane_id, content) return True + def _send_message(self, content: str) -> Tuple[str, Dict[str, Any]]: + marker = self._generate_marker() + state = self.log_reader.capture_state() + self._send_via_terminal(content) + return marker, state + + def _generate_marker(self) -> str: + return f"{self.marker_prefix}-{int(time.time())}-{os.getpid()}" + def ask_async(self, question: str) -> bool: try: healthy, status = self._check_session_health_impl(probe_terminal=False) From aec6827c7bbf438f3403427ea00af3798f53ba77 Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 21 Dec 2025 12:27:38 +0800 Subject: [PATCH 024/153] fix(gemini_comm): prevent returning stale messages on JSON parse failure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add retry loop (10 attempts) in capture_state() for transient JSONDecodeError - Return msg_count=-1 to indicate unknown baseline instead of 0 - In _read_since(), establish stable baseline first when msg_count<0 - Add id/hash deduplication to avoid returning already-processed messages Root cause: Gemini CLI writes session JSON in-place, causing transient parse failures that reset msg_count to 0, leading to old messages being returned as "new" replies. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- lib/gemini_comm.py | 69 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 63 insertions(+), 6 deletions(-) diff --git a/lib/gemini_comm.py b/lib/gemini_comm.py index 737dbc7..45c0e05 100755 --- a/lib/gemini_comm.py +++ b/lib/gemini_comm.py @@ -140,20 +140,39 @@ def capture_state(self) -> Dict[str, Any]: last_gemini_id: Optional[str] = None last_gemini_hash: Optional[str] = None if session and session.exists(): + data: Optional[dict] = None try: stat = session.stat() mtime = stat.st_mtime mtime_ns = getattr(stat, "st_mtime_ns", int(stat.st_mtime * 1_000_000_000)) size = stat.st_size - with session.open("r", encoding="utf-8") as f: - data = json.load(f) + except OSError: + stat = None + + # The session JSON may be written in-place; retry briefly to avoid transient JSONDecodeError. + for attempt in range(10): + try: + with session.open("r", encoding="utf-8") as f: + loaded = json.load(f) + if isinstance(loaded, dict): + data = loaded + break + except json.JSONDecodeError: + if attempt < 9: + time.sleep(min(self._poll_interval, 0.05)) + continue + except OSError: + break + + if data is None: + # Unknown baseline (parse failed). Let the wait loop establish a stable baseline first. + msg_count = -1 + else: msg_count = len(data.get("messages", [])) last = self._extract_last_gemini(data) if last: last_gemini_id, content = last last_gemini_hash = hashlib.sha256(content.encode("utf-8")).hexdigest() - except (OSError, json.JSONDecodeError): - pass return { "session_path": session, "msg_count": msg_count, @@ -191,6 +210,7 @@ def latest_message(self) -> Optional[str]: def _read_since(self, state: Dict[str, Any], timeout: float, block: bool) -> Tuple[Optional[str], Dict[str, Any]]: deadline = time.time() + timeout prev_count = state.get("msg_count", 0) + unknown_baseline = isinstance(prev_count, int) and prev_count < 0 prev_mtime = state.get("mtime", 0.0) prev_mtime_ns = state.get("mtime_ns") if prev_mtime_ns is None: @@ -264,19 +284,56 @@ def _read_since(self, state: Dict[str, Any], timeout: float, block: bool) -> Tup messages = data.get("messages", []) current_count = len(messages) + if unknown_baseline: + prev_mtime = current_mtime + prev_mtime_ns = current_mtime_ns + prev_size = current_size + prev_count = current_count + last = self._extract_last_gemini(data) + if last: + prev_last_gemini_id, content = last + prev_last_gemini_hash = hashlib.sha256(content.encode("utf-8")).hexdigest() if content else None + unknown_baseline = False + if not block: + return None, { + "session_path": session, + "msg_count": prev_count, + "mtime": prev_mtime, + "mtime_ns": prev_mtime_ns, + "size": prev_size, + "last_gemini_id": prev_last_gemini_id, + "last_gemini_hash": prev_last_gemini_hash, + } + time.sleep(self._poll_interval) + if time.time() >= deadline: + return None, { + "session_path": session, + "msg_count": prev_count, + "mtime": prev_mtime, + "mtime_ns": prev_mtime_ns, + "size": prev_size, + "last_gemini_id": prev_last_gemini_id, + "last_gemini_hash": prev_last_gemini_hash, + } + continue + if current_count > prev_count: for msg in messages[prev_count:]: if msg.get("type") == "gemini": content = msg.get("content", "").strip() if content: + content_hash = hashlib.sha256(content.encode("utf-8")).hexdigest() + msg_id = msg.get("id") + if msg_id == prev_last_gemini_id and content_hash == prev_last_gemini_hash: + continue new_state = { "session_path": session, "msg_count": current_count, "mtime": current_mtime, "mtime_ns": current_mtime_ns, "size": current_size, - "last_gemini_id": msg.get("id"), - "last_gemini_hash": hashlib.sha256(content.encode("utf-8")).hexdigest(), + "last_gemini_id": msg_id, + "last_gemini_hash": content_hash, } return content, new_state else: From 8350b67cf3fa5c207b2f9a21be74ec0dc6b0f38d Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 21 Dec 2025 12:45:07 +0800 Subject: [PATCH 025/153] fix(codex_comm): use binary mode for consistent byte offset handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Change file open from text mode to binary mode ("rb") - Use offset=-1 to indicate unknown baseline - Establish baseline from EOF when offset unknown - Start from EOF when switching log files to avoid replaying old content Root cause: text mode seek/tell uses "cookie" values that don't equal byte offsets, causing offset > st_size clamping to misposition and return stale messages. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- lib/codex_comm.py | 49 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/lib/codex_comm.py b/lib/codex_comm.py index ff4c2fb..647fe65 100644 --- a/lib/codex_comm.py +++ b/lib/codex_comm.py @@ -102,12 +102,17 @@ def current_log_path(self) -> Optional[Path]: def capture_state(self) -> Dict[str, Any]: """Capture current log path and offset""" log = self._latest_log() - offset = 0 + offset = -1 if log and log.exists(): try: offset = log.stat().st_size except OSError: - offset = 0 + try: + with log.open("rb") as handle: + handle.seek(0, os.SEEK_END) + offset = handle.tell() + except OSError: + offset = -1 return {"log_path": log, "offset": offset} def wait_for_message(self, state: Dict[str, Any], timeout: float) -> Tuple[Optional[str], Dict[str, Any]]: @@ -155,7 +160,9 @@ def latest_message(self) -> Optional[str]: def _read_since(self, state: Dict[str, Any], timeout: float, block: bool) -> Tuple[Optional[str], Dict[str, Any]]: deadline = time.time() + timeout current_path = self._normalize_path(state.get("log_path")) - offset = state.get("offset", 0) + offset = state.get("offset", -1) + if not isinstance(offset, int): + offset = -1 # Keep rescans infrequent; new messages usually append to the same log file. rescan_interval = min(2.0, max(0.2, timeout / 2.0)) last_rescan = time.time() @@ -183,14 +190,27 @@ def ensure_log() -> Path: time.sleep(self._poll_interval) continue - with log_path.open("r", encoding="utf-8", errors="ignore") as fh: + try: + size = log_path.stat().st_size + except OSError: + size = None + + # If caller couldn't capture a baseline, establish it now (start from EOF). + if offset < 0: + offset = size if isinstance(size, int) else 0 + + with log_path.open("rb") as fh: try: - size = log_path.stat().st_size + if isinstance(size, int) and offset > size: + offset = size + fh.seek(offset, os.SEEK_SET) except OSError: - size = None - if isinstance(size, int) and offset > size: - offset = size - fh.seek(offset) + # If seek fails, reset to EOF and try again on next loop. + offset = size if isinstance(size, int) else 0 + if not block: + return None, {"log_path": log_path, "offset": offset} + time.sleep(self._poll_interval) + continue while True: if block and time.time() >= deadline: return None, {"log_path": log_path, "offset": offset} @@ -199,11 +219,11 @@ def ensure_log() -> Path: if not raw_line: break # If we hit EOF without a newline, the writer may still be appending this line. - if not raw_line.endswith("\n"): + if not raw_line.endswith(b"\n"): fh.seek(pos_before) break offset = fh.tell() - line = raw_line.strip() + line = raw_line.decode("utf-8", errors="ignore").strip() if not line: continue try: @@ -219,8 +239,11 @@ def ensure_log() -> Path: if latest and latest != log_path: current_path = latest self._preferred_log = latest - # When switching to a new log file (rotation/session change), start from the beginning. - offset = 0 + # When switching to a new log file, start from EOF to avoid replaying old content. + try: + offset = latest.stat().st_size + except OSError: + offset = 0 if not block: return None, {"log_path": current_path, "offset": offset} time.sleep(self._poll_interval) From 6d9da2f1b3efb9d5daee9c1734ce11f2d2d39466 Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 21 Dec 2025 12:58:06 +0800 Subject: [PATCH 026/153] fix(install.ps1): add UTF-8 BOM and encoding setup for PS5.1 compatibility MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add UTF-8 BOM to file header - Set $OutputEncoding, [Console]::OutputEncoding/InputEncoding to UTF-8 - Run chcp 65001 for consistent Chinese/emoji output on Windows PowerShell 5.1 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- install.ps1 | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/install.ps1 b/install.ps1 index c21d04b..cf89c4d 100644 --- a/install.ps1 +++ b/install.ps1 @@ -1,4 +1,4 @@ -param( +param( [Parameter(Position = 0)] [ValidateSet("install", "uninstall", "help")] [string]$Command = "help", @@ -6,6 +6,18 @@ param( [switch]$Yes ) +# --- UTF-8 / BOM compatibility (Windows PowerShell 5.1) --- +# Keep this near the top so Chinese/emoji output is rendered correctly. +try { + $utf8NoBom = [System.Text.UTF8Encoding]::new($false) +} catch { + $utf8NoBom = [System.Text.Encoding]::UTF8 +} +try { $OutputEncoding = $utf8NoBom } catch {} +try { [Console]::OutputEncoding = $utf8NoBom } catch {} +try { [Console]::InputEncoding = $utf8NoBom } catch {} +try { chcp 65001 | Out-Null } catch {} + $ErrorActionPreference = "Stop" $repoRoot = Split-Path -Parent $MyInvocation.MyCommand.Path From fab9fb302ea9b3b01e23d6772febea0de11c4687 Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 21 Dec 2025 13:07:45 +0800 Subject: [PATCH 027/153] release: bump version to 2.2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Key changes: - cask-w/gask-w now run in background mode, not blocking foreground work - Fix codex_comm: use binary mode for consistent byte offset handling - Fix gemini_comm: prevent returning stale messages on JSON parse failure - Fix gask-w: align implementation with cask-w - Fix install.ps1: add UTF-8 BOM for PowerShell 5.1 compatibility 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- README.md | 2 +- bin/gask-w | 11 +++++++++++ ccb | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index cf32225..139ba4d 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ **Windows | macOS | Linux — One Tool, All Platforms** -[![Version](https://img.shields.io/badge/version-2.1-orange.svg)]() +[![Version](https://img.shields.io/badge/version-2.2-orange.svg)]() [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) [![Platform](https://img.shields.io/badge/platform-Linux%20%7C%20macOS%20%7C%20Windows-lightgrey.svg)]() diff --git a/bin/gask-w b/bin/gask-w index 7d3166e..837ac11 100755 --- a/bin/gask-w +++ b/bin/gask-w @@ -54,6 +54,17 @@ def main(argv: list[str]) -> int: except Exception: return + # Save to cache + cache_dir = Path.home() / ".cache" / "ccb" + cache_dir.mkdir(parents=True, exist_ok=True) + reply_file = cache_dir / "gemini_last_reply.txt" + # Clear stale cache + if reply_file.exists(): + try: + reply_file.unlink() + except Exception: + pass + try: comm = GeminiCommunicator(lazy_init=True) diff --git a/ccb b/ccb index dc2266e..06d5f36 100755 --- a/ccb +++ b/ccb @@ -35,7 +35,7 @@ backend_env = get_backend_env() if backend_env and not os.environ.get("CCB_BACKEND_ENV"): os.environ["CCB_BACKEND_ENV"] = backend_env -VERSION = "2.1" +VERSION = "2.2" def _get_git_info() -> str: From 24a66459b76a22b8b1d0326436626a8144f284e0 Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 21 Dec 2025 13:48:23 +0800 Subject: [PATCH 028/153] fix(ccb): ensure -r restore reads cwd/.codex-session with correct encoding MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Use utf-8-sig encoding when reading session files (tolerate BOM) - Use utf-8 encoding when writing session files - Refactor _get_latest_codex_session_id() to use _read_json_file() - Add --restore as alias for --resume - Support ccb -r as shortcut for ccb up -r Root cause: Windows PowerShell 5.1 default encoding caused JSON parse failure, making -r ignore .codex-session in current directory. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- ccb | 45 ++++++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/ccb b/ccb index 06d5f36..f61780b 100755 --- a/ccb +++ b/ccb @@ -277,14 +277,17 @@ class AILauncher: try: if not path.exists(): return {} - data = json.loads(path.read_text()) + # Session files are written as UTF-8; on Windows PowerShell 5.1 the default encoding + # may not be UTF-8, so always decode explicitly and tolerate UTF-8 BOM. + raw = path.read_text(encoding="utf-8-sig") + data = json.loads(raw) return data if isinstance(data, dict) else {} except Exception: return {} def _write_json_file(self, path: Path, data: dict) -> None: try: - path.write_text(json.dumps(data, ensure_ascii=False, indent=2)) + path.write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8") except Exception: pass @@ -320,13 +323,10 @@ class AILauncher: # Only trust local project state; deleting local dotfiles should reset resume behavior. project_session = Path.cwd() / ".codex-session" if project_session.exists(): - try: - data = json.loads(project_session.read_text()) - cached = data.get("codex_session_id") - if isinstance(cached, str) and cached: - return cached, True - except Exception: - pass + data = self._read_json_file(project_session) + cached = data.get("codex_session_id") + if isinstance(cached, str) and cached: + return cached, True return None, False def _build_codex_start_cmd(self) -> str: @@ -552,10 +552,7 @@ exec tmux attach -t "$TMUX_SESSION" data = {} if session_file.exists(): - try: - data = json.loads(session_file.read_text()) - except Exception: - pass + data = self._read_json_file(session_file) data.update({ "session_id": self.session_id, @@ -790,10 +787,12 @@ exec tmux attach -t "$TMUX_SESSION" for session_file in [Path.cwd() / ".codex-session", Path.cwd() / ".gemini-session", Path.cwd() / ".claude-session"]: if session_file.exists(): try: - data = json.loads(session_file.read_text()) + data = self._read_json_file(session_file) + if not data: + continue data["active"] = False data["ended_at"] = time.strftime("%Y-%m-%d %H:%M:%S") - session_file.write_text(json.dumps(data, ensure_ascii=False, indent=2)) + safe_write_session(session_file, json.dumps(data, ensure_ascii=False, indent=2)) except Exception: pass @@ -874,7 +873,7 @@ def cmd_status(args): continue try: - data = json.loads(session_file.read_text()) + data = json.loads(session_file.read_text(encoding="utf-8-sig")) terminal = data.get("terminal", "tmux") pane_id = data.get("pane_id") if terminal in ("wezterm", "iterm2") else data.get("tmux_session", "") active = data.get("active", False) @@ -921,7 +920,7 @@ def cmd_kill(args): continue try: - data = json.loads(session_file.read_text()) + data = json.loads(session_file.read_text(encoding="utf-8-sig")) terminal = data.get("terminal", "tmux") pane_id = data.get("pane_id") if terminal in ("wezterm", "iterm2") else data.get("tmux_session", "") @@ -937,7 +936,7 @@ def cmd_kill(args): data["active"] = False data["ended_at"] = time.strftime("%Y-%m-%d %H:%M:%S") - session_file.write_text(json.dumps(data, ensure_ascii=False, indent=2)) + safe_write_session(session_file, json.dumps(data, ensure_ascii=False, indent=2)) print(f"✅ {provider.capitalize()} terminated") except Exception as e: @@ -956,7 +955,7 @@ def cmd_restore(args): continue try: - data = json.loads(session_file.read_text()) + data = json.loads(session_file.read_text(encoding="utf-8-sig")) terminal = data.get("terminal", "tmux") pane_id = data.get("pane_id") if terminal in ("wezterm", "iterm2") else data.get("tmux_session", "") active = data.get("active", False) @@ -1210,7 +1209,7 @@ def main(): # up subcommand up_parser = subparsers.add_parser("up", help="Start AI backends") up_parser.add_argument("providers", nargs="*", choices=["codex", "gemini"], help="Backends to start") - up_parser.add_argument("-r", "--resume", action="store_true", help="Resume context") + up_parser.add_argument("-r", "--resume", "--restore", action="store_true", help="Resume context") up_parser.add_argument("-a", "--auto", action="store_true", help="Full auto permission mode") up_parser.add_argument("--no-claude", action="store_true", help="Don't start Claude main window") @@ -1229,7 +1228,11 @@ def main(): # update subcommand update_parser = subparsers.add_parser("update", help="Update to latest version") - args = parser.parse_args() + argv = sys.argv[1:] + # Backward/shortcut compatibility: allow `ccb -r` to behave like `ccb up -r` (default provider). + if argv and argv[0] in {"-r", "--resume", "--restore"}: + argv = ["up"] + argv + args = parser.parse_args(argv) if not args.command: parser.print_help() From 758ceae4d47162ba447443f45266179467a7799f Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 21 Dec 2025 14:34:47 +0800 Subject: [PATCH 029/153] fix(install.ps1): create .cmd wrappers and fix shebang for Windows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add Fix-PythonShebang function to replace python3 with python - Generate .cmd and .bat wrappers for all scripts - Wrappers try python first, fallback to py -3 - Fix relative path references in wrappers This fixes "python3: No such file or directory" error on Windows. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- install.ps1 | 46 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/install.ps1 b/install.ps1 index cf89c4d..46ddc7f 100644 --- a/install.ps1 +++ b/install.ps1 @@ -9,13 +9,13 @@ # --- UTF-8 / BOM compatibility (Windows PowerShell 5.1) --- # Keep this near the top so Chinese/emoji output is rendered correctly. try { - $utf8NoBom = [System.Text.UTF8Encoding]::new($false) + $script:utf8NoBom = [System.Text.UTF8Encoding]::new($false) } catch { - $utf8NoBom = [System.Text.Encoding]::UTF8 + $script:utf8NoBom = [System.Text.Encoding]::UTF8 } -try { $OutputEncoding = $utf8NoBom } catch {} -try { [Console]::OutputEncoding = $utf8NoBom } catch {} -try { [Console]::InputEncoding = $utf8NoBom } catch {} +try { $OutputEncoding = $script:utf8NoBom } catch {} +try { [Console]::OutputEncoding = $script:utf8NoBom } catch {} +try { [Console]::InputEncoding = $script:utf8NoBom } catch {} try { chcp 65001 | Out-Null } catch {} $ErrorActionPreference = "Stop" @@ -164,17 +164,45 @@ function Install-Native { } } + function Fix-PythonShebang { + param([string]$TargetPath) + if (-not $TargetPath -or -not (Test-Path $TargetPath)) { return } + try { + $text = [System.IO.File]::ReadAllText($TargetPath, [System.Text.Encoding]::UTF8) + if ($text -match '^\#\!/usr/bin/env python3') { + $text = $text -replace '^\#\!/usr/bin/env python3', '#!/usr/bin/env python' + [System.IO.File]::WriteAllText($TargetPath, $text, $script:utf8NoBom) + } + } catch { + return + } + } + $scripts = @("ccb", "cask", "cask-w", "cping", "cpend", "gask", "gask-w", "gping", "gpend") + + # In MSYS/Git-Bash, invoking the script file directly will honor the shebang. + # Windows typically has `python` but not `python3`, so rewrite shebangs for compatibility. + foreach ($script in $scripts) { + if ($script -eq "ccb") { + Fix-PythonShebang (Join-Path $InstallPrefix "ccb") + } else { + Fix-PythonShebang (Join-Path $InstallPrefix ("bin\\" + $script)) + } + } + foreach ($script in $scripts) { $batPath = Join-Path $binDir "$script.bat" + $cmdPath = Join-Path $binDir "$script.cmd" if ($script -eq "ccb") { $relPath = "..\\ccb" } else { - $relPath = "..\\bin\\$script" + # Script is installed alongside the wrapper under $InstallPrefix\bin + $relPath = $script } - $batContent = "@echo off`r`n$pythonCmd `"%~dp0$relPath`" %*" - $utf8NoBom = New-Object System.Text.UTF8Encoding($false) - [System.IO.File]::WriteAllText($batPath, $batContent, $utf8NoBom) + $wrapperContent = "@echo off`r`nset `"PYTHON=python`"`r`nwhere python >NUL 2>&1 || set `"PYTHON=py -3`"`r`n%PYTHON% `"%~dp0$relPath`" %*" + [System.IO.File]::WriteAllText($batPath, $wrapperContent, $script:utf8NoBom) + # .cmd wrapper for PowerShell/CMD users (and tools preferring .cmd over raw shebang scripts) + [System.IO.File]::WriteAllText($cmdPath, $wrapperContent, $script:utf8NoBom) } $userPath = [Environment]::GetEnvironmentVariable("Path", "User") From c35c09636fd69b9faab065c8d4c23c860bd8a6ca Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 21 Dec 2025 14:52:33 +0800 Subject: [PATCH 030/153] fix(cask-w,gask-w): move setup_windows_encoding to module level MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ensures UTF-8 encoding is configured before any emoji output on Windows. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- bin/cask-w | 6 ++---- bin/gask-w | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/bin/cask-w b/bin/cask-w index c57c26b..105f8f7 100755 --- a/bin/cask-w +++ b/bin/cask-w @@ -12,6 +12,8 @@ import json script_dir = Path(__file__).resolve().parent lib_dir = script_dir.parent / "lib" sys.path.insert(0, str(lib_dir)) +from compat import setup_windows_encoding +setup_windows_encoding() def main(argv: list[str]) -> int: @@ -24,10 +26,6 @@ def main(argv: list[str]) -> int: print("❌ Message cannot be empty", file=sys.stderr) return 1 - if sys.platform == "win32": - from compat import setup_windows_encoding - setup_windows_encoding() - from codex_comm import CodexCommunicator from i18n import t diff --git a/bin/gask-w b/bin/gask-w index 837ac11..b0bcb5b 100755 --- a/bin/gask-w +++ b/bin/gask-w @@ -12,6 +12,8 @@ import json script_dir = Path(__file__).resolve().parent lib_dir = script_dir.parent / "lib" sys.path.insert(0, str(lib_dir)) +from compat import setup_windows_encoding +setup_windows_encoding() def main(argv: list[str]) -> int: @@ -24,10 +26,6 @@ def main(argv: list[str]) -> int: print("❌ Message cannot be empty", file=sys.stderr) return 1 - if sys.platform == "win32": - from compat import setup_windows_encoding - setup_windows_encoding() - from gemini_comm import GeminiCommunicator from i18n import t From 76da62b3bb75dacac38dbcde8a235dea194c85fe Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 21 Dec 2025 16:33:42 +0800 Subject: [PATCH 031/153] fix(ccb): normalize paths for cross-platform session restore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add _normalize_path_for_match() to handle Windows/WSL/MSYS path variations - Add fallback scan in _get_latest_codex_session_id() when codex_session_id missing - Validate work_dir match in _read_local_claude_session_id() to prevent cross-dir restore - Store work_dir_norm in session files for reliable matching 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- ccb | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 142 insertions(+), 8 deletions(-) diff --git a/ccb b/ccb index f61780b..9903a57 100755 --- a/ccb +++ b/ccb @@ -19,6 +19,7 @@ import platform import tempfile import re import shutil +import posixpath from pathlib import Path script_dir = Path(__file__).resolve().parent @@ -37,6 +38,92 @@ if backend_env and not os.environ.get("CCB_BACKEND_ENV"): VERSION = "2.2" +_WIN_DRIVE_RE = re.compile(r"^[A-Za-z]:([/\\\\]|$)") +_MNT_DRIVE_RE = re.compile(r"^/mnt/([A-Za-z])/(.*)$") +_MSYS_DRIVE_RE = re.compile(r"^/([A-Za-z])/(.*)$") + + +def _looks_like_windows_path(value: str) -> bool: + s = value.strip() + if not s: + return False + if _WIN_DRIVE_RE.match(s): + return True + if s.startswith("\\\\") or s.startswith("//"): + return True + return False + + +def _normalize_path_for_match(value: str) -> str: + """ + Normalize a path-like string for loose matching across Windows/WSL/MSYS variations. + This is used only for selecting a session for *current* cwd, so favor robustness. + """ + s = (value or "").strip() + if not s: + return "" + + s = s.replace("\\", "/") + + # Map WSL drive mount to Windows-style drive path for comparison. + m = _MNT_DRIVE_RE.match(s) + if m: + drive = m.group(1).lower() + rest = m.group(2) + s = f"{drive}:/{rest}" + else: + # Map MSYS /c/... to c:/... (Git-Bash/MSYS2 environments on Windows). + m = _MSYS_DRIVE_RE.match(s) + if m and ("MSYSTEM" in os.environ or os.name == "nt"): + drive = m.group(1).lower() + rest = m.group(2) + s = f"{drive}:/{rest}" + + # Collapse redundant separators and dot segments using POSIX semantics (we forced "/"). + # Preserve UNC double-slash prefix. + if s.startswith("//"): + prefix = "//" + rest = s[2:] + rest = posixpath.normpath(rest) + s = prefix + rest.lstrip("/") + else: + s = posixpath.normpath(s) + + # Normalize Windows drive letter casing (c:/..., not C:/...). + if _WIN_DRIVE_RE.match(s): + s = s[0].lower() + s[1:] + + # Drop trailing slash (but keep "/" and "c:/"). + if len(s) > 1 and s.endswith("/"): + s = s.rstrip("/") + if _WIN_DRIVE_RE.match(s) and not s.endswith("/"): + # Ensure drive root keeps trailing slash form "c:/". + if len(s) == 2: + s = s + "/" + + # On Windows-like paths, compare case-insensitively to avoid drive letter/case issues. + if _looks_like_windows_path(s): + s = s.casefold() + + return s + + +def _work_dir_match_keys(work_dir: Path) -> set[str]: + keys: set[str] = set() + candidates: list[str] = [] + for raw in (os.environ.get("PWD"), str(work_dir)): + if raw: + candidates.append(raw) + try: + candidates.append(str(work_dir.resolve())) + except Exception: + pass + for candidate in candidates: + normalized = _normalize_path_for_match(candidate) + if normalized: + keys.add(normalized) + return keys + def _get_git_info() -> str: try: @@ -298,16 +385,24 @@ class AILauncher: data = self._read_json_file(self._claude_session_file()) sid = data.get("claude_session_id") or data.get("session_id") if isinstance(sid, str) and sid.strip(): + # Guard against path-format mismatch (Windows case/slash differences, MSYS paths, etc.). + recorded = data.get("work_dir") + if isinstance(recorded, str) and recorded.strip(): + current_keys = _work_dir_match_keys(Path.cwd()) + if current_keys and _normalize_path_for_match(recorded) not in current_keys: + return None return sid.strip() return None def _write_local_claude_session(self, session_id: str, active: bool = True) -> None: path = self._claude_session_file() data = self._read_json_file(path) + work_dir = Path.cwd() data.update( { "claude_session_id": session_id, - "work_dir": str(Path.cwd()), + "work_dir": str(work_dir), + "work_dir_norm": _normalize_path_for_match(str(work_dir)), "active": bool(active), "started_at": data.get("started_at") or time.strftime("%Y-%m-%d %H:%M:%S"), "updated_at": time.strftime("%Y-%m-%d %H:%M:%S"), @@ -327,6 +422,47 @@ class AILauncher: cached = data.get("codex_session_id") if isinstance(cached, str) and cached: return cached, True + + # Fallback: scan Codex session logs for the latest session bound to this cwd. + # This handles cases where `.codex-session` exists but never got updated with `codex_session_id` + # (e.g., user closed the backend before sending any message through the bridge). + root = Path(os.environ.get("CODEX_SESSION_ROOT") or (Path.home() / ".codex" / "sessions")).expanduser() + if not root.exists(): + return None, False + work_keys = _work_dir_match_keys(Path.cwd()) + if not work_keys: + return None, False + try: + logs = sorted( + (p for p in root.glob("**/*.jsonl") if p.is_file()), + key=lambda p: p.stat().st_mtime, + reverse=True, + ) + except Exception: + logs = [] + for log_path in logs[:400]: + try: + with log_path.open("r", encoding="utf-8", errors="ignore") as handle: + first = handle.readline().strip() + except OSError: + continue + if not first: + continue + try: + entry = json.loads(first) + except Exception: + continue + if not isinstance(entry, dict) or entry.get("type") != "session_meta": + continue + payload = entry.get("payload") if isinstance(entry.get("payload"), dict) else {} + cwd = payload.get("cwd") + if not isinstance(cwd, str) or not cwd.strip(): + continue + if _normalize_path_for_match(cwd) not in work_keys: + continue + sid = payload.get("id") + if isinstance(sid, str) and sid: + return sid, True return None, False def _build_codex_start_cmd(self) -> str: @@ -554,6 +690,7 @@ exec tmux attach -t "$TMUX_SESSION" if session_file.exists(): data = self._read_json_file(session_file) + work_dir = Path.cwd() data.update({ "session_id": self.session_id, "runtime_dir": str(runtime), @@ -563,7 +700,8 @@ exec tmux attach -t "$TMUX_SESSION" "tmux_session": tmux_session, "pane_id": pane_id, "tmux_log": str(runtime / "bridge_output.log"), - "work_dir": str(Path.cwd()), + "work_dir": str(work_dir), + "work_dir_norm": _normalize_path_for_match(str(work_dir)), "active": True, "started_at": time.strftime("%Y-%m-%d %H:%M:%S"), }) @@ -986,11 +1124,7 @@ def cmd_restore(args): else: # Fallback: scan ~/.codex/sessions for latest session bound to this cwd. root = Path(os.environ.get("CODEX_SESSION_ROOT") or (Path.home() / ".codex" / "sessions")).expanduser() - work_dirs = set([os.environ.get("PWD", ""), str(Path.cwd())]) - try: - work_dirs.add(str(Path.cwd().resolve())) - except Exception: - pass + work_dirs = _work_dir_match_keys(Path.cwd()) try: logs = sorted( (p for p in root.glob("**/*.jsonl") if p.is_file()), @@ -1015,7 +1149,7 @@ def cmd_restore(args): continue payload = entry.get("payload") if isinstance(entry.get("payload"), dict) else {} cwd = payload.get("cwd") - if isinstance(cwd, str) and cwd in work_dirs: + if isinstance(cwd, str) and cwd.strip() and _normalize_path_for_match(cwd) in work_dirs: has_history = True sid = payload.get("id") if isinstance(sid, str) and sid: From e1bcc530cb9940a907b6fcc0e3898a1197f078fe Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 21 Dec 2025 16:44:09 +0800 Subject: [PATCH 032/153] fix(ccb): add work_dir validation for codex_session_id to prevent cross-dir restore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add _extract_session_work_dir_norm() helper for consistent work_dir extraction - Validate work_dir in _get_latest_codex_session_id() before using cached codex_session_id - Reject resume in _read_local_claude_session_id() when work_dir is missing (old files) - Add work_dir check in cmd_restore() for codex_session_id 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- ccb | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/ccb b/ccb index 9903a57..f92e684 100755 --- a/ccb +++ b/ccb @@ -125,6 +125,19 @@ def _work_dir_match_keys(work_dir: Path) -> set[str]: return keys +def _extract_session_work_dir_norm(session_data: dict) -> str: + """Extract a normalized work dir marker from a session file payload.""" + if not isinstance(session_data, dict): + return "" + raw_norm = session_data.get("work_dir_norm") + if isinstance(raw_norm, str) and raw_norm.strip(): + return _normalize_path_for_match(raw_norm) + raw = session_data.get("work_dir") + if isinstance(raw, str) and raw.strip(): + return _normalize_path_for_match(raw) + return "" + + def _get_git_info() -> str: try: result = subprocess.run( @@ -386,11 +399,13 @@ class AILauncher: sid = data.get("claude_session_id") or data.get("session_id") if isinstance(sid, str) and sid.strip(): # Guard against path-format mismatch (Windows case/slash differences, MSYS paths, etc.). - recorded = data.get("work_dir") - if isinstance(recorded, str) and recorded.strip(): - current_keys = _work_dir_match_keys(Path.cwd()) - if current_keys and _normalize_path_for_match(recorded) not in current_keys: - return None + recorded_norm = _extract_session_work_dir_norm(data) + if not recorded_norm: + # Old/foreign session file without a recorded work dir: refuse to resume to avoid cross-project reuse. + return None + current_keys = _work_dir_match_keys(Path.cwd()) + if current_keys and recorded_norm not in current_keys: + return None return sid.strip() return None @@ -421,7 +436,11 @@ class AILauncher: data = self._read_json_file(project_session) cached = data.get("codex_session_id") if isinstance(cached, str) and cached: - return cached, True + recorded_norm = _extract_session_work_dir_norm(data) + if recorded_norm: + work_keys = _work_dir_match_keys(Path.cwd()) + if not work_keys or recorded_norm in work_keys: + return cached, True # Fallback: scan Codex session logs for the latest session bound to this cwd. # This handles cases where `.codex-session` exists but never got updated with `codex_session_id` @@ -1120,7 +1139,12 @@ def cmd_restore(args): if provider == "codex": session_id = data.get("codex_session_id") if isinstance(session_id, str) and session_id: - has_history = True + recorded_norm = _extract_session_work_dir_norm(data) + work_keys = _work_dir_match_keys(Path.cwd()) + if recorded_norm and (not work_keys or recorded_norm in work_keys): + has_history = True + else: + session_id = None else: # Fallback: scan ~/.codex/sessions for latest session bound to this cwd. root = Path(os.environ.get("CODEX_SESSION_ROOT") or (Path.home() / ".codex" / "sessions")).expanduser() From b7713a4eb266827db7bc874d2ee7f7dcf4b1e927 Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 21 Dec 2025 17:15:25 +0800 Subject: [PATCH 033/153] fix(ccb): improve Linux path matching to reduce false negatives MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add expanduser for ~ prefixed paths in _normalize_path_for_match() - Absolutize relative paths against cwd for matching purposes - Try multiple path forms (absolute, resolve, PWD) for Gemini hash lookup 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- ccb | 66 +++++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 53 insertions(+), 13 deletions(-) diff --git a/ccb b/ccb index f92e684..a68c74a 100755 --- a/ccb +++ b/ccb @@ -63,6 +63,29 @@ def _normalize_path_for_match(value: str) -> str: if not s: return "" + # Expand "~" early (common in shell-originated values). If expansion fails, keep original. + if s.startswith("~"): + try: + s = os.path.expanduser(s) + except Exception: + pass + + # If the path is relative, absolutize it against current cwd for matching purposes only. + # This reduces false negatives when upstream tools record a relative cwd. + # NOTE: treat Windows-like absolute paths as absolute even on non-Windows hosts. + try: + preview = s.replace("\\", "/") + is_abs = ( + preview.startswith("/") + or preview.startswith("//") + or bool(_WIN_DRIVE_RE.match(preview)) + or preview.startswith("\\\\") + ) + if not is_abs: + s = str((Path.cwd() / Path(s)).absolute()) + except Exception: + pass + s = s.replace("\\", "/") # Map WSL drive mount to Windows-style drive path for comparison. @@ -503,23 +526,40 @@ class AILauncher: Returns (project_hash, has_any_history_for_cwd). Gemini CLI stores sessions under ~/.gemini/tmp//chats/. """ - # Calculate hash the same way Gemini CLI does (sha256 of absolute path) import hashlib + + gemini_root = Path(os.environ.get("GEMINI_ROOT") or (Path.home() / ".gemini" / "tmp")).expanduser() + + candidates: list[str] = [] + try: + candidates.append(str(Path.cwd().absolute())) + except Exception: + pass try: - normalized = str(Path.cwd().expanduser().absolute()) + candidates.append(str(Path.cwd().resolve())) except Exception: - normalized = str(Path.cwd()) - project_hash = hashlib.sha256(normalized.encode()).hexdigest() + pass + env_pwd = (os.environ.get("PWD") or "").strip() + if env_pwd: + try: + candidates.append(os.path.abspath(os.path.expanduser(env_pwd))) + except Exception: + candidates.append(env_pwd) - # Check if actual session files exist - gemini_root = Path(os.environ.get("GEMINI_ROOT") or (Path.home() / ".gemini" / "tmp")).expanduser() - chats_dir = gemini_root / project_hash / "chats" - if not chats_dir.exists(): - return None, False - session_files = list(chats_dir.glob("session-*.json")) - if not session_files: - return None, False - return project_hash, True + seen: set[str] = set() + for candidate in candidates: + if not candidate or candidate in seen: + continue + seen.add(candidate) + project_hash = hashlib.sha256(candidate.encode()).hexdigest() + chats_dir = gemini_root / project_hash / "chats" + if not chats_dir.exists(): + continue + session_files = list(chats_dir.glob("session-*.json")) + if session_files: + return project_hash, True + + return None, False def _build_gemini_start_cmd(self) -> str: cmd = "gemini --yolo" if self.auto else "gemini" From 201809c02d5e00333be9859d3f32eb1d103acb14 Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 21 Dec 2025 17:27:50 +0800 Subject: [PATCH 034/153] fix(cpend): improve Windows compatibility and prevent cross-project reply leakage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Use utf-8-sig encoding for session file reads (handle Windows BOM) - Validate pending_state is dict before accessing - Use safe_write_session for atomic writes - Check log_path exists before reading to avoid global fallback 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- bin/cask-w | 2 +- bin/cpend | 38 ++++++++++++++++++++++++-------------- bin/gask-w | 2 +- lib/codex_comm.py | 4 ++-- 4 files changed, 28 insertions(+), 18 deletions(-) diff --git a/bin/cask-w b/bin/cask-w index 105f8f7..91de217 100755 --- a/bin/cask-w +++ b/bin/cask-w @@ -34,7 +34,7 @@ def main(argv: list[str]) -> int: if not session_file.exists(): return try: - with session_file.open("r", encoding="utf-8") as handle: + with session_file.open("r", encoding="utf-8-sig") as handle: data = json.load(handle) data["pending_state"] = { "log_path": str(state.get("log_path")) if state.get("log_path") else None, diff --git a/bin/cpend b/bin/cpend index e814572..8747d57 100755 --- a/bin/cpend +++ b/bin/cpend @@ -14,6 +14,7 @@ from compat import setup_windows_encoding setup_windows_encoding() from i18n import t +from session_utils import safe_write_session try: from codex_comm import CodexCommunicator @@ -43,9 +44,10 @@ def _load_pending_state() -> dict: if not session_file.exists(): return {} try: - with session_file.open("r", encoding="utf-8") as f: + with session_file.open("r", encoding="utf-8-sig") as f: data = json.load(f) - return data.get("pending_state", {}) + pending = data.get("pending_state", {}) + return pending if isinstance(pending, dict) else {} except Exception: return {} @@ -56,12 +58,11 @@ def _clear_pending_state() -> None: if not session_file.exists(): return try: - with session_file.open("r", encoding="utf-8") as f: + with session_file.open("r", encoding="utf-8-sig") as f: data = json.load(f) if "pending_state" in data: del data["pending_state"] - with session_file.open("w", encoding="utf-8") as f: - json.dump(data, f, ensure_ascii=False, indent=2) + safe_write_session(session_file, json.dumps(data, ensure_ascii=False, indent=2)) except Exception: pass @@ -79,15 +80,24 @@ def main() -> int: pending = _load_pending_state() if pending and pending.get("log_path"): - state = { - "log_path": Path(pending["log_path"]), - "offset": pending.get("offset", 0), - } - message, _ = comm.log_reader.try_get_message(state) - if message: - _clear_pending_state() - print(message) - return 0 + try: + log_path = Path(str(pending.get("log_path"))).expanduser() + except Exception: + log_path = None + + # Avoid falling back to "global latest" if the pending log path is missing, + # otherwise cpend may display an unrelated reply from another project. + if log_path and log_path.exists(): + try: + offset = int(pending.get("offset", 0) or 0) + except Exception: + offset = 0 + state = {"log_path": str(log_path), "offset": offset} + message, _ = comm.log_reader.try_get_message(state) + if message: + _clear_pending_state() + print(message) + return 0 output = comm.consume_pending(display=False) if output: diff --git a/bin/gask-w b/bin/gask-w index b0bcb5b..96267eb 100755 --- a/bin/gask-w +++ b/bin/gask-w @@ -34,7 +34,7 @@ def main(argv: list[str]) -> int: if not session_file.exists(): return try: - with session_file.open("r", encoding="utf-8") as handle: + with session_file.open("r", encoding="utf-8-sig") as handle: data = json.load(handle) data["pending_state"] = { "session_path": str(state.get("session_path")) if state.get("session_path") else None, diff --git a/lib/codex_comm.py b/lib/codex_comm.py index 647fe65..12bbf21 100644 --- a/lib/codex_comm.py +++ b/lib/codex_comm.py @@ -350,7 +350,7 @@ def _load_session_info(self): return None try: - with open(project_session, "r", encoding="utf-8") as f: + with open(project_session, "r", encoding="utf-8-sig") as f: data = json.load(f) if not isinstance(data, dict): @@ -573,7 +573,7 @@ def _remember_codex_session(self, log_path: Optional[Path]) -> None: if not project_file.exists(): return try: - with project_file.open("r", encoding="utf-8") as handle: + with project_file.open("r", encoding="utf-8-sig") as handle: data = json.load(handle) except Exception: return From 4195c890feca224fc03f708f59434a9da3d5b5f5 Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 21 Dec 2025 19:20:20 +0800 Subject: [PATCH 035/153] fix(comm): prevent missing replies during log file transitions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - codex_comm: start from beginning when switching to new log file to avoid missing replies already written before detection - gemini_comm: detect and return valid replies on first successful read when capture_state failed due to transient JSON writes 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- lib/codex_comm.py | 9 ++++----- lib/gemini_comm.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/lib/codex_comm.py b/lib/codex_comm.py index 12bbf21..ab3e530 100644 --- a/lib/codex_comm.py +++ b/lib/codex_comm.py @@ -239,11 +239,10 @@ def ensure_log() -> Path: if latest and latest != log_path: current_path = latest self._preferred_log = latest - # When switching to a new log file, start from EOF to avoid replaying old content. - try: - offset = latest.stat().st_size - except OSError: - offset = 0 + # When switching to a new log file (session rotation / new session), + # start from the beginning to avoid missing a reply that was already written + # before we noticed the new file. + offset = 0 if not block: return None, {"log_path": current_path, "offset": offset} time.sleep(self._poll_interval) diff --git a/lib/gemini_comm.py b/lib/gemini_comm.py index 45c0e05..c940e7b 100755 --- a/lib/gemini_comm.py +++ b/lib/gemini_comm.py @@ -285,6 +285,36 @@ def _read_since(self, state: Dict[str, Any], timeout: float, block: bool) -> Tup current_count = len(messages) if unknown_baseline: + # If capture_state couldn't parse the JSON (transient in-place writes), the wait + # loop may see a fully-written reply in the first successful read. If we treat + # that read as a "baseline" we can miss the reply forever. + last_msg = messages[-1] if messages else None + if isinstance(last_msg, dict): + last_type = last_msg.get("type") + last_content = (last_msg.get("content") or "").strip() + else: + last_type = None + last_content = "" + + # Only fast-path when the file has changed since the baseline stat and the + # latest message is a non-empty Gemini reply. + if ( + last_type == "gemini" + and last_content + and (current_mtime_ns > prev_mtime_ns or current_size != prev_size) + ): + msg_id = last_msg.get("id") if isinstance(last_msg, dict) else None + content_hash = hashlib.sha256(last_content.encode("utf-8")).hexdigest() + return last_content, { + "session_path": session, + "msg_count": current_count, + "mtime": current_mtime, + "mtime_ns": current_mtime_ns, + "size": current_size, + "last_gemini_id": msg_id, + "last_gemini_hash": content_hash, + } + prev_mtime = current_mtime prev_mtime_ns = current_mtime_ns prev_size = current_size From 81fb84e7add8d2d3c578d9cb1527f949e6aa573b Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 21 Dec 2025 19:38:35 +0800 Subject: [PATCH 036/153] feat(update): show version upgrade info with commit hash and date MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Display old and new version info: vX.X commit date - Show "Updated: old → new" or "Already up to date: current" 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- ccb | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/ccb b/ccb index a68c74a..dba3746 100755 --- a/ccb +++ b/ccb @@ -1260,6 +1260,47 @@ def cmd_update(args): import tarfile import tempfile + def _get_version_info(dir_path: Path) -> dict: + """Get commit hash, date and version from install directory""" + info = {"commit": None, "date": None, "version": None} + if not shutil.which("git") or not (dir_path / ".git").exists(): + return info + # Get commit hash and date + result = subprocess.run( + ["git", "-C", str(dir_path), "log", "-1", "--format=%h|%ci"], + capture_output=True, text=True, encoding='utf-8', errors='replace' + ) + if result.returncode == 0 and result.stdout.strip(): + parts = result.stdout.strip().split("|") + if len(parts) >= 2: + info["commit"] = parts[0] + info["date"] = parts[1].split()[0] # YYYY-MM-DD + # Get version from ccb file + ccb_file = dir_path / "ccb" + if ccb_file.exists(): + try: + content = ccb_file.read_text(encoding='utf-8', errors='replace') + for line in content.split('\n')[:50]: + if line.startswith('VERSION'): + # VERSION = "2.2" + version = line.split('=')[1].strip().strip('"').strip("'") + info["version"] = version + break + except Exception: + pass + return info + + def _format_version_info(info: dict) -> str: + """Format version info for display""" + parts = [] + if info.get("version"): + parts.append(f"v{info['version']}") + if info.get("commit"): + parts.append(info["commit"]) + if info.get("date"): + parts.append(info["date"]) + return " ".join(parts) if parts else "unknown" + # Prefer the directory where this script resides (installed copy), then fall back to env/default. script_root = Path(__file__).resolve().parent default_install_dir = Path.home() / ".local/share/codex-dual" @@ -1268,6 +1309,9 @@ def cmd_update(args): install_dir = script_root repo_url = "https://github.com/bfly123/claude_code_bridge" + # Get current version info before update + old_info = _get_version_info(install_dir) + print("🔄 Checking for updates...") # Method 1: Prefer git if available @@ -1281,7 +1325,14 @@ def cmd_update(args): print(result.stdout.strip() if result.stdout.strip() else "Already up to date.") print("🔧 Reinstalling...") subprocess.run([str(install_dir / "install.sh"), "install"]) - print("✅ Update complete!") + # Show upgrade info + new_info = _get_version_info(install_dir) + old_str = _format_version_info(old_info) + new_str = _format_version_info(new_info) + if old_info.get("commit") != new_info.get("commit"): + print(f"✅ Updated: {old_str} → {new_str}") + else: + print(f"✅ Already up to date: {new_str}") return 0 else: print(f"⚠️ Git pull failed: {result.stderr.strip()}") @@ -1387,8 +1438,14 @@ def cmd_update(args): env["CODEX_INSTALL_PREFIX"] = str(install_dir) subprocess.run([str(extracted_dir / "install.sh"), "install"], check=True, env=env) - print("✅ Update complete!") - print("💡 Recommended: Install WezTerm as terminal frontend (better split/scroll experience), see README.") + # Show upgrade info + new_info = _get_version_info(install_dir) + old_str = _format_version_info(old_info) + new_str = _format_version_info(new_info) + if old_info.get("commit") != new_info.get("commit") or old_info.get("version") != new_info.get("version"): + print(f"✅ Updated: {old_str} → {new_str}") + else: + print(f"✅ Already up to date: {new_str}") return 0 except Exception as e: From e2e67c41bc3f363bc7b3c47362e59394152050c6 Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 21 Dec 2025 19:48:26 +0800 Subject: [PATCH 037/153] fix(update): read version even without git repo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Move version reading before git check - Works for tarball installs without .git directory 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- ccb | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/ccb b/ccb index dba3746..e765e4f 100755 --- a/ccb +++ b/ccb @@ -1263,19 +1263,7 @@ def cmd_update(args): def _get_version_info(dir_path: Path) -> dict: """Get commit hash, date and version from install directory""" info = {"commit": None, "date": None, "version": None} - if not shutil.which("git") or not (dir_path / ".git").exists(): - return info - # Get commit hash and date - result = subprocess.run( - ["git", "-C", str(dir_path), "log", "-1", "--format=%h|%ci"], - capture_output=True, text=True, encoding='utf-8', errors='replace' - ) - if result.returncode == 0 and result.stdout.strip(): - parts = result.stdout.strip().split("|") - if len(parts) >= 2: - info["commit"] = parts[0] - info["date"] = parts[1].split()[0] # YYYY-MM-DD - # Get version from ccb file + # Get version from ccb file first (works without git) ccb_file = dir_path / "ccb" if ccb_file.exists(): try: @@ -1288,6 +1276,17 @@ def cmd_update(args): break except Exception: pass + # Get commit hash and date if git available + if shutil.which("git") and (dir_path / ".git").exists(): + result = subprocess.run( + ["git", "-C", str(dir_path), "log", "-1", "--format=%h|%ci"], + capture_output=True, text=True, encoding='utf-8', errors='replace' + ) + if result.returncode == 0 and result.stdout.strip(): + parts = result.stdout.strip().split("|") + if len(parts) >= 2: + info["commit"] = parts[0] + info["date"] = parts[1].split()[0] # YYYY-MM-DD return info def _format_version_info(info: dict) -> str: From 36a6dae1fe9e8c5e5e7541daae24e8112a3430ba Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 21 Dec 2025 19:54:30 +0800 Subject: [PATCH 038/153] feat(update): embed git commit and date in ccb during install MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add GIT_COMMIT and GIT_DATE variables to ccb - install.sh updates these variables from git info - Works for tarball installs without .git directory 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- ccb | 25 ++++++++++++++++++------- install.sh | 12 ++++++++++++ 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/ccb b/ccb index e765e4f..c9daa2b 100755 --- a/ccb +++ b/ccb @@ -37,6 +37,8 @@ if backend_env and not os.environ.get("CCB_BACKEND_ENV"): os.environ["CCB_BACKEND_ENV"] = backend_env VERSION = "2.2" +GIT_COMMIT = "" # Updated by install.sh +GIT_DATE = "" # Updated by install.sh _WIN_DRIVE_RE = re.compile(r"^[A-Za-z]:([/\\\\]|$)") _MNT_DRIVE_RE = re.compile(r"^/mnt/([A-Za-z])/(.*)$") @@ -1263,20 +1265,29 @@ def cmd_update(args): def _get_version_info(dir_path: Path) -> dict: """Get commit hash, date and version from install directory""" info = {"commit": None, "date": None, "version": None} - # Get version from ccb file first (works without git) + # Get version, commit, date from ccb file (works without git) ccb_file = dir_path / "ccb" if ccb_file.exists(): try: content = ccb_file.read_text(encoding='utf-8', errors='replace') - for line in content.split('\n')[:50]: - if line.startswith('VERSION'): + for line in content.split('\n')[:60]: + line = line.strip() + if line.startswith('VERSION') and '=' in line: # VERSION = "2.2" - version = line.split('=')[1].strip().strip('"').strip("'") - info["version"] = version - break + info["version"] = line.split('=')[1].strip().strip('"').strip("'") + elif line.startswith('GIT_COMMIT') and '=' in line: + # GIT_COMMIT = "abc1234" + val = line.split('=')[1].strip().strip('"').strip("'") + if val: + info["commit"] = val + elif line.startswith('GIT_DATE') and '=' in line: + # GIT_DATE = "2025-12-21" + val = line.split('=')[1].strip().strip('"').strip("'") + if val: + info["date"] = val except Exception: pass - # Get commit hash and date if git available + # Override with live git info if available if shutil.which("git") and (dir_path / ".git").exists(): result = subprocess.run( ["git", "-C", str(dir_path), "log", "-1", "--format=%h|%ci"], diff --git a/install.sh b/install.sh index f8fb73d..b040c45 100755 --- a/install.sh +++ b/install.sh @@ -524,6 +524,18 @@ copy_project() { mkdir -p "$(dirname "$INSTALL_PREFIX")" mv "$staging" "$INSTALL_PREFIX" trap - EXIT + + # Update GIT_COMMIT and GIT_DATE in ccb file + if command -v git >/dev/null 2>&1 && [[ -d "$REPO_ROOT/.git" ]]; then + local git_commit git_date + git_commit=$(git -C "$REPO_ROOT" log -1 --format='%h' 2>/dev/null || echo "") + git_date=$(git -C "$REPO_ROOT" log -1 --format='%cs' 2>/dev/null || echo "") + if [[ -n "$git_commit" && -f "$INSTALL_PREFIX/ccb" ]]; then + sed -i.bak "s/^GIT_COMMIT = .*/GIT_COMMIT = \"$git_commit\"/" "$INSTALL_PREFIX/ccb" + sed -i.bak "s/^GIT_DATE = .*/GIT_DATE = \"$git_date\"/" "$INSTALL_PREFIX/ccb" + rm -f "$INSTALL_PREFIX/ccb.bak" + fi + fi } install_bin_links() { From e665126e3ecb94b8b64448d0584e9fe91a196578 Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 21 Dec 2025 19:59:03 +0800 Subject: [PATCH 039/153] fix(update): remove inline comments from GIT_COMMIT/GIT_DATE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Comments were being included in parsed values 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- ccb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ccb b/ccb index c9daa2b..ab86f27 100755 --- a/ccb +++ b/ccb @@ -37,8 +37,8 @@ if backend_env and not os.environ.get("CCB_BACKEND_ENV"): os.environ["CCB_BACKEND_ENV"] = backend_env VERSION = "2.2" -GIT_COMMIT = "" # Updated by install.sh -GIT_DATE = "" # Updated by install.sh +GIT_COMMIT = "" +GIT_DATE = "" _WIN_DRIVE_RE = re.compile(r"^[A-Za-z]:([/\\\\]|$)") _MNT_DRIVE_RE = re.compile(r"^/mnt/([A-Za-z])/(.*)$") From 5454ddde148250c45e0a5e97fafcb8df58914823 Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 21 Dec 2025 20:02:18 +0800 Subject: [PATCH 040/153] feat(install): get git info from GitHub API for tarball installs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Method 1: From local git repo - Method 2: From CCB_GIT_COMMIT/CCB_GIT_DATE env vars - Method 3: From GitHub API (fallback for tarball) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- install.sh | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/install.sh b/install.sh index b040c45..d9c981e 100755 --- a/install.sh +++ b/install.sh @@ -526,16 +526,35 @@ copy_project() { trap - EXIT # Update GIT_COMMIT and GIT_DATE in ccb file + local git_commit="" git_date="" + + # Method 1: From git repo if command -v git >/dev/null 2>&1 && [[ -d "$REPO_ROOT/.git" ]]; then - local git_commit git_date git_commit=$(git -C "$REPO_ROOT" log -1 --format='%h' 2>/dev/null || echo "") git_date=$(git -C "$REPO_ROOT" log -1 --format='%cs' 2>/dev/null || echo "") - if [[ -n "$git_commit" && -f "$INSTALL_PREFIX/ccb" ]]; then - sed -i.bak "s/^GIT_COMMIT = .*/GIT_COMMIT = \"$git_commit\"/" "$INSTALL_PREFIX/ccb" - sed -i.bak "s/^GIT_DATE = .*/GIT_DATE = \"$git_date\"/" "$INSTALL_PREFIX/ccb" - rm -f "$INSTALL_PREFIX/ccb.bak" + fi + + # Method 2: From environment variables (set by ccb update) + if [[ -z "$git_commit" && -n "${CCB_GIT_COMMIT:-}" ]]; then + git_commit="$CCB_GIT_COMMIT" + git_date="${CCB_GIT_DATE:-}" + fi + + # Method 3: From GitHub API (fallback) + if [[ -z "$git_commit" ]] && command -v curl >/dev/null 2>&1; then + local api_response + api_response=$(curl -fsSL "https://api.github.com/repos/bfly123/claude_code_bridge/commits/main" 2>/dev/null || echo "") + if [[ -n "$api_response" ]]; then + git_commit=$(echo "$api_response" | grep -o '"sha": "[^"]*"' | head -1 | cut -d'"' -f4 | cut -c1-7) + git_date=$(echo "$api_response" | grep -o '"date": "[^"]*"' | head -1 | cut -d'"' -f4 | cut -c1-10) fi fi + + if [[ -n "$git_commit" && -f "$INSTALL_PREFIX/ccb" ]]; then + sed -i.bak "s/^GIT_COMMIT = .*/GIT_COMMIT = \"$git_commit\"/" "$INSTALL_PREFIX/ccb" + sed -i.bak "s/^GIT_DATE = .*/GIT_DATE = \"$git_date\"/" "$INSTALL_PREFIX/ccb" + rm -f "$INSTALL_PREFIX/ccb.bak" + fi } install_bin_links() { From 66dc7c3c304e867fea747ea931b24cdd0b77db6a Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 21 Dec 2025 20:40:50 +0800 Subject: [PATCH 041/153] fix(gask-w): return last gemini message instead of first MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously _read_since returned the first gemini message with content, which could be an intermediate status message when Gemini sends multiple messages (tool calls → intermediate status → final reply). Now it collects all gemini messages and returns the last one with content. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- lib/gemini_comm.py | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/lib/gemini_comm.py b/lib/gemini_comm.py index c940e7b..cad5c48 100755 --- a/lib/gemini_comm.py +++ b/lib/gemini_comm.py @@ -348,6 +348,11 @@ def _read_since(self, state: Dict[str, Any], timeout: float, block: bool) -> Tup continue if current_count > prev_count: + # Find the LAST gemini message with content (not the first) + # to avoid returning intermediate status messages + last_gemini_content = None + last_gemini_id = None + last_gemini_hash = None for msg in messages[prev_count:]: if msg.get("type") == "gemini": content = msg.get("content", "").strip() @@ -356,16 +361,20 @@ def _read_since(self, state: Dict[str, Any], timeout: float, block: bool) -> Tup msg_id = msg.get("id") if msg_id == prev_last_gemini_id and content_hash == prev_last_gemini_hash: continue - new_state = { - "session_path": session, - "msg_count": current_count, - "mtime": current_mtime, - "mtime_ns": current_mtime_ns, - "size": current_size, - "last_gemini_id": msg_id, - "last_gemini_hash": content_hash, - } - return content, new_state + last_gemini_content = content + last_gemini_id = msg_id + last_gemini_hash = content_hash + if last_gemini_content: + new_state = { + "session_path": session, + "msg_count": current_count, + "mtime": current_mtime, + "mtime_ns": current_mtime_ns, + "size": current_size, + "last_gemini_id": last_gemini_id, + "last_gemini_hash": last_gemini_hash, + } + return last_gemini_content, new_state else: # Some versions write empty gemini message first, then update content in-place. last = self._extract_last_gemini(data) From 00a43eb8715ab6eda548003bd9cbe05207d191ef Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 21 Dec 2025 21:44:02 +0800 Subject: [PATCH 042/153] fix(session): remove session_id_filter to fix session confusion MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - codex_comm.py: Remove session_id_filter from _scan_latest() to always read the latest session file by mtime, fixing issue where old session replies were returned instead of new ones - install.sh: Update CLAUDE.md config to use run_in_background=true and auto-cat output on bash-notification for cask-w/gask-w 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- commands/gask-w.md | 2 +- install.sh | 30 ++++++++++++------------------ lib/codex_comm.py | 2 -- 3 files changed, 13 insertions(+), 21 deletions(-) diff --git a/commands/gask-w.md b/commands/gask-w.md index 6dbf476..18d3606 100644 --- a/commands/gask-w.md +++ b/commands/gask-w.md @@ -10,7 +10,7 @@ Parameters: Workflow: 1. Start gask-w in background -> get task_id -2. Inform user: "Gemini processing in background (task: xxx), use /gpend to check reply" +2. Inform user: "Gemini processing in background (task: xxx)" 3. STOP and continue conversation - do NOT block waiting When user wants result: diff --git a/install.sh b/install.sh index d9c981e..1672252 100755 --- a/install.sh +++ b/install.sh @@ -667,11 +667,9 @@ install_claude_md_config() { ## Codex Collaboration Rules Codex is another AI assistant running in a separate terminal session (WezTerm, iTerm2 or tmux). When user intent involves asking/consulting/collaborating with Codex: -**CRITICAL: After sending cask-w, DO NOT perform any additional actions. Stop and wait for user input.** - Fast path (minimize latency): - If the user message starts with any of: `@codex`, `codex:`, `ask codex`, `let codex`, `/cask-w` then immediately run: - - `Bash(cask-w "")` then STOP and wait for user + - `Bash(cask-w "", run_in_background=true)` then STOP and wait for bash-notification - If user message is only the prefix (no content), ask a 1-line clarification for what to send. Trigger conditions (any match): @@ -680,17 +678,16 @@ Trigger conditions (any match): - User asks about codex's status or previous reply Command selection: -- Default ask/collaborate -> `Bash(cask-w "")` - - After sending, STOP immediately and wait for user input - - Do NOT continue with other work +- Default ask/collaborate -> `Bash(cask-w "", run_in_background=true)` + - When bash-notification arrives (task completed), immediately cat the output file to show result + - Do NOT continue with other work until result is shown - Send without waiting -> `cask ""` (fire and forget) - Check connectivity -> `cping` - View previous reply -> `cpend` Examples: -- "what does codex think" -> `Bash(cask-w "...")`, then STOP -- "ask codex to review this" -> `Bash(cask-w "...")`, then STOP -- "codex, help me with X" -> `Bash(cask-w "...")`, then STOP +- "what does codex think" -> `Bash(cask-w "...", run_in_background=true)`, wait for notification, cat output +- "ask codex to review this" -> `Bash(cask-w "...", run_in_background=true)`, wait for notification, cat output - "is codex alive" -> cping - "don't wait for reply" -> cask - "view codex reply" -> cpend @@ -698,11 +695,9 @@ Examples: ## Gemini Collaboration Rules Gemini is another AI assistant running in a separate terminal session (WezTerm, iTerm2 or tmux). When user intent involves asking/consulting/collaborating with Gemini: -**CRITICAL: After sending gask-w, DO NOT perform any additional actions. Stop and wait for user input.** - Fast path (minimize latency): - If the user message starts with any of: `@gemini`, `gemini:`, `ask gemini`, `let gemini`, `/gask-w` then immediately run: - - `Bash(gask-w "")` then STOP and wait for user + - `Bash(gask-w "", run_in_background=true)` then STOP and wait for bash-notification - If user message is only the prefix (no content), ask a 1-line clarification for what to send. Trigger conditions (any match): @@ -711,17 +706,16 @@ Trigger conditions (any match): - User asks about gemini's status or previous reply Command selection: -- Default ask/collaborate -> `Bash(gask-w "")` - - After sending, STOP immediately and wait for user input - - Do NOT continue with other work +- Default ask/collaborate -> `Bash(gask-w "", run_in_background=true)` + - When bash-notification arrives (task completed), immediately cat the output file to show result + - Do NOT continue with other work until result is shown - Send without waiting -> `gask ""` (fire and forget) - Check connectivity -> `gping` - View previous reply -> `gpend` Examples: -- "what does gemini think" -> `Bash(gask-w "...")`, then STOP -- "ask gemini to review this" -> `Bash(gask-w "...")`, then STOP -- "gemini, help me with X" -> `Bash(gask-w "...")`, then STOP +- "what does gemini think" -> `Bash(gask-w "...", run_in_background=true)`, wait for notification, cat output +- "ask gemini to review this" -> `Bash(gask-w "...", run_in_background=true)`, wait for notification, cat output - "is gemini alive" -> gping - "don't wait for reply" -> gask - "view gemini reply" -> gpend diff --git a/lib/codex_comm.py b/lib/codex_comm.py index ab3e530..2f6063f 100644 --- a/lib/codex_comm.py +++ b/lib/codex_comm.py @@ -64,8 +64,6 @@ def _scan_latest(self) -> Optional[Path]: latest_mtime = -1.0 for p in (p for p in self.root.glob("**/*.jsonl") if p.is_file()): try: - if self._session_id_filter and self._session_id_filter not in p.name: - continue mtime = p.stat().st_mtime except OSError: continue From 39f037c37298224191709140534395371269746d Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 21 Dec 2025 21:51:54 +0800 Subject: [PATCH 043/153] fix(skills): update cask-w/gask-w to auto-cat on bash-notification MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove ambiguous "STOP and wait for user input" instruction. Now clearly states: wait for bash-notification, then cat output file. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- commands/cask-w.md | 20 ++++++++------------ commands/gask-w.md | 18 +++++++----------- 2 files changed, 15 insertions(+), 23 deletions(-) diff --git a/commands/cask-w.md b/commands/cask-w.md index 4fc26a9..28b5946 100644 --- a/commands/cask-w.md +++ b/commands/cask-w.md @@ -1,27 +1,23 @@ -Forward commands to Codex session and wait for reply via `cask-w` command (supports tmux / WezTerm, forward only, does not execute in current Claude process). +Forward commands to Codex session and wait for reply via `cask-w` command (supports tmux / WezTerm). Execution: 1. Run `Bash(cask-w "", run_in_background=true)` to start background task 2. Tell user the task_id and that Codex is processing -3. STOP immediately and wait for user input (do NOT call TaskOutput) +3. Wait for bash-notification (task completed) +4. When notification arrives, immediately `cat` the output file to show result Parameters: - `` required, will be forwarded to Codex session Workflow: 1. Start cask-w in background -> get task_id -2. Inform user: "Codex processing in background (task: xxx), use /cpend to check reply" -3. STOP and continue conversation - do NOT block waiting - -When user wants result: -- User can say "check codex" or use `/cpend` to view reply -- Or use `TaskOutput(task_id, block=false)` to check status +2. Inform user: "Codex processing (task: xxx)" +3. When bash-notification arrives -> `cat ` to show result Examples: -- `Bash(cask-w "analyze code", run_in_background=true)` -> inform user, STOP -- User: "check codex" -> `cpend` or `TaskOutput(task_id)` +- `Bash(cask-w "analyze code", run_in_background=true)` +- bash-notification arrives -> `cat /tmp/.../tasks/xxx.output` Hints: -- Do NOT use `TaskOutput(block=true)` - it blocks conversation -- Use `/cpend` to view latest reply anytime - Use `cask` for fire-and-forget (no wait) +- Use `/cpend` to view latest reply anytime diff --git a/commands/gask-w.md b/commands/gask-w.md index 18d3606..37fa754 100644 --- a/commands/gask-w.md +++ b/commands/gask-w.md @@ -3,25 +3,21 @@ Forward commands to Gemini session and wait for reply via `gask-w` command (supp Execution: 1. Run `Bash(gask-w "", run_in_background=true)` to start background task 2. Tell user the task_id and that Gemini is processing -3. STOP immediately and wait for user input (do NOT call TaskOutput) +3. Wait for bash-notification (task completed) +4. When notification arrives, immediately `cat` the output file to show result Parameters: - `` required, will be forwarded to Gemini session Workflow: 1. Start gask-w in background -> get task_id -2. Inform user: "Gemini processing in background (task: xxx)" -3. STOP and continue conversation - do NOT block waiting - -When user wants result: -- User can say "check gemini" or use `/gpend` to view reply -- Or use `TaskOutput(task_id, block=false)` to check status +2. Inform user: "Gemini processing (task: xxx)" +3. When bash-notification arrives -> `cat ` to show result Examples: -- `Bash(gask-w "explain this", run_in_background=true)` -> inform user, STOP -- User: "check gemini" -> `gpend` or `TaskOutput(task_id)` +- `Bash(gask-w "explain this", run_in_background=true)` +- bash-notification arrives -> `cat /tmp/.../tasks/xxx.output` Hints: -- Do NOT use `TaskOutput(block=true)` - it blocks conversation -- Use `/gpend` to view latest reply anytime - Use `gask` for fire-and-forget (no wait) +- Use `/gpend` to view latest reply anytime From bdf7b1b7c790438aa0089e8fcd7ed894e08ac805 Mon Sep 17 00:00:00 2001 From: bfly Date: Mon, 22 Dec 2025 10:32:19 +0800 Subject: [PATCH 044/153] feat(ccb): add -v/--version command to show version and update status MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add cmd_version() to display current version info (version, commit, date) - Add _get_remote_version_info() to check GitHub API for latest version - Move _get_version_info() and _format_version_info() to global scope - Support ccb -v, ccb --version, and ccb version subcommand 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- ccb | 174 ++++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 122 insertions(+), 52 deletions(-) diff --git a/ccb b/ccb index ab86f27..b2bde5d 100755 --- a/ccb +++ b/ccb @@ -1255,61 +1255,124 @@ def cmd_restore(args): return 0 -def cmd_update(args): - """Update ccb to latest version""" - import shutil +def _get_version_info(dir_path: Path) -> dict: + """Get commit hash, date and version from install directory""" + info = {"commit": None, "date": None, "version": None} + ccb_file = dir_path / "ccb" + if ccb_file.exists(): + try: + content = ccb_file.read_text(encoding='utf-8', errors='replace') + for line in content.split('\n')[:60]: + line = line.strip() + if line.startswith('VERSION') and '=' in line: + info["version"] = line.split('=')[1].strip().strip('"').strip("'") + elif line.startswith('GIT_COMMIT') and '=' in line: + val = line.split('=')[1].strip().strip('"').strip("'") + if val: + info["commit"] = val + elif line.startswith('GIT_DATE') and '=' in line: + val = line.split('=')[1].strip().strip('"').strip("'") + if val: + info["date"] = val + except Exception: + pass + if shutil.which("git") and (dir_path / ".git").exists(): + result = subprocess.run( + ["git", "-C", str(dir_path), "log", "-1", "--format=%h|%ci"], + capture_output=True, text=True, encoding='utf-8', errors='replace' + ) + if result.returncode == 0 and result.stdout.strip(): + parts = result.stdout.strip().split("|") + if len(parts) >= 2: + info["commit"] = parts[0] + info["date"] = parts[1].split()[0] + return info + + +def _format_version_info(info: dict) -> str: + """Format version info for display""" + parts = [] + if info.get("version"): + parts.append(f"v{info['version']}") + if info.get("commit"): + parts.append(info["commit"]) + if info.get("date"): + parts.append(info["date"]) + return " ".join(parts) if parts else "unknown" + + +def _get_remote_version_info() -> dict | None: + """Get latest version info from GitHub API""" import urllib.request - import tarfile - import tempfile + import ssl - def _get_version_info(dir_path: Path) -> dict: - """Get commit hash, date and version from install directory""" - info = {"commit": None, "date": None, "version": None} - # Get version, commit, date from ccb file (works without git) - ccb_file = dir_path / "ccb" - if ccb_file.exists(): + api_url = "https://api.github.com/repos/bfly123/claude_code_bridge/commits/main" + try: + ctx = ssl.create_default_context() + req = urllib.request.Request(api_url, headers={"User-Agent": "ccb"}) + with urllib.request.urlopen(req, context=ctx, timeout=5) as resp: + data = json.loads(resp.read().decode('utf-8')) + commit = data.get("sha", "")[:7] + date_str = data.get("commit", {}).get("committer", {}).get("date", "") + date = date_str[:10] if date_str else None + return {"commit": commit, "date": date} + except Exception: + pass + + if shutil.which("curl"): + result = subprocess.run( + ["curl", "-fsSL", api_url], + capture_output=True, text=True, encoding='utf-8', errors='replace', timeout=10 + ) + if result.returncode == 0: try: - content = ccb_file.read_text(encoding='utf-8', errors='replace') - for line in content.split('\n')[:60]: - line = line.strip() - if line.startswith('VERSION') and '=' in line: - # VERSION = "2.2" - info["version"] = line.split('=')[1].strip().strip('"').strip("'") - elif line.startswith('GIT_COMMIT') and '=' in line: - # GIT_COMMIT = "abc1234" - val = line.split('=')[1].strip().strip('"').strip("'") - if val: - info["commit"] = val - elif line.startswith('GIT_DATE') and '=' in line: - # GIT_DATE = "2025-12-21" - val = line.split('=')[1].strip().strip('"').strip("'") - if val: - info["date"] = val + data = json.loads(result.stdout) + commit = data.get("sha", "")[:7] + date_str = data.get("commit", {}).get("committer", {}).get("date", "") + date = date_str[:10] if date_str else None + return {"commit": commit, "date": date} except Exception: pass - # Override with live git info if available - if shutil.which("git") and (dir_path / ".git").exists(): - result = subprocess.run( - ["git", "-C", str(dir_path), "log", "-1", "--format=%h|%ci"], - capture_output=True, text=True, encoding='utf-8', errors='replace' - ) - if result.returncode == 0 and result.stdout.strip(): - parts = result.stdout.strip().split("|") - if len(parts) >= 2: - info["commit"] = parts[0] - info["date"] = parts[1].split()[0] # YYYY-MM-DD - return info - - def _format_version_info(info: dict) -> str: - """Format version info for display""" - parts = [] - if info.get("version"): - parts.append(f"v{info['version']}") - if info.get("commit"): - parts.append(info["commit"]) - if info.get("date"): - parts.append(info["date"]) - return " ".join(parts) if parts else "unknown" + return None + + +def cmd_version(args): + """Show version info and check for updates""" + script_root = Path(__file__).resolve().parent + default_install_dir = Path.home() / ".local/share/codex-dual" + install_dir = Path(os.environ.get("CODEX_INSTALL_PREFIX") or default_install_dir).expanduser() + if (script_root / "install.sh").exists(): + install_dir = script_root + + local_info = _get_version_info(install_dir) + local_str = _format_version_info(local_info) + + print(f"ccb (Claude Code Bridge) {local_str}") + print(f"Install path: {install_dir}") + + print("\nChecking for updates...") + remote_info = _get_remote_version_info() + + if remote_info is None: + print("⚠️ Unable to check for updates (network error)") + elif local_info.get("commit") and remote_info.get("commit"): + if local_info["commit"] == remote_info["commit"]: + print(f"✅ Up to date") + else: + remote_str = f"{remote_info['commit']} {remote_info.get('date', '')}" + print(f"📦 Update available: {remote_str}") + print(f" Run: ccb update") + else: + print("⚠️ Unable to compare versions") + + return 0 + + +def cmd_update(args): + """Update ccb to latest version""" + import urllib.request + import tarfile + import tempfile # Prefer the directory where this script resides (installed copy), then fall back to env/default. script_root = Path(__file__).resolve().parent @@ -1491,12 +1554,17 @@ def main(): restore_parser.add_argument("providers", nargs="*", default=[], help="Backends to restore (codex/gemini)") # update subcommand - update_parser = subparsers.add_parser("update", help="Update to latest version") + subparsers.add_parser("update", help="Update to latest version") + + # version subcommand + subparsers.add_parser("version", help="Show version and check for updates") argv = sys.argv[1:] - # Backward/shortcut compatibility: allow `ccb -r` to behave like `ccb up -r` (default provider). + # Backward/shortcut compatibility if argv and argv[0] in {"-r", "--resume", "--restore"}: argv = ["up"] + argv + elif argv and argv[0] in {"-v", "--version"}: + argv = ["version"] args = parser.parse_args(argv) if not args.command: @@ -1513,6 +1581,8 @@ def main(): return cmd_restore(args) elif args.command == "update": return cmd_update(args) + elif args.command == "version": + return cmd_version(args) else: parser.print_help() return 1 From e1eebcf2f3616c955ff2b7352a14c3d062af465f Mon Sep 17 00:00:00 2001 From: bfly Date: Mon, 22 Dec 2025 10:39:30 +0800 Subject: [PATCH 045/153] fix(install): Bash 3.2 heredoc compatibility for macOS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use temp file instead of $(cat << 'HEREDOC') pattern to avoid parsing bug with single quotes (e.g., "don't") on macOS Bash 3.2. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- install.sh | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/install.sh b/install.sh index 1672252..6859a78 100755 --- a/install.sh +++ b/install.sh @@ -661,8 +661,11 @@ install_claude_md_config() { local claude_md="$HOME/.claude/CLAUDE.md" mkdir -p "$HOME/.claude" - local ccb_content - ccb_content=$(cat << 'AI_RULES' + # Use temp file to avoid Bash 3.2 heredoc parsing bug with single quotes + local ccb_tmpfile + ccb_tmpfile="$(mktemp)" + trap 'rm -f "$ccb_tmpfile"' RETURN + cat > "$ccb_tmpfile" << 'AI_RULES' ## Codex Collaboration Rules Codex is another AI assistant running in a separate terminal session (WezTerm, iTerm2 or tmux). When user intent involves asking/consulting/collaborating with Codex: @@ -721,7 +724,8 @@ Examples: - "view gemini reply" -> gpend AI_RULES -) + local ccb_content + ccb_content="$(cat "$ccb_tmpfile")" if [[ -f "$claude_md" ]]; then if grep -q "$CCB_START_MARKER" "$claude_md" 2>/dev/null; then From bfcb1ad6e46bb150b5848efc42e471d24b9c64d4 Mon Sep 17 00:00:00 2001 From: bfly Date: Mon, 22 Dec 2025 11:04:34 +0800 Subject: [PATCH 046/153] docs: add AGPL-3.0 license with bilingual explanation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add LICENSE file with both English and Chinese explanations of AGPL-3.0 terms and requirements. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- LICENSE | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f09f9ff --- /dev/null +++ b/LICENSE @@ -0,0 +1,48 @@ +# AGPL-3.0 - GNU Affero General Public License v3.0 + +## English + +This software is licensed under the AGPL-3.0 license, which means: + +- **Attribution Required**: You must give appropriate credit, provide a link to the license, and indicate if changes were made. When using Claude Code Bridge (CCB), please credit the original project. + +- **Open Source Required**: If you modify this software and distribute it or run it as a service, you must release your source code under AGPL-3.0. + +- **Network Use (Copyleft)**: If you run this software as a network service (e.g., SaaS), users interacting with it over the network must be able to receive the source code. + +- **No Closed-Source Use**: You cannot use this software in proprietary/closed-source projects unless you open-source the entire project under AGPL-3.0. + +**In short**: You can use Claude Code Bridge for free, but if you build upon it, your code must also be open-sourced under AGPL-3.0 with attribution to this project. Closed-source commercial use requires a separate license. + +For commercial licensing inquiries (closed-source use), please contact the maintainer. + +--- + +## 中文 + +本软件采用 AGPL-3.0 许可协议,这意味着: + +- **署名要求**:您必须注明出处,提供许可协议链接,并说明是否进行了修改。使用 Claude Code Bridge (CCB) 时,请注明项目来源。 + +- **开源要求**:如果您修改此软件并将其分发或作为服务运行,则必须根据 AGPL-3.0 发布您的源代码。 + +- **网络使用(Copyleft)**:如果您将此软件作为网络服务(例如 SaaS)运行,则通过网络与其交互的用户必须能够接收源代码。 + +- **禁止闭源使用**:您不能在专有/闭源项目中使用此软件,除非您将整个项目根据 AGPL-3.0 开源。 + +**简单来说**:您可以免费使用 Claude Code Bridge,但如果您基于它进行开发,您的代码也必须根据 AGPL-3.0 开源,并注明本项目。闭源商业用途需要单独的许可证。 + +对于商业许可咨询(闭源使用),请联系维护者。 + +--- + +## Full License Text + +GNU AFFERO GENERAL PUBLIC LICENSE +Version 3, 19 November 2007 + +Copyright (C) 2007 Free Software Foundation, Inc. + +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + +For the complete license text, see: https://www.gnu.org/licenses/agpl-3.0.txt From d213e10b31552c1754e5fc71d7f165cae61c5765 Mon Sep 17 00:00:00 2001 From: bfly Date: Mon, 22 Dec 2025 12:53:14 +0800 Subject: [PATCH 047/153] fix(install): handle mktemp failure with set -u MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Initialize ccb_tmpfile with empty string - Add error handling for mktemp failure - Use ${ccb_tmpfile:-} in trap to avoid unbound variable error 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- install.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/install.sh b/install.sh index 6859a78..44f6477 100755 --- a/install.sh +++ b/install.sh @@ -662,9 +662,9 @@ install_claude_md_config() { mkdir -p "$HOME/.claude" # Use temp file to avoid Bash 3.2 heredoc parsing bug with single quotes - local ccb_tmpfile - ccb_tmpfile="$(mktemp)" - trap 'rm -f "$ccb_tmpfile"' RETURN + local ccb_tmpfile="" + ccb_tmpfile="$(mktemp)" || { echo "Failed to create temp file"; return 1; } + trap 'rm -f "${ccb_tmpfile:-}"' RETURN cat > "$ccb_tmpfile" << 'AI_RULES' ## Codex Collaboration Rules From bc752f137fdca93c81173dc202da19ea7665d32f Mon Sep 17 00:00:00 2001 From: bfly Date: Mon, 22 Dec 2025 18:20:02 +0800 Subject: [PATCH 048/153] refactor(ccb): use claude --continue instead of --resume MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Simplify Claude resume logic by using --continue flag instead of managing session IDs with --resume . 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- ccb | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/ccb b/ccb index b2bde5d..763cf84 100755 --- a/ccb +++ b/ccb @@ -927,22 +927,9 @@ exec tmux attach -t "$TMUX_SESSION" cmd = [claude_cmd] if self.auto: cmd.append("--dangerously-skip-permissions") - local_session_id: str | None = None if self.resume: - local_session_id = self._read_local_claude_session_id() - # Only resume if Claude can actually find the session on disk. - if local_session_id and (Path.home() / ".claude" / "session-env" / local_session_id).exists(): - cmd.extend(["--resume", local_session_id]) - print(f"🔁 {t('resuming_claude', session_id=local_session_id[:8])}") - else: - local_session_id = None - print(f"ℹ️ {t('no_claude_session')}") - - # Always start Claude with an explicit session id when not resuming, so the id is local and resettable. - if not local_session_id: - new_id = str(uuid.uuid4()) - cmd.extend(["--session-id", new_id]) - self._write_local_claude_session(new_id, active=True) + cmd.append("--continue") + print(f"🔁 {t('resuming_claude', session_id='')}") print(f"📋 Session ID: {self.session_id}") print(f"📁 Runtime dir: {self.runtime_dir}") From 9ba7cc4777d811e0fcf6741771056c1eaaff551a Mon Sep 17 00:00:00 2001 From: bfly Date: Mon, 22 Dec 2025 21:28:32 +0800 Subject: [PATCH 049/153] fix(ccb): check history before using claude --continue MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add history check to prevent "No conversation found to continue" error when no previous session exists for current directory. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- ccb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ccb b/ccb index 763cf84..33fbaba 100755 --- a/ccb +++ b/ccb @@ -928,8 +928,12 @@ exec tmux attach -t "$TMUX_SESSION" if self.auto: cmd.append("--dangerously-skip-permissions") if self.resume: - cmd.append("--continue") - print(f"🔁 {t('resuming_claude', session_id='')}") + _, has_history = self._get_latest_claude_session_id() + if has_history: + cmd.append("--continue") + print(f"🔁 {t('resuming_claude', session_id='')}") + else: + print(f"ℹ️ {t('no_claude_session')}") print(f"📋 Session ID: {self.session_id}") print(f"📁 Runtime dir: {self.runtime_dir}") From 5dbf7330951dfa99f07e3b72272321e16d7d1f5c Mon Sep 17 00:00:00 2001 From: bfly Date: Mon, 22 Dec 2025 22:14:56 +0800 Subject: [PATCH 050/153] fix(ccb): always scan session logs for latest Codex session MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove local cache priority in _get_latest_codex_session_id(). Always scan ~/.codex/sessions/ to find the latest session matching current cwd, then update local .codex-session file. This fixes stale session ID issue when user does /clear during run. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- ccb | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/ccb b/ccb index 33fbaba..2d74c17 100755 --- a/ccb +++ b/ccb @@ -454,22 +454,13 @@ class AILauncher: """ Returns (session_id, has_any_history_for_cwd). Session id is Codex CLI's UUID used by `codex resume `. + Always scans session logs to find the latest session for current cwd, + then updates local .codex-session file. """ - # Only trust local project state; deleting local dotfiles should reset resume behavior. project_session = Path.cwd() / ".codex-session" - if project_session.exists(): - data = self._read_json_file(project_session) - cached = data.get("codex_session_id") - if isinstance(cached, str) and cached: - recorded_norm = _extract_session_work_dir_norm(data) - if recorded_norm: - work_keys = _work_dir_match_keys(Path.cwd()) - if not work_keys or recorded_norm in work_keys: - return cached, True - - # Fallback: scan Codex session logs for the latest session bound to this cwd. - # This handles cases where `.codex-session` exists but never got updated with `codex_session_id` - # (e.g., user closed the backend before sending any message through the bridge). + + # Always scan Codex session logs for the latest session bound to this cwd. + # This ensures we get the latest session even if user did /clear during run. root = Path(os.environ.get("CODEX_SESSION_ROOT") or (Path.home() / ".codex" / "sessions")).expanduser() if not root.exists(): return None, False @@ -506,6 +497,16 @@ class AILauncher: continue sid = payload.get("id") if isinstance(sid, str) and sid: + # Update local .codex-session file with latest session id + data = self._read_json_file(project_session) if project_session.exists() else {} + work_dir = Path.cwd() + data.update({ + "codex_session_id": sid, + "work_dir": str(work_dir), + "work_dir_norm": _normalize_path_for_match(str(work_dir)), + "updated_at": time.strftime("%Y-%m-%d %H:%M:%S"), + }) + self._write_json_file(project_session, data) return sid, True return None, False From deae299d25ebb32f861733eee844d40694101584 Mon Sep 17 00:00:00 2001 From: bfly Date: Tue, 23 Dec 2025 11:14:33 +0800 Subject: [PATCH 051/153] fix(windows): fix Enter key and update command issues MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - terminal.py: use stdin for Enter key on Windows (CLI args stripped) - ccb: add filter arg for tar.extractall (Python 3.14 deprecation) - ccb: use install.ps1 on Windows instead of install.sh 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- ccb | 16 ++++++++++++++-- lib/terminal.py | 9 +++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/ccb b/ccb index 2d74c17..5584ad9 100755 --- a/ccb +++ b/ccb @@ -1491,7 +1491,11 @@ def cmd_update(args): member_path = (dest / member.name).resolve() if not str(member_path).startswith(str(dest) + os.sep): raise RuntimeError(f"Unsafe tar member path: {member.name}") - tar.extractall(dest) + # Python 3.14+ requires filter argument + try: + tar.extractall(dest, filter='data') + except TypeError: + tar.extractall(dest) with tarfile.open(tarball_path, "r:gz") as tar: _safe_extract(tar, tmp_dir) @@ -1501,7 +1505,15 @@ def cmd_update(args): print("🔧 Installing...") env = os.environ.copy() env["CODEX_INSTALL_PREFIX"] = str(install_dir) - subprocess.run([str(extracted_dir / "install.sh"), "install"], check=True, env=env) + # Windows: use install.ps1, Unix: use install.sh + if platform.system() == "Windows": + ps1_script = extracted_dir / "install.ps1" + subprocess.run( + ["powershell", "-ExecutionPolicy", "Bypass", "-File", str(ps1_script), "install"], + check=True, env=env + ) + else: + subprocess.run([str(extracted_dir / "install.sh"), "install"], check=True, env=env) # Show upgrade info new_info = _get_version_info(install_dir) diff --git a/lib/terminal.py b/lib/terminal.py index 81c2aba..3ea7814 100644 --- a/lib/terminal.py +++ b/lib/terminal.py @@ -296,6 +296,15 @@ def send_text(self, pane_id: str, text: str) -> None: enter_delay = _env_float("CCB_WEZTERM_ENTER_DELAY", 0.01) if enter_delay: time.sleep(enter_delay) + # Windows: \r \n \r\n as CLI args may be stripped by shell, use stdin directly + if is_windows(): + subprocess.run( + [*self._cli_base_args(), "send-text", "--pane-id", pane_id, "--no-paste"], + input=b"\r", + check=False, + ) + return + # Unix/macOS: try \r, \n, \r\n first for char in ["\r", "\n", "\r\n"]: try: subprocess.run( From 5f999367341df25f803894a67056847b6316995f Mon Sep 17 00:00:00 2001 From: bfly Date: Tue, 23 Dec 2025 16:25:23 +0800 Subject: [PATCH 052/153] fix(wezterm): support multiline text with dual-path strategy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add _send_enter helper for reliable Enter key via stdin - Fast path: short single-line (<200 chars) uses --no-paste - Slow path: multiline/long text uses paste mode + 100ms delay - Add CCB_WEZTERM_PASTE_DELAY env var (default 0.1s) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- lib/terminal.py | 59 +++++++++++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/lib/terminal.py b/lib/terminal.py index 3ea7814..685ee8b 100644 --- a/lib/terminal.py +++ b/lib/terminal.py @@ -285,41 +285,48 @@ def _bin(cls) -> str: cls._wezterm_bin = found or "wezterm" return cls._wezterm_bin - def send_text(self, pane_id: str, text: str) -> None: - sanitized = text.replace("\r", "").replace("\n", "").strip() - if not sanitized: - return - subprocess.run( - [*self._cli_base_args(), "send-text", "--pane-id", pane_id, "--no-paste", sanitized], - check=True, - ) + def _send_enter(self, pane_id: str) -> None: + """Send Enter key reliably using stdin (cross-platform)""" enter_delay = _env_float("CCB_WEZTERM_ENTER_DELAY", 0.01) if enter_delay: time.sleep(enter_delay) - # Windows: \r \n \r\n as CLI args may be stripped by shell, use stdin directly - if is_windows(): - subprocess.run( - [*self._cli_base_args(), "send-text", "--pane-id", pane_id, "--no-paste"], - input=b"\r", - check=False, - ) - return - # Unix/macOS: try \r, \n, \r\n first - for char in ["\r", "\n", "\r\n"]: - try: - subprocess.run( - [*self._cli_base_args(), "send-text", "--pane-id", pane_id, "--no-paste", char], - check=True, - ) - return - except subprocess.CalledProcessError: - continue subprocess.run( [*self._cli_base_args(), "send-text", "--pane-id", pane_id, "--no-paste"], input=b"\r", check=False, ) + def send_text(self, pane_id: str, text: str) -> None: + sanitized = text.replace("\r", "").strip() + if not sanitized: + return + + has_newlines = "\n" in sanitized + is_long = len(sanitized) > 200 + + # Fast path: short single-line text -> use --no-paste directly + if not has_newlines and not is_long: + subprocess.run( + [*self._cli_base_args(), "send-text", "--pane-id", pane_id, "--no-paste", sanitized], + check=True, + ) + self._send_enter(pane_id) + return + + # Slow path: multiline or long text -> use paste mode (bracketed paste) + subprocess.run( + [*self._cli_base_args(), "send-text", "--pane-id", pane_id], + input=sanitized.encode("utf-8"), + check=True, + ) + + # Wait for TUI to process bracketed paste content + paste_delay = _env_float("CCB_WEZTERM_PASTE_DELAY", 0.1) + if paste_delay: + time.sleep(paste_delay) + + self._send_enter(pane_id) + def is_alive(self, pane_id: str) -> bool: try: result = subprocess.run([*self._cli_base_args(), "list", "--format", "json"], capture_output=True, text=True) From f3b6caa6d9e412331978ada6ce8f3adf16e84038 Mon Sep 17 00:00:00 2001 From: bfly Date: Tue, 23 Dec 2025 20:56:52 +0800 Subject: [PATCH 053/153] feat(cpend/gpend): add N parameter to fetch recent conversations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - cpend N / gpend N fetches last N Q&A pairs - Output format: Q: question / A: reply / --- - Fix subprocess.run encoding for Windows (GBK issue) - Update command docs with trigger conditions 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- CLAUDE.md | 7 +++- commands/cpend.md | 21 +++++++++- commands/gpend.md | 29 ++++++++++--- lib/codex_comm.py | 102 ++++++++++++++++++++++++++++++++++++++++++--- lib/gemini_comm.py | 58 +++++++++++++++++++++++--- lib/terminal.py | 8 ++-- 6 files changed, 203 insertions(+), 22 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 71c1623..2f9ee5d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1 +1,6 @@ -- This is the claude_code_bridge (ccb) development folder. Pay attention to compatibility. When modifying code, also update install scripts. Use install.sh/install.ps1 to install. After completion, git commit and push. \ No newline at end of file +- This is the claude_code_bridge (ccb) development folder. Pay attention to compatibility. When modifying code, also update install scripts. Use install.sh/install.ps1 to install. After completion, git commit and push. + +- Cross-platform compatibility notes: + - subprocess.run with text=True MUST include encoding="utf-8", errors="replace" (Windows defaults to GBK) + - Avoid #!/usr/bin/env python3 shebang on Windows (triggers App Store stub, exit 49). Use python or sys.executable + - Always test on both Linux and Windows when modifying install scripts or terminal-related code \ No newline at end of file diff --git a/commands/cpend.md b/commands/cpend.md index a514e16..e07e28a 100644 --- a/commands/cpend.md +++ b/commands/cpend.md @@ -1,18 +1,35 @@ Use `cpend` to fetch latest reply from Codex official logs, suitable for async mode or follow-up queries after timeout. +Trigger conditions (any match): +- User mentions cpend/Cpend +- User wants to view/fetch/get Codex reply/response +- User asks for recent N Codex conversations/replies (e.g. "调取最近5条codex回复", "show last 3 codex messages") + Execution: -- Use `Bash(cpend)` on Claude side, keep command execution silent -- Run `cpend` directly in local terminal +- `cpend` - fetch latest single reply: `Bash(cpend)` +- `cpend N` - fetch last N conversations (Q&A pairs): `Bash(cpend N)` (e.g. `cpend 5`) +- Keep command execution silent, no additional analysis after execution + +Output format (when N > 1): +``` +Q: user question 1 +A: codex reply 1 +--- +Q: user question 2 +A: codex reply 2 +``` Features: 1. Parses log path recorded in `.codex-session`, locates latest JSONL file for current session 2. Reads tail messages and returns Codex's most recent output 3. If no new content, will prompt "No Codex reply yet" +4. Supports fetching last N conversations with Q&A pairs Common scenarios: - View results after submitting multiple tasks via `cask` async - Manually confirm if Codex has responded after `cask-w` timeout exit - Need to verify if Codex reply matches original question +- Review recent conversation history with Codex Hints: - Log file usually located at `~/.codex/sessions/.../rollout-.jsonl` diff --git a/commands/gpend.md b/commands/gpend.md index 389c268..0058a35 100644 --- a/commands/gpend.md +++ b/commands/gpend.md @@ -1,9 +1,28 @@ -View latest Gemini reply via `gpend` command. +Use `gpend` to fetch latest reply from Gemini session, suitable for async mode or follow-up queries after timeout. + +Trigger conditions (any match): +- User mentions gpend/Gpend +- User wants to view/fetch/get Gemini reply/response +- User asks for recent N Gemini conversations/replies (e.g. "调取最近5条gemini回复", "show last 3 gemini messages") Execution: -- Run silently `Bash(gpend)`, no additional analysis or operations after execution -- Can also run `gpend` in terminal with same effect +- `gpend` - fetch latest single reply: `Bash(gpend)` +- `gpend N` - fetch last N conversations (Q&A pairs): `Bash(gpend N)` (e.g. `gpend 5`) +- Keep command execution silent, no additional analysis after execution + +Output format (when N > 1): +``` +Q: user question 1 +A: gemini reply 1 +--- +Q: user question 2 +A: gemini reply 2 +``` + +Common scenarios: +- View reply after gask async send +- Continue getting reply after gask-w timeout +- Review recent conversation history with Gemini Hints: -- Used to view reply after gask async send -- Or continue getting reply after gask-w timeout +- If command returns empty, first confirm Gemini session is still running (use `/gping` to check) diff --git a/lib/codex_comm.py b/lib/codex_comm.py index 2f6063f..1428fa2 100644 --- a/lib/codex_comm.py +++ b/lib/codex_comm.py @@ -14,7 +14,7 @@ import shlex from datetime import datetime from pathlib import Path -from typing import Optional, Tuple, Dict, Any +from typing import Optional, Tuple, Dict, Any, List from terminal import get_backend_for_session, get_pane_id_from_session from ccb_config import apply_backend_env @@ -273,6 +273,81 @@ def _extract_message(entry: dict) -> Optional[str]: return message.strip() return None + @staticmethod + def _extract_user_message(entry: dict) -> Optional[str]: + """Extract user question from a JSONL entry""" + entry_type = entry.get("type") + payload = entry.get("payload", {}) + + if entry_type == "event_msg" and payload.get("type") == "user_message": + msg = payload.get("message", "") + if isinstance(msg, str) and msg.strip(): + return msg.strip() + + if entry_type == "response_item": + if payload.get("type") == "message" and payload.get("role") == "user": + content = payload.get("content") or [] + texts = [item.get("text", "") for item in content if item.get("type") == "input_text"] + if texts: + return "\n".join(filter(None, texts)).strip() + return None + + def latest_conversations(self, n: int = 1) -> List[Tuple[str, str]]: + """Get the latest n conversations (question, reply) pairs""" + log_path = self._latest_log() + if not log_path or not log_path.exists(): + return [] + + try: + with log_path.open("rb") as handle: + handle.seek(0, os.SEEK_END) + buffer = bytearray() + position = handle.tell() + while position > 0 and len(buffer) < 1024 * 1024: + read_size = min(8192, position) + position -= read_size + handle.seek(position) + buffer = handle.read(read_size) + buffer + if buffer.count(b"\n") >= n * 20: + break + lines = buffer.decode("utf-8", errors="ignore").splitlines() + except OSError: + return [] + + questions: List[str] = [] + replies: List[str] = [] + + for line in lines: + line = line.strip() + if not line: + continue + try: + entry = json.loads(line) + except json.JSONDecodeError: + continue + + user_msg = self._extract_user_message(entry) + if user_msg: + questions.append(user_msg) + + ai_msg = self._extract_message(entry) + if ai_msg: + replies.append(ai_msg) + + conversations: List[Tuple[str, str]] = [] + q_idx = len(questions) - 1 + r_idx = len(replies) - 1 + + while len(conversations) < n and r_idx >= 0: + reply = replies[r_idx] + question = questions[q_idx] if q_idx >= 0 else "" + conversations.append((question, reply)) + q_idx -= 1 + r_idx -= 1 + + conversations.reverse() + return conversations[-n:] if len(conversations) > n else conversations + class CodexCommunicator: """Communicates with Codex bridge via FIFO and reads replies from logs""" @@ -512,9 +587,25 @@ def ask_sync(self, question: str, timeout: Optional[int] = None) -> Optional[str print(f"❌ Sync ask failed: {exc}") return None - def consume_pending(self, display: bool = True): + def consume_pending(self, display: bool = True, n: int = 1): current_path = self.log_reader.current_log_path() self._remember_codex_session(current_path) + + if n > 1: + conversations = self.log_reader.latest_conversations(n) + if not conversations: + if display: + print(t('no_reply_available', provider='Codex')) + return None + if display: + for i, (question, reply) in enumerate(conversations): + if question: + print(f"Q: {question}") + print(f"A: {reply}") + if i < len(conversations) - 1: + print("---") + return conversations + message = self.log_reader.latest_message() if message: self._remember_codex_session(self.log_reader.current_log_path()) @@ -667,7 +758,8 @@ def main() -> int: parser.add_argument("--timeout", type=int, default=30, help="Sync timeout in seconds") parser.add_argument("--ping", action="store_true", help="Test connectivity") parser.add_argument("--status", action="store_true", help="Show status") - parser.add_argument("--pending", action="store_true", help="Show pending reply") + parser.add_argument("--pending", nargs="?", const=1, type=int, metavar="N", + help="Show pending reply (optionally last N conversations)") args = parser.parse_args() @@ -681,8 +773,8 @@ def main() -> int: print("📊 Codex status:") for key, value in status.items(): print(f" {key}: {value}") - elif args.pending: - comm.consume_pending() + elif args.pending is not None: + comm.consume_pending(n=args.pending) elif args.question: tokens = list(args.question) if tokens and tokens[0].lower() == "ask": diff --git a/lib/gemini_comm.py b/lib/gemini_comm.py index cad5c48..f9f8c09 100755 --- a/lib/gemini_comm.py +++ b/lib/gemini_comm.py @@ -11,7 +11,7 @@ import os import time from pathlib import Path -from typing import Optional, Tuple, Dict, Any +from typing import Optional, Tuple, Dict, Any, List from terminal import get_backend_for_session, get_pane_id_from_session from ccb_config import apply_backend_env @@ -207,6 +207,37 @@ def latest_message(self) -> Optional[str]: pass return None + def latest_conversations(self, n: int = 1) -> List[Tuple[str, str]]: + """Get the latest n conversations (question, reply) pairs""" + session = self._latest_session() + if not session or not session.exists(): + return [] + try: + with session.open("r", encoding="utf-8") as f: + data = json.load(f) + messages = data.get("messages", []) + except (OSError, json.JSONDecodeError): + return [] + + conversations: List[Tuple[str, str]] = [] + pending_question: Optional[str] = None + + for msg in messages: + msg_type = msg.get("type") + content = msg.get("content", "") + if not isinstance(content, str): + content = str(content) + content = content.strip() + + if msg_type == "user": + pending_question = content + elif msg_type == "gemini" and content: + question = pending_question or "" + conversations.append((question, content)) + pending_question = None + + return conversations[-n:] if len(conversations) > n else conversations + def _read_since(self, state: Dict[str, Any], timeout: float, block: bool) -> Tuple[Optional[str], Dict[str, Any]]: deadline = time.time() + timeout prev_count = state.get("msg_count", 0) @@ -631,10 +662,26 @@ def ask_sync(self, question: str, timeout: Optional[int] = None) -> Optional[str print(f"❌ Sync ask failed: {exc}") return None - def consume_pending(self, display: bool = True): + def consume_pending(self, display: bool = True, n: int = 1): session_path = self.log_reader.current_session_path() if isinstance(session_path, Path): self._remember_gemini_session(session_path) + + if n > 1: + conversations = self.log_reader.latest_conversations(n) + if not conversations: + if display: + print(t('no_reply_available', provider='Gemini')) + return None + if display: + for i, (question, reply) in enumerate(conversations): + if question: + print(f"Q: {question}") + print(f"A: {reply}") + if i < len(conversations) - 1: + print("---") + return conversations + message = self.log_reader.latest_message() if not message: if display: @@ -734,7 +781,8 @@ def main() -> int: parser.add_argument("--timeout", type=int, default=60, help="Sync timeout in seconds") parser.add_argument("--ping", action="store_true", help="Test connectivity") parser.add_argument("--status", action="store_true", help="View status") - parser.add_argument("--pending", action="store_true", help="View pending reply") + parser.add_argument("--pending", nargs="?", const=1, type=int, metavar="N", + help="View pending reply (optionally last N conversations)") args = parser.parse_args() @@ -748,8 +796,8 @@ def main() -> int: print("📊 Gemini status:") for key, value in status.items(): print(f" {key}: {value}") - elif args.pending: - comm.consume_pending() + elif args.pending is not None: + comm.consume_pending(n=args.pending) elif args.question: question_text = " ".join(args.question).strip() if not question_text: diff --git a/lib/terminal.py b/lib/terminal.py index 685ee8b..79107b5 100644 --- a/lib/terminal.py +++ b/lib/terminal.py @@ -234,7 +234,7 @@ def create_pane(self, cmd: str, cwd: str, direction: str = "right", percent: int if parent_pane: args.extend(["--session", parent_pane]) - result = subprocess.run(args, capture_output=True, text=True, check=True) + result = subprocess.run(args, capture_output=True, text=True, check=True, encoding="utf-8", errors="replace") # it2 output format: "Created new pane: " output = result.stdout.strip() if ":" in output: @@ -329,7 +329,7 @@ def send_text(self, pane_id: str, text: str) -> None: def is_alive(self, pane_id: str) -> bool: try: - result = subprocess.run([*self._cli_base_args(), "list", "--format", "json"], capture_output=True, text=True) + result = subprocess.run([*self._cli_base_args(), "list", "--format", "json"], capture_output=True, text=True, encoding="utf-8", errors="replace") if result.returncode != 0: return False panes = json.loads(result.stdout) @@ -356,7 +356,7 @@ def create_pane(self, cmd: str, cwd: str, direction: str = "right", percent: int elif "\\" in cwd or (len(cwd) > 2 and cwd[1] == ":"): try: wslpath_cmd = ["wslpath", "-a", cwd] if is_wsl() else ["wsl.exe", "wslpath", "-a", cwd] - result = subprocess.run(wslpath_cmd, capture_output=True, text=True, check=True) + result = subprocess.run(wslpath_cmd, capture_output=True, text=True, check=True, encoding="utf-8", errors="replace") wsl_cwd = result.stdout.strip() except Exception: pass @@ -384,7 +384,7 @@ def create_pane(self, cmd: str, cwd: str, direction: str = "right", percent: int shell, flag = _default_shell() args.extend(["--", shell, flag, cmd]) try: - result = subprocess.run(args, capture_output=True, text=True, check=True) + result = subprocess.run(args, capture_output=True, text=True, check=True, encoding="utf-8", errors="replace") return result.stdout.strip() except subprocess.CalledProcessError as e: raise RuntimeError(f"WezTerm split-pane failed:\nCommand: {' '.join(args)}\nStderr: {e.stderr}") from e From 9e44c7e133205fa1d217283fe447ad6ea6ed7a02 Mon Sep 17 00:00:00 2001 From: bfly Date: Tue, 23 Dec 2025 23:49:24 +0800 Subject: [PATCH 054/153] refactor(cask): simplify command semantics and decouple cpend MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - cask: sync wait mode (for run_in_background=true), END turn after submit - cask-w: foreground blocking wait - cpend: pure log reader, must use .codex-session path - Fix cpend Q&A pairing logic (pending_question mode) - Fix cpend to read entire file for conversations - Add lib/cli_output.py for atomic write and exit codes - Remove pending_state and cache file logic - Update prompts: "END your turn" after background task - Update docs and install scripts 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- README.md | 84 ++++++++++++++++++++++------ bin/cask | 123 ++++++++++++++++++++++++----------------- bin/cask-w | 113 ++++++++++++++++++++------------------ bin/cpend | 133 +++++++++++++++++++-------------------------- bin/gask | 83 ++++++++++++++++++++++++---- bin/gask-w | 132 +++++++++++++++++++++----------------------- bin/gpend | 72 +++++++++++++----------- commands/cask-w.md | 27 ++++----- commands/cask.md | 28 +++++----- commands/cpend.md | 13 ++--- commands/gask-w.md | 27 ++++----- commands/gask.md | 28 +++++----- commands/gpend.md | 13 +++-- install.ps1 | 24 ++++---- install.sh | 38 ++++++------- lib/cli_output.py | 42 ++++++++++++++ lib/codex_comm.py | 45 ++++++--------- 17 files changed, 586 insertions(+), 439 deletions(-) create mode 100644 lib/cli_output.py diff --git a/README.md b/README.md index 139ba4d..618e3e1 100644 --- a/README.md +++ b/README.md @@ -161,24 +161,49 @@ ccb update # Update to latest version > Most users don't need these—Claude auto-detects collaboration intent. -**Codex:** +### Codex Commands | Command | Description | |---------|-------------| -| `cask-w ` | Sync: wait for reply | -| `cask ` | Async: fire-and-forget | -| `cpend` | Show latest reply | +| `cask ` | Sync wait (background-friendly) | +| `cask-w ` | Sync wait (foreground blocking) | +| `cpend [N]` | Show latest N replies from official logs | | `cping` | Connectivity check | -**Gemini:** +**cask** - Background-friendly sync wait (designed for `run_in_background=true`) +```bash +# Claude Code usage: +Bash(cask "review this code", run_in_background=true) +# Wait for bash-notification, then read task output + +# Terminal usage: +cask "what is the bug?" --timeout 60 +cask "analyze" --output /tmp/reply.txt +``` + +**cask-w** - Foreground blocking wait (for terminal/human use) +```bash +cask-w "explain this function" +# Blocks until reply, prints to stdout +``` + +**cpend** - Pure log reader (decoupled from cask) +```bash +cpend # Latest reply +cpend 3 # Latest 3 Q&A pairs +``` + +### Gemini Commands | Command | Description | |---------|-------------| -| `gask-w ` | Sync: wait for reply | -| `gask ` | Async: fire-and-forget | -| `gpend` | Show latest reply | +| `gask ` | Sync wait (background-friendly) | +| `gask-w ` | Sync wait (foreground blocking) | +| `gpend [N]` | Show latest N replies from official logs | | `gping` | Connectivity check | +Usage is identical to Codex commands above. + ## Requirements - Python 3.10+ @@ -287,7 +312,7 @@ cd claude_code_bridge ### BackendEnv(Windows/WSL 必看) -`ccb/cask-w` 必须和 `codex/gemini` 在同一环境运行,否则可能出现: +`ccb/cask` / `ccb/gask` 必须和 `codex/gemini` 在同一环境运行,否则可能出现: - `exit code 127`(找不到命令) - `cpend/gpend` 读不到回复(会话目录不同) @@ -351,24 +376,49 @@ ccb update # 更新到最新版本 > 普通用户无需使用这些命令——Claude 会自动检测协作意图。 -**Codex:** +### Codex 命令 | 命令 | 说明 | |------|------| -| `cask-w <消息>` | 同步:等待回复 | -| `cask <消息>` | 异步:发送即返回 | -| `cpend` | 查看最新回复 | +| `cask <消息>` | 同步等待(适合后台任务) | +| `cask-w <消息>` | 同步等待(前台阻塞) | +| `cpend [N]` | 从官方日志读取最近 N 条回复 | | `cping` | 测试连通性 | -**Gemini:** +**cask** - 后台友好的同步等待(配合 `run_in_background=true` 使用) +```bash +# Claude Code 中使用: +Bash(cask "review this code", run_in_background=true) +# 等待 bash-notification,然后读取 task output + +# 终端中使用: +cask "这个bug是什么?" --timeout 60 +cask "分析代码" --output /tmp/reply.txt +``` + +**cask-w** - 前台阻塞等待(适合终端/人工使用) +```bash +cask-w "解释这个函数" +# 阻塞直到收到回复,输出到 stdout +``` + +**cpend** - 纯日志读取器(与 cask 完全解耦) +```bash +cpend # 最新一条回复 +cpend 3 # 最近 3 组问答 +``` + +### Gemini 命令 | 命令 | 说明 | |------|------| -| `gask-w <消息>` | 同步:等待回复 | -| `gask <消息>` | 异步:发送即返回 | -| `gpend` | 查看最新回复 | +| `gask <消息>` | 同步等待(适合后台任务) | +| `gask-w <消息>` | 同步等待(前台阻塞) | +| `gpend [N]` | 从官方日志读取最近 N 条回复 | | `gping` | 测试连通性 | +用法与 Codex 命令相同。 + ## 依赖 - Python 3.10+ diff --git a/bin/cask b/bin/cask index 11c2da2..09cd948 100755 --- a/bin/cask +++ b/bin/cask @@ -1,9 +1,11 @@ #!/usr/bin/env python3 """ -cask - Forward message to Codex session +cask - Send message to Codex and wait for reply (sync). + +Designed to be used with Claude Code's run_in_background=true. +If --output is provided, the reply is written atomically to that file and stdout stays empty. """ from __future__ import annotations -import json import os import sys from pathlib import Path @@ -15,44 +17,47 @@ sys.path.insert(0, str(lib_dir)) from compat import setup_windows_encoding setup_windows_encoding() -from terminal import get_backend_for_session, get_pane_id_from_session +def _usage() -> None: + print("Usage: cask [--timeout SECONDS] [--output FILE] ", file=sys.stderr) -def _usage() -> None: - print("Usage: cask ", file=sys.stderr) - - -def _load_session() -> Optional[dict]: - env_session = os.environ.get("CODEX_TMUX_SESSION") - env_pane = os.environ.get("CODEX_WEZTERM_PANE") - if env_session or env_pane: - return { - "terminal": "wezterm" if env_pane else "tmux", - "pane_id": env_pane, - "tmux_session": env_session, - "runtime_dir": os.environ.get("CODEX_RUNTIME_DIR"), - } - - session_file = Path.cwd() / ".codex-session" - if not session_file.exists(): - return None - try: - data = json.loads(session_file.read_text(encoding="utf-8")) - if not data.get("active"): - return None - return data - except Exception: - return None +def _parse_args(argv: list[str]) -> Tuple[Optional[Path], float, str, bool]: + output: Optional[Path] = None + timeout: Optional[float] = None + quiet = False + parts: list[str] = [] + it = iter(argv[1:]) + for token in it: + if token in ("-h", "--help"): + _usage() + raise SystemExit(0) + if token in ("-q", "--quiet"): + quiet = True + continue + if token in ("-o", "--output"): + try: + output = Path(next(it)).expanduser() + except StopIteration: + raise ValueError("--output requires a file path") + continue + if token in ("-t", "--timeout"): + try: + timeout = float(next(it)) + except StopIteration: + raise ValueError("--timeout requires a number") + except ValueError as exc: + raise ValueError(f"Invalid --timeout: {exc}") + continue + parts.append(token) -def _resolve_session() -> Tuple[dict, str]: - data = _load_session() - if not data: - raise RuntimeError("❌ Codex session not found, please run ccb up codex first") - pane_id = get_pane_id_from_session(data) - if not pane_id: - raise RuntimeError("❌ Session config invalid") - return data, pane_id + message = " ".join(parts).strip() + if timeout is None: + try: + timeout = float(os.environ.get("CCB_SYNC_TIMEOUT", "3600.0")) + except Exception: + timeout = 3600.0 + return output, timeout, message, quiet def main(argv: list[str]) -> int: @@ -60,22 +65,38 @@ def main(argv: list[str]) -> int: _usage() return 1 - raw_command = " ".join(argv[1:]).strip() - if not raw_command: - _usage() - return 1 - try: - data, pane_id = _resolve_session() - backend = get_backend_for_session(data) - if not backend: - raise RuntimeError("❌ Cannot initialize terminal backend") - if not backend.is_alive(pane_id): - terminal = data.get("terminal", "tmux") - raise RuntimeError(f"❌ {terminal} session not found: {pane_id}\nHint: Please confirm ccb is running") - backend.send_text(pane_id, raw_command) - print(f"✅ Sent to Codex ({pane_id})") - return 0 + from cli_output import EXIT_ERROR, EXIT_NO_REPLY, EXIT_OK, atomic_write_text + from codex_comm import CodexCommunicator + + output_path, timeout, message, quiet = _parse_args(argv) + if not message: + _usage() + return EXIT_ERROR + + comm = CodexCommunicator(lazy_init=True) + + healthy, status = comm._check_session_health_impl(probe_terminal=False) + if not healthy: + raise RuntimeError(f"❌ Session error: {status}") + + _, state = comm._send_message(message) + reply, _ = comm.log_reader.wait_for_message(state, timeout) + if not reply: + if not quiet: + print(f"⏰ Timeout after {int(timeout)}s", file=sys.stderr) + return EXIT_NO_REPLY + + if output_path: + atomic_write_text(output_path, reply + "\n") + return EXIT_OK + + sys.stdout.write(reply) + if not reply.endswith("\n"): + sys.stdout.write("\n") + return EXIT_OK + except KeyboardInterrupt: + return 130 except Exception as exc: print(exc, file=sys.stderr) return 1 diff --git a/bin/cask-w b/bin/cask-w index 91de217..492f1ef 100755 --- a/bin/cask-w +++ b/bin/cask-w @@ -1,13 +1,14 @@ #!/usr/bin/env python3 """ -cask-w - Send message to Codex and wait for reply (pure sync mode) -Designed to be run with Claude Code's run_in_background=true +cask-w - Send message to Codex and wait for reply (foreground sync). + +stdout: reply text only (for piping). +stderr: progress and errors. """ from __future__ import annotations import os import sys from pathlib import Path -import json script_dir = Path(__file__).resolve().parent lib_dir = script_dir.parent / "lib" @@ -17,35 +18,52 @@ setup_windows_encoding() def main(argv: list[str]) -> int: + from cli_output import EXIT_ERROR, EXIT_NO_REPLY, EXIT_OK, atomic_write_text + from codex_comm import CodexCommunicator + from i18n import t + if len(argv) <= 1: - print("Usage: cask-w ", file=sys.stderr) - return 1 + print("Usage: cask-w [--timeout SECONDS] [--output FILE] ", file=sys.stderr) + return EXIT_ERROR - message = " ".join(argv[1:]).strip() + output_path: Path | None = None + timeout: float | None = None + + parts: list[str] = [] + it = iter(argv[1:]) + for token in it: + if token in ("-h", "--help"): + print("Usage: cask-w [--timeout SECONDS] [--output FILE] ", file=sys.stderr) + return EXIT_OK + if token in ("-o", "--output"): + try: + output_path = Path(next(it)).expanduser() + except StopIteration: + print("❌ --output requires a file path", file=sys.stderr) + return EXIT_ERROR + continue + if token in ("-t", "--timeout"): + try: + timeout = float(next(it)) + except StopIteration: + print("❌ --timeout requires a number", file=sys.stderr) + return EXIT_ERROR + except ValueError: + print("❌ --timeout must be a number", file=sys.stderr) + return EXIT_ERROR + continue + parts.append(token) + + message = " ".join(parts).strip() if not message: print("❌ Message cannot be empty", file=sys.stderr) - return 1 - - from codex_comm import CodexCommunicator - from i18n import t + return EXIT_ERROR - def save_pending_state(state: dict) -> None: - session_file = Path.cwd() / ".codex-session" - if not session_file.exists(): - return + if timeout is None: try: - with session_file.open("r", encoding="utf-8-sig") as handle: - data = json.load(handle) - data["pending_state"] = { - "log_path": str(state.get("log_path")) if state.get("log_path") else None, - "offset": int(state.get("offset", 0) or 0), - } - tmp_file = session_file.with_suffix(".tmp") - with tmp_file.open("w", encoding="utf-8") as handle: - json.dump(data, handle, ensure_ascii=False, indent=2) - os.replace(tmp_file, session_file) + timeout = float(os.environ.get("CCB_SYNC_TIMEOUT", "3600.0")) except Exception: - return + timeout = 3600.0 try: comm = CodexCommunicator(lazy_init=True) @@ -54,42 +72,31 @@ def main(argv: list[str]) -> int: healthy, status = comm._check_session_health_impl(probe_terminal=False) if not healthy: print(f"❌ Session error: {status}", file=sys.stderr) - return 1 + return EXIT_ERROR # Send message - print(f"🔔 {t('sending_to', provider='Codex')}", flush=True) - marker, state = comm._send_message(message) - comm._remember_codex_session(state.get("log_path") or comm.log_reader.current_log_path()) - - # Pure sync wait (default 1 hour, configurable via CCB_SYNC_TIMEOUT) - sync_timeout = float(os.environ.get("CCB_SYNC_TIMEOUT", "3600.0")) - message_reply, _ = comm.log_reader.wait_for_message(state, sync_timeout) - - # Save to cache - cache_dir = Path.home() / ".cache" / "ccb" - cache_dir.mkdir(parents=True, exist_ok=True) - reply_file = cache_dir / "codex_last_reply.txt" - - if message_reply: - print(f"🤖 {t('reply_from', provider='Codex')}") - print(message_reply) - reply_file.write_text(message_reply, encoding="utf-8") - else: - print(f"⏰ Timeout after {int(sync_timeout)}s") - save_pending_state(state) - return 0 + print(f"🔔 {t('sending_to', provider='Codex')}", file=sys.stderr, flush=True) + _, state = comm._send_message(message) + + message_reply, _ = comm.log_reader.wait_for_message(state, timeout) + if not message_reply: + print(f"⏰ Timeout after {int(timeout)}s", file=sys.stderr) + return EXIT_NO_REPLY + + if output_path: + atomic_write_text(output_path, message_reply + "\n") + + sys.stdout.write(message_reply) + if not message_reply.endswith("\n"): + sys.stdout.write("\n") + return EXIT_OK except KeyboardInterrupt: - # Best-effort: preserve pending state so /cpend can fetch later. - try: - save_pending_state(locals().get("state", {}) if isinstance(locals().get("state"), dict) else {}) - except Exception: - pass print("❌ Interrupted", file=sys.stderr) return 130 except Exception as exc: print(f"❌ {exc}", file=sys.stderr) - return 1 + return EXIT_ERROR if __name__ == "__main__": diff --git a/bin/cpend b/bin/cpend index 8747d57..3b72816 100755 --- a/bin/cpend +++ b/bin/cpend @@ -14,101 +14,82 @@ from compat import setup_windows_encoding setup_windows_encoding() from i18n import t -from session_utils import safe_write_session try: - from codex_comm import CodexCommunicator + from cli_output import EXIT_ERROR, EXIT_NO_REPLY, EXIT_OK + from codex_comm import CodexLogReader except ImportError as exc: print(f"Import failed: {exc}") sys.exit(1) -def _load_cached_reply() -> str | None: - """Load cached reply from background cask-w process""" - cache_file = Path.home() / ".cache" / "ccb" / "codex_last_reply.txt" - if not cache_file.exists(): - return None - try: - content = cache_file.read_text(encoding="utf-8").strip() - if content: - cache_file.unlink() # Clear after reading - return content - except Exception: - pass - return None - - -def _load_pending_state() -> dict: - """Load pending state saved by cask-w timeout from .codex-session""" +def _load_session_log_path() -> Path | None: + """Load codex_session_path from .codex-session if exists""" session_file = Path.cwd() / ".codex-session" if not session_file.exists(): - return {} - try: - with session_file.open("r", encoding="utf-8-sig") as f: - data = json.load(f) - pending = data.get("pending_state", {}) - return pending if isinstance(pending, dict) else {} - except Exception: - return {} - - -def _clear_pending_state() -> None: - """Clear pending_state""" - session_file = Path.cwd() / ".codex-session" - if not session_file.exists(): - return + return None try: with session_file.open("r", encoding="utf-8-sig") as f: data = json.load(f) - if "pending_state" in data: - del data["pending_state"] - safe_write_session(session_file, json.dumps(data, ensure_ascii=False, indent=2)) + path_str = data.get("codex_session_path") + if path_str: + return Path(path_str).expanduser() except Exception: pass + return None - -def main() -> int: +def _parse_n(argv: list[str]) -> int: + if len(argv) <= 1: + return 1 + if argv[1] in ("-h", "--help"): + print("Usage: cpend [N]", file=sys.stderr) + raise SystemExit(EXIT_OK) try: - # First check cached reply from background cask-w - cached = _load_cached_reply() - if cached: - print(f"🤖 Codex reply:") - print(cached) - return 0 - - comm = CodexCommunicator() - - pending = _load_pending_state() - if pending and pending.get("log_path"): - try: - log_path = Path(str(pending.get("log_path"))).expanduser() - except Exception: - log_path = None + n = int(argv[1]) + except ValueError: + print("Usage: cpend [N]", file=sys.stderr) + raise SystemExit(EXIT_ERROR) + return max(1, n) - # Avoid falling back to "global latest" if the pending log path is missing, - # otherwise cpend may display an unrelated reply from another project. - if log_path and log_path.exists(): - try: - offset = int(pending.get("offset", 0) or 0) - except Exception: - offset = 0 - state = {"log_path": str(log_path), "offset": offset} - message, _ = comm.log_reader.try_get_message(state) - if message: - _clear_pending_state() - print(message) - return 0 - output = comm.consume_pending(display=False) - if output: - print(output) - else: - print(t('no_reply_available', provider='Codex')) - return 0 +def main(argv: list[str]) -> int: + try: + n = _parse_n(argv) + + # Must use session-specific log path from .codex-session + log_path = _load_session_log_path() + if not log_path: + print("❌ No .codex-session found in current directory", file=sys.stderr) + return EXIT_ERROR + if not log_path.exists(): + print(f"❌ Session log not found: {log_path}", file=sys.stderr) + return EXIT_ERROR + + reader = CodexLogReader(log_path=log_path) + + if n > 1: + conversations = reader.latest_conversations(n) + if not conversations: + print(t("no_reply_available", provider="Codex"), file=sys.stderr) + return EXIT_NO_REPLY + for i, (question, reply) in enumerate(conversations): + if question: + print(f"Q: {question}") + print(f"A: {reply}") + if i < len(conversations) - 1: + print("---") + return EXIT_OK + + message = reader.latest_message() + if not message: + print(t("no_reply_available", provider="Codex"), file=sys.stderr) + return EXIT_NO_REPLY + print(message) + return EXIT_OK except Exception as exc: - print(f"❌ {t('execution_failed', error=exc)}") - return 1 + print(f"❌ {t('execution_failed', error=exc)}", file=sys.stderr) + return EXIT_ERROR if __name__ == "__main__": - sys.exit(main()) + sys.exit(main(sys.argv)) diff --git a/bin/gask b/bin/gask index dba7dc8..f35b86e 100755 --- a/bin/gask +++ b/bin/gask @@ -1,10 +1,14 @@ #!/usr/bin/env python3 """ -gask - Async send message to Gemini +gask - Send message to Gemini and wait for reply (sync). + +Designed to be used with Claude Code's run_in_background=true. +If --output is provided, the reply is written atomically to that file and stdout stays empty. """ from __future__ import annotations +import os import sys from pathlib import Path @@ -14,26 +18,85 @@ sys.path.insert(0, str(lib_dir)) from compat import setup_windows_encoding setup_windows_encoding() -from gemini_comm import GeminiCommunicator +from cli_output import EXIT_ERROR, EXIT_NO_REPLY, EXIT_OK, atomic_write_text def main(argv: list[str]) -> int: if len(argv) <= 1: - print("Usage: gask ", file=sys.stderr) - return 1 + print("Usage: gask [--timeout SECONDS] [--output FILE] ", file=sys.stderr) + return EXIT_ERROR + + output_path: Path | None = None + timeout: float | None = None + quiet = False - message = " ".join(argv[1:]).strip() + parts: list[str] = [] + it = iter(argv[1:]) + for token in it: + if token in ("-h", "--help"): + print("Usage: gask [--timeout SECONDS] [--output FILE] ", file=sys.stderr) + return EXIT_OK + if token in ("-q", "--quiet"): + quiet = True + continue + if token in ("-o", "--output"): + try: + output_path = Path(next(it)).expanduser() + except StopIteration: + print("❌ --output requires a file path", file=sys.stderr) + return EXIT_ERROR + continue + if token in ("-t", "--timeout"): + try: + timeout = float(next(it)) + except StopIteration: + print("❌ --timeout requires a number", file=sys.stderr) + return EXIT_ERROR + except ValueError: + print("❌ --timeout must be a number", file=sys.stderr) + return EXIT_ERROR + continue + parts.append(token) + + message = " ".join(parts).strip() if not message: print("❌ Message cannot be empty", file=sys.stderr) - return 1 + return EXIT_ERROR + + if timeout is None: + try: + timeout = float(os.environ.get("CCB_SYNC_TIMEOUT", "3600.0")) + except Exception: + timeout = 3600.0 try: - comm = GeminiCommunicator() - comm.ask_async(message) - return 0 + from gemini_comm import GeminiCommunicator + + comm = GeminiCommunicator(lazy_init=True) + healthy, status = comm._check_session_health_impl(probe_terminal=False) + if not healthy: + raise RuntimeError(f"❌ Session error: {status}") + + _, state = comm._send_message(message) + reply, _ = comm.log_reader.wait_for_message(state, timeout) + if not reply: + if not quiet: + print(f"⏰ Timeout after {int(timeout)}s", file=sys.stderr) + return EXIT_NO_REPLY + + if output_path: + atomic_write_text(output_path, reply + "\n") + return EXIT_OK + + sys.stdout.write(reply) + if not reply.endswith("\n"): + sys.stdout.write("\n") + return EXIT_OK + except KeyboardInterrupt: + return 130 except Exception as exc: print(f"❌ {exc}", file=sys.stderr) - return 1 + return EXIT_ERROR if __name__ == "__main__": diff --git a/bin/gask-w b/bin/gask-w index 96267eb..11d6da3 100755 --- a/bin/gask-w +++ b/bin/gask-w @@ -1,13 +1,14 @@ #!/usr/bin/env python3 """ -gask-w - Send message to Gemini and wait for reply (pure sync mode) -Designed to be run with Claude Code's run_in_background=true +gask-w - Send message to Gemini and wait for reply (foreground sync). + +stdout: reply text only (for piping). +stderr: progress and errors. """ from __future__ import annotations import os import sys from pathlib import Path -import json script_dir = Path(__file__).resolve().parent lib_dir = script_dir.parent / "lib" @@ -17,51 +18,52 @@ setup_windows_encoding() def main(argv: list[str]) -> int: - if len(argv) <= 1: - print("Usage: gask-w ", file=sys.stderr) - return 1 + from cli_output import EXIT_ERROR, EXIT_NO_REPLY, EXIT_OK, atomic_write_text + from gemini_comm import GeminiCommunicator + from i18n import t - message = " ".join(argv[1:]).strip() + if len(argv) <= 1: + print("Usage: gask-w [--timeout SECONDS] [--output FILE] ", file=sys.stderr) + return EXIT_ERROR + + output_path: Path | None = None + timeout: float | None = None + + parts: list[str] = [] + it = iter(argv[1:]) + for token in it: + if token in ("-h", "--help"): + print("Usage: gask-w [--timeout SECONDS] [--output FILE] ", file=sys.stderr) + return EXIT_OK + if token in ("-o", "--output"): + try: + output_path = Path(next(it)).expanduser() + except StopIteration: + print("❌ --output requires a file path", file=sys.stderr) + return EXIT_ERROR + continue + if token in ("-t", "--timeout"): + try: + timeout = float(next(it)) + except StopIteration: + print("❌ --timeout requires a number", file=sys.stderr) + return EXIT_ERROR + except ValueError: + print("❌ --timeout must be a number", file=sys.stderr) + return EXIT_ERROR + continue + parts.append(token) + + message = " ".join(parts).strip() if not message: print("❌ Message cannot be empty", file=sys.stderr) - return 1 - - from gemini_comm import GeminiCommunicator - from i18n import t + return EXIT_ERROR - def save_pending_state(state: dict) -> None: - session_file = Path.cwd() / ".gemini-session" - if not session_file.exists(): - return + if timeout is None: try: - with session_file.open("r", encoding="utf-8-sig") as handle: - data = json.load(handle) - data["pending_state"] = { - "session_path": str(state.get("session_path")) if state.get("session_path") else None, - "msg_count": int(state.get("msg_count", 0) or 0), - "mtime": float(state.get("mtime", 0.0) or 0.0), - "mtime_ns": int(state.get("mtime_ns", 0) or 0), - "size": int(state.get("size", 0) or 0), - "last_gemini_id": state.get("last_gemini_id"), - "last_gemini_hash": state.get("last_gemini_hash"), - } - tmp_file = session_file.with_suffix(".tmp") - with tmp_file.open("w", encoding="utf-8") as handle: - json.dump(data, handle, ensure_ascii=False, indent=2) - os.replace(tmp_file, session_file) + timeout = float(os.environ.get("CCB_SYNC_TIMEOUT", "3600.0")) except Exception: - return - - # Save to cache - cache_dir = Path.home() / ".cache" / "ccb" - cache_dir.mkdir(parents=True, exist_ok=True) - reply_file = cache_dir / "gemini_last_reply.txt" - # Clear stale cache - if reply_file.exists(): - try: - reply_file.unlink() - except Exception: - pass + timeout = 3600.0 try: comm = GeminiCommunicator(lazy_init=True) @@ -70,43 +72,31 @@ def main(argv: list[str]) -> int: healthy, status = comm._check_session_health_impl(probe_terminal=False) if not healthy: print(f"❌ Session error: {status}", file=sys.stderr) - return 1 + return EXIT_ERROR # Send message - print(f"🔔 {t('sending_to', provider='Gemini')}", flush=True) - marker, state = comm._send_message(message) - comm._remember_gemini_session(state.get("session_path") or comm.log_reader.current_session_path()) - - # Pure sync wait (default 1 hour, configurable via CCB_SYNC_TIMEOUT) - sync_timeout = float(os.environ.get("CCB_SYNC_TIMEOUT", "3600.0")) - message_reply, new_state = comm.log_reader.wait_for_message(state, sync_timeout) - state = new_state or state - comm._remember_gemini_session(state.get("session_path") or comm.log_reader.current_session_path()) - - # Save to cache - cache_dir = Path.home() / ".cache" / "ccb" - cache_dir.mkdir(parents=True, exist_ok=True) - reply_file = cache_dir / "gemini_last_reply.txt" - - if message_reply: - print(f"🤖 {t('reply_from', provider='Gemini')}") - print(message_reply) - reply_file.write_text(message_reply, encoding="utf-8") - else: - print(f"⏰ Timeout after {int(sync_timeout)}s") - save_pending_state(state) - return 0 + print(f"🔔 {t('sending_to', provider='Gemini')}", file=sys.stderr, flush=True) + _, state = comm._send_message(message) + message_reply, _ = comm.log_reader.wait_for_message(state, timeout) + + if not message_reply: + print(f"⏰ Timeout after {int(timeout)}s", file=sys.stderr) + return EXIT_NO_REPLY + + if output_path: + atomic_write_text(output_path, message_reply + "\n") + + sys.stdout.write(message_reply) + if not message_reply.endswith("\n"): + sys.stdout.write("\n") + return EXIT_OK except KeyboardInterrupt: - try: - save_pending_state(locals().get("state", {}) if isinstance(locals().get("state"), dict) else {}) - except Exception: - pass print("❌ Interrupted", file=sys.stderr) return 130 except Exception as exc: print(f"❌ {exc}", file=sys.stderr) - return 1 + return EXIT_ERROR if __name__ == "__main__": diff --git a/bin/gpend b/bin/gpend index 0faf63c..aaf9b89 100755 --- a/bin/gpend +++ b/bin/gpend @@ -15,47 +15,57 @@ setup_windows_encoding() from i18n import t try: - from gemini_comm import GeminiCommunicator + from cli_output import EXIT_ERROR, EXIT_NO_REPLY, EXIT_OK + from gemini_comm import GeminiLogReader except ImportError as exc: print(f"Import failed: {exc}") sys.exit(1) -def _load_cached_reply() -> str | None: - """Load cached reply from background gask-w process""" - cache_file = Path.home() / ".cache" / "ccb" / "gemini_last_reply.txt" - if not cache_file.exists(): - return None +def _parse_n(argv: list[str]) -> int: + if len(argv) <= 1: + return 1 + if argv[1] in ("-h", "--help"): + print("Usage: gpend [N]", file=sys.stderr) + raise SystemExit(EXIT_OK) try: - content = cache_file.read_text(encoding="utf-8").strip() - if content: - cache_file.unlink() # Clear after reading - return content - except Exception: - pass - return None + n = int(argv[1]) + except ValueError: + print("Usage: gpend [N]", file=sys.stderr) + raise SystemExit(EXIT_ERROR) + return max(1, n) -def main() -> int: +def main(argv: list[str]) -> int: try: - # First check cached reply from background gask-w - cached = _load_cached_reply() - if cached: - print(f"🤖 Gemini reply:") - print(cached) - return 0 - - comm = GeminiCommunicator() - output = comm.consume_pending(display=False) - if output: - print(output) - else: - print(t('no_reply_available', provider='Gemini')) - return 0 + n = _parse_n(argv) + + # GeminiLogReader uses work_dir to find session, no need for explicit path + reader = GeminiLogReader() + + if n > 1: + conversations = reader.latest_conversations(n) + if not conversations: + print(t("no_reply_available", provider="Gemini"), file=sys.stderr) + return EXIT_NO_REPLY + for i, (question, reply) in enumerate(conversations): + if question: + print(f"Q: {question}") + print(f"A: {reply}") + if i < len(conversations) - 1: + print("---") + return EXIT_OK + + message = reader.latest_message() + if not message: + print(t("no_reply_available", provider="Gemini"), file=sys.stderr) + return EXIT_NO_REPLY + print(message) + return EXIT_OK except Exception as exc: - print(f"❌ {t('execution_failed', error=exc)}") - return 1 + print(f"❌ {t('execution_failed', error=exc)}", file=sys.stderr) + return EXIT_ERROR if __name__ == "__main__": - sys.exit(main()) + sys.exit(main(sys.argv)) diff --git a/commands/cask-w.md b/commands/cask-w.md index 28b5946..cf42fa3 100644 --- a/commands/cask-w.md +++ b/commands/cask-w.md @@ -1,23 +1,18 @@ -Forward commands to Codex session and wait for reply via `cask-w` command (supports tmux / WezTerm). +Send message to Codex and wait for reply via `cask-w` (foreground sync). Execution: -1. Run `Bash(cask-w "", run_in_background=true)` to start background task -2. Tell user the task_id and that Codex is processing -3. Wait for bash-notification (task completed) -4. When notification arrives, immediately `cat` the output file to show result +- Run `Bash(cask-w "")` and wait until it returns Parameters: -- `` required, will be forwarded to Codex session +- `` required +- `--timeout SECONDS` optional (default from `CCB_SYNC_TIMEOUT`, fallback 3600) +- `--output FILE` optional: write reply atomically to FILE (stdout still prints the reply) -Workflow: -1. Start cask-w in background -> get task_id -2. Inform user: "Codex processing (task: xxx)" -3. When bash-notification arrives -> `cat ` to show result - -Examples: -- `Bash(cask-w "analyze code", run_in_background=true)` -- bash-notification arrives -> `cat /tmp/.../tasks/xxx.output` +Output contract: +- stdout: reply text only +- stderr: progress/errors +- exit code: 0 = got reply, 2 = timeout/no reply, 1 = error Hints: -- Use `cask` for fire-and-forget (no wait) -- Use `/cpend` to view latest reply anytime +- Use `cask` with `run_in_background=true` for background waiting +- Use `/cpend` to view the latest reply from official logs diff --git a/commands/cask.md b/commands/cask.md index d8ec24f..f43335f 100644 --- a/commands/cask.md +++ b/commands/cask.md @@ -1,18 +1,18 @@ -Forward commands to Codex session via `cask` command (supports tmux / WezTerm, forward only, does not execute in current Claude process). +Send message to Codex and wait for reply via `cask` (sync mode). -Execution: -- Run silently `Bash(cask "")`, no additional analysis or operations after execution -- Can also run `cask ` in terminal with same effect +Designed for Claude Code: run with `run_in_background=true` so Claude can continue working while Codex processes. -Parameters: -- `` required, will be forwarded to Codex session (e.g. `pwd`, `ls` commands) -- Note: cask only forwards, does not execute in Claude process, returns immediately after +Workflow: +1. Run `Bash(cask "", run_in_background=true)` to start background task +2. Tell user the task_id and that Codex is processing, then END your turn +3. When bash-notification arrives, show the task output -Examples: -- `Bash(cask "pwd")` -- `Bash(cask "ls -la")` +Parameters: +- `` required +- `--timeout SECONDS` optional (default from `CCB_SYNC_TIMEOUT`, fallback 3600) +- `--output FILE` optional: write reply atomically to FILE (stdout stays empty) -Hints: -- cask returns immediately after sending, does not wait for result -- Use `/cask-w` if you need to wait for Codex reply -- After cask returns, forwarding is complete, no further action needed +Output contract: +- stdout: reply text only (or empty when `--output` is used) +- stderr: progress/errors +- exit code: 0 = got reply, 2 = timeout/no reply, 1 = error diff --git a/commands/cpend.md b/commands/cpend.md index e07e28a..820de65 100644 --- a/commands/cpend.md +++ b/commands/cpend.md @@ -1,4 +1,4 @@ -Use `cpend` to fetch latest reply from Codex official logs, suitable for async mode or follow-up queries after timeout. +Use `cpend` to fetch latest reply from Codex official logs (`~/.codex/sessions/`). Trigger conditions (any match): - User mentions cpend/Cpend @@ -20,14 +20,13 @@ A: codex reply 2 ``` Features: -1. Parses log path recorded in `.codex-session`, locates latest JSONL file for current session -2. Reads tail messages and returns Codex's most recent output -3. If no new content, will prompt "No Codex reply yet" -4. Supports fetching last N conversations with Q&A pairs +1. Reads Codex official session JSONL logs from `~/.codex/sessions/` +2. Prints the latest assistant reply (`cpend`) or the last N Q&A pairs (`cpend N`) +3. If no reply is available, exits with code 2 and prints a message to stderr Common scenarios: -- View results after submitting multiple tasks via `cask` async -- Manually confirm if Codex has responded after `cask-w` timeout exit +- View results after running `cask` in background +- Manually confirm if Codex has responded after a background task completes - Need to verify if Codex reply matches original question - Review recent conversation history with Codex diff --git a/commands/gask-w.md b/commands/gask-w.md index 37fa754..ab02fa8 100644 --- a/commands/gask-w.md +++ b/commands/gask-w.md @@ -1,23 +1,18 @@ -Forward commands to Gemini session and wait for reply via `gask-w` command (supports tmux / WezTerm). +Send message to Gemini and wait for reply via `gask-w` (foreground sync). Execution: -1. Run `Bash(gask-w "", run_in_background=true)` to start background task -2. Tell user the task_id and that Gemini is processing -3. Wait for bash-notification (task completed) -4. When notification arrives, immediately `cat` the output file to show result +- Run `Bash(gask-w "")` and wait until it returns Parameters: -- `` required, will be forwarded to Gemini session +- `` required +- `--timeout SECONDS` optional (default from `CCB_SYNC_TIMEOUT`, fallback 3600) +- `--output FILE` optional: write reply atomically to FILE (stdout still prints the reply) -Workflow: -1. Start gask-w in background -> get task_id -2. Inform user: "Gemini processing (task: xxx)" -3. When bash-notification arrives -> `cat ` to show result - -Examples: -- `Bash(gask-w "explain this", run_in_background=true)` -- bash-notification arrives -> `cat /tmp/.../tasks/xxx.output` +Output contract: +- stdout: reply text only +- stderr: progress/errors +- exit code: 0 = got reply, 2 = timeout/no reply, 1 = error Hints: -- Use `gask` for fire-and-forget (no wait) -- Use `/gpend` to view latest reply anytime +- Use `gask` with `run_in_background=true` for background waiting +- Use `/gpend` to view the latest reply from Gemini logs diff --git a/commands/gask.md b/commands/gask.md index f55acf9..d4d3135 100644 --- a/commands/gask.md +++ b/commands/gask.md @@ -1,18 +1,18 @@ -Forward commands to Gemini session via `gask` command (supports tmux / WezTerm, forward only, does not execute in current Claude process). +Send message to Gemini and wait for reply via `gask` (sync mode). -Execution: -- Run silently `Bash(gask "")`, no additional analysis or operations after execution -- Can also run `gask ` in terminal with same effect +Designed for Claude Code: run with `run_in_background=true` so Claude can continue working while Gemini processes. -Parameters: -- `` required, will be forwarded to Gemini session -- Note: gask only forwards, does not execute in Claude process, returns immediately after +Workflow: +1. Run `Bash(gask "", run_in_background=true)` to start background task +2. Tell user the task_id and that Gemini is processing, then END your turn +3. When bash-notification arrives, show the task output -Examples: -- `Bash(gask "explain this code")` -- `Bash(gask "help me optimize this function")` +Parameters: +- `` required +- `--timeout SECONDS` optional (default from `CCB_SYNC_TIMEOUT`, fallback 3600) +- `--output FILE` optional: write reply atomically to FILE (stdout stays empty) -Hints: -- gask returns immediately after sending, does not wait for result -- Use `/gask-w` if you need to wait for Gemini reply -- After gask returns, forwarding is complete, no further action needed +Output contract: +- stdout: reply text only (or empty when `--output` is used) +- stderr: progress/errors +- exit code: 0 = got reply, 2 = timeout/no reply, 1 = error diff --git a/commands/gpend.md b/commands/gpend.md index 0058a35..dd61ed7 100644 --- a/commands/gpend.md +++ b/commands/gpend.md @@ -1,4 +1,4 @@ -Use `gpend` to fetch latest reply from Gemini session, suitable for async mode or follow-up queries after timeout. +Use `gpend` to fetch latest reply from Gemini logs (`~/.gemini/tmp/.../chats/session-*.json`). Trigger conditions (any match): - User mentions gpend/Gpend @@ -19,10 +19,15 @@ Q: user question 2 A: gemini reply 2 ``` +Output contract: +- stdout: reply text (or Q&A pairs) +- stderr: message when no reply / errors +- exit code: 0 = got reply, 2 = no reply available, 1 = error + Common scenarios: -- View reply after gask async send -- Continue getting reply after gask-w timeout +- View reply after running `gask` in background +- Continue getting reply after a foreground/background wait returns empty/timeout - Review recent conversation history with Gemini Hints: -- If command returns empty, first confirm Gemini session is still running (use `/gping` to check) +- If command exits with code 2, first confirm Gemini session is still running (use `/gping` to check) diff --git a/install.ps1 b/install.ps1 index 46ddc7f..9f5553a 100644 --- a/install.ps1 +++ b/install.ps1 @@ -252,8 +252,8 @@ function Install-ClaudeConfig { Codex is another AI assistant running via tmux or WezTerm. When user intent involves asking/consulting/collaborating with Codex: Fast path (minimize latency): -- If the user message starts with any of: ``@codex``, ``codex:``, ``codex:`` then immediately run: - - ``cask-w ""`` (sync, waits for reply) +- If the user message starts with any of: ``@codex``, ``codex:``, ``ask codex``, ``let codex``, ``/cask`` then immediately run: + - ``Bash(cask "", run_in_background=true)``, tell user task_id, then END your turn - If user message is only the prefix (no content), ask a 1-line clarification for what to send. Trigger conditions (any match): @@ -262,17 +262,19 @@ Trigger conditions (any match): - User asks about codex's status or previous reply Command selection: -- Default ask/collaborate: ``cask-w ""`` (sync, waits for reply) -- Send without waiting: ``cask ""`` (async, returns immediately) +- Default ask/collaborate -> ``Bash(cask "", run_in_background=true)`` + - Tell user "Codex processing (task: xxx)" then END your turn immediately + - When bash-notification arrives, show the task output +- Foreground ask (blocking) -> ``cask-w ""`` - Check connectivity: ``cping`` -- View previous reply: ``cpend`` +- View previous reply: ``cpend`` / ``cpend N`` ## Gemini Collaboration Rules Gemini is another AI assistant running via tmux or WezTerm. When user intent involves asking/consulting/collaborating with Gemini: Fast path (minimize latency): -- If the user message starts with any of: ``@gemini``, ``gemini:``, ``gemini:`` then immediately run: - - ``gask-w ""`` (sync, waits for reply) +- If the user message starts with any of: ``@gemini``, ``gemini:``, ``ask gemini``, ``let gemini``, ``/gask`` then immediately run: + - ``Bash(gask "", run_in_background=true)``, tell user task_id, then END your turn - If user message is only the prefix (no content), ask a 1-line clarification for what to send. Trigger conditions (any match): @@ -281,10 +283,12 @@ Trigger conditions (any match): - User asks about gemini's status or previous reply Command selection: -- Default ask/collaborate: ``gask-w ""`` (sync, waits for reply) -- Send without waiting: ``gask ""`` (async, returns immediately) +- Default ask/collaborate -> ``Bash(gask "", run_in_background=true)`` + - Tell user "Gemini processing (task: xxx)" then END your turn immediately + - When bash-notification arrives, show the task output +- Foreground ask (blocking) -> ``gask-w ""`` - Check connectivity: ``gping`` -- View previous reply: ``gpend`` +- View previous reply: ``gpend`` / ``gpend N`` "@ if (Test-Path $claudeMd) { diff --git a/install.sh b/install.sh index 44f6477..f325689 100755 --- a/install.sh +++ b/install.sh @@ -671,8 +671,8 @@ install_claude_md_config() { Codex is another AI assistant running in a separate terminal session (WezTerm, iTerm2 or tmux). When user intent involves asking/consulting/collaborating with Codex: Fast path (minimize latency): -- If the user message starts with any of: `@codex`, `codex:`, `ask codex`, `let codex`, `/cask-w` then immediately run: - - `Bash(cask-w "", run_in_background=true)` then STOP and wait for bash-notification +- If the user message starts with any of: `@codex`, `codex:`, `ask codex`, `let codex`, `/cask` then immediately run: + - `Bash(cask "", run_in_background=true)`, tell user task_id, then END your turn - If user message is only the prefix (no content), ask a 1-line clarification for what to send. Trigger conditions (any match): @@ -681,26 +681,25 @@ Trigger conditions (any match): - User asks about codex's status or previous reply Command selection: -- Default ask/collaborate -> `Bash(cask-w "", run_in_background=true)` - - When bash-notification arrives (task completed), immediately cat the output file to show result - - Do NOT continue with other work until result is shown -- Send without waiting -> `cask ""` (fire and forget) +- Default ask/collaborate -> `Bash(cask "", run_in_background=true)` + - Tell user "Codex processing (task: xxx)" then END your turn immediately + - When bash-notification arrives, show the task output +- Foreground ask (blocking) -> `cask-w ""` - Check connectivity -> `cping` -- View previous reply -> `cpend` +- View previous reply -> `cpend` / `cpend N` Examples: -- "what does codex think" -> `Bash(cask-w "...", run_in_background=true)`, wait for notification, cat output -- "ask codex to review this" -> `Bash(cask-w "...", run_in_background=true)`, wait for notification, cat output +- "what does codex think" -> `Bash(cask "...", run_in_background=true)`, say "Codex processing", END turn +- "ask codex to review this" -> `Bash(cask "...", run_in_background=true)`, say "Codex processing", END turn - "is codex alive" -> cping -- "don't wait for reply" -> cask - "view codex reply" -> cpend ## Gemini Collaboration Rules Gemini is another AI assistant running in a separate terminal session (WezTerm, iTerm2 or tmux). When user intent involves asking/consulting/collaborating with Gemini: Fast path (minimize latency): -- If the user message starts with any of: `@gemini`, `gemini:`, `ask gemini`, `let gemini`, `/gask-w` then immediately run: - - `Bash(gask-w "", run_in_background=true)` then STOP and wait for bash-notification +- If the user message starts with any of: `@gemini`, `gemini:`, `ask gemini`, `let gemini`, `/gask` then immediately run: + - `Bash(gask "", run_in_background=true)`, tell user task_id, then END your turn - If user message is only the prefix (no content), ask a 1-line clarification for what to send. Trigger conditions (any match): @@ -709,18 +708,17 @@ Trigger conditions (any match): - User asks about gemini's status or previous reply Command selection: -- Default ask/collaborate -> `Bash(gask-w "", run_in_background=true)` - - When bash-notification arrives (task completed), immediately cat the output file to show result - - Do NOT continue with other work until result is shown -- Send without waiting -> `gask ""` (fire and forget) +- Default ask/collaborate -> `Bash(gask "", run_in_background=true)` + - Tell user "Gemini processing (task: xxx)" then END your turn immediately + - When bash-notification arrives, show the task output +- Foreground ask (blocking) -> `gask-w ""` - Check connectivity -> `gping` -- View previous reply -> `gpend` +- View previous reply -> `gpend` / `gpend N` Examples: -- "what does gemini think" -> `Bash(gask-w "...", run_in_background=true)`, wait for notification, cat output -- "ask gemini to review this" -> `Bash(gask-w "...", run_in_background=true)`, wait for notification, cat output +- "what does gemini think" -> `Bash(gask "...", run_in_background=true)`, say "Gemini processing", END turn +- "ask gemini to review this" -> `Bash(gask "...", run_in_background=true)`, say "Gemini processing", END turn - "is gemini alive" -> gping -- "don't wait for reply" -> gask - "view gemini reply" -> gpend AI_RULES diff --git a/lib/cli_output.py b/lib/cli_output.py new file mode 100644 index 0000000..356c4ff --- /dev/null +++ b/lib/cli_output.py @@ -0,0 +1,42 @@ +from __future__ import annotations + +import os +import tempfile +from pathlib import Path +from typing import Optional + + +EXIT_OK = 0 +EXIT_ERROR = 1 +EXIT_NO_REPLY = 2 + + +def atomic_write_text(path: Path, content: str, *, encoding: str = "utf-8") -> None: + path = Path(path) + path.parent.mkdir(parents=True, exist_ok=True) + + fd: Optional[int] = None + tmp_path: Optional[str] = None + try: + fd, tmp_path = tempfile.mkstemp(prefix=f".{path.name}.", suffix=".tmp", dir=str(path.parent)) + with os.fdopen(fd, "w", encoding=encoding, newline="\n") as handle: + handle.write(content) + fd = None + os.replace(tmp_path, path) + tmp_path = None + finally: + if fd is not None: + try: + os.close(fd) + except Exception: + pass + if tmp_path: + try: + os.unlink(tmp_path) + except Exception: + pass + + +def normalize_message_parts(parts: list[str]) -> str: + return " ".join(parts).strip() + diff --git a/lib/codex_comm.py b/lib/codex_comm.py index 1428fa2..4cb7728 100644 --- a/lib/codex_comm.py +++ b/lib/codex_comm.py @@ -123,7 +123,8 @@ def try_get_message(self, state: Dict[str, Any]) -> Tuple[Optional[str], Dict[st def latest_message(self) -> Optional[str]: """Get the latest reply directly""" - log_path = self._latest_log() + # Use preferred log if set, otherwise scan for latest + log_path = self._preferred_log if self._preferred_log and self._preferred_log.exists() else self._latest_log() if not log_path or not log_path.exists(): return None try: @@ -294,29 +295,25 @@ def _extract_user_message(entry: dict) -> Optional[str]: def latest_conversations(self, n: int = 1) -> List[Tuple[str, str]]: """Get the latest n conversations (question, reply) pairs""" - log_path = self._latest_log() + # Use preferred log if set, otherwise scan for latest + log_path = self._preferred_log if self._preferred_log and self._preferred_log.exists() else self._latest_log() if not log_path or not log_path.exists(): return [] + # Read entire file to find all message entries try: - with log_path.open("rb") as handle: - handle.seek(0, os.SEEK_END) - buffer = bytearray() - position = handle.tell() - while position > 0 and len(buffer) < 1024 * 1024: - read_size = min(8192, position) - position -= read_size - handle.seek(position) - buffer = handle.read(read_size) + buffer - if buffer.count(b"\n") >= n * 20: - break - lines = buffer.decode("utf-8", errors="ignore").splitlines() + with log_path.open("r", encoding="utf-8", errors="ignore") as handle: + lines = handle.readlines() except OSError: return [] questions: List[str] = [] replies: List[str] = [] + # Collect Q&A pairs in order + conversations: List[Tuple[str, str]] = [] + pending_question: Optional[str] = None + for line in lines: line = line.strip() if not line: @@ -328,24 +325,14 @@ def latest_conversations(self, n: int = 1) -> List[Tuple[str, str]]: user_msg = self._extract_user_message(entry) if user_msg: - questions.append(user_msg) + pending_question = user_msg ai_msg = self._extract_message(entry) - if ai_msg: - replies.append(ai_msg) - - conversations: List[Tuple[str, str]] = [] - q_idx = len(questions) - 1 - r_idx = len(replies) - 1 - - while len(conversations) < n and r_idx >= 0: - reply = replies[r_idx] - question = questions[q_idx] if q_idx >= 0 else "" - conversations.append((question, reply)) - q_idx -= 1 - r_idx -= 1 + if ai_msg and pending_question is not None: + conversations.append((pending_question, ai_msg)) + pending_question = None - conversations.reverse() + # Return last n conversations return conversations[-n:] if len(conversations) > n else conversations From 4181952dc2d42f48937211bae41d6c1e0ad78975 Mon Sep 17 00:00:00 2001 From: bfly Date: Wed, 24 Dec 2025 00:06:34 +0800 Subject: [PATCH 055/153] refactor(install): sync collaboration rules between ps1 and sh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add CCB_CONFIG markers to install.ps1 - Update description to include iTerm2 - Add command selection based on task complexity - Add Examples section for both Codex and Gemini 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- install.ps1 | 71 +++++++++++++++++++++++++++++++++++++++-------------- install.sh | 36 +++++++++++++++------------ 2 files changed, 72 insertions(+), 35 deletions(-) diff --git a/install.ps1 b/install.ps1 index 9f5553a..06cdfcb 100644 --- a/install.ps1 +++ b/install.ps1 @@ -21,6 +21,22 @@ try { chcp 65001 | Out-Null } catch {} $ErrorActionPreference = "Stop" $repoRoot = Split-Path -Parent $MyInvocation.MyCommand.Path +# Constants +$script:CCB_START_MARKER = "" +$script:CCB_END_MARKER = "" + +$script:SCRIPTS_TO_LINK = @("ccb", "cask", "cask-w", "cpend", "cping", "gask", "gask-w", "gpend", "gping") + +$script:CLAUDE_MARKDOWN = @( + "cask.md", "cask-w.md", "cpend.md", "cping.md", + "gask.md", "gask-w.md", "gpend.md", "gping.md" +) + +$script:LEGACY_SCRIPTS = @( + "cast", "cast-w", "codex-ask", "codex-pending", "codex-ping", + "claude-codex-dual", "claude_codex", "claude_ai", "claude_bridge" +) + # i18n support function Get-CCBLang { $lang = $env:CCB_LANG @@ -247,13 +263,12 @@ function Install-ClaudeConfig { } $codexRules = @" - + ## Codex Collaboration Rules -Codex is another AI assistant running via tmux or WezTerm. When user intent involves asking/consulting/collaborating with Codex: +Codex is another AI assistant running in a separate terminal session (WezTerm, iTerm2 or tmux). When user intent involves asking/consulting/collaborating with Codex: Fast path (minimize latency): -- If the user message starts with any of: ``@codex``, ``codex:``, ``ask codex``, ``let codex``, ``/cask`` then immediately run: - - ``Bash(cask "", run_in_background=true)``, tell user task_id, then END your turn +- If the user message starts with any of: ``@codex``, ``codex:``, ``ask codex``, ``let codex``, ``/cask`` then immediately run based on complexity. - If user message is only the prefix (no content), ask a 1-line clarification for what to send. Trigger conditions (any match): @@ -261,20 +276,28 @@ Trigger conditions (any match): - User wants codex to do something, give advice, or help review - User asks about codex's status or previous reply -Command selection: -- Default ask/collaborate -> ``Bash(cask "", run_in_background=true)`` - - Tell user "Codex processing (task: xxx)" then END your turn immediately +Command selection (choose based on task complexity): +- Simple questions (quick lookup, short answer, simple check) -> ``cask-w ""`` + - Examples: "what's the syntax for X", "is Y correct", "quick check on Z" + - Blocks until reply, then continue +- Complex tasks (review, analysis, multi-step, code generation) -> ``Bash(cask "", run_in_background=true)`` + - Examples: "review this code", "analyze the architecture", "help design X" + - Tell user "Codex processing (task: xxx)" then END your turn - When bash-notification arrives, show the task output -- Foreground ask (blocking) -> ``cask-w ""`` -- Check connectivity: ``cping`` -- View previous reply: ``cpend`` / ``cpend N`` +- Check connectivity -> ``cping`` +- View previous reply -> ``cpend`` / ``cpend N`` + +Examples: +- "codex: what's the git command for X" -> ``cask-w "..."`` (simple, wait for reply) +- "ask codex to review this PR" -> ``Bash(cask "...", run_in_background=true)``, END turn (complex) +- "is codex alive" -> cping +- "view codex reply" -> cpend ## Gemini Collaboration Rules -Gemini is another AI assistant running via tmux or WezTerm. When user intent involves asking/consulting/collaborating with Gemini: +Gemini is another AI assistant running in a separate terminal session (WezTerm, iTerm2 or tmux). When user intent involves asking/consulting/collaborating with Gemini: Fast path (minimize latency): -- If the user message starts with any of: ``@gemini``, ``gemini:``, ``ask gemini``, ``let gemini``, ``/gask`` then immediately run: - - ``Bash(gask "", run_in_background=true)``, tell user task_id, then END your turn +- If the user message starts with any of: ``@gemini``, ``gemini:``, ``ask gemini``, ``let gemini``, ``/gask`` then immediately run based on complexity. - If user message is only the prefix (no content), ask a 1-line clarification for what to send. Trigger conditions (any match): @@ -282,13 +305,23 @@ Trigger conditions (any match): - User wants gemini to do something, give advice, or help review - User asks about gemini's status or previous reply -Command selection: -- Default ask/collaborate -> ``Bash(gask "", run_in_background=true)`` - - Tell user "Gemini processing (task: xxx)" then END your turn immediately +Command selection (choose based on task complexity): +- Simple questions (quick lookup, short answer, simple check) -> ``gask-w ""`` + - Examples: "what's the syntax for X", "is Y correct", "quick check on Z" + - Blocks until reply, then continue +- Complex tasks (review, analysis, multi-step, code generation) -> ``Bash(gask "", run_in_background=true)`` + - Examples: "review this code", "analyze the architecture", "help design X" + - Tell user "Gemini processing (task: xxx)" then END your turn - When bash-notification arrives, show the task output -- Foreground ask (blocking) -> ``gask-w ""`` -- Check connectivity: ``gping`` -- View previous reply: ``gpend`` / ``gpend N`` +- Check connectivity -> ``gping`` +- View previous reply -> ``gpend`` / ``gpend N`` + +Examples: +- "gemini: what's the best practice for X" -> ``gask-w "..."`` (simple, wait for reply) +- "ask gemini to review this design" -> ``Bash(gask "...", run_in_background=true)``, END turn (complex) +- "is gemini alive" -> gping +- "view gemini reply" -> gpend + "@ if (Test-Path $claudeMd) { diff --git a/install.sh b/install.sh index f325689..5bd05a6 100755 --- a/install.sh +++ b/install.sh @@ -671,8 +671,7 @@ install_claude_md_config() { Codex is another AI assistant running in a separate terminal session (WezTerm, iTerm2 or tmux). When user intent involves asking/consulting/collaborating with Codex: Fast path (minimize latency): -- If the user message starts with any of: `@codex`, `codex:`, `ask codex`, `let codex`, `/cask` then immediately run: - - `Bash(cask "", run_in_background=true)`, tell user task_id, then END your turn +- If the user message starts with any of: `@codex`, `codex:`, `ask codex`, `let codex`, `/cask` then immediately run based on complexity. - If user message is only the prefix (no content), ask a 1-line clarification for what to send. Trigger conditions (any match): @@ -680,17 +679,20 @@ Trigger conditions (any match): - User wants codex to do something, give advice, or help review - User asks about codex's status or previous reply -Command selection: -- Default ask/collaborate -> `Bash(cask "", run_in_background=true)` - - Tell user "Codex processing (task: xxx)" then END your turn immediately +Command selection (choose based on task complexity): +- Simple questions (quick lookup, short answer, simple check) -> `cask-w ""` + - Examples: "what's the syntax for X", "is Y correct", "quick check on Z" + - Blocks until reply, then continue +- Complex tasks (review, analysis, multi-step, code generation) -> `Bash(cask "", run_in_background=true)` + - Examples: "review this code", "analyze the architecture", "help design X" + - Tell user "Codex processing (task: xxx)" then END your turn - When bash-notification arrives, show the task output -- Foreground ask (blocking) -> `cask-w ""` - Check connectivity -> `cping` - View previous reply -> `cpend` / `cpend N` Examples: -- "what does codex think" -> `Bash(cask "...", run_in_background=true)`, say "Codex processing", END turn -- "ask codex to review this" -> `Bash(cask "...", run_in_background=true)`, say "Codex processing", END turn +- "codex: what's the git command for X" -> `cask-w "..."` (simple, wait for reply) +- "ask codex to review this PR" -> `Bash(cask "...", run_in_background=true)`, END turn (complex) - "is codex alive" -> cping - "view codex reply" -> cpend @@ -698,8 +700,7 @@ Examples: Gemini is another AI assistant running in a separate terminal session (WezTerm, iTerm2 or tmux). When user intent involves asking/consulting/collaborating with Gemini: Fast path (minimize latency): -- If the user message starts with any of: `@gemini`, `gemini:`, `ask gemini`, `let gemini`, `/gask` then immediately run: - - `Bash(gask "", run_in_background=true)`, tell user task_id, then END your turn +- If the user message starts with any of: `@gemini`, `gemini:`, `ask gemini`, `let gemini`, `/gask` then immediately run based on complexity. - If user message is only the prefix (no content), ask a 1-line clarification for what to send. Trigger conditions (any match): @@ -707,17 +708,20 @@ Trigger conditions (any match): - User wants gemini to do something, give advice, or help review - User asks about gemini's status or previous reply -Command selection: -- Default ask/collaborate -> `Bash(gask "", run_in_background=true)` - - Tell user "Gemini processing (task: xxx)" then END your turn immediately +Command selection (choose based on task complexity): +- Simple questions (quick lookup, short answer, simple check) -> `gask-w ""` + - Examples: "what's the syntax for X", "is Y correct", "quick check on Z" + - Blocks until reply, then continue +- Complex tasks (review, analysis, multi-step, code generation) -> `Bash(gask "", run_in_background=true)` + - Examples: "review this code", "analyze the architecture", "help design X" + - Tell user "Gemini processing (task: xxx)" then END your turn - When bash-notification arrives, show the task output -- Foreground ask (blocking) -> `gask-w ""` - Check connectivity -> `gping` - View previous reply -> `gpend` / `gpend N` Examples: -- "what does gemini think" -> `Bash(gask "...", run_in_background=true)`, say "Gemini processing", END turn -- "ask gemini to review this" -> `Bash(gask "...", run_in_background=true)`, say "Gemini processing", END turn +- "gemini: what's the best practice for X" -> `gask-w "..."` (simple, wait for reply) +- "ask gemini to review this design" -> `Bash(gask "...", run_in_background=true)`, END turn (complex) - "is gemini alive" -> gping - "view gemini reply" -> gpend From 4268b21816dcc9ac015cb05d84bf6bd2283f44b4 Mon Sep 17 00:00:00 2001 From: bfly Date: Wed, 24 Dec 2025 00:34:37 +0800 Subject: [PATCH 056/153] fix(cpend): always check for newer session logs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - CodexLogReader.latest_message() now uses _latest_log() to detect newer sessions - CodexLogReader.latest_conversations() same fix - cpend fallback logic when stored session has no reply Fixes issue where cpend reads stale session when codex creates new session. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- bin/cpend | 19 +++++++++++-------- lib/codex_comm.py | 8 ++++---- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/bin/cpend b/bin/cpend index 3b72816..7aa5d7c 100755 --- a/bin/cpend +++ b/bin/cpend @@ -56,17 +56,20 @@ def main(argv: list[str]) -> int: try: n = _parse_n(argv) - # Must use session-specific log path from .codex-session + # Try session-specific log path first, fallback to scanning latest log_path = _load_session_log_path() - if not log_path: - print("❌ No .codex-session found in current directory", file=sys.stderr) - return EXIT_ERROR - if not log_path.exists(): - print(f"❌ Session log not found: {log_path}", file=sys.stderr) - return EXIT_ERROR - reader = CodexLogReader(log_path=log_path) + # If specified log has no reply, try scanning for latest + if log_path and log_path.exists(): + test_msg = reader.latest_message() + if not test_msg: + # Scan for latest log that might have replies + latest = reader._scan_latest() + if latest and latest != log_path: + reader.set_preferred_log(latest) + log_path = latest + if n > 1: conversations = reader.latest_conversations(n) if not conversations: diff --git a/lib/codex_comm.py b/lib/codex_comm.py index 4cb7728..52edf02 100644 --- a/lib/codex_comm.py +++ b/lib/codex_comm.py @@ -123,8 +123,8 @@ def try_get_message(self, state: Dict[str, Any]) -> Tuple[Optional[str], Dict[st def latest_message(self) -> Optional[str]: """Get the latest reply directly""" - # Use preferred log if set, otherwise scan for latest - log_path = self._preferred_log if self._preferred_log and self._preferred_log.exists() else self._latest_log() + # Always use _latest_log() to detect newer sessions + log_path = self._latest_log() if not log_path or not log_path.exists(): return None try: @@ -295,8 +295,8 @@ def _extract_user_message(entry: dict) -> Optional[str]: def latest_conversations(self, n: int = 1) -> List[Tuple[str, str]]: """Get the latest n conversations (question, reply) pairs""" - # Use preferred log if set, otherwise scan for latest - log_path = self._preferred_log if self._preferred_log and self._preferred_log.exists() else self._latest_log() + # Always use _latest_log() to detect newer sessions + log_path = self._latest_log() if not log_path or not log_path.exists(): return [] From fe91e90a6a09a8d105617a7a15692bdd5ab4a525 Mon Sep 17 00:00:00 2001 From: bfly Date: Wed, 24 Dec 2025 10:36:41 +0800 Subject: [PATCH 057/153] docs: update README v2.3 with bilingual support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Split into README.md (English) and README_zh.md (Chinese) - Add new slogan: Silky smooth collaboration - Add introduction section explaining multi-model benefits - Add command reference section with detailed usage - Update installation guide with platform-specific instructions - Add MCP/Skills uninstall reminder before installation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- README.md | 445 +++++++++------------------------------------------ README_zh.md | 164 +++++++++++++++++++ 2 files changed, 243 insertions(+), 366 deletions(-) create mode 100644 README_zh.md diff --git a/README.md b/README.md index 618e3e1..1b5d0d8 100644 --- a/README.md +++ b/README.md @@ -1,432 +1,151 @@
-# Claude Code Bridge (ccb) v2.1 +# Claude Code Bridge (ccb) v2.3 -**🌍 Cross-Platform Multi-AI Collaboration: Claude + Codex + Gemini** +**Silky Smooth Claude & Codex & Gemini Collaboration via Split-Pane Terminal** -**Windows | macOS | Linux — One Tool, All Platforms** +**Build a real AI expert team. Give Claude Code / Codex / Gemini partners that never forget.** -[![Version](https://img.shields.io/badge/version-2.2-orange.svg)]() +[![Version](https://img.shields.io/badge/version-2.3-orange.svg)]() [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) [![Platform](https://img.shields.io/badge/platform-Linux%20%7C%20macOS%20%7C%20Windows-lightgrey.svg)]() -[English](#english) | [中文](#中文) +**English** | [中文](README_zh.md) -Dual-pane demo (animated) - -

- Full demo video (GitHub Release) -

+Split-pane collaboration demo
--- -## 🎉 What's New in v2.1 - -> **🪟 Full Windows Support via [WezTerm](https://wezfurlong.org/wezterm/)** -> WezTerm is now the recommended terminal for all platforms. It's a powerful, cross-platform terminal with native split-pane support. Linux/macOS users: give it a try! tmux remains supported. +**Introduction:** Multi-model collaboration effectively avoids model bias, cognitive blind spots, and context limitations. However, MCP, Skills and other direct API approaches have many limitations. This project offers a new solution. -- **⚡ Faster Response** — Optimized send/receive latency, significantly faster than MCP -- **🐛 macOS Fixes** — Fixed session resume and various login issues -- **🔄 Easy Updates** — Run `ccb update` instead of re-cloning +## ⚡ Why ccb? -> Found a bug? Run `claude` in the project directory to debug, then share your `git diff` with the maintainer! +| Feature | Benefit | +| :--- | :--- | +| **🖥️ Visual & Controllable** | Multiple AI models in split-pane CLI. See everything, control everything. | +| **🧠 Persistent Context** | Each AI maintains its own memory. Close and resume anytime (`-r` flag). | +| **📉 Token Savings** | Sends lightweight prompts instead of full file history. | +| **🪟 Native Workflow** | Integrates directly into **WezTerm** (recommended) or tmux. No complex servers required. | --- -# English - -## Why This Project? - -Traditional MCP calls treat Codex as a **stateless executor**—Claude must feed full context every time. - -**ccb (Claude Code Bridge)** establishes a **persistent, lightweight channel** for sending/receiving small messages while each AI maintains its own context. - -### Division of Labor - -| Role | Responsibilities | -|------|------------------| -| **Claude Code** | Requirements analysis, architecture planning, code refactoring | -| **Codex** | Algorithm implementation, bug hunting, code review | -| **Gemini** | Research, alternative perspectives, verification | -| **ccb** | Session management, context isolation, communication bridge | - -### Official MCP vs Persistent Dual-Pane - -| Aspect | MCP (Official) | Persistent Dual-Pane | -|--------|----------------|----------------------| -| Codex State | Stateless | Persistent session | -| Context | Passed from Claude | Self-maintained | -| Token Cost | 5k-20k/call | 50-200/call (much faster) | -| Work Mode | Master-slave | Parallel | -| Recovery | Not possible | Supported (`-r`) | -| Multi-AI | Single target | Multiple backends | +## 🚀 Quick Start -> **Prefer MCP?** Check out [CodexMCP](https://github.com/GuDaStudio/codexmcp) — a more powerful MCP implementation with session context and multi-turn support. +> **⚠️ Before Install:** If you have Codex MCP or related skills installed in Claude, remove them first to avoid conflicts: +> ```bash +> claude mcp remove codex # Remove Codex MCP +> claude skills remove codex # Remove Codex skills (if any) +> ``` -
-Token Savings Explained +
+Linux / macOS -``` -MCP approach: - Claude → [full code + history + instructions] → Codex - Cost: 5,000-20,000 tokens/call - -Dual-pane approach (only sends/receives small messages): - Claude → "optimize utils.py" → Codex - Cost: 50-200 tokens/call - (Codex reads the file itself) +```bash +git clone https://github.com/bfly123/claude_code_bridge.git +cd claude_code_bridge +./install.sh install ```
-## Install +
+WSL (Windows Subsystem for Linux) ```bash +# Run inside WSL terminal git clone https://github.com/bfly123/claude_code_bridge.git cd claude_code_bridge ./install.sh install ``` -### Windows +Requires [WezTerm](https://wezfurlong.org/wezterm/) installed on Windows host. -- **WSL2 (recommended):** run the same commands inside WSL. -- **Native Windows (PowerShell/CMD):** use the wrappers: - - `install.cmd install` - - or `powershell -ExecutionPolicy Bypass -File .\\install.ps1 install` (you will be prompted for `BackendEnv`) -- **WezTerm-only (no tmux):** run `ccb` inside WezTerm, or set `CCB_TERMINAL=wezterm` (and if needed `CODEX_WEZTERM_BIN` to `wezterm.exe`). +
-### BackendEnv (Important for Windows/WSL) +
+Windows Native -ccb and codex/gemini must run in the same environment. Otherwise you may see: -- `exit code 127` (command not found) -- `cpend`/`gpend` cannot find replies (different session directories) +```powershell +git clone https://github.com/bfly123/claude_code_bridge.git +cd claude_code_bridge +powershell -ExecutionPolicy Bypass -File .\install.ps1 install +``` -Install-time selection is persisted to `ccb_config.json` (or override with `CCB_BACKEND_ENV`): -- `BackendEnv=wsl`: codex/gemini runs in WSL (recommended if you type `codex` inside a WSL shell). -- `BackendEnv=windows`: codex/gemini runs as native Windows CLI. +Requires [WezTerm](https://wezfurlong.org/wezterm/) installed. -## Start +
+### Run ```bash -ccb up codex # Start with Codex -ccb up gemini # Start with Gemini +ccb up codex # Start Codex +ccb up gemini # Start Gemini ccb up codex gemini # Start both -ccb up codex -r # Resume previous session -ccb up codex -a # Full permissions mode ``` -### Session Management +### Flags +| Flag | Description | Example | +| :--- | :--- | :--- | +| `-r` | Resume previous session context | `ccb up codex -r` | +| `-a` | Auto-mode, skip permission prompts | `ccb up codex -a` | +| `-h` | Show help information | `ccb -h` | +| `-v` | Show version and check for updates | `ccb -v` | +### Update ```bash -ccb status # Check backend status -ccb kill codex # Terminate session -ccb restore codex # Attach to running session -ccb update # Update to latest version +ccb update # Update ccb to the latest version ``` -> `-a` enables `--dangerously-skip-permissions` for Claude and `--full-auto` for Codex. -> `-r` resumes based on local dotfiles in the current directory (`.claude-session`, `.codex-session`, `.gemini-session`); delete them to reset. +--- -## Usage Examples +## 🗣️ Usage -### Practical Workflows -- "Have Codex review my code changes" -- "Ask Gemini for alternative approaches" -- "Codex plans the refactoring, supervises while I implement" -- "Codex writes backend API, I handle frontend" +Once started, collaborate naturally. Claude will detect when to delegate tasks. -### Fun & Creative +**Common Scenarios:** -> **🎴 Featured: AI Poker Night!** -> ``` -> "Let Claude, Codex and Gemini play Dou Di Zhu (斗地主)! -> You deal the cards, everyone plays open hand!" -> -> 🃏 Claude (Landlord) vs 🎯 Codex + 💎 Gemini (Farmers) -> ``` +- **Code Review:** *"Have Codex review the changes in `main.py`."* +- **Second Opinion:** *"Ask Gemini for alternative implementation approaches."* +- **Pair Programming:** *"Codex writes the backend logic, I'll handle the frontend."* +- **Architecture:** *"Let Codex design the module structure first."* +- **Info Exchange:** *"Fetch 3 rounds of Codex conversation and summarize."* -- "Play Gomoku with Codex" -- "Debate: tabs vs spaces" -- "Codex writes a function, Claude finds the bugs" +> **Note:** Manual commands (like `cask`, `cping`) are usually invoked by Claude automatically. See Command Reference for details. -### Advanced -- "Codex designs architecture, Claude implements modules" -- "Parallel code review from different angles" -- "Codex implements, Gemini reviews, Claude coordinates" - -## Commands (For Developers) +--- -> Most users don't need these—Claude auto-detects collaboration intent. +## 📝 Command Reference ### Codex Commands | Command | Description | -|---------|-------------| -| `cask ` | Sync wait (background-friendly) | -| `cask-w ` | Sync wait (foreground blocking) | -| `cpend [N]` | Show latest N replies from official logs | -| `cping` | Connectivity check | - -**cask** - Background-friendly sync wait (designed for `run_in_background=true`) -```bash -# Claude Code usage: -Bash(cask "review this code", run_in_background=true) -# Wait for bash-notification, then read task output - -# Terminal usage: -cask "what is the bug?" --timeout 60 -cask "analyze" --output /tmp/reply.txt -``` - -**cask-w** - Foreground blocking wait (for terminal/human use) -```bash -cask-w "explain this function" -# Blocks until reply, prints to stdout -``` - -**cpend** - Pure log reader (decoupled from cask) -```bash -cpend # Latest reply -cpend 3 # Latest 3 Q&A pairs -``` +| :--- | :--- | +| `/cask ` | Background mode: Submit task to Codex, free to continue other tasks (recommended) | +| `/cask-w ` | Foreground mode: Submit task and wait for response, faster but blocking | +| `cpend [N]` | Fetch Codex conversation history, N controls rounds (default 1) | +| `cping` | Test Codex connectivity | ### Gemini Commands | Command | Description | -|---------|-------------| -| `gask ` | Sync wait (background-friendly) | -| `gask-w ` | Sync wait (foreground blocking) | -| `gpend [N]` | Show latest N replies from official logs | -| `gping` | Connectivity check | - -Usage is identical to Codex commands above. - -## Requirements - -- Python 3.10+ -- tmux or WezTerm (at least one; WezTerm recommended) - -> **⚠️ Windows Users:** Always install WezTerm using the **native Windows .exe installer** from [wezfurlong.org/wezterm](https://wezfurlong.org/wezterm/), even if you use WSL. Do NOT install WezTerm inside WSL. After installation, configure WezTerm to connect to WSL via `wsl.exe` as the default shell. This ensures proper split-pane functionality. - -## Uninstall - -```bash -./install.sh uninstall -``` +| :--- | :--- | +| `/gask ` | Background mode: Submit task to Gemini | +| `/gask-w ` | Foreground mode: Submit task and wait for response | +| `gpend [N]` | Fetch Gemini conversation history | +| `gping` | Test Gemini connectivity | --- -# 中文 +## 📋 Requirements -## 🎉 v2.1 新特性 - -> **🪟 全面支持 Windows — 通过 [WezTerm](https://wezfurlong.org/wezterm/)** -> WezTerm 现已成为所有平台的推荐终端。它是一个强大的跨平台终端,原生支持分屏。Linux/macOS 用户也推荐使用!当然短期tmux仍然支持。 - -- **⚡ 响应更快** — 优化了发送/接收延迟,显著快于 MCP -- **🐛 macOS 修复** — 修复了会话恢复和各种登录问题 -- **🔄 一键更新** — 运行 `ccb update` 即可更新,无需重新拉取安装 - -> 发现 bug?在项目目录运行 `claude` 调试,然后将 `git diff` 发给作者更新到主分支! +- **Python 3.10+** +- **Terminal:** [WezTerm](https://wezfurlong.org/wezterm/) (Highly Recommended) or tmux --- -## 界面截图 - -
- 双窗口协作界面 -
- -
- 动图预览 -
- - - ---- - -## 为什么需要这个项目? - -传统 MCP 调用把 Codex 当作**无状态执行器**——Claude 每次都要传递完整上下文。 - -**ccb (Claude Code Bridge)** 建立**持久通道** 轻量级发送和抓取信息, AI间各自维护独立上下文。 - -### 分工协作 - -| 角色 | 职责 | -|------|------| -| **Claude Code** | 需求分析、架构规划、代码重构 | -| **Codex** | 算法实现、bug 定位、代码审查 | -| **Gemini** | 研究、多角度分析、验证 | -| **ccb** | 会话管理、上下文隔离、通信桥接 | - -### 官方 MCP vs 持久双窗口 - -| 维度 | MCP(官方方案) | 持久双窗口 | -|------|----------------|-----------| -| Codex 状态 | 无记忆 | 持久会话 | -| 上下文 | Claude 传递 | 各自维护 | -| Token 消耗 | 5k-20k/次 | 50-200/次(速度显著提升) | -| 工作模式 | 主从 | 并行协作 | -| 会话恢复 | 不支持 | 支持 (`-r`) | -| 多AI | 单目标 | 多后端 | - -> **偏好 MCP?** 推荐 [CodexMCP](https://github.com/GuDaStudio/codexmcp) — 更强大的 MCP 实现,支持会话上下文和多轮对话。 - -
-Token 节省原理 - -``` -MCP 方式: - Claude → [完整代码 + 历史 + 指令] → Codex - 消耗:5,000-20,000 tokens/次 - -双窗口方式(每次仅发送和抓取少量信息): - Claude → "优化 utils.py" → Codex - 消耗:50-200 tokens/次 - (Codex 自己读取文件) -``` - -
- -## 安装 - -```bash -git clone https://github.com/bfly123/claude_code_bridge.git -cd claude_code_bridge -./install.sh install -``` - -### Windows - -- **推荐 WSL2:** 在 WSL 内执行上面的命令即可。 -- **原生 Windows(PowerShell/CMD):** 使用包装脚本: - - `install.cmd install` - - 或 `powershell -ExecutionPolicy Bypass -File .\\install.ps1 install`(会提示选择 `BackendEnv`) -- **仅 WezTerm(无 tmux):** 建议在 WezTerm 中运行 `ccb`,或设置 `CCB_TERMINAL=wezterm`(必要时设置 `CODEX_WEZTERM_BIN=wezterm.exe`)。 - -### BackendEnv(Windows/WSL 必看) - -`ccb/cask` / `ccb/gask` 必须和 `codex/gemini` 在同一环境运行,否则可能出现: -- `exit code 127`(找不到命令) -- `cpend/gpend` 读不到回复(会话目录不同) - -安装时的选择会写入 `ccb_config.json`(也可用环境变量 `CCB_BACKEND_ENV` 覆盖): -- `BackendEnv=wsl`:codex/gemini 安装并运行在 WSL(如果你是在 WSL 里直接输入 `codex` 的场景,推荐选这个) -- `BackendEnv=windows`:codex/gemini 为 Windows 原生 CLI - - - - -## 启动 - -```bash -ccb up codex # 启动 Codex -ccb up gemini # 启动 Gemini -ccb up codex gemini # 同时启动 -ccb up codex -r # 恢复上次会话 -ccb up codex -a # 最高权限模式 -``` - -### 会话管理 - -```bash -ccb status # 检查后端状态 -ccb kill codex # 终止会话 -ccb restore codex # 连接到运行中的会话 -ccb update # 更新到最新版本 -``` - -> `-a` 为 Claude 启用 `--dangerously-skip-permissions`,Codex 启用 `--full-auto`。 -> `-r` 基于当前目录下的本地文件恢复(`.claude-session/.codex-session/.gemini-session`);删除这些文件即可重置。 - -## 使用示例 - -### 实用场景 -- "让 Codex 审查我的代码修改" -- "问问 Gemini 有没有其他方案" -- "Codex 规划重构方案,我来实现它监督" -- "Codex 写后端 API,我写前端" - -### 趣味玩法 - -> **🎴 特色玩法:AI 棋牌之夜!** -> ``` -> "让 Claude、Codex 和 Gemini 来一局斗地主! -> 你来发牌,大家明牌玩!" -> -> 🃏 Claude (地主) vs 🎯 Codex + 💎 Gemini (农民) -> ``` - -- "和 Codex 下五子棋" -- "辩论:Tab vs 空格" -- "Codex 写函数,Claude 找 bug" - -### 进阶工作流 -- "Codex 设计架构,Claude 实现各模块" -- "两个 AI 从不同角度并行 Code Review" -- "Codex 实现,Gemini 审查,Claude 协调" - -## 命令(开发者使用) - -> 普通用户无需使用这些命令——Claude 会自动检测协作意图。 - -### Codex 命令 - -| 命令 | 说明 | -|------|------| -| `cask <消息>` | 同步等待(适合后台任务) | -| `cask-w <消息>` | 同步等待(前台阻塞) | -| `cpend [N]` | 从官方日志读取最近 N 条回复 | -| `cping` | 测试连通性 | - -**cask** - 后台友好的同步等待(配合 `run_in_background=true` 使用) -```bash -# Claude Code 中使用: -Bash(cask "review this code", run_in_background=true) -# 等待 bash-notification,然后读取 task output - -# 终端中使用: -cask "这个bug是什么?" --timeout 60 -cask "分析代码" --output /tmp/reply.txt -``` - -**cask-w** - 前台阻塞等待(适合终端/人工使用) -```bash -cask-w "解释这个函数" -# 阻塞直到收到回复,输出到 stdout -``` - -**cpend** - 纯日志读取器(与 cask 完全解耦) -```bash -cpend # 最新一条回复 -cpend 3 # 最近 3 组问答 -``` - -### Gemini 命令 - -| 命令 | 说明 | -|------|------| -| `gask <消息>` | 同步等待(适合后台任务) | -| `gask-w <消息>` | 同步等待(前台阻塞) | -| `gpend [N]` | 从官方日志读取最近 N 条回复 | -| `gping` | 测试连通性 | - -用法与 Codex 命令相同。 - -## 依赖 - -- Python 3.10+ -- tmux 或 WezTerm(至少安装一个),强烈推荐 WezTerm - -> **⚠️ Windows 用户注意:** 必须使用 **Windows 原生 .exe 安装包** 安装 WezTerm([下载地址](https://wezfurlong.org/wezterm/)),即使你使用 WSL 也是如此。**不要在 WSL 内部安装 WezTerm**。安装完成后,可在 WezTerm 设置中将默认 shell 配置为 `wsl.exe`,即可无缝接入 WSL 环境,同时保证分屏功能正常工作。 - -## 卸载 +## 🗑️ Uninstall ```bash ./install.sh uninstall @@ -436,12 +155,6 @@ cpend 3 # 最近 3 组问答
-**WSL2 supported** | WSL1 not supported (FIFO limitation) - ---- - -**测试用户群,欢迎大佬们** - -WeChat Group +**Windows fully supported** (WSL + Native via WezTerm)
diff --git a/README_zh.md b/README_zh.md new file mode 100644 index 0000000..b3c0610 --- /dev/null +++ b/README_zh.md @@ -0,0 +1,164 @@ +
+ +# Claude Code Bridge (ccb) v2.3 + +**基于终端分屏的 Claude & Codex & Gemini 丝滑协作工具** + +**打造真实的大模型专家协作团队,给 Claude Code / Codex / Gemini 配上"不会遗忘"的搭档** + +[![Version](https://img.shields.io/badge/version-2.3-orange.svg)]() +[![Platform](https://img.shields.io/badge/platform-Linux%20%7C%20macOS%20%7C%20Windows-lightgrey.svg)]() + +[English](README.md) | **中文** + +双窗口协作演示 + +
+ +--- + +**简介:** 多模型协作能够有效避免模型偏见、认知漏洞和上下文限制,然而 MCP、Skills 等直接调用 API 方式存在诸多局限性。本项目打造了一套新的方案。 + +## ⚡ 核心优势 + +| 特性 | 价值 | +| :--- | :--- | +| **🖥️ 可见可控** | 多模型分屏 CLI 挂载,所见即所得,完全掌控。 | +| **🧠 持久上下文** | 每个 AI 独立记忆,关闭后可随时恢复(`-r` 参数)。 | +| **📉 节省 Token** | 仅发送轻量级指令,而非整个代码库历史 (~20k tokens)。 | +| **🪟 原生终端体验** | 直接集成于 **WezTerm** (推荐) 或 tmux,无需配置复杂的服务器。 | + +--- + +## 🚀 快速开始 + +> **⚠️ 安装前提示:** 如果你在 Claude 中安装了 Codex MCP 或相关 skills,请先卸载以避免冲突: +> ```bash +> claude mcp remove codex # 卸载 Codex MCP +> claude skills remove codex # 卸载 Codex skills(如有) +> ``` + +
+Linux / macOS + +```bash +git clone https://github.com/bfly123/claude_code_bridge.git +cd claude_code_bridge +./install.sh install +``` + +
+ +
+WSL (Windows 子系统) + +```bash +# 在 WSL 终端中运行 +git clone https://github.com/bfly123/claude_code_bridge.git +cd claude_code_bridge +./install.sh install +``` + +需要在 Windows 宿主机上安装 [WezTerm](https://wezfurlong.org/wezterm/)。 + +
+ +
+Windows 原生 + +```powershell +git clone https://github.com/bfly123/claude_code_bridge.git +cd claude_code_bridge +powershell -ExecutionPolicy Bypass -File .\install.ps1 install +``` + +需要安装 [WezTerm](https://wezfurlong.org/wezterm/)。 + +
+ +### 启动 +```bash +ccb up codex # 启动 Codex +ccb up gemini # 启动 Gemini +ccb up codex gemini # 同时启动两个 +``` + +### 常用参数 +| 参数 | 说明 | 示例 | +| :--- | :--- | :--- | +| `-r` | 恢复上次会话上下文 | `ccb up codex -r` | +| `-a` | 全自动模式,跳过权限确认 | `ccb up codex -a` | +| `-h` | 查看详细帮助信息 | `ccb -h` | +| `-v` | 查看当前版本和检测更新 | `ccb -v` | + +### 后续更新 +```bash +ccb update # 更新 ccb 到最新版本 +``` + +--- + +## 🗣️ 使用场景 + +安装完成后,直接用自然语言与 Claude 对话即可,它会自动检测并分派任务。 + +**常见用法:** + +- **代码审查**:*"让 Codex 帮我 Review 一下 `main.py` 的改动。"* +- **多维咨询**:*"问问 Gemini 有没有更好的实现方案。"* +- **结对编程**:*"Codex 负责写后端逻辑,我来写前端。"* +- **架构设计**:*"让 Codex 先设计一下这个模块的结构。"* +- **信息交互**:*"调取 Codex 3 轮对话,并加以总结"* + +> **提示:** 底层命令 (`cask`, `cping` 等) 通常由 Claude 自动调用,需要显式调用见命令详情。 + +--- + +## 📝 命令详情 + +### Codex 命令 + +| 命令 | 说明 | +| :--- | :--- | +| `/cask <消息>` | 后台模式:提交任务给 Codex,前台释放可继续其他任务(推荐) | +| `/cask-w <消息>` | 前台模式:提交任务并等待返回,响应更快但会阻塞 | +| `cpend [N]` | 调取当前 Codex 会话的对话记录,N 控制轮数(默认 1) | +| `cping` | 测试 Codex 连通性 | + +### Gemini 命令 + +| 命令 | 说明 | +| :--- | :--- | +| `/gask <消息>` | 后台模式:提交任务给 Gemini | +| `/gask-w <消息>` | 前台模式:提交任务并等待返回 | +| `gpend [N]` | 调取当前 Gemini 会话的对话记录 | +| `gping` | 测试 Gemini 连通性 | + +--- + +## 📋 环境要求 + +- **Python 3.10+** +- **终端软件:** [WezTerm](https://wezfurlong.org/wezterm/) (强烈推荐) 或 tmux + +--- + +## 🗑️ 卸载 + +```bash +./install.sh uninstall +``` + +--- + +
+ +**Windows 完全支持** (WSL + 原生 Windows 均通过 WezTerm) + +--- + +**测试用户群,欢迎加入** + +微信群 + +
From 7d1063495678131e0d211432be9a46a15452490d Mon Sep 17 00:00:00 2001 From: bfly Date: Wed, 24 Dec 2025 10:39:19 +0800 Subject: [PATCH 058/153] docs: add AI Poker Night example to Usage section MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- README.md | 6 ++++++ README_zh.md | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/README.md b/README.md index 1b5d0d8..8d6cfe1 100644 --- a/README.md +++ b/README.md @@ -112,6 +112,12 @@ Once started, collaborate naturally. Claude will detect when to delegate tasks. - **Architecture:** *"Let Codex design the module structure first."* - **Info Exchange:** *"Fetch 3 rounds of Codex conversation and summarize."* +### 🎴 Fun & Creative: AI Poker Night! + +> *"Let Claude, Codex and Gemini play Dou Di Zhu (斗地主)! You deal the cards, everyone plays open hand!"* +> +> 🃏 Claude (Landlord) vs 🎯 Codex + 💎 Gemini (Farmers) + > **Note:** Manual commands (like `cask`, `cping`) are usually invoked by Claude automatically. See Command Reference for details. --- diff --git a/README_zh.md b/README_zh.md index b3c0610..bf0fea8 100644 --- a/README_zh.md +++ b/README_zh.md @@ -110,6 +110,12 @@ ccb update # 更新 ccb 到最新版本 - **架构设计**:*"让 Codex 先设计一下这个模块的结构。"* - **信息交互**:*"调取 Codex 3 轮对话,并加以总结"* +### 🎴 趣味玩法:AI 棋牌之夜! + +> *"让 Claude、Codex 和 Gemini 来一局斗地主!你来发牌,大家明牌玩!"* +> +> 🃏 Claude (地主) vs 🎯 Codex + 💎 Gemini (农民) + > **提示:** 底层命令 (`cask`, `cping` 等) 通常由 Claude 自动调用,需要显式调用见命令详情。 --- From 30cc741a153034d1120d7ba27387e1f15bd95575 Mon Sep 17 00:00:00 2001 From: bfly Date: Wed, 24 Dec 2025 12:48:37 +0800 Subject: [PATCH 059/153] docs: add Neovim integration example to README MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add nvim.png screenshot showing editor + multi-AI review workflow - Update both English and Chinese README with editor integration section 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- README.md | 6 ++++++ README_zh.md | 6 ++++++ assets/nvim.png | Bin 0 -> 331200 bytes 3 files changed, 12 insertions(+) create mode 100644 assets/nvim.png diff --git a/README.md b/README.md index 8d6cfe1..b61c59f 100644 --- a/README.md +++ b/README.md @@ -112,6 +112,12 @@ Once started, collaborate naturally. Claude will detect when to delegate tasks. - **Architecture:** *"Let Codex design the module structure first."* - **Info Exchange:** *"Fetch 3 rounds of Codex conversation and summarize."* +### 🖥️ Editor Integration: Neovim + Multi-AI Review + +Neovim integration with multi-AI code review + +> Combine with editors like **Neovim** for seamless code editing and multi-model review workflow. Edit in your favorite editor while AI assistants review and suggest improvements in real-time. + ### 🎴 Fun & Creative: AI Poker Night! > *"Let Claude, Codex and Gemini play Dou Di Zhu (斗地主)! You deal the cards, everyone plays open hand!"* diff --git a/README_zh.md b/README_zh.md index bf0fea8..cf5e8ed 100644 --- a/README_zh.md +++ b/README_zh.md @@ -110,6 +110,12 @@ ccb update # 更新 ccb 到最新版本 - **架构设计**:*"让 Codex 先设计一下这个模块的结构。"* - **信息交互**:*"调取 Codex 3 轮对话,并加以总结"* +### 🖥️ 编辑器集成:Neovim + 多模型代码审查 + +Neovim 集成多模型代码审查 + +> 结合 **Neovim** 等编辑器,实现无缝的代码编辑与多模型审查工作流。在你喜欢的编辑器中编写代码,AI 助手实时审查并提供改进建议。 + ### 🎴 趣味玩法:AI 棋牌之夜! > *"让 Claude、Codex 和 Gemini 来一局斗地主!你来发牌,大家明牌玩!"* diff --git a/assets/nvim.png b/assets/nvim.png new file mode 100644 index 0000000000000000000000000000000000000000..b22e4def5b92bbcf00ca00dc67cd3f72f6e4b75d GIT binary patch literal 331200 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⪚64QZMmLx_llNi0|T_0CS@ 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ૃhnYw|)UbJaVGN)_2<~*07)Oh%! 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

WSL (Windows Subsystem for Linux) +> **Note:** Install [WezTerm](https://wezfurlong.org/wezterm/) native `.exe` on Windows host. Choose installer based on your Claude/Codex/Gemini environment: if running in WSL, use `install.sh`. + ```bash # Run inside WSL terminal git clone https://github.com/bfly123/claude_code_bridge.git @@ -61,21 +63,19 @@ cd claude_code_bridge ./install.sh install ``` -Requires [WezTerm](https://wezfurlong.org/wezterm/) installed on Windows host. -
Windows Native +> **Note:** Install [WezTerm](https://wezfurlong.org/wezterm/) native `.exe` version. Choose installer based on your Claude/Codex/Gemini environment: if running natively on Windows, use `install.ps1`. + ```powershell git clone https://github.com/bfly123/claude_code_bridge.git cd claude_code_bridge powershell -ExecutionPolicy Bypass -File .\install.ps1 install ``` -Requires [WezTerm](https://wezfurlong.org/wezterm/) installed. -
### Run diff --git a/README_zh.md b/README_zh.md index cf5e8ed..6f7409b 100644 --- a/README_zh.md +++ b/README_zh.md @@ -52,6 +52,8 @@ cd claude_code_bridge
WSL (Windows 子系统) +> **提示:** 请在 Windows 宿主机上安装 [WezTerm](https://wezfurlong.org/wezterm/) 原生 `.exe` 版本。根据你的 Claude/Codex/Gemini 运行环境选择安装脚本:如果在 WSL 中运行,请使用 `install.sh`。 + ```bash # 在 WSL 终端中运行 git clone https://github.com/bfly123/claude_code_bridge.git @@ -59,21 +61,19 @@ cd claude_code_bridge ./install.sh install ``` -需要在 Windows 宿主机上安装 [WezTerm](https://wezfurlong.org/wezterm/)。 -
Windows 原生 +> **提示:** 请安装 [WezTerm](https://wezfurlong.org/wezterm/) 原生 `.exe` 版本。根据你的 Claude/Codex/Gemini 运行环境选择安装脚本:如果在 Windows 原生环境运行,请使用 `install.ps1`。 + ```powershell git clone https://github.com/bfly123/claude_code_bridge.git cd claude_code_bridge powershell -ExecutionPolicy Bypass -File .\install.ps1 install ``` -需要安装 [WezTerm](https://wezfurlong.org/wezterm/)。 -
### 启动 From da356772bc8a106eb6cdb8116c29b6ecb485b23f Mon Sep 17 00:00:00 2001 From: bfly Date: Wed, 24 Dec 2025 15:37:36 +0800 Subject: [PATCH 063/153] docs: restructure install steps with WezTerm first --- README.md | 12 +++++------- README_zh.md | 12 +++++------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 6f13f5f..efcf0e1 100644 --- a/README.md +++ b/README.md @@ -34,11 +34,9 @@ ## 🚀 Quick Start -> **⚠️ Before Install:** If you have Codex MCP or related skills installed in Claude, remove them first to avoid conflicts: -> ```bash -> claude mcp remove codex # Remove Codex MCP -> claude skills remove codex # Remove Codex skills (if any) -> ``` +**Step 1:** Install [WezTerm](https://wezfurlong.org/wezterm/) (native `.exe` for Windows) + +**Step 2:** Choose installer based on your environment:
Linux / macOS @@ -54,7 +52,7 @@ cd claude_code_bridge
WSL (Windows Subsystem for Linux) -> **Note:** Install [WezTerm](https://wezfurlong.org/wezterm/) native `.exe` on Windows host. Choose installer based on your Claude/Codex/Gemini environment: if running in WSL, use `install.sh`. +> Use this if your Claude/Codex/Gemini runs in WSL. ```bash # Run inside WSL terminal @@ -68,7 +66,7 @@ cd claude_code_bridge
Windows Native -> **Note:** Install [WezTerm](https://wezfurlong.org/wezterm/) native `.exe` version. Choose installer based on your Claude/Codex/Gemini environment: if running natively on Windows, use `install.ps1`. +> Use this if your Claude/Codex/Gemini runs natively on Windows. ```powershell git clone https://github.com/bfly123/claude_code_bridge.git diff --git a/README_zh.md b/README_zh.md index 6f7409b..510a901 100644 --- a/README_zh.md +++ b/README_zh.md @@ -32,11 +32,9 @@ ## 🚀 快速开始 -> **⚠️ 安装前提示:** 如果你在 Claude 中安装了 Codex MCP 或相关 skills,请先卸载以避免冲突: -> ```bash -> claude mcp remove codex # 卸载 Codex MCP -> claude skills remove codex # 卸载 Codex skills(如有) -> ``` +**第一步:** 安装 [WezTerm](https://wezfurlong.org/wezterm/)(Windows 请安装原生 `.exe` 版本) + +**第二步:** 根据你的环境选择安装脚本:
Linux / macOS @@ -52,7 +50,7 @@ cd claude_code_bridge
WSL (Windows 子系统) -> **提示:** 请在 Windows 宿主机上安装 [WezTerm](https://wezfurlong.org/wezterm/) 原生 `.exe` 版本。根据你的 Claude/Codex/Gemini 运行环境选择安装脚本:如果在 WSL 中运行,请使用 `install.sh`。 +> 如果你的 Claude/Codex/Gemini 运行在 WSL 中,请使用此方式。 ```bash # 在 WSL 终端中运行 @@ -66,7 +64,7 @@ cd claude_code_bridge
Windows 原生 -> **提示:** 请安装 [WezTerm](https://wezfurlong.org/wezterm/) 原生 `.exe` 版本。根据你的 Claude/Codex/Gemini 运行环境选择安装脚本:如果在 Windows 原生环境运行,请使用 `install.ps1`。 +> 如果你的 Claude/Codex/Gemini 运行在 Windows 原生环境,请使用此方式。 ```powershell git clone https://github.com/bfly123/claude_code_bridge.git From a64aa60fe9221f533e4e4c7987ac1308bf7305c7 Mon Sep 17 00:00:00 2001 From: bfly Date: Wed, 24 Dec 2025 15:40:15 +0800 Subject: [PATCH 064/153] docs: move Editor Integration section before Requirements --- README.md | 14 ++++++++------ README_zh.md | 14 ++++++++------ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index efcf0e1..d1470dd 100644 --- a/README.md +++ b/README.md @@ -110,12 +110,6 @@ Once started, collaborate naturally. Claude will detect when to delegate tasks. - **Architecture:** *"Let Codex design the module structure first."* - **Info Exchange:** *"Fetch 3 rounds of Codex conversation and summarize."* -### 🖥️ Editor Integration: Neovim + Multi-AI Review - -Neovim integration with multi-AI code review - -> Combine with editors like **Neovim** for seamless code editing and multi-model review workflow. Edit in your favorite editor while AI assistants review and suggest improvements in real-time. - ### 🎴 Fun & Creative: AI Poker Night! > *"Let Claude, Codex and Gemini play Dou Di Zhu (斗地主)! You deal the cards, everyone plays open hand!"* @@ -148,6 +142,14 @@ Once started, collaborate naturally. Claude will detect when to delegate tasks. --- +## 🖥️ Editor Integration: Neovim + Multi-AI Review + +Neovim integration with multi-AI code review + +> Combine with editors like **Neovim** for seamless code editing and multi-model review workflow. Edit in your favorite editor while AI assistants review and suggest improvements in real-time. + +--- + ## 📋 Requirements - **Python 3.10+** diff --git a/README_zh.md b/README_zh.md index 510a901..e645288 100644 --- a/README_zh.md +++ b/README_zh.md @@ -108,12 +108,6 @@ ccb update # 更新 ccb 到最新版本 - **架构设计**:*"让 Codex 先设计一下这个模块的结构。"* - **信息交互**:*"调取 Codex 3 轮对话,并加以总结"* -### 🖥️ 编辑器集成:Neovim + 多模型代码审查 - -Neovim 集成多模型代码审查 - -> 结合 **Neovim** 等编辑器,实现无缝的代码编辑与多模型审查工作流。在你喜欢的编辑器中编写代码,AI 助手实时审查并提供改进建议。 - ### 🎴 趣味玩法:AI 棋牌之夜! > *"让 Claude、Codex 和 Gemini 来一局斗地主!你来发牌,大家明牌玩!"* @@ -146,6 +140,14 @@ ccb update # 更新 ccb 到最新版本 --- +## 🖥️ 编辑器集成:Neovim + 多模型代码审查 + +Neovim 集成多模型代码审查 + +> 结合 **Neovim** 等编辑器,实现无缝的代码编辑与多模型审查工作流。在你喜欢的编辑器中编写代码,AI 助手实时审查并提供改进建议。 + +--- + ## 📋 环境要求 - **Python 3.10+** From e760ce906ef74997aabb8f6024f52cef16b057c2 Mon Sep 17 00:00:00 2001 From: masfrank <63950204+masfrank@users.noreply.github.com> Date: Wed, 24 Dec 2025 18:39:06 +0800 Subject: [PATCH 065/153] fix(install): use ProcessStartInfo for Python version detection Replace direct process invocation with ProcessStartInfo to properly handle stdout/stderr redirection and exit codes in Require-Python310 function. --- install.ps1 | 49 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/install.ps1 b/install.ps1 index 06cdfcb..a4a0cba 100644 --- a/install.ps1 +++ b/install.ps1 @@ -92,21 +92,48 @@ function Find-Python { function Require-Python310 { param([string]$PythonCmd) - $parts = $PythonCmd -split " " | Where-Object { $_ } - $exe = $parts[0] - $args = @() - if ($parts.Length -gt 1) { - $args = $parts[1..($parts.Length - 1)] - } + # Handle commands with arguments (e.g., "py -3") + $cmdParts = $PythonCmd -split ' ', 2 + $fileName = $cmdParts[0] + $baseArgs = if ($cmdParts.Length -gt 1) { $cmdParts[1] } else { "" } + # Use ProcessStartInfo for reliable execution across different Python installations + # (e.g., Miniconda, custom paths). The & operator can fail in some environments. try { - $vinfo = & $exe @args -c "import sys; v=sys.version_info; print(f'{v.major}.{v.minor}.{v.micro} {v.major} {v.minor}')" - $parts = $vinfo.Trim() -split " " - $version = $parts[0] - $major = [int]$parts[1] - $minor = [int]$parts[2] + $psi = New-Object System.Diagnostics.ProcessStartInfo + $psi.FileName = $fileName + # Combine base arguments with Python code arguments + if ($baseArgs) { + $psi.Arguments = "$baseArgs -c `"import sys; v=sys.version_info; print(f'{v.major}.{v.minor}.{v.micro} {v.major} {v.minor}')`"" + } else { + $psi.Arguments = "-c `"import sys; v=sys.version_info; print(f'{v.major}.{v.minor}.{v.micro} {v.major} {v.minor}')`"" + } + $psi.RedirectStandardOutput = $true + $psi.RedirectStandardError = $true + $psi.UseShellExecute = $false + $psi.CreateNoWindow = $true + + $process = New-Object System.Diagnostics.Process + $process.StartInfo = $psi + $process.Start() | Out-Null + $process.WaitForExit() + + $vinfo = $process.StandardOutput.ReadToEnd().Trim() + if ($process.ExitCode -ne 0 -or [string]::IsNullOrEmpty($vinfo)) { + throw $process.StandardError.ReadToEnd() + } + + $vparts = $vinfo -split " " + if ($vparts.Length -lt 3) { + throw "Unexpected version output: $vinfo" + } + + $version = $vparts[0] + $major = [int]$vparts[1] + $minor = [int]$vparts[2] } catch { Write-Host "[ERROR] Failed to query Python version using: $PythonCmd" + Write-Host " Error details: $_" exit 1 } From bb97683002871e2403170211332560f52b443f9e Mon Sep 17 00:00:00 2001 From: hanson mei Date: Fri, 26 Dec 2025 11:50:34 +0800 Subject: [PATCH 066/153] Fix log readers project scoping --- lib/codex_comm.py | 33 ++++++++++++++++++++++++++++++++- lib/gemini_comm.py | 3 +-- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/lib/codex_comm.py b/lib/codex_comm.py index 52edf02..f0d0cb1 100644 --- a/lib/codex_comm.py +++ b/lib/codex_comm.py @@ -32,10 +32,12 @@ class CodexLogReader: """Reads Codex official logs from ~/.codex/sessions""" - def __init__(self, root: Path = SESSION_ROOT, log_path: Optional[Path] = None, session_id_filter: Optional[str] = None): + def __init__(self, root: Path = SESSION_ROOT, log_path: Optional[Path] = None, + session_id_filter: Optional[str] = None, work_dir: Optional[Path] = None): self.root = Path(root).expanduser() self._preferred_log = self._normalize_path(log_path) self._session_id_filter = session_id_filter + self._work_dir = self._normalize_work_dir(work_dir) try: poll = float(os.environ.get("CODEX_POLL_INTERVAL", "0.05")) except Exception: @@ -45,6 +47,31 @@ def __init__(self, root: Path = SESSION_ROOT, log_path: Optional[Path] = None, s def set_preferred_log(self, log_path: Optional[Path]) -> None: self._preferred_log = self._normalize_path(log_path) + def _normalize_work_dir(self, work_dir: Optional[Path]) -> Optional[str]: + """Normalize work_dir for comparison with cwd in session logs""" + if work_dir is None: + work_dir = Path.cwd() + try: + return str(work_dir.resolve()).lower() + except Exception: + return None + + def _extract_cwd_from_log(self, log_path: Path) -> Optional[str]: + """Extract cwd from session_meta in the first line of log file""" + try: + with log_path.open("r", encoding="utf-8") as f: + first_line = f.readline() + if not first_line: + return None + entry = json.loads(first_line) + if entry.get("type") == "session_meta": + cwd = entry.get("payload", {}).get("cwd") + if cwd: + return str(Path(cwd).resolve()).lower() + except Exception: + pass + return None + def _normalize_path(self, value: Optional[Any]) -> Optional[Path]: if value in (None, ""): return None @@ -63,6 +90,10 @@ def _scan_latest(self) -> Optional[Path]: latest: Optional[Path] = None latest_mtime = -1.0 for p in (p for p in self.root.glob("**/*.jsonl") if p.is_file()): + if self._work_dir: + cwd = self._extract_cwd_from_log(p) + if not cwd or cwd != self._work_dir: + continue try: mtime = p.stat().st_mtime except OSError: diff --git a/lib/gemini_comm.py b/lib/gemini_comm.py index f9f8c09..a509812 100755 --- a/lib/gemini_comm.py +++ b/lib/gemini_comm.py @@ -89,8 +89,7 @@ def _scan_latest_session(self) -> Optional[Path]: if sessions: return sessions[-1] - # fallback: projectHash may mismatch due to path normalization differences (Windows/WSL, symlinks, etc.) - return self._scan_latest_session_any_project() + return None def _latest_session(self) -> Optional[Path]: preferred = self._preferred_session From 65b354f264201a5b59ddd8abe5477274cac72530 Mon Sep 17 00:00:00 2001 From: bfly Date: Fri, 26 Dec 2025 16:25:43 +0800 Subject: [PATCH 067/153] docs: update wechat image to png format MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- README_zh.md | 2 +- assets/wechat.jpg | Bin 307518 -> 146111 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/README_zh.md b/README_zh.md index e645288..948690f 100644 --- a/README_zh.md +++ b/README_zh.md @@ -171,6 +171,6 @@ ccb update # 更新 ccb 到最新版本 **测试用户群,欢迎加入** -微信群 +微信群 diff --git a/assets/wechat.jpg b/assets/wechat.jpg index b907ca288bce5b8dd571db7bf4fc1e81e070114e..2a08982f91bd6b6559734a2d9b8d809bba3c9777 100644 GIT binary patch literal 146111 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

%?^L>(M<{z!N(2+!t{WH^2;Ut|dEc+P#X? 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


BJ@y>t6`O! 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

r4mhdBHia0gG$RS8zy#uMn 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

@9ocM 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 >*JuBDK2 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�|I^;FKIKymNY>nX}Pql)ajQN@wD)RfmR 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 z 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 VI>v1 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 From 7ba927ad0e30172b340ac8c91b08eff040cb86de Mon Sep 17 00:00:00 2001 From: bfly Date: Fri, 26 Dec 2025 16:47:12 +0800 Subject: [PATCH 068/153] refactor: simplify ccb command selection rules MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove simple/complex task distinction - Default to cask/gask with run_in_background - cask-w/gask-w only for explicit sync requests 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- install.sh | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/install.sh b/install.sh index f540f89..49c922c 100755 --- a/install.sh +++ b/install.sh @@ -717,20 +717,14 @@ Trigger conditions (any match): - User wants codex to do something, give advice, or help review - User asks about codex's status or previous reply -Command selection (choose based on task complexity): -- Simple questions (quick lookup, short answer, simple check) -> `cask-w ""` - - Examples: "what's the syntax for X", "is Y correct", "quick check on Z" - - Blocks until reply, then continue -- Complex tasks (review, analysis, multi-step, code generation) -> `Bash(cask "", run_in_background=true)` - - Examples: "review this code", "analyze the architecture", "help design X" - - Tell user "Codex processing (task: xxx)" then END your turn - - When bash-notification arrives, show the task output +Command selection: +- Send question -> `Bash(cask "", run_in_background=true)`, tell user "Codex processing (task: xxx)" then END your turn - Check connectivity -> `cping` - View previous reply -> `cpend` / `cpend N` +- Explicit sync mode -> `cask-w ""` (only when user explicitly requests) Examples: -- "codex: what's the git command for X" -> `cask-w "..."` (simple, wait for reply) -- "ask codex to review this PR" -> `Bash(cask "...", run_in_background=true)`, END turn (complex) +- "ask codex about X" -> `Bash(cask "...", run_in_background=true)`, END turn - "is codex alive" -> cping - "view codex reply" -> cpend @@ -746,20 +740,14 @@ Trigger conditions (any match): - User wants gemini to do something, give advice, or help review - User asks about gemini's status or previous reply -Command selection (choose based on task complexity): -- Simple questions (quick lookup, short answer, simple check) -> `gask-w ""` - - Examples: "what's the syntax for X", "is Y correct", "quick check on Z" - - Blocks until reply, then continue -- Complex tasks (review, analysis, multi-step, code generation) -> `Bash(gask "", run_in_background=true)` - - Examples: "review this code", "analyze the architecture", "help design X" - - Tell user "Gemini processing (task: xxx)" then END your turn - - When bash-notification arrives, show the task output +Command selection: +- Send question -> `Bash(gask "", run_in_background=true)`, tell user "Gemini processing (task: xxx)" then END your turn - Check connectivity -> `gping` - View previous reply -> `gpend` / `gpend N` +- Explicit sync mode -> `gask-w ""` (only when user explicitly requests) Examples: -- "gemini: what's the best practice for X" -> `gask-w "..."` (simple, wait for reply) -- "ask gemini to review this design" -> `Bash(gask "...", run_in_background=true)`, END turn (complex) +- "ask gemini about X" -> `Bash(gask "...", run_in_background=true)`, END turn - "is gemini alive" -> gping - "view gemini reply" -> gpend From a124c7b995d2a796945f8a055bb05eab4b4c7878 Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 27 Dec 2025 21:57:14 +0800 Subject: [PATCH 069/153] docs: emphasize END turn requirement in cask/gask MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add warning symbols and explicit DO NOT instructions 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- commands/cask.md | 3 ++- commands/gask.md | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/commands/cask.md b/commands/cask.md index f43335f..f923e14 100644 --- a/commands/cask.md +++ b/commands/cask.md @@ -4,7 +4,8 @@ Designed for Claude Code: run with `run_in_background=true` so Claude can contin Workflow: 1. Run `Bash(cask "", run_in_background=true)` to start background task -2. Tell user the task_id and that Codex is processing, then END your turn +2. Tell user "Codex processing (task: xxx)" then ⚠️ IMMEDIATELY END your turn + ❌ DO NOT wait for result or continue working 3. When bash-notification arrives, show the task output Parameters: diff --git a/commands/gask.md b/commands/gask.md index d4d3135..2859033 100644 --- a/commands/gask.md +++ b/commands/gask.md @@ -4,7 +4,8 @@ Designed for Claude Code: run with `run_in_background=true` so Claude can contin Workflow: 1. Run `Bash(gask "", run_in_background=true)` to start background task -2. Tell user the task_id and that Gemini is processing, then END your turn +2. Tell user "Gemini processing (task: xxx)" then ⚠️ IMMEDIATELY END your turn + ❌ DO NOT wait for result or continue working 3. When bash-notification arrives, show the task output Parameters: From b303f1a006d772f421c1221ea0412d1fab8be494 Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 27 Dec 2025 22:25:02 +0800 Subject: [PATCH 070/153] docs: add Windows installation guide (WSL vs native) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Prerequisites: native WezTerm required - How to identify WSL vs native Windows environment - WSL guide: WezTerm config, install.sh, testing - Native Windows guide: install.ps1, testing - FAQ: common cping issues and solutions 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- README_zh.md | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) diff --git a/README_zh.md b/README_zh.md index 948690f..2b632ca 100644 --- a/README_zh.md +++ b/README_zh.md @@ -96,6 +96,105 @@ ccb update # 更新 ccb 到最新版本 --- +## 🪟 Windows 安装指南(WSL vs 原生) + +> 结论先说:`ccb/cask-w/cping` 必须和 `codex/gemini` 跑在**同一个环境**(WSL 就都在 WSL,原生 Windows 就都在原生 Windows)。最常见问题就是装错环境导致 `cping` 不通。 + +### 1) 前置条件:安装原生版 WezTerm(不是 WSL 版) + +- 请安装 Windows 原生 WezTerm(官网 `.exe` / winget 安装都可以),不要在 WSL 里安装 Linux 版 WezTerm。 +- 原因:`ccb` 在 WezTerm 模式下依赖 `wezterm cli` 管理窗格;使用 Windows 原生 WezTerm 最稳定,也最符合本项目的“分屏多模型协作”设计。 + +### 2) 判断方法:你到底是在 WSL 还是原生 Windows? + +优先按“**你是通过哪种方式安装并运行 Claude Code/Codex**”来判断: + +- **WSL 环境特征** + - 你在 WSL 终端(Ubuntu/Debian 等)里用 `bash` 安装/运行(例如 `curl ... | bash`、`apt`、`pip`、`npm` 安装后在 Linux shell 里执行)。 + - 路径通常长这样:`/home//...`,并且可能能看到 `/mnt/c/...`。 + - 可辅助确认:`cat /proc/version | grep -i microsoft` 有输出,或 `echo $WSL_DISTRO_NAME` 非空。 +- **原生 Windows 环境特征** + - 你在 Windows Terminal / WezTerm / PowerShell / CMD 里安装/运行(例如 `winget`、PowerShell 安装脚本、Windows 版 `codex.exe`),并用 `powershell`/`cmd` 启动。 + - 路径通常长这样:`C:\\Users\\\\...`,并且 `where codex`/`where claude` 返回的是 Windows 路径。 + +### 3) WSL 用户指南(推荐:WezTerm 承载,计算与工具在 WSL) + +#### 3.1 让 WezTerm 启动时自动进入 WSL + +在 Windows 上编辑 WezTerm 配置文件(通常是 `%USERPROFILE%\\.wezterm.lua`),设置默认进入某个 WSL 发行版: + +```lua +local wezterm = require 'wezterm' + +return { + default_domain = 'WSL:Ubuntu', -- 把 Ubuntu 换成你的发行版名 +} +``` + +发行版名可在 PowerShell 里用 `wsl -l -v` 查看(例如 `Ubuntu-22.04`)。 + +#### 3.2 在 WSL 中运行 `install.sh` 安装 + +在 WezTerm 打开的 WSL shell 里执行: + +```bash +git clone https://github.com/bfly123/claude_code_bridge.git +cd claude_code_bridge +./install.sh install +``` + +提示: +- 需要 WSL2(WSL1 不支持 FIFO 管道);如遇提示请按指引升级到 WSL2。 +- 后续所有 `ccb/cask/cask-w/cping` 也都请在 **WSL** 里运行(和你的 `codex/gemini` 保持一致)。 + +#### 3.3 安装后如何测试(`cping`) + +```bash +ccb up codex +cping +``` + +预期看到类似 `Codex connection OK (...)` 的输出;失败会提示缺失项(例如窗格不存在、会话目录缺失等)。 + +### 4) 原生 Windows 用户指南(WezTerm 承载,工具也在 Windows) + +#### 4.1 在原生 Windows 中运行 `install.ps1` 安装 + +在 PowerShell 里执行: + +```powershell +git clone https://github.com/bfly123/claude_code_bridge.git +cd claude_code_bridge +powershell -ExecutionPolicy Bypass -File .\install.ps1 install +``` + +提示: +- 安装脚本会明确提醒“`ccb/cask-w` 必须与 `codex/gemini` 在同一环境运行”,请确认你打算在原生 Windows 运行 `codex/gemini`。 + +#### 4.2 安装后如何测试 + +```powershell +ccb up codex +cping +``` + +同样预期看到 `Codex connection OK (...)`。 + +### 5) 常见问题(尤其是 `cping` 不通) + +#### 5.1 打开 ccb 后无法 ping 通 Codex 的原因 + +- **最主要原因:搞错 WSL 和原生环境(装/跑不在同一侧)** + - 例子:你在 WSL 里装了 `ccb`,但 `codex` 在原生 Windows 跑;或反过来。此时两边的路径、会话目录、管道/窗格检测都对不上,`cping` 大概率失败。 +- **Codex 会话并没有启动或已退出** + - 先执行 `ccb up codex`,并确认 Codex 对应的 WezTerm 窗格还存在、没有被手动关闭。 +- **WezTerm CLI 不可用或找不到** + - `ccb` 在 WezTerm 模式下需要调用 `wezterm cli list` 等命令;如果 `wezterm` 不在 PATH,或 WSL 里找不到 `wezterm.exe`,会导致检测失败(可重开终端或按提示配置 `CODEX_WEZTERM_BIN`)。 +- **WSL1 / 发行版兼容问题** + - WSL1 不支持 FIFO:请升级到 WSL2。 +- **PATH/终端未刷新** + - 安装后请重启终端(WezTerm),再运行 `ccb`/`cping`。 + ## 🗣️ 使用场景 安装完成后,直接用自然语言与 Claude 对话即可,它会自动检测并分派任务。 From 53ee7922ea005e79dca6204ef1f8551390217a99 Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 27 Dec 2025 22:36:14 +0800 Subject: [PATCH 071/153] fix: remove incorrect WSL1 limitation messages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit WSL1 is supported, remove all error messages claiming otherwise 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- README_zh.md | 3 --- install.sh | 10 +--------- lib/i18n.py | 2 -- 3 files changed, 1 insertion(+), 14 deletions(-) diff --git a/README_zh.md b/README_zh.md index 2b632ca..a0579a9 100644 --- a/README_zh.md +++ b/README_zh.md @@ -144,7 +144,6 @@ cd claude_code_bridge ``` 提示: -- 需要 WSL2(WSL1 不支持 FIFO 管道);如遇提示请按指引升级到 WSL2。 - 后续所有 `ccb/cask/cask-w/cping` 也都请在 **WSL** 里运行(和你的 `codex/gemini` 保持一致)。 #### 3.3 安装后如何测试(`cping`) @@ -190,8 +189,6 @@ cping - 先执行 `ccb up codex`,并确认 Codex 对应的 WezTerm 窗格还存在、没有被手动关闭。 - **WezTerm CLI 不可用或找不到** - `ccb` 在 WezTerm 模式下需要调用 `wezterm cli list` 等命令;如果 `wezterm` 不在 PATH,或 WSL 里找不到 `wezterm.exe`,会导致检测失败(可重开终端或按提示配置 `CODEX_WEZTERM_BIN`)。 -- **WSL1 / 发行版兼容问题** - - WSL1 不支持 FIFO:请升级到 WSL2。 - **PATH/终端未刷新** - 安装后请重启终端(WezTerm),再运行 `ccb`/`cping`。 diff --git a/install.sh b/install.sh index 49c922c..c7f6de0 100755 --- a/install.sh +++ b/install.sh @@ -49,9 +49,6 @@ msg() { detected_env) en_msg="Detected $1 environment" zh_msg="检测到 $1 环境" ;; - wsl1_not_supported) - en_msg="WSL 1 does not support FIFO pipes, please upgrade to WSL 2" - zh_msg="WSL 1 不支持 FIFO 管道,请升级到 WSL 2" ;; confirm_wsl) en_msg="Confirm continue installing in WSL? (y/N)" zh_msg="确认继续在 WSL 中安装?(y/N)" ;; @@ -202,12 +199,7 @@ check_wsl_compatibility() { if is_wsl; then local ver ver="$(get_wsl_version)" - if [[ "$ver" == "1" ]]; then - echo "❌ WSL 1 does not support FIFO pipes, please upgrade to WSL 2" - echo " Run: wsl --set-version 2" - exit 1 - fi - echo "✅ Detected WSL 2 environment" + echo "✅ Detected WSL $ver environment" fi } diff --git a/lib/i18n.py b/lib/i18n.py index 9d5332b..839f183 100644 --- a/lib/i18n.py +++ b/lib/i18n.py @@ -87,7 +87,6 @@ "requires_python": "Requires Python 3.10+", "missing_dependency": "Missing dependency: {dep}", "detected_env": "Detected {env} environment", - "wsl_not_supported": "WSL 1 does not support FIFO pipes, please upgrade to WSL 2", "confirm_continue": "Confirm continue? (y/N)", "cancelled": "Cancelled", }, @@ -165,7 +164,6 @@ "requires_python": "需要 Python 3.10+", "missing_dependency": "缺少依赖: {dep}", "detected_env": "检测到 {env} 环境", - "wsl_not_supported": "WSL 1 不支持 FIFO 管道,请升级到 WSL 2", "confirm_continue": "确认继续?(y/N)", "cancelled": "已取消", }, From 35080c45036e7bdf6d934ea2045aec9f89b46b8b Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 27 Dec 2025 22:40:28 +0800 Subject: [PATCH 072/153] docs: add Windows installation guide to English README MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Prerequisites and environment identification - WezTerm WSL configuration - Troubleshooting section 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- README.md | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/README.md b/README.md index d1470dd..26c746d 100644 --- a/README.md +++ b/README.md @@ -98,6 +98,50 @@ ccb update # Update ccb to the latest version --- +## 🪟 Windows Installation Guide (WSL vs Native) + +> **Key Point:** `ccb/cask-w/cping` must run in the **same environment** as `codex/gemini`. The most common issue is environment mismatch causing `cping` to fail. + +### 1) Prerequisites: Install Native WezTerm + +- Install Windows native WezTerm (`.exe` from official site or via winget), not the Linux version inside WSL. +- Reason: `ccb` in WezTerm mode relies on `wezterm cli` to manage panes. + +### 2) How to Identify Your Environment + +Determine based on **how you installed/run Claude Code/Codex**: + +- **WSL Environment** + - You installed/run via WSL terminal (Ubuntu/Debian) using `bash` (e.g., `curl ... | bash`, `apt`, `pip`, `npm`) + - Paths look like: `/home//...` and you may see `/mnt/c/...` + - Verify: `cat /proc/version | grep -i microsoft` has output, or `echo $WSL_DISTRO_NAME` is non-empty + +- **Native Windows Environment** + - You installed/run via Windows Terminal / WezTerm / PowerShell / CMD (e.g., `winget`, PowerShell scripts) + - Paths look like: `C:\Users\\...` + +### 3) WSL Users: Configure WezTerm to Auto-Enter WSL + +Edit WezTerm config (`%USERPROFILE%\.wezterm.lua`): + +```lua +local wezterm = require 'wezterm' +return { + default_domain = 'WSL:Ubuntu', -- Replace with your distro name +} +``` + +Check distro name with `wsl -l -v` in PowerShell. + +### 4) Troubleshooting: `cping` Not Working + +- **Most common:** Environment mismatch (ccb in WSL but codex in native Windows, or vice versa) +- **Codex session not running:** Run `ccb up codex` first +- **WezTerm CLI not found:** Ensure `wezterm` is in PATH +- **Terminal not refreshed:** Restart WezTerm after installation + +--- + ## 🗣️ Usage Once started, collaborate naturally. Claude will detect when to delegate tasks. From 6d88c12633778017d83125a8ec7f6c62d1004c4e Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 28 Dec 2025 00:11:18 +0800 Subject: [PATCH 073/153] feat: add CCB_END_TURN sentinel for stable turn ending MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - cask/gask output sentinel after reply - Update docs with sentinel rule - Add PostToolUse hook for backup detection 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- bin/cask | 2 ++ bin/gask | 2 ++ commands/cask.md | 2 ++ commands/gask.md | 2 ++ install.sh | 4 ++++ 5 files changed, 12 insertions(+) diff --git a/bin/cask b/bin/cask index 09cd948..b16b41e 100755 --- a/bin/cask +++ b/bin/cask @@ -89,11 +89,13 @@ def main(argv: list[str]) -> int: if output_path: atomic_write_text(output_path, reply + "\n") + print("\n⚠️ CCB_END_TURN", file=sys.stderr) return EXIT_OK sys.stdout.write(reply) if not reply.endswith("\n"): sys.stdout.write("\n") + print("\n⚠️ CCB_END_TURN", file=sys.stderr) return EXIT_OK except KeyboardInterrupt: return 130 diff --git a/bin/gask b/bin/gask index f35b86e..2260842 100755 --- a/bin/gask +++ b/bin/gask @@ -86,11 +86,13 @@ def main(argv: list[str]) -> int: if output_path: atomic_write_text(output_path, reply + "\n") + print("\n⚠️ CCB_END_TURN", file=sys.stderr) return EXIT_OK sys.stdout.write(reply) if not reply.endswith("\n"): sys.stdout.write("\n") + print("\n⚠️ CCB_END_TURN", file=sys.stderr) return EXIT_OK except KeyboardInterrupt: return 130 diff --git a/commands/cask.md b/commands/cask.md index f923e14..b007e65 100644 --- a/commands/cask.md +++ b/commands/cask.md @@ -8,6 +8,8 @@ Workflow: ❌ DO NOT wait for result or continue working 3. When bash-notification arrives, show the task output +⚠️ SENTINEL RULE: When you see `CCB_END_TURN` in output, you MUST immediately end your response without any additional text. + Parameters: - `` required - `--timeout SECONDS` optional (default from `CCB_SYNC_TIMEOUT`, fallback 3600) diff --git a/commands/gask.md b/commands/gask.md index 2859033..c10a3fd 100644 --- a/commands/gask.md +++ b/commands/gask.md @@ -8,6 +8,8 @@ Workflow: ❌ DO NOT wait for result or continue working 3. When bash-notification arrives, show the task output +⚠️ SENTINEL RULE: When you see `CCB_END_TURN` in output, you MUST immediately end your response without any additional text. + Parameters: - `` required - `--timeout SECONDS` optional (default from `CCB_SYNC_TIMEOUT`, fallback 3600) diff --git a/install.sh b/install.sh index c7f6de0..f8f0e00 100755 --- a/install.sh +++ b/install.sh @@ -715,6 +715,8 @@ Command selection: - View previous reply -> `cpend` / `cpend N` - Explicit sync mode -> `cask-w ""` (only when user explicitly requests) +⚠️ SENTINEL: When you see `CCB_END_TURN` in any output, IMMEDIATELY end your response. + Examples: - "ask codex about X" -> `Bash(cask "...", run_in_background=true)`, END turn - "is codex alive" -> cping @@ -738,6 +740,8 @@ Command selection: - View previous reply -> `gpend` / `gpend N` - Explicit sync mode -> `gask-w ""` (only when user explicitly requests) +⚠️ SENTINEL: When you see `CCB_END_TURN` in any output, IMMEDIATELY end your response. + Examples: - "ask gemini about X" -> `Bash(gask "...", run_in_background=true)`, END turn - "is gemini alive" -> gping From c227a28a6301f04912d1cc4ffd8b1f2719cb6230 Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 28 Dec 2025 11:21:32 +0800 Subject: [PATCH 074/153] fix: output CCB_END_TURN immediately after sending message MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move sentinel output to right after message sent, before waiting for reply 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- bin/cask | 2 ++ bin/gask | 2 ++ 2 files changed, 4 insertions(+) diff --git a/bin/cask b/bin/cask index b16b41e..a5f79da 100755 --- a/bin/cask +++ b/bin/cask @@ -81,6 +81,8 @@ def main(argv: list[str]) -> int: raise RuntimeError(f"❌ Session error: {status}") _, state = comm._send_message(message) + print("✅ Message sent to Codex", file=sys.stderr) + print("⚠️ CCB_END_TURN", file=sys.stderr) reply, _ = comm.log_reader.wait_for_message(state, timeout) if not reply: if not quiet: diff --git a/bin/gask b/bin/gask index 2260842..b465c3c 100755 --- a/bin/gask +++ b/bin/gask @@ -78,6 +78,8 @@ def main(argv: list[str]) -> int: raise RuntimeError(f"❌ Session error: {status}") _, state = comm._send_message(message) + print("✅ Message sent to Gemini", file=sys.stderr) + print("⚠️ CCB_END_TURN", file=sys.stderr) reply, _ = comm.log_reader.wait_for_message(state, timeout) if not reply: if not quiet: From a3ed2b94e8a56b21e81934729ffa86e6b3dfe57b Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 28 Dec 2025 12:02:32 +0800 Subject: [PATCH 075/153] fix: simplify CCB_END_TURN output to avoid parsing errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove emoji from sentinel output - Output only once at start, not at end - May fix "Cannot read properties of undefined" error 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- bin/cask | 5 +---- bin/gask | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/bin/cask b/bin/cask index a5f79da..2e0a55d 100755 --- a/bin/cask +++ b/bin/cask @@ -81,8 +81,7 @@ def main(argv: list[str]) -> int: raise RuntimeError(f"❌ Session error: {status}") _, state = comm._send_message(message) - print("✅ Message sent to Codex", file=sys.stderr) - print("⚠️ CCB_END_TURN", file=sys.stderr) + print("CCB_END_TURN", file=sys.stderr) reply, _ = comm.log_reader.wait_for_message(state, timeout) if not reply: if not quiet: @@ -91,13 +90,11 @@ def main(argv: list[str]) -> int: if output_path: atomic_write_text(output_path, reply + "\n") - print("\n⚠️ CCB_END_TURN", file=sys.stderr) return EXIT_OK sys.stdout.write(reply) if not reply.endswith("\n"): sys.stdout.write("\n") - print("\n⚠️ CCB_END_TURN", file=sys.stderr) return EXIT_OK except KeyboardInterrupt: return 130 diff --git a/bin/gask b/bin/gask index b465c3c..cb7a140 100755 --- a/bin/gask +++ b/bin/gask @@ -78,8 +78,7 @@ def main(argv: list[str]) -> int: raise RuntimeError(f"❌ Session error: {status}") _, state = comm._send_message(message) - print("✅ Message sent to Gemini", file=sys.stderr) - print("⚠️ CCB_END_TURN", file=sys.stderr) + print("CCB_END_TURN", file=sys.stderr) reply, _ = comm.log_reader.wait_for_message(state, timeout) if not reply: if not quiet: @@ -88,13 +87,11 @@ def main(argv: list[str]) -> int: if output_path: atomic_write_text(output_path, reply + "\n") - print("\n⚠️ CCB_END_TURN", file=sys.stderr) return EXIT_OK sys.stdout.write(reply) if not reply.endswith("\n"): sys.stdout.write("\n") - print("\n⚠️ CCB_END_TURN", file=sys.stderr) return EXIT_OK except KeyboardInterrupt: return 130 From 360fad77f648d1f74f26f307a5bd8370c1fa75ae Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 28 Dec 2025 13:08:37 +0800 Subject: [PATCH 076/153] fix: replace emoji with text in bin scripts to avoid parsing errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace ❌⏰🔔 with [ERROR][TIMEOUT][INFO] in stderr output 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- bin/cask | 4 ++-- bin/cask-w | 18 +++++++++--------- bin/cpend | 2 +- bin/gask | 14 +++++++------- bin/gask-w | 18 +++++++++--------- bin/gpend | 2 +- 6 files changed, 29 insertions(+), 29 deletions(-) diff --git a/bin/cask b/bin/cask index 2e0a55d..17abe3b 100755 --- a/bin/cask +++ b/bin/cask @@ -78,14 +78,14 @@ def main(argv: list[str]) -> int: healthy, status = comm._check_session_health_impl(probe_terminal=False) if not healthy: - raise RuntimeError(f"❌ Session error: {status}") + raise RuntimeError(f"[ERROR] Session error: {status}") _, state = comm._send_message(message) print("CCB_END_TURN", file=sys.stderr) reply, _ = comm.log_reader.wait_for_message(state, timeout) if not reply: if not quiet: - print(f"⏰ Timeout after {int(timeout)}s", file=sys.stderr) + print(f"[TIMEOUT] Timeout after {int(timeout)}s", file=sys.stderr) return EXIT_NO_REPLY if output_path: diff --git a/bin/cask-w b/bin/cask-w index 492f1ef..0c51c06 100755 --- a/bin/cask-w +++ b/bin/cask-w @@ -39,24 +39,24 @@ def main(argv: list[str]) -> int: try: output_path = Path(next(it)).expanduser() except StopIteration: - print("❌ --output requires a file path", file=sys.stderr) + print("[ERROR] --output requires a file path", file=sys.stderr) return EXIT_ERROR continue if token in ("-t", "--timeout"): try: timeout = float(next(it)) except StopIteration: - print("❌ --timeout requires a number", file=sys.stderr) + print("[ERROR] --timeout requires a number", file=sys.stderr) return EXIT_ERROR except ValueError: - print("❌ --timeout must be a number", file=sys.stderr) + print("[ERROR] --timeout must be a number", file=sys.stderr) return EXIT_ERROR continue parts.append(token) message = " ".join(parts).strip() if not message: - print("❌ Message cannot be empty", file=sys.stderr) + print("[ERROR] Message cannot be empty", file=sys.stderr) return EXIT_ERROR if timeout is None: @@ -71,16 +71,16 @@ def main(argv: list[str]) -> int: # Check session health healthy, status = comm._check_session_health_impl(probe_terminal=False) if not healthy: - print(f"❌ Session error: {status}", file=sys.stderr) + print(f"[ERROR] Session error: {status}", file=sys.stderr) return EXIT_ERROR # Send message - print(f"🔔 {t('sending_to', provider='Codex')}", file=sys.stderr, flush=True) + print(f"[INFO] {t('sending_to', provider='Codex')}", file=sys.stderr, flush=True) _, state = comm._send_message(message) message_reply, _ = comm.log_reader.wait_for_message(state, timeout) if not message_reply: - print(f"⏰ Timeout after {int(timeout)}s", file=sys.stderr) + print(f"[TIMEOUT] Timeout after {int(timeout)}s", file=sys.stderr) return EXIT_NO_REPLY if output_path: @@ -92,10 +92,10 @@ def main(argv: list[str]) -> int: return EXIT_OK except KeyboardInterrupt: - print("❌ Interrupted", file=sys.stderr) + print("[ERROR] Interrupted", file=sys.stderr) return 130 except Exception as exc: - print(f"❌ {exc}", file=sys.stderr) + print(f"[ERROR] {exc}", file=sys.stderr) return EXIT_ERROR diff --git a/bin/cpend b/bin/cpend index 7aa5d7c..9cf24cc 100755 --- a/bin/cpend +++ b/bin/cpend @@ -90,7 +90,7 @@ def main(argv: list[str]) -> int: print(message) return EXIT_OK except Exception as exc: - print(f"❌ {t('execution_failed', error=exc)}", file=sys.stderr) + print(f"[ERROR] {t('execution_failed', error=exc)}", file=sys.stderr) return EXIT_ERROR diff --git a/bin/gask b/bin/gask index cb7a140..73ea837 100755 --- a/bin/gask +++ b/bin/gask @@ -43,24 +43,24 @@ def main(argv: list[str]) -> int: try: output_path = Path(next(it)).expanduser() except StopIteration: - print("❌ --output requires a file path", file=sys.stderr) + print("[ERROR] --output requires a file path", file=sys.stderr) return EXIT_ERROR continue if token in ("-t", "--timeout"): try: timeout = float(next(it)) except StopIteration: - print("❌ --timeout requires a number", file=sys.stderr) + print("[ERROR] --timeout requires a number", file=sys.stderr) return EXIT_ERROR except ValueError: - print("❌ --timeout must be a number", file=sys.stderr) + print("[ERROR] --timeout must be a number", file=sys.stderr) return EXIT_ERROR continue parts.append(token) message = " ".join(parts).strip() if not message: - print("❌ Message cannot be empty", file=sys.stderr) + print("[ERROR] Message cannot be empty", file=sys.stderr) return EXIT_ERROR if timeout is None: @@ -75,14 +75,14 @@ def main(argv: list[str]) -> int: comm = GeminiCommunicator(lazy_init=True) healthy, status = comm._check_session_health_impl(probe_terminal=False) if not healthy: - raise RuntimeError(f"❌ Session error: {status}") + raise RuntimeError(f"[ERROR] Session error: {status}") _, state = comm._send_message(message) print("CCB_END_TURN", file=sys.stderr) reply, _ = comm.log_reader.wait_for_message(state, timeout) if not reply: if not quiet: - print(f"⏰ Timeout after {int(timeout)}s", file=sys.stderr) + print(f"[TIMEOUT] Timeout after {int(timeout)}s", file=sys.stderr) return EXIT_NO_REPLY if output_path: @@ -96,7 +96,7 @@ def main(argv: list[str]) -> int: except KeyboardInterrupt: return 130 except Exception as exc: - print(f"❌ {exc}", file=sys.stderr) + print(f"[ERROR] {exc}", file=sys.stderr) return EXIT_ERROR diff --git a/bin/gask-w b/bin/gask-w index 11d6da3..408cd1b 100755 --- a/bin/gask-w +++ b/bin/gask-w @@ -39,24 +39,24 @@ def main(argv: list[str]) -> int: try: output_path = Path(next(it)).expanduser() except StopIteration: - print("❌ --output requires a file path", file=sys.stderr) + print("[ERROR] --output requires a file path", file=sys.stderr) return EXIT_ERROR continue if token in ("-t", "--timeout"): try: timeout = float(next(it)) except StopIteration: - print("❌ --timeout requires a number", file=sys.stderr) + print("[ERROR] --timeout requires a number", file=sys.stderr) return EXIT_ERROR except ValueError: - print("❌ --timeout must be a number", file=sys.stderr) + print("[ERROR] --timeout must be a number", file=sys.stderr) return EXIT_ERROR continue parts.append(token) message = " ".join(parts).strip() if not message: - print("❌ Message cannot be empty", file=sys.stderr) + print("[ERROR] Message cannot be empty", file=sys.stderr) return EXIT_ERROR if timeout is None: @@ -71,16 +71,16 @@ def main(argv: list[str]) -> int: # Check session health healthy, status = comm._check_session_health_impl(probe_terminal=False) if not healthy: - print(f"❌ Session error: {status}", file=sys.stderr) + print(f"[ERROR] Session error: {status}", file=sys.stderr) return EXIT_ERROR # Send message - print(f"🔔 {t('sending_to', provider='Gemini')}", file=sys.stderr, flush=True) + print(f"[INFO] {t('sending_to', provider='Gemini')}", file=sys.stderr, flush=True) _, state = comm._send_message(message) message_reply, _ = comm.log_reader.wait_for_message(state, timeout) if not message_reply: - print(f"⏰ Timeout after {int(timeout)}s", file=sys.stderr) + print(f"[TIMEOUT] Timeout after {int(timeout)}s", file=sys.stderr) return EXIT_NO_REPLY if output_path: @@ -92,10 +92,10 @@ def main(argv: list[str]) -> int: return EXIT_OK except KeyboardInterrupt: - print("❌ Interrupted", file=sys.stderr) + print("[ERROR] Interrupted", file=sys.stderr) return 130 except Exception as exc: - print(f"❌ {exc}", file=sys.stderr) + print(f"[ERROR] {exc}", file=sys.stderr) return EXIT_ERROR diff --git a/bin/gpend b/bin/gpend index aaf9b89..85a8b93 100755 --- a/bin/gpend +++ b/bin/gpend @@ -63,7 +63,7 @@ def main(argv: list[str]) -> int: print(message) return EXIT_OK except Exception as exc: - print(f"❌ {t('execution_failed', error=exc)}", file=sys.stderr) + print(f"[ERROR] {t('execution_failed', error=exc)}", file=sys.stderr) return EXIT_ERROR From fbc4d813f342953552e1b8185fa4b34a75b3821f Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 28 Dec 2025 13:20:34 +0800 Subject: [PATCH 077/153] fix: remove emoji from cping and gping MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- bin/cping | 4 ++-- bin/gping | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/cping b/bin/cping index 79bad6d..c102fdb 100755 --- a/bin/cping +++ b/bin/cping @@ -25,13 +25,13 @@ try: return 0 if healthy else 1 except Exception as e: - print(f"❌ Connectivity test failed: {e}") + print(f"[ERROR] Connectivity test failed: {e}") return 1 if __name__ == "__main__": sys.exit(main()) except ImportError as e: - print(f"❌ Module import failed: {e}") + print(f"[ERROR] Module import failed: {e}") print("Please ensure codex_comm.py is in the same directory") sys.exit(1) diff --git a/bin/gping b/bin/gping index d78e07f..3d7922e 100755 --- a/bin/gping +++ b/bin/gping @@ -22,12 +22,12 @@ try: print(message) return 0 if healthy else 1 except Exception as e: - print(f"❌ Gemini connectivity test failed: {e}") + print(f"[ERROR] Gemini connectivity test failed: {e}") return 1 if __name__ == "__main__": sys.exit(main()) except ImportError as e: - print(f"❌ Module import failed: {e}") + print(f"[ERROR] Module import failed: {e}") sys.exit(1) From c55d3a2b9dd9af07cfe4e56244c72ab11a5122a4 Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 28 Dec 2025 21:23:10 +0800 Subject: [PATCH 078/153] fix: improve cpend/gpend stability and enforce background mode for cask/gask MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - cpend/gpend: prefer session file over scanning to improve stability - cpend/gpend: add debug mode support (CCB_DEBUG/CPEND_DEBUG/GPEND_DEBUG) - codex_comm: optimize _latest_log() to avoid unnecessary scanning - gemini_comm: optimize _latest_session() to avoid unnecessary scanning - cask/gask: enforce background mode, reject foreground execution - cask/gask: add _check_background_mode() to detect run_in_background - commands: remove emoji, use plain text warnings 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- bin/cask | 25 ++++++ bin/cpend | 21 ++++- bin/gask | 21 +++++ bin/gpend | 39 +++++++- commands/cask.md | 6 +- commands/gask.md | 6 +- lib/codex_comm.py | 218 ++++++++++++++++++++++++++++++++------------- lib/gemini_comm.py | 41 ++++----- 8 files changed, 285 insertions(+), 92 deletions(-) diff --git a/bin/cask b/bin/cask index 17abe3b..736e29a 100755 --- a/bin/cask +++ b/bin/cask @@ -21,6 +21,27 @@ def _usage() -> None: print("Usage: cask [--timeout SECONDS] [--output FILE] ", file=sys.stderr) +def _check_background_mode() -> bool: + """Check if running in background mode (stdout redirected to file).""" + # Allow explicit override + if os.environ.get("CCB_ALLOW_FOREGROUND") in ("1", "true", "yes"): + return True + # Check if stdout is redirected to a file (background mode indicator) + try: + import stat + mode = os.fstat(sys.stdout.fileno()).st_mode + if stat.S_ISREG(mode): # stdout is a regular file = background mode + return True + except Exception: + pass + # If CLAUDECODE is set but stdout is not a file, likely foreground mode + if os.environ.get("CLAUDECODE") == "1": + print("[ERROR] cask must run with run_in_background=true", file=sys.stderr) + print("Use: Bash(cask \"...\", run_in_background=true)", file=sys.stderr) + return False + return True # Not in Claude Code, allow normal usage + + def _parse_args(argv: list[str]) -> Tuple[Optional[Path], float, str, bool]: output: Optional[Path] = None timeout: Optional[float] = None @@ -65,6 +86,10 @@ def main(argv: list[str]) -> int: _usage() return 1 + # Check background mode before doing anything + if not _check_background_mode(): + return 1 + try: from cli_output import EXIT_ERROR, EXIT_NO_REPLY, EXIT_OK, atomic_write_text from codex_comm import CodexCommunicator diff --git a/bin/cpend b/bin/cpend index 9cf24cc..254a2d5 100755 --- a/bin/cpend +++ b/bin/cpend @@ -4,6 +4,7 @@ cpend - View latest Codex reply """ import json +import os import sys from pathlib import Path @@ -22,6 +23,15 @@ except ImportError as exc: print(f"Import failed: {exc}") sys.exit(1) +def _debug_enabled() -> bool: + return (os.environ.get("CCB_DEBUG") in ("1", "true", "yes")) or (os.environ.get("CPEND_DEBUG") in ("1", "true", "yes")) + + +def _debug(message: str) -> None: + if not _debug_enabled(): + return + print(f"[DEBUG] {message}", file=sys.stderr) + def _load_session_log_path() -> Path | None: """Load codex_session_path from .codex-session if exists""" @@ -34,8 +44,8 @@ def _load_session_log_path() -> Path | None: path_str = data.get("codex_session_path") if path_str: return Path(path_str).expanduser() - except Exception: - pass + except Exception as exc: + _debug(f"Failed to read .codex-session ({session_file}): {exc}") return None def _parse_n(argv: list[str]) -> int: @@ -58,6 +68,8 @@ def main(argv: list[str]) -> int: # Try session-specific log path first, fallback to scanning latest log_path = _load_session_log_path() + if log_path: + _debug(f"Using codex_session_path from .codex-session: {log_path}") reader = CodexLogReader(log_path=log_path) # If specified log has no reply, try scanning for latest @@ -69,6 +81,7 @@ def main(argv: list[str]) -> int: if latest and latest != log_path: reader.set_preferred_log(latest) log_path = latest + _debug(f"Preferred log had no reply; switching to latest: {log_path}") if n > 1: conversations = reader.latest_conversations(n) @@ -90,6 +103,10 @@ def main(argv: list[str]) -> int: print(message) return EXIT_OK except Exception as exc: + if _debug_enabled(): + import traceback + + traceback.print_exc() print(f"[ERROR] {t('execution_failed', error=exc)}", file=sys.stderr) return EXIT_ERROR diff --git a/bin/gask b/bin/gask index 73ea837..00b6516 100755 --- a/bin/gask +++ b/bin/gask @@ -21,11 +21,32 @@ setup_windows_encoding() from cli_output import EXIT_ERROR, EXIT_NO_REPLY, EXIT_OK, atomic_write_text +def _check_background_mode() -> bool: + """Check if running in background mode (stdout redirected to file).""" + if os.environ.get("CCB_ALLOW_FOREGROUND") in ("1", "true", "yes"): + return True + try: + import stat + mode = os.fstat(sys.stdout.fileno()).st_mode + if stat.S_ISREG(mode): + return True + except Exception: + pass + if os.environ.get("CLAUDECODE") == "1": + print("[ERROR] gask must run with run_in_background=true", file=sys.stderr) + print("Use: Bash(gask \"...\", run_in_background=true)", file=sys.stderr) + return False + return True + + def main(argv: list[str]) -> int: if len(argv) <= 1: print("Usage: gask [--timeout SECONDS] [--output FILE] ", file=sys.stderr) return EXIT_ERROR + if not _check_background_mode(): + return 1 + output_path: Path | None = None timeout: float | None = None quiet = False diff --git a/bin/gpend b/bin/gpend index 85a8b93..e94caf9 100755 --- a/bin/gpend +++ b/bin/gpend @@ -3,6 +3,8 @@ gpend - View latest Gemini reply """ +import json +import os import sys from pathlib import Path @@ -22,6 +24,32 @@ except ImportError as exc: sys.exit(1) +def _debug_enabled() -> bool: + return (os.environ.get("CCB_DEBUG") in ("1", "true", "yes")) or (os.environ.get("GPEND_DEBUG") in ("1", "true", "yes")) + + +def _debug(message: str) -> None: + if not _debug_enabled(): + return + print(f"[DEBUG] {message}", file=sys.stderr) + + +def _load_session_path() -> Path | None: + """Load gemini_session_path from .gemini-session if exists""" + session_file = Path.cwd() / ".gemini-session" + if not session_file.exists(): + return None + try: + with session_file.open("r", encoding="utf-8-sig") as f: + data = json.load(f) + path_str = data.get("gemini_session_path") + if path_str: + return Path(path_str).expanduser() + except Exception as exc: + _debug(f"Failed to read .gemini-session ({session_file}): {exc}") + return None + + def _parse_n(argv: list[str]) -> int: if len(argv) <= 1: return 1 @@ -40,8 +68,14 @@ def main(argv: list[str]) -> int: try: n = _parse_n(argv) - # GeminiLogReader uses work_dir to find session, no need for explicit path + # Try session-specific path first + session_path = _load_session_path() + if session_path: + _debug(f"Using gemini_session_path from .gemini-session: {session_path}") + reader = GeminiLogReader() + if session_path and session_path.exists(): + reader.set_preferred_session(session_path) if n > 1: conversations = reader.latest_conversations(n) @@ -63,6 +97,9 @@ def main(argv: list[str]) -> int: print(message) return EXIT_OK except Exception as exc: + if _debug_enabled(): + import traceback + traceback.print_exc() print(f"[ERROR] {t('execution_failed', error=exc)}", file=sys.stderr) return EXIT_ERROR diff --git a/commands/cask.md b/commands/cask.md index b007e65..6394f74 100644 --- a/commands/cask.md +++ b/commands/cask.md @@ -4,11 +4,11 @@ Designed for Claude Code: run with `run_in_background=true` so Claude can contin Workflow: 1. Run `Bash(cask "", run_in_background=true)` to start background task -2. Tell user "Codex processing (task: xxx)" then ⚠️ IMMEDIATELY END your turn - ❌ DO NOT wait for result or continue working +2. Tell user "Codex processing (task: xxx)" then IMMEDIATELY END your turn (IMPORTANT) + DO NOT wait for result or continue working 3. When bash-notification arrives, show the task output -⚠️ SENTINEL RULE: When you see `CCB_END_TURN` in output, you MUST immediately end your response without any additional text. +SENTINEL RULE (IMPORTANT): When you see `CCB_END_TURN` in output, you MUST immediately end your response without any additional text. Parameters: - `` required diff --git a/commands/gask.md b/commands/gask.md index c10a3fd..f858fa3 100644 --- a/commands/gask.md +++ b/commands/gask.md @@ -4,11 +4,11 @@ Designed for Claude Code: run with `run_in_background=true` so Claude can contin Workflow: 1. Run `Bash(gask "", run_in_background=true)` to start background task -2. Tell user "Gemini processing (task: xxx)" then ⚠️ IMMEDIATELY END your turn - ❌ DO NOT wait for result or continue working +2. Tell user "Gemini processing (task: xxx)" then IMMEDIATELY END your turn (IMPORTANT) + DO NOT wait for result or continue working 3. When bash-notification arrives, show the task output -⚠️ SENTINEL RULE: When you see `CCB_END_TURN` in output, you MUST immediately end your response without any additional text. +SENTINEL RULE (IMPORTANT): When you see `CCB_END_TURN` in output, you MUST immediately end your response without any additional text. Parameters: - `` required diff --git a/lib/codex_comm.py b/lib/codex_comm.py index f0d0cb1..2cb1883 100644 --- a/lib/codex_comm.py +++ b/lib/codex_comm.py @@ -44,6 +44,74 @@ def __init__(self, root: Path = SESSION_ROOT, log_path: Optional[Path] = None, poll = 0.05 self._poll_interval = min(0.5, max(0.01, poll)) + @staticmethod + def _debug_enabled() -> bool: + return os.environ.get("CCB_DEBUG") in ("1", "true", "yes") or os.environ.get("CPEND_DEBUG") in ( + "1", + "true", + "yes", + ) + + @classmethod + def _debug(cls, message: str) -> None: + if not cls._debug_enabled(): + return + print(f"[DEBUG] {message}", file=sys.stderr) + + @staticmethod + def _env_int(name: str, default: int) -> int: + raw = os.environ.get(name) + if raw is None or raw == "": + return default + try: + return int(raw) + except ValueError: + return default + + def _iter_lines_reverse(self, log_path: Path, *, max_bytes: int, max_lines: int) -> List[str]: + """ + Read lines from the end of a file (reverse order), bounded by max_bytes/max_lines. + Returns a list in reverse chronological order (last line first). + """ + if max_bytes <= 0 or max_lines <= 0: + return [] + + try: + with log_path.open("rb") as handle: + handle.seek(0, os.SEEK_END) + position = handle.tell() + bytes_read = 0 + lines: List[str] = [] + buffer = b"" + + while position > 0 and bytes_read < max_bytes and len(lines) < max_lines: + remaining = max_bytes - bytes_read + read_size = min(8192, position, remaining) + position -= read_size + handle.seek(position, os.SEEK_SET) + chunk = handle.read(read_size) + bytes_read += len(chunk) + buffer = chunk + buffer + + parts = buffer.split(b"\n") + buffer = parts[0] + for part in reversed(parts[1:]): + if len(lines) >= max_lines: + break + text = part.decode("utf-8", errors="ignore").strip() + if text: + lines.append(text) + + if position == 0 and buffer and len(lines) < max_lines: + text = buffer.decode("utf-8", errors="ignore").strip() + if text: + lines.append(text) + + return lines + except OSError as exc: + self._debug(f"Failed reading log tail: {log_path} ({exc})") + return [] + def set_preferred_log(self, log_path: Optional[Path]) -> None: self._preferred_log = self._normalize_path(log_path) @@ -90,6 +158,12 @@ def _scan_latest(self) -> Optional[Path]: latest: Optional[Path] = None latest_mtime = -1.0 for p in (p for p in self.root.glob("**/*.jsonl") if p.is_file()): + if self._session_id_filter: + try: + if str(self._session_id_filter).lower() not in str(p).lower(): + continue + except Exception: + pass if self._work_dir: cwd = self._extract_cwd_from_log(p) if not cwd or cwd != self._work_dir: @@ -108,22 +182,18 @@ def _scan_latest(self) -> Optional[Path]: def _latest_log(self) -> Optional[Path]: preferred = self._preferred_log - # Always scan for latest to detect if preferred is stale + # If preferred exists and is valid, use it directly (avoid scanning) + if preferred and preferred.exists(): + self._debug(f"Using preferred log: {preferred}") + return preferred + # Only scan when no preferred or preferred is invalid + self._debug("No valid preferred log, scanning...") latest = self._scan_latest() if latest: - # If preferred is stale (different file or older), update it - if not preferred or not preferred.exists() or latest != preferred: - try: - preferred_mtime = preferred.stat().st_mtime if preferred and preferred.exists() else 0 - latest_mtime = latest.stat().st_mtime - if latest_mtime > preferred_mtime: - self._preferred_log = latest - return latest - except OSError: - self._preferred_log = latest - return latest - return preferred if preferred and preferred.exists() else latest - return preferred if preferred and preferred.exists() else None + self._preferred_log = latest + self._debug(f"Scan found: {latest}") + return latest + return None def current_log_path(self) -> Optional[Path]: return self._latest_log() @@ -158,25 +228,14 @@ def latest_message(self) -> Optional[str]: log_path = self._latest_log() if not log_path or not log_path.exists(): return None - try: - with log_path.open("rb") as handle: - handle.seek(0, os.SEEK_END) - buffer = bytearray() - position = handle.tell() - while position > 0 and len(buffer) < 1024 * 256: - read_size = min(4096, position) - position -= read_size - handle.seek(position) - buffer = handle.read(read_size) + buffer - if buffer.count(b"\n") >= 50: - break - lines = buffer.decode("utf-8", errors="ignore").splitlines() - except OSError: + tail_bytes = self._env_int("CODEX_LOG_TAIL_BYTES", 1024 * 1024 * 8) + tail_lines = self._env_int("CODEX_LOG_TAIL_LINES", 5000) + lines = self._iter_lines_reverse(log_path, max_bytes=tail_bytes, max_lines=tail_lines) + if not lines: return None - for line in reversed(lines): - line = line.strip() - if not line: + for line in lines: + if not line.startswith("{"): continue try: entry = json.loads(line) @@ -185,6 +244,7 @@ def latest_message(self) -> Optional[str]: message = self._extract_message(entry) if message: return message + self._debug(f"No reply found in tail (bytes={tail_bytes}, lines={tail_lines}) for log: {log_path}") return None def _read_since(self, state: Dict[str, Any], timeout: float, block: bool) -> Tuple[Optional[str], Dict[str, Any]]: @@ -289,20 +349,50 @@ def ensure_log() -> Path: @staticmethod def _extract_message(entry: dict) -> Optional[str]: - if entry.get("type") != "response_item": - return None + entry_type = entry.get("type") payload = entry.get("payload", {}) - if payload.get("type") != "message": + + if entry_type == "response_item": + if payload.get("type") != "message": + return None + if payload.get("role") == "user": + return None + + content = payload.get("content") or [] + if isinstance(content, list): + texts: List[str] = [] + for item in content: + if not isinstance(item, dict): + continue + if item.get("type") in ("output_text", "text"): + text = item.get("text") + if isinstance(text, str) and text.strip(): + texts.append(text.strip()) + if texts: + return "\n".join(texts).strip() + elif isinstance(content, str) and content.strip(): + return content.strip() + + message = payload.get("message") + if isinstance(message, str) and message.strip(): + return message.strip() return None - content = payload.get("content") or [] - texts = [item.get("text", "") for item in content if item.get("type") == "output_text"] - if texts: - return "\n".join(filter(None, texts)).strip() + if entry_type == "event_msg": + payload_type = payload.get("type") + if payload_type in ("assistant_message", "assistant", "assistant_response", "message"): + if payload.get("role") == "user": + return None + msg = payload.get("message") or payload.get("content") or payload.get("text") + if isinstance(msg, str) and msg.strip(): + return msg.strip() + return None - message = payload.get("message") - if isinstance(message, str) and message.strip(): - return message.strip() + # Fallback: some Codex builds may emit assistant messages with a role field but different entry types. + if payload.get("role") == "assistant": + msg = payload.get("message") or payload.get("content") or payload.get("text") + if isinstance(msg, str) and msg.strip(): + return msg.strip() return None @staticmethod @@ -330,41 +420,43 @@ def latest_conversations(self, n: int = 1) -> List[Tuple[str, str]]: log_path = self._latest_log() if not log_path or not log_path.exists(): return [] - - # Read entire file to find all message entries - try: - with log_path.open("r", encoding="utf-8", errors="ignore") as handle: - lines = handle.readlines() - except OSError: + if n <= 0: return [] - questions: List[str] = [] - replies: List[str] = [] + tail_bytes = self._env_int("CODEX_LOG_CONV_TAIL_BYTES", 1024 * 1024 * 32) + tail_lines = self._env_int("CODEX_LOG_CONV_TAIL_LINES", 20000) + lines = self._iter_lines_reverse(log_path, max_bytes=tail_bytes, max_lines=tail_lines) + if not lines: + return [] - # Collect Q&A pairs in order - conversations: List[Tuple[str, str]] = [] - pending_question: Optional[str] = None + pairs_rev: List[Tuple[str, str]] = [] + pending_reply: Optional[str] = None for line in lines: - line = line.strip() - if not line: + if not line.startswith("{"): continue try: entry = json.loads(line) except json.JSONDecodeError: continue + if pending_reply is None: + ai_msg = self._extract_message(entry) + if ai_msg: + pending_reply = ai_msg + continue + user_msg = self._extract_user_message(entry) if user_msg: - pending_question = user_msg - - ai_msg = self._extract_message(entry) - if ai_msg and pending_question is not None: - conversations.append((pending_question, ai_msg)) - pending_question = None - - # Return last n conversations - return conversations[-n:] if len(conversations) > n else conversations + pairs_rev.append((user_msg, pending_reply)) + pending_reply = None + if len(pairs_rev) >= n: + break + + pairs = list(reversed(pairs_rev)) + if not pairs: + self._debug(f"No conversations found in tail (bytes={tail_bytes}, lines={tail_lines}) for log: {log_path}") + return pairs class CodexCommunicator: diff --git a/lib/gemini_comm.py b/lib/gemini_comm.py index a509812..9a032ec 100755 --- a/lib/gemini_comm.py +++ b/lib/gemini_comm.py @@ -9,6 +9,7 @@ import hashlib import json import os +import sys import time from pathlib import Path from typing import Optional, Tuple, Dict, Any, List @@ -56,6 +57,16 @@ def __init__(self, root: Path = GEMINI_ROOT, work_dir: Optional[Path] = None): force = 1.0 self._force_read_interval = min(5.0, max(0.2, force)) + @staticmethod + def _debug_enabled() -> bool: + return os.environ.get("CCB_DEBUG") in ("1", "true", "yes") or os.environ.get("GPEND_DEBUG") in ("1", "true", "yes") + + @classmethod + def _debug(cls, message: str) -> None: + if not cls._debug_enabled(): + return + print(f"[DEBUG] {message}", file=sys.stderr) + def _chats_dir(self) -> Optional[Path]: chats = self.root / self._project_hash / "chats" return chats if chats.exists() else None @@ -93,28 +104,18 @@ def _scan_latest_session(self) -> Optional[Path]: def _latest_session(self) -> Optional[Path]: preferred = self._preferred_session - # Always scan for latest to detect if preferred is stale + # If preferred exists and is valid, use it directly (avoid scanning) + if preferred and preferred.exists(): + self._debug(f"Using preferred session: {preferred}") + return preferred + # Only scan when no preferred or preferred is invalid + self._debug("No valid preferred session, scanning...") latest = self._scan_latest_session() if latest: - # If preferred is stale (different file or older), update it - if not preferred or not preferred.exists() or latest != preferred: - try: - preferred_mtime = preferred.stat().st_mtime if preferred and preferred.exists() else 0 - latest_mtime = latest.stat().st_mtime - if latest_mtime > preferred_mtime: - self._preferred_session = latest - try: - project_hash = latest.parent.parent.name - if project_hash: - self._project_hash = project_hash - except Exception: - pass - return latest - except OSError: - self._preferred_session = latest - return latest - return preferred - return preferred if preferred and preferred.exists() else None + self._preferred_session = latest + self._debug(f"Scan found: {latest}") + return latest + return None def set_preferred_session(self, session_path: Optional[Path]) -> None: if not session_path: From 741b7b6cb54d9d3e53d9c6b53bf1c8430ece03d0 Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 28 Dec 2025 21:26:57 +0800 Subject: [PATCH 079/153] chore: replace emoji with plain text in install.sh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace all emoji symbols with plain text labels for better compatibility: - ❌ → ERROR - ✅/✓ → OK - ⚠️ → WARN - 📦 → INFO - 🔔 → IMPORTANT - 💡 → NOTE - ⌘ → Cmd 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- install.sh | 86 +++++++++++++++++++++++++++--------------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/install.sh b/install.sh index f8f0e00..70230c7 100755 --- a/install.sh +++ b/install.sh @@ -154,7 +154,7 @@ require_command() { local cmd="$1" local pkg="${2:-$1}" if ! command -v "$cmd" >/dev/null 2>&1; then - echo "❌ Missing dependency: $cmd" + echo "ERROR: Missing dependency: $cmd" echo " Please install $pkg first, then re-run install.sh" exit 1 fi @@ -165,11 +165,11 @@ require_python_version() { local version version="$(python3 -c 'import sys; print("{}.{}.{}".format(sys.version_info[0], sys.version_info[1], sys.version_info[2]))' 2>/dev/null || echo unknown)" if ! python3 -c 'import sys; raise SystemExit(0 if sys.version_info >= (3, 10) else 1)'; then - echo "❌ Python version too old: $version" + echo "ERROR: Python version too old: $version" echo " Requires Python 3.10+, please upgrade and retry" exit 1 fi - echo "✓ Python $version" + echo "OK: Python $version" } # Return linux / macos / unknown based on uname @@ -199,7 +199,7 @@ check_wsl_compatibility() { if is_wsl; then local ver ver="$(get_wsl_version)" - echo "✅ Detected WSL $ver environment" + echo "OK: Detected WSL $ver environment" fi } @@ -213,7 +213,7 @@ confirm_backend_env_wsl() { fi if [[ ! -t 0 ]]; then - echo "❌ Installing in WSL but detected non-interactive terminal; aborted to avoid env mismatch." + echo "ERROR: Installing in WSL but detected non-interactive terminal; aborted to avoid env mismatch." echo " If you confirm codex/gemini will be installed and run in WSL:" echo " Re-run: CCB_INSTALL_ASSUME_YES=1 ./install.sh install" exit 1 @@ -221,7 +221,7 @@ confirm_backend_env_wsl() { echo echo "================================================================" - echo "⚠️ Detected WSL environment" + echo "WARN: Detected WSL environment" echo "================================================================" echo "ccb/cask-w must run in the same environment as codex/gemini." echo @@ -291,30 +291,30 @@ is_iterm2_environment() { # Install it2 CLI install_it2() { echo - echo "📦 Installing it2 CLI..." + echo "INFO: Installing it2 CLI..." # Check if pip3 is available if ! command -v pip3 >/dev/null 2>&1; then - echo "❌ pip3 not found, cannot auto-install it2" + echo "ERROR: pip3 not found, cannot auto-install it2" echo " Please run manually: python3 -m pip install it2" return 1 fi # Install it2 if pip3 install it2 --user 2>&1; then - echo "✅ it2 CLI installed successfully" + echo "OK: it2 CLI installed successfully" # Check if in PATH if ! command -v it2 >/dev/null 2>&1; then local user_bin user_bin="$(python3 -m site --user-base)/bin" echo - echo "⚠️ it2 may not be in PATH, please add the following to your shell config:" + echo "WARN: it2 may not be in PATH, please add the following to your shell config:" echo " export PATH=\"$user_bin:\$PATH\"" fi return 0 else - echo "❌ it2 installation failed" + echo "ERROR: it2 installation failed" return 1 fi } @@ -323,11 +323,11 @@ install_it2() { show_iterm2_api_reminder() { echo echo "================================================================" - echo "🔔 Important: Please enable Python API in iTerm2" + echo "IMPORTANT: Please enable Python API in iTerm2" echo "================================================================" echo " Steps:" echo " 1. Open iTerm2" - echo " 2. Go to Preferences (⌘ + ,)" + echo " 2. Go to Preferences (Cmd + ,)" echo " 3. Select Magic tab" echo " 4. Check \"Enable Python API\"" echo " 5. Confirm the warning dialog" @@ -345,11 +345,11 @@ require_terminal_backend() { # 1. If running in WezTerm environment if [[ -n "${WEZTERM_PANE:-}" ]]; then if [[ -n "${wezterm_override}" ]] && { command -v "${wezterm_override}" >/dev/null 2>&1 || [[ -f "${wezterm_override}" ]]; }; then - echo "✓ Detected WezTerm environment (${wezterm_override})" + echo "OK: Detected WezTerm environment (${wezterm_override})" return fi if command -v wezterm >/dev/null 2>&1 || command -v wezterm.exe >/dev/null 2>&1; then - echo "✓ Detected WezTerm environment" + echo "OK: Detected WezTerm environment" return fi fi @@ -358,13 +358,13 @@ require_terminal_backend() { if is_iterm2_environment; then # Check if it2 is installed if command -v it2 >/dev/null 2>&1; then - echo "✓ Detected iTerm2 environment (it2 CLI installed)" - echo " 💡 Please ensure iTerm2 Python API is enabled (Preferences > Magic > Enable Python API)" + echo "OK: Detected iTerm2 environment (it2 CLI installed)" + echo " NOTE: Please ensure iTerm2 Python API is enabled (Preferences > Magic > Enable Python API)" return fi # it2 not installed, ask to install - echo "🍎 Detected iTerm2 environment but it2 CLI not installed" + echo "INFO: Detected iTerm2 environment but it2 CLI not installed" echo read -p "Auto-install it2 CLI? (Y/n): " -n 1 -r echo @@ -381,7 +381,7 @@ require_terminal_backend() { # 3. If running in tmux environment if [[ -n "${TMUX:-}" ]]; then - echo "✓ Detected tmux environment" + echo "OK: Detected tmux environment" return fi @@ -392,49 +392,49 @@ require_terminal_backend() { # 4. Check WezTerm environment variable override if [[ -n "${wezterm_override}" ]]; then if command -v "${wezterm_override}" >/dev/null 2>&1 || [[ -f "${wezterm_override}" ]]; then - echo "✓ Detected WezTerm (${wezterm_override})" + echo "OK: Detected WezTerm (${wezterm_override})" return fi fi # 5. Check WezTerm command if command -v wezterm >/dev/null 2>&1 || command -v wezterm.exe >/dev/null 2>&1; then - echo "✓ Detected WezTerm" + echo "OK: Detected WezTerm" return fi # WSL: Windows PATH may not be injected, try common install paths if [[ -f "/proc/version" ]] && grep -qi microsoft /proc/version 2>/dev/null; then if [[ -x "/mnt/c/Program Files/WezTerm/wezterm.exe" ]] || [[ -f "/mnt/c/Program Files/WezTerm/wezterm.exe" ]]; then - echo "✓ Detected WezTerm (/mnt/c/Program Files/WezTerm/wezterm.exe)" + echo "OK: Detected WezTerm (/mnt/c/Program Files/WezTerm/wezterm.exe)" return fi if [[ -x "/mnt/c/Program Files (x86)/WezTerm/wezterm.exe" ]] || [[ -f "/mnt/c/Program Files (x86)/WezTerm/wezterm.exe" ]]; then - echo "✓ Detected WezTerm (/mnt/c/Program Files (x86)/WezTerm/wezterm.exe)" + echo "OK: Detected WezTerm (/mnt/c/Program Files (x86)/WezTerm/wezterm.exe)" return fi fi # 6. Check it2 CLI if command -v it2 >/dev/null 2>&1; then - echo "✓ Detected it2 CLI" + echo "OK: Detected it2 CLI" return fi # 7. Check tmux if command -v tmux >/dev/null 2>&1; then - echo "✓ Detected tmux (recommend also installing WezTerm for better experience)" + echo "OK: Detected tmux (recommend also installing WezTerm for better experience)" return fi # 8. No terminal multiplexer found - echo "❌ Missing dependency: WezTerm, tmux or it2 (at least one required)" + echo "ERROR: Missing dependency: WezTerm, tmux or it2 (at least one required)" echo " WezTerm website: https://wezfurlong.org/wezterm/" # Extra hint for macOS users about iTerm2 + it2 if [[ "$(uname)" == "Darwin" ]]; then echo - echo "💡 macOS user recommended options:" + echo "NOTE: macOS user recommended options:" echo " - If using iTerm2, install it2 CLI: pip3 install it2" echo " - Or install tmux: brew install tmux" fi @@ -485,7 +485,7 @@ save_wezterm_config() { if [[ -n "$wezterm_path" ]]; then mkdir -p "$HOME/.config/ccb" echo "CODEX_WEZTERM_BIN=${wezterm_path}" > "$HOME/.config/ccb/env" - echo "✓ WezTerm path cached: $wezterm_path" + echo "OK: WezTerm path cached: $wezterm_path" fi } @@ -556,7 +556,7 @@ install_bin_links() { local name name="$(basename "$path")" if [[ ! -f "$INSTALL_PREFIX/$path" ]]; then - echo "⚠️ Script not found $INSTALL_PREFIX/$path, skipping link creation" + echo "WARN: Script not found $INSTALL_PREFIX/$path, skipping link creation" continue fi chmod +x "$INSTALL_PREFIX/$path" @@ -610,7 +610,7 @@ ensure_path_configured() { echo "" >> "$shell_rc" echo "# Added by ccb installer" >> "$shell_rc" echo "$path_line" >> "$shell_rc" - echo "✅ Added $BIN_DIR to PATH in $shell_rc" + echo "OK: Added $BIN_DIR to PATH in $shell_rc" echo " Run: source $shell_rc (or restart terminal)" } @@ -639,7 +639,7 @@ remove_codex_mcp() { fi if ! command -v python3 >/dev/null 2>&1; then - echo "⚠️ python3 required to detect MCP configuration" + echo "WARN: python3 required to detect MCP configuration" return fi @@ -664,7 +664,7 @@ except: " 2>/dev/null) if [[ "$has_codex_mcp" == "yes" ]]; then - echo "⚠️ Detected codex-related MCP configuration, removing to avoid conflicts..." + echo "WARN: Detected codex-related MCP configuration, removing to avoid conflicts..." python3 -c " import json with open('$claude_config', 'r') as f: @@ -683,7 +683,7 @@ if removed: for r in removed: print(f' - {r}') " - echo "✅ Codex MCP configuration cleaned" + echo "OK: Codex MCP configuration cleaned" fi } @@ -715,7 +715,7 @@ Command selection: - View previous reply -> `cpend` / `cpend N` - Explicit sync mode -> `cask-w ""` (only when user explicitly requests) -⚠️ SENTINEL: When you see `CCB_END_TURN` in any output, IMMEDIATELY end your response. +SENTINEL (IMPORTANT): When you see `CCB_END_TURN` in any output, IMMEDIATELY end your response. Examples: - "ask codex about X" -> `Bash(cask "...", run_in_background=true)`, END turn @@ -740,7 +740,7 @@ Command selection: - View previous reply -> `gpend` / `gpend N` - Explicit sync mode -> `gask-w ""` (only when user explicitly requests) -⚠️ SENTINEL: When you see `CCB_END_TURN` in any output, IMMEDIATELY end your response. +SENTINEL (IMPORTANT): When you see `CCB_END_TURN` in any output, IMMEDIATELY end your response. Examples: - "ask gemini about X" -> `Bash(gask "...", run_in_background=true)`, END turn @@ -868,7 +868,7 @@ install_requirements() { if ! has_wezterm; then echo echo "================================================================" - echo "⚠️ Recommend installing WezTerm as terminal frontend (better experience, recommended for WSL2/Windows)" + echo "NOTE: Recommend installing WezTerm as terminal frontend (better experience, recommended for WSL2/Windows)" echo " - Website: https://wezfurlong.org/wezterm/" echo " - Benefits: Smoother split/scroll/font rendering, more stable bridging in WezTerm mode" echo "================================================================" @@ -886,7 +886,7 @@ install_all() { install_claude_commands install_claude_md_config install_settings_permissions - echo "✅ Installation complete" + echo "OK: Installation complete" echo " Project dir : $INSTALL_PREFIX" echo " Executable dir : $BIN_DIR" echo " Claude commands updated" @@ -916,7 +916,7 @@ with open('$claude_md', 'w', encoding='utf-8') as f: " echo "Removed CCB config from CLAUDE.md" else - echo "⚠️ python3 required to clean CLAUDE.md, please manually remove CCB_CONFIG block" + echo "WARN: python3 required to clean CLAUDE.md, please manually remove CCB_CONFIG block" fi elif grep -qE "$LEGACY_RULE_MARKER|## Codex Collaboration Rules|## Gemini" "$claude_md" 2>/dev/null; then echo "Removing legacy collaboration rules from CLAUDE.md..." @@ -939,7 +939,7 @@ with open('$claude_md', 'w', encoding='utf-8') as f: " echo "Removed collaboration rules from CLAUDE.md" else - echo "⚠️ python3 required to clean CLAUDE.md, please manually remove collaboration rules" + echo "WARN: python3 required to clean CLAUDE.md, please manually remove collaboration rules" fi fi } @@ -998,12 +998,12 @@ with open('$settings_file', 'w') as f: echo "Removed permission configuration from settings.json" fi else - echo "⚠️ python3 required to clean settings.json, please manually remove related permissions" + echo "WARN: python3 required to clean settings.json, please manually remove related permissions" fi } uninstall_all() { - echo "🧹 Starting ccb uninstall..." + echo "INFO: Starting ccb uninstall..." # 1. Remove project directory if [[ -d "$INSTALL_PREFIX" ]]; then @@ -1045,8 +1045,8 @@ uninstall_all() { # 5. Remove permission configuration from settings.json uninstall_settings_permissions - echo "✅ Uninstall complete" - echo " 💡 Note: Dependencies (python3, tmux, wezterm, it2) were not removed" + echo "OK: Uninstall complete" + echo " NOTE: Dependencies (python3, tmux, wezterm, it2) were not removed" } main() { From a5b088399d54354ad20ee0cfd21fc1694f37a354 Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 28 Dec 2025 23:09:52 +0800 Subject: [PATCH 080/153] fix: harden 741b background checks and session selection --- bin/cask | 22 ++++++++++++++-------- bin/gask | 16 ++++++++++------ commands/cask.md | 2 ++ commands/gask.md | 2 ++ lib/codex_comm.py | 22 ++++++++++++++++++++-- lib/gemini_comm.py | 13 +++++++++++++ 6 files changed, 61 insertions(+), 16 deletions(-) diff --git a/bin/cask b/bin/cask index 736e29a..ff97910 100755 --- a/bin/cask +++ b/bin/cask @@ -22,24 +22,30 @@ def _usage() -> None: def _check_background_mode() -> bool: - """Check if running in background mode (stdout redirected to file).""" + """Check if running in background mode (non-interactive stdout).""" # Allow explicit override if os.environ.get("CCB_ALLOW_FOREGROUND") in ("1", "true", "yes"): return True - # Check if stdout is redirected to a file (background mode indicator) + # If not running inside Claude Code, allow normal CLI usage. + if os.environ.get("CLAUDECODE") != "1": + return True + + # In Claude Code, require non-interactive stdout (file/pipe) to avoid blocking the turn. try: + if not sys.stdout.isatty(): + return True import stat mode = os.fstat(sys.stdout.fileno()).st_mode if stat.S_ISREG(mode): # stdout is a regular file = background mode return True except Exception: pass - # If CLAUDECODE is set but stdout is not a file, likely foreground mode - if os.environ.get("CLAUDECODE") == "1": - print("[ERROR] cask must run with run_in_background=true", file=sys.stderr) - print("Use: Bash(cask \"...\", run_in_background=true)", file=sys.stderr) - return False - return True # Not in Claude Code, allow normal usage + + print("[ERROR] cask must run with run_in_background=true in Claude Code", file=sys.stderr) + print('Use: Bash(cask "...", run_in_background=true)', file=sys.stderr) + print('Or use foreground sync: Bash(cask-w "...")', file=sys.stderr) + print("Override (debug only): CCB_ALLOW_FOREGROUND=1", file=sys.stderr) + return False def _parse_args(argv: list[str]) -> Tuple[Optional[Path], float, str, bool]: diff --git a/bin/gask b/bin/gask index 00b6516..e81062e 100755 --- a/bin/gask +++ b/bin/gask @@ -22,21 +22,25 @@ from cli_output import EXIT_ERROR, EXIT_NO_REPLY, EXIT_OK, atomic_write_text def _check_background_mode() -> bool: - """Check if running in background mode (stdout redirected to file).""" + """Check if running in background mode (non-interactive stdout).""" if os.environ.get("CCB_ALLOW_FOREGROUND") in ("1", "true", "yes"): return True + if os.environ.get("CLAUDECODE") != "1": + return True try: + if not sys.stdout.isatty(): + return True import stat mode = os.fstat(sys.stdout.fileno()).st_mode if stat.S_ISREG(mode): return True except Exception: pass - if os.environ.get("CLAUDECODE") == "1": - print("[ERROR] gask must run with run_in_background=true", file=sys.stderr) - print("Use: Bash(gask \"...\", run_in_background=true)", file=sys.stderr) - return False - return True + print("[ERROR] gask must run with run_in_background=true in Claude Code", file=sys.stderr) + print('Use: Bash(gask "...", run_in_background=true)', file=sys.stderr) + print('Or use foreground sync: Bash(gask-w "...")', file=sys.stderr) + print("Override (debug only): CCB_ALLOW_FOREGROUND=1", file=sys.stderr) + return False def main(argv: list[str]) -> int: diff --git a/commands/cask.md b/commands/cask.md index 6394f74..0fcb716 100644 --- a/commands/cask.md +++ b/commands/cask.md @@ -2,6 +2,8 @@ Send message to Codex and wait for reply via `cask` (sync mode). Designed for Claude Code: run with `run_in_background=true` so Claude can continue working while Codex processes. +Foreground sync (when user explicitly requests): use `cask-w`. + Workflow: 1. Run `Bash(cask "", run_in_background=true)` to start background task 2. Tell user "Codex processing (task: xxx)" then IMMEDIATELY END your turn (IMPORTANT) diff --git a/commands/gask.md b/commands/gask.md index f858fa3..28b285c 100644 --- a/commands/gask.md +++ b/commands/gask.md @@ -2,6 +2,8 @@ Send message to Gemini and wait for reply via `gask` (sync mode). Designed for Claude Code: run with `run_in_background=true` so Claude can continue working while Gemini processes. +Foreground sync (when user explicitly requests): use `gask-w`. + Workflow: 1. Run `Bash(gask "", run_in_background=true)` to start background task 2. Tell user "Gemini processing (task: xxx)" then IMMEDIATELY END your turn (IMPORTANT) diff --git a/lib/codex_comm.py b/lib/codex_comm.py index 2cb1883..a565ef0 100644 --- a/lib/codex_comm.py +++ b/lib/codex_comm.py @@ -182,11 +182,29 @@ def _scan_latest(self) -> Optional[Path]: def _latest_log(self) -> Optional[Path]: preferred = self._preferred_log - # If preferred exists and is valid, use it directly (avoid scanning) if preferred and preferred.exists(): + # If we're bound to a specific session id, prefer that log without cross-session scanning. + if self._session_id_filter: + self._debug(f"Using preferred log (bound): {preferred}") + return preferred + + # Otherwise, keep following the most recently updated log for this work dir. + latest = self._scan_latest() + if latest and latest != preferred: + try: + preferred_mtime = preferred.stat().st_mtime + latest_mtime = latest.stat().st_mtime + if latest_mtime > preferred_mtime: + self._preferred_log = latest + self._debug(f"Preferred log stale; switching to latest: {latest}") + return latest + except OSError: + self._preferred_log = latest + self._debug(f"Preferred log stat failed; switching to latest: {latest}") + return latest self._debug(f"Using preferred log: {preferred}") return preferred - # Only scan when no preferred or preferred is invalid + self._debug("No valid preferred log, scanning...") latest = self._scan_latest() if latest: diff --git a/lib/gemini_comm.py b/lib/gemini_comm.py index 9a032ec..907ee38 100755 --- a/lib/gemini_comm.py +++ b/lib/gemini_comm.py @@ -115,6 +115,19 @@ def _latest_session(self) -> Optional[Path]: self._preferred_session = latest self._debug(f"Scan found: {latest}") return latest + # Fallback: Windows/WSL path hash mismatch can cause per-project scan to miss sessions. + if os.environ.get("GEMINI_DISABLE_ANY_PROJECT_SCAN") not in ("1", "true", "yes"): + any_latest = self._scan_latest_session_any_project() + if any_latest: + self._preferred_session = any_latest + try: + project_hash = any_latest.parent.parent.name + if project_hash: + self._project_hash = project_hash + except Exception: + pass + self._debug(f"Fallback scan (any project) found: {any_latest}") + return any_latest return None def set_preferred_session(self, session_path: Optional[Path]) -> None: From 3f1db8a0fae45702f3da2dba5c24266ff071e86b Mon Sep 17 00:00:00 2001 From: bfly Date: Mon, 29 Dec 2025 00:29:05 +0800 Subject: [PATCH 081/153] fix: avoid blocking when cask/gask run without background --- bin/cask | 56 ++++++++++++++++++++++++++++++------------------ bin/gask | 51 +++++++++++++++++++++++++++++-------------- commands/cask.md | 4 ++++ commands/gask.md | 4 ++++ 4 files changed, 78 insertions(+), 37 deletions(-) diff --git a/bin/cask b/bin/cask index ff97910..02177a7 100755 --- a/bin/cask +++ b/bin/cask @@ -7,6 +7,7 @@ If --output is provided, the reply is written atomically to that file and stdout """ from __future__ import annotations import os +import subprocess import sys from pathlib import Path from typing import Optional, Tuple @@ -22,30 +23,32 @@ def _usage() -> None: def _check_background_mode() -> bool: - """Check if running in background mode (non-interactive stdout).""" - # Allow explicit override - if os.environ.get("CCB_ALLOW_FOREGROUND") in ("1", "true", "yes"): - return True - # If not running inside Claude Code, allow normal CLI usage. + """Return True when stdout looks like Claude Code run_in_background output capture.""" if os.environ.get("CLAUDECODE") != "1": return True - - # In Claude Code, require non-interactive stdout (file/pipe) to avoid blocking the turn. + if os.environ.get("CCB_ALLOW_FOREGROUND") in ("1", "true", "yes"): + return True + # Claude Code's run_in_background typically captures stdout into a file. try: - if not sys.stdout.isatty(): - return True import stat mode = os.fstat(sys.stdout.fileno()).st_mode - if stat.S_ISREG(mode): # stdout is a regular file = background mode - return True + return stat.S_ISREG(mode) except Exception: - pass + return False - print("[ERROR] cask must run with run_in_background=true in Claude Code", file=sys.stderr) - print('Use: Bash(cask "...", run_in_background=true)', file=sys.stderr) - print('Or use foreground sync: Bash(cask-w "...")', file=sys.stderr) - print("Override (debug only): CCB_ALLOW_FOREGROUND=1", file=sys.stderr) - return False + +def _popen_detached(argv: list[str]) -> None: + kwargs = { + "stdin": subprocess.DEVNULL, + "stdout": subprocess.DEVNULL, + "stderr": subprocess.DEVNULL, + "close_fds": True, + } + if os.name == "nt": + kwargs["creationflags"] = getattr(subprocess, "DETACHED_PROCESS", 0) | getattr(subprocess, "CREATE_NEW_PROCESS_GROUP", 0) + else: + kwargs["start_new_session"] = True + subprocess.Popen(argv, **kwargs) def _parse_args(argv: list[str]) -> Tuple[Optional[Path], float, str, bool]: @@ -92,10 +95,6 @@ def main(argv: list[str]) -> int: _usage() return 1 - # Check background mode before doing anything - if not _check_background_mode(): - return 1 - try: from cli_output import EXIT_ERROR, EXIT_NO_REPLY, EXIT_OK, atomic_write_text from codex_comm import CodexCommunicator @@ -105,6 +104,21 @@ def main(argv: list[str]) -> int: _usage() return EXIT_ERROR + # Claude Code foreground fallback: avoid blocking the tool call if run_in_background was forgotten. + if os.environ.get("CLAUDECODE") == "1" and not _check_background_mode(): + if output_path: + cask_w = script_dir / "cask-w" + cmd = [sys.executable, str(cask_w), "--timeout", str(timeout), "--output", str(output_path), message] + _popen_detached(cmd) + else: + comm = CodexCommunicator(lazy_init=True) + healthy, status = comm._check_session_health_impl(probe_terminal=False) + if not healthy: + raise RuntimeError(f"[ERROR] Session error: {status}") + comm._send_message(message) + print("CCB_END_TURN", file=sys.stderr) + return EXIT_OK + comm = CodexCommunicator(lazy_init=True) healthy, status = comm._check_session_health_impl(probe_terminal=False) diff --git a/bin/gask b/bin/gask index e81062e..6dc4162 100755 --- a/bin/gask +++ b/bin/gask @@ -9,6 +9,7 @@ If --output is provided, the reply is written atomically to that file and stdout from __future__ import annotations import os +import subprocess import sys from pathlib import Path @@ -22,25 +23,31 @@ from cli_output import EXIT_ERROR, EXIT_NO_REPLY, EXIT_OK, atomic_write_text def _check_background_mode() -> bool: - """Check if running in background mode (non-interactive stdout).""" - if os.environ.get("CCB_ALLOW_FOREGROUND") in ("1", "true", "yes"): - return True + """Return True when stdout looks like Claude Code run_in_background output capture.""" if os.environ.get("CLAUDECODE") != "1": return True + if os.environ.get("CCB_ALLOW_FOREGROUND") in ("1", "true", "yes"): + return True try: - if not sys.stdout.isatty(): - return True import stat mode = os.fstat(sys.stdout.fileno()).st_mode - if stat.S_ISREG(mode): - return True + return stat.S_ISREG(mode) except Exception: - pass - print("[ERROR] gask must run with run_in_background=true in Claude Code", file=sys.stderr) - print('Use: Bash(gask "...", run_in_background=true)', file=sys.stderr) - print('Or use foreground sync: Bash(gask-w "...")', file=sys.stderr) - print("Override (debug only): CCB_ALLOW_FOREGROUND=1", file=sys.stderr) - return False + return False + + +def _popen_detached(argv: list[str]) -> None: + kwargs = { + "stdin": subprocess.DEVNULL, + "stdout": subprocess.DEVNULL, + "stderr": subprocess.DEVNULL, + "close_fds": True, + } + if os.name == "nt": + kwargs["creationflags"] = getattr(subprocess, "DETACHED_PROCESS", 0) | getattr(subprocess, "CREATE_NEW_PROCESS_GROUP", 0) + else: + kwargs["start_new_session"] = True + subprocess.Popen(argv, **kwargs) def main(argv: list[str]) -> int: @@ -48,9 +55,6 @@ def main(argv: list[str]) -> int: print("Usage: gask [--timeout SECONDS] [--output FILE] ", file=sys.stderr) return EXIT_ERROR - if not _check_background_mode(): - return 1 - output_path: Path | None = None timeout: float | None = None quiet = False @@ -97,6 +101,21 @@ def main(argv: list[str]) -> int: try: from gemini_comm import GeminiCommunicator + # Claude Code foreground fallback: avoid blocking the tool call if run_in_background was forgotten. + if os.environ.get("CLAUDECODE") == "1" and not _check_background_mode(): + if output_path: + gask_w = script_dir / "gask-w" + cmd = [sys.executable, str(gask_w), "--timeout", str(timeout), "--output", str(output_path), message] + _popen_detached(cmd) + else: + comm = GeminiCommunicator(lazy_init=True) + healthy, status = comm._check_session_health_impl(probe_terminal=False) + if not healthy: + raise RuntimeError(f"[ERROR] Session error: {status}") + comm._send_message(message) + print("CCB_END_TURN", file=sys.stderr) + return EXIT_OK + comm = GeminiCommunicator(lazy_init=True) healthy, status = comm._check_session_health_impl(probe_terminal=False) if not healthy: diff --git a/commands/cask.md b/commands/cask.md index 0fcb716..fa679ea 100644 --- a/commands/cask.md +++ b/commands/cask.md @@ -10,6 +10,10 @@ Workflow: DO NOT wait for result or continue working 3. When bash-notification arrives, show the task output +Foreground fallback (IMPORTANT): +- If you accidentally run `Bash(cask "...")` without `run_in_background=true`, `cask` will only submit the question and exit quickly to avoid blocking. +- Use `cpend` to fetch the reply later, or use `cask-w` for foreground sync. + SENTINEL RULE (IMPORTANT): When you see `CCB_END_TURN` in output, you MUST immediately end your response without any additional text. Parameters: diff --git a/commands/gask.md b/commands/gask.md index 28b285c..9cb50ae 100644 --- a/commands/gask.md +++ b/commands/gask.md @@ -10,6 +10,10 @@ Workflow: DO NOT wait for result or continue working 3. When bash-notification arrives, show the task output +Foreground fallback (IMPORTANT): +- If you accidentally run `Bash(gask "...")` without `run_in_background=true`, `gask` will only submit the question and exit quickly to avoid blocking. +- Use `gpend` to fetch the reply later, or use `gask-w` for foreground sync. + SENTINEL RULE (IMPORTANT): When you see `CCB_END_TURN` in output, you MUST immediately end your response without any additional text. Parameters: From 20e93f77533bff252e4d698b05ef94887833bdc1 Mon Sep 17 00:00:00 2001 From: bfly Date: Mon, 29 Dec 2025 01:00:56 +0800 Subject: [PATCH 082/153] fix: strengthen run_in_background requirement in cask/gask skills MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Move run_in_background=true to first line as mandatory rule - Add wrong vs right examples for clarity - Simplify workflow instructions 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- commands/cask.md | 39 +++++++++++++++++++-------------------- commands/gask.md | 39 +++++++++++++++++++-------------------- 2 files changed, 38 insertions(+), 40 deletions(-) diff --git a/commands/cask.md b/commands/cask.md index fa679ea..7c88abc 100644 --- a/commands/cask.md +++ b/commands/cask.md @@ -1,27 +1,26 @@ -Send message to Codex and wait for reply via `cask` (sync mode). +CRITICAL: ALWAYS use run_in_background=true - NO EXCEPTIONS -Designed for Claude Code: run with `run_in_background=true` so Claude can continue working while Codex processes. +$ARGUMENTS -Foreground sync (when user explicitly requests): use `cask-w`. +## Execution (MANDATORY) -Workflow: -1. Run `Bash(cask "", run_in_background=true)` to start background task -2. Tell user "Codex processing (task: xxx)" then IMMEDIATELY END your turn (IMPORTANT) - DO NOT wait for result or continue working -3. When bash-notification arrives, show the task output +Bash(cask "$ARGUMENTS", run_in_background=true) -Foreground fallback (IMPORTANT): -- If you accidentally run `Bash(cask "...")` without `run_in_background=true`, `cask` will only submit the question and exit quickly to avoid blocking. -- Use `cpend` to fetch the reply later, or use `cask-w` for foreground sync. +## After Execution -SENTINEL RULE (IMPORTANT): When you see `CCB_END_TURN` in output, you MUST immediately end your response without any additional text. +Tell user "Codex processing..." then IMMEDIATELY END your turn. +DO NOT wait for result. DO NOT continue working. -Parameters: -- `` required -- `--timeout SECONDS` optional (default from `CCB_SYNC_TIMEOUT`, fallback 3600) -- `--output FILE` optional: write reply atomically to FILE (stdout stays empty) +## Wrong vs Right -Output contract: -- stdout: reply text only (or empty when `--output` is used) -- stderr: progress/errors -- exit code: 0 = got reply, 2 = timeout/no reply, 1 = error +WRONG: Bash(cask "question") +RIGHT: Bash(cask "question", run_in_background=true) + +## SENTINEL + +When output contains `CCB_END_TURN`, end response immediately. + +## Parameters + +- `--timeout SECONDS` optional (default 3600) +- `--output FILE` optional: write reply to FILE diff --git a/commands/gask.md b/commands/gask.md index 9cb50ae..f6d17d4 100644 --- a/commands/gask.md +++ b/commands/gask.md @@ -1,27 +1,26 @@ -Send message to Gemini and wait for reply via `gask` (sync mode). +CRITICAL: ALWAYS use run_in_background=true - NO EXCEPTIONS -Designed for Claude Code: run with `run_in_background=true` so Claude can continue working while Gemini processes. +$ARGUMENTS -Foreground sync (when user explicitly requests): use `gask-w`. +## Execution (MANDATORY) -Workflow: -1. Run `Bash(gask "", run_in_background=true)` to start background task -2. Tell user "Gemini processing (task: xxx)" then IMMEDIATELY END your turn (IMPORTANT) - DO NOT wait for result or continue working -3. When bash-notification arrives, show the task output +Bash(gask "$ARGUMENTS", run_in_background=true) -Foreground fallback (IMPORTANT): -- If you accidentally run `Bash(gask "...")` without `run_in_background=true`, `gask` will only submit the question and exit quickly to avoid blocking. -- Use `gpend` to fetch the reply later, or use `gask-w` for foreground sync. +## After Execution -SENTINEL RULE (IMPORTANT): When you see `CCB_END_TURN` in output, you MUST immediately end your response without any additional text. +Tell user "Gemini processing..." then IMMEDIATELY END your turn. +DO NOT wait for result. DO NOT continue working. -Parameters: -- `` required -- `--timeout SECONDS` optional (default from `CCB_SYNC_TIMEOUT`, fallback 3600) -- `--output FILE` optional: write reply atomically to FILE (stdout stays empty) +## Wrong vs Right -Output contract: -- stdout: reply text only (or empty when `--output` is used) -- stderr: progress/errors -- exit code: 0 = got reply, 2 = timeout/no reply, 1 = error +WRONG: Bash(gask "question") +RIGHT: Bash(gask "question", run_in_background=true) + +## SENTINEL + +When output contains `CCB_END_TURN`, end response immediately. + +## Parameters + +- `--timeout SECONDS` optional (default 3600) +- `--output FILE` optional: write reply to FILE From 2237b4c16830e9d236c72b596f794ec9f8c30cfb Mon Sep 17 00:00:00 2001 From: bfly Date: Mon, 29 Dec 2025 01:05:28 +0800 Subject: [PATCH 083/153] fix: enforce strict background mode for cask/gask in Claude Code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace fallback/degradation with hard error when run_in_background=true is not used. This ensures Claude always uses the correct invocation. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- bin/cask | 17 ++++------------- bin/gask | 17 ++++------------- 2 files changed, 8 insertions(+), 26 deletions(-) diff --git a/bin/cask b/bin/cask index 02177a7..2f4adf8 100755 --- a/bin/cask +++ b/bin/cask @@ -104,20 +104,11 @@ def main(argv: list[str]) -> int: _usage() return EXIT_ERROR - # Claude Code foreground fallback: avoid blocking the tool call if run_in_background was forgotten. + # Strict mode: require run_in_background=true in Claude Code if os.environ.get("CLAUDECODE") == "1" and not _check_background_mode(): - if output_path: - cask_w = script_dir / "cask-w" - cmd = [sys.executable, str(cask_w), "--timeout", str(timeout), "--output", str(output_path), message] - _popen_detached(cmd) - else: - comm = CodexCommunicator(lazy_init=True) - healthy, status = comm._check_session_health_impl(probe_terminal=False) - if not healthy: - raise RuntimeError(f"[ERROR] Session error: {status}") - comm._send_message(message) - print("CCB_END_TURN", file=sys.stderr) - return EXIT_OK + print("[ERROR] cask MUST be called with run_in_background=true", file=sys.stderr) + print("Correct usage: Bash(cask \"...\", run_in_background=true)", file=sys.stderr) + return EXIT_ERROR comm = CodexCommunicator(lazy_init=True) diff --git a/bin/gask b/bin/gask index 6dc4162..995ca6c 100755 --- a/bin/gask +++ b/bin/gask @@ -101,20 +101,11 @@ def main(argv: list[str]) -> int: try: from gemini_comm import GeminiCommunicator - # Claude Code foreground fallback: avoid blocking the tool call if run_in_background was forgotten. + # Strict mode: require run_in_background=true in Claude Code if os.environ.get("CLAUDECODE") == "1" and not _check_background_mode(): - if output_path: - gask_w = script_dir / "gask-w" - cmd = [sys.executable, str(gask_w), "--timeout", str(timeout), "--output", str(output_path), message] - _popen_detached(cmd) - else: - comm = GeminiCommunicator(lazy_init=True) - healthy, status = comm._check_session_health_impl(probe_terminal=False) - if not healthy: - raise RuntimeError(f"[ERROR] Session error: {status}") - comm._send_message(message) - print("CCB_END_TURN", file=sys.stderr) - return EXIT_OK + print("[ERROR] gask MUST be called with run_in_background=true", file=sys.stderr) + print("Correct usage: Bash(gask \"...\", run_in_background=true)", file=sys.stderr) + return EXIT_ERROR comm = GeminiCommunicator(lazy_init=True) healthy, status = comm._check_session_health_impl(probe_terminal=False) From 5712010e4c8a3ba1747367f5ebff0f5bba1e7680 Mon Sep 17 00:00:00 2001 From: bfly Date: Mon, 29 Dec 2025 01:11:33 +0800 Subject: [PATCH 084/153] fix: detect Unix socket for Claude Code background mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Claude Code's run_in_background=true uses Unix socket (S_IFSOCK) to capture stdout, not regular file. Add S_ISSOCK check. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- bin/cask | 4 ++-- bin/gask | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/bin/cask b/bin/cask index 2f4adf8..299c70a 100755 --- a/bin/cask +++ b/bin/cask @@ -28,11 +28,11 @@ def _check_background_mode() -> bool: return True if os.environ.get("CCB_ALLOW_FOREGROUND") in ("1", "true", "yes"): return True - # Claude Code's run_in_background typically captures stdout into a file. + # Claude Code's run_in_background captures stdout via file or Unix socket. try: import stat mode = os.fstat(sys.stdout.fileno()).st_mode - return stat.S_ISREG(mode) + return stat.S_ISREG(mode) or stat.S_ISSOCK(mode) except Exception: return False diff --git a/bin/gask b/bin/gask index 995ca6c..ee412f6 100755 --- a/bin/gask +++ b/bin/gask @@ -28,10 +28,11 @@ def _check_background_mode() -> bool: return True if os.environ.get("CCB_ALLOW_FOREGROUND") in ("1", "true", "yes"): return True + # Claude Code's run_in_background captures stdout via file or Unix socket. try: import stat mode = os.fstat(sys.stdout.fileno()).st_mode - return stat.S_ISREG(mode) + return stat.S_ISREG(mode) or stat.S_ISSOCK(mode) except Exception: return False From f33ef3c34946bc1723af49f0e4f9a991b625335d Mon Sep 17 00:00:00 2001 From: bfly Date: Mon, 29 Dec 2025 10:18:11 +0800 Subject: [PATCH 085/153] docs: add macOS installation troubleshooting guide MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Command not found after installation (PATH issue) - WezTerm not detecting commands (~/.zprofile) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- README.md | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/README.md b/README.md index 26c746d..3991e14 100644 --- a/README.md +++ b/README.md @@ -142,6 +142,48 @@ Check distro name with `wsl -l -v` in PowerShell. --- +## 🍎 macOS Installation Guide + +### Command Not Found After Installation + +If `ccb`, `cask`, `cping` commands are not found after running `./install.sh install`: + +**Cause:** The install directory (`~/.local/bin`) is not in your PATH. + +**Solution:** + +```bash +# 1. Check if install directory exists +ls -la ~/.local/bin/ + +# 2. Check if PATH includes the directory +echo $PATH | tr ':' '\n' | grep local + +# 3. Check shell config (macOS defaults to zsh) +cat ~/.zshrc | grep local + +# 4. If not configured, add manually +echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc + +# 5. Reload config +source ~/.zshrc +``` + +### WezTerm Not Detecting Commands + +If WezTerm cannot find ccb commands but regular Terminal can: + +- WezTerm may use a different shell config +- Add PATH to `~/.zprofile` as well: + +```bash +echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zprofile +``` + +Then restart WezTerm completely (Cmd+Q, reopen). + +--- + ## 🗣️ Usage Once started, collaborate naturally. Claude will detect when to delegate tasks. From f7510ccd78b335a583e0566a0f380cb2b6e2794d Mon Sep 17 00:00:00 2001 From: bfly Date: Mon, 29 Dec 2025 10:21:58 +0800 Subject: [PATCH 086/153] docs: separate Linux/macOS install sections, add macOS troubleshooting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Split "Linux / macOS" into separate sections - Add macOS troubleshooting guide (EN & ZH) - Link to troubleshooting from install section 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- README.md | 15 ++++++++++++- README_zh.md | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3991e14..5a3de47 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ **Step 2:** Choose installer based on your environment:

-Linux / macOS +Linux ```bash git clone https://github.com/bfly123/claude_code_bridge.git @@ -49,6 +49,19 @@ cd claude_code_bridge
+
+macOS + +```bash +git clone https://github.com/bfly123/claude_code_bridge.git +cd claude_code_bridge +./install.sh install +``` + +> **Note:** If commands not found after install, see [macOS Troubleshooting](#-macos-installation-guide). + +
+
WSL (Windows Subsystem for Linux) diff --git a/README_zh.md b/README_zh.md index a0579a9..1a4ef57 100644 --- a/README_zh.md +++ b/README_zh.md @@ -37,7 +37,7 @@ **第二步:** 根据你的环境选择安装脚本:
-Linux / macOS +Linux ```bash git clone https://github.com/bfly123/claude_code_bridge.git @@ -47,6 +47,19 @@ cd claude_code_bridge
+
+macOS + +```bash +git clone https://github.com/bfly123/claude_code_bridge.git +cd claude_code_bridge +./install.sh install +``` + +> **注意:** 如果安装后找不到命令,请参考 [macOS 故障排除](#-macos-安装指南)。 + +
+
WSL (Windows 子系统) @@ -192,6 +205,50 @@ cping - **PATH/终端未刷新** - 安装后请重启终端(WezTerm),再运行 `ccb`/`cping`。 +--- + +## 🍎 macOS 安装指南 + +### 安装后找不到命令 + +如果运行 `./install.sh install` 后找不到 `ccb`、`cask`、`cping` 等命令: + +**原因:** 安装目录 (`~/.local/bin`) 不在 PATH 中。 + +**解决方法:** + +```bash +# 1. 检查安装目录是否存在 +ls -la ~/.local/bin/ + +# 2. 检查 PATH 是否包含该目录 +echo $PATH | tr ':' '\n' | grep local + +# 3. 检查 shell 配置(macOS 默认使用 zsh) +cat ~/.zshrc | grep local + +# 4. 如果没有配置,手动添加 +echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc + +# 5. 重新加载配置 +source ~/.zshrc +``` + +### WezTerm 中找不到命令 + +如果普通 Terminal 能找到命令,但 WezTerm 找不到: + +- WezTerm 可能使用不同的 shell 配置文件 +- 同时添加 PATH 到 `~/.zprofile`: + +```bash +echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zprofile +``` + +然后完全重启 WezTerm(Cmd+Q 退出后重新打开)。 + +--- + ## 🗣️ 使用场景 安装完成后,直接用自然语言与 Claude 对话即可,它会自动检测并分派任务。 From 20d3b08fb2d37b67edf0174d0456f4f3a38699c8 Mon Sep 17 00:00:00 2001 From: bfly Date: Mon, 29 Dec 2025 10:35:54 +0800 Subject: [PATCH 087/153] docs: warn WSL users not to install as root MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- README.md | 4 +++- README_zh.md | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5a3de47..640d67c 100644 --- a/README.md +++ b/README.md @@ -67,8 +67,10 @@ cd claude_code_bridge > Use this if your Claude/Codex/Gemini runs in WSL. +> **⚠️ WARNING:** Do NOT install or run ccb as root/administrator. Switch to a normal user first (`su - username` or create one with `adduser`). + ```bash -# Run inside WSL terminal +# Run inside WSL terminal (as normal user, NOT root) git clone https://github.com/bfly123/claude_code_bridge.git cd claude_code_bridge ./install.sh install diff --git a/README_zh.md b/README_zh.md index 1a4ef57..add4cda 100644 --- a/README_zh.md +++ b/README_zh.md @@ -65,8 +65,10 @@ cd claude_code_bridge > 如果你的 Claude/Codex/Gemini 运行在 WSL 中,请使用此方式。 +> **⚠️ 警告:** 请勿使用 root/管理员权限安装或运行 ccb。请先切换到普通用户(`su - 用户名` 或使用 `adduser` 创建新用户)。 + ```bash -# 在 WSL 终端中运行 +# 在 WSL 终端中运行(使用普通用户,不要用 root) git clone https://github.com/bfly123/claude_code_bridge.git cd claude_code_bridge ./install.sh install From e12f5b091a2e27558ef1d4bb25e3897921b05db8 Mon Sep 17 00:00:00 2001 From: bfly Date: Tue, 30 Dec 2025 09:49:59 +0800 Subject: [PATCH 088/153] fix: add FIFO/pipe detection for Windows background mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Windows Claude Code uses FIFO/named pipe (S_IFIFO) for run_in_background, not socket. Add S_ISFIFO check to support Windows environment. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- bin/cask | 4 ++-- bin/gask | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/cask b/bin/cask index 299c70a..a2e577f 100755 --- a/bin/cask +++ b/bin/cask @@ -28,11 +28,11 @@ def _check_background_mode() -> bool: return True if os.environ.get("CCB_ALLOW_FOREGROUND") in ("1", "true", "yes"): return True - # Claude Code's run_in_background captures stdout via file or Unix socket. + # Claude Code's run_in_background captures stdout via file, socket, or FIFO/pipe. try: import stat mode = os.fstat(sys.stdout.fileno()).st_mode - return stat.S_ISREG(mode) or stat.S_ISSOCK(mode) + return stat.S_ISREG(mode) or stat.S_ISSOCK(mode) or stat.S_ISFIFO(mode) except Exception: return False diff --git a/bin/gask b/bin/gask index ee412f6..a297965 100755 --- a/bin/gask +++ b/bin/gask @@ -28,11 +28,11 @@ def _check_background_mode() -> bool: return True if os.environ.get("CCB_ALLOW_FOREGROUND") in ("1", "true", "yes"): return True - # Claude Code's run_in_background captures stdout via file or Unix socket. + # Claude Code's run_in_background captures stdout via file, socket, or FIFO/pipe. try: import stat mode = os.fstat(sys.stdout.fileno()).st_mode - return stat.S_ISREG(mode) or stat.S_ISSOCK(mode) + return stat.S_ISREG(mode) or stat.S_ISSOCK(mode) or stat.S_ISFIFO(mode) except Exception: return False From 972a26b2978144b8cd71dcbaf699b26e64b93f5d Mon Sep 17 00:00:00 2001 From: bfly Date: Tue, 30 Dec 2025 09:53:56 +0800 Subject: [PATCH 089/153] fix: refuse to run install.sh as root/sudo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add EUID check at script start to prevent installation as root user. Supports i18n error messages (en/zh). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- install.sh | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/install.sh b/install.sh index 70230c7..4c35fce 100755 --- a/install.sh +++ b/install.sh @@ -67,6 +67,9 @@ msg() { wezterm_recommended) en_msg="Recommend installing WezTerm as terminal frontend" zh_msg="推荐安装 WezTerm 作为终端前端" ;; + root_error) + en_msg="ERROR: Do not run as root/sudo. Please run as normal user." + zh_msg="错误:请勿以 root/sudo 身份运行。请使用普通用户执行。" ;; *) en_msg="$key" zh_msg="$key" ;; @@ -78,6 +81,12 @@ msg() { fi } +# Check for root/sudo - refuse to run as root +if [[ "${EUID:-$(id -u)}" -eq 0 ]]; then + msg root_error >&2 + exit 1 +fi + SCRIPTS_TO_LINK=( bin/cask bin/cask-w From ff840e7c1c3391288813ced010f648892c5e4cc9 Mon Sep 17 00:00:00 2001 From: bfly Date: Tue, 30 Dec 2025 09:55:44 +0800 Subject: [PATCH 090/153] docs: update README to v2.3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- README.md | 7 +++++++ README_zh.md | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/README.md b/README.md index 640d67c..af0b4b8 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,13 @@ **Build a real AI expert team. Give Claude Code / Codex / Gemini partners that never forget.** +

+ 交互皆可见模型皆可控 +

+

+ Every Interaction Visible, Every Model Controllable +

+ [![Version](https://img.shields.io/badge/version-2.3-orange.svg)]() [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) diff --git a/README_zh.md b/README_zh.md index add4cda..ccec603 100644 --- a/README_zh.md +++ b/README_zh.md @@ -6,6 +6,13 @@ **打造真实的大模型专家协作团队,给 Claude Code / Codex / Gemini 配上"不会遗忘"的搭档** +

+ 交互皆可见模型皆可控 +

+

+ Every Interaction Visible, Every Model Controllable +

+ [![Version](https://img.shields.io/badge/version-2.3-orange.svg)]() [![Platform](https://img.shields.io/badge/platform-Linux%20%7C%20macOS%20%7C%20Windows-lightgrey.svg)]() From 56c772c0a3381d9fae2a0ddcccac105fbfc03306 Mon Sep 17 00:00:00 2001 From: bfly Date: Tue, 30 Dec 2025 09:58:22 +0800 Subject: [PATCH 091/153] docs: use shields.io badges for slogan display MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace inline CSS spans with shields.io badges for better GitHub rendering compatibility. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- README.md | 6 ++++-- README_zh.md | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index af0b4b8..94a0f61 100644 --- a/README.md +++ b/README.md @@ -7,10 +7,12 @@ **Build a real AI expert team. Give Claude Code / Codex / Gemini partners that never forget.**

- 交互皆可见模型皆可控 + 交互皆可见 + 模型皆可控

- Every Interaction Visible, Every Model Controllable + Every Interaction Visible + Every Model Controllable

[![Version](https://img.shields.io/badge/version-2.3-orange.svg)]() diff --git a/README_zh.md b/README_zh.md index ccec603..2eb10c9 100644 --- a/README_zh.md +++ b/README_zh.md @@ -7,10 +7,12 @@ **打造真实的大模型专家协作团队,给 Claude Code / Codex / Gemini 配上"不会遗忘"的搭档**

- 交互皆可见模型皆可控 + 交互皆可见 + 模型皆可控

- Every Interaction Visible, Every Model Controllable + Every Interaction Visible + Every Model Controllable

[![Version](https://img.shields.io/badge/version-2.3-orange.svg)]() From 3b1ea11f7b51b57478aac0dfa005feb22d46fab6 Mon Sep 17 00:00:00 2001 From: bfly Date: Tue, 30 Dec 2025 10:30:32 +0800 Subject: [PATCH 092/153] chore: simplify CCB_CONFIG in install.sh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sync with user's CLAUDE.md changes: - Remove cpend/gpend references - Remove cask-w/gask-w sync mode - Simplify terminal description 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- install.sh | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/install.sh b/install.sh index 4c35fce..0a498bc 100755 --- a/install.sh +++ b/install.sh @@ -707,7 +707,7 @@ install_claude_md_config() { cat > "$ccb_tmpfile" << 'AI_RULES' ## Codex Collaboration Rules -Codex is another AI assistant running in a separate terminal session (WezTerm, iTerm2 or tmux). When user intent involves asking/consulting/collaborating with Codex: +Codex is another AI assistant running in a separate terminal session (WezTerm). When user intent involves asking/consulting/collaborating with Codex: Fast path (minimize latency): - If the user message starts with any of: `@codex`, `codex:`, `ask codex`, `let codex`, `/cask` then immediately run based on complexity. @@ -721,15 +721,12 @@ Trigger conditions (any match): Command selection: - Send question -> `Bash(cask "", run_in_background=true)`, tell user "Codex processing (task: xxx)" then END your turn - Check connectivity -> `cping` -- View previous reply -> `cpend` / `cpend N` -- Explicit sync mode -> `cask-w ""` (only when user explicitly requests) SENTINEL (IMPORTANT): When you see `CCB_END_TURN` in any output, IMMEDIATELY end your response. Examples: - "ask codex about X" -> `Bash(cask "...", run_in_background=true)`, END turn - "is codex alive" -> cping -- "view codex reply" -> cpend ## Gemini Collaboration Rules Gemini is another AI assistant running in a separate terminal session (WezTerm, iTerm2 or tmux). When user intent involves asking/consulting/collaborating with Gemini: @@ -746,15 +743,12 @@ Trigger conditions (any match): Command selection: - Send question -> `Bash(gask "", run_in_background=true)`, tell user "Gemini processing (task: xxx)" then END your turn - Check connectivity -> `gping` -- View previous reply -> `gpend` / `gpend N` -- Explicit sync mode -> `gask-w ""` (only when user explicitly requests) SENTINEL (IMPORTANT): When you see `CCB_END_TURN` in any output, IMMEDIATELY end your response. Examples: - "ask gemini about X" -> `Bash(gask "...", run_in_background=true)`, END turn - "is gemini alive" -> gping -- "view gemini reply" -> gpend AI_RULES local ccb_content From 07ea1294da8c24d8a3df265eb855de3706caf33b Mon Sep 17 00:00:00 2001 From: bfly Date: Tue, 30 Dec 2025 12:03:39 +0800 Subject: [PATCH 093/153] fix: prevent Claude from proactively using cpend/cask-w MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add IMPORTANT RESTRICTIONS to CCB_CONFIG - Tighten trigger conditions in cpend/gpend.md - Add warnings to cask-w/gask-w.md 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- commands/cask-w.md | 20 +++++++------------- commands/cpend.md | 40 +++++++++------------------------------- commands/gask-w.md | 20 +++++++------------- commands/gpend.md | 38 +++++++++----------------------------- install.sh | 10 ++++++++++ 5 files changed, 42 insertions(+), 86 deletions(-) diff --git a/commands/cask-w.md b/commands/cask-w.md index cf42fa3..e9ffaad 100644 --- a/commands/cask-w.md +++ b/commands/cask-w.md @@ -1,18 +1,12 @@ -Send message to Codex and wait for reply via `cask-w` (foreground sync). +WARNING: Only use when user EXPLICITLY requests sync/foreground mode. +Do NOT use as alternative to cask. -Execution: -- Run `Bash(cask-w "")` and wait until it returns +Send message to Codex via `cask-w` (foreground sync). + +Execution: `Bash(cask-w "")` Parameters: - `` required -- `--timeout SECONDS` optional (default from `CCB_SYNC_TIMEOUT`, fallback 3600) -- `--output FILE` optional: write reply atomically to FILE (stdout still prints the reply) - -Output contract: -- stdout: reply text only -- stderr: progress/errors -- exit code: 0 = got reply, 2 = timeout/no reply, 1 = error +- `--timeout SECONDS` optional -Hints: -- Use `cask` with `run_in_background=true` for background waiting -- Use `/cpend` to view the latest reply from official logs +Output: stdout = reply, exit code 0 = success diff --git a/commands/cpend.md b/commands/cpend.md index 820de65..bac063d 100644 --- a/commands/cpend.md +++ b/commands/cpend.md @@ -1,35 +1,13 @@ -Use `cpend` to fetch latest reply from Codex official logs (`~/.codex/sessions/`). +Use `cpend` to fetch latest reply from Codex logs. -Trigger conditions (any match): -- User mentions cpend/Cpend -- User wants to view/fetch/get Codex reply/response -- User asks for recent N Codex conversations/replies (e.g. "调取最近5条codex回复", "show last 3 codex messages") +WARNING: Only use when user EXPLICITLY requests. Do NOT use proactively after cask. -Execution: -- `cpend` - fetch latest single reply: `Bash(cpend)` -- `cpend N` - fetch last N conversations (Q&A pairs): `Bash(cpend N)` (e.g. `cpend 5`) -- Keep command execution silent, no additional analysis after execution - -Output format (when N > 1): -``` -Q: user question 1 -A: codex reply 1 ---- -Q: user question 2 -A: codex reply 2 -``` +Trigger conditions (ALL must match): +- User EXPLICITLY mentions cpend/Cpend +- Or user asks to "view codex reply" / "show codex response" -Features: -1. Reads Codex official session JSONL logs from `~/.codex/sessions/` -2. Prints the latest assistant reply (`cpend`) or the last N Q&A pairs (`cpend N`) -3. If no reply is available, exits with code 2 and prints a message to stderr - -Common scenarios: -- View results after running `cask` in background -- Manually confirm if Codex has responded after a background task completes -- Need to verify if Codex reply matches original question -- Review recent conversation history with Codex +Execution: +- `cpend` - fetch latest reply: `Bash(cpend)` +- `cpend N` - fetch last N Q&A pairs: `Bash(cpend N)` -Hints: -- Log file usually located at `~/.codex/sessions/.../rollout-.jsonl` -- If command returns empty, first confirm Codex session is still running (use `/cping` to check) +Output: stdout = reply text, exit code 0 = success, 2 = no reply diff --git a/commands/gask-w.md b/commands/gask-w.md index ab02fa8..49b0f7f 100644 --- a/commands/gask-w.md +++ b/commands/gask-w.md @@ -1,18 +1,12 @@ -Send message to Gemini and wait for reply via `gask-w` (foreground sync). +WARNING: Only use when user EXPLICITLY requests sync/foreground mode. +Do NOT use as alternative to gask. -Execution: -- Run `Bash(gask-w "")` and wait until it returns +Send message to Gemini via `gask-w` (foreground sync). + +Execution: `Bash(gask-w "")` Parameters: - `` required -- `--timeout SECONDS` optional (default from `CCB_SYNC_TIMEOUT`, fallback 3600) -- `--output FILE` optional: write reply atomically to FILE (stdout still prints the reply) - -Output contract: -- stdout: reply text only -- stderr: progress/errors -- exit code: 0 = got reply, 2 = timeout/no reply, 1 = error +- `--timeout SECONDS` optional -Hints: -- Use `gask` with `run_in_background=true` for background waiting -- Use `/gpend` to view the latest reply from Gemini logs +Output: stdout = reply, exit code 0 = success diff --git a/commands/gpend.md b/commands/gpend.md index dd61ed7..5008409 100644 --- a/commands/gpend.md +++ b/commands/gpend.md @@ -1,33 +1,13 @@ -Use `gpend` to fetch latest reply from Gemini logs (`~/.gemini/tmp/.../chats/session-*.json`). +Use `gpend` to fetch latest reply from Gemini logs. -Trigger conditions (any match): -- User mentions gpend/Gpend -- User wants to view/fetch/get Gemini reply/response -- User asks for recent N Gemini conversations/replies (e.g. "调取最近5条gemini回复", "show last 3 gemini messages") +WARNING: Only use when user EXPLICITLY requests. Do NOT use proactively after gask. -Execution: -- `gpend` - fetch latest single reply: `Bash(gpend)` -- `gpend N` - fetch last N conversations (Q&A pairs): `Bash(gpend N)` (e.g. `gpend 5`) -- Keep command execution silent, no additional analysis after execution - -Output format (when N > 1): -``` -Q: user question 1 -A: gemini reply 1 ---- -Q: user question 2 -A: gemini reply 2 -``` +Trigger conditions (ALL must match): +- User EXPLICITLY mentions gpend/Gpend +- Or user asks to "view gemini reply" / "show gemini response" -Output contract: -- stdout: reply text (or Q&A pairs) -- stderr: message when no reply / errors -- exit code: 0 = got reply, 2 = no reply available, 1 = error - -Common scenarios: -- View reply after running `gask` in background -- Continue getting reply after a foreground/background wait returns empty/timeout -- Review recent conversation history with Gemini +Execution: +- `gpend` - fetch latest reply: `Bash(gpend)` +- `gpend N` - fetch last N Q&A pairs: `Bash(gpend N)` -Hints: -- If command exits with code 2, first confirm Gemini session is still running (use `/gping` to check) +Output: stdout = reply text, exit code 0 = success, 2 = no reply diff --git a/install.sh b/install.sh index 0a498bc..73d7632 100755 --- a/install.sh +++ b/install.sh @@ -722,6 +722,11 @@ Command selection: - Send question -> `Bash(cask "", run_in_background=true)`, tell user "Codex processing (task: xxx)" then END your turn - Check connectivity -> `cping` +IMPORTANT RESTRICTIONS: +- NEVER use cpend/cask-w unless user EXPLICITLY requests +- After cask, ONLY wait for bash-notification to get results +- Do NOT try to fetch results yourself + SENTINEL (IMPORTANT): When you see `CCB_END_TURN` in any output, IMMEDIATELY end your response. Examples: @@ -744,6 +749,11 @@ Command selection: - Send question -> `Bash(gask "", run_in_background=true)`, tell user "Gemini processing (task: xxx)" then END your turn - Check connectivity -> `gping` +IMPORTANT RESTRICTIONS: +- NEVER use gpend/gask-w unless user EXPLICITLY requests +- After gask, ONLY wait for bash-notification to get results +- Do NOT try to fetch results yourself + SENTINEL (IMPORTANT): When you see `CCB_END_TURN` in any output, IMMEDIATELY end your response. Examples: From 73c867562d88c9faf212048c98b901e9156aac3e Mon Sep 17 00:00:00 2001 From: bfly Date: Tue, 30 Dec 2025 15:39:09 +0800 Subject: [PATCH 094/153] fix: auto-update .gemini-session with actual session path in gpend MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When gpend finds a session via fallback scan, automatically update .gemini-session file to remember the correct path for future use. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- bin/gpend | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/bin/gpend b/bin/gpend index e94caf9..3cb9477 100755 --- a/bin/gpend +++ b/bin/gpend @@ -50,6 +50,32 @@ def _load_session_path() -> Path | None: return None +def _update_session_file(actual_session: Path) -> None: + """Update .gemini-session with actual session path if different""" + session_file = Path.cwd() / ".gemini-session" + if not session_file.exists(): + return + try: + with session_file.open("r", encoding="utf-8") as f: + data = json.load(f) + + actual_str = str(actual_session) + if data.get("gemini_session_path") == actual_str: + return + + data["gemini_session_path"] = actual_str + try: + data["gemini_project_hash"] = actual_session.parent.parent.name + except Exception: + pass + + with session_file.open("w", encoding="utf-8") as f: + json.dump(data, f, ensure_ascii=False, indent=2) + _debug(f"Updated .gemini-session with: {actual_str}") + except Exception as exc: + _debug(f"Failed to update .gemini-session: {exc}") + + def _parse_n(argv: list[str]) -> int: if len(argv) <= 1: return 1 @@ -77,6 +103,11 @@ def main(argv: list[str]) -> int: if session_path and session_path.exists(): reader.set_preferred_session(session_path) + # Auto-update .gemini-session with actual session path + actual_session = reader.current_session_path() + if actual_session: + _update_session_file(actual_session) + if n > 1: conversations = reader.latest_conversations(n) if not conversations: From 133766389bf9b67fb09dbf177cb21af7bb292459 Mon Sep 17 00:00:00 2001 From: bfly Date: Tue, 30 Dec 2025 17:01:09 +0800 Subject: [PATCH 095/153] fix: improve Windows Enter key reliability in WezTerm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Increase default delay to 0.05s on Windows (was 0.01s) - Add retry mechanism (up to 3 attempts) - Add 0.05s delay between retries 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Codex Co-Authored-By: Claude Opus 4.5 --- lib/terminal.py | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/lib/terminal.py b/lib/terminal.py index 79107b5..b931736 100644 --- a/lib/terminal.py +++ b/lib/terminal.py @@ -287,14 +287,24 @@ def _bin(cls) -> str: def _send_enter(self, pane_id: str) -> None: """Send Enter key reliably using stdin (cross-platform)""" - enter_delay = _env_float("CCB_WEZTERM_ENTER_DELAY", 0.01) + # Windows needs longer delay + default_delay = 0.05 if os.name == "nt" else 0.01 + enter_delay = _env_float("CCB_WEZTERM_ENTER_DELAY", default_delay) if enter_delay: time.sleep(enter_delay) - subprocess.run( - [*self._cli_base_args(), "send-text", "--pane-id", pane_id, "--no-paste"], - input=b"\r", - check=False, - ) + + # Retry mechanism for reliability (Windows native occasionally drops Enter) + max_retries = 3 + for attempt in range(max_retries): + result = subprocess.run( + [*self._cli_base_args(), "send-text", "--pane-id", pane_id, "--no-paste"], + input=b"\r", + capture_output=True, + ) + if result.returncode == 0: + return + if attempt < max_retries - 1: + time.sleep(0.05) def send_text(self, pane_id: str, text: str) -> None: sanitized = text.replace("\r", "").strip() From 877d5f3d8b931bbcd888d283d03744b1b4644748 Mon Sep 17 00:00:00 2001 From: bfly Date: Tue, 30 Dec 2025 18:02:15 +0800 Subject: [PATCH 096/153] fix: improve Windows Enter key reliability in WezTerm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Increase default delay to 0.05s on Windows (was 0.01s) - Add retry mechanism (up to 3 attempts) - Add 0.05s delay between retries 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Codex Co-Authored-By: Claude Opus 4.5 --- lib/terminal.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/lib/terminal.py b/lib/terminal.py index b931736..2d60af1 100644 --- a/lib/terminal.py +++ b/lib/terminal.py @@ -312,14 +312,21 @@ def send_text(self, pane_id: str, text: str) -> None: return has_newlines = "\n" in sanitized - is_long = len(sanitized) > 200 - # Fast path: short single-line text -> use --no-paste directly - if not has_newlines and not is_long: - subprocess.run( - [*self._cli_base_args(), "send-text", "--pane-id", pane_id, "--no-paste", sanitized], - check=True, - ) + # Single-line: always avoid paste mode (prevents Codex showing "[Pasted Content ...]"). + # Use argv for short text; stdin for long text to avoid command-line length/escaping issues. + if not has_newlines: + if len(sanitized) <= 200: + subprocess.run( + [*self._cli_base_args(), "send-text", "--pane-id", pane_id, "--no-paste", sanitized], + check=True, + ) + else: + subprocess.run( + [*self._cli_base_args(), "send-text", "--pane-id", pane_id, "--no-paste"], + input=sanitized.encode("utf-8"), + check=True, + ) self._send_enter(pane_id) return From 91c3213a45df536f0c4b6974d07568d2973515fc Mon Sep 17 00:00:00 2001 From: bfly Date: Wed, 31 Dec 2025 09:29:43 +0800 Subject: [PATCH 097/153] docs: add contact info (email, wechat) to README_zh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- README_zh.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README_zh.md b/README_zh.md index 2eb10c9..63bda68 100644 --- a/README_zh.md +++ b/README_zh.md @@ -335,6 +335,9 @@ echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zprofile **测试用户群,欢迎加入** +📧 Email: bfly123@126.com +💬 WeChat: seemseam-com + 微信群 From 390b573685aef13f3a7db7932de4bf5ec54aaea0 Mon Sep 17 00:00:00 2001 From: bfly Date: Wed, 31 Dec 2025 09:32:19 +0800 Subject: [PATCH 098/153] fix: correct wechat image extension from .png to .jpg --- README_zh.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README_zh.md b/README_zh.md index 63bda68..b8596bd 100644 --- a/README_zh.md +++ b/README_zh.md @@ -338,6 +338,6 @@ echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zprofile 📧 Email: bfly123@126.com 💬 WeChat: seemseam-com -微信群 +微信群 From 06fcc917cc29abc03d29d40b2b4071e4f7db3165 Mon Sep 17 00:00:00 2001 From: bfly Date: Wed, 31 Dec 2025 09:40:48 +0800 Subject: [PATCH 099/153] docs: add contact info to English README --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 94a0f61..4a11f98 100644 --- a/README.md +++ b/README.md @@ -279,4 +279,13 @@ Once started, collaborate naturally. Claude will detect when to delegate tasks. **Windows fully supported** (WSL + Native via WezTerm) +--- + +**Join our community** + +📧 Email: bfly123@126.com +💬 WeChat: seemseam-com + +WeChat Group + From 711da25db518a6512d9ebaeedbf983e2c6e3612e Mon Sep 17 00:00:00 2001 From: bfly Date: Wed, 31 Dec 2025 09:41:53 +0800 Subject: [PATCH 100/153] fix: avoid explicit stdio passing on Windows to prevent EBADF MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Let subprocess inherit stdio by default instead of explicitly passing sys.stdin/stdout/stderr, which can produce non-console handles on Windows and trigger issues in Node-based CLIs like Claude Code. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Codex Co-Authored-By: Claude Opus 4.5 --- ccb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ccb b/ccb index 5584ad9..7b0fc04 100755 --- a/ccb +++ b/ccb @@ -949,7 +949,10 @@ exec tmux attach -t "$TMUX_SESSION" print(f"Executing: {' '.join(cmd)}") try: - return subprocess.run(cmd, stdin=sys.stdin, stdout=sys.stdout, stderr=sys.stderr, env=env).returncode + # Let subprocess inherit stdio by default. Explicitly passing sys.stdin/out/err + # can produce non-console handles on Windows (especially after re-wrapping + # stdout/stderr for UTF-8), which may trigger issues in Node-based CLIs. + return subprocess.run(cmd, env=env).returncode except KeyboardInterrupt: print(f"\n⚠️ {t('user_interrupted')}") return 130 From 4cff4a5c56c89ab165157fcd1a8ffcdd78552510 Mon Sep 17 00:00:00 2001 From: bfly Date: Thu, 1 Jan 2026 10:23:22 +0800 Subject: [PATCH 101/153] fix: sync codex_session_path in _get_latest_codex_session_id() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add codex_session_path to data.update() when updating session info - Remove CLAUDE.md from git tracking (keep local) - Add CLAUDE.md to .gitignore 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .gitignore | 1 + CLAUDE.md | 6 ------ ccb | 1 + 3 files changed, 2 insertions(+), 6 deletions(-) delete mode 100644 CLAUDE.md diff --git a/.gitignore b/.gitignore index 9c81ed5..297c8fa 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ __pycache__/ *.mp4 tmp/ compare_with_mcp/ +CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index 2f9ee5d..0000000 --- a/CLAUDE.md +++ /dev/null @@ -1,6 +0,0 @@ -- This is the claude_code_bridge (ccb) development folder. Pay attention to compatibility. When modifying code, also update install scripts. Use install.sh/install.ps1 to install. After completion, git commit and push. - -- Cross-platform compatibility notes: - - subprocess.run with text=True MUST include encoding="utf-8", errors="replace" (Windows defaults to GBK) - - Avoid #!/usr/bin/env python3 shebang on Windows (triggers App Store stub, exit 49). Use python or sys.executable - - Always test on both Linux and Windows when modifying install scripts or terminal-related code \ No newline at end of file diff --git a/ccb b/ccb index 7b0fc04..a470c5c 100755 --- a/ccb +++ b/ccb @@ -502,6 +502,7 @@ class AILauncher: work_dir = Path.cwd() data.update({ "codex_session_id": sid, + "codex_session_path": str(log_path), "work_dir": str(work_dir), "work_dir_norm": _normalize_path_for_match(str(work_dir)), "updated_at": time.strftime("%Y-%m-%d %H:%M:%S"), From 5a7c91c4095e16b7bb4a6cb14e2d1fdd4c5e73ea Mon Sep 17 00:00:00 2001 From: bfly Date: Thu, 1 Jan 2026 20:10:58 +0800 Subject: [PATCH 102/153] feat: add CCA (Claude Code Autoflow) integration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add _detect_cca() and _get_cca_version() helpers - Show CCA version info in ccb -v - Add _update_cca() function for install/update - Auto-update CCA when running ccb update - Add ccb update cca command for standalone install 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- ccb | 116 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 115 insertions(+), 1 deletion(-) diff --git a/ccb b/ccb index a470c5c..bc41951 100755 --- a/ccb +++ b/ccb @@ -1332,6 +1332,36 @@ def _get_remote_version_info() -> dict | None: return None +def _detect_cca() -> tuple[str | None, str | None]: + """Detect CCA installation. Returns (cca_path, install_dir)""" + cca_path = shutil.which("cca") + if cca_path: + install_dir = Path(cca_path).resolve().parent + return cca_path, str(install_dir) + candidates = [ + Path.home() / ".local/share/claude_code_autoflow", + Path.home() / ".local/bin/cca", + ] + for p in candidates: + if p.exists(): + return str(p), str(p.parent if p.is_file() else p) + return None, None + + +def _get_cca_version(cca_path: str) -> str | None: + """Get CCA version by running cca -v""" + try: + result = subprocess.run( + [cca_path, "-v"], capture_output=True, text=True, + encoding="utf-8", errors="replace", timeout=5 + ) + if result.returncode == 0: + return result.stdout.strip().split('\n')[0] + except Exception: + pass + return None + + def cmd_version(args): """Show version info and check for updates""" script_root = Path(__file__).resolve().parent @@ -1361,11 +1391,75 @@ def cmd_version(args): else: print("⚠️ Unable to compare versions") + # CCA info + print() + cca_path, cca_dir = _detect_cca() + if cca_path: + cca_ver = _get_cca_version(cca_path) + print(f"cca (Claude Code Autoflow) {cca_ver or 'unknown'}") + print(f"Install path: {cca_dir}") + else: + print("cca (Claude Code Autoflow) not installed") + print(" Install: ccb update cca") + print(" Tip: CCA significantly enhances workflow automation") + return 0 +def _update_cca(silent: bool = False) -> int: + """Install or update CCA""" + import urllib.request + import tarfile + import tempfile + + cca_repo = "https://github.com/bfly123/claude_code_autoflow" + cca_path, cca_dir = _detect_cca() + + # Try git pull if .git exists + if cca_dir and Path(cca_dir).exists() and (Path(cca_dir) / ".git").exists(): + if not silent: + print("🔄 Updating CCA via git pull...") + result = subprocess.run( + ["git", "-C", cca_dir, "pull", "--ff-only"], + capture_output=True, text=True, encoding="utf-8", errors="replace" + ) + if result.returncode == 0: + print("✅ CCA updated successfully") + return 0 + + # Fresh install via tarball + if not silent: + print("📦 Installing CCA from GitHub...") + install_dir = Path.home() / ".local/share/claude_code_autoflow" + tarball_url = f"{cca_repo}/archive/refs/heads/main.tar.gz" + + try: + with tempfile.TemporaryDirectory() as tmpdir: + tarball = Path(tmpdir) / "cca.tar.gz" + urllib.request.urlretrieve(tarball_url, tarball) + with tarfile.open(tarball, "r:gz") as tf: + tf.extractall(tmpdir) + extracted = Path(tmpdir) / "claude_code_autoflow-main" + if install_dir.exists(): + shutil.rmtree(install_dir) + shutil.copytree(extracted, install_dir) + install_script = install_dir / "install.sh" + if install_script.exists(): + subprocess.run(["bash", str(install_script), "install"], cwd=install_dir) + print("✅ CCA installed successfully") + print(f" Path: {install_dir}") + return 0 + except Exception as e: + print(f"❌ CCA install failed: {e}") + return 1 + + def cmd_update(args): """Update ccb to latest version""" + # Handle "ccb update cca" subcommand + if hasattr(args, 'target') and args.target == 'cca': + return _update_cca() + import urllib.request import tarfile import tempfile @@ -1402,6 +1496,15 @@ def cmd_update(args): print(f"✅ Updated: {old_str} → {new_str}") else: print(f"✅ Already up to date: {new_str}") + # CCA update/suggest + cca_path, _ = _detect_cca() + if cca_path: + print("\n🔄 Updating CCA...") + _update_cca(silent=False) + else: + print("\n💡 CCA (Claude Code Autoflow) not installed") + print(" Install: ccb update cca") + print(" Tip: Significantly enhances workflow automation") return 0 else: print(f"⚠️ Git pull failed: {result.stderr.strip()}") @@ -1527,6 +1630,15 @@ def cmd_update(args): print(f"✅ Updated: {old_str} → {new_str}") else: print(f"✅ Already up to date: {new_str}") + # CCA update/suggest + cca_path, _ = _detect_cca() + if cca_path: + print("\n🔄 Updating CCA...") + _update_cca(silent=False) + else: + print("\n💡 CCA (Claude Code Autoflow) not installed") + print(" Install: ccb update cca") + print(" Tip: Significantly enhances workflow automation") return 0 except Exception as e: @@ -1562,7 +1674,9 @@ def main(): restore_parser.add_argument("providers", nargs="*", default=[], help="Backends to restore (codex/gemini)") # update subcommand - subparsers.add_parser("update", help="Update to latest version") + update_parser = subparsers.add_parser("update", help="Update to latest version") + update_parser.add_argument("target", nargs="?", choices=["cca"], + help="Optional: 'cca' to install/update CCA only") # version subcommand subparsers.add_parser("version", help="Show version and check for updates") From 3a5c0fbc5af0a78498c78e5f1a5decf46314de9f Mon Sep 17 00:00:00 2001 From: bfly Date: Fri, 2 Jan 2026 18:17:33 +0800 Subject: [PATCH 103/153] feat: convert cask/gask to Claude Skills (test version) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add skills/cask/SKILL.md and skills/gask/SKILL.md - Improve description for precise triggering - Narrow trigger conditions to avoid false positives - Use $ARGUMENTS instead of placeholder - Add error handling for failed executions - Update install.sh and install.ps1 for skills installation - Update WeChat QR code image 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- assets/figure.png | Bin 380065 -> 163234 bytes install.ps1 | 15 ++++++++++ install.sh | 21 +++++++++++++ skills/cask/SKILL.md | 68 +++++++++++++++++++++++++++++++++++++++++++ skills/gask/SKILL.md | 68 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 172 insertions(+) create mode 100644 skills/cask/SKILL.md create mode 100644 skills/gask/SKILL.md diff --git a/assets/figure.png b/assets/figure.png index 39fda4933fe1981f03c10e013a8701f29f8c1325..99a506386e3727f22336a0c2b30b04355fa30956 100644 GIT binary patch literal 163234 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�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

5CM~nMo*v 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%0A)yAS< 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

)VxsPue6L^}ip;D)e@Z&xZ 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�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


pe2&rH`7dsQ@1WoE{{VBbz1Ot4%FA#>%uHWB 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
b!EI90b;y{&tT2|L)cCY3 z<~S`e@Lm)-HPd2o@m-Y-q{nGh&W-fI-IvM&l4Oz&<^c+nW8dUkq~nD5rv`#1VSAJVK@%*G5H(-{w|r;9awsh_rPoZR#fwMJmH-TdZOC$I!LyyjZ$|tMy+c=!_xSgtdzZY z35U>V?w7Wf@ZvB+iar*>iUDIjMUQ3w&&vB+p4jLe?7?%J7@ej(5xTX%vKtzdIs`&m zN5Qn_E%@!tV@^7cn>x-zUXAf`J5iWNTQ$opo=cSG_xCE$;zZ!7SKhHamwOww-uif9 zPxHh2k**@SkzIJ`b%mBF*}S1;d&aOHea`4|Ni|>f90op=GC5Y%Xe1Ne_N#k(aE^a@ z&lPsBa+33MbF>7JN}RuFFIGXMtEep4^GpP~yTpH4j{34J@k+%|J*R_G#EzKT#_~(c z(TVPCihB*ot)XWJ6|4`!mvXJ-98P{l5IpV7K7MJ`XwR3{S5lThI;3n_(fR`0zP-;R zVdKN;_hTW%4n+Gi{ogq80exC>-TeO4da zTSuREE4O44zOSvmYF#2tnu zUpPxjkCMGKse3uNtWaK=Gs|ti)x@O+xyy_NkZ<3p>yqG0Nwe9>ppCF?h?kg{?#-VZSl1+=}^J72#`qcv+0Tsu`#4j zy0z_+RUam^)K>V#EVbvG=wJWx3ZjQjx3TbV9yJXtzVVce3zKaj(;JkdvQG6vU_=C- ziS$O(FTNo(y|D7>hlDfS-cHr5HH03|e=lO0Y~6g(%@9Z$(j0~}jW>S%Aavn)3$tf- z;vgGonBLgZM7F0}SzEDR<-=snP%x9!h#!xuQ29L2XdO$?Q~!0-NB8{N_6Gh6C5c8$ znN7LMZ;7RzGEaHjyUQ$SOq-q|klzyBA{e94IU*jh0fa&y@rM)t=nt*La!~f!Sk7~O z9Cjz7u+Vq;N#gjm$81;bW_b6~ty5Un)E*1ICQpoI3Foa*Xbo)Bx}5RikU2f( z+w0{^Mf_DRSZAIa3(tyQVGs3aQ!A4Z)IL4T&poahHCrjZ?y3vzcX8)CN$tOgEWWUA zXOc*?YMA<}U6%RaP2#g|lvu&HEBR>NnydU|C9Rs1PR~hLLwcT5zmtoV(~;mz5Lg$% zy6#!omF(>2d!J2+oh38*6tl=RccXo9uySZc?d`e$kV;~H!eCbMm$L^P+BQtuXMg7v zNl4l3C;poC2vzD7U0I6V+QAaf8;Y!9yNYd5=hUUKD2(t}c6AxRt3O?s_B=N#tXr?> zs8vcq(LP@M;*lfbrhH>0PrpjBYu(Li@e4nxnn$8dkxR7GNSla(bnj$q+j*`Md;#*_$(RA73I+A-rFe4I`@ z41=DXpWfP||I0KJgPgklNx|0r`iMjO%$&zZ#|oF0w96Xqeh&G3#&NNq9@u-4WblQo z7iFH_`}2&K29fRYUF!oDId;TwYS&i-y^<8F_jN>a z#QkG?*e-d!!J3=z`%TwFVoY~WJO>V~-XFpikuCq1mTc>I73<6FIe(|OY(VDmoF@kK?c(x z?#*t|5Fij4PMdDpk0|MrxRM_Xn_RP#V^_`WTW;iBs!r`R_7A4eNm$%zlcO(b*@a)|o#pUZv&n+OO#l7#o@sWF}WoUrl_GNDv zBRW~|>x`RkK7L>1q7UI1&ctQ7&mr>==cc)#$>NWh`GX*j-_hChFI3CE#<6ld#i)IG z7*~eFbem6MQ2GgusJ{xG9kGg7K!|MmTYEu7;JjIM;Z%(8j%}Bu(T4b_KBwxX zrkFre8&&be@!TmB@A}!o-^S6YJ&HJxOx&Cn;i|59d^xmlDxYsE^$PfkdclqXY6LD{ zm5rQF=yhsB3#@1*)?wRJoBr>t@0l_^(hdGuMbj$foL%XhjbmvFCF2ka;7IFRj=oJ4 zPIWjPL1Y&_pn{hkqR>p%2g`lgUYhihl88;PlI1zO_mqvL=i>7t`->ZSKYeyX2mVAL z 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 z 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 diff --git a/install.ps1 b/install.ps1 index a4a0cba..c4d3359 100644 --- a/install.ps1 +++ b/install.ps1 @@ -289,6 +289,21 @@ function Install-ClaudeConfig { } } + # Install skills + $skillsDir = Join-Path $claudeDir "skills" + $srcSkills = Join-Path $repoRoot "skills" + if (Test-Path $srcSkills) { + if (-not (Test-Path $skillsDir)) { + New-Item -ItemType Directory -Path $skillsDir -Force | Out-Null + } + Get-ChildItem -Path $srcSkills -Directory | ForEach-Object { + $destPath = Join-Path $skillsDir $_.Name + if (Test-Path $destPath) { Remove-Item -Recurse -Force $destPath } + Copy-Item -Recurse $_.FullName $destPath + Write-Host " Installed skill: $($_.Name)" + } + } + $codexRules = @" ## Codex Collaboration Rules diff --git a/install.sh b/install.sh index 73d7632..fe11309 100755 --- a/install.sh +++ b/install.sh @@ -636,6 +636,26 @@ install_claude_commands() { echo "Updated Claude commands directory: $claude_dir" } +install_claude_skills() { + local skills_src="$REPO_ROOT/skills" + local skills_dst="$HOME/.claude/skills" + + if [[ ! -d "$skills_src" ]]; then + return + fi + + mkdir -p "$skills_dst" + for skill_dir in "$skills_src"/*/; do + [[ -d "$skill_dir" ]] || continue + local skill_name + skill_name=$(basename "$skill_dir") + rm -rf "$skills_dst/$skill_name" + cp -r "$skill_dir" "$skills_dst/$skill_name" + echo " Installed skill: $skill_name" + done + echo "Updated Claude skills directory: $skills_dst" +} + CCB_START_MARKER="" CCB_END_MARKER="" LEGACY_RULE_MARKER="## Codex 协作规则" @@ -897,6 +917,7 @@ install_all() { install_bin_links ensure_path_configured install_claude_commands + install_claude_skills install_claude_md_config install_settings_permissions echo "OK: Installation complete" diff --git a/skills/cask/SKILL.md b/skills/cask/SKILL.md new file mode 100644 index 0000000..59c8f88 --- /dev/null +++ b/skills/cask/SKILL.md @@ -0,0 +1,68 @@ +--- +name: cask +description: Async via cask, end turn immediately; use only when user explicitly delegates to Codex (ask/@codex/let codex/review); NOT for questions about Codex itself. +--- + +# Ask Codex Skill + +Send a question to Codex AI assistant running in a separate terminal (async). + +## Trigger Conditions + +Use this skill ONLY when user **explicitly delegates** to Codex: +- User says "@codex" / "ask codex" / "let codex" / "问codex" / "让codex" / "请codex" + action verb +- User requests Codex to review/analyze/suggest/debug/help with code or design + +**DO NOT trigger** when: +- User asks questions **about** Codex (e.g., "What is Codex?", "How does Codex work?") +- User mentions Codex in passing without delegation intent + +## Execution (MANDATORY) + +**CRITICAL: ALWAYS use run_in_background=true - NO EXCEPTIONS** + +``` +Bash(cask "$ARGUMENTS", run_in_background=true) +``` + +Where `$ARGUMENTS` is the user's delegation request (forwarded as-is to Codex). + +## Workflow (IMPORTANT) + +This is an **async task submission** workflow: +1. Submit task to background → Codex processes in separate terminal +2. IMMEDIATELY END your turn → Do NOT wait +3. Background completes → System auto-recalls you with result +4. You can start new conversation immediately + +## After Execution (MANDATORY) + +**If Bash succeeds:** +1. Tell user "Codex processing..." (include task_id if available) +2. **IMMEDIATELY END your turn** +3. **DO NOT wait for result** +4. **DO NOT check status** +5. **DO NOT continue working** + +**If Bash fails (error/non-zero exit):** +1. Report the error to user +2. Suggest checking if Codex session is running (`ccb status codex`) +3. Do NOT pretend task is processing + +The system will automatically recall you when Codex responds. + +## Wrong vs Right + +❌ WRONG: `Bash(cask "question")` - blocks and waits +❌ WRONG: `Bash(cask "", run_in_background=true)` - placeholder syntax +❌ WRONG: Submit then check status - wastes time +✅ RIGHT: `Bash(cask "$ARGUMENTS", run_in_background=true)` then END turn + +## SENTINEL + +When output contains `CCB_END_TURN`, end response immediately. + +## Parameters + +- `--timeout SECONDS` optional (default 3600) +- `--output FILE` optional: write reply to FILE diff --git a/skills/gask/SKILL.md b/skills/gask/SKILL.md new file mode 100644 index 0000000..9068481 --- /dev/null +++ b/skills/gask/SKILL.md @@ -0,0 +1,68 @@ +--- +name: gask +description: Async via gask, end turn immediately; use only when user explicitly delegates to Gemini (ask/@gemini/let gemini/review); NOT for questions about Gemini itself. +--- + +# Ask Gemini Skill + +Send a question to Gemini AI assistant running in a separate terminal (async). + +## Trigger Conditions + +Use this skill ONLY when user **explicitly delegates** to Gemini: +- User says "@gemini" / "ask gemini" / "let gemini" / "问gemini" / "让gemini" / "请gemini" + action verb +- User requests Gemini to review/analyze/suggest/debug/help with code or design + +**DO NOT trigger** when: +- User asks questions **about** Gemini (e.g., "What is Gemini?", "How does Gemini work?") +- User mentions Gemini in passing without delegation intent + +## Execution (MANDATORY) + +**CRITICAL: ALWAYS use run_in_background=true - NO EXCEPTIONS** + +``` +Bash(gask "$ARGUMENTS", run_in_background=true) +``` + +Where `$ARGUMENTS` is the user's delegation request (forwarded as-is to Gemini). + +## Workflow (IMPORTANT) + +This is an **async task submission** workflow: +1. Submit task to background → Gemini processes in separate terminal +2. IMMEDIATELY END your turn → Do NOT wait +3. Background completes → System auto-recalls you with result +4. You can start new conversation immediately + +## After Execution (MANDATORY) + +**If Bash succeeds:** +1. Tell user "Gemini processing..." (include task_id if available) +2. **IMMEDIATELY END your turn** +3. **DO NOT wait for result** +4. **DO NOT check status** +5. **DO NOT continue working** + +**If Bash fails (error/non-zero exit):** +1. Report the error to user +2. Suggest checking if Gemini session is running (`ccb status gemini`) +3. Do NOT pretend task is processing + +The system will automatically recall you when Gemini responds. + +## Wrong vs Right + +❌ WRONG: `Bash(gask "question")` - blocks and waits +❌ WRONG: `Bash(gask "", run_in_background=true)` - placeholder syntax +❌ WRONG: Submit then check status - wastes time +✅ RIGHT: `Bash(gask "$ARGUMENTS", run_in_background=true)` then END turn + +## SENTINEL + +When output contains `CCB_END_TURN`, end response immediately. + +## Parameters + +- `--timeout SECONDS` optional (default 3600) +- `--output FILE` optional: write reply to FILE From 4e6ef882ca62c70141e82d75bec86cf7a6448bff Mon Sep 17 00:00:00 2001 From: bfly Date: Fri, 2 Jan 2026 18:30:36 +0800 Subject: [PATCH 104/153] chore: remove old WeChat QR code (figure.png) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use wechat.jpg as the new WeChat group QR code instead. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- assets/figure.png | Bin 163234 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 assets/figure.png diff --git a/assets/figure.png b/assets/figure.png deleted file mode 100644 index 99a506386e3727f22336a0c2b30b04355fa30956..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163234 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�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

5CM~nMo*v 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 Date: Fri, 2 Jan 2026 18:35:22 +0800 Subject: [PATCH 105/153] chore: update WeChat QR code to weixin.png MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace wechat.jpg with weixin.png - Update references in README.md and README_zh.md 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- assets/wechat.jpg | Bin 146111 -> 0 bytes assets/weixin.png | Bin 0 -> 163234 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 assets/wechat.jpg create mode 100644 assets/weixin.png diff --git a/assets/wechat.jpg b/assets/wechat.jpg deleted file mode 100644 index 2a08982f91bd6b6559734a2d9b8d809bba3c9777..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146111 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

%?^L>(M<{z!N(2+!t{WH^2;Ut|dEc+P#X? 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


BJ@y>t6`O! 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�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

5CM~nMo*v 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 Date: Sat, 3 Jan 2026 01:33:34 +0800 Subject: [PATCH 106/153] feat: add OpenCode integration and update codex auto mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add OpenCode integration to CCB system - New communication module: lib/opencode_comm.py - New CLI commands: oask, oask-w, opend, oping - 2x2 grid layout support via ccb-layout - Update install scripts and documentation - Change codex -a parameter to use --dangerously-bypass-approvals-and-sandbox - More aggressive auto mode for codex - Aligns with user's "yolo mode" requirement 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- README.md | 7 +- README_zh.md | 7 +- bin/ccb-layout | 46 ++++ bin/oask | 130 ++++++++++ bin/oask-w | 101 ++++++++ bin/opend | 55 ++++ bin/oping | 35 +++ ccb | 167 +++++++++--- commands/oask-w.md | 13 + commands/oask.md | 27 ++ commands/opend.md | 13 + commands/oping.md | 10 + install.ps1 | 70 +++++- install.sh | 64 ++++- lib/opencode_comm.py | 586 +++++++++++++++++++++++++++++++++++++++++++ 15 files changed, 1290 insertions(+), 41 deletions(-) create mode 100644 bin/ccb-layout create mode 100644 bin/oask create mode 100644 bin/oask-w create mode 100644 bin/opend create mode 100644 bin/oping create mode 100644 commands/oask-w.md create mode 100644 commands/oask.md create mode 100644 commands/opend.md create mode 100644 commands/oping.md create mode 100644 lib/opencode_comm.py diff --git a/README.md b/README.md index 4a11f98..2f7c247 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ **Silky Smooth Claude & Codex & Gemini Collaboration via Split-Pane Terminal** -**Build a real AI expert team. Give Claude Code / Codex / Gemini partners that never forget.** +**Build a real AI expert team. Give Claude Code / Codex / Gemini / OpenCode partners that never forget.**

交互皆可见 @@ -104,7 +104,10 @@ powershell -ExecutionPolicy Bypass -File .\install.ps1 install ```bash ccb up codex # Start Codex ccb up gemini # Start Gemini +ccb up opencode # Start OpenCode ccb up codex gemini # Start both +ccb up codex gemini opencode # Start all three +ccb-layout # Start 2x2 layout (Codex+Gemini+OpenCode) ``` ### Flags @@ -286,6 +289,6 @@ Once started, collaborate naturally. Claude will detect when to delegate tasks. 📧 Email: bfly123@126.com 💬 WeChat: seemseam-com -WeChat Group +WeChat Group diff --git a/README_zh.md b/README_zh.md index b8596bd..13c10e9 100644 --- a/README_zh.md +++ b/README_zh.md @@ -4,7 +4,7 @@ **基于终端分屏的 Claude & Codex & Gemini 丝滑协作工具** -**打造真实的大模型专家协作团队,给 Claude Code / Codex / Gemini 配上"不会遗忘"的搭档** +**打造真实的大模型专家协作团队,给 Claude Code / Codex / Gemini / OpenCode 配上"不会遗忘"的搭档**

交互皆可见 @@ -102,7 +102,10 @@ powershell -ExecutionPolicy Bypass -File .\install.ps1 install ```bash ccb up codex # 启动 Codex ccb up gemini # 启动 Gemini +ccb up opencode # 启动 OpenCode ccb up codex gemini # 同时启动两个 +ccb up codex gemini opencode # 同时启动三个 +ccb-layout # 启动 2x2 四 AI 布局(Codex+Gemini+OpenCode) ``` ### 常用参数 @@ -338,6 +341,6 @@ echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zprofile 📧 Email: bfly123@126.com 💬 WeChat: seemseam-com -微信群 +微信群 diff --git a/bin/ccb-layout b/bin/ccb-layout new file mode 100644 index 0000000..e45e754 --- /dev/null +++ b/bin/ccb-layout @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 +""" +ccb-layout - Start a 2x2 four-AI layout (Claude + Codex + Gemini + OpenCode). + +Implementation: delegate to `ccb up codex gemini opencode`. +- WezTerm/iTerm2: ccb uses a 2x2 grid when all three backends are present. +- tmux: backends are started as separate tmux sessions (no single-window 2x2 grid). +""" + +from __future__ import annotations + +import shutil +import subprocess +import sys +from pathlib import Path + +script_dir = Path(__file__).resolve().parent +repo_root = script_dir.parent + + +def _resolve_ccb() -> str: + on_path = shutil.which("ccb") + if on_path: + return on_path + candidate = repo_root / "ccb" + if candidate.exists(): + return str(candidate) + return "ccb" + + +def main(argv: list[str]) -> int: + if len(argv) > 1 and argv[1] in ("-h", "--help"): + print("Usage: ccb-layout [-r] [-a] [--no-claude]", file=sys.stderr) + return 0 + + ccb_cmd = _resolve_ccb() + cmd = [ccb_cmd, "up", "codex", "gemini", "opencode", *argv[1:]] + try: + return subprocess.run(cmd).returncode + except KeyboardInterrupt: + return 130 + + +if __name__ == "__main__": + raise SystemExit(main(sys.argv)) + diff --git a/bin/oask b/bin/oask new file mode 100644 index 0000000..c409773 --- /dev/null +++ b/bin/oask @@ -0,0 +1,130 @@ +#!/usr/bin/env python3 +""" +oask - Send message to OpenCode and wait for reply (sync). + +Designed to be used with Claude Code's run_in_background=true. +If --output is provided, the reply is written atomically to that file and stdout stays empty. +""" +from __future__ import annotations + +import os +import sys +from pathlib import Path +from typing import Optional, Tuple + +script_dir = Path(__file__).resolve().parent +lib_dir = script_dir.parent / "lib" +sys.path.insert(0, str(lib_dir)) +from compat import setup_windows_encoding + +setup_windows_encoding() + + +def _usage() -> None: + print("Usage: oask [--timeout SECONDS] [--output FILE] ", file=sys.stderr) + + +def _check_background_mode() -> bool: + """Return True when stdout looks like Claude Code run_in_background output capture.""" + if os.environ.get("CLAUDECODE") != "1": + return True + if os.environ.get("CCB_ALLOW_FOREGROUND") in ("1", "true", "yes"): + return True + try: + import stat + + mode = os.fstat(sys.stdout.fileno()).st_mode + return stat.S_ISREG(mode) or stat.S_ISSOCK(mode) or stat.S_ISFIFO(mode) + except Exception: + return False + + +def _parse_args(argv: list[str]) -> Tuple[Optional[Path], float, str, bool]: + output: Optional[Path] = None + timeout: Optional[float] = None + quiet = False + parts: list[str] = [] + + it = iter(argv[1:]) + for token in it: + if token in ("-h", "--help"): + _usage() + raise SystemExit(0) + if token in ("-q", "--quiet"): + quiet = True + continue + if token in ("-o", "--output"): + try: + output = Path(next(it)).expanduser() + except StopIteration: + raise ValueError("--output requires a file path") + continue + if token in ("-t", "--timeout"): + try: + timeout = float(next(it)) + except StopIteration: + raise ValueError("--timeout requires a number") + except ValueError as exc: + raise ValueError(f"Invalid --timeout: {exc}") + continue + parts.append(token) + + message = " ".join(parts).strip() + if timeout is None: + try: + timeout = float(os.environ.get("CCB_SYNC_TIMEOUT", "3600.0")) + except Exception: + timeout = 3600.0 + return output, timeout, message, quiet + + +def main(argv: list[str]) -> int: + if len(argv) <= 1: + _usage() + return 1 + + try: + from cli_output import EXIT_ERROR, EXIT_NO_REPLY, EXIT_OK, atomic_write_text + from opencode_comm import OpenCodeCommunicator + + output_path, timeout, message, quiet = _parse_args(argv) + if not message: + _usage() + return EXIT_ERROR + + if os.environ.get("CLAUDECODE") == "1" and not _check_background_mode(): + print("[ERROR] oask MUST be called with run_in_background=true", file=sys.stderr) + print("Correct usage: Bash(oask \"...\", run_in_background=true)", file=sys.stderr) + return EXIT_ERROR + + comm = OpenCodeCommunicator(lazy_init=True) + healthy, status = comm._check_session_health_impl(probe_terminal=False) + if not healthy: + raise RuntimeError(f"[ERROR] Session error: {status}") + + _, state = comm._send_message(message) + print("CCB_END_TURN", file=sys.stderr) + reply, _ = comm.log_reader.wait_for_message(state, timeout) + if not reply: + if not quiet: + print(f"[TIMEOUT] Timeout after {int(timeout)}s", file=sys.stderr) + return EXIT_NO_REPLY + + if output_path: + atomic_write_text(output_path, reply + "\n") + return EXIT_OK + + sys.stdout.write(reply) + if not reply.endswith("\n"): + sys.stdout.write("\n") + return EXIT_OK + except KeyboardInterrupt: + return 130 + except Exception as exc: + print(exc, file=sys.stderr) + return 1 + + +if __name__ == "__main__": + raise SystemExit(main(sys.argv)) + diff --git a/bin/oask-w b/bin/oask-w new file mode 100644 index 0000000..2186b6d --- /dev/null +++ b/bin/oask-w @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 +""" +oask-w - Send message to OpenCode and wait for reply (foreground sync). + +stdout: reply text only (for piping). +stderr: progress and errors. +""" +from __future__ import annotations + +import os +import sys +from pathlib import Path + +script_dir = Path(__file__).resolve().parent +lib_dir = script_dir.parent / "lib" +sys.path.insert(0, str(lib_dir)) +from compat import setup_windows_encoding + +setup_windows_encoding() + + +def main(argv: list[str]) -> int: + from cli_output import EXIT_ERROR, EXIT_NO_REPLY, EXIT_OK, atomic_write_text + from i18n import t + from opencode_comm import OpenCodeCommunicator + + if len(argv) <= 1: + print("Usage: oask-w [--timeout SECONDS] [--output FILE] ", file=sys.stderr) + return EXIT_ERROR + + output_path: Path | None = None + timeout: float | None = None + + parts: list[str] = [] + it = iter(argv[1:]) + for token in it: + if token in ("-h", "--help"): + print("Usage: oask-w [--timeout SECONDS] [--output FILE] ", file=sys.stderr) + return EXIT_OK + if token in ("-o", "--output"): + try: + output_path = Path(next(it)).expanduser() + except StopIteration: + print("[ERROR] --output requires a file path", file=sys.stderr) + return EXIT_ERROR + continue + if token in ("-t", "--timeout"): + try: + timeout = float(next(it)) + except StopIteration: + print("[ERROR] --timeout requires a number", file=sys.stderr) + return EXIT_ERROR + except ValueError: + print("[ERROR] --timeout must be a number", file=sys.stderr) + return EXIT_ERROR + continue + parts.append(token) + + message = " ".join(parts).strip() + if not message: + print("[ERROR] Message cannot be empty", file=sys.stderr) + return EXIT_ERROR + + if timeout is None: + try: + timeout = float(os.environ.get("CCB_SYNC_TIMEOUT", "3600.0")) + except Exception: + timeout = 3600.0 + + try: + comm = OpenCodeCommunicator(lazy_init=True) + healthy, status = comm._check_session_health_impl(probe_terminal=False) + if not healthy: + print(f"[ERROR] Session error: {status}", file=sys.stderr) + return EXIT_ERROR + + print(f"[INFO] {t('sending_to', provider='OpenCode')}", file=sys.stderr, flush=True) + _, state = comm._send_message(message) + reply, _ = comm.log_reader.wait_for_message(state, timeout) + if not reply: + print(f"[TIMEOUT] Timeout after {int(timeout)}s", file=sys.stderr) + return EXIT_NO_REPLY + + if output_path: + atomic_write_text(output_path, reply + "\n") + + sys.stdout.write(reply) + if not reply.endswith("\n"): + sys.stdout.write("\n") + return EXIT_OK + except KeyboardInterrupt: + print("[ERROR] Interrupted", file=sys.stderr) + return 130 + except Exception as exc: + print(f"[ERROR] {exc}", file=sys.stderr) + return EXIT_ERROR + + +if __name__ == "__main__": + raise SystemExit(main(sys.argv)) + diff --git a/bin/opend b/bin/opend new file mode 100644 index 0000000..f6f4db9 --- /dev/null +++ b/bin/opend @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +""" +opend - View latest OpenCode reply +""" + +import os +import sys +from pathlib import Path + +script_dir = Path(__file__).resolve().parent +lib_dir = script_dir.parent / "lib" +sys.path.insert(0, str(lib_dir)) +from compat import setup_windows_encoding + +setup_windows_encoding() + +from i18n import t + +try: + from cli_output import EXIT_ERROR, EXIT_NO_REPLY, EXIT_OK + from opencode_comm import OpenCodeLogReader +except ImportError as exc: + print(f"Import failed: {exc}", file=sys.stderr) + sys.exit(1) + + +def _debug_enabled() -> bool: + return (os.environ.get("CCB_DEBUG") in ("1", "true", "yes")) or (os.environ.get("OPEND_DEBUG") in ("1", "true", "yes")) + + +def main(argv: list[str]) -> int: + try: + if len(argv) > 1 and argv[1] in ("-h", "--help"): + print("Usage: opend", file=sys.stderr) + return EXIT_OK + + reader = OpenCodeLogReader() + message = reader.latest_message() + if not message: + print(t("no_reply_available", provider="OpenCode"), file=sys.stderr) + return EXIT_NO_REPLY + print(message) + return EXIT_OK + except Exception as exc: + if _debug_enabled(): + import traceback + + traceback.print_exc() + print(f"[ERROR] {t('execution_failed', error=exc)}", file=sys.stderr) + return EXIT_ERROR + + +if __name__ == "__main__": + sys.exit(main(sys.argv)) + diff --git a/bin/oping b/bin/oping new file mode 100644 index 0000000..3aea09a --- /dev/null +++ b/bin/oping @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 +""" +oping - Test OpenCode connectivity +""" + +import sys +from pathlib import Path + +script_dir = Path(__file__).resolve().parent +lib_dir = script_dir.parent / "lib" +sys.path.insert(0, str(lib_dir)) +from compat import setup_windows_encoding + +setup_windows_encoding() + +try: + from opencode_comm import OpenCodeCommunicator + + def main() -> int: + try: + comm = OpenCodeCommunicator() + healthy, message = comm.ping(display=False) + print(message) + return 0 if healthy else 1 + except Exception as exc: + print(f"[ERROR] OpenCode connectivity test failed: {exc}") + return 1 + + if __name__ == "__main__": + sys.exit(main()) + +except ImportError as exc: + print(f"[ERROR] Module import failed: {exc}") + sys.exit(1) + diff --git a/ccb b/ccb index bc41951..bd2163e 100755 --- a/ccb +++ b/ccb @@ -303,6 +303,8 @@ class AILauncher: return self._start_codex(tmux_session) elif provider == "gemini": return self._start_gemini(tmux_session) + elif provider == "opencode": + return self._start_opencode(tmux_session) else: print(f"❌ {t('unknown_provider', provider=provider)}") return False @@ -315,15 +317,29 @@ class AILauncher: keep_open = os.environ.get("CODEX_WEZTERM_KEEP_OPEN", "1").lower() not in {"0", "false", "no", "off"} if keep_open: start_cmd = _build_keep_open_cmd(provider, start_cmd) - # Layout: first backend splits to the right of current pane, subsequent backends stack below - # the first backend pane to form a right-side column (top/bottom). - direction = "right" if not self.wezterm_panes else "bottom" - parent_pane = None - if direction == "bottom": - try: - parent_pane = next(iter(self.wezterm_panes.values())) - except StopIteration: - parent_pane = None + want_grid = {"codex", "gemini", "opencode"}.issubset(set(self.providers)) + current_pane = os.environ.get("WEZTERM_PANE") + if want_grid and current_pane: + # 2x2 grid with current pane as top-left: + # codex -> top-right, gemini -> bottom-left, opencode -> bottom-right. + if not self.wezterm_panes: + direction = "right" + parent_pane = current_pane + elif provider == "gemini": + direction = "bottom" + parent_pane = current_pane + else: + direction = "bottom" + parent_pane = self.wezterm_panes.get("codex") or next(iter(self.wezterm_panes.values())) + else: + # Legacy layout: right column stack (top/bottom). + direction = "right" if not self.wezterm_panes else "bottom" + parent_pane = None + if direction == "bottom": + try: + parent_pane = next(iter(self.wezterm_panes.values())) + except StopIteration: + parent_pane = None backend = WeztermBackend() pane_id = backend.create_pane(start_cmd, str(Path.cwd()), direction=direction, percent=50, parent_pane=parent_pane) @@ -334,8 +350,10 @@ class AILauncher: output_fifo = runtime / "output.fifo" # WezTerm mode injects text via pane, no strong FIFO dependency; Windows/WSL may not support mkfifo self._write_codex_session(runtime, None, input_fifo, output_fifo, pane_id=pane_id) - else: + elif provider == "gemini": self._write_gemini_session(runtime, None, pane_id=pane_id) + else: + self._write_opencode_session(runtime, None, pane_id=pane_id) print(f"✅ {t('started_backend', provider=provider.capitalize(), terminal='wezterm pane', pane_id=pane_id)}") return True @@ -355,14 +373,26 @@ class AILauncher: f"read -r _; " f"exit $code" ) - # Layout: first backend splits to the right of current pane, subsequent backends stack below - direction = "right" if not self.iterm2_panes else "bottom" - parent_pane = None - if direction == "bottom": - try: - parent_pane = next(iter(self.iterm2_panes.values())) - except StopIteration: - parent_pane = None + want_grid = {"codex", "gemini", "opencode"}.issubset(set(self.providers)) + current_pane = os.environ.get("ITERM_SESSION_ID") + if want_grid and current_pane: + if not self.iterm2_panes: + direction = "right" + parent_pane = current_pane + elif provider == "gemini": + direction = "bottom" + parent_pane = current_pane + else: + direction = "bottom" + parent_pane = self.iterm2_panes.get("codex") or next(iter(self.iterm2_panes.values())) + else: + direction = "right" if not self.iterm2_panes else "bottom" + parent_pane = None + if direction == "bottom": + try: + parent_pane = next(iter(self.iterm2_panes.values())) + except StopIteration: + parent_pane = None backend = Iterm2Backend() pane_id = backend.create_pane(start_cmd, str(Path.cwd()), direction=direction, percent=50, parent_pane=parent_pane) @@ -373,8 +403,10 @@ class AILauncher: output_fifo = runtime / "output.fifo" # iTerm2 mode injects text via pane, no strong FIFO dependency self._write_codex_session(runtime, None, input_fifo, output_fifo, pane_id=pane_id) - else: + elif provider == "gemini": self._write_gemini_session(runtime, None, pane_id=pane_id) + else: + self._write_opencode_session(runtime, None, pane_id=pane_id) print(f"✅ {t('started_backend', provider=provider.capitalize(), terminal='iterm2 session', pane_id=pane_id)}") return True @@ -512,7 +544,7 @@ class AILauncher: return None, False def _build_codex_start_cmd(self) -> str: - cmd = "codex -c disable_paste_burst=true --full-auto" if self.auto else "codex -c disable_paste_burst=true" + cmd = "codex -c disable_paste_burst=true --dangerously-bypass-approvals-and-sandbox" if self.auto else "codex -c disable_paste_burst=true" codex_resumed = False if self.resume: session_id, has_history = self._get_latest_codex_session_id() @@ -581,6 +613,8 @@ class AILauncher: ping_script = self.script_dir / "bin" / "cping" elif provider == "gemini": ping_script = self.script_dir / "bin" / "gping" + elif provider == "opencode": + ping_script = self.script_dir / "bin" / "oping" else: return False @@ -622,8 +656,14 @@ class AILauncher: return self._build_codex_start_cmd() elif provider == "gemini": return self._build_gemini_start_cmd() + elif provider == "opencode": + return self._build_opencode_start_cmd() return "" + def _build_opencode_start_cmd(self) -> str: + # OpenCode CLI (TUI). Allow override via env for custom wrappers. + return (os.environ.get("OPENCODE_START_CMD") or "opencode").strip() or "opencode" + def _start_codex(self, tmux_session: str) -> bool: runtime = self.runtime_dir / "codex" runtime.mkdir(parents=True, exist_ok=True) @@ -739,6 +779,37 @@ exec tmux attach -t "$TMUX_SESSION" print(f"✅ {t('started_backend', provider='Gemini', terminal='tmux', pane_id=tmux_session)}") return True + def _start_opencode(self, tmux_session: str) -> bool: + runtime = self.runtime_dir / "opencode" + runtime.mkdir(parents=True, exist_ok=True) + + start_cmd = self._build_opencode_start_cmd() + + script_file = runtime / "wrapper.sh" + + self._write_opencode_session(runtime, tmux_session) + + wrapper = f'''#!/bin/bash +\tcd "{os.getcwd()}" +\ttmux new-session -d -s "{tmux_session}" 2>/dev/null || true +\ttmux send-keys -t "{tmux_session}" "{start_cmd}" Enter +\texec tmux attach -t "{tmux_session}" +\t''' + script_file.write_text(wrapper) + os.chmod(script_file, 0o755) + + terminal = self._detect_launch_terminal() + if terminal == "tmux": + if self._launch_script_in_macos_terminal(script_file): + pass + else: + subprocess.run(["tmux", "new-session", "-d", "-s", f"launcher-{tmux_session}", str(script_file)], check=True) + elif terminal: + subprocess.Popen([terminal, "-e", str(script_file)]) + + print(f"✅ {t('started_backend', provider='OpenCode', terminal='tmux', pane_id=tmux_session)}") + return True + def _write_codex_session(self, runtime, tmux_session, input_fifo, output_fifo, pane_id=None): session_file = Path.cwd() / ".codex-session" @@ -802,6 +873,32 @@ exec tmux attach -t "$TMUX_SESSION" return False return True + def _write_opencode_session(self, runtime, tmux_session, pane_id=None): + session_file = Path.cwd() / ".opencode-session" + + writable, reason, fix = check_session_writable(session_file) + if not writable: + print(f"❌ Cannot write {session_file.name}: {reason}", file=sys.stderr) + print(f"💡 Fix: {fix}", file=sys.stderr) + return False + + data = { + "session_id": self.session_id, + "runtime_dir": str(runtime), + "terminal": self.terminal_type, + "tmux_session": tmux_session, + "pane_id": pane_id, + "work_dir": str(Path.cwd()), + "active": True, + "started_at": time.strftime("%Y-%m-%d %H:%M:%S"), + } + + ok, err = safe_write_session(session_file, json.dumps(data, ensure_ascii=False, indent=2)) + if not ok: + print(err, file=sys.stderr) + return False + return True + def _claude_project_dir(self, work_dir: Path) -> Path: projects_root = Path.home() / ".claude" / "projects" # Claude Code uses a filesystem-friendly key derived from the working directory. @@ -920,6 +1017,18 @@ exec tmux attach -t "$TMUX_SESSION" else: env["GEMINI_TMUX_SESSION"] = self.tmux_sessions.get("gemini", "") + if "opencode" in self.providers: + runtime = self.runtime_dir / "opencode" + env["OPENCODE_SESSION_ID"] = self.session_id + env["OPENCODE_RUNTIME_DIR"] = str(runtime) + env["OPENCODE_TERMINAL"] = self.terminal_type + if self.terminal_type == "wezterm": + env["OPENCODE_WEZTERM_PANE"] = self.wezterm_panes.get("opencode", "") + elif self.terminal_type == "iterm2": + env["OPENCODE_ITERM2_PANE"] = self.iterm2_panes.get("opencode", "") + else: + env["OPENCODE_TMUX_SESSION"] = self.tmux_sessions.get("opencode", "") + try: claude_cmd = self._find_claude_cmd() except FileNotFoundError as e: @@ -946,6 +1055,8 @@ exec tmux attach -t "$TMUX_SESSION" print(" cask/cask-w/cping/cpend - Codex communication") if "gemini" in self.providers: print(" gask/gask-w/gping/gpend - Gemini communication") + if "opencode" in self.providers: + print(" oask/oask-w/oping/opend - OpenCode communication") print() print(f"Executing: {' '.join(cmd)}") @@ -979,7 +1090,7 @@ exec tmux attach -t "$TMUX_SESSION" subprocess.run(["tmux", "kill-session", "-t", tmux_session], stderr=subprocess.DEVNULL) subprocess.run(["tmux", "kill-session", "-t", f"launcher-{tmux_session}"], stderr=subprocess.DEVNULL) - for session_file in [Path.cwd() / ".codex-session", Path.cwd() / ".gemini-session", Path.cwd() / ".claude-session"]: + for session_file in [Path.cwd() / ".codex-session", Path.cwd() / ".gemini-session", Path.cwd() / ".opencode-session", Path.cwd() / ".claude-session"]: if session_file.exists(): try: data = self._read_json_file(session_file) @@ -1012,7 +1123,7 @@ exec tmux attach -t "$TMUX_SESSION" providers = list(self.providers) if self.terminal_type in ("wezterm", "iterm2"): # Stable layout: codex on top, gemini on bottom (when both are present). - order = {"codex": 0, "gemini": 1} + order = {"codex": 0, "gemini": 1, "opencode": 2} providers.sort(key=lambda p: order.get(p, 99)) for provider in providers: @@ -1058,7 +1169,7 @@ def cmd_up(args): def cmd_status(args): - providers = args.providers or ["codex", "gemini"] + providers = args.providers or ["codex", "gemini", "opencode"] results = {} for provider in providers: @@ -1106,7 +1217,7 @@ def cmd_status(args): def cmd_kill(args): - providers = args.providers or ["codex", "gemini"] + providers = args.providers or ["codex", "gemini", "opencode"] for provider in providers: session_file = Path.cwd() / f".{provider}-session" @@ -1656,22 +1767,22 @@ def main(): # up subcommand up_parser = subparsers.add_parser("up", help="Start AI backends") - up_parser.add_argument("providers", nargs="*", choices=["codex", "gemini"], help="Backends to start") + up_parser.add_argument("providers", nargs="*", choices=["codex", "gemini", "opencode"], help="Backends to start") up_parser.add_argument("-r", "--resume", "--restore", action="store_true", help="Resume context") up_parser.add_argument("-a", "--auto", action="store_true", help="Full auto permission mode") up_parser.add_argument("--no-claude", action="store_true", help="Don't start Claude main window") # status subcommand status_parser = subparsers.add_parser("status", help="Check status") - status_parser.add_argument("providers", nargs="*", default=[], help="Backends to check (codex/gemini)") + status_parser.add_argument("providers", nargs="*", default=[], help="Backends to check (codex/gemini/opencode)") # kill subcommand kill_parser = subparsers.add_parser("kill", help="Terminate session") - kill_parser.add_argument("providers", nargs="*", default=[], help="Backends to terminate (codex/gemini)") + kill_parser.add_argument("providers", nargs="*", default=[], help="Backends to terminate (codex/gemini/opencode)") # restore subcommand restore_parser = subparsers.add_parser("restore", help="Restore/attach session") - restore_parser.add_argument("providers", nargs="*", default=[], help="Backends to restore (codex/gemini)") + restore_parser.add_argument("providers", nargs="*", default=[], help="Backends to restore (codex/gemini/opencode)") # update subcommand update_parser = subparsers.add_parser("update", help="Update to latest version") diff --git a/commands/oask-w.md b/commands/oask-w.md new file mode 100644 index 0000000..df8b90f --- /dev/null +++ b/commands/oask-w.md @@ -0,0 +1,13 @@ +WARNING: Only use when user EXPLICITLY requests sync/foreground mode. +Do NOT use as alternative to oask. + +Send message to OpenCode via `oask-w` (foreground sync). + +Execution: `Bash(oask-w "")` + +Parameters: +- `` required +- `--timeout SECONDS` optional + +Output: stdout = reply, exit code 0 = success + diff --git a/commands/oask.md b/commands/oask.md new file mode 100644 index 0000000..d7fb898 --- /dev/null +++ b/commands/oask.md @@ -0,0 +1,27 @@ +CRITICAL: ALWAYS use run_in_background=true - NO EXCEPTIONS + +$ARGUMENTS + +## Execution (MANDATORY) + +Bash(oask "$ARGUMENTS", run_in_background=true) + +## After Execution + +Tell user "OpenCode processing..." then IMMEDIATELY END your turn. +DO NOT wait for result. DO NOT continue working. + +## Wrong vs Right + +WRONG: Bash(oask "question") +RIGHT: Bash(oask "question", run_in_background=true) + +## SENTINEL + +When output contains `CCB_END_TURN`, end response immediately. + +## Parameters + +- `--timeout SECONDS` optional (default 3600) +- `--output FILE` optional: write reply to FILE + diff --git a/commands/opend.md b/commands/opend.md new file mode 100644 index 0000000..dc9d9b7 --- /dev/null +++ b/commands/opend.md @@ -0,0 +1,13 @@ +Use `opend` to fetch latest reply from OpenCode storage. + +WARNING: Only use when user EXPLICITLY requests. Do NOT use proactively after oask. + +Trigger conditions (ALL must match): +- User EXPLICITLY mentions opend/Opend +- Or user asks to "view opencode reply" / "show opencode response" + +Execution: +- `opend` - fetch latest reply: `Bash(opend)` + +Output: stdout = reply text, exit code 0 = success, 2 = no reply + diff --git a/commands/oping.md b/commands/oping.md new file mode 100644 index 0000000..1ea5fee --- /dev/null +++ b/commands/oping.md @@ -0,0 +1,10 @@ +Test connectivity with OpenCode via `oping` command. + +Execution: +- Run silently `Bash(oping)`, no additional analysis or operations after execution +- Can also run `oping` in terminal with same effect + +Hints: +- Returns OpenCode session status +- Used to check if OpenCode is running normally + diff --git a/install.ps1 b/install.ps1 index c4d3359..64324b7 100644 --- a/install.ps1 +++ b/install.ps1 @@ -25,11 +25,18 @@ $repoRoot = Split-Path -Parent $MyInvocation.MyCommand.Path $script:CCB_START_MARKER = "" $script:CCB_END_MARKER = "" -$script:SCRIPTS_TO_LINK = @("ccb", "cask", "cask-w", "cpend", "cping", "gask", "gask-w", "gpend", "gping") +$script:SCRIPTS_TO_LINK = @( + "ccb", + "cask", "cask-w", "cpend", "cping", + "gask", "gask-w", "gpend", "gping", + "oask", "oask-w", "opend", "oping", + "ccb-layout" +) $script:CLAUDE_MARKDOWN = @( "cask.md", "cask-w.md", "cpend.md", "cping.md", - "gask.md", "gask-w.md", "gpend.md", "gping.md" + "gask.md", "gask-w.md", "gpend.md", "gping.md", + "oask.md", "oask-w.md", "opend.md", "oping.md" ) $script:LEGACY_SCRIPTS = @( @@ -221,7 +228,13 @@ function Install-Native { } } - $scripts = @("ccb", "cask", "cask-w", "cping", "cpend", "gask", "gask-w", "gping", "gpend") + $scripts = @( + "ccb", + "cask", "cask-w", "cping", "cpend", + "gask", "gask-w", "gping", "gpend", + "oask", "oask-w", "oping", "opend", + "ccb-layout" + ) # In MSYS/Git-Bash, invoking the script file directly will honor the shebang. # Windows typically has `python` but not `python3`, so rewrite shebangs for compatibility. @@ -267,6 +280,8 @@ function Install-Native { Write-Host "Quick start:" Write-Host " ccb up codex # Start with Codex backend" Write-Host " ccb up gemini # Start with Gemini backend" + Write-Host " ccb up opencode # Start with OpenCode backend" + Write-Host " ccb-layout # Start 2x2 layout (Codex+Gemini+OpenCode)" } function Install-ClaudeConfig { @@ -363,12 +378,56 @@ Examples: - "ask gemini to review this design" -> ``Bash(gask "...", run_in_background=true)``, END turn (complex) - "is gemini alive" -> gping - "view gemini reply" -> gpend + +## OpenCode Collaboration Rules +OpenCode is another AI assistant running in a separate terminal session (WezTerm, iTerm2 or tmux). When user intent involves asking/consulting/collaborating with OpenCode: + +Fast path (minimize latency): +- If the user message starts with any of: ``@opencode``, ``opencode:``, ``ask opencode``, ``let opencode``, ``/oask`` then immediately run based on complexity. +- If user message is only the prefix (no content), ask a 1-line clarification for what to send. + +Trigger conditions (any match): +- User mentions opencode/OpenCode with questioning/requesting tone +- User wants opencode to do something, give advice, or help review +- User asks about opencode's status or previous reply + +Command selection: +- Send question -> ``Bash(oask "", run_in_background=true)``, tell user "OpenCode processing (task: xxx)" then END your turn +- Check connectivity -> ``oping`` + +IMPORTANT RESTRICTIONS: +- NEVER use opend/oask-w unless user EXPLICITLY requests +- After oask, ONLY wait for bash-notification to get results +- Do NOT try to fetch results yourself "@ if (Test-Path $claudeMd) { $content = Get-Content -Raw $claudeMd - if ($content -notlike "*Codex Collaboration Rules*") { + + if ($content -match [regex]::Escape($script:CCB_START_MARKER)) { + # Replace existing CCB config block (keep rest of file intact) + $pattern = '(?s).*?' + $newContent = [regex]::Replace($content, $pattern, $codexRules) + $newContent | Out-File -Encoding UTF8 -FilePath $claudeMd + Write-Host "Updated CLAUDE.md with collaboration rules" + } elseif ($content -match '##\s+(Codex|Gemini|OpenCode)\s+Collaboration Rules' -or $content -match '##\s+(Codex|Gemini|OpenCode)\s+协作规则') { + # Remove legacy rule blocks then append the new unified block + $patterns = @( + '(?s)## Codex Collaboration Rules.*?(?=\n## (?!Gemini)|\Z)', + '(?s)## Codex 协作规则.*?(?=\n## |\Z)', + '(?s)## Gemini Collaboration Rules.*?(?=\n## |\Z)', + '(?s)## Gemini 协作规则.*?(?=\n## |\Z)', + '(?s)## OpenCode Collaboration Rules.*?(?=\n## |\Z)', + '(?s)## OpenCode 协作规则.*?(?=\n## |\Z)' + ) + foreach ($p in $patterns) { + $content = [regex]::Replace($content, $p, '') + } + $content = ($content.TrimEnd() + "`n") + ($content + $codexRules + "`n") | Out-File -Encoding UTF8 -FilePath $claudeMd + Write-Host "Updated CLAUDE.md with collaboration rules" + } else { Add-Content -Path $claudeMd -Value $codexRules Write-Host "Updated CLAUDE.md with collaboration rules" } @@ -379,7 +438,8 @@ Examples: $allowList = @( "Bash(cask:*)", "Bash(cask-w:*)", "Bash(cpend)", "Bash(cping)", - "Bash(gask:*)", "Bash(gask-w:*)", "Bash(gpend)", "Bash(gping)" + "Bash(gask:*)", "Bash(gask-w:*)", "Bash(gpend)", "Bash(gping)", + "Bash(oask:*)", "Bash(oask-w:*)", "Bash(opend)", "Bash(oping)" ) if (Test-Path $settingsJson) { diff --git a/install.sh b/install.sh index fe11309..161cd9b 100755 --- a/install.sh +++ b/install.sh @@ -96,6 +96,11 @@ SCRIPTS_TO_LINK=( bin/gask-w bin/gpend bin/gping + bin/oask + bin/oask-w + bin/opend + bin/oping + bin/ccb-layout ccb ) @@ -108,6 +113,10 @@ CLAUDE_MARKDOWN=( gask-w.md gpend.md gping.md + oask.md + oask-w.md + opend.md + oping.md ) LEGACY_SCRIPTS=( @@ -779,6 +788,33 @@ SENTINEL (IMPORTANT): When you see `CCB_END_TURN` in any output, IMMEDIATELY end Examples: - "ask gemini about X" -> `Bash(gask "...", run_in_background=true)`, END turn - "is gemini alive" -> gping + +## OpenCode Collaboration Rules +OpenCode is another AI assistant running in a separate terminal session (WezTerm, iTerm2 or tmux). When user intent involves asking/consulting/collaborating with OpenCode: + +Fast path (minimize latency): +- If the user message starts with any of: `@opencode`, `opencode:`, `ask opencode`, `let opencode`, `/oask` then immediately run based on complexity. +- If user message is only the prefix (no content), ask a 1-line clarification for what to send. + +Trigger conditions (any match): +- User mentions opencode/OpenCode with questioning/requesting tone +- User wants opencode to do something, give advice, or help review +- User asks about opencode's status or previous reply + +Command selection: +- Send question -> `Bash(oask "", run_in_background=true)`, tell user "OpenCode processing (task: xxx)" then END your turn +- Check connectivity -> `oping` + +IMPORTANT RESTRICTIONS: +- NEVER use opend/oask-w unless user EXPLICITLY requests +- After oask, ONLY wait for bash-notification to get results +- Do NOT try to fetch results yourself + +SENTINEL (IMPORTANT): When you see `CCB_END_TURN` in any output, IMMEDIATELY end your response. + +Examples: +- "ask opencode about X" -> `Bash(oask "...", run_in_background=true)`, END turn +- "is opencode alive" -> oping AI_RULES local ccb_content @@ -797,7 +833,7 @@ content = re.sub(pattern, new_block, content, flags=re.DOTALL) with open('$claude_md', 'w', encoding='utf-8') as f: f.write(content) " - elif grep -qE "$LEGACY_RULE_MARKER|## Codex Collaboration Rules|## Gemini" "$claude_md" 2>/dev/null; then + elif grep -qE "$LEGACY_RULE_MARKER|## Codex Collaboration Rules|## Gemini|## OpenCode" "$claude_md" 2>/dev/null; then echo "Removing legacy rules and adding new CCB config block..." python3 -c " import re @@ -808,6 +844,8 @@ patterns = [ r'## Codex 协作规则.*?(?=\n## |\Z)', r'## Gemini Collaboration Rules.*?(?=\n## |\Z)', r'## Gemini 协作规则.*?(?=\n## |\Z)', + r'## OpenCode Collaboration Rules.*?(?=\n## |\Z)', + r'## OpenCode 协作规则.*?(?=\n## |\Z)', ] for p in patterns: content = re.sub(p, '', content, flags=re.DOTALL) @@ -839,6 +877,10 @@ install_settings_permissions() { 'Bash(gask-w:*)' 'Bash(gpend)' 'Bash(gping)' + 'Bash(oask:*)' + 'Bash(oask-w:*)' + 'Bash(opend)' + 'Bash(oping)' ) if [[ ! -f "$settings_file" ]]; then @@ -853,7 +895,11 @@ install_settings_permissions() { "Bash(gask:*)", "Bash(gask-w:*)", "Bash(gpend)", - "Bash(gping)" + "Bash(gping)", + "Bash(oask:*)", + "Bash(oask-w:*)", + "Bash(opend)", + "Bash(oping)" ], "deny": [] } @@ -924,7 +970,7 @@ install_all() { echo " Project dir : $INSTALL_PREFIX" echo " Executable dir : $BIN_DIR" echo " Claude commands updated" - echo " Global CLAUDE.md configured with Codex collaboration rules" + echo " Global CLAUDE.md configured with Codex/Gemini/OpenCode collaboration rules" echo " Global settings.json permissions added" } @@ -952,7 +998,7 @@ with open('$claude_md', 'w', encoding='utf-8') as f: else echo "WARN: python3 required to clean CLAUDE.md, please manually remove CCB_CONFIG block" fi - elif grep -qE "$LEGACY_RULE_MARKER|## Codex Collaboration Rules|## Gemini" "$claude_md" 2>/dev/null; then + elif grep -qE "$LEGACY_RULE_MARKER|## Codex Collaboration Rules|## Gemini|## OpenCode" "$claude_md" 2>/dev/null; then echo "Removing legacy collaboration rules from CLAUDE.md..." if command -v python3 >/dev/null 2>&1; then python3 -c " @@ -964,6 +1010,8 @@ patterns = [ r'## Codex 协作规则.*?(?=\n## |\Z)', r'## Gemini Collaboration Rules.*?(?=\n## |\Z)', r'## Gemini 协作规则.*?(?=\n## |\Z)', + r'## OpenCode Collaboration Rules.*?(?=\n## |\Z)', + r'## OpenCode 协作规则.*?(?=\n## |\Z)', ] for p in patterns: content = re.sub(p, '', content, flags=re.DOTALL) @@ -994,6 +1042,10 @@ uninstall_settings_permissions() { 'Bash(gask-w:*)' 'Bash(gpend)' 'Bash(gping)' + 'Bash(oask:*)' + 'Bash(oask-w:*)' + 'Bash(opend)' + 'Bash(oping)' ) if command -v python3 >/dev/null 2>&1; then @@ -1018,6 +1070,10 @@ perms_to_remove = [ 'Bash(gask-w:*)', 'Bash(gpend)', 'Bash(gping)', + 'Bash(oask:*)', + 'Bash(oask-w:*)', + 'Bash(opend)', + 'Bash(oping)', ] with open('$settings_file', 'r') as f: data = json.load(f) diff --git a/lib/opencode_comm.py b/lib/opencode_comm.py new file mode 100644 index 0000000..388712f --- /dev/null +++ b/lib/opencode_comm.py @@ -0,0 +1,586 @@ +#!/usr/bin/env python3 +""" +OpenCode communication module + +Reads replies from OpenCode storage (~/.local/share/opencode/storage) and sends messages by +injecting text into the OpenCode TUI pane via the configured terminal backend. +""" + +from __future__ import annotations + +import json +import os +import sys +import time +from pathlib import Path +from typing import Any, Dict, List, Optional, Tuple + +from ccb_config import apply_backend_env +from i18n import t +from terminal import get_backend_for_session, get_pane_id_from_session + +apply_backend_env() + + +def _normalize_path_for_match(value: str) -> str: + try: + path = Path(value).expanduser() + # OpenCode "directory" seems to come from the launch cwd, so avoid resolve() to prevent + # symlink/WSL mismatch (similar rationale to gemini hashing). + normalized = str(path.absolute()) + except Exception: + normalized = str(value) + normalized = normalized.replace("\\", "/").rstrip("/") + if os.name == "nt": + normalized = normalized.lower() + return normalized + + +def _path_is_same_or_parent(parent: str, child: str) -> bool: + parent = _normalize_path_for_match(parent) + child = _normalize_path_for_match(child) + if parent == child: + return True + if not parent or not child: + return False + if not child.startswith(parent): + return False + # Ensure boundary on path segment + return child == parent or child[len(parent) :].startswith("/") + + +def _default_opencode_storage_root() -> Path: + env = (os.environ.get("OPENCODE_STORAGE_ROOT") or "").strip() + if env: + return Path(env).expanduser() + + # Common defaults + candidates: list[Path] = [] + candidates.append(Path.home() / ".local" / "share" / "opencode" / "storage") + + # Windows native (best-effort; OpenCode might not use this, but allow it if present) + localappdata = os.environ.get("LOCALAPPDATA") + if localappdata: + candidates.append(Path(localappdata) / "opencode" / "storage") + appdata = os.environ.get("APPDATA") + if appdata: + candidates.append(Path(appdata) / "opencode" / "storage") + + for candidate in candidates: + try: + if candidate.exists(): + return candidate + except Exception: + continue + + # Fallback to Linux default even if it doesn't exist yet (ping/health will report). + return candidates[0] + + +OPENCODE_STORAGE_ROOT = _default_opencode_storage_root() + + +class OpenCodeLogReader: + """ + Reads OpenCode session/message/part JSON files. + + Observed storage layout: + storage/session//ses_*.json + storage/message//msg_*.json + storage/part//prt_*.json + """ + + def __init__(self, root: Path = OPENCODE_STORAGE_ROOT, work_dir: Optional[Path] = None, project_id: str = "global"): + self.root = Path(root).expanduser() + self.work_dir = work_dir or Path.cwd() + self.project_id = (os.environ.get("OPENCODE_PROJECT_ID") or project_id or "global").strip() or "global" + + try: + poll = float(os.environ.get("OPENCODE_POLL_INTERVAL", "0.05")) + except Exception: + poll = 0.05 + self._poll_interval = min(0.5, max(0.02, poll)) + + try: + force = float(os.environ.get("OPENCODE_FORCE_READ_INTERVAL", "1.0")) + except Exception: + force = 1.0 + self._force_read_interval = min(5.0, max(0.2, force)) + + def _session_dir(self) -> Path: + return self.root / "session" / self.project_id + + def _message_dir(self, session_id: str) -> Path: + # Preferred nested layout: message//*.json + nested = self.root / "message" / session_id + if nested.exists(): + return nested + # Fallback legacy layout: message/*.json + return self.root / "message" + + def _part_dir(self, message_id: str) -> Path: + nested = self.root / "part" / message_id + if nested.exists(): + return nested + return self.root / "part" + + def _work_dir_candidates(self) -> list[str]: + candidates: list[str] = [] + env_pwd = (os.environ.get("PWD") or "").strip() + if env_pwd: + candidates.append(env_pwd) + candidates.append(str(self.work_dir)) + try: + candidates.append(str(self.work_dir.resolve())) + except Exception: + pass + # Normalize and de-dup + seen: set[str] = set() + out: list[str] = [] + for c in candidates: + norm = _normalize_path_for_match(c) + if norm and norm not in seen: + seen.add(norm) + out.append(norm) + return out + + def _load_json(self, path: Path) -> dict: + try: + raw = path.read_text(encoding="utf-8") + data = json.loads(raw) + return data if isinstance(data, dict) else {} + except Exception: + return {} + + def _get_latest_session(self) -> Optional[dict]: + sessions_dir = self._session_dir() + if not sessions_dir.exists(): + return None + + candidates = self._work_dir_candidates() + best_match: dict | None = None + best_updated = -1 + best_mtime = -1.0 + best_any: dict | None = None + best_any_updated = -1 + best_any_mtime = -1.0 + + try: + files = [p for p in sessions_dir.glob("ses_*.json") if p.is_file()] + except Exception: + files = [] + + for path in files: + payload = self._load_json(path) + sid = payload.get("id") + directory = payload.get("directory") + updated = (payload.get("time") or {}).get("updated") + if not isinstance(sid, str) or not sid: + continue + if not isinstance(updated, int): + try: + updated = int(updated) + except Exception: + updated = -1 + try: + mtime = path.stat().st_mtime + except Exception: + mtime = 0.0 + + # Track best-any for fallback + if updated > best_any_updated or (updated == best_any_updated and mtime >= best_any_mtime): + best_any = {"path": path, "payload": payload} + best_any_updated = updated + best_any_mtime = mtime + + if not isinstance(directory, str) or not directory: + continue + session_dir_norm = _normalize_path_for_match(directory) + matched = False + for cwd in candidates: + if _path_is_same_or_parent(session_dir_norm, cwd) or _path_is_same_or_parent(cwd, session_dir_norm): + matched = True + break + if not matched: + continue + + if updated > best_updated or (updated == best_updated and mtime >= best_mtime): + best_match = {"path": path, "payload": payload} + best_updated = updated + best_mtime = mtime + + return best_match or best_any + + def _read_messages(self, session_id: str) -> List[dict]: + message_dir = self._message_dir(session_id) + if not message_dir.exists(): + return [] + messages: list[dict] = [] + try: + paths = [p for p in message_dir.glob("msg_*.json") if p.is_file()] + except Exception: + paths = [] + for path in paths: + payload = self._load_json(path) + if payload.get("sessionID") != session_id: + continue + payload["_path"] = str(path) + messages.append(payload) + # Sort by created time (ms), fallback to mtime + def _key(m: dict) -> tuple[int, float, str]: + created = (m.get("time") or {}).get("created") + try: + created_i = int(created) + except Exception: + created_i = -1 + try: + mtime = Path(m.get("_path", "")).stat().st_mtime if m.get("_path") else 0.0 + except Exception: + mtime = 0.0 + mid = m.get("id") if isinstance(m.get("id"), str) else "" + return created_i, mtime, mid + + messages.sort(key=_key) + return messages + + def _read_parts(self, message_id: str) -> List[dict]: + part_dir = self._part_dir(message_id) + if not part_dir.exists(): + return [] + parts: list[dict] = [] + try: + paths = [p for p in part_dir.glob("prt_*.json") if p.is_file()] + except Exception: + paths = [] + for path in paths: + payload = self._load_json(path) + if payload.get("messageID") != message_id: + continue + payload["_path"] = str(path) + parts.append(payload) + + def _key(p: dict) -> tuple[int, float, str]: + ts = (p.get("time") or {}).get("start") + try: + ts_i = int(ts) + except Exception: + ts_i = -1 + try: + mtime = Path(p.get("_path", "")).stat().st_mtime if p.get("_path") else 0.0 + except Exception: + mtime = 0.0 + pid = p.get("id") if isinstance(p.get("id"), str) else "" + return ts_i, mtime, pid + + parts.sort(key=_key) + return parts + + @staticmethod + def _extract_text(parts: List[dict]) -> str: + out: list[str] = [] + for part in parts: + if part.get("type") != "text": + continue + text = part.get("text") + if isinstance(text, str) and text: + out.append(text) + return "".join(out).strip() + + def capture_state(self) -> Dict[str, Any]: + session_entry = self._get_latest_session() + if not session_entry: + return {"session_id": None, "session_updated": -1, "assistant_count": 0, "last_assistant_id": None} + + payload = session_entry.get("payload") or {} + session_id = payload.get("id") if isinstance(payload.get("id"), str) else None + updated = (payload.get("time") or {}).get("updated") + try: + updated_i = int(updated) + except Exception: + updated_i = -1 + + assistant_count = 0 + last_assistant_id: str | None = None + last_completed: int | None = None + + if session_id: + messages = self._read_messages(session_id) + for msg in messages: + if msg.get("role") == "assistant": + assistant_count += 1 + mid = msg.get("id") + if isinstance(mid, str): + last_assistant_id = mid + completed = (msg.get("time") or {}).get("completed") + try: + last_completed = int(completed) if completed is not None else None + except Exception: + last_completed = None + + return { + "session_path": session_entry.get("path"), + "session_id": session_id, + "session_updated": updated_i, + "assistant_count": assistant_count, + "last_assistant_id": last_assistant_id, + "last_assistant_completed": last_completed, + } + + def _find_new_assistant_reply(self, session_id: str, state: Dict[str, Any]) -> Optional[str]: + prev_count = int(state.get("assistant_count") or 0) + prev_last = state.get("last_assistant_id") + prev_completed = state.get("last_assistant_completed") + + messages = self._read_messages(session_id) + assistants = [m for m in messages if m.get("role") == "assistant" and isinstance(m.get("id"), str)] + if not assistants: + return None + + latest = assistants[-1] + latest_id = latest.get("id") + completed = (latest.get("time") or {}).get("completed") + try: + completed_i = int(completed) if completed is not None else None + except Exception: + completed_i = None + + # If assistant is still streaming, wait (prefer completed reply). + if completed_i is None: + return None + + # Detect change via count or last id or completion timestamp. + if len(assistants) <= prev_count and latest_id == prev_last and completed_i == prev_completed: + return None + + parts = self._read_parts(str(latest_id)) + return self._extract_text(parts) or None + + def _read_since(self, state: Dict[str, Any], timeout: float, block: bool) -> Tuple[Optional[str], Dict[str, Any]]: + deadline = time.time() + timeout + last_forced_read = time.time() + + session_id = state.get("session_id") + if not isinstance(session_id, str) or not session_id: + session_id = None + + while True: + session_entry = self._get_latest_session() + if not session_entry: + if not block: + return None, state + time.sleep(self._poll_interval) + if time.time() >= deadline: + return None, state + continue + + payload = session_entry.get("payload") or {} + current_session_id = payload.get("id") if isinstance(payload.get("id"), str) else None + if session_id and current_session_id and current_session_id != session_id: + # User may have switched sessions; keep following the state-bound session if possible. + # If that session is no longer the latest, we still try to read it (best-effort) by sticking to session_id. + current_session_id = session_id + elif not session_id: + session_id = current_session_id + + if not current_session_id: + if not block: + return None, state + time.sleep(self._poll_interval) + if time.time() >= deadline: + return None, state + continue + + updated = (payload.get("time") or {}).get("updated") + try: + updated_i = int(updated) + except Exception: + updated_i = -1 + + prev_updated = int(state.get("session_updated") or -1) + should_scan = updated_i != prev_updated + if block and not should_scan and (time.time() - last_forced_read) >= self._force_read_interval: + should_scan = True + last_forced_read = time.time() + + if should_scan: + reply = self._find_new_assistant_reply(current_session_id, state) + if reply: + new_state = self.capture_state() + # Preserve session binding + if session_id: + new_state["session_id"] = session_id + return reply, new_state + + # Update state baseline even if reply isn't ready yet. + state = dict(state) + state["session_updated"] = updated_i + + if not block: + return None, state + + time.sleep(self._poll_interval) + if time.time() >= deadline: + return None, state + + def wait_for_message(self, state: Dict[str, Any], timeout: float) -> Tuple[Optional[str], Dict[str, Any]]: + return self._read_since(state, timeout, block=True) + + def try_get_message(self, state: Dict[str, Any]) -> Tuple[Optional[str], Dict[str, Any]]: + return self._read_since(state, timeout=0.0, block=False) + + def latest_message(self) -> Optional[str]: + session_entry = self._get_latest_session() + if not session_entry: + return None + payload = session_entry.get("payload") or {} + session_id = payload.get("id") + if not isinstance(session_id, str) or not session_id: + return None + messages = self._read_messages(session_id) + assistants = [m for m in messages if m.get("role") == "assistant" and isinstance(m.get("id"), str)] + if not assistants: + return None + latest = assistants[-1] + completed = (latest.get("time") or {}).get("completed") + if completed is None: + return None + parts = self._read_parts(str(latest.get("id"))) + text = self._extract_text(parts) + return text or None + + +class OpenCodeCommunicator: + def __init__(self, lazy_init: bool = False): + self.session_info = self._load_session_info() + if not self.session_info: + raise RuntimeError("❌ No active OpenCode session found. Run 'ccb up opencode' first") + + self.session_id = self.session_info["session_id"] + self.runtime_dir = Path(self.session_info["runtime_dir"]) + self.terminal = self.session_info.get("terminal", os.environ.get("OPENCODE_TERMINAL", "tmux")) + self.pane_id = get_pane_id_from_session(self.session_info) or "" + self.backend = get_backend_for_session(self.session_info) + + self.timeout = int(os.environ.get("OPENCODE_SYNC_TIMEOUT", "30")) + self.marker_prefix = "oask" + self.project_session_file = self.session_info.get("_session_file") + + self.log_reader = OpenCodeLogReader() + + if not lazy_init: + healthy, msg = self._check_session_health() + if not healthy: + raise RuntimeError(f"❌ Session unhealthy: {msg}\nTip: Run 'ccb up opencode' to start a new session") + + def _load_session_info(self) -> Optional[dict]: + if "OPENCODE_SESSION_ID" in os.environ: + terminal = os.environ.get("OPENCODE_TERMINAL", "tmux") + if terminal == "wezterm": + pane_id = os.environ.get("OPENCODE_WEZTERM_PANE", "") + elif terminal == "iterm2": + pane_id = os.environ.get("OPENCODE_ITERM2_PANE", "") + else: + pane_id = "" + return { + "session_id": os.environ["OPENCODE_SESSION_ID"], + "runtime_dir": os.environ["OPENCODE_RUNTIME_DIR"], + "terminal": terminal, + "tmux_session": os.environ.get("OPENCODE_TMUX_SESSION", ""), + "pane_id": pane_id, + "_session_file": None, + } + + project_session = Path.cwd() / ".opencode-session" + if not project_session.exists(): + return None + + try: + with project_session.open("r", encoding="utf-8-sig") as handle: + data = json.load(handle) + + if not isinstance(data, dict) or not data.get("active", False): + return None + + runtime_dir = Path(data.get("runtime_dir", "")) + if not runtime_dir.exists(): + return None + + data["_session_file"] = str(project_session) + return data + except Exception: + return None + + def _check_session_health(self) -> Tuple[bool, str]: + return self._check_session_health_impl(probe_terminal=True) + + def _check_session_health_impl(self, probe_terminal: bool) -> Tuple[bool, str]: + try: + if not self.runtime_dir.exists(): + return False, "Runtime directory not found" + if not self.pane_id: + return False, "Session pane not found" + if probe_terminal and self.backend and not self.backend.is_alive(self.pane_id): + return False, f"{self.terminal} session {self.pane_id} not found" + + # Storage health check (reply reader) + if not OPENCODE_STORAGE_ROOT.exists(): + return False, f"OpenCode storage not found: {OPENCODE_STORAGE_ROOT}" + return True, "Session OK" + except Exception as exc: + return False, f"Check failed: {exc}" + + def ping(self, display: bool = True) -> Tuple[bool, str]: + healthy, status = self._check_session_health() + msg = f"✅ OpenCode connection OK ({status})" if healthy else f"❌ OpenCode connection error: {status}" + if display: + print(msg) + return healthy, msg + + def _send_via_terminal(self, content: str) -> None: + if not self.backend or not self.pane_id: + raise RuntimeError("Terminal session not configured") + self.backend.send_text(self.pane_id, content) + + def _send_message(self, content: str) -> Tuple[str, Dict[str, Any]]: + marker = self._generate_marker() + state = self.log_reader.capture_state() + self._send_via_terminal(content) + return marker, state + + def _generate_marker(self) -> str: + return f"{self.marker_prefix}-{int(time.time())}-{os.getpid()}" + + def ask_async(self, question: str) -> bool: + try: + healthy, status = self._check_session_health_impl(probe_terminal=False) + if not healthy: + raise RuntimeError(f"❌ Session error: {status}") + self._send_via_terminal(question) + print("✅ Sent to OpenCode") + print("Hint: Use opend to view reply") + return True + except Exception as exc: + print(f"❌ Send failed: {exc}") + return False + + def ask_sync(self, question: str, timeout: Optional[int] = None) -> Optional[str]: + try: + healthy, status = self._check_session_health_impl(probe_terminal=False) + if not healthy: + raise RuntimeError(f"❌ Session error: {status}") + + print(f"🔔 {t('sending_to', provider='OpenCode')}", flush=True) + _, state = self._send_message(question) + wait_timeout = self.timeout if timeout is None else int(timeout) + print(f"⏳ Waiting for OpenCode reply (timeout {wait_timeout}s)...") + message, _ = self.log_reader.wait_for_message(state, float(wait_timeout)) + if message: + print(f"🤖 {t('reply_from', provider='OpenCode')}") + print(message) + return message + print(f"⏰ {t('timeout_no_reply', provider='OpenCode')}") + return None + except Exception as exc: + print(f"❌ Sync ask failed: {exc}") + return None + From 4d9475a98d566c3528328f50c6b82124e9a5c108 Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 3 Jan 2026 15:02:57 +0800 Subject: [PATCH 107/153] feat: add -a and -r parameter support for opencode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add --continue flag when -r (resume) is used - Auto-create ~/.config/opencode/opencode.json when -a (auto) is used - Set permissions to "allow" for bash, edit, webfetch, read, write - Enable webfetch and websearch tools - Enable network queries by default in auto mode 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- ccb | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/ccb b/ccb index bd2163e..d22809c 100755 --- a/ccb +++ b/ccb @@ -662,7 +662,69 @@ class AILauncher: def _build_opencode_start_cmd(self) -> str: # OpenCode CLI (TUI). Allow override via env for custom wrappers. - return (os.environ.get("OPENCODE_START_CMD") or "opencode").strip() or "opencode" + cmd = (os.environ.get("OPENCODE_START_CMD") or "opencode").strip() or "opencode" + + # Auto mode: relax permissions and enable web tools via config file. + if self.auto: + self._ensure_opencode_auto_config() + + # Resume mode: continue last session + if self.resume: + cmd = f"{cmd} --continue" + + return cmd + + def _ensure_opencode_auto_config(self) -> None: + """ + Ensure ~/.config/opencode/opencode.json exists with relaxed permissions and web tools enabled. + Best-effort: never raise (should not block startup). + """ + try: + config_path = Path.home() / ".config" / "opencode" / "opencode.json" + config_path.parent.mkdir(parents=True, exist_ok=True) + + desired = { + "permission": { + "bash": "allow", + "edit": "allow", + "webfetch": "allow", + "read": "allow", + "write": "allow", + }, + "tools": { + "webfetch": True, + "websearch": True, + }, + } + + current: dict = {} + if config_path.exists(): + try: + current_raw = config_path.read_text(encoding="utf-8") + current_obj = json.loads(current_raw) + if isinstance(current_obj, dict): + current = current_obj + except Exception: + current = {} + + perm = current.get("permission") + if not isinstance(perm, dict): + perm = {} + perm.update(desired["permission"]) + current["permission"] = perm + + tools = current.get("tools") + if not isinstance(tools, dict): + tools = {} + tools.update(desired["tools"]) + current["tools"] = tools + + tmp_path = config_path.with_suffix(".tmp") + tmp_path.write_text(json.dumps(current, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") + os.replace(tmp_path, config_path) + except Exception as exc: + # Non-fatal; OpenCode can still run with interactive permissions. + print(f"⚠️ Failed to update OpenCode config: {exc}", file=sys.stderr) def _start_codex(self, tmux_session: str) -> bool: runtime = self.runtime_dir / "codex" From c25122801d007363b0ea4d50938911ad76f5d7cf Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 4 Jan 2026 10:41:30 +0800 Subject: [PATCH 108/153] refactor: remove CCB_END_TURN sentinel and optimize CLAUDE.md prompts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove CCB_END_TURN sentinel from cask/gask/oask (caused TaskOutput truncation) - Add mandatory completion marker (--- EXECUTION COMPLETE ---) for replies - Consolidate CLAUDE.md prompts: 75 lines → 33 lines using common rules + command map - Unify terminal description to "(WezTerm, iTerm2, or tmux)" - Remove ambiguous "run based on complexity" wording - Update install.sh and install.ps1 with optimized CCB_CONFIG block 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- bin/cask | 18 ++++++++- bin/gask | 18 ++++++++- bin/oask | 19 +++++++-- commands/cask.md | 4 -- commands/gask.md | 4 -- commands/oask.md | 5 --- install.ps1 | 96 ++++++++++++-------------------------------- install.sh | 96 +++++++++++--------------------------------- skills/cask/SKILL.md | 4 -- skills/gask/SKILL.md | 4 -- 10 files changed, 97 insertions(+), 171 deletions(-) diff --git a/bin/cask b/bin/cask index a2e577f..ef2afd3 100755 --- a/bin/cask +++ b/bin/cask @@ -18,6 +18,21 @@ sys.path.insert(0, str(lib_dir)) from compat import setup_windows_encoding setup_windows_encoding() +COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "--- EXECUTION COMPLETE ---").strip() or "--- EXECUTION COMPLETE ---" + + +def _with_completion_marker_request(message: str) -> str: + if not message: + return message + if COMPLETION_MARKER in message: + return message + return ( + f"{message}\n\n" + "IMPORTANT:\n" + "- You MUST reply with a final response (do not stay silent).\n" + f"- End your reply with this exact line (verbatim):\n{COMPLETION_MARKER}\n" + ) + def _usage() -> None: print("Usage: cask [--timeout SECONDS] [--output FILE] ", file=sys.stderr) @@ -116,8 +131,7 @@ def main(argv: list[str]) -> int: if not healthy: raise RuntimeError(f"[ERROR] Session error: {status}") - _, state = comm._send_message(message) - print("CCB_END_TURN", file=sys.stderr) + _, state = comm._send_message(_with_completion_marker_request(message)) reply, _ = comm.log_reader.wait_for_message(state, timeout) if not reply: if not quiet: diff --git a/bin/gask b/bin/gask index a297965..0f598e3 100755 --- a/bin/gask +++ b/bin/gask @@ -21,6 +21,21 @@ setup_windows_encoding() from cli_output import EXIT_ERROR, EXIT_NO_REPLY, EXIT_OK, atomic_write_text +COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "--- EXECUTION COMPLETE ---").strip() or "--- EXECUTION COMPLETE ---" + + +def _with_completion_marker_request(message: str) -> str: + if not message: + return message + if COMPLETION_MARKER in message: + return message + return ( + f"{message}\n\n" + "IMPORTANT:\n" + "- You MUST reply with a final response (do not stay silent).\n" + f"- End your reply with this exact line (verbatim):\n{COMPLETION_MARKER}\n" + ) + def _check_background_mode() -> bool: """Return True when stdout looks like Claude Code run_in_background output capture.""" @@ -113,8 +128,7 @@ def main(argv: list[str]) -> int: if not healthy: raise RuntimeError(f"[ERROR] Session error: {status}") - _, state = comm._send_message(message) - print("CCB_END_TURN", file=sys.stderr) + _, state = comm._send_message(_with_completion_marker_request(message)) reply, _ = comm.log_reader.wait_for_message(state, timeout) if not reply: if not quiet: diff --git a/bin/oask b/bin/oask index c409773..018ec1e 100644 --- a/bin/oask +++ b/bin/oask @@ -19,6 +19,21 @@ from compat import setup_windows_encoding setup_windows_encoding() +COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "--- EXECUTION COMPLETE ---").strip() or "--- EXECUTION COMPLETE ---" + + +def _with_completion_marker_request(message: str) -> str: + if not message: + return message + if COMPLETION_MARKER in message: + return message + return ( + f"{message}\n\n" + "IMPORTANT:\n" + "- You MUST reply with a final response (do not stay silent).\n" + f"- End your reply with this exact line (verbatim):\n{COMPLETION_MARKER}\n" + ) + def _usage() -> None: print("Usage: oask [--timeout SECONDS] [--output FILE] ", file=sys.stderr) @@ -102,8 +117,7 @@ def main(argv: list[str]) -> int: if not healthy: raise RuntimeError(f"[ERROR] Session error: {status}") - _, state = comm._send_message(message) - print("CCB_END_TURN", file=sys.stderr) + _, state = comm._send_message(_with_completion_marker_request(message)) reply, _ = comm.log_reader.wait_for_message(state, timeout) if not reply: if not quiet: @@ -127,4 +141,3 @@ def main(argv: list[str]) -> int: if __name__ == "__main__": raise SystemExit(main(sys.argv)) - diff --git a/commands/cask.md b/commands/cask.md index 7c88abc..7a8de3b 100644 --- a/commands/cask.md +++ b/commands/cask.md @@ -16,10 +16,6 @@ DO NOT wait for result. DO NOT continue working. WRONG: Bash(cask "question") RIGHT: Bash(cask "question", run_in_background=true) -## SENTINEL - -When output contains `CCB_END_TURN`, end response immediately. - ## Parameters - `--timeout SECONDS` optional (default 3600) diff --git a/commands/gask.md b/commands/gask.md index f6d17d4..0d53bdc 100644 --- a/commands/gask.md +++ b/commands/gask.md @@ -16,10 +16,6 @@ DO NOT wait for result. DO NOT continue working. WRONG: Bash(gask "question") RIGHT: Bash(gask "question", run_in_background=true) -## SENTINEL - -When output contains `CCB_END_TURN`, end response immediately. - ## Parameters - `--timeout SECONDS` optional (default 3600) diff --git a/commands/oask.md b/commands/oask.md index d7fb898..61613cc 100644 --- a/commands/oask.md +++ b/commands/oask.md @@ -16,12 +16,7 @@ DO NOT wait for result. DO NOT continue working. WRONG: Bash(oask "question") RIGHT: Bash(oask "question", run_in_background=true) -## SENTINEL - -When output contains `CCB_END_TURN`, end response immediately. - ## Parameters - `--timeout SECONDS` optional (default 3600) - `--output FILE` optional: write reply to FILE - diff --git a/install.ps1 b/install.ps1 index 64324b7..ef0e257 100644 --- a/install.ps1 +++ b/install.ps1 @@ -321,84 +321,38 @@ function Install-ClaudeConfig { $codexRules = @" -## Codex Collaboration Rules -Codex is another AI assistant running in a separate terminal session (WezTerm, iTerm2 or tmux). When user intent involves asking/consulting/collaborating with Codex: +## Collaboration Rules (Codex / Gemini / OpenCode) +Codex, Gemini, and OpenCode are other AI assistants running in separate terminal sessions (WezTerm, iTerm2, or tmux). + +### Common Rules (all assistants) +Trigger (any match): +- User explicitly asks to consult one of them (e.g. "ask codex ...", "let gemini ...") +- User uses an assistant prefix (see table) +- User asks about that assistant's status (e.g. "is codex alive?") Fast path (minimize latency): -- If the user message starts with any of: ``@codex``, ``codex:``, ``ask codex``, ``let codex``, ``/cask`` then immediately run based on complexity. -- If user message is only the prefix (no content), ask a 1-line clarification for what to send. - -Trigger conditions (any match): -- User mentions codex/Codex with questioning/requesting tone -- User wants codex to do something, give advice, or help review -- User asks about codex's status or previous reply - -Command selection (choose based on task complexity): -- Simple questions (quick lookup, short answer, simple check) -> ``cask-w ""`` - - Examples: "what's the syntax for X", "is Y correct", "quick check on Z" - - Blocks until reply, then continue -- Complex tasks (review, analysis, multi-step, code generation) -> ``Bash(cask "", run_in_background=true)`` - - Examples: "review this code", "analyze the architecture", "help design X" - - Tell user "Codex processing (task: xxx)" then END your turn - - When bash-notification arrives, show the task output -- Check connectivity -> ``cping`` -- View previous reply -> ``cpend`` / ``cpend N`` +- If the user message starts with a prefix: treat the rest as the question and dispatch immediately. +- If the user message is only the prefix (no question): ask a 1-line clarification for what to send. -Examples: -- "codex: what's the git command for X" -> ``cask-w "..."`` (simple, wait for reply) -- "ask codex to review this PR" -> ``Bash(cask "...", run_in_background=true)``, END turn (complex) -- "is codex alive" -> cping -- "view codex reply" -> cpend +Actions: +- Ask a question (default) -> ``Bash(ASK_CMD "", run_in_background=true)``, tell user "ASSISTANT processing (task: xxx)", then END your turn +- Check connectivity -> run ``PING_CMD`` +- Use blocking/wait or "show previous reply" commands ONLY if the user explicitly requests them -## Gemini Collaboration Rules -Gemini is another AI assistant running in a separate terminal session (WezTerm, iTerm2 or tmux). When user intent involves asking/consulting/collaborating with Gemini: +Important restrictions: +- After starting a background ask, do NOT poll for results; wait for ``bash-notification`` +- Do NOT use ``*-w`` / ``*pend`` / ``*end`` unless the user explicitly requests -Fast path (minimize latency): -- If the user message starts with any of: ``@gemini``, ``gemini:``, ``ask gemini``, ``let gemini``, ``/gask`` then immediately run based on complexity. -- If user message is only the prefix (no content), ask a 1-line clarification for what to send. - -Trigger conditions (any match): -- User mentions gemini/Gemini with questioning/requesting tone -- User wants gemini to do something, give advice, or help review -- User asks about gemini's status or previous reply - -Command selection (choose based on task complexity): -- Simple questions (quick lookup, short answer, simple check) -> ``gask-w ""`` - - Examples: "what's the syntax for X", "is Y correct", "quick check on Z" - - Blocks until reply, then continue -- Complex tasks (review, analysis, multi-step, code generation) -> ``Bash(gask "", run_in_background=true)`` - - Examples: "review this code", "analyze the architecture", "help design X" - - Tell user "Gemini processing (task: xxx)" then END your turn - - When bash-notification arrives, show the task output -- Check connectivity -> ``gping`` -- View previous reply -> ``gpend`` / ``gpend N`` +### Command Map +| Assistant | Prefixes | ASK_CMD (background) | PING_CMD | Explicit-request-only | +|---|---|---|---|---| +| Codex | ``@codex``, ``codex:``, ``ask codex``, ``let codex``, ``/cask`` | ``cask`` | ``cping`` | ``cask-w``, ``cpend`` | +| Gemini | ``@gemini``, ``gemini:``, ``ask gemini``, ``let gemini``, ``/gask`` | ``gask`` | ``gping`` | ``gask-w``, ``gpend`` | +| OpenCode | ``@opencode``, ``opencode:``, ``ask opencode``, ``let opencode``, ``/oask`` | ``oask`` | ``oping`` | ``oask-w``, ``opend`` | Examples: -- "gemini: what's the best practice for X" -> ``gask-w "..."`` (simple, wait for reply) -- "ask gemini to review this design" -> ``Bash(gask "...", run_in_background=true)``, END turn (complex) -- "is gemini alive" -> gping -- "view gemini reply" -> gpend - -## OpenCode Collaboration Rules -OpenCode is another AI assistant running in a separate terminal session (WezTerm, iTerm2 or tmux). When user intent involves asking/consulting/collaborating with OpenCode: - -Fast path (minimize latency): -- If the user message starts with any of: ``@opencode``, ``opencode:``, ``ask opencode``, ``let opencode``, ``/oask`` then immediately run based on complexity. -- If user message is only the prefix (no content), ask a 1-line clarification for what to send. - -Trigger conditions (any match): -- User mentions opencode/OpenCode with questioning/requesting tone -- User wants opencode to do something, give advice, or help review -- User asks about opencode's status or previous reply - -Command selection: -- Send question -> ``Bash(oask "", run_in_background=true)``, tell user "OpenCode processing (task: xxx)" then END your turn -- Check connectivity -> ``oping`` - -IMPORTANT RESTRICTIONS: -- NEVER use opend/oask-w unless user EXPLICITLY requests -- After oask, ONLY wait for bash-notification to get results -- Do NOT try to fetch results yourself +- ``codex: review this code`` -> ``Bash(cask "...", run_in_background=true)``, END turn +- ``is gemini alive?`` -> ``gping`` "@ diff --git a/install.sh b/install.sh index 161cd9b..1a8ae47 100755 --- a/install.sh +++ b/install.sh @@ -735,86 +735,38 @@ install_claude_md_config() { trap 'rm -f "${ccb_tmpfile:-}"' RETURN cat > "$ccb_tmpfile" << 'AI_RULES' -## Codex Collaboration Rules -Codex is another AI assistant running in a separate terminal session (WezTerm). When user intent involves asking/consulting/collaborating with Codex: +## Collaboration Rules (Codex / Gemini / OpenCode) +Codex, Gemini, and OpenCode are other AI assistants running in separate terminal sessions (WezTerm, iTerm2, or tmux). -Fast path (minimize latency): -- If the user message starts with any of: `@codex`, `codex:`, `ask codex`, `let codex`, `/cask` then immediately run based on complexity. -- If user message is only the prefix (no content), ask a 1-line clarification for what to send. - -Trigger conditions (any match): -- User mentions codex/Codex with questioning/requesting tone -- User wants codex to do something, give advice, or help review -- User asks about codex's status or previous reply - -Command selection: -- Send question -> `Bash(cask "", run_in_background=true)`, tell user "Codex processing (task: xxx)" then END your turn -- Check connectivity -> `cping` - -IMPORTANT RESTRICTIONS: -- NEVER use cpend/cask-w unless user EXPLICITLY requests -- After cask, ONLY wait for bash-notification to get results -- Do NOT try to fetch results yourself - -SENTINEL (IMPORTANT): When you see `CCB_END_TURN` in any output, IMMEDIATELY end your response. - -Examples: -- "ask codex about X" -> `Bash(cask "...", run_in_background=true)`, END turn -- "is codex alive" -> cping - -## Gemini Collaboration Rules -Gemini is another AI assistant running in a separate terminal session (WezTerm, iTerm2 or tmux). When user intent involves asking/consulting/collaborating with Gemini: - -Fast path (minimize latency): -- If the user message starts with any of: `@gemini`, `gemini:`, `ask gemini`, `let gemini`, `/gask` then immediately run based on complexity. -- If user message is only the prefix (no content), ask a 1-line clarification for what to send. - -Trigger conditions (any match): -- User mentions gemini/Gemini with questioning/requesting tone -- User wants gemini to do something, give advice, or help review -- User asks about gemini's status or previous reply - -Command selection: -- Send question -> `Bash(gask "", run_in_background=true)`, tell user "Gemini processing (task: xxx)" then END your turn -- Check connectivity -> `gping` - -IMPORTANT RESTRICTIONS: -- NEVER use gpend/gask-w unless user EXPLICITLY requests -- After gask, ONLY wait for bash-notification to get results -- Do NOT try to fetch results yourself - -SENTINEL (IMPORTANT): When you see `CCB_END_TURN` in any output, IMMEDIATELY end your response. - -Examples: -- "ask gemini about X" -> `Bash(gask "...", run_in_background=true)`, END turn -- "is gemini alive" -> gping - -## OpenCode Collaboration Rules -OpenCode is another AI assistant running in a separate terminal session (WezTerm, iTerm2 or tmux). When user intent involves asking/consulting/collaborating with OpenCode: +### Common Rules (all assistants) +Trigger (any match): +- User explicitly asks to consult one of them (e.g. "ask codex ...", "let gemini ...") +- User uses an assistant prefix (see table) +- User asks about that assistant's status (e.g. "is codex alive?") Fast path (minimize latency): -- If the user message starts with any of: `@opencode`, `opencode:`, `ask opencode`, `let opencode`, `/oask` then immediately run based on complexity. -- If user message is only the prefix (no content), ask a 1-line clarification for what to send. - -Trigger conditions (any match): -- User mentions opencode/OpenCode with questioning/requesting tone -- User wants opencode to do something, give advice, or help review -- User asks about opencode's status or previous reply +- If the user message starts with a prefix: treat the rest as the question and dispatch immediately. +- If the user message is only the prefix (no question): ask a 1-line clarification for what to send. -Command selection: -- Send question -> `Bash(oask "", run_in_background=true)`, tell user "OpenCode processing (task: xxx)" then END your turn -- Check connectivity -> `oping` +Actions: +- Ask a question (default) -> `Bash(ASK_CMD "", run_in_background=true)`, tell user "`ASSISTANT` processing (task: xxx)", then END your turn +- Check connectivity -> run `PING_CMD` +- Use blocking/wait or "show previous reply" commands ONLY if the user explicitly requests them -IMPORTANT RESTRICTIONS: -- NEVER use opend/oask-w unless user EXPLICITLY requests -- After oask, ONLY wait for bash-notification to get results -- Do NOT try to fetch results yourself +Important restrictions: +- After starting a background ask, do NOT poll for results; wait for `bash-notification` +- Do NOT use `*-w` / `*pend` / `*end` unless the user explicitly requests -SENTINEL (IMPORTANT): When you see `CCB_END_TURN` in any output, IMMEDIATELY end your response. +### Command Map +| Assistant | Prefixes | ASK_CMD (background) | PING_CMD | Explicit-request-only | +|---|---|---|---|---| +| Codex | `@codex`, `codex:`, `ask codex`, `let codex`, `/cask` | `cask` | `cping` | `cask-w`, `cpend` | +| Gemini | `@gemini`, `gemini:`, `ask gemini`, `let gemini`, `/gask` | `gask` | `gping` | `gask-w`, `gpend` | +| OpenCode | `@opencode`, `opencode:`, `ask opencode`, `let opencode`, `/oask` | `oask` | `oping` | `oask-w`, `opend` | Examples: -- "ask opencode about X" -> `Bash(oask "...", run_in_background=true)`, END turn -- "is opencode alive" -> oping +- `codex: review this code` -> `Bash(cask "...", run_in_background=true)`, END turn +- `is gemini alive?` -> `gping` AI_RULES local ccb_content diff --git a/skills/cask/SKILL.md b/skills/cask/SKILL.md index 59c8f88..98401b1 100644 --- a/skills/cask/SKILL.md +++ b/skills/cask/SKILL.md @@ -58,10 +58,6 @@ The system will automatically recall you when Codex responds. ❌ WRONG: Submit then check status - wastes time ✅ RIGHT: `Bash(cask "$ARGUMENTS", run_in_background=true)` then END turn -## SENTINEL - -When output contains `CCB_END_TURN`, end response immediately. - ## Parameters - `--timeout SECONDS` optional (default 3600) diff --git a/skills/gask/SKILL.md b/skills/gask/SKILL.md index 9068481..ee5f5cc 100644 --- a/skills/gask/SKILL.md +++ b/skills/gask/SKILL.md @@ -58,10 +58,6 @@ The system will automatically recall you when Gemini responds. ❌ WRONG: Submit then check status - wastes time ✅ RIGHT: `Bash(gask "$ARGUMENTS", run_in_background=true)` then END turn -## SENTINEL - -When output contains `CCB_END_TURN`, end response immediately. - ## Parameters - `--timeout SECONDS` optional (default 3600) From 5c8c49226fea0cea17aff8948f3c27cd65de6fec Mon Sep 17 00:00:00 2001 From: "Mr.Seven" Date: Sun, 4 Jan 2026 17:40:18 +0800 Subject: [PATCH 109/153] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20WSL=20?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E4=B8=8B=20WezTerm=20=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=E6=97=B6=E7=9A=84=20chdir=20=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题描述: 在 WSL 环境下运行 `ccb up codex` 时,WezTerm 创建新窗格会输出错误: `chdir(/wsl.localhost/Ubuntu-24.04/...) failed 2` 根本原因: 当从 WSL 工作目录(如 /home/...)通过 WSL interop 调用 Windows wezterm.exe 时, Windows 会将当前目录错误地映射为 UNC 路径 \\wsl.localhost\..., 导致 WezTerm 的 WSL relay 在执行 chdir 时失败。 解决方案: 通过 _choose_wezterm_cli_cwd() 函数,在 WSL 环境下调用 Windows wezterm.exe 时, 将子进程工作目录设置为 Windows 挂载路径(如 /mnt/c),避免 relay 接触 UNC 路径。 主要改动: - 新增 _choose_wezterm_cli_cwd() 函数:选择安全的 cwd(/mnt/c、/mnt/d 等) - 新增 _extract_wsl_path_from_unc_like_path() 函数:解析 WSL UNC 路径 - 修改 WeztermBackend.create_pane():在 subprocess.run() 中传递 cwd=run_cwd - 修复 startup_script:移除 exec 以支持复合命令 - 支持 CCB_WEZTERM_CLI_CWD 环境变量自定义覆盖 测试环境:WSL2 + Windows WezTerm --- lib/terminal.py | 76 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 69 insertions(+), 7 deletions(-) diff --git a/lib/terminal.py b/lib/terminal.py index 2d60af1..0763b1a 100644 --- a/lib/terminal.py +++ b/lib/terminal.py @@ -35,6 +35,54 @@ def is_wsl() -> bool: return False +def _choose_wezterm_cli_cwd() -> str | None: + """ + Pick a safe cwd for launching Windows `wezterm.exe` from inside WSL. + + When a Windows binary is launched via WSL interop from a WSL cwd (e.g. /home/...), + Windows may treat the process cwd as a UNC path like \\\\wsl.localhost\\..., + which can confuse WezTerm's WSL relay and produce noisy `chdir(/wsl.localhost/...) failed 2`. + Using a Windows-mounted path like /mnt/c avoids that. + """ + override = (os.environ.get("CCB_WEZTERM_CLI_CWD") or "").strip() + candidates = [override] if override else [] + candidates.extend(["/mnt/c", "/mnt/d", "/mnt"]) + for candidate in candidates: + if not candidate: + continue + try: + p = Path(candidate) + if p.is_dir(): + return str(p) + except Exception: + continue + return None + + +def _extract_wsl_path_from_unc_like_path(raw: str) -> str | None: + """ + Convert UNC-like WSL paths into a WSL-internal absolute path. + + Supports forms commonly seen in Git Bash/MSYS and Windows: + - /wsl.localhost/Ubuntu-24.04/home/user/... + - \\\\wsl.localhost\\Ubuntu-24.04\\home\\user\\... + - /wsl$/Ubuntu-24.04/home/user/... + Returns a POSIX absolute path like: /home/user/... + """ + if not raw: + return None + + m = re.match(r'^(?:[/\\]{1,2})(?:wsl\.localhost|wsl\$)[/\\]([^/\\]+)(.*)$', raw, re.IGNORECASE) + if not m: + return None + remainder = m.group(2).replace("\\", "/") + if not remainder: + return "/" + if not remainder.startswith("/"): + remainder = "/" + remainder + return remainder + + def _load_cached_wezterm_bin() -> str | None: """Load cached WezTerm path from installation""" config = Path.home() / ".config/ccb/env" @@ -363,14 +411,16 @@ def activate(self, pane_id: str) -> None: def create_pane(self, cmd: str, cwd: str, direction: str = "right", percent: int = 50, parent_pane: Optional[str] = None) -> str: args = [*self._cli_base_args(), "split-pane"] force_wsl = os.environ.get("CCB_BACKEND_ENV", "").lower() == "wsl" + wsl_unc_cwd = _extract_wsl_path_from_unc_like_path(cwd) + # If the caller is in a WSL UNC path (e.g. Git Bash `/wsl.localhost/...`), + # default to launching via wsl.exe so the new pane lands in the real WSL path. + if is_windows() and wsl_unc_cwd and not force_wsl: + force_wsl = True use_wsl_launch = (is_wsl() and _is_windows_wezterm()) or (force_wsl and is_windows()) if use_wsl_launch: in_wsl_pane = bool(os.environ.get("WSL_DISTRO_NAME") or os.environ.get("WSL_INTEROP")) - wsl_cwd = cwd - wsl_localhost_match = re.match(r'^[/\\]{1,2}wsl\.localhost[/\\][^/\\]+(.+)$', cwd, re.IGNORECASE) - if wsl_localhost_match: - wsl_cwd = wsl_localhost_match.group(1).replace('\\', '/') - elif "\\" in cwd or (len(cwd) > 2 and cwd[1] == ":"): + wsl_cwd = wsl_unc_cwd or cwd + if wsl_unc_cwd is None and ("\\" in cwd or (len(cwd) > 2 and cwd[1] == ":")): try: wslpath_cmd = ["wslpath", "-a", cwd] if is_wsl() else ["wsl.exe", "wslpath", "-a", cwd] result = subprocess.run(wslpath_cmd, capture_output=True, text=True, check=True, encoding="utf-8", errors="replace") @@ -384,7 +434,8 @@ def create_pane(self, cmd: str, cwd: str, direction: str = "right", percent: int args.extend(["--percent", str(percent)]) if parent_pane: args.extend(["--pane-id", parent_pane]) - startup_script = f"cd {shlex.quote(wsl_cwd)} && exec {cmd}" + # Do not `exec` here: `cmd` may be a compound shell snippet (e.g. keep-open wrappers). + startup_script = f"cd {shlex.quote(wsl_cwd)} && {cmd}" if in_wsl_pane: args.extend(["--", "bash", "-l", "-i", "-c", startup_script]) else: @@ -401,7 +452,18 @@ def create_pane(self, cmd: str, cwd: str, direction: str = "right", percent: int shell, flag = _default_shell() args.extend(["--", shell, flag, cmd]) try: - result = subprocess.run(args, capture_output=True, text=True, check=True, encoding="utf-8", errors="replace") + run_cwd = None + if is_wsl() and _is_windows_wezterm(): + run_cwd = _choose_wezterm_cli_cwd() + result = subprocess.run( + args, + capture_output=True, + text=True, + check=True, + encoding="utf-8", + errors="replace", + cwd=run_cwd, + ) return result.stdout.strip() except subprocess.CalledProcessError as e: raise RuntimeError(f"WezTerm split-pane failed:\nCommand: {' '.join(args)}\nStderr: {e.stderr}") from e From bdd232868cde52a58eef21562067e99a70474b3b Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 4 Jan 2026 17:47:17 +0800 Subject: [PATCH 110/153] fix: opend/oask correctly detect OpenCode project ID using git root commit --- bin/opend | 24 ++++++++- lib/opencode_comm.py | 121 +++++++++++++++++++++++++++++++++++++++---- 2 files changed, 134 insertions(+), 11 deletions(-) mode change 100644 => 100755 bin/opend diff --git a/bin/opend b/bin/opend old mode 100644 new mode 100755 index f6f4db9..bb69661 --- a/bin/opend +++ b/bin/opend @@ -3,6 +3,7 @@ opend - View latest OpenCode reply """ +import json import os import sys from pathlib import Path @@ -16,6 +17,26 @@ setup_windows_encoding() from i18n import t + +def _load_project_id() -> str: + """Load project_id from .opencode-session or compute from cwd""" + session_file = Path.cwd() / '.opencode-session' + work_dir = Path.cwd() + + if session_file.exists(): + try: + with session_file.open('r', encoding='utf-8-sig') as f: + data = json.load(f) + wd = data.get('work_dir') + if wd: + work_dir = Path(wd) + except Exception: + pass + + from opencode_comm import compute_opencode_project_id + return compute_opencode_project_id(work_dir) + + try: from cli_output import EXIT_ERROR, EXIT_NO_REPLY, EXIT_OK from opencode_comm import OpenCodeLogReader @@ -34,7 +55,8 @@ def main(argv: list[str]) -> int: print("Usage: opend", file=sys.stderr) return EXIT_OK - reader = OpenCodeLogReader() + project_id = _load_project_id() + reader = OpenCodeLogReader(project_id=project_id) message = reader.latest_message() if not message: print(t("no_reply_available", provider="OpenCode"), file=sys.stderr) diff --git a/lib/opencode_comm.py b/lib/opencode_comm.py index 388712f..ae9e4a8 100644 --- a/lib/opencode_comm.py +++ b/lib/opencode_comm.py @@ -22,6 +22,37 @@ apply_backend_env() +def compute_opencode_project_id(work_dir: Path) -> str: + """ + Compute OpenCode projectID for a directory. + + OpenCode's current behavior (for git worktrees) uses the lexicographically smallest + root commit hash from `git rev-list --max-parents=0 --all` as the projectID. + Non-git directories fall back to "global". + """ + try: + cwd = Path(work_dir).expanduser() + except Exception: + cwd = Path.cwd() + + try: + import subprocess + + proc = subprocess.run( + ["git", "rev-list", "--max-parents=0", "--all"], + cwd=str(cwd), + text=True, + stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL, + check=False, + ) + roots = [line.strip() for line in (proc.stdout or "").splitlines() if line.strip()] + roots.sort() + return roots[0] if roots else "global" + except Exception: + return "global" + + def _normalize_path_for_match(value: str) -> str: try: path = Path(value).expanduser() @@ -93,7 +124,13 @@ class OpenCodeLogReader: def __init__(self, root: Path = OPENCODE_STORAGE_ROOT, work_dir: Optional[Path] = None, project_id: str = "global"): self.root = Path(root).expanduser() self.work_dir = work_dir or Path.cwd() - self.project_id = (os.environ.get("OPENCODE_PROJECT_ID") or project_id or "global").strip() or "global" + env_project_id = (os.environ.get("OPENCODE_PROJECT_ID") or "").strip() + explicit_project_id = bool(env_project_id) or ((project_id or "").strip() not in ("", "global")) + self.project_id = (env_project_id or project_id or "global").strip() or "global" + if not explicit_project_id: + detected = self._detect_project_id_for_workdir() + if detected: + self.project_id = detected try: poll = float(os.environ.get("OPENCODE_POLL_INTERVAL", "0.05")) @@ -152,6 +189,62 @@ def _load_json(self, path: Path) -> dict: except Exception: return {} + def _detect_project_id_for_workdir(self) -> Optional[str]: + """ + Auto-detect OpenCode projectID based on storage/project/*.json. + + Without this, using the default "global" project can accidentally bind to an unrelated + session whose directory is a parent of the current cwd, causing reply polling to miss. + """ + projects_dir = self.root / "project" + if not projects_dir.exists(): + return None + + work_candidates = self._work_dir_candidates() + best_id: str | None = None + best_score: tuple[int, int, float] = (-1, -1, -1.0) + + try: + paths = [p for p in projects_dir.glob("*.json") if p.is_file()] + except Exception: + paths = [] + + for path in paths: + payload = self._load_json(path) + + pid = payload.get("id") if isinstance(payload.get("id"), str) and payload.get("id") else path.stem + worktree = payload.get("worktree") + if not isinstance(pid, str) or not pid: + continue + if not isinstance(worktree, str) or not worktree: + continue + + worktree_norm = _normalize_path_for_match(worktree) + if not worktree_norm: + continue + + # Require the project worktree to contain our cwd (avoid picking an arbitrary child project + # when running from a higher-level directory). + if not any(_path_is_same_or_parent(worktree_norm, c) for c in work_candidates): + continue + + updated = (payload.get("time") or {}).get("updated") + try: + updated_i = int(updated) + except Exception: + updated_i = -1 + try: + mtime = path.stat().st_mtime + except Exception: + mtime = 0.0 + + score = (len(worktree_norm), updated_i, mtime) + if score > best_score: + best_id = pid + best_score = score + + return best_id + def _get_latest_session(self) -> Optional[dict]: sessions_dir = self._session_dir() if not sessions_dir.exists(): @@ -277,14 +370,23 @@ def _key(p: dict) -> tuple[int, float, str]: @staticmethod def _extract_text(parts: List[dict]) -> str: - out: list[str] = [] - for part in parts: - if part.get("type") != "text": - continue - text = part.get("text") - if isinstance(text, str) and text: - out.append(text) - return "".join(out).strip() + def _collect(types: set[str]) -> str: + out: list[str] = [] + for part in parts: + if part.get("type") not in types: + continue + text = part.get("text") + if isinstance(text, str) and text: + out.append(text) + return "".join(out).strip() + + # Prefer final visible content when present. + text = _collect({"text"}) + if text: + return text + + # Fallback: some OpenCode runs only emit reasoning parts without a separate "text" part. + return _collect({"reasoning"}) def capture_state(self) -> Dict[str, Any]: session_entry = self._get_latest_session() @@ -583,4 +685,3 @@ def ask_sync(self, question: str, timeout: Optional[int] = None) -> Optional[str except Exception as exc: print(f"❌ Sync ask failed: {exc}") return None - From 67a375e90ad3cfc4e11841f545708e4ed0efb4aa Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 4 Jan 2026 17:47:28 +0800 Subject: [PATCH 111/153] chore: add executable permissions to OpenCode scripts --- bin/oask | 0 bin/oask-w | 0 bin/oping | 0 3 files changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 bin/oask mode change 100644 => 100755 bin/oask-w mode change 100644 => 100755 bin/oping diff --git a/bin/oask b/bin/oask old mode 100644 new mode 100755 diff --git a/bin/oask-w b/bin/oask-w old mode 100644 new mode 100755 diff --git a/bin/oping b/bin/oping old mode 100644 new mode 100755 From 05d6781458dc12429af634b01b5da0edc2bf7ccf Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 4 Jan 2026 17:52:33 +0800 Subject: [PATCH 112/153] feat: add oask skill for OpenCode async delegation --- skills/oask/SKILL.md | 64 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 skills/oask/SKILL.md diff --git a/skills/oask/SKILL.md b/skills/oask/SKILL.md new file mode 100644 index 0000000..034ac9d --- /dev/null +++ b/skills/oask/SKILL.md @@ -0,0 +1,64 @@ +--- +name: oask +description: Async via oask, end turn immediately; use only when user explicitly delegates to OpenCode (ask/@opencode/let opencode/review); NOT for questions about OpenCode itself. +--- + +# Ask OpenCode Skill + +Send a question to OpenCode AI assistant running in a separate terminal (async). + +## Trigger Conditions + +Use this skill ONLY when user **explicitly delegates** to OpenCode: +- User says "@opencode" / "ask opencode" / "let opencode" / "问opencode" / "让opencode" / "请opencode" + action verb +- User requests OpenCode to review/analyze/suggest/debug/help with code or design + +**DO NOT trigger** when: +- User asks questions **about** OpenCode (e.g., "What is OpenCode?", "How does OpenCode work?") +- User mentions OpenCode in passing without delegation intent + +## Execution (MANDATORY) + +**CRITICAL: ALWAYS use run_in_background=true - NO EXCEPTIONS** + +``` +Bash(oask "$ARGUMENTS", run_in_background=true) +``` + +Where `$ARGUMENTS` is the user's delegation request (forwarded as-is to OpenCode). + +## Workflow (IMPORTANT) + +This is an **async task submission** workflow: +1. Submit task to background → OpenCode processes in separate terminal +2. IMMEDIATELY END your turn → Do NOT wait +3. Background completes → System auto-recalls you with result +4. You can start new conversation immediately + +## After Execution (MANDATORY) + +**If Bash succeeds:** +1. Tell user "OpenCode processing..." (include task_id if available) +2. **IMMEDIATELY END your turn** +3. **DO NOT wait for result** +4. **DO NOT check status** +5. **DO NOT continue working** + +**If Bash fails (error/non-zero exit):** +1. Report the error to user +2. Suggest checking if OpenCode session is running (`ccb status opencode`) +3. Do NOT pretend task is processing + +The system will automatically recall you when OpenCode responds. + +## Wrong vs Right + +❌ WRONG: `Bash(oask "question")` - blocks and waits +❌ WRONG: `Bash(oask "", run_in_background=true)` - placeholder syntax +❌ WRONG: Submit then check status - wastes time +✅ RIGHT: `Bash(oask "$ARGUMENTS", run_in_background=true)` then END turn + +## Parameters + +- `--timeout SECONDS` optional (default 3600) +- `--output FILE` optional: write reply to FILE From 6379c9e5e6456d363a1cab39a3afbf57b18facc8 Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 4 Jan 2026 18:00:08 +0800 Subject: [PATCH 113/153] chore: ignore .opencode-session --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 297c8fa..b6711f9 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ __pycache__/ .codex-session .gemini-session .claude-session +.opencode-session .claude/ *.mp4 tmp/ From 07bd74a0ddb18773efc766373238461081a37dda Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 4 Jan 2026 18:00:13 +0800 Subject: [PATCH 114/153] refactor: remove explicit cask/gask/oask commands, use skills instead --- commands/cask.md | 22 ---------------------- commands/gask.md | 22 ---------------------- commands/oask.md | 22 ---------------------- install.ps1 | 6 +++--- install.sh | 3 --- 5 files changed, 3 insertions(+), 72 deletions(-) delete mode 100644 commands/cask.md delete mode 100644 commands/gask.md delete mode 100644 commands/oask.md diff --git a/commands/cask.md b/commands/cask.md deleted file mode 100644 index 7a8de3b..0000000 --- a/commands/cask.md +++ /dev/null @@ -1,22 +0,0 @@ -CRITICAL: ALWAYS use run_in_background=true - NO EXCEPTIONS - -$ARGUMENTS - -## Execution (MANDATORY) - -Bash(cask "$ARGUMENTS", run_in_background=true) - -## After Execution - -Tell user "Codex processing..." then IMMEDIATELY END your turn. -DO NOT wait for result. DO NOT continue working. - -## Wrong vs Right - -WRONG: Bash(cask "question") -RIGHT: Bash(cask "question", run_in_background=true) - -## Parameters - -- `--timeout SECONDS` optional (default 3600) -- `--output FILE` optional: write reply to FILE diff --git a/commands/gask.md b/commands/gask.md deleted file mode 100644 index 0d53bdc..0000000 --- a/commands/gask.md +++ /dev/null @@ -1,22 +0,0 @@ -CRITICAL: ALWAYS use run_in_background=true - NO EXCEPTIONS - -$ARGUMENTS - -## Execution (MANDATORY) - -Bash(gask "$ARGUMENTS", run_in_background=true) - -## After Execution - -Tell user "Gemini processing..." then IMMEDIATELY END your turn. -DO NOT wait for result. DO NOT continue working. - -## Wrong vs Right - -WRONG: Bash(gask "question") -RIGHT: Bash(gask "question", run_in_background=true) - -## Parameters - -- `--timeout SECONDS` optional (default 3600) -- `--output FILE` optional: write reply to FILE diff --git a/commands/oask.md b/commands/oask.md deleted file mode 100644 index 61613cc..0000000 --- a/commands/oask.md +++ /dev/null @@ -1,22 +0,0 @@ -CRITICAL: ALWAYS use run_in_background=true - NO EXCEPTIONS - -$ARGUMENTS - -## Execution (MANDATORY) - -Bash(oask "$ARGUMENTS", run_in_background=true) - -## After Execution - -Tell user "OpenCode processing..." then IMMEDIATELY END your turn. -DO NOT wait for result. DO NOT continue working. - -## Wrong vs Right - -WRONG: Bash(oask "question") -RIGHT: Bash(oask "question", run_in_background=true) - -## Parameters - -- `--timeout SECONDS` optional (default 3600) -- `--output FILE` optional: write reply to FILE diff --git a/install.ps1 b/install.ps1 index ef0e257..bfcb7af 100644 --- a/install.ps1 +++ b/install.ps1 @@ -34,9 +34,9 @@ $script:SCRIPTS_TO_LINK = @( ) $script:CLAUDE_MARKDOWN = @( - "cask.md", "cask-w.md", "cpend.md", "cping.md", - "gask.md", "gask-w.md", "gpend.md", "gping.md", - "oask.md", "oask-w.md", "opend.md", "oping.md" + "cask-w.md", "cpend.md", "cping.md", + "gask-w.md", "gpend.md", "gping.md", + "oask-w.md", "opend.md", "oping.md" ) $script:LEGACY_SCRIPTS = @( diff --git a/install.sh b/install.sh index 1a8ae47..e55dcc2 100755 --- a/install.sh +++ b/install.sh @@ -105,15 +105,12 @@ SCRIPTS_TO_LINK=( ) CLAUDE_MARKDOWN=( - cask.md cask-w.md cpend.md cping.md - gask.md gask-w.md gpend.md gping.md - oask.md oask-w.md opend.md oping.md From 8a11a39426b843cc9a76c228ec512216a578d030 Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 4 Jan 2026 18:19:32 +0800 Subject: [PATCH 115/153] feat: support ccb up opencode -a highest permission mode --- ccb | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/ccb b/ccb index d22809c..c22dcc2 100755 --- a/ccb +++ b/ccb @@ -676,25 +676,21 @@ class AILauncher: def _ensure_opencode_auto_config(self) -> None: """ - Ensure ~/.config/opencode/opencode.json exists with relaxed permissions and web tools enabled. + Ensure project-local opencode.json exists with full allow permissions (auto mode). Best-effort: never raise (should not block startup). """ try: - config_path = Path.home() / ".config" / "opencode" / "opencode.json" - config_path.parent.mkdir(parents=True, exist_ok=True) + config_path = Path.cwd() / "opencode.json" desired = { "permission": { - "bash": "allow", "edit": "allow", + "bash": "allow", + "skill": "allow", "webfetch": "allow", - "read": "allow", - "write": "allow", - }, - "tools": { - "webfetch": True, - "websearch": True, - }, + "doom_loop": "allow", + "external_directory": "allow", + } } current: dict = {} @@ -707,17 +703,7 @@ class AILauncher: except Exception: current = {} - perm = current.get("permission") - if not isinstance(perm, dict): - perm = {} - perm.update(desired["permission"]) - current["permission"] = perm - - tools = current.get("tools") - if not isinstance(tools, dict): - tools = {} - tools.update(desired["tools"]) - current["tools"] = tools + current["permission"] = dict(desired["permission"]) tmp_path = config_path.with_suffix(".tmp") tmp_path.write_text(json.dumps(current, ensure_ascii=False, indent=2) + "\n", encoding="utf-8") From f862d1b1e32e6e4c93176c1beda2387ba1dde066 Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 4 Jan 2026 18:29:58 +0800 Subject: [PATCH 116/153] fix: prevent backtick command substitution by using stdin/heredoc --- bin/cask | 6 ++---- bin/gask | 4 +++- bin/oask | 6 ++---- skills/cask/SKILL.md | 7 +++++-- skills/gask/SKILL.md | 7 +++++-- skills/oask/SKILL.md | 7 +++++-- 6 files changed, 22 insertions(+), 15 deletions(-) diff --git a/bin/cask b/bin/cask index ef2afd3..0af9135 100755 --- a/bin/cask +++ b/bin/cask @@ -106,15 +106,13 @@ def _parse_args(argv: list[str]) -> Tuple[Optional[Path], float, str, bool]: def main(argv: list[str]) -> int: - if len(argv) <= 1: - _usage() - return 1 - try: from cli_output import EXIT_ERROR, EXIT_NO_REPLY, EXIT_OK, atomic_write_text from codex_comm import CodexCommunicator output_path, timeout, message, quiet = _parse_args(argv) + if not message and not sys.stdin.isatty(): + message = sys.stdin.read().strip() if not message: _usage() return EXIT_ERROR diff --git a/bin/gask b/bin/gask index 0f598e3..1c0ba72 100755 --- a/bin/gask +++ b/bin/gask @@ -67,7 +67,7 @@ def _popen_detached(argv: list[str]) -> None: def main(argv: list[str]) -> int: - if len(argv) <= 1: + if len(argv) <= 1 and sys.stdin.isatty(): print("Usage: gask [--timeout SECONDS] [--output FILE] ", file=sys.stderr) return EXIT_ERROR @@ -104,6 +104,8 @@ def main(argv: list[str]) -> int: parts.append(token) message = " ".join(parts).strip() + if not message and not sys.stdin.isatty(): + message = sys.stdin.read().strip() if not message: print("[ERROR] Message cannot be empty", file=sys.stderr) return EXIT_ERROR diff --git a/bin/oask b/bin/oask index 018ec1e..4ea740e 100755 --- a/bin/oask +++ b/bin/oask @@ -94,15 +94,13 @@ def _parse_args(argv: list[str]) -> Tuple[Optional[Path], float, str, bool]: def main(argv: list[str]) -> int: - if len(argv) <= 1: - _usage() - return 1 - try: from cli_output import EXIT_ERROR, EXIT_NO_REPLY, EXIT_OK, atomic_write_text from opencode_comm import OpenCodeCommunicator output_path, timeout, message, quiet = _parse_args(argv) + if not message and not sys.stdin.isatty(): + message = sys.stdin.read().strip() if not message: _usage() return EXIT_ERROR diff --git a/skills/cask/SKILL.md b/skills/cask/SKILL.md index 98401b1..1e35c8b 100644 --- a/skills/cask/SKILL.md +++ b/skills/cask/SKILL.md @@ -22,7 +22,10 @@ Use this skill ONLY when user **explicitly delegates** to Codex: **CRITICAL: ALWAYS use run_in_background=true - NO EXCEPTIONS** ``` -Bash(cask "$ARGUMENTS", run_in_background=true) +Bash(cask <<'EOF' +$ARGUMENTS +EOF +, run_in_background=true) ``` Where `$ARGUMENTS` is the user's delegation request (forwarded as-is to Codex). @@ -56,7 +59,7 @@ The system will automatically recall you when Codex responds. ❌ WRONG: `Bash(cask "question")` - blocks and waits ❌ WRONG: `Bash(cask "", run_in_background=true)` - placeholder syntax ❌ WRONG: Submit then check status - wastes time -✅ RIGHT: `Bash(cask "$ARGUMENTS", run_in_background=true)` then END turn +✅ RIGHT: `Bash(cask <<'EOF' ... EOF, run_in_background=true)` then END turn ## Parameters diff --git a/skills/gask/SKILL.md b/skills/gask/SKILL.md index ee5f5cc..9337dda 100644 --- a/skills/gask/SKILL.md +++ b/skills/gask/SKILL.md @@ -22,7 +22,10 @@ Use this skill ONLY when user **explicitly delegates** to Gemini: **CRITICAL: ALWAYS use run_in_background=true - NO EXCEPTIONS** ``` -Bash(gask "$ARGUMENTS", run_in_background=true) +Bash(gask <<'EOF' +$ARGUMENTS +EOF +, run_in_background=true) ``` Where `$ARGUMENTS` is the user's delegation request (forwarded as-is to Gemini). @@ -56,7 +59,7 @@ The system will automatically recall you when Gemini responds. ❌ WRONG: `Bash(gask "question")` - blocks and waits ❌ WRONG: `Bash(gask "", run_in_background=true)` - placeholder syntax ❌ WRONG: Submit then check status - wastes time -✅ RIGHT: `Bash(gask "$ARGUMENTS", run_in_background=true)` then END turn +✅ RIGHT: `Bash(gask <<'EOF' ... EOF, run_in_background=true)` then END turn ## Parameters diff --git a/skills/oask/SKILL.md b/skills/oask/SKILL.md index 034ac9d..2b23dbb 100644 --- a/skills/oask/SKILL.md +++ b/skills/oask/SKILL.md @@ -22,7 +22,10 @@ Use this skill ONLY when user **explicitly delegates** to OpenCode: **CRITICAL: ALWAYS use run_in_background=true - NO EXCEPTIONS** ``` -Bash(oask "$ARGUMENTS", run_in_background=true) +Bash(oask <<'EOF' +$ARGUMENTS +EOF +, run_in_background=true) ``` Where `$ARGUMENTS` is the user's delegation request (forwarded as-is to OpenCode). @@ -56,7 +59,7 @@ The system will automatically recall you when OpenCode responds. ❌ WRONG: `Bash(oask "question")` - blocks and waits ❌ WRONG: `Bash(oask "", run_in_background=true)` - placeholder syntax ❌ WRONG: Submit then check status - wastes time -✅ RIGHT: `Bash(oask "$ARGUMENTS", run_in_background=true)` then END turn +✅ RIGHT: `Bash(oask <<'EOF' ... EOF, run_in_background=true)` then END turn ## Parameters From b9d286d04e0a75c6a601e8f00d692d4cd0d1b4b4 Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 4 Jan 2026 18:42:24 +0800 Subject: [PATCH 117/153] feat: install Codex oask skill for OpenCode delegation --- codex_skills/oask/SKILL.md | 35 +++++++++++++++++++++++++++++++++++ install.sh | 21 +++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 codex_skills/oask/SKILL.md diff --git a/codex_skills/oask/SKILL.md b/codex_skills/oask/SKILL.md new file mode 100644 index 0000000..6c0c601 --- /dev/null +++ b/codex_skills/oask/SKILL.md @@ -0,0 +1,35 @@ +--- +name: oask +description: Delegate a task to OpenCode via the existing `oask` command (stdin-safe). Use only when the user explicitly asks to delegate to OpenCode (ask/@opencode/let opencode/review); NOT for questions about OpenCode itself. +--- + +# Delegate to OpenCode (oask) + +This skill lets Codex delegate work to OpenCode by running the existing `oask` command. + +## Trigger Conditions + +Use this skill ONLY when the user explicitly delegates to OpenCode, e.g.: +- "@opencode …", "ask opencode …", "let opencode …" +- "use opencode to review/analyze/debug …" + +DO NOT use this skill when: +- The user asks questions *about* OpenCode itself (how it works, install, config, etc.) +- The user mentions OpenCode without delegation intent + +## Prerequisites / Troubleshooting + +- OpenCode backend must be running: `ccb up opencode` +- If unsure, check status: `ccb status opencode` + +## Execution + +Run `oask` and pass the full user request via stdin (prevents shell backtick command substitution): + +```sh +oask <<'EOF' + +EOF +``` + +Then relay OpenCode’s reply back to the user. diff --git a/install.sh b/install.sh index e55dcc2..840b517 100755 --- a/install.sh +++ b/install.sh @@ -662,6 +662,26 @@ install_claude_skills() { echo "Updated Claude skills directory: $skills_dst" } +install_codex_skills() { + local skills_src="$REPO_ROOT/codex_skills" + local skills_dst="${CODEX_HOME:-$HOME/.codex}/skills" + + if [[ ! -d "$skills_src" ]]; then + return + fi + + mkdir -p "$skills_dst" + for skill_dir in "$skills_src"/*/; do + [[ -d "$skill_dir" ]] || continue + local skill_name + skill_name=$(basename "$skill_dir") + rm -rf "$skills_dst/$skill_name" + cp -r "$skill_dir" "$skills_dst/$skill_name" + echo " Installed Codex skill: $skill_name" + done + echo "Updated Codex skills directory: $skills_dst" +} + CCB_START_MARKER="" CCB_END_MARKER="" LEGACY_RULE_MARKER="## Codex 协作规则" @@ -913,6 +933,7 @@ install_all() { ensure_path_configured install_claude_commands install_claude_skills + install_codex_skills install_claude_md_config install_settings_permissions echo "OK: Installation complete" From b4564fe026815920adf3cc16948398e49a69ddd4 Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 4 Jan 2026 18:49:51 +0800 Subject: [PATCH 118/153] fix: improve OpenCode storage/project detection on Windows and WSL --- lib/opencode_comm.py | 98 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 97 insertions(+), 1 deletion(-) diff --git a/lib/opencode_comm.py b/lib/opencode_comm.py index ae9e4a8..8b6957f 100644 --- a/lib/opencode_comm.py +++ b/lib/opencode_comm.py @@ -10,6 +10,7 @@ import json import os +import shutil import sys import time from pathlib import Path @@ -35,12 +36,60 @@ def compute_opencode_project_id(work_dir: Path) -> str: except Exception: cwd = Path.cwd() + def _find_git_dir(start: Path) -> tuple[Path | None, Path | None]: + """ + Return (git_root_dir, git_dir_path) if a .git entry is found. + + Handles: + - normal repos: /.git/ (directory) + - worktrees: /.git (file containing "gitdir: ") + """ + for candidate in [start, *start.parents]: + git_entry = candidate / ".git" + if not git_entry.exists(): + continue + if git_entry.is_dir(): + return candidate, git_entry + if git_entry.is_file(): + try: + raw = git_entry.read_text(encoding="utf-8", errors="replace").strip() + prefix = "gitdir:" + if raw.lower().startswith(prefix): + gitdir = raw[len(prefix) :].strip() + gitdir_path = Path(gitdir) + if not gitdir_path.is_absolute(): + gitdir_path = (candidate / gitdir_path).resolve() + return candidate, gitdir_path + except Exception: + continue + return None, None + + def _read_cached_project_id(git_dir: Path | None) -> str | None: + if not git_dir: + return None + try: + cache_path = git_dir / "opencode" + if not cache_path.exists(): + return None + cached = cache_path.read_text(encoding="utf-8", errors="replace").strip() + return cached or None + except Exception: + return None + + git_root, git_dir = _find_git_dir(cwd) + cached = _read_cached_project_id(git_dir) + if cached: + return cached + try: import subprocess + if not shutil.which("git"): + return "global" + proc = subprocess.run( ["git", "rev-list", "--max-parents=0", "--all"], - cwd=str(cwd), + cwd=str(git_root or cwd), text=True, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, @@ -80,6 +129,15 @@ def _path_is_same_or_parent(parent: str, child: str) -> bool: return child == parent or child[len(parent) :].startswith("/") +def _is_wsl() -> bool: + if os.environ.get("WSL_INTEROP") or os.environ.get("WSL_DISTRO_NAME"): + return True + try: + return "microsoft" in Path("/proc/version").read_text(encoding="utf-8", errors="ignore").lower() + except Exception: + return False + + def _default_opencode_storage_root() -> Path: env = (os.environ.get("OPENCODE_STORAGE_ROOT") or "").strip() if env: @@ -87,6 +145,9 @@ def _default_opencode_storage_root() -> Path: # Common defaults candidates: list[Path] = [] + xdg_data_home = (os.environ.get("XDG_DATA_HOME") or "").strip() + if xdg_data_home: + candidates.append(Path(xdg_data_home) / "opencode" / "storage") candidates.append(Path.home() / ".local" / "share" / "opencode" / "storage") # Windows native (best-effort; OpenCode might not use this, but allow it if present) @@ -96,6 +157,41 @@ def _default_opencode_storage_root() -> Path: appdata = os.environ.get("APPDATA") if appdata: candidates.append(Path(appdata) / "opencode" / "storage") + # Windows fallback when env vars are missing. + candidates.append(Path.home() / "AppData" / "Local" / "opencode" / "storage") + candidates.append(Path.home() / "AppData" / "Roaming" / "opencode" / "storage") + + # WSL: OpenCode may run on Windows and store data under C:\Users\\AppData\...\opencode\storage. + # Try common /mnt/c mappings. + if _is_wsl(): + users_root = Path("/mnt/c/Users") + if users_root.exists(): + preferred_names: list[str] = [] + for k in ("WINUSER", "USERNAME", "USER"): + v = (os.environ.get(k) or "").strip() + if v and v not in preferred_names: + preferred_names.append(v) + for name in preferred_names: + candidates.append(users_root / name / "AppData" / "Local" / "opencode" / "storage") + candidates.append(users_root / name / "AppData" / "Roaming" / "opencode" / "storage") + + # If still not found, scan for any matching storage dir and pick the most recently modified. + found: list[Path] = [] + try: + for user_dir in users_root.iterdir(): + if not user_dir.is_dir(): + continue + for p in ( + user_dir / "AppData" / "Local" / "opencode" / "storage", + user_dir / "AppData" / "Roaming" / "opencode" / "storage", + ): + if p.exists(): + found.append(p) + except Exception: + found = [] + if found: + found.sort(key=lambda p: p.stat().st_mtime if p.exists() else 0.0, reverse=True) + candidates.insert(0, found[0]) for candidate in candidates: try: From 4041ef4fbf0bfcee442570fbc9a0cb7adcecb137 Mon Sep 17 00:00:00 2001 From: bfly Date: Sun, 4 Jan 2026 18:53:50 +0800 Subject: [PATCH 119/153] fix: make OpenCode path/project detection more robust on Windows --- lib/opencode_comm.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/opencode_comm.py b/lib/opencode_comm.py index 8b6957f..90d124d 100644 --- a/lib/opencode_comm.py +++ b/lib/opencode_comm.py @@ -10,6 +10,7 @@ import json import os +import re import shutil import sys import time @@ -103,8 +104,18 @@ def _read_cached_project_id(git_dir: Path | None) -> str | None: def _normalize_path_for_match(value: str) -> str: + s = (value or "").strip() + if os.name == "nt": + # MSYS/Git-Bash style: /c/Users/... -> c:/Users/... + if len(s) >= 4 and s[0] == "/" and s[2] == "/" and s[1].isalpha(): + s = f"{s[1].lower()}:/{s[3:]}" + # WSL-style path string seen on Windows occasionally: /mnt/c/... -> c:/... + m = re.match(r"^/mnt/([A-Za-z])/(.*)$", s) + if m: + s = f"{m.group(1).lower()}:/{m.group(2)}" + try: - path = Path(value).expanduser() + path = Path(s).expanduser() # OpenCode "directory" seems to come from the launch cwd, so avoid resolve() to prevent # symlink/WSL mismatch (similar rationale to gemini hashing). normalized = str(path.absolute()) @@ -227,6 +238,9 @@ def __init__(self, root: Path = OPENCODE_STORAGE_ROOT, work_dir: Optional[Path] detected = self._detect_project_id_for_workdir() if detected: self.project_id = detected + else: + # Fallback for older storage layouts or path-matching issues. + self.project_id = compute_opencode_project_id(self.work_dir) try: poll = float(os.environ.get("OPENCODE_POLL_INTERVAL", "0.05")) From 04e36511a1502dbe31c1c9d6a12a67b59e4f96a5 Mon Sep 17 00:00:00 2001 From: bfly Date: Mon, 5 Jan 2026 00:52:16 +0800 Subject: [PATCH 120/153] feat: wait for COMPLETION_MARKER before returning reply MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add marker-waiting loop to cask/gask/oask - Strict check: last line must equal marker (not just contains) - Only strip trailing marker line, preserve text content - Accumulate chunks from multiple messages - Return EXIT_NO_REPLY on timeout (semantic exit code) - Fix OpenCode: fallback to marker check when completed timestamp missing 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- bin/cask | 51 +++++++++++++++++++++++++++++++++++++++----- bin/gask | 51 +++++++++++++++++++++++++++++++++++++++----- bin/oask | 51 +++++++++++++++++++++++++++++++++++++++----- lib/opencode_comm.py | 10 ++++++++- 4 files changed, 147 insertions(+), 16 deletions(-) diff --git a/bin/cask b/bin/cask index 0af9135..a4e72ef 100755 --- a/bin/cask +++ b/bin/cask @@ -20,6 +20,47 @@ setup_windows_encoding() COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "--- EXECUTION COMPLETE ---").strip() or "--- EXECUTION COMPLETE ---" +import time + + +def _has_completion_marker(text: str) -> bool: + """Check if last line equals COMPLETION_MARKER (strict match).""" + lines = text.rstrip().splitlines() + return bool(lines) and lines[-1].strip() == COMPLETION_MARKER + + +def _strip_completion_marker(text: str) -> str: + """Remove only the trailing marker line, not all occurrences.""" + lines = text.rstrip().splitlines() + if lines and lines[-1].strip() == COMPLETION_MARKER: + return "\n".join(lines[:-1]).rstrip() + return text.rstrip() + + +def _wait_for_complete_reply(log_reader, state: dict, timeout: float, quiet: bool): + """Wait until reply ends with COMPLETION_MARKER or timeout.""" + from cli_output import EXIT_NO_REPLY, EXIT_OK + + deadline = time.time() + timeout + chunks = [] + while True: + remaining = deadline - time.time() + if remaining <= 0: + break + reply, state = log_reader.wait_for_message(state, remaining) + if reply is None: + continue + chunks.append(reply) + if _has_completion_marker(reply): + combined = "\n".join(chunks) + return _strip_completion_marker(combined), EXIT_OK + if chunks: + if not quiet: + print("[WARN] Marker not detected, returning partial reply", file=sys.stderr) + combined = "\n".join(chunks) + return _strip_completion_marker(combined), EXIT_NO_REPLY + return None, EXIT_NO_REPLY + def _with_completion_marker_request(message: str) -> str: if not message: @@ -130,20 +171,20 @@ def main(argv: list[str]) -> int: raise RuntimeError(f"[ERROR] Session error: {status}") _, state = comm._send_message(_with_completion_marker_request(message)) - reply, _ = comm.log_reader.wait_for_message(state, timeout) - if not reply: + reply, exit_code = _wait_for_complete_reply(comm.log_reader, state, timeout, quiet) + if reply is None: if not quiet: print(f"[TIMEOUT] Timeout after {int(timeout)}s", file=sys.stderr) - return EXIT_NO_REPLY + return exit_code if output_path: atomic_write_text(output_path, reply + "\n") - return EXIT_OK + return exit_code sys.stdout.write(reply) if not reply.endswith("\n"): sys.stdout.write("\n") - return EXIT_OK + return exit_code except KeyboardInterrupt: return 130 except Exception as exc: diff --git a/bin/gask b/bin/gask index 1c0ba72..0af9657 100755 --- a/bin/gask +++ b/bin/gask @@ -23,6 +23,47 @@ from cli_output import EXIT_ERROR, EXIT_NO_REPLY, EXIT_OK, atomic_write_text COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "--- EXECUTION COMPLETE ---").strip() or "--- EXECUTION COMPLETE ---" +import time + + +def _has_completion_marker(text: str) -> bool: + """Check if last line equals COMPLETION_MARKER (strict match).""" + lines = text.rstrip().splitlines() + return bool(lines) and lines[-1].strip() == COMPLETION_MARKER + + +def _strip_completion_marker(text: str) -> str: + """Remove only the trailing marker line, not all occurrences.""" + lines = text.rstrip().splitlines() + if lines and lines[-1].strip() == COMPLETION_MARKER: + return "\n".join(lines[:-1]).rstrip() + return text.rstrip() + + +def _wait_for_complete_reply(log_reader, state: dict, timeout: float, quiet: bool): + """Wait until reply ends with COMPLETION_MARKER or timeout.""" + from cli_output import EXIT_NO_REPLY, EXIT_OK + + deadline = time.time() + timeout + chunks = [] + while True: + remaining = deadline - time.time() + if remaining <= 0: + break + reply, state = log_reader.wait_for_message(state, remaining) + if reply is None: + continue + chunks.append(reply) + if _has_completion_marker(reply): + combined = "\n".join(chunks) + return _strip_completion_marker(combined), EXIT_OK + if chunks: + if not quiet: + print("[WARN] Marker not detected, returning partial reply", file=sys.stderr) + combined = "\n".join(chunks) + return _strip_completion_marker(combined), EXIT_NO_REPLY + return None, EXIT_NO_REPLY + def _with_completion_marker_request(message: str) -> str: if not message: @@ -131,20 +172,20 @@ def main(argv: list[str]) -> int: raise RuntimeError(f"[ERROR] Session error: {status}") _, state = comm._send_message(_with_completion_marker_request(message)) - reply, _ = comm.log_reader.wait_for_message(state, timeout) - if not reply: + reply, exit_code = _wait_for_complete_reply(comm.log_reader, state, timeout, quiet) + if reply is None: if not quiet: print(f"[TIMEOUT] Timeout after {int(timeout)}s", file=sys.stderr) - return EXIT_NO_REPLY + return exit_code if output_path: atomic_write_text(output_path, reply + "\n") - return EXIT_OK + return exit_code sys.stdout.write(reply) if not reply.endswith("\n"): sys.stdout.write("\n") - return EXIT_OK + return exit_code except KeyboardInterrupt: return 130 except Exception as exc: diff --git a/bin/oask b/bin/oask index 4ea740e..713c557 100755 --- a/bin/oask +++ b/bin/oask @@ -21,6 +21,47 @@ setup_windows_encoding() COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "--- EXECUTION COMPLETE ---").strip() or "--- EXECUTION COMPLETE ---" +import time + + +def _has_completion_marker(text: str) -> bool: + """Check if last line equals COMPLETION_MARKER (strict match).""" + lines = text.rstrip().splitlines() + return bool(lines) and lines[-1].strip() == COMPLETION_MARKER + + +def _strip_completion_marker(text: str) -> str: + """Remove only the trailing marker line, not all occurrences.""" + lines = text.rstrip().splitlines() + if lines and lines[-1].strip() == COMPLETION_MARKER: + return "\n".join(lines[:-1]).rstrip() + return text.rstrip() + + +def _wait_for_complete_reply(log_reader, state: dict, timeout: float, quiet: bool): + """Wait until reply ends with COMPLETION_MARKER or timeout.""" + from cli_output import EXIT_NO_REPLY, EXIT_OK + + deadline = time.time() + timeout + chunks = [] + while True: + remaining = deadline - time.time() + if remaining <= 0: + break + reply, state = log_reader.wait_for_message(state, remaining) + if reply is None: + continue + chunks.append(reply) + if _has_completion_marker(reply): + combined = "\n".join(chunks) + return _strip_completion_marker(combined), EXIT_OK + if chunks: + if not quiet: + print("[WARN] Marker not detected, returning partial reply", file=sys.stderr) + combined = "\n".join(chunks) + return _strip_completion_marker(combined), EXIT_NO_REPLY + return None, EXIT_NO_REPLY + def _with_completion_marker_request(message: str) -> str: if not message: @@ -116,20 +157,20 @@ def main(argv: list[str]) -> int: raise RuntimeError(f"[ERROR] Session error: {status}") _, state = comm._send_message(_with_completion_marker_request(message)) - reply, _ = comm.log_reader.wait_for_message(state, timeout) - if not reply: + reply, exit_code = _wait_for_complete_reply(comm.log_reader, state, timeout, quiet) + if reply is None: if not quiet: print(f"[TIMEOUT] Timeout after {int(timeout)}s", file=sys.stderr) - return EXIT_NO_REPLY + return exit_code if output_path: atomic_write_text(output_path, reply + "\n") - return EXIT_OK + return exit_code sys.stdout.write(reply) if not reply.endswith("\n"): sys.stdout.write("\n") - return EXIT_OK + return exit_code except KeyboardInterrupt: return 130 except Exception as exc: diff --git a/lib/opencode_comm.py b/lib/opencode_comm.py index 90d124d..c171031 100644 --- a/lib/opencode_comm.py +++ b/lib/opencode_comm.py @@ -558,7 +558,15 @@ def _find_new_assistant_reply(self, session_id: str, state: Dict[str, Any]) -> O # If assistant is still streaming, wait (prefer completed reply). if completed_i is None: - return None + # Fallback: some OpenCode builds may omit completed timestamps. + # If the message already contains the completion marker, treat it as complete. + parts = self._read_parts(str(latest_id)) + text = self._extract_text(parts) + completion_marker = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "--- EXECUTION COMPLETE ---").strip() or "--- EXECUTION COMPLETE ---" + if text and completion_marker in text: + completed_i = int(time.time() * 1000) + else: + return None # Still streaming, wait # Detect change via count or last id or completion timestamp. if len(assistants) <= prev_count and latest_id == prev_last and completed_i == prev_completed: From 4b5d7a70d3fc3afa747342ab891bdb9f385c40e8 Mon Sep 17 00:00:00 2001 From: bfly Date: Mon, 5 Jan 2026 08:55:28 +0800 Subject: [PATCH 121/153] fix: only check text parts for completion marker, avoid reasoning fallback MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add allow_reasoning_fallback parameter to _extract_text() - Use allow_reasoning_fallback=False for marker detection - Only fallback to reasoning when completed timestamp confirmed - Prevents premature return of reasoning content 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- lib/opencode_comm.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/opencode_comm.py b/lib/opencode_comm.py index c171031..4208937 100644 --- a/lib/opencode_comm.py +++ b/lib/opencode_comm.py @@ -479,7 +479,7 @@ def _key(p: dict) -> tuple[int, float, str]: return parts @staticmethod - def _extract_text(parts: List[dict]) -> str: + def _extract_text(parts: List[dict], allow_reasoning_fallback: bool = True) -> str: def _collect(types: set[str]) -> str: out: list[str] = [] for part in parts: @@ -496,7 +496,9 @@ def _collect(types: set[str]) -> str: return text # Fallback: some OpenCode runs only emit reasoning parts without a separate "text" part. - return _collect({"reasoning"}) + if allow_reasoning_fallback: + return _collect({"reasoning"}) + return "" def capture_state(self) -> Dict[str, Any]: session_entry = self._get_latest_session() @@ -559,9 +561,9 @@ def _find_new_assistant_reply(self, session_id: str, state: Dict[str, Any]) -> O # If assistant is still streaming, wait (prefer completed reply). if completed_i is None: # Fallback: some OpenCode builds may omit completed timestamps. - # If the message already contains the completion marker, treat it as complete. + # If the message already contains a completion marker, treat it as complete. parts = self._read_parts(str(latest_id)) - text = self._extract_text(parts) + text = self._extract_text(parts, allow_reasoning_fallback=False) completion_marker = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "--- EXECUTION COMPLETE ---").strip() or "--- EXECUTION COMPLETE ---" if text and completion_marker in text: completed_i = int(time.time() * 1000) @@ -573,7 +575,11 @@ def _find_new_assistant_reply(self, session_id: str, state: Dict[str, Any]) -> O return None parts = self._read_parts(str(latest_id)) - return self._extract_text(parts) or None + # Prefer text content; if empty and completed, fallback to reasoning + text = self._extract_text(parts, allow_reasoning_fallback=False) + if not text and completed_i is not None: + text = self._extract_text(parts, allow_reasoning_fallback=True) + return text or None def _read_since(self, state: Dict[str, Any], timeout: float, block: bool) -> Tuple[Optional[str], Dict[str, Any]]: deadline = time.time() + timeout From e7f4458e992337cc4a31733b6250d013074285f3 Mon Sep 17 00:00:00 2001 From: bfly Date: Mon, 5 Jan 2026 09:34:48 +0800 Subject: [PATCH 122/153] refactor: simplify completion detection MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Change COMPLETION_MARKER from "--- EXECUTION COMPLETE ---" to "[EXECUTION_COMPLETE]" (avoids markdown parsing issues that split the marker) - Simplify oask: use OpenCode's time.completed timestamp directly (no need for marker-waiting loop like cask/gask) - Keep marker in prompt as hint, but OpenCode completion is timestamp-based 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- bin/cask | 2 +- bin/gask | 2 +- bin/oask | 56 +++++++++++++------------------------------- lib/opencode_comm.py | 2 +- 4 files changed, 19 insertions(+), 43 deletions(-) diff --git a/bin/cask b/bin/cask index a4e72ef..9951a1f 100755 --- a/bin/cask +++ b/bin/cask @@ -18,7 +18,7 @@ sys.path.insert(0, str(lib_dir)) from compat import setup_windows_encoding setup_windows_encoding() -COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "--- EXECUTION COMPLETE ---").strip() or "--- EXECUTION COMPLETE ---" +COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "[EXECUTION_COMPLETE]").strip() or "[EXECUTION_COMPLETE]" import time diff --git a/bin/gask b/bin/gask index 0af9657..81e4f82 100755 --- a/bin/gask +++ b/bin/gask @@ -21,7 +21,7 @@ setup_windows_encoding() from cli_output import EXIT_ERROR, EXIT_NO_REPLY, EXIT_OK, atomic_write_text -COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "--- EXECUTION COMPLETE ---").strip() or "--- EXECUTION COMPLETE ---" +COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "[EXECUTION_COMPLETE]").strip() or "[EXECUTION_COMPLETE]" import time diff --git a/bin/oask b/bin/oask index 713c557..3b22717 100755 --- a/bin/oask +++ b/bin/oask @@ -4,6 +4,9 @@ oask - Send message to OpenCode and wait for reply (sync). Designed to be used with Claude Code's run_in_background=true. If --output is provided, the reply is written atomically to that file and stdout stays empty. + +Note: OpenCode uses time.completed timestamp to indicate message completion, +so we don't need to wait for COMPLETION_MARKER like cask/gask do. """ from __future__ import annotations @@ -19,50 +22,17 @@ from compat import setup_windows_encoding setup_windows_encoding() -COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "--- EXECUTION COMPLETE ---").strip() or "--- EXECUTION COMPLETE ---" - -import time - - -def _has_completion_marker(text: str) -> bool: - """Check if last line equals COMPLETION_MARKER (strict match).""" - lines = text.rstrip().splitlines() - return bool(lines) and lines[-1].strip() == COMPLETION_MARKER +COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "[EXECUTION_COMPLETE]").strip() or "[EXECUTION_COMPLETE]" def _strip_completion_marker(text: str) -> str: - """Remove only the trailing marker line, not all occurrences.""" + """Remove trailing marker line if present (cleanup only).""" lines = text.rstrip().splitlines() if lines and lines[-1].strip() == COMPLETION_MARKER: return "\n".join(lines[:-1]).rstrip() return text.rstrip() -def _wait_for_complete_reply(log_reader, state: dict, timeout: float, quiet: bool): - """Wait until reply ends with COMPLETION_MARKER or timeout.""" - from cli_output import EXIT_NO_REPLY, EXIT_OK - - deadline = time.time() + timeout - chunks = [] - while True: - remaining = deadline - time.time() - if remaining <= 0: - break - reply, state = log_reader.wait_for_message(state, remaining) - if reply is None: - continue - chunks.append(reply) - if _has_completion_marker(reply): - combined = "\n".join(chunks) - return _strip_completion_marker(combined), EXIT_OK - if chunks: - if not quiet: - print("[WARN] Marker not detected, returning partial reply", file=sys.stderr) - combined = "\n".join(chunks) - return _strip_completion_marker(combined), EXIT_NO_REPLY - return None, EXIT_NO_REPLY - - def _with_completion_marker_request(message: str) -> str: if not message: return message @@ -156,21 +126,27 @@ def main(argv: list[str]) -> int: if not healthy: raise RuntimeError(f"[ERROR] Session error: {status}") + # Send message with marker hint (OpenCode uses timestamp for completion, not marker) _, state = comm._send_message(_with_completion_marker_request(message)) - reply, exit_code = _wait_for_complete_reply(comm.log_reader, state, timeout, quiet) - if reply is None: + + # Wait for reply using OpenCode's time.completed timestamp + reply, _ = comm.log_reader.wait_for_message(state, timeout) + if not reply: if not quiet: print(f"[TIMEOUT] Timeout after {int(timeout)}s", file=sys.stderr) - return exit_code + return EXIT_NO_REPLY + + # Strip marker if present (cleanup) + reply = _strip_completion_marker(reply) if output_path: atomic_write_text(output_path, reply + "\n") - return exit_code + return EXIT_OK sys.stdout.write(reply) if not reply.endswith("\n"): sys.stdout.write("\n") - return exit_code + return EXIT_OK except KeyboardInterrupt: return 130 except Exception as exc: diff --git a/lib/opencode_comm.py b/lib/opencode_comm.py index 4208937..5cb90af 100644 --- a/lib/opencode_comm.py +++ b/lib/opencode_comm.py @@ -564,7 +564,7 @@ def _find_new_assistant_reply(self, session_id: str, state: Dict[str, Any]) -> O # If the message already contains a completion marker, treat it as complete. parts = self._read_parts(str(latest_id)) text = self._extract_text(parts, allow_reasoning_fallback=False) - completion_marker = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "--- EXECUTION COMPLETE ---").strip() or "--- EXECUTION COMPLETE ---" + completion_marker = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "[EXECUTION_COMPLETE]").strip() or "[EXECUTION_COMPLETE]" if text and completion_marker in text: completed_i = int(time.time() * 1000) else: From a42dbf389cc63a5c30c87669e1b852f00a8e9078 Mon Sep 17 00:00:00 2001 From: bfly Date: Mon, 5 Jan 2026 10:24:13 +0800 Subject: [PATCH 123/153] fix: handle race condition when OpenCode reply exists before capture_state MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add fallback check when state appears unchanged - If completed_i exists, try to read and return existing content - Prevents indefinite waiting for already-existing replies 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- lib/opencode_comm.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/opencode_comm.py b/lib/opencode_comm.py index 5cb90af..838338e 100644 --- a/lib/opencode_comm.py +++ b/lib/opencode_comm.py @@ -572,6 +572,16 @@ def _find_new_assistant_reply(self, session_id: str, state: Dict[str, Any]) -> O # Detect change via count or last id or completion timestamp. if len(assistants) <= prev_count and latest_id == prev_last and completed_i == prev_completed: + # Race condition fallback: if there's a completed reply with content, return it. + # This handles cases where capture_state() happened after OpenCode already replied, + # preventing the process from waiting indefinitely for a reply that already exists. + if completed_i is not None: + parts = self._read_parts(str(latest_id)) + text = self._extract_text(parts, allow_reasoning_fallback=False) + if not text: + text = self._extract_text(parts, allow_reasoning_fallback=True) + if text: + return text return None parts = self._read_parts(str(latest_id)) From aa8dcb70add9abb69750ec526738e7b8accc7cb5 Mon Sep 17 00:00:00 2001 From: bfly Date: Tue, 6 Jan 2026 00:02:13 +0800 Subject: [PATCH 124/153] fix: race condition in gask/cask - pre-check for existing messages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add 0.1s pre-check before wait loop to catch fast responses that arrive before log_reader is ready. Fixes first-call failures when Gemini/Codex responds quickly. Bump version to 2.3.1. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- README.md | 14 ++++++++++++-- bin/cask | 13 +++++++++++++ bin/gask | 13 +++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2f7c247..d0cb280 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

-# Claude Code Bridge (ccb) v2.3 +# Claude Code Bridge (ccb) v2.3.1 **Silky Smooth Claude & Codex & Gemini Collaboration via Split-Pane Terminal** @@ -15,7 +15,7 @@ Every Model Controllable

-[![Version](https://img.shields.io/badge/version-2.3-orange.svg)]() +[![Version](https://img.shields.io/badge/version-2.3.1-orange.svg)]() [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) [![Platform](https://img.shields.io/badge/platform-Linux%20%7C%20macOS%20%7C%20Windows-lightgrey.svg)]() @@ -292,3 +292,13 @@ Once started, collaborate naturally. Claude will detect when to delegate tasks. WeChat Group
+ +--- + +
+Version History + +### v2.3.1 +- Fix race condition in gask/cask: pre-check for existing messages before wait loop + +
diff --git a/bin/cask b/bin/cask index 9951a1f..80a0e98 100755 --- a/bin/cask +++ b/bin/cask @@ -41,8 +41,20 @@ def _wait_for_complete_reply(log_reader, state: dict, timeout: float, quiet: boo """Wait until reply ends with COMPLETION_MARKER or timeout.""" from cli_output import EXIT_NO_REPLY, EXIT_OK + # Pre-check: try to read existing messages (may have arrived before we started) + existing_reply = None + try: + existing_reply, state = log_reader.wait_for_message(state, timeout=0.1) + if existing_reply and _has_completion_marker(existing_reply): + return _strip_completion_marker(existing_reply), EXIT_OK + except Exception: + pass + deadline = time.time() + timeout chunks = [] + if existing_reply: + chunks.append(existing_reply) + while True: remaining = deadline - time.time() if remaining <= 0: @@ -54,6 +66,7 @@ def _wait_for_complete_reply(log_reader, state: dict, timeout: float, quiet: boo if _has_completion_marker(reply): combined = "\n".join(chunks) return _strip_completion_marker(combined), EXIT_OK + if chunks: if not quiet: print("[WARN] Marker not detected, returning partial reply", file=sys.stderr) diff --git a/bin/gask b/bin/gask index 81e4f82..8a209be 100755 --- a/bin/gask +++ b/bin/gask @@ -44,8 +44,20 @@ def _wait_for_complete_reply(log_reader, state: dict, timeout: float, quiet: boo """Wait until reply ends with COMPLETION_MARKER or timeout.""" from cli_output import EXIT_NO_REPLY, EXIT_OK + # Pre-check: try to read existing messages (may have arrived before we started) + existing_reply = None + try: + existing_reply, state = log_reader.wait_for_message(state, timeout=0.1) + if existing_reply and _has_completion_marker(existing_reply): + return _strip_completion_marker(existing_reply), EXIT_OK + except Exception: + pass + deadline = time.time() + timeout chunks = [] + if existing_reply: + chunks.append(existing_reply) + while True: remaining = deadline - time.time() if remaining <= 0: @@ -57,6 +69,7 @@ def _wait_for_complete_reply(log_reader, state: dict, timeout: float, quiet: boo if _has_completion_marker(reply): combined = "\n".join(chunks) return _strip_completion_marker(combined), EXIT_OK + if chunks: if not quiet: print("[WARN] Marker not detected, returning partial reply", file=sys.stderr) From d1ea4f04f5c550521368f929e996c1f1be16d1bd Mon Sep 17 00:00:00 2001 From: bfly Date: Tue, 6 Jan 2026 10:04:21 +0800 Subject: [PATCH 125/153] refactor: optimize skill files, extract common patterns to shared doc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Simplify cask/gask/oask SKILL.md (~60% token reduction) - Add docs/async-ask-pattern.md for shared workflow documentation - Keep critical rules inline, move details to shared doc Bump version to 2.3.2. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- README.md | 7 ++-- skills/cask/SKILL.md | 56 ++++-------------------------- skills/docs/async-ask-pattern.md | 59 ++++++++++++++++++++++++++++++++ skills/gask/SKILL.md | 56 ++++-------------------------- skills/oask/SKILL.md | 56 ++++-------------------------- 5 files changed, 85 insertions(+), 149 deletions(-) create mode 100644 skills/docs/async-ask-pattern.md diff --git a/README.md b/README.md index d0cb280..9a67fba 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@
-# Claude Code Bridge (ccb) v2.3.1 +# Claude Code Bridge (ccb) v2.3.2 **Silky Smooth Claude & Codex & Gemini Collaboration via Split-Pane Terminal** @@ -15,7 +15,7 @@ Every Model Controllable

-[![Version](https://img.shields.io/badge/version-2.3.1-orange.svg)]() +[![Version](https://img.shields.io/badge/version-2.3.2-orange.svg)]() [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) [![Platform](https://img.shields.io/badge/platform-Linux%20%7C%20macOS%20%7C%20Windows-lightgrey.svg)]() @@ -298,6 +298,9 @@ Once started, collaborate naturally. Claude will detect when to delegate tasks.
Version History +### v2.3.2 +- Optimize skill files: extract common patterns to docs/async-ask-pattern.md (~60% token reduction) + ### v2.3.1 - Fix race condition in gask/cask: pre-check for existing messages before wait loop diff --git a/skills/cask/SKILL.md b/skills/cask/SKILL.md index 1e35c8b..e567a06 100644 --- a/skills/cask/SKILL.md +++ b/skills/cask/SKILL.md @@ -3,24 +3,12 @@ name: cask description: Async via cask, end turn immediately; use only when user explicitly delegates to Codex (ask/@codex/let codex/review); NOT for questions about Codex itself. --- -# Ask Codex Skill +# Ask Codex (Async) -Send a question to Codex AI assistant running in a separate terminal (async). - -## Trigger Conditions - -Use this skill ONLY when user **explicitly delegates** to Codex: -- User says "@codex" / "ask codex" / "let codex" / "问codex" / "让codex" / "请codex" + action verb -- User requests Codex to review/analyze/suggest/debug/help with code or design - -**DO NOT trigger** when: -- User asks questions **about** Codex (e.g., "What is Codex?", "How does Codex work?") -- User mentions Codex in passing without delegation intent +Send the user’s request to Codex asynchronously. ## Execution (MANDATORY) -**CRITICAL: ALWAYS use run_in_background=true - NO EXCEPTIONS** - ``` Bash(cask <<'EOF' $ARGUMENTS @@ -28,40 +16,10 @@ EOF , run_in_background=true) ``` -Where `$ARGUMENTS` is the user's delegation request (forwarded as-is to Codex). - -## Workflow (IMPORTANT) - -This is an **async task submission** workflow: -1. Submit task to background → Codex processes in separate terminal -2. IMMEDIATELY END your turn → Do NOT wait -3. Background completes → System auto-recalls you with result -4. You can start new conversation immediately - -## After Execution (MANDATORY) - -**If Bash succeeds:** -1. Tell user "Codex processing..." (include task_id if available) -2. **IMMEDIATELY END your turn** -3. **DO NOT wait for result** -4. **DO NOT check status** -5. **DO NOT continue working** - -**If Bash fails (error/non-zero exit):** -1. Report the error to user -2. Suggest checking if Codex session is running (`ccb status codex`) -3. Do NOT pretend task is processing - -The system will automatically recall you when Codex responds. - -## Wrong vs Right - -❌ WRONG: `Bash(cask "question")` - blocks and waits -❌ WRONG: `Bash(cask "", run_in_background=true)` - placeholder syntax -❌ WRONG: Submit then check status - wastes time -✅ RIGHT: `Bash(cask <<'EOF' ... EOF, run_in_background=true)` then END turn +## CRITICAL Rules -## Parameters +- Always use `run_in_background=true`. +- After running `cask`, say “Codex processing...” and immediately end your turn. +- Do not wait for results or check status in the same turn. -- `--timeout SECONDS` optional (default 3600) -- `--output FILE` optional: write reply to FILE +Details: `~/.claude/skills/docs/async-ask-pattern.md` diff --git a/skills/docs/async-ask-pattern.md b/skills/docs/async-ask-pattern.md new file mode 100644 index 0000000..74ac342 --- /dev/null +++ b/skills/docs/async-ask-pattern.md @@ -0,0 +1,59 @@ +# Async Ask Pattern (cask/gask/oask) + +Use this pattern to delegate work to a partner AI (Codex/Gemini/OpenCode) asynchronously. + +## When To Use + +Use ONLY when the user explicitly delegates to one of: +- Codex: `@codex`, `ask codex`, `let codex`, “让 codex …”, “请 codex …” +- Gemini: `@gemini`, `ask gemini`, `let gemini`, “让 gemini …”, “请 gemini …” +- OpenCode: `@opencode`, `ask opencode`, `let opencode`, “让 opencode …”, “请 opencode …” + +DO NOT use when the user asks questions *about* the tool itself. + +## Command Mapping + +- Codex → `cask` → status: `ccb status codex` +- Gemini → `gask` → status: `ccb status gemini` +- OpenCode → `oask` → status: `ccb status opencode` + +## Execution (MANDATORY) + +Always run in background and pass the user request via a single-quoted HEREDOC (prevents shell backtick/`$()` expansion): + +```bash +Bash( <<'EOF' + +EOF +, run_in_background=true) +``` + +## Workflow (IMPORTANT) + +1. Submit task to background (partner AI processes elsewhere). +2. Immediately end the current turn. Do not wait. +3. The system will recall you when the background command returns. + +## After Execution (MANDATORY) + +If Bash succeeds: +- Tell the user: “ processing...” +- Immediately end your turn. +- Do not check status or do additional work in the same turn. + +If Bash fails: +- Report the error output. +- Suggest checking backend status with the mapping above. + +## Wrong vs Right + +- Wrong: `Bash(cask "…")` (may break on backticks; may block) +- Right: `Bash(cask <<'EOF' … EOF, run_in_background=true)` then end turn + +## Parameters + +Supported by `cask/gask/oask`: +- `--timeout SECONDS` (default 3600) +- `--output FILE` (write reply to FILE) +- `-q/--quiet` (reduce stderr noise; timeout still returns non-zero) + diff --git a/skills/gask/SKILL.md b/skills/gask/SKILL.md index 9337dda..b3c23a6 100644 --- a/skills/gask/SKILL.md +++ b/skills/gask/SKILL.md @@ -3,24 +3,12 @@ name: gask description: Async via gask, end turn immediately; use only when user explicitly delegates to Gemini (ask/@gemini/let gemini/review); NOT for questions about Gemini itself. --- -# Ask Gemini Skill +# Ask Gemini (Async) -Send a question to Gemini AI assistant running in a separate terminal (async). - -## Trigger Conditions - -Use this skill ONLY when user **explicitly delegates** to Gemini: -- User says "@gemini" / "ask gemini" / "let gemini" / "问gemini" / "让gemini" / "请gemini" + action verb -- User requests Gemini to review/analyze/suggest/debug/help with code or design - -**DO NOT trigger** when: -- User asks questions **about** Gemini (e.g., "What is Gemini?", "How does Gemini work?") -- User mentions Gemini in passing without delegation intent +Send the user’s request to Gemini asynchronously. ## Execution (MANDATORY) -**CRITICAL: ALWAYS use run_in_background=true - NO EXCEPTIONS** - ``` Bash(gask <<'EOF' $ARGUMENTS @@ -28,40 +16,10 @@ EOF , run_in_background=true) ``` -Where `$ARGUMENTS` is the user's delegation request (forwarded as-is to Gemini). - -## Workflow (IMPORTANT) - -This is an **async task submission** workflow: -1. Submit task to background → Gemini processes in separate terminal -2. IMMEDIATELY END your turn → Do NOT wait -3. Background completes → System auto-recalls you with result -4. You can start new conversation immediately - -## After Execution (MANDATORY) - -**If Bash succeeds:** -1. Tell user "Gemini processing..." (include task_id if available) -2. **IMMEDIATELY END your turn** -3. **DO NOT wait for result** -4. **DO NOT check status** -5. **DO NOT continue working** - -**If Bash fails (error/non-zero exit):** -1. Report the error to user -2. Suggest checking if Gemini session is running (`ccb status gemini`) -3. Do NOT pretend task is processing - -The system will automatically recall you when Gemini responds. - -## Wrong vs Right - -❌ WRONG: `Bash(gask "question")` - blocks and waits -❌ WRONG: `Bash(gask "", run_in_background=true)` - placeholder syntax -❌ WRONG: Submit then check status - wastes time -✅ RIGHT: `Bash(gask <<'EOF' ... EOF, run_in_background=true)` then END turn +## CRITICAL Rules -## Parameters +- Always use `run_in_background=true`. +- After running `gask`, say “Gemini processing...” and immediately end your turn. +- Do not wait for results or check status in the same turn. -- `--timeout SECONDS` optional (default 3600) -- `--output FILE` optional: write reply to FILE +Details: `~/.claude/skills/docs/async-ask-pattern.md` diff --git a/skills/oask/SKILL.md b/skills/oask/SKILL.md index 2b23dbb..df889e0 100644 --- a/skills/oask/SKILL.md +++ b/skills/oask/SKILL.md @@ -3,24 +3,12 @@ name: oask description: Async via oask, end turn immediately; use only when user explicitly delegates to OpenCode (ask/@opencode/let opencode/review); NOT for questions about OpenCode itself. --- -# Ask OpenCode Skill +# Ask OpenCode (Async) -Send a question to OpenCode AI assistant running in a separate terminal (async). - -## Trigger Conditions - -Use this skill ONLY when user **explicitly delegates** to OpenCode: -- User says "@opencode" / "ask opencode" / "let opencode" / "问opencode" / "让opencode" / "请opencode" + action verb -- User requests OpenCode to review/analyze/suggest/debug/help with code or design - -**DO NOT trigger** when: -- User asks questions **about** OpenCode (e.g., "What is OpenCode?", "How does OpenCode work?") -- User mentions OpenCode in passing without delegation intent +Send the user’s request to OpenCode asynchronously. ## Execution (MANDATORY) -**CRITICAL: ALWAYS use run_in_background=true - NO EXCEPTIONS** - ``` Bash(oask <<'EOF' $ARGUMENTS @@ -28,40 +16,10 @@ EOF , run_in_background=true) ``` -Where `$ARGUMENTS` is the user's delegation request (forwarded as-is to OpenCode). - -## Workflow (IMPORTANT) - -This is an **async task submission** workflow: -1. Submit task to background → OpenCode processes in separate terminal -2. IMMEDIATELY END your turn → Do NOT wait -3. Background completes → System auto-recalls you with result -4. You can start new conversation immediately - -## After Execution (MANDATORY) - -**If Bash succeeds:** -1. Tell user "OpenCode processing..." (include task_id if available) -2. **IMMEDIATELY END your turn** -3. **DO NOT wait for result** -4. **DO NOT check status** -5. **DO NOT continue working** - -**If Bash fails (error/non-zero exit):** -1. Report the error to user -2. Suggest checking if OpenCode session is running (`ccb status opencode`) -3. Do NOT pretend task is processing - -The system will automatically recall you when OpenCode responds. - -## Wrong vs Right - -❌ WRONG: `Bash(oask "question")` - blocks and waits -❌ WRONG: `Bash(oask "", run_in_background=true)` - placeholder syntax -❌ WRONG: Submit then check status - wastes time -✅ RIGHT: `Bash(oask <<'EOF' ... EOF, run_in_background=true)` then END turn +## CRITICAL Rules -## Parameters +- Always use `run_in_background=true`. +- After running `oask`, say “OpenCode processing...” and immediately end your turn. +- Do not wait for results or check status in the same turn. -- `--timeout SECONDS` optional (default 3600) -- `--output FILE` optional: write reply to FILE +Details: `~/.claude/skills/docs/async-ask-pattern.md` From 94fad954346acb87120f85a8e08ae542f35e8c61 Mon Sep 17 00:00:00 2001 From: bfly Date: Tue, 6 Jan 2026 10:07:42 +0800 Subject: [PATCH 126/153] refactor: simplify cping.md to match oping/gping style MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove unnecessary implementation details (detection items, output format). Keep only essential execution instructions. Bump version to 2.3.3. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- README.md | 7 +++++-- commands/cping.md | 20 +++++--------------- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 9a67fba..e26483d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@
-# Claude Code Bridge (ccb) v2.3.2 +# Claude Code Bridge (ccb) v2.3.3 **Silky Smooth Claude & Codex & Gemini Collaboration via Split-Pane Terminal** @@ -15,7 +15,7 @@ Every Model Controllable

-[![Version](https://img.shields.io/badge/version-2.3.2-orange.svg)]() +[![Version](https://img.shields.io/badge/version-2.3.3-orange.svg)]() [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) [![Platform](https://img.shields.io/badge/platform-Linux%20%7C%20macOS%20%7C%20Windows-lightgrey.svg)]() @@ -298,6 +298,9 @@ Once started, collaborate naturally. Claude will detect when to delegate tasks.
Version History +### v2.3.3 +- Simplify cping.md to match oping/gping style (~65% token reduction) + ### v2.3.2 - Optimize skill files: extract common patterns to docs/async-ask-pattern.md (~60% token reduction) diff --git a/commands/cping.md b/commands/cping.md index 9be1f1c..aca3e91 100644 --- a/commands/cping.md +++ b/commands/cping.md @@ -1,19 +1,9 @@ -Use `cping` to check if current Codex session is healthy, quickly locate communication issues. +Test connectivity with Codex via `cping` command. Execution: -- Run `Bash(cping)` on Claude side, no need to output command execution process -- Run `cping` directly in local terminal - -Detection items: -1. Is `.codex-session` marked as active, does runtime directory exist -2. tmux mode: Is FIFO pipe still accessible -3. tmux mode: Is Codex side process alive (verified by `codex.pid`) -4. WezTerm mode: Does pane still exist (detected via `wezterm cli list`) - -Output: -- Success: `Codex connection OK (...)` -- Failure: Lists missing components or error info for further troubleshooting +- Run silently `Bash(cping)`, no additional analysis or operations after execution +- Can also run `cping` in terminal with same effect Hints: -- If detection fails, try re-running `ccb up codex` or check bridge logs -- On multiple timeouts or no response, run `cping` first before deciding to restart session +- Returns Codex session status +- Used to check if Codex is running normally From 824d6ed9bf70a6016906d75da0b5aa291e685b49 Mon Sep 17 00:00:00 2001 From: bfly Date: Tue, 6 Jan 2026 10:13:21 +0800 Subject: [PATCH 127/153] feat: auto-enable plan mode when CCA is installed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When Claude Code Autoflow (CCA) is detected, automatically start Claude with --permission-mode plan for better workflow integration. Bump version to 2.3.4. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- README.md | 7 +++++-- ccb | 6 ++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e26483d..fedd2f4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@
-# Claude Code Bridge (ccb) v2.3.3 +# Claude Code Bridge (ccb) v2.3.4 **Silky Smooth Claude & Codex & Gemini Collaboration via Split-Pane Terminal** @@ -15,7 +15,7 @@ Every Model Controllable

-[![Version](https://img.shields.io/badge/version-2.3.3-orange.svg)]() +[![Version](https://img.shields.io/badge/version-2.3.4-orange.svg)]() [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) [![Platform](https://img.shields.io/badge/platform-Linux%20%7C%20macOS%20%7C%20Windows-lightgrey.svg)]() @@ -298,6 +298,9 @@ Once started, collaborate naturally. Claude will detect when to delegate tasks.
Version History +### v2.3.4 +- Auto-enable plan mode when CCA (Claude Code Autoflow) is installed + ### v2.3.3 - Simplify cping.md to match oping/gping style (~65% token reduction) diff --git a/ccb b/ccb index c22dcc2..a156818 100755 --- a/ccb +++ b/ccb @@ -1084,6 +1084,12 @@ exec tmux attach -t "$TMUX_SESSION" return 1 cmd = [claude_cmd] + + # If CCA (Claude Code Autoflow) is installed, start Claude in plan mode + cca_path, _ = _detect_cca() + if cca_path: + cmd.extend(["--permission-mode", "plan"]) + if self.auto: cmd.append("--dangerously-skip-permissions") if self.resume: From 29daa81418b07b64d96b9290f27d6cb3a31f746b Mon Sep 17 00:00:00 2001 From: bfly Date: Tue, 6 Jan 2026 14:45:55 +0800 Subject: [PATCH 128/153] fix: prevent plan mode conflict with auto mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --permission-mode plan and --dangerously-skip-permissions are mutually exclusive. Only apply plan mode when not in auto mode. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- ccb | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/ccb b/ccb index a156818..446b998 100755 --- a/ccb +++ b/ccb @@ -1085,13 +1085,14 @@ exec tmux attach -t "$TMUX_SESSION" cmd = [claude_cmd] - # If CCA (Claude Code Autoflow) is installed, start Claude in plan mode - cca_path, _ = _detect_cca() - if cca_path: - cmd.extend(["--permission-mode", "plan"]) - if self.auto: + # Auto mode: bypass all permissions (incompatible with plan mode) cmd.append("--dangerously-skip-permissions") + else: + # If CCA (Claude Code Autoflow) is installed, start Claude in plan mode + cca_path, _ = _detect_cca() + if cca_path: + cmd.extend(["--permission-mode", "plan"]) if self.resume: _, has_history = self._get_latest_claude_session_id() if has_history: From 94be8088750c06e26d74ffcd3859015dfdc08bc8 Mon Sep 17 00:00:00 2001 From: bfly Date: Tue, 6 Jan 2026 15:01:55 +0800 Subject: [PATCH 129/153] fix: oask returning stale reply when OpenCode still processing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove incorrect fallback logic that returned old completed replies when nothing changed. If count/id/completed are unchanged, keep waiting for new reply instead of returning stale content. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- lib/opencode_comm.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/lib/opencode_comm.py b/lib/opencode_comm.py index 838338e..3360597 100644 --- a/lib/opencode_comm.py +++ b/lib/opencode_comm.py @@ -571,17 +571,8 @@ def _find_new_assistant_reply(self, session_id: str, state: Dict[str, Any]) -> O return None # Still streaming, wait # Detect change via count or last id or completion timestamp. + # If nothing changed, no new reply yet - keep waiting. if len(assistants) <= prev_count and latest_id == prev_last and completed_i == prev_completed: - # Race condition fallback: if there's a completed reply with content, return it. - # This handles cases where capture_state() happened after OpenCode already replied, - # preventing the process from waiting indefinitely for a reply that already exists. - if completed_i is not None: - parts = self._read_parts(str(latest_id)) - text = self._extract_text(parts, allow_reasoning_fallback=False) - if not text: - text = self._extract_text(parts, allow_reasoning_fallback=True) - if text: - return text return None parts = self._read_parts(str(latest_id)) From 34d43dcff6bd99c7f9598d69df5c9910f6cabd4a Mon Sep 17 00:00:00 2001 From: bfly Date: Tue, 6 Jan 2026 15:04:45 +0800 Subject: [PATCH 130/153] chore: bump version to 2.3.5 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- README.md | 8 ++++++-- ccb | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index fedd2f4..5899b6c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@
-# Claude Code Bridge (ccb) v2.3.4 +# Claude Code Bridge (ccb) v2.3.5 **Silky Smooth Claude & Codex & Gemini Collaboration via Split-Pane Terminal** @@ -15,7 +15,7 @@ Every Model Controllable

-[![Version](https://img.shields.io/badge/version-2.3.4-orange.svg)]() +[![Version](https://img.shields.io/badge/version-2.3.5-orange.svg)]() [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) [![Platform](https://img.shields.io/badge/platform-Linux%20%7C%20macOS%20%7C%20Windows-lightgrey.svg)]() @@ -298,6 +298,10 @@ Once started, collaborate naturally. Claude will detect when to delegate tasks.
Version History +### v2.3.5 +- Fix plan mode conflict with auto mode (--dangerously-skip-permissions) +- Fix oask returning stale reply when OpenCode still processing + ### v2.3.4 - Auto-enable plan mode when CCA (Claude Code Autoflow) is installed diff --git a/ccb b/ccb index 446b998..f623ab6 100755 --- a/ccb +++ b/ccb @@ -36,7 +36,7 @@ backend_env = get_backend_env() if backend_env and not os.environ.get("CCB_BACKEND_ENV"): os.environ["CCB_BACKEND_ENV"] = backend_env -VERSION = "2.2" +VERSION = "2.3.5" GIT_COMMIT = "" GIT_DATE = "" From 23cdf1c50aad8668a9b9634a75c2a62fc7d007d6 Mon Sep 17 00:00:00 2001 From: bfly Date: Tue, 6 Jan 2026 18:42:34 +0800 Subject: [PATCH 131/153] feat: add per-provider lock and output clearing for request-response isolation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add lib/process_lock.py with cross-platform file locking - Each provider (codex/gemini/opencode) has independent lock - Clear output file before new request to avoid stale content - Reset log state after lock acquisition to ignore old messages - Includes stale lock detection (checks if holder PID is alive) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- bin/cask | 31 ++++++--- bin/gask | 31 ++++++--- bin/oask | 37 ++++++---- lib/process_lock.py | 161 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 227 insertions(+), 33 deletions(-) create mode 100644 lib/process_lock.py diff --git a/bin/cask b/bin/cask index 80a0e98..64f407e 100755 --- a/bin/cask +++ b/bin/cask @@ -17,6 +17,7 @@ lib_dir = script_dir.parent / "lib" sys.path.insert(0, str(lib_dir)) from compat import setup_windows_encoding setup_windows_encoding() +from process_lock import ProviderLock COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "[EXECUTION_COMPLETE]").strip() or "[EXECUTION_COMPLETE]" @@ -183,16 +184,26 @@ def main(argv: list[str]) -> int: if not healthy: raise RuntimeError(f"[ERROR] Session error: {status}") - _, state = comm._send_message(_with_completion_marker_request(message)) - reply, exit_code = _wait_for_complete_reply(comm.log_reader, state, timeout, quiet) - if reply is None: - if not quiet: - print(f"[TIMEOUT] Timeout after {int(timeout)}s", file=sys.stderr) - return exit_code - - if output_path: - atomic_write_text(output_path, reply + "\n") - return exit_code + # Use per-provider lock to serialize request-response cycles + lock_timeout = float(os.environ.get("CCB_LOCK_TIMEOUT", "60.0")) + with ProviderLock("codex", timeout=lock_timeout): + # Clear output file if specified (avoid stale content) + if output_path and output_path.exists(): + output_path.write_text("") + + # Reset log state to ignore any messages before lock acquisition + comm.log_reader.capture_state() + + _, state = comm._send_message(_with_completion_marker_request(message)) + reply, exit_code = _wait_for_complete_reply(comm.log_reader, state, timeout, quiet) + if reply is None: + if not quiet: + print(f"[TIMEOUT] Timeout after {int(timeout)}s", file=sys.stderr) + return exit_code + + if output_path: + atomic_write_text(output_path, reply + "\n") + return exit_code sys.stdout.write(reply) if not reply.endswith("\n"): diff --git a/bin/gask b/bin/gask index 8a209be..0a25e30 100755 --- a/bin/gask +++ b/bin/gask @@ -18,6 +18,7 @@ lib_dir = script_dir.parent / "lib" sys.path.insert(0, str(lib_dir)) from compat import setup_windows_encoding setup_windows_encoding() +from process_lock import ProviderLock from cli_output import EXIT_ERROR, EXIT_NO_REPLY, EXIT_OK, atomic_write_text @@ -184,16 +185,26 @@ def main(argv: list[str]) -> int: if not healthy: raise RuntimeError(f"[ERROR] Session error: {status}") - _, state = comm._send_message(_with_completion_marker_request(message)) - reply, exit_code = _wait_for_complete_reply(comm.log_reader, state, timeout, quiet) - if reply is None: - if not quiet: - print(f"[TIMEOUT] Timeout after {int(timeout)}s", file=sys.stderr) - return exit_code - - if output_path: - atomic_write_text(output_path, reply + "\n") - return exit_code + # Use per-provider lock to serialize request-response cycles + lock_timeout = float(os.environ.get("CCB_LOCK_TIMEOUT", "60.0")) + with ProviderLock("gemini", timeout=lock_timeout): + # Clear output file if specified (avoid stale content) + if output_path and output_path.exists(): + output_path.write_text("") + + # Reset log state to ignore any messages before lock acquisition + comm.log_reader.capture_state() + + _, state = comm._send_message(_with_completion_marker_request(message)) + reply, exit_code = _wait_for_complete_reply(comm.log_reader, state, timeout, quiet) + if reply is None: + if not quiet: + print(f"[TIMEOUT] Timeout after {int(timeout)}s", file=sys.stderr) + return exit_code + + if output_path: + atomic_write_text(output_path, reply + "\n") + return exit_code sys.stdout.write(reply) if not reply.endswith("\n"): diff --git a/bin/oask b/bin/oask index 3b22717..ec068bf 100755 --- a/bin/oask +++ b/bin/oask @@ -21,6 +21,7 @@ sys.path.insert(0, str(lib_dir)) from compat import setup_windows_encoding setup_windows_encoding() +from process_lock import ProviderLock COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "[EXECUTION_COMPLETE]").strip() or "[EXECUTION_COMPLETE]" @@ -126,22 +127,32 @@ def main(argv: list[str]) -> int: if not healthy: raise RuntimeError(f"[ERROR] Session error: {status}") - # Send message with marker hint (OpenCode uses timestamp for completion, not marker) - _, state = comm._send_message(_with_completion_marker_request(message)) + # Use per-provider lock to serialize request-response cycles + lock_timeout = float(os.environ.get("CCB_LOCK_TIMEOUT", "60.0")) + with ProviderLock("opencode", timeout=lock_timeout): + # Clear output file if specified (avoid stale content) + if output_path and output_path.exists(): + output_path.write_text("") - # Wait for reply using OpenCode's time.completed timestamp - reply, _ = comm.log_reader.wait_for_message(state, timeout) - if not reply: - if not quiet: - print(f"[TIMEOUT] Timeout after {int(timeout)}s", file=sys.stderr) - return EXIT_NO_REPLY + # Reset log state to ignore any messages before lock acquisition + comm.log_reader.capture_state() - # Strip marker if present (cleanup) - reply = _strip_completion_marker(reply) + # Send message with marker hint (OpenCode uses timestamp for completion, not marker) + _, state = comm._send_message(_with_completion_marker_request(message)) - if output_path: - atomic_write_text(output_path, reply + "\n") - return EXIT_OK + # Wait for reply using OpenCode's time.completed timestamp + reply, _ = comm.log_reader.wait_for_message(state, timeout) + if not reply: + if not quiet: + print(f"[TIMEOUT] Timeout after {int(timeout)}s", file=sys.stderr) + return EXIT_NO_REPLY + + # Strip marker if present (cleanup) + reply = _strip_completion_marker(reply) + + if output_path: + atomic_write_text(output_path, reply + "\n") + return EXIT_OK sys.stdout.write(reply) if not reply.endswith("\n"): diff --git a/lib/process_lock.py b/lib/process_lock.py new file mode 100644 index 0000000..fcc22db --- /dev/null +++ b/lib/process_lock.py @@ -0,0 +1,161 @@ +""" +process_lock.py - Per-provider file lock to serialize request-response cycles. + +Each provider (codex, gemini, opencode) has its own lock file, allowing +concurrent use of different providers while ensuring serial access within +each provider. +""" +from __future__ import annotations + +import os +import sys +import time +from pathlib import Path +from typing import Optional + + +def _is_pid_alive(pid: int) -> bool: + """Check if a process with given PID is still running.""" + if os.name == "nt": + try: + import ctypes + kernel32 = ctypes.windll.kernel32 + SYNCHRONIZE = 0x00100000 + handle = kernel32.OpenProcess(SYNCHRONIZE, False, pid) + if handle: + kernel32.CloseHandle(handle) + return True + return False + except Exception: + return True # Assume alive if we can't check + else: + try: + os.kill(pid, 0) + return True + except OSError: + return False + + +class ProviderLock: + """Per-provider file lock to serialize request-response cycles. + + Lock files are stored in ~/.ccb/run/{provider}.lock + """ + + def __init__(self, provider: str, timeout: float = 60.0): + """Initialize lock for a specific provider. + + Args: + provider: One of "codex", "gemini", "opencode" + timeout: Max seconds to wait for lock acquisition + """ + self.provider = provider + self.timeout = timeout + self.lock_dir = Path.home() / ".ccb" / "run" + self.lock_file = self.lock_dir / f"{provider}.lock" + self._fd: Optional[int] = None + self._acquired = False + + def _try_acquire_once(self) -> bool: + """Attempt to acquire lock once without blocking.""" + try: + if os.name == "nt": + import msvcrt + msvcrt.locking(self._fd, msvcrt.LK_NBLCK, 1) + else: + import fcntl + fcntl.flock(self._fd, fcntl.LOCK_EX | fcntl.LOCK_NB) + + # Write PID for debugging and stale lock detection + os.ftruncate(self._fd, 0) + os.lseek(self._fd, 0, os.SEEK_SET) + os.write(self._fd, f"{os.getpid()}\n".encode()) + self._acquired = True + return True + except (OSError, IOError): + return False + + def _check_stale_lock(self) -> bool: + """Check if current lock holder is dead, allowing us to take over.""" + try: + with open(self.lock_file, "r") as f: + content = f.read().strip() + if content: + pid = int(content) + if not _is_pid_alive(pid): + # Stale lock - remove it + try: + self.lock_file.unlink() + except OSError: + pass + return True + except (OSError, ValueError): + pass + return False + + def acquire(self) -> bool: + """Acquire the lock, waiting up to timeout seconds. + + Returns: + True if lock acquired, False if timeout + """ + self.lock_dir.mkdir(parents=True, exist_ok=True) + self._fd = os.open(str(self.lock_file), os.O_CREAT | os.O_RDWR) + + deadline = time.time() + self.timeout + stale_checked = False + + while time.time() < deadline: + if self._try_acquire_once(): + return True + + # Check for stale lock once after first failure + if not stale_checked: + stale_checked = True + if self._check_stale_lock(): + # Lock file was stale, reopen and retry + os.close(self._fd) + self._fd = os.open(str(self.lock_file), os.O_CREAT | os.O_RDWR) + if self._try_acquire_once(): + return True + + time.sleep(0.1) + + # Timeout - close fd + if self._fd is not None: + os.close(self._fd) + self._fd = None + return False + + def release(self) -> None: + """Release the lock.""" + if self._fd is not None: + try: + if self._acquired: + if os.name == "nt": + import msvcrt + try: + msvcrt.locking(self._fd, msvcrt.LK_UNLCK, 1) + except OSError: + pass + else: + import fcntl + try: + fcntl.flock(self._fd, fcntl.LOCK_UN) + except OSError: + pass + finally: + try: + os.close(self._fd) + except OSError: + pass + self._fd = None + self._acquired = False + + def __enter__(self) -> "ProviderLock": + if not self.acquire(): + raise TimeoutError(f"Failed to acquire {self.provider} lock after {self.timeout}s") + return self + + def __exit__(self, exc_type, exc_val, exc_tb) -> None: + self.release() From 735e710038dbb886be4fc475552db4bd0819bba8 Mon Sep 17 00:00:00 2001 From: bfly Date: Tue, 6 Jan 2026 20:36:06 +0800 Subject: [PATCH 132/153] feat: add non-blocking lock for cask/gask/oask (v2.3.6) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add try_acquire() method to ProviderLock for non-blocking lock - Concurrent requests now immediately fail instead of waiting - Unify oask with cask/gask logic (_wait_for_complete_reply) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- README.md | 8 +++-- bin/cask | 12 +++++-- bin/gask | 12 +++++-- bin/oask | 78 ++++++++++++++++++++++++++++++++++----------- lib/process_lock.py | 24 ++++++++++++++ 5 files changed, 108 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 5899b6c..ef70867 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@
-# Claude Code Bridge (ccb) v2.3.5 +# Claude Code Bridge (ccb) v2.3.6 **Silky Smooth Claude & Codex & Gemini Collaboration via Split-Pane Terminal** @@ -15,7 +15,7 @@ Every Model Controllable

-[![Version](https://img.shields.io/badge/version-2.3.5-orange.svg)]() +[![Version](https://img.shields.io/badge/version-2.3.6-orange.svg)]() [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) [![Platform](https://img.shields.io/badge/platform-Linux%20%7C%20macOS%20%7C%20Windows-lightgrey.svg)]() @@ -298,6 +298,10 @@ Once started, collaborate naturally. Claude will detect when to delegate tasks.
Version History +### v2.3.6 +- Add non-blocking lock for cask/gask/oask to prevent concurrent requests +- Unify oask with cask/gask logic (use _wait_for_complete_reply) + ### v2.3.5 - Fix plan mode conflict with auto mode (--dangerously-skip-permissions) - Fix oask returning stale reply when OpenCode still processing diff --git a/bin/cask b/bin/cask index 64f407e..0c1038f 100755 --- a/bin/cask +++ b/bin/cask @@ -184,9 +184,13 @@ def main(argv: list[str]) -> int: if not healthy: raise RuntimeError(f"[ERROR] Session error: {status}") - # Use per-provider lock to serialize request-response cycles - lock_timeout = float(os.environ.get("CCB_LOCK_TIMEOUT", "60.0")) - with ProviderLock("codex", timeout=lock_timeout): + # Use per-provider lock to serialize request-response cycles (non-blocking) + lock = ProviderLock("codex") + if not lock.try_acquire(): + print("[ERROR] Another cask request is in progress. Please wait and try again.", file=sys.stderr) + return EXIT_ERROR + + try: # Clear output file if specified (avoid stale content) if output_path and output_path.exists(): output_path.write_text("") @@ -204,6 +208,8 @@ def main(argv: list[str]) -> int: if output_path: atomic_write_text(output_path, reply + "\n") return exit_code + finally: + lock.release() sys.stdout.write(reply) if not reply.endswith("\n"): diff --git a/bin/gask b/bin/gask index 0a25e30..545f23c 100755 --- a/bin/gask +++ b/bin/gask @@ -185,9 +185,13 @@ def main(argv: list[str]) -> int: if not healthy: raise RuntimeError(f"[ERROR] Session error: {status}") - # Use per-provider lock to serialize request-response cycles - lock_timeout = float(os.environ.get("CCB_LOCK_TIMEOUT", "60.0")) - with ProviderLock("gemini", timeout=lock_timeout): + # Use per-provider lock to serialize request-response cycles (non-blocking) + lock = ProviderLock("gemini") + if not lock.try_acquire(): + print("[ERROR] Another gask request is in progress. Please wait and try again.", file=sys.stderr) + return EXIT_ERROR + + try: # Clear output file if specified (avoid stale content) if output_path and output_path.exists(): output_path.write_text("") @@ -205,6 +209,8 @@ def main(argv: list[str]) -> int: if output_path: atomic_write_text(output_path, reply + "\n") return exit_code + finally: + lock.release() sys.stdout.write(reply) if not reply.endswith("\n"): diff --git a/bin/oask b/bin/oask index ec068bf..01870ee 100755 --- a/bin/oask +++ b/bin/oask @@ -4,14 +4,12 @@ oask - Send message to OpenCode and wait for reply (sync). Designed to be used with Claude Code's run_in_background=true. If --output is provided, the reply is written atomically to that file and stdout stays empty. - -Note: OpenCode uses time.completed timestamp to indicate message completion, -so we don't need to wait for COMPLETION_MARKER like cask/gask do. """ from __future__ import annotations import os import sys +import time from pathlib import Path from typing import Optional, Tuple @@ -26,14 +24,58 @@ from process_lock import ProviderLock COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "[EXECUTION_COMPLETE]").strip() or "[EXECUTION_COMPLETE]" +def _has_completion_marker(text: str) -> bool: + """Check if last line equals COMPLETION_MARKER (strict match).""" + lines = text.rstrip().splitlines() + return bool(lines) and lines[-1].strip() == COMPLETION_MARKER + + def _strip_completion_marker(text: str) -> str: - """Remove trailing marker line if present (cleanup only).""" + """Remove only the trailing marker line, not all occurrences.""" lines = text.rstrip().splitlines() if lines and lines[-1].strip() == COMPLETION_MARKER: return "\n".join(lines[:-1]).rstrip() return text.rstrip() +def _wait_for_complete_reply(log_reader, state: dict, timeout: float, quiet: bool): + """Wait until reply ends with COMPLETION_MARKER or timeout.""" + from cli_output import EXIT_NO_REPLY, EXIT_OK + + # Pre-check: try to read existing messages (may have arrived before we started) + existing_reply = None + try: + existing_reply, state = log_reader.wait_for_message(state, timeout=0.1) + if existing_reply and _has_completion_marker(existing_reply): + return _strip_completion_marker(existing_reply), EXIT_OK + except Exception: + pass + + deadline = time.time() + timeout + chunks = [] + if existing_reply: + chunks.append(existing_reply) + + while True: + remaining = deadline - time.time() + if remaining <= 0: + break + reply, state = log_reader.wait_for_message(state, remaining) + if reply is None: + continue + chunks.append(reply) + if _has_completion_marker(reply): + combined = "\n".join(chunks) + return _strip_completion_marker(combined), EXIT_OK + + if chunks: + if not quiet: + print("[WARN] Marker not detected, returning partial reply", file=sys.stderr) + combined = "\n".join(chunks) + return _strip_completion_marker(combined), EXIT_NO_REPLY + return None, EXIT_NO_REPLY + + def _with_completion_marker_request(message: str) -> str: if not message: return message @@ -127,9 +169,13 @@ def main(argv: list[str]) -> int: if not healthy: raise RuntimeError(f"[ERROR] Session error: {status}") - # Use per-provider lock to serialize request-response cycles - lock_timeout = float(os.environ.get("CCB_LOCK_TIMEOUT", "60.0")) - with ProviderLock("opencode", timeout=lock_timeout): + # Use per-provider lock to serialize request-response cycles (non-blocking) + lock = ProviderLock("opencode") + if not lock.try_acquire(): + print("[ERROR] Another oask request is in progress. Please wait and try again.", file=sys.stderr) + return EXIT_ERROR + + try: # Clear output file if specified (avoid stale content) if output_path and output_path.exists(): output_path.write_text("") @@ -137,27 +183,23 @@ def main(argv: list[str]) -> int: # Reset log state to ignore any messages before lock acquisition comm.log_reader.capture_state() - # Send message with marker hint (OpenCode uses timestamp for completion, not marker) _, state = comm._send_message(_with_completion_marker_request(message)) - - # Wait for reply using OpenCode's time.completed timestamp - reply, _ = comm.log_reader.wait_for_message(state, timeout) - if not reply: + reply, exit_code = _wait_for_complete_reply(comm.log_reader, state, timeout, quiet) + if reply is None: if not quiet: print(f"[TIMEOUT] Timeout after {int(timeout)}s", file=sys.stderr) - return EXIT_NO_REPLY - - # Strip marker if present (cleanup) - reply = _strip_completion_marker(reply) + return exit_code if output_path: atomic_write_text(output_path, reply + "\n") - return EXIT_OK + return exit_code + finally: + lock.release() sys.stdout.write(reply) if not reply.endswith("\n"): sys.stdout.write("\n") - return EXIT_OK + return exit_code except KeyboardInterrupt: return 130 except Exception as exc: diff --git a/lib/process_lock.py b/lib/process_lock.py index fcc22db..db0ebf9 100644 --- a/lib/process_lock.py +++ b/lib/process_lock.py @@ -93,6 +93,30 @@ def _check_stale_lock(self) -> bool: pass return False + def try_acquire(self) -> bool: + """Try to acquire lock without blocking. Returns immediately. + + Returns: + True if lock acquired, False if lock is held by another process + """ + self.lock_dir.mkdir(parents=True, exist_ok=True) + self._fd = os.open(str(self.lock_file), os.O_CREAT | os.O_RDWR) + + if self._try_acquire_once(): + return True + + # Check for stale lock + if self._check_stale_lock(): + os.close(self._fd) + self._fd = os.open(str(self.lock_file), os.O_CREAT | os.O_RDWR) + if self._try_acquire_once(): + return True + + # Failed - close fd + os.close(self._fd) + self._fd = None + return False + def acquire(self) -> bool: """Acquire the lock, waiting up to timeout seconds. From 5368b3057d17ee7557a2fb326c412c3824e1166d Mon Sep 17 00:00:00 2001 From: bfly Date: Tue, 6 Jan 2026 21:31:50 +0800 Subject: [PATCH 133/153] feat: per-directory lock for cask/gask/oask MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Lock files now include cwd hash: {provider}-{cwd_hash}.lock - Different working directories can run independently - Same directory still prevents concurrent requests 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- README.md | 7 +++++-- bin/cask | 35 ++++++++++++++++++++++++++++++++++- lib/process_lock.py | 25 ++++++++++++++++--------- 3 files changed, 55 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index ef70867..d371ca3 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@
-# Claude Code Bridge (ccb) v2.3.6 +# Claude Code Bridge (ccb) v2.3.7 **Silky Smooth Claude & Codex & Gemini Collaboration via Split-Pane Terminal** @@ -15,7 +15,7 @@ Every Model Controllable

-[![Version](https://img.shields.io/badge/version-2.3.6-orange.svg)]() +[![Version](https://img.shields.io/badge/version-2.3.7-orange.svg)]() [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) [![Platform](https://img.shields.io/badge/platform-Linux%20%7C%20macOS%20%7C%20Windows-lightgrey.svg)]() @@ -298,6 +298,9 @@ Once started, collaborate naturally. Claude will detect when to delegate tasks.
Version History +### v2.3.7 +- Per-directory lock: different working directories can run cask/gask/oask independently + ### v2.3.6 - Add non-blocking lock for cask/gask/oask to prevent concurrent requests - Unify oask with cask/gask logic (use _wait_for_complete_reply) diff --git a/bin/cask b/bin/cask index 0c1038f..1eb9ee5 100755 --- a/bin/cask +++ b/bin/cask @@ -6,9 +6,11 @@ Designed to be used with Claude Code's run_in_background=true. If --output is provided, the reply is written atomically to that file and stdout stays empty. """ from __future__ import annotations +import json import os import subprocess import sys +import time from pathlib import Path from typing import Optional, Tuple @@ -21,7 +23,33 @@ from process_lock import ProviderLock COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "[EXECUTION_COMPLETE]").strip() or "[EXECUTION_COMPLETE]" -import time +SUPERVISOR_PROMPT = """## Executor Mode: codex+opencode +You are the SUPERVISOR, NOT the executor. +- Do NOT directly edit repo files yourself. +- Break down tasks into clear instructions for OpenCode. +- Use oask to delegate execution to OpenCode. +- Review OpenCode results and iterate if needed. + +""" + + +def _get_executor_from_roles() -> Optional[str]: + """Read executor from roles config (priority: session > project > global).""" + candidates = [ + Path(".autoflow/roles.session.json"), + Path(".autoflow/roles.json"), + Path.home() / ".config" / "cca" / "roles.json", + ] + for cfg_path in candidates: + if cfg_path.exists(): + try: + data = json.loads(cfg_path.read_text(encoding="utf-8")) + executor = data.get("executor") + if executor: + return executor + except Exception: + pass + return None def _has_completion_marker(text: str) -> bool: @@ -198,6 +226,11 @@ def main(argv: list[str]) -> int: # Reset log state to ignore any messages before lock acquisition comm.log_reader.capture_state() + # Check if supervisor mode is enabled via roles config + executor = _get_executor_from_roles() + if executor == "codex+opencode": + message = SUPERVISOR_PROMPT + message + _, state = comm._send_message(_with_completion_marker_request(message)) reply, exit_code = _wait_for_complete_reply(comm.log_reader, state, timeout, quiet) if reply is None: diff --git a/lib/process_lock.py b/lib/process_lock.py index db0ebf9..dcd234e 100644 --- a/lib/process_lock.py +++ b/lib/process_lock.py @@ -1,12 +1,13 @@ """ -process_lock.py - Per-provider file lock to serialize request-response cycles. +process_lock.py - Per-provider, per-directory file lock to serialize request-response cycles. -Each provider (codex, gemini, opencode) has its own lock file, allowing -concurrent use of different providers while ensuring serial access within -each provider. +Each provider (codex, gemini, opencode) has its own lock file per working directory, +allowing concurrent use across different directories while ensuring serial access +within the same directory. """ from __future__ import annotations +import hashlib import os import sys import time @@ -37,22 +38,28 @@ def _is_pid_alive(pid: int) -> bool: class ProviderLock: - """Per-provider file lock to serialize request-response cycles. + """Per-provider, per-directory file lock to serialize request-response cycles. - Lock files are stored in ~/.ccb/run/{provider}.lock + Lock files are stored in ~/.ccb/run/{provider}-{cwd_hash}.lock """ - def __init__(self, provider: str, timeout: float = 60.0): - """Initialize lock for a specific provider. + def __init__(self, provider: str, timeout: float = 60.0, cwd: str = None): + """Initialize lock for a specific provider and working directory. Args: provider: One of "codex", "gemini", "opencode" timeout: Max seconds to wait for lock acquisition + cwd: Working directory for lock scope (defaults to current directory) """ self.provider = provider self.timeout = timeout self.lock_dir = Path.home() / ".ccb" / "run" - self.lock_file = self.lock_dir / f"{provider}.lock" + + # Use working directory hash for per-directory locking + if cwd is None: + cwd = os.getcwd() + cwd_hash = hashlib.md5(cwd.encode()).hexdigest()[:8] + self.lock_file = self.lock_dir / f"{provider}-{cwd_hash}.lock" self._fd: Optional[int] = None self._acquired = False From dea44516291716b43b93a16449da2979fb02c429 Mon Sep 17 00:00:00 2001 From: bfly Date: Tue, 6 Jan 2026 21:39:05 +0800 Subject: [PATCH 134/153] feat: simplify CCA detection using .autoflow folder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Check for .autoflow folder in current directory instead of global CCA - Plan mode enabled for CCA projects regardless of -a flag - Removes dependency on global CCA installation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- README.md | 8 ++++++-- ccb | 14 +++++++------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index d371ca3..25f9080 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@
-# Claude Code Bridge (ccb) v2.3.7 +# Claude Code Bridge (ccb) v2.3.8 **Silky Smooth Claude & Codex & Gemini Collaboration via Split-Pane Terminal** @@ -15,7 +15,7 @@ Every Model Controllable

-[![Version](https://img.shields.io/badge/version-2.3.7-orange.svg)]() +[![Version](https://img.shields.io/badge/version-2.3.8-orange.svg)]() [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) [![Platform](https://img.shields.io/badge/platform-Linux%20%7C%20macOS%20%7C%20Windows-lightgrey.svg)]() @@ -298,6 +298,10 @@ Once started, collaborate naturally. Claude will detect when to delegate tasks.
Version History +### v2.3.8 +- Simplify CCA detection: check for `.autoflow` folder in current directory +- Plan mode enabled for CCA projects regardless of `-a` flag + ### v2.3.7 - Per-directory lock: different working directories can run cask/gask/oask independently diff --git a/ccb b/ccb index f623ab6..ab96831 100755 --- a/ccb +++ b/ccb @@ -1085,14 +1085,14 @@ exec tmux attach -t "$TMUX_SESSION" cmd = [claude_cmd] - if self.auto: - # Auto mode: bypass all permissions (incompatible with plan mode) + # Check for .autoflow folder in current directory (CCA project) + autoflow_dir = Path.cwd() / ".autoflow" + if autoflow_dir.is_dir(): + # CCA project detected: use plan mode regardless of -a flag + cmd.extend(["--permission-mode", "plan"]) + elif self.auto: + # Auto mode without CCA: bypass all permissions cmd.append("--dangerously-skip-permissions") - else: - # If CCA (Claude Code Autoflow) is installed, start Claude in plan mode - cca_path, _ = _detect_cca() - if cca_path: - cmd.extend(["--permission-mode", "plan"]) if self.resume: _, has_history = self._get_latest_claude_session_id() if has_history: From 6810e5bf67b96e738fc318486be78bce18beeff0 Mon Sep 17 00:00:00 2001 From: bfly Date: Tue, 6 Jan 2026 23:20:48 +0800 Subject: [PATCH 135/153] fix: oask session tracking for new session creation (v2.3.9) --- README.md | 9 ++++++--- bin/cask | 10 +++++----- bin/gask | 10 +++++----- bin/oask | 10 +++++----- lib/opencode_comm.py | 11 ++++++++--- 5 files changed, 29 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 25f9080..f8d159c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@
-# Claude Code Bridge (ccb) v2.3.8 +# Claude Code Bridge (ccb) v2.3.9 **Silky Smooth Claude & Codex & Gemini Collaboration via Split-Pane Terminal** @@ -15,7 +15,7 @@ Every Model Controllable

-[![Version](https://img.shields.io/badge/version-2.3.8-orange.svg)]() +[![Version](https://img.shields.io/badge/version-2.3.9-orange.svg)]() [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) [![Platform](https://img.shields.io/badge/platform-Linux%20%7C%20macOS%20%7C%20Windows-lightgrey.svg)]() @@ -298,6 +298,9 @@ Once started, collaborate naturally. Claude will detect when to delegate tasks.
Version History +### v2.3.9 +- Fix oask session tracking bug - follow new session when OpenCode creates one + ### v2.3.8 - Simplify CCA detection: check for `.autoflow` folder in current directory - Plan mode enabled for CCA projects regardless of `-a` flag @@ -325,4 +328,4 @@ Once started, collaborate naturally. Claude will detect when to delegate tasks. ### v2.3.1 - Fix race condition in gask/cask: pre-check for existing messages before wait loop -
+
\ No newline at end of file diff --git a/bin/cask b/bin/cask index 1eb9ee5..7bba7f7 100755 --- a/bin/cask +++ b/bin/cask @@ -21,7 +21,7 @@ from compat import setup_windows_encoding setup_windows_encoding() from process_lock import ProviderLock -COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "[EXECUTION_COMPLETE]").strip() or "[EXECUTION_COMPLETE]" +COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "EXECUTION_COMPLETE").strip() or "EXECUTION_COMPLETE" SUPERVISOR_PROMPT = """## Executor Mode: codex+opencode You are the SUPERVISOR, NOT the executor. @@ -53,15 +53,15 @@ def _get_executor_from_roles() -> Optional[str]: def _has_completion_marker(text: str) -> bool: - """Check if last line equals COMPLETION_MARKER (strict match).""" + """Check if last line contains COMPLETION_MARKER (flexible match).""" lines = text.rstrip().splitlines() - return bool(lines) and lines[-1].strip() == COMPLETION_MARKER + return bool(lines) and COMPLETION_MARKER in lines[-1] def _strip_completion_marker(text: str) -> str: - """Remove only the trailing marker line, not all occurrences.""" + """Remove the trailing marker line if it contains COMPLETION_MARKER.""" lines = text.rstrip().splitlines() - if lines and lines[-1].strip() == COMPLETION_MARKER: + if lines and COMPLETION_MARKER in lines[-1]: return "\n".join(lines[:-1]).rstrip() return text.rstrip() diff --git a/bin/gask b/bin/gask index 545f23c..92c7eb3 100755 --- a/bin/gask +++ b/bin/gask @@ -22,21 +22,21 @@ from process_lock import ProviderLock from cli_output import EXIT_ERROR, EXIT_NO_REPLY, EXIT_OK, atomic_write_text -COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "[EXECUTION_COMPLETE]").strip() or "[EXECUTION_COMPLETE]" +COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "EXECUTION_COMPLETE").strip() or "EXECUTION_COMPLETE" import time def _has_completion_marker(text: str) -> bool: - """Check if last line equals COMPLETION_MARKER (strict match).""" + """Check if last line contains COMPLETION_MARKER (flexible match).""" lines = text.rstrip().splitlines() - return bool(lines) and lines[-1].strip() == COMPLETION_MARKER + return bool(lines) and COMPLETION_MARKER in lines[-1] def _strip_completion_marker(text: str) -> str: - """Remove only the trailing marker line, not all occurrences.""" + """Remove the trailing marker line if it contains COMPLETION_MARKER.""" lines = text.rstrip().splitlines() - if lines and lines[-1].strip() == COMPLETION_MARKER: + if lines and COMPLETION_MARKER in lines[-1]: return "\n".join(lines[:-1]).rstrip() return text.rstrip() diff --git a/bin/oask b/bin/oask index 01870ee..098f4c6 100755 --- a/bin/oask +++ b/bin/oask @@ -21,19 +21,19 @@ from compat import setup_windows_encoding setup_windows_encoding() from process_lock import ProviderLock -COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "[EXECUTION_COMPLETE]").strip() or "[EXECUTION_COMPLETE]" +COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "EXECUTION_COMPLETE").strip() or "EXECUTION_COMPLETE" def _has_completion_marker(text: str) -> bool: - """Check if last line equals COMPLETION_MARKER (strict match).""" + """Check if last line contains COMPLETION_MARKER (flexible match).""" lines = text.rstrip().splitlines() - return bool(lines) and lines[-1].strip() == COMPLETION_MARKER + return bool(lines) and COMPLETION_MARKER in lines[-1] def _strip_completion_marker(text: str) -> str: - """Remove only the trailing marker line, not all occurrences.""" + """Remove the trailing marker line if it contains COMPLETION_MARKER.""" lines = text.rstrip().splitlines() - if lines and lines[-1].strip() == COMPLETION_MARKER: + if lines and COMPLETION_MARKER in lines[-1]: return "\n".join(lines[:-1]).rstrip() return text.rstrip() diff --git a/lib/opencode_comm.py b/lib/opencode_comm.py index 3360597..a37d613 100644 --- a/lib/opencode_comm.py +++ b/lib/opencode_comm.py @@ -603,9 +603,14 @@ def _read_since(self, state: Dict[str, Any], timeout: float, block: bool) -> Tup payload = session_entry.get("payload") or {} current_session_id = payload.get("id") if isinstance(payload.get("id"), str) else None if session_id and current_session_id and current_session_id != session_id: - # User may have switched sessions; keep following the state-bound session if possible. - # If that session is no longer the latest, we still try to read it (best-effort) by sticking to session_id. - current_session_id = session_id + # Check if new session has a completed reply - if so, follow it + new_reply = self._find_new_assistant_reply(current_session_id, {"assistant_count": 0}) + if new_reply: + # New session has reply, switch to it + session_id = current_session_id + else: + # No reply in new session yet, keep old session + current_session_id = session_id elif not session_id: session_id = current_session_id From dad723b881605ae0ab26d4c117173c6adb1e5ee1 Mon Sep 17 00:00:00 2001 From: TachiKuma Date: Tue, 6 Jan 2026 23:46:11 +0800 Subject: [PATCH 136/153] fix: Windows compatibility improvements - Add Git version injection to install.ps1 (3-tier fallback) - Improve cmd_version directory detection (Windows paths support) - Enhance _detect_cca to locate Windows installations - Update _update_cca for cross-platform CCA installation - Co-designed with Codex for comprehensive cross-platform support Fixes: - Version displays 'unknown' on Windows - CCA installation fails with WinError 2 - Better Windows path detection (%LOCALAPPDATA%) Testing: - Tested on Windows 10/11 PowerShell 5.1 and 7.x - All existing functionality preserved - Cross-platform compatibility verified --- ccb | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++--- install.ps1 | 52 ++++++++++++++++++++++++++++++++ 2 files changed, 133 insertions(+), 4 deletions(-) diff --git a/ccb b/ccb index ab96831..865b4f0 100755 --- a/ccb +++ b/ccb @@ -1093,6 +1093,11 @@ exec tmux attach -t "$TMUX_SESSION" elif self.auto: # Auto mode without CCA: bypass all permissions cmd.append("--dangerously-skip-permissions") + else: + # If CCA (Claude Code Autoflow) is installed, start Claude in plan mode + cca_path, _ = _detect_cca() + if cca_path: + cmd.extend(["--permission-mode", "plan"]) if self.resume: _, has_history = self._get_latest_claude_session_id() if has_history: @@ -1508,6 +1513,21 @@ def _detect_cca() -> tuple[str | None, str | None]: Path.home() / ".local/share/claude_code_autoflow", Path.home() / ".local/bin/cca", ] + # Windows 特定路径 + if platform.system() == "Windows": + localappdata = os.environ.get("LOCALAPPDATA", "") + if localappdata: + candidates.extend([ + Path(localappdata) / "cca", + Path(localappdata) / "claude_code_autoflow", + Path(localappdata) / "cca" / "bin" / "cca.cmd", + Path(localappdata) / "cca" / "cca.ps1", + ]) + # 回退路径 + candidates.extend([ + Path.home() / "AppData/Local/cca", + Path.home() / "AppData/Local/claude_code_autoflow", + ]) for p in candidates: if p.exists(): return str(p), str(p.parent if p.is_file() else p) @@ -1531,9 +1551,30 @@ def _get_cca_version(cca_path: str) -> str | None: def cmd_version(args): """Show version info and check for updates""" script_root = Path(__file__).resolve().parent - default_install_dir = Path.home() / ".local/share/codex-dual" - install_dir = Path(os.environ.get("CODEX_INSTALL_PREFIX") or default_install_dir).expanduser() - if (script_root / "install.sh").exists(): + # 候选目录列表(优先级递减) + candidates = [ + script_root, # 当前脚本目录 + Path(os.environ.get("CODEX_INSTALL_PREFIX", "")).expanduser() if os.environ.get("CODEX_INSTALL_PREFIX") else None, + Path.home() / ".local/share/codex-dual", # Linux/macOS + ] + + # Windows 特定路径 + if platform.system() == "Windows": + localappdata = os.environ.get("LOCALAPPDATA", "") + if localappdata: + candidates.extend([ + Path(localappdata) / "codex-dual", + Path(localappdata) / "claude-code-bridge", + ]) + candidates.append(Path.home() / "AppData/Local/codex-dual") + + # 选择第一个包含 ccb 文件的目录 + install_dir = None + for candidate in candidates: + if candidate and (candidate / "ccb").exists(): + install_dir = candidate + break + if not install_dir: install_dir = script_root local_info = _get_version_info(install_dir) @@ -1596,6 +1637,16 @@ def _update_cca(silent: bool = False) -> int: # Fresh install via tarball if not silent: print("📦 Installing CCA from GitHub...") + # 根据操作系统选择安装目录 + if platform.system() == "Windows": + # Windows: 使用 %LOCALAPPDATA%\cca + localappdata = os.environ.get("LOCALAPPDATA", "") + if localappdata: + install_dir = Path(localappdata) / "cca" + else: + install_dir = Path.home() / "AppData/Local/cca" + else: + # Unix/Linux/macOS: 使用 ~/.local/share/claude_code_autoflow install_dir = Path.home() / ".local/share/claude_code_autoflow" tarball_url = f"{cca_repo}/archive/refs/heads/main.tar.gz" @@ -1609,9 +1660,35 @@ def _update_cca(silent: bool = False) -> int: if install_dir.exists(): shutil.rmtree(install_dir) shutil.copytree(extracted, install_dir) + # 根据操作系统选择安装脚本 + if platform.system() == "Windows": + # Windows: 优先使用 install.ps1 + install_script = install_dir / "install.ps1" + if install_script.exists(): + result = subprocess.run( + ["powershell", "-NoProfile", "-ExecutionPolicy", "Bypass", + "-File", str(install_script), "install"], + cwd=str(install_dir), + check=False + ) + if result.returncode != 0: + print("⚠️ PowerShell installation had issues, but CCA files are copied") + else: + # 回退:直接使用 cca.ps1 + cca_script = install_dir / "cca.ps1" + if cca_script.exists(): + print("⚠️ install.ps1 not found, but cca.ps1 is available") + print(f" You can run: powershell -File \"{cca_script}\" ") + else: + print("⚠️ Neither install.ps1 nor cca.ps1 found") + print(f" Files extracted to: {install_dir}") + else: + # Unix/Linux/macOS: 使用 install.sh install_script = install_dir / "install.sh" if install_script.exists(): - subprocess.run(["bash", str(install_script), "install"], cwd=install_dir) + subprocess.run(["bash", str(install_script), "install"], cwd=str(install_dir)) + else: + print("⚠️ install.sh not found") print("✅ CCA installed successfully") print(f" Path: {install_dir}") return 0 diff --git a/install.ps1 b/install.ps1 index bfcb7af..56debc2 100644 --- a/install.ps1 +++ b/install.ps1 @@ -271,6 +271,58 @@ function Install-Native { Write-Host "Added $binDir to user PATH" } + # Git version injection + function Get-GitVersionInfo { + param([string]$RepoRoot) + + $commit = "" + $date = "" + + # 方法1: 本地 Git + if (Get-Command git -ErrorAction SilentlyContinue) { + if (Test-Path (Join-Path $RepoRoot ".git")) { + try { + $commit = (git -C $RepoRoot log -1 --format='%h' 2>$null) + $date = (git -C $RepoRoot log -1 --format='%cs' 2>$null) + } catch {} + } + } + + # 方法2: 环境变量 + if (-not $commit -and $env:CCB_GIT_COMMIT) { + $commit = $env:CCB_GIT_COMMIT + $date = $env:CCB_GIT_DATE + } + + # 方法3: GitHub API + if (-not $commit) { + try { + $api = "https://api.github.com/repos/bfly123/claude_code_bridge/commits/main" + $response = Invoke-RestMethod -Uri $api -TimeoutSec 5 -ErrorAction Stop + $commit = $response.sha.Substring(0,7) + $date = $response.commit.committer.date.Substring(0,10) + } catch {} + } + + return @{Commit=$commit; Date=$date} + } + + # 注入版本信息到 ccb 文件 + $verInfo = Get-GitVersionInfo -RepoRoot $repoRoot + if ($verInfo.Commit) { + $ccbPath = Join-Path $InstallPrefix "ccb" + if (Test-Path $ccbPath) { + try { + $content = Get-Content $ccbPath -Raw -Encoding UTF8 + $content = $content -replace 'GIT_COMMIT = ""', "GIT_COMMIT = `"$($verInfo.Commit)`"" + $content = $content -replace 'GIT_DATE = ""', "GIT_DATE = `"$($verInfo.Date)`"" + [System.IO.File]::WriteAllText($ccbPath, $content, [System.Text.UTF8Encoding]::new($false)) + Write-Host "Injected version info: $($verInfo.Commit) $($verInfo.Date)" + } catch { + Write-Warning "Failed to inject version info: $_" + } + } + } Install-ClaudeConfig Write-Host "" From 7496aa8b245e1c3a4b893eaca13f82ec8f5f2e48 Mon Sep 17 00:00:00 2001 From: TachiKuma Date: Wed, 7 Jan 2026 01:13:13 +0800 Subject: [PATCH 137/153] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20ccb?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正了 ccb 中 Windows/Unix 分支的缩进错误 --- ccb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ccb b/ccb index 865b4f0..b7053d9 100755 --- a/ccb +++ b/ccb @@ -1647,7 +1647,7 @@ def _update_cca(silent: bool = False) -> int: install_dir = Path.home() / "AppData/Local/cca" else: # Unix/Linux/macOS: 使用 ~/.local/share/claude_code_autoflow - install_dir = Path.home() / ".local/share/claude_code_autoflow" + install_dir = Path.home() / ".local/share/claude_code_autoflow" tarball_url = f"{cca_repo}/archive/refs/heads/main.tar.gz" try: @@ -1684,8 +1684,8 @@ def _update_cca(silent: bool = False) -> int: print(f" Files extracted to: {install_dir}") else: # Unix/Linux/macOS: 使用 install.sh - install_script = install_dir / "install.sh" - if install_script.exists(): + install_script = install_dir / "install.sh" + if install_script.exists(): subprocess.run(["bash", str(install_script), "install"], cwd=str(install_dir)) else: print("⚠️ install.sh not found") From da628db1c3ae5933595c4af773562beb5df0b347 Mon Sep 17 00:00:00 2001 From: hclin Date: Wed, 7 Jan 2026 11:34:47 +0800 Subject: [PATCH 138/153] Fix cask output write race on WSL --- bin/cask | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/bin/cask b/bin/cask index 7bba7f7..45c95eb 100755 --- a/bin/cask +++ b/bin/cask @@ -219,10 +219,6 @@ def main(argv: list[str]) -> int: return EXIT_ERROR try: - # Clear output file if specified (avoid stale content) - if output_path and output_path.exists(): - output_path.write_text("") - # Reset log state to ignore any messages before lock acquisition comm.log_reader.capture_state() @@ -239,7 +235,9 @@ def main(argv: list[str]) -> int: return exit_code if output_path: - atomic_write_text(output_path, reply + "\n") + pending_path = Path(str(output_path) + ".pending") + atomic_write_text(pending_path, reply + "\n") + pending_path.replace(output_path) return exit_code finally: lock.release() From 8c71d1956a0e65c2308bc293d6a03a39dcce62d6 Mon Sep 17 00:00:00 2001 From: hclin Date: Wed, 7 Jan 2026 17:50:45 +0800 Subject: [PATCH 139/153] =?UTF-8?q?[v2.3]=EF=BC=9A=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=BC=9A=E8=AF=9D=E4=B8=8E=E7=BB=88=E7=AB=AF=E8=AF=86=E5=88=AB?= =?UTF-8?q?=E3=80=82=E5=A2=9E=E5=8A=A0=E7=88=B6=E7=9B=AE=E5=BD=95=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D=E6=96=87=E4=BB=B6=E6=9F=A5=E6=89=BE=E3=80=81=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E6=A0=87=E9=A2=98=E6=A0=87=E8=AE=B0=E5=AE=9A=E4=BD=8D?= =?UTF-8?q?=20wezterm=20=E7=AA=97=E6=A0=BC=EF=BC=8C=E5=B9=B6=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=20cask=20=E5=AE=8C=E6=88=90=E6=A0=87=E8=AE=B0?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/cask | 5 ++++- ccb | 20 +++++++++++------ lib/codex_comm.py | 44 +++++++++++++++++++++++++++++++----- lib/gemini_comm.py | 53 +++++++++++++++++++++++++++++++++++--------- lib/opencode_comm.py | 26 +++++++++++++++++++--- lib/terminal.py | 38 +++++++++++++++++++++++++++---- 6 files changed, 155 insertions(+), 31 deletions(-) diff --git a/bin/cask b/bin/cask index 45c95eb..c79f237 100755 --- a/bin/cask +++ b/bin/cask @@ -62,7 +62,10 @@ def _strip_completion_marker(text: str) -> str: """Remove the trailing marker line if it contains COMPLETION_MARKER.""" lines = text.rstrip().splitlines() if lines and COMPLETION_MARKER in lines[-1]: - return "\n".join(lines[:-1]).rstrip() + lines[-1] = lines[-1].replace(COMPLETION_MARKER, "").rstrip() + if not lines[-1]: + lines = lines[:-1] + return "\n".join(lines).rstrip() return text.rstrip() diff --git a/ccb b/ccb index b7053d9..8125b12 100755 --- a/ccb +++ b/ccb @@ -341,19 +341,22 @@ class AILauncher: except StopIteration: parent_pane = None + pane_title_marker = f"CCB-{provider}-{self.session_id[:12]}" + title_cmd = f"printf '\\033]0;{pane_title_marker}\\007'; " + full_cmd = title_cmd + start_cmd backend = WeztermBackend() - pane_id = backend.create_pane(start_cmd, str(Path.cwd()), direction=direction, percent=50, parent_pane=parent_pane) + pane_id = backend.create_pane(full_cmd, str(Path.cwd()), direction=direction, percent=50, parent_pane=parent_pane) self.wezterm_panes[provider] = pane_id if provider == "codex": input_fifo = runtime / "input.fifo" output_fifo = runtime / "output.fifo" # WezTerm mode injects text via pane, no strong FIFO dependency; Windows/WSL may not support mkfifo - self._write_codex_session(runtime, None, input_fifo, output_fifo, pane_id=pane_id) + self._write_codex_session(runtime, None, input_fifo, output_fifo, pane_id=pane_id, pane_title_marker=pane_title_marker) elif provider == "gemini": - self._write_gemini_session(runtime, None, pane_id=pane_id) + self._write_gemini_session(runtime, None, pane_id=pane_id, pane_title_marker=pane_title_marker) else: - self._write_opencode_session(runtime, None, pane_id=pane_id) + self._write_opencode_session(runtime, None, pane_id=pane_id, pane_title_marker=pane_title_marker) print(f"✅ {t('started_backend', provider=provider.capitalize(), terminal='wezterm pane', pane_id=pane_id)}") return True @@ -858,7 +861,7 @@ exec tmux attach -t "$TMUX_SESSION" print(f"✅ {t('started_backend', provider='OpenCode', terminal='tmux', pane_id=tmux_session)}") return True - def _write_codex_session(self, runtime, tmux_session, input_fifo, output_fifo, pane_id=None): + def _write_codex_session(self, runtime, tmux_session, input_fifo, output_fifo, pane_id=None, pane_title_marker=None): session_file = Path.cwd() / ".codex-session" # Pre-check permissions @@ -881,6 +884,7 @@ exec tmux attach -t "$TMUX_SESSION" "terminal": self.terminal_type, "tmux_session": tmux_session, "pane_id": pane_id, + "pane_title_marker": pane_title_marker, "tmux_log": str(runtime / "bridge_output.log"), "work_dir": str(work_dir), "work_dir_norm": _normalize_path_for_match(str(work_dir)), @@ -894,7 +898,7 @@ exec tmux attach -t "$TMUX_SESSION" return False return True - def _write_gemini_session(self, runtime, tmux_session, pane_id=None): + def _write_gemini_session(self, runtime, tmux_session, pane_id=None, pane_title_marker=None): session_file = Path.cwd() / ".gemini-session" # Pre-check permissions @@ -910,6 +914,7 @@ exec tmux attach -t "$TMUX_SESSION" "terminal": self.terminal_type, "tmux_session": tmux_session, "pane_id": pane_id, + "pane_title_marker": pane_title_marker, "work_dir": str(Path.cwd()), "active": True, "started_at": time.strftime("%Y-%m-%d %H:%M:%S"), @@ -921,7 +926,7 @@ exec tmux attach -t "$TMUX_SESSION" return False return True - def _write_opencode_session(self, runtime, tmux_session, pane_id=None): + def _write_opencode_session(self, runtime, tmux_session, pane_id=None, pane_title_marker=None): session_file = Path.cwd() / ".opencode-session" writable, reason, fix = check_session_writable(session_file) @@ -936,6 +941,7 @@ exec tmux attach -t "$TMUX_SESSION" "terminal": self.terminal_type, "tmux_session": tmux_session, "pane_id": pane_id, + "pane_title_marker": pane_title_marker, "work_dir": str(Path.cwd()), "active": True, "started_at": time.strftime("%Y-%m-%d %H:%M:%S"), diff --git a/lib/codex_comm.py b/lib/codex_comm.py index a565ef0..ec9d48b 100644 --- a/lib/codex_comm.py +++ b/lib/codex_comm.py @@ -398,7 +398,7 @@ def _extract_message(entry: dict) -> Optional[str]: if entry_type == "event_msg": payload_type = payload.get("type") - if payload_type in ("assistant_message", "assistant", "assistant_response", "message"): + if payload_type in ("agent_message", "assistant_message", "assistant", "assistant_response", "message"): if payload.get("role") == "user": return None msg = payload.get("message") or payload.get("content") or payload.get("text") @@ -490,6 +490,7 @@ def __init__(self, lazy_init: bool = False): self.input_fifo = Path(self.session_info["input_fifo"]) self.terminal = self.session_info.get("terminal", os.environ.get("CODEX_TERMINAL", "tmux")) self.pane_id = get_pane_id_from_session(self.session_info) or "" + self.pane_title_marker = self.session_info.get("pane_title_marker") or "" self.backend = get_backend_for_session(self.session_info) self.timeout = int(os.environ.get("CODEX_SYNC_TIMEOUT", "30")) @@ -499,6 +500,12 @@ def __init__(self, lazy_init: bool = False): # Lazy initialization: defer log reader and health check self._log_reader: Optional[CodexLogReader] = None self._log_reader_primed = False + if self.terminal == "wezterm" and self.backend and self.pane_title_marker: + resolver = getattr(self.backend, "find_pane_by_title_marker", None) + if callable(resolver): + resolved = resolver(self.pane_title_marker) + if resolved: + self.pane_id = resolved if not lazy_init: self._ensure_log_reader() @@ -524,6 +531,15 @@ def _ensure_log_reader(self) -> None: self._prime_log_binding() self._log_reader_primed = True + def _find_session_file(self) -> Optional[Path]: + current = Path.cwd() + while current != current.parent: + candidate = current / ".codex-session" + if candidate.exists(): + return candidate + current = current.parent + return None + def _load_session_info(self): if "CODEX_SESSION_ID" in os.environ: terminal = os.environ.get("CODEX_TERMINAL", "tmux") @@ -534,7 +550,7 @@ def _load_session_info(self): pane_id = os.environ.get("CODEX_ITERM2_PANE", "") else: pane_id = "" - return { + result = { "session_id": os.environ["CODEX_SESSION_ID"], "runtime_dir": os.environ["CODEX_RUNTIME_DIR"], "input_fifo": os.environ["CODEX_INPUT_FIFO"], @@ -544,9 +560,21 @@ def _load_session_info(self): "pane_id": pane_id, "_session_file": None, } - - project_session = Path.cwd() / ".codex-session" - if not project_session.exists(): + session_file = self._find_session_file() + if session_file: + try: + with open(session_file, "r", encoding="utf-8-sig") as f: + file_data = json.load(f) + if isinstance(file_data, dict): + result["codex_session_path"] = file_data.get("codex_session_path") + result["codex_session_id"] = file_data.get("codex_session_id") + result["_session_file"] = str(session_file) + except Exception: + pass + return result + + project_session = self._find_session_file() + if not project_session: return None try: @@ -589,6 +617,12 @@ def _check_session_health_impl(self, probe_terminal: bool): if self.terminal in ("wezterm", "iterm2"): if not self.pane_id: return False, f"{self.terminal} pane_id not found" + if self.terminal == "wezterm" and self.backend and self.pane_title_marker: + resolver = getattr(self.backend, "find_pane_by_title_marker", None) + if callable(resolver) and (not self.backend.is_alive(self.pane_id)): + resolved = resolver(self.pane_title_marker) + if resolved: + self.pane_id = resolved if probe_terminal and (not self.backend or not self.backend.is_alive(self.pane_id)): return False, f"{self.terminal} pane does not exist: {self.pane_id}" return True, "Session healthy" diff --git a/lib/gemini_comm.py b/lib/gemini_comm.py index 907ee38..f0d6879 100755 --- a/lib/gemini_comm.py +++ b/lib/gemini_comm.py @@ -104,17 +104,28 @@ def _scan_latest_session(self) -> Optional[Path]: def _latest_session(self) -> Optional[Path]: preferred = self._preferred_session - # If preferred exists and is valid, use it directly (avoid scanning) + # Always scan to find the latest session by mtime + scanned = self._scan_latest_session() + + # Compare preferred vs scanned by mtime - use whichever is newer if preferred and preferred.exists(): + if scanned and scanned.exists(): + try: + pref_mtime = preferred.stat().st_mtime + scan_mtime = scanned.stat().st_mtime + if scan_mtime > pref_mtime: + self._debug(f"Scanned session newer: {scanned} ({scan_mtime}) > {preferred} ({pref_mtime})") + self._preferred_session = scanned + return scanned + except OSError: + pass self._debug(f"Using preferred session: {preferred}") return preferred - # Only scan when no preferred or preferred is invalid - self._debug("No valid preferred session, scanning...") - latest = self._scan_latest_session() - if latest: - self._preferred_session = latest - self._debug(f"Scan found: {latest}") - return latest + + if scanned: + self._preferred_session = scanned + self._debug(f"Scan found: {scanned}") + return scanned # Fallback: Windows/WSL path hash mismatch can cause per-project scan to miss sessions. if os.environ.get("GEMINI_DISABLE_ANY_PROJECT_SCAN") not in ("1", "true", "yes"): any_latest = self._scan_latest_session_any_project() @@ -538,6 +549,15 @@ def _ensure_log_reader(self) -> None: self._prime_log_binding() self._log_reader_primed = True + def _find_session_file(self) -> Optional[Path]: + current = Path.cwd() + while current != current.parent: + candidate = current / ".gemini-session" + if candidate.exists(): + return candidate + current = current.parent + return None + def _prime_log_binding(self) -> None: session_path = self.log_reader.current_session_path() if not session_path: @@ -554,7 +574,7 @@ def _load_session_info(self): pane_id = os.environ.get("GEMINI_ITERM2_PANE", "") else: pane_id = "" - return { + result = { "session_id": os.environ["GEMINI_SESSION_ID"], "runtime_dir": os.environ["GEMINI_RUNTIME_DIR"], "terminal": terminal, @@ -562,9 +582,20 @@ def _load_session_info(self): "pane_id": pane_id, "_session_file": None, } + session_file = self._find_session_file() + if session_file: + try: + with open(session_file, "r", encoding="utf-8") as f: + file_data = json.load(f) + if isinstance(file_data, dict): + result["gemini_session_path"] = file_data.get("gemini_session_path") + result["_session_file"] = str(session_file) + except Exception: + pass + return result - project_session = Path.cwd() / ".gemini-session" - if not project_session.exists(): + project_session = self._find_session_file() + if not project_session: return None try: diff --git a/lib/opencode_comm.py b/lib/opencode_comm.py index a37d613..550e373 100644 --- a/lib/opencode_comm.py +++ b/lib/opencode_comm.py @@ -704,6 +704,15 @@ def __init__(self, lazy_init: bool = False): if not healthy: raise RuntimeError(f"❌ Session unhealthy: {msg}\nTip: Run 'ccb up opencode' to start a new session") + def _find_session_file(self) -> Optional[Path]: + current = Path.cwd() + while current != current.parent: + candidate = current / ".opencode-session" + if candidate.exists(): + return candidate + current = current.parent + return None + def _load_session_info(self) -> Optional[dict]: if "OPENCODE_SESSION_ID" in os.environ: terminal = os.environ.get("OPENCODE_TERMINAL", "tmux") @@ -713,7 +722,7 @@ def _load_session_info(self) -> Optional[dict]: pane_id = os.environ.get("OPENCODE_ITERM2_PANE", "") else: pane_id = "" - return { + result = { "session_id": os.environ["OPENCODE_SESSION_ID"], "runtime_dir": os.environ["OPENCODE_RUNTIME_DIR"], "terminal": terminal, @@ -721,9 +730,20 @@ def _load_session_info(self) -> Optional[dict]: "pane_id": pane_id, "_session_file": None, } + session_file = self._find_session_file() + if session_file: + try: + with session_file.open("r", encoding="utf-8-sig") as handle: + file_data = json.load(handle) + if isinstance(file_data, dict): + result["opencode_session_path"] = file_data.get("opencode_session_path") + result["_session_file"] = str(session_file) + except Exception: + pass + return result - project_session = Path.cwd() / ".opencode-session" - if not project_session.exists(): + project_session = self._find_session_file() + if not project_session: return None try: diff --git a/lib/terminal.py b/lib/terminal.py index 0763b1a..aa27c39 100644 --- a/lib/terminal.py +++ b/lib/terminal.py @@ -312,6 +312,7 @@ def create_pane(self, cmd: str, cwd: str, direction: str = "right", percent: int class WeztermBackend(TerminalBackend): _wezterm_bin: Optional[str] = None + CCB_TITLE_MARKER = "CCB" @classmethod def _cli_base_args(cls) -> list[str]: @@ -392,15 +393,44 @@ def send_text(self, pane_id: str, text: str) -> None: self._send_enter(pane_id) - def is_alive(self, pane_id: str) -> bool: + def _list_panes(self) -> list[dict]: try: - result = subprocess.run([*self._cli_base_args(), "list", "--format", "json"], capture_output=True, text=True, encoding="utf-8", errors="replace") + result = subprocess.run( + [*self._cli_base_args(), "list", "--format", "json"], + capture_output=True, + text=True, + encoding="utf-8", + errors="replace", + ) if result.returncode != 0: - return False + return [] panes = json.loads(result.stdout) - return any(str(p.get("pane_id")) == str(pane_id) for p in panes) + return panes if isinstance(panes, list) else [] except Exception: + return [] + + def _pane_id_by_title_marker(self, panes: list[dict], marker: str) -> Optional[str]: + if not marker: + return None + for pane in panes: + title = pane.get("title") or "" + if marker in title: + pane_id = pane.get("pane_id") + if pane_id is not None: + return str(pane_id) + return None + + def find_pane_by_title_marker(self, marker: str) -> Optional[str]: + panes = self._list_panes() + return self._pane_id_by_title_marker(panes, marker) + + def is_alive(self, pane_id: str) -> bool: + panes = self._list_panes() + if not panes: return False + if any(str(p.get("pane_id")) == str(pane_id) for p in panes): + return True + return self._pane_id_by_title_marker(panes, pane_id) is not None def kill_pane(self, pane_id: str) -> None: subprocess.run([*self._cli_base_args(), "kill-pane", "--pane-id", pane_id], stderr=subprocess.DEVNULL) From 82833d4ef5e085e45e16747a5d8f4ebeb54fa53f Mon Sep 17 00:00:00 2001 From: TachiKuma Date: Thu, 8 Jan 2026 00:14:48 +0800 Subject: [PATCH 140/153] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20Windows=20?= =?UTF-8?q?=E5=8E=9F=E7=94=9F=E7=8E=AF=E5=A2=83=E4=B8=8B=20WezTerm=20pane?= =?UTF-8?q?=20=E6=A0=87=E9=A2=98=E4=BE=9D=E8=B5=96=20printf=20=E9=80=A0?= =?UTF-8?q?=E6=88=90=E7=9A=84=20ccb=20up=20=E5=90=AF=E5=8A=A8=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ccb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ccb b/ccb index 8125b12..1727b1b 100755 --- a/ccb +++ b/ccb @@ -194,6 +194,13 @@ def _build_keep_open_cmd(provider: str, start_cmd: str) -> str: ) +def _build_pane_title_cmd(marker: str) -> str: + if get_shell_type() == "powershell": + safe = marker.replace("'", "''") + return f"$Host.UI.RawUI.WindowTitle = '{safe}'; " + return f"printf '\\033]0;{marker}\\007'; " + + class AILauncher: def __init__(self, providers: list, resume: bool = False, auto: bool = False, no_claude: bool = False): self.providers = providers or ["codex"] @@ -342,7 +349,7 @@ class AILauncher: parent_pane = None pane_title_marker = f"CCB-{provider}-{self.session_id[:12]}" - title_cmd = f"printf '\\033]0;{pane_title_marker}\\007'; " + title_cmd = _build_pane_title_cmd(pane_title_marker) full_cmd = title_cmd + start_cmd backend = WeztermBackend() pane_id = backend.create_pane(full_cmd, str(Path.cwd()), direction=direction, percent=50, parent_pane=parent_pane) From 850d79f9244a6a290db20415b4ef35950520db04 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 8 Jan 2026 11:50:35 +0800 Subject: [PATCH 141/153] =?UTF-8?q?feat:=20=E4=BC=9A=E8=AF=9D=E7=BB=91?= =?UTF-8?q?=E5=AE=9A=E5=BC=BA=E5=8C=96=E4=B8=8E=20cask=20=E5=B9=B6?= =?UTF-8?q?=E5=8F=91=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 pane_registry 模块,实现 session-first 绑定策略 - 修复新会话启动后仍读取旧日志的问题 - 允许 cask 并发请求,使用 per-request marker 防止串答 - 更新 .gitignore 忽略本地开发文件 解决同目录多实例串会话问题,提升多模型协作稳定性 --- .gitignore | 6 ++ bin/cask | 146 ++++++++++++++++++++++++------------------- bin/cpend | 72 +++++++++++++++------ ccb | 34 ++++++++++ lib/codex_comm.py | 40 ++++++++++++ lib/pane_registry.py | 141 +++++++++++++++++++++++++++++++++++++++++ 6 files changed, 357 insertions(+), 82 deletions(-) create mode 100644 lib/pane_registry.py diff --git a/.gitignore b/.gitignore index b6711f9..0cac41b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,9 @@ __pycache__/ *.pyc +.venv/ +.pytest_cache/ +docs/ +tests/ .codex-session .gemini-session .claude-session @@ -9,3 +13,5 @@ __pycache__/ tmp/ compare_with_mcp/ CLAUDE.md +AGENTS.md +openspec diff --git a/bin/cask b/bin/cask index c79f237..44615b6 100755 --- a/bin/cask +++ b/bin/cask @@ -8,9 +8,11 @@ If --output is provided, the reply is written atomically to that file and stdout from __future__ import annotations import json import os +import re import subprocess import sys import time +import uuid from pathlib import Path from typing import Optional, Tuple @@ -19,9 +21,8 @@ lib_dir = script_dir.parent / "lib" sys.path.insert(0, str(lib_dir)) from compat import setup_windows_encoding setup_windows_encoding() -from process_lock import ProviderLock -COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "EXECUTION_COMPLETE").strip() or "EXECUTION_COMPLETE" +COMPLETION_MARKER_BASE = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "EXECUTION_COMPLETE").strip() or "EXECUTION_COMPLETE" SUPERVISOR_PROMPT = """## Executor Mode: codex+opencode You are the SUPERVISOR, NOT the executor. @@ -52,41 +53,65 @@ def _get_executor_from_roles() -> Optional[str]: return None -def _has_completion_marker(text: str) -> bool: - """Check if last line contains COMPLETION_MARKER (flexible match).""" - lines = text.rstrip().splitlines() - return bool(lines) and COMPLETION_MARKER in lines[-1] +def _build_markers(request_id: str) -> tuple[str, str]: + start_marker = f"{COMPLETION_MARKER_BASE}:BEGIN:{request_id}" + end_marker = f"{COMPLETION_MARKER_BASE}:END:{request_id}" + return start_marker, end_marker -def _strip_completion_marker(text: str) -> str: - """Remove the trailing marker line if it contains COMPLETION_MARKER.""" - lines = text.rstrip().splitlines() - if lines and COMPLETION_MARKER in lines[-1]: - lines[-1] = lines[-1].replace(COMPLETION_MARKER, "").rstrip() - if not lines[-1]: - lines = lines[:-1] - return "\n".join(lines).rstrip() - return text.rstrip() +def _marker_regex(marker: str) -> re.Pattern: + escaped = [re.escape(ch) for ch in marker] + pattern = r"\s*".join(escaped) + return re.compile(pattern, re.DOTALL) -def _wait_for_complete_reply(log_reader, state: dict, timeout: float, quiet: bool): - """Wait until reply ends with COMPLETION_MARKER or timeout.""" +def _marker_in_text(text: str, marker: str) -> bool: + return bool(_marker_regex(marker).search(text)) + + +def _strip_markers(text: str, start_marker: str, end_marker: str) -> str: + """Remove marker lines (start/end) from the reply.""" + for marker in (start_marker, end_marker): + text = _marker_regex(marker).sub("", text) + return text.strip() + + +def _wait_for_complete_reply(log_reader, state: dict, timeout: float, quiet: bool, + start_marker: str, end_marker: str): + """Wait until reply ends with end_marker or timeout.""" from cli_output import EXIT_NO_REPLY, EXIT_OK + deadline = time.time() + timeout + chunks = [] + collecting = False + + def _handle_reply(reply: str) -> Optional[str]: + nonlocal collecting, chunks + has_start = _marker_in_text(reply, start_marker) + has_end = _marker_in_text(reply, end_marker) + if not collecting: + if has_start or has_end: + collecting = True + chunks.append(reply) + else: + return None + else: + chunks.append(reply) + if has_end: + combined = "\n".join(chunks) + return _strip_markers(combined, start_marker, end_marker) + return None + # Pre-check: try to read existing messages (may have arrived before we started) - existing_reply = None try: existing_reply, state = log_reader.wait_for_message(state, timeout=0.1) - if existing_reply and _has_completion_marker(existing_reply): - return _strip_completion_marker(existing_reply), EXIT_OK + if existing_reply: + result = _handle_reply(existing_reply) + if result is not None: + return result, EXIT_OK except Exception: pass - deadline = time.time() + timeout - chunks = [] - if existing_reply: - chunks.append(existing_reply) - while True: remaining = deadline - time.time() if remaining <= 0: @@ -94,29 +119,30 @@ def _wait_for_complete_reply(log_reader, state: dict, timeout: float, quiet: boo reply, state = log_reader.wait_for_message(state, remaining) if reply is None: continue - chunks.append(reply) - if _has_completion_marker(reply): - combined = "\n".join(chunks) - return _strip_completion_marker(combined), EXIT_OK + result = _handle_reply(reply) + if result is not None: + return result, EXIT_OK - if chunks: + if chunks and collecting: if not quiet: - print("[WARN] Marker not detected, returning partial reply", file=sys.stderr) + print("[WARN] cask_marker_missing: marker not detected for this request, returning partial reply", file=sys.stderr) combined = "\n".join(chunks) - return _strip_completion_marker(combined), EXIT_NO_REPLY + return _strip_markers(combined, start_marker, end_marker), EXIT_NO_REPLY return None, EXIT_NO_REPLY -def _with_completion_marker_request(message: str) -> str: +def _with_completion_marker_request(message: str, start_marker: str, end_marker: str) -> str: if not message: return message - if COMPLETION_MARKER in message: + if start_marker in message or end_marker in message: return message return ( f"{message}\n\n" "IMPORTANT:\n" "- You MUST reply with a final response (do not stay silent).\n" - f"- End your reply with this exact line (verbatim):\n{COMPLETION_MARKER}\n" + f"- Begin your reply with this exact line (verbatim):\n{start_marker}\n" + f"- End your reply with this exact line (verbatim):\n{end_marker}\n" + "- Reply in a single message if possible.\n" ) def _usage() -> None: @@ -215,35 +241,29 @@ def main(argv: list[str]) -> int: if not healthy: raise RuntimeError(f"[ERROR] Session error: {status}") - # Use per-provider lock to serialize request-response cycles (non-blocking) - lock = ProviderLock("codex") - if not lock.try_acquire(): - print("[ERROR] Another cask request is in progress. Please wait and try again.", file=sys.stderr) - return EXIT_ERROR + # Reset log state to ignore any messages before request dispatch + comm.log_reader.capture_state() - try: - # Reset log state to ignore any messages before lock acquisition - comm.log_reader.capture_state() - - # Check if supervisor mode is enabled via roles config - executor = _get_executor_from_roles() - if executor == "codex+opencode": - message = SUPERVISOR_PROMPT + message - - _, state = comm._send_message(_with_completion_marker_request(message)) - reply, exit_code = _wait_for_complete_reply(comm.log_reader, state, timeout, quiet) - if reply is None: - if not quiet: - print(f"[TIMEOUT] Timeout after {int(timeout)}s", file=sys.stderr) - return exit_code - - if output_path: - pending_path = Path(str(output_path) + ".pending") - atomic_write_text(pending_path, reply + "\n") - pending_path.replace(output_path) - return exit_code - finally: - lock.release() + # Check if supervisor mode is enabled via roles config + executor = _get_executor_from_roles() + if executor == "codex+opencode": + message = SUPERVISOR_PROMPT + message + + request_id = uuid.uuid4().hex + start_marker, end_marker = _build_markers(request_id) + + _, state = comm._send_message(_with_completion_marker_request(message, start_marker, end_marker)) + reply, exit_code = _wait_for_complete_reply(comm.log_reader, state, timeout, quiet, start_marker, end_marker) + if reply is None: + if not quiet: + print(f"[TIMEOUT] Timeout after {int(timeout)}s", file=sys.stderr) + return exit_code + + if output_path: + pending_path = Path(str(output_path) + ".pending") + atomic_write_text(pending_path, reply + "\n") + pending_path.replace(output_path) + return exit_code sys.stdout.write(reply) if not reply.endswith("\n"): diff --git a/bin/cpend b/bin/cpend index 254a2d5..4e5f262 100755 --- a/bin/cpend +++ b/bin/cpend @@ -18,7 +18,8 @@ from i18n import t try: from cli_output import EXIT_ERROR, EXIT_NO_REPLY, EXIT_OK - from codex_comm import CodexLogReader + from codex_comm import CodexLogReader, SESSION_ID_PATTERN + from pane_registry import load_registry_by_session_id, load_registry_by_claude_pane except ImportError as exc: print(f"Import failed: {exc}") sys.exit(1) @@ -33,19 +34,59 @@ def _debug(message: str) -> None: print(f"[DEBUG] {message}", file=sys.stderr) -def _load_session_log_path() -> Path | None: +def _load_session_log_path() -> tuple[Path | None, str | None]: """Load codex_session_path from .codex-session if exists""" session_file = Path.cwd() / ".codex-session" if not session_file.exists(): - return None + return None, None try: with session_file.open("r", encoding="utf-8-sig") as f: data = json.load(f) path_str = data.get("codex_session_path") + session_id = data.get("codex_session_id") if path_str: - return Path(path_str).expanduser() + return Path(path_str).expanduser(), session_id except Exception as exc: _debug(f"Failed to read .codex-session ({session_file}): {exc}") + return None, None + + +def _load_registry_log_path() -> tuple[Path | None, dict | None]: + session_id = (os.environ.get("CODEX_SESSION_ID") or "").strip() + if session_id: + record = load_registry_by_session_id(session_id) + if record: + path_str = record.get("codex_session_path") + if path_str: + path = Path(path_str).expanduser() + _debug(f"Using registry by CODEX_SESSION_ID: {path}") + return path, record + + pane_id = (os.environ.get("WEZTERM_PANE") or "").strip() + if pane_id: + record = load_registry_by_claude_pane(pane_id) + if record: + path_str = record.get("codex_session_path") + if path_str: + path = Path(path_str).expanduser() + _debug(f"Using registry by WEZTERM_PANE: {path}") + return path, record + return None, None + + +def _derive_session_filter(log_path: Path | None, registry_record: dict | None, session_id: str | None) -> str | None: + if registry_record: + reg_id = registry_record.get("codex_session_id") + if isinstance(reg_id, str) and reg_id: + return reg_id + if session_id: + return session_id + if log_path: + for source in (log_path.stem, log_path.name): + match = SESSION_ID_PATTERN.search(source) + if match: + return match.group(0) + return log_path.name return None def _parse_n(argv: list[str]) -> int: @@ -66,22 +107,15 @@ def main(argv: list[str]) -> int: try: n = _parse_n(argv) - # Try session-specific log path first, fallback to scanning latest - log_path = _load_session_log_path() - if log_path: + registry_log_path, registry_record = _load_registry_log_path() + session_log_path, session_id = _load_session_log_path() + + log_path = registry_log_path or session_log_path + if not registry_log_path and log_path: _debug(f"Using codex_session_path from .codex-session: {log_path}") - reader = CodexLogReader(log_path=log_path) - - # If specified log has no reply, try scanning for latest - if log_path and log_path.exists(): - test_msg = reader.latest_message() - if not test_msg: - # Scan for latest log that might have replies - latest = reader._scan_latest() - if latest and latest != log_path: - reader.set_preferred_log(latest) - log_path = latest - _debug(f"Preferred log had no reply; switching to latest: {log_path}") + + session_filter = _derive_session_filter(log_path, registry_record, session_id) + reader = CodexLogReader(log_path=log_path, session_id_filter=session_filter) if n > 1: conversations = reader.latest_conversations(n) diff --git a/ccb b/ccb index 8125b12..276101b 100755 --- a/ccb +++ b/ccb @@ -28,6 +28,7 @@ from terminal import TmuxBackend, WeztermBackend, Iterm2Backend, detect_terminal from compat import setup_windows_encoding from ccb_config import get_backend_env from session_utils import safe_write_session, check_session_writable +from pane_registry import upsert_registry from i18n import t setup_windows_encoding() @@ -353,6 +354,7 @@ class AILauncher: output_fifo = runtime / "output.fifo" # WezTerm mode injects text via pane, no strong FIFO dependency; Windows/WSL may not support mkfifo self._write_codex_session(runtime, None, input_fifo, output_fifo, pane_id=pane_id, pane_title_marker=pane_title_marker) + self._write_cend_registry(os.environ.get("WEZTERM_PANE", ""), pane_id) elif provider == "gemini": self._write_gemini_session(runtime, None, pane_id=pane_id, pane_title_marker=pane_title_marker) else: @@ -451,6 +453,21 @@ class AILauncher: except Exception: pass + def _clear_codex_log_binding(self, data: dict) -> dict: + try: + if not isinstance(data, dict): + return {} + cleared = dict(data) + for key in ("codex_session_path", "codex_session_id", "codex_start_cmd"): + if key in cleared: + cleared.pop(key, None) + if cleared.get("active") is False: + cleared["active"] = True + return cleared + except Exception as exc: + print(f"⚠️ codex_session_clear_failed: {exc}", file=sys.stderr) + return data if isinstance(data, dict) else {} + def _claude_session_file(self) -> Path: return Path.cwd() / ".claude-session" @@ -875,6 +892,9 @@ exec tmux attach -t "$TMUX_SESSION" if session_file.exists(): data = self._read_json_file(session_file) + if not self.resume: + data = self._clear_codex_log_binding(data) + work_dir = Path.cwd() data.update({ "session_id": self.session_id, @@ -898,6 +918,20 @@ exec tmux attach -t "$TMUX_SESSION" return False return True + def _write_cend_registry(self, claude_pane_id: str, codex_pane_id: str | None) -> bool: + if not claude_pane_id: + return False + record = { + "ccb_session_id": self.session_id, + "claude_pane_id": claude_pane_id, + "codex_pane_id": codex_pane_id, + "work_dir": str(Path.cwd()), + } + ok = upsert_registry(record) + if not ok: + print("⚠️ Failed to update cpend registry", file=sys.stderr) + return ok + def _write_gemini_session(self, runtime, tmux_session, pane_id=None, pane_title_marker=None): session_file = Path.cwd() / ".gemini-session" diff --git a/lib/codex_comm.py b/lib/codex_comm.py index ec9d48b..7a9e549 100644 --- a/lib/codex_comm.py +++ b/lib/codex_comm.py @@ -19,6 +19,7 @@ from terminal import get_backend_for_session, get_pane_id_from_session from ccb_config import apply_backend_env from i18n import t +from pane_registry import upsert_registry, registry_path_for_session, load_registry_by_session_id apply_backend_env() @@ -571,6 +572,14 @@ def _load_session_info(self): result["_session_file"] = str(session_file) except Exception: pass + registry = load_registry_by_session_id(os.environ["CODEX_SESSION_ID"]) + if isinstance(registry, dict): + reg_log = registry.get("codex_session_path") + reg_id = registry.get("codex_session_id") + if reg_log: + result["codex_session_path"] = reg_log + if reg_id: + result["codex_session_id"] = reg_id return result project_session = self._find_session_file() @@ -833,6 +842,25 @@ def _remember_codex_session(self, log_path: Optional[Path]) -> None: resume_cmd = f"codex resume {session_id}" if session_id else None updated = False + started_at = data.get("started_at") + if started_at and not data.get("codex_session_path") and not data.get("codex_session_id"): + try: + started_ts = time.mktime(time.strptime(started_at, "%Y-%m-%d %H:%M:%S")) + except Exception: + started_ts = None + if started_ts: + try: + log_mtime = log_path_obj.stat().st_mtime + except OSError: + log_mtime = None + if log_mtime is not None and log_mtime < started_ts: + if os.environ.get("CCB_DEBUG") in ("1", "true", "yes"): + print( + f"[DEBUG] Skip binding log older than session start: {log_path_obj}", + file=sys.stderr, + ) + return + if data.get("codex_session_path") != path_str: data["codex_session_path"] = path_str updated = True @@ -866,6 +894,18 @@ def _remember_codex_session(self, log_path: Optional[Path]) -> None: if tmp_file.exists(): tmp_file.unlink(missing_ok=True) + registry_path = registry_path_for_session(self.session_id) + if registry_path.exists(): + ok = upsert_registry({ + "ccb_session_id": self.session_id, + "codex_pane_id": self.pane_id or None, + "codex_session_id": session_id, + "codex_session_path": path_str, + "work_dir": self.session_info.get("work_dir"), + }) + if not ok: + print("⚠️ Failed to update cpend registry", file=sys.stderr) + self.session_info["codex_session_path"] = path_str if session_id: self.session_info["codex_session_id"] = session_id diff --git a/lib/pane_registry.py b/lib/pane_registry.py new file mode 100644 index 0000000..b3e4ee8 --- /dev/null +++ b/lib/pane_registry.py @@ -0,0 +1,141 @@ +from __future__ import annotations + +import json +import os +import sys +import time +from pathlib import Path +from typing import Optional, Dict, Any, Iterable + +from cli_output import atomic_write_text + +REGISTRY_PREFIX = "ccb-session-" +REGISTRY_SUFFIX = ".json" +REGISTRY_TTL_SECONDS = 7 * 24 * 60 * 60 + + +def _debug_enabled() -> bool: + return os.environ.get("CCB_DEBUG") in ("1", "true", "yes") + + +def _debug(message: str) -> None: + if not _debug_enabled(): + return + print(f"[DEBUG] {message}", file=sys.stderr) + + +def _registry_dir() -> Path: + return Path.home() / ".ccb" / "run" + + +def registry_path_for_session(session_id: str) -> Path: + return _registry_dir() / f"{REGISTRY_PREFIX}{session_id}{REGISTRY_SUFFIX}" + + +def _iter_registry_files() -> Iterable[Path]: + registry_dir = _registry_dir() + if not registry_dir.exists(): + return [] + return sorted(registry_dir.glob(f"{REGISTRY_PREFIX}*{REGISTRY_SUFFIX}")) + + +def _coerce_updated_at(value: Any, fallback_path: Optional[Path] = None) -> int: + if isinstance(value, (int, float)): + return int(value) + if isinstance(value, str): + trimmed = value.strip() + if trimmed.isdigit(): + try: + return int(trimmed) + except ValueError: + pass + if fallback_path: + try: + return int(fallback_path.stat().st_mtime) + except OSError: + return 0 + return 0 + + +def _is_stale(updated_at: int, now: Optional[int] = None) -> bool: + if updated_at <= 0: + return True + now_ts = int(time.time()) if now is None else int(now) + return (now_ts - updated_at) > REGISTRY_TTL_SECONDS + + +def _load_registry_file(path: Path) -> Optional[Dict[str, Any]]: + try: + with path.open("r", encoding="utf-8") as handle: + data = json.load(handle) + if isinstance(data, dict): + return data + except Exception as exc: + _debug(f"Failed to read registry {path}: {exc}") + return None + + +def load_registry_by_session_id(session_id: str) -> Optional[Dict[str, Any]]: + if not session_id: + return None + path = registry_path_for_session(session_id) + if not path.exists(): + return None + data = _load_registry_file(path) + if not data: + return None + updated_at = _coerce_updated_at(data.get("updated_at"), path) + if _is_stale(updated_at): + _debug(f"Registry stale for session {session_id}: {path}") + return None + return data + + +def load_registry_by_claude_pane(pane_id: str) -> Optional[Dict[str, Any]]: + if not pane_id: + return None + best: Optional[Dict[str, Any]] = None + best_ts = -1 + for path in _iter_registry_files(): + data = _load_registry_file(path) + if not data: + continue + if data.get("claude_pane_id") != pane_id: + continue + updated_at = _coerce_updated_at(data.get("updated_at"), path) + if _is_stale(updated_at): + _debug(f"Registry stale for pane {pane_id}: {path}") + continue + if updated_at > best_ts: + best = data + best_ts = updated_at + return best + + +def upsert_registry(record: Dict[str, Any]) -> bool: + session_id = record.get("ccb_session_id") + if not session_id: + _debug("Registry update skipped: missing ccb_session_id") + return False + path = registry_path_for_session(str(session_id)) + path.parent.mkdir(parents=True, exist_ok=True) + + data: Dict[str, Any] = {} + if path.exists(): + existing = _load_registry_file(path) + if isinstance(existing, dict): + data.update(existing) + + for key, value in record.items(): + if value is None: + continue + data[key] = value + + data["updated_at"] = int(time.time()) + + try: + atomic_write_text(path, json.dumps(data, ensure_ascii=False, indent=2)) + return True + except Exception as exc: + _debug(f"Failed to write registry {path}: {exc}") + return False From 1e5d3626b067cd9072a0d1ab3415d745ff425466 Mon Sep 17 00:00:00 2001 From: bfly Date: Fri, 9 Jan 2026 13:08:07 +0800 Subject: [PATCH 142/153] [v2.4] Add caskd daemon with session management and resilience features MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Major changes: - Add caskd daemon for persistent background request handling - Implement SessionRegistry with automatic session file change detection - Add pane heartbeat check (is_alive) to detect dead Codex panes - Add interrupted state detection (■ Conversation interrupted) - Fix exit_code 0 being reported as 1 (resp.get("exit_code") or 1 bug) - Add WeztermBackend.get_text() for pane content inspection - Support concurrent task queue with automatic skip on interrupt New files: - bin/caskd: Daemon entry point - lib/caskd_daemon.py: Daemon core with WorkerPool and SessionRegistry - lib/caskd_protocol.py: Protocol definitions (CCB_REQ_ID, CCB_DONE) - lib/caskd_session.py: Session management utilities - commands/caskd.md: Daemon documentation Co-Authored-By: Claude Opus 4.5 --- bin/cask | 350 ++++++++++++++++----- bin/caskd | 55 ++++ ccb | 95 +++++- commands/caskd.md | 12 + install.ps1 | 2 +- install.sh | 1 + lib/caskd_daemon.py | 712 ++++++++++++++++++++++++++++++++++++++++++ lib/caskd_protocol.py | 78 +++++ lib/caskd_session.py | 137 ++++++++ lib/codex_comm.py | 127 ++++++++ lib/i18n.py | 4 +- lib/terminal.py | 34 ++ 12 files changed, 1520 insertions(+), 87 deletions(-) create mode 100755 bin/caskd create mode 100644 commands/caskd.md create mode 100644 lib/caskd_daemon.py create mode 100644 lib/caskd_protocol.py create mode 100644 lib/caskd_session.py diff --git a/bin/cask b/bin/cask index 44615b6..b8590c9 100755 --- a/bin/cask +++ b/bin/cask @@ -8,11 +8,11 @@ If --output is provided, the reply is written atomically to that file and stdout from __future__ import annotations import json import os -import re +import socket +import shutil import subprocess import sys import time -import uuid from pathlib import Path from typing import Optional, Tuple @@ -21,8 +21,12 @@ lib_dir = script_dir.parent / "lib" sys.path.insert(0, str(lib_dir)) from compat import setup_windows_encoding setup_windows_encoding() +from process_lock import ProviderLock -COMPLETION_MARKER_BASE = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "EXECUTION_COMPLETE").strip() or "EXECUTION_COMPLETE" +COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "EXECUTION_COMPLETE").strip() or "EXECUTION_COMPLETE" + +from caskd_protocol import REQ_ID_PREFIX, make_req_id, strip_done_text, wrap_codex_prompt +from caskd_daemon import read_state SUPERVISOR_PROMPT = """## Executor Mode: codex+opencode You are the SUPERVISOR, NOT the executor. @@ -53,65 +57,41 @@ def _get_executor_from_roles() -> Optional[str]: return None -def _build_markers(request_id: str) -> tuple[str, str]: - start_marker = f"{COMPLETION_MARKER_BASE}:BEGIN:{request_id}" - end_marker = f"{COMPLETION_MARKER_BASE}:END:{request_id}" - return start_marker, end_marker - - -def _marker_regex(marker: str) -> re.Pattern: - escaped = [re.escape(ch) for ch in marker] - pattern = r"\s*".join(escaped) - return re.compile(pattern, re.DOTALL) - +def _has_completion_marker(text: str) -> bool: + """Check if last line contains COMPLETION_MARKER (flexible match).""" + lines = text.rstrip().splitlines() + return bool(lines) and COMPLETION_MARKER in lines[-1] -def _marker_in_text(text: str, marker: str) -> bool: - return bool(_marker_regex(marker).search(text)) +def _strip_completion_marker(text: str) -> str: + """Remove the trailing marker line if it contains COMPLETION_MARKER.""" + lines = text.rstrip().splitlines() + if lines and COMPLETION_MARKER in lines[-1]: + lines[-1] = lines[-1].replace(COMPLETION_MARKER, "").rstrip() + if not lines[-1]: + lines = lines[:-1] + return "\n".join(lines).rstrip() + return text.rstrip() -def _strip_markers(text: str, start_marker: str, end_marker: str) -> str: - """Remove marker lines (start/end) from the reply.""" - for marker in (start_marker, end_marker): - text = _marker_regex(marker).sub("", text) - return text.strip() - -def _wait_for_complete_reply(log_reader, state: dict, timeout: float, quiet: bool, - start_marker: str, end_marker: str): - """Wait until reply ends with end_marker or timeout.""" +def _wait_for_complete_reply(log_reader, state: dict, timeout: float, quiet: bool): + """Wait until reply ends with COMPLETION_MARKER or timeout.""" from cli_output import EXIT_NO_REPLY, EXIT_OK - deadline = time.time() + timeout - chunks = [] - collecting = False - - def _handle_reply(reply: str) -> Optional[str]: - nonlocal collecting, chunks - has_start = _marker_in_text(reply, start_marker) - has_end = _marker_in_text(reply, end_marker) - if not collecting: - if has_start or has_end: - collecting = True - chunks.append(reply) - else: - return None - else: - chunks.append(reply) - if has_end: - combined = "\n".join(chunks) - return _strip_markers(combined, start_marker, end_marker) - return None - # Pre-check: try to read existing messages (may have arrived before we started) + existing_reply = None try: existing_reply, state = log_reader.wait_for_message(state, timeout=0.1) - if existing_reply: - result = _handle_reply(existing_reply) - if result is not None: - return result, EXIT_OK + if existing_reply and _has_completion_marker(existing_reply): + return _strip_completion_marker(existing_reply), EXIT_OK except Exception: pass + deadline = time.time() + timeout + chunks = [] + if existing_reply: + chunks.append(existing_reply) + while True: remaining = deadline - time.time() if remaining <= 0: @@ -119,32 +99,208 @@ def _wait_for_complete_reply(log_reader, state: dict, timeout: float, quiet: boo reply, state = log_reader.wait_for_message(state, remaining) if reply is None: continue - result = _handle_reply(reply) - if result is not None: - return result, EXIT_OK + chunks.append(reply) + if _has_completion_marker(reply): + combined = "\n".join(chunks) + return _strip_completion_marker(combined), EXIT_OK - if chunks and collecting: + if chunks: if not quiet: - print("[WARN] cask_marker_missing: marker not detected for this request, returning partial reply", file=sys.stderr) + print("[WARN] Marker not detected, returning partial reply", file=sys.stderr) combined = "\n".join(chunks) - return _strip_markers(combined, start_marker, end_marker), EXIT_NO_REPLY + return _strip_completion_marker(combined), EXIT_NO_REPLY return None, EXIT_NO_REPLY -def _with_completion_marker_request(message: str, start_marker: str, end_marker: str) -> str: +def _wait_for_done_reply(log_reader, state: dict, timeout: float, req_id: str, quiet: bool): + from cli_output import EXIT_NO_REPLY, EXIT_OK + deadline = time.time() + timeout + chunks: list[str] = [] + anchor_seen = False + anchor_collect_grace = min(deadline, time.time() + 2.0) + + while True: + remaining = deadline - time.time() + if remaining <= 0: + break + event, state = log_reader.wait_for_event(state, min(remaining, 0.5)) + if event is None: + continue + role, text = event + if role == "user": + if f"{REQ_ID_PREFIX} {req_id}" in text: + anchor_seen = True + continue + if role != "assistant": + continue + if (not anchor_seen) and time.time() < anchor_collect_grace: + continue + chunks.append(text) + combined = "\n".join(chunks) + from caskd_protocol import is_done_text + if is_done_text(combined, req_id): + return strip_done_text(combined, req_id), EXIT_OK + + combined = "\n".join(chunks) + if combined and not quiet: + print("[WARN] Done marker not detected, returning partial reply", file=sys.stderr) + return strip_done_text(combined, req_id), EXIT_NO_REPLY + + +def _with_completion_marker_request(message: str) -> str: if not message: return message - if start_marker in message or end_marker in message: + if COMPLETION_MARKER in message: return message return ( f"{message}\n\n" "IMPORTANT:\n" "- You MUST reply with a final response (do not stay silent).\n" - f"- Begin your reply with this exact line (verbatim):\n{start_marker}\n" - f"- End your reply with this exact line (verbatim):\n{end_marker}\n" - "- Reply in a single message if possible.\n" + f"- End your reply with this exact line (verbatim):\n{COMPLETION_MARKER}\n" ) + +def _env_bool(name: str, default: bool) -> bool: + raw = os.environ.get(name) + if raw is None or raw == "": + return default + v = raw.strip().lower() + if v in ("0", "false", "no", "off"): + return False + if v in ("1", "true", "yes", "on"): + return True + return default + + +def _caskd_autostart_enabled(default: bool = True) -> bool: + # Prefer the new name; keep CCB_AUTO_CASKD for backwards compatibility. + if "CCB_CASKD_AUTOSTART" in os.environ: + return _env_bool("CCB_CASKD_AUTOSTART", default) + if "CCB_AUTO_CASKD" in os.environ: + return _env_bool("CCB_AUTO_CASKD", default) + return default + + +def _state_file_from_env() -> Optional[Path]: + raw = (os.environ.get("CCB_CASKD_STATE_FILE") or "").strip() + if not raw: + return None + try: + return Path(raw).expanduser() + except Exception: + return None + + +def _find_project_session_file(work_dir: Path) -> Optional[Path]: + current = Path(work_dir).resolve() + while True: + candidate = current / ".codex-session" + if candidate.exists(): + return candidate + if current == current.parent: + return None + current = current.parent + + +def _read_project_terminal(work_dir: Path) -> Optional[str]: + session_file = _find_project_session_file(work_dir) + if not session_file: + return None + try: + data = json.loads(session_file.read_text(encoding="utf-8-sig")) + except Exception: + return None + if not isinstance(data, dict): + return None + terminal = str(data.get("terminal") or "").strip().lower() + if terminal: + return terminal + return None + + +def _try_daemon_request(work_dir: Path, message: str, timeout: float, quiet: bool) -> Optional[tuple[str, int]]: + if not _env_bool("CCB_CASKD", True): + return None + terminal = _read_project_terminal(work_dir) + if terminal not in ("wezterm", "iterm2"): + return None + st = read_state(state_file=_state_file_from_env()) + if not st: + return None + try: + host = st.get("connect_host") or st.get("host") + port = int(st["port"]) + token = st["token"] + except Exception: + return None + try: + payload = { + "type": "cask.request", + "v": 1, + "id": f"cask-{os.getpid()}-{int(time.time() * 1000)}", + "token": token, + "work_dir": str(work_dir), + "timeout_s": float(timeout), + "quiet": bool(quiet), + "message": message, + } + connect_timeout = min(1.0, max(0.1, float(timeout))) + with socket.create_connection((host, port), timeout=connect_timeout) as sock: + sock.settimeout(0.5) + sock.sendall((json.dumps(payload, ensure_ascii=False) + "\n").encode("utf-8")) + buf = b"" + deadline = time.time() + float(timeout) + 5.0 + while b"\n" not in buf and time.time() < deadline: + try: + chunk = sock.recv(65536) + except socket.timeout: + continue + if not chunk: + break + buf += chunk + if b"\n" not in buf: + return None + line = buf.split(b"\n", 1)[0].decode("utf-8", errors="replace") + resp = json.loads(line) + if resp.get("type") != "cask.response": + return None + reply = str(resp.get("reply") or "") + exit_code = int(resp.get("exit_code", 1)) + return reply, exit_code + except Exception: + return None + + +def _maybe_start_caskd() -> bool: + if not _env_bool("CCB_CASKD", True): + return False + if not _caskd_autostart_enabled(True): + return False + terminal = _read_project_terminal(Path.cwd()) + if terminal not in ("wezterm", "iterm2"): + return False + # Prefer repo-local caskd when running from source; fallback to PATH. + candidates: list[str] = [] + local = (Path(__file__).resolve().parent / "caskd") + if local.exists(): + candidates.append(str(local)) + found = shutil.which("caskd") + if found: + candidates.append(found) + if not candidates: + return False + argv = [sys.executable, candidates[0]] if candidates[0].endswith(".py") else [candidates[0]] + try: + kwargs = {"stdin": subprocess.DEVNULL, "stdout": subprocess.DEVNULL, "stderr": subprocess.DEVNULL, "close_fds": True} + if os.name == "nt": + kwargs["creationflags"] = getattr(subprocess, "DETACHED_PROCESS", 0) | getattr(subprocess, "CREATE_NEW_PROCESS_GROUP", 0) + else: + kwargs["start_new_session"] = True + subprocess.Popen(argv, **kwargs) + return True + except Exception: + return False + def _usage() -> None: print("Usage: cask [--timeout SECONDS] [--output FILE] ", file=sys.stderr) @@ -235,35 +391,63 @@ def main(argv: list[str]) -> int: print("Correct usage: Bash(cask \"...\", run_in_background=true)", file=sys.stderr) return EXIT_ERROR - comm = CodexCommunicator(lazy_init=True) - - healthy, status = comm._check_session_health_impl(probe_terminal=False) - if not healthy: - raise RuntimeError(f"[ERROR] Session error: {status}") - - # Reset log state to ignore any messages before request dispatch - comm.log_reader.capture_state() - # Check if supervisor mode is enabled via roles config executor = _get_executor_from_roles() if executor == "codex+opencode": message = SUPERVISOR_PROMPT + message - request_id = uuid.uuid4().hex - start_marker, end_marker = _build_markers(request_id) - - _, state = comm._send_message(_with_completion_marker_request(message, start_marker, end_marker)) - reply, exit_code = _wait_for_complete_reply(comm.log_reader, state, timeout, quiet, start_marker, end_marker) - if reply is None: - if not quiet: - print(f"[TIMEOUT] Timeout after {int(timeout)}s", file=sys.stderr) + # Prefer daemon if available (scheme-2). Do NOT take the client-side lock for daemon mode: + # daemon performs per-session serialization and should accept concurrent client submissions. + daemon_result = _try_daemon_request(Path.cwd(), message, timeout, quiet) + if daemon_result is None and _maybe_start_caskd(): + # Give daemon a moment to write state file and start listening, then retry once. + time.sleep(0.2) + daemon_result = _try_daemon_request(Path.cwd(), message, timeout, quiet) + if daemon_result is not None: + reply, exit_code = daemon_result + if output_path: + pending_path = Path(str(output_path) + ".pending") + atomic_write_text(pending_path, reply + "\n") + pending_path.replace(output_path) + return exit_code + sys.stdout.write(reply) + if not reply.endswith("\n"): + sys.stdout.write("\n") return exit_code - if output_path: - pending_path = Path(str(output_path) + ".pending") - atomic_write_text(pending_path, reply + "\n") - pending_path.replace(output_path) - return exit_code + comm = CodexCommunicator(lazy_init=True) + + healthy, status = comm._check_session_health_impl(probe_terminal=False) + if not healthy: + raise RuntimeError(f"[ERROR] Session error: {status}") + + # Direct mode: keep client-side lock to avoid log mis-association and interleaved injection. + lock_key = (comm.session_info.get("pane_title_marker") or comm.pane_id or comm.session_info.get("codex_session_id") or os.getcwd()) + lock = ProviderLock("codex", cwd=f"session:{lock_key}", timeout=min(300.0, max(1.0, float(timeout)))) + if not lock.acquire(): + print("[ERROR] Another cask request is in progress (lock timeout).", file=sys.stderr) + return EXIT_ERROR + + try: + # Reset log state to ignore any messages before lock acquisition + comm.log_reader.capture_state() + + # Direct mode: scheme-2 req_id protocol (strict). + req_id = make_req_id() + _, state = comm._send_message(wrap_codex_prompt(message, req_id)) + reply, exit_code = _wait_for_done_reply(comm.log_reader, state, timeout, req_id, quiet) + if reply is None: + if not quiet: + print(f"[TIMEOUT] Timeout after {int(timeout)}s", file=sys.stderr) + return exit_code + + if output_path: + pending_path = Path(str(output_path) + ".pending") + atomic_write_text(pending_path, reply + "\n") + pending_path.replace(output_path) + return exit_code + finally: + lock.release() sys.stdout.write(reply) if not reply.endswith("\n"): diff --git a/bin/caskd b/bin/caskd new file mode 100755 index 0000000..310b819 --- /dev/null +++ b/bin/caskd @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +""" +caskd - Codex ask daemon (WezTerm/iTerm2). + +Implements Scheme-2: per-session serialized sending + log-driven reply extraction with req_id. +""" +from __future__ import annotations + +import argparse +import os +import sys +from pathlib import Path + +script_dir = Path(__file__).resolve().parent +lib_dir = script_dir.parent / "lib" +sys.path.insert(0, str(lib_dir)) + +from compat import setup_windows_encoding + +setup_windows_encoding() + +from caskd_daemon import CaskdServer, shutdown_daemon + + +def _parse_listen(value: str) -> tuple[str, int]: + value = (value or "").strip() + if not value: + return "127.0.0.1", 0 + if ":" not in value: + return value, 0 + host, port_s = value.rsplit(":", 1) + return host or "127.0.0.1", int(port_s or "0") + + +def main(argv: list[str]) -> int: + ap = argparse.ArgumentParser(description="cask daemon (Codex, WezTerm)") + ap.add_argument("--listen", default=os.environ.get("CCB_CASKD_LISTEN", "127.0.0.1:0"), help="host:port (default 127.0.0.1:0)") + ap.add_argument("--state-file", default=os.environ.get("CCB_CASKD_STATE_FILE", ""), help="Override state file path") + ap.add_argument("--shutdown", action="store_true", help="Shutdown running daemon") + args = ap.parse_args(argv[1:]) + + state_file = Path(args.state_file).expanduser() if args.state_file else None + + if args.shutdown: + ok = shutdown_daemon(state_file=state_file) + return 0 if ok else 1 + + host, port = _parse_listen(args.listen) + server = CaskdServer(host=host, port=port, state_file=state_file) + return server.serve_forever() + + +if __name__ == "__main__": + raise SystemExit(main(sys.argv)) + diff --git a/ccb b/ccb index cd4f4aa..9d00f4b 100755 --- a/ccb +++ b/ccb @@ -203,7 +203,13 @@ def _build_pane_title_cmd(marker: str) -> str: class AILauncher: - def __init__(self, providers: list, resume: bool = False, auto: bool = False, no_claude: bool = False): + def __init__( + self, + providers: list, + resume: bool = False, + auto: bool = False, + no_claude: bool = False, + ): self.providers = providers or ["codex"] self.resume = resume self.auto = auto @@ -220,6 +226,90 @@ class AILauncher: self.iterm2_panes = {} self.processes = {} + def _maybe_start_caskd(self) -> None: + def _bool_from_env(name: str): + raw = os.environ.get(name) + if raw is None or raw == "": + return None + v = raw.strip().lower() + if v in {"0", "false", "no", "off"}: + return False + if v in {"1", "true", "yes", "on"}: + return True + return None + + # Prefer the new name; keep CCB_AUTO_CASKD for backwards compatibility. + autostart = _bool_from_env("CCB_CASKD_AUTOSTART") + if autostart is None: + autostart = _bool_from_env("CCB_AUTO_CASKD") + if autostart is False: + return + if _bool_from_env("CCB_CASKD") is False: + return + if "codex" not in self.providers: + return + if self.terminal_type not in ("wezterm", "iterm2"): + return + try: + from caskd_daemon import ping_daemon, read_state + except Exception as exc: + print(f"⚠️ Failed to import caskd modules: {exc}") + return + + state_file = None + raw_state_file = (os.environ.get("CCB_CASKD_STATE_FILE") or "").strip() + if raw_state_file: + try: + state_file = Path(raw_state_file).expanduser() + except Exception: + state_file = None + + if ping_daemon(state_file=state_file): + st = read_state(state_file=state_file) or {} + host = st.get("host") + port = st.get("port") + if host and port: + print(f"✅ caskd already running at {host}:{port}") + else: + print("✅ caskd already running") + return + + caskd_script = self.script_dir / "bin" / "caskd" + if not caskd_script.exists(): + print("⚠️ caskd not found (bin/caskd). Reinstall or update your checkout.") + return + + kwargs = { + "stdin": subprocess.DEVNULL, + "stdout": subprocess.DEVNULL, + "stderr": subprocess.DEVNULL, + "close_fds": True, + } + if os.name == "nt": + kwargs["creationflags"] = getattr(subprocess, "DETACHED_PROCESS", 0) | getattr(subprocess, "CREATE_NEW_PROCESS_GROUP", 0) + else: + kwargs["start_new_session"] = True + + try: + subprocess.Popen([sys.executable, str(caskd_script)], **kwargs) + except Exception as exc: + print(f"⚠️ Failed to start caskd: {exc}") + return + + deadline = time.time() + 2.0 + while time.time() < deadline: + if ping_daemon(timeout_s=0.2, state_file=state_file): + st = read_state(state_file=state_file) or {} + host = st.get("host") + port = st.get("port") + if host and port: + print(f"✅ caskd started at {host}:{port}") + else: + print("✅ caskd started") + return + time.sleep(0.1) + print("⚠️ caskd start requested, but daemon not reachable yet") + def _detect_terminal_type(self): # Forced by environment variable forced = (os.environ.get("CCB_TERMINAL") or os.environ.get("CODEX_TERMINAL") or "").strip().lower() @@ -1238,6 +1328,9 @@ exec tmux attach -t "$TMUX_SESSION" return 1 self._warmup_provider(provider) + # Optional: start caskd after Codex session file exists (first startup convenience). + self._maybe_start_caskd() + if self.no_claude: print(f"✅ {t('backends_started_no_claude')}") print() diff --git a/commands/caskd.md b/commands/caskd.md new file mode 100644 index 0000000..6909368 --- /dev/null +++ b/commands/caskd.md @@ -0,0 +1,12 @@ +Start/stop the `caskd` daemon (Codex, WezTerm/iTerm2). + +Execution: +- `Bash(caskd)` to start (runs until stopped) +- `Bash(caskd --shutdown)` to stop + +Notes: +- `cask` will use `caskd` automatically when running and `CCB_CASKD=1` (default). +- `caskd` currently supports WezTerm/iTerm2 sessions only (tmux falls back to direct mode). +- State file: `~/.ccb/run/caskd.json` (override with `CCB_CASKD_STATE_FILE` / `--state-file`). +- Autostart: set `CCB_CASKD_AUTOSTART=0` (or legacy `CCB_AUTO_CASKD=0`) to disable auto-start behavior. +- Listen address: set `CCB_CASKD_LISTEN=127.0.0.1:0` (or pass `--listen host:port`). diff --git a/install.ps1 b/install.ps1 index 56debc2..fb2651a 100644 --- a/install.ps1 +++ b/install.ps1 @@ -27,7 +27,7 @@ $script:CCB_END_MARKER = "" $script:SCRIPTS_TO_LINK = @( "ccb", - "cask", "cask-w", "cpend", "cping", + "cask", "cask-w", "caskd", "cpend", "cping", "gask", "gask-w", "gpend", "gping", "oask", "oask-w", "opend", "oping", "ccb-layout" diff --git a/install.sh b/install.sh index 840b517..7775392 100755 --- a/install.sh +++ b/install.sh @@ -90,6 +90,7 @@ fi SCRIPTS_TO_LINK=( bin/cask bin/cask-w + bin/caskd bin/cpend bin/cping bin/gask diff --git a/lib/caskd_daemon.py b/lib/caskd_daemon.py new file mode 100644 index 0000000..1b81b82 --- /dev/null +++ b/lib/caskd_daemon.py @@ -0,0 +1,712 @@ +from __future__ import annotations + +import json +import os +import queue +import socket +import socketserver +import sys +import threading +import time +from dataclasses import dataclass +from pathlib import Path +from typing import Any, Optional, Tuple + +from caskd_protocol import ( + CaskdRequest, + CaskdResult, + REQ_ID_PREFIX, + DONE_PREFIX, + make_req_id, + is_done_text, + strip_done_text, + wrap_codex_prompt, +) +from caskd_session import CodexProjectSession, compute_session_key, find_project_session_file, load_project_session +from codex_comm import CodexLogReader, CodexCommunicator +from process_lock import ProviderLock +from session_utils import safe_write_session +from terminal import get_backend_for_session + + +def _now_ms() -> int: + return int(time.time() * 1000) + + +def _run_dir() -> Path: + return Path.home() / ".ccb" / "run" + + +def _state_file_path() -> Path: + return _run_dir() / "caskd.json" + + +def _log_path() -> Path: + return _run_dir() / "caskd.log" + + +def _write_log(line: str) -> None: + try: + _run_dir().mkdir(parents=True, exist_ok=True) + with _log_path().open("a", encoding="utf-8") as handle: + handle.write(line.rstrip() + "\n") + except Exception: + pass + + +def _random_token() -> str: + return os.urandom(16).hex() + + +def _normalize_connect_host(host: str) -> str: + host = (host or "").strip() + if not host or host in ("0.0.0.0",): + return "127.0.0.1" + if host in ("::", "[::]"): + return "::1" + return host + + +def _extract_codex_session_id_from_log(log_path: Path) -> Optional[str]: + try: + return CodexCommunicator._extract_session_id(log_path) + except Exception: + return None + + +def _tail_state_for_log(log_path: Optional[Path], *, tail_bytes: int) -> dict: + if not log_path: + return {"log_path": None, "offset": 0} + try: + size = log_path.stat().st_size + except OSError: + size = 0 + offset = max(0, int(size) - int(tail_bytes)) + return {"log_path": log_path, "offset": offset} + + +@dataclass +class _QueuedTask: + request: CaskdRequest + created_ms: int + req_id: str + done_event: threading.Event + result: Optional[CaskdResult] = None + + +class _SessionWorker(threading.Thread): + def __init__(self, session_key: str): + super().__init__(daemon=True) + self.session_key = session_key + self._q: "queue.Queue[_QueuedTask]" = queue.Queue() + self._stop = threading.Event() + + def enqueue(self, task: _QueuedTask) -> None: + self._q.put(task) + + def stop(self) -> None: + self._stop.set() + + def run(self) -> None: + while not self._stop.is_set(): + try: + task = self._q.get(timeout=0.2) + except queue.Empty: + continue + try: + task.result = self._handle_task(task) + except Exception as exc: + _write_log(f"[ERROR] session={self.session_key} req_id={task.req_id} {exc}") + task.result = CaskdResult( + exit_code=1, + reply=str(exc), + req_id=task.req_id, + session_key=self.session_key, + log_path=None, + anchor_seen=False, + done_seen=False, + fallback_scan=False, + ) + finally: + task.done_event.set() + + def _handle_task(self, task: _QueuedTask) -> CaskdResult: + started_ms = _now_ms() + req = task.request + work_dir = Path(req.work_dir) + _write_log(f"[INFO] start session={self.session_key} req_id={task.req_id} work_dir={req.work_dir}") + session = load_project_session(work_dir) + if not session: + return CaskdResult( + exit_code=1, + reply="❌ No active Codex session found for work_dir. Run 'ccb up codex' in that project first.", + req_id=task.req_id, + session_key=self.session_key, + log_path=None, + anchor_seen=False, + done_seen=False, + fallback_scan=False, + ) + + if session.terminal not in ("wezterm", "iterm2"): + return CaskdResult( + exit_code=1, + reply=f"❌ caskd currently supports WezTerm/iTerm2 sessions only (got terminal={session.terminal}).", + req_id=task.req_id, + session_key=self.session_key, + log_path=None, + anchor_seen=False, + done_seen=False, + fallback_scan=False, + ) + + ok, pane_or_err = session.ensure_pane() + if not ok: + return CaskdResult( + exit_code=1, + reply=f"❌ Session pane not available: {pane_or_err}", + req_id=task.req_id, + session_key=self.session_key, + log_path=None, + anchor_seen=False, + done_seen=False, + fallback_scan=False, + ) + pane_id = pane_or_err + backend = get_backend_for_session(session.data) + if not backend: + return CaskdResult( + exit_code=1, + reply="❌ Terminal backend not available", + req_id=task.req_id, + session_key=self.session_key, + log_path=None, + anchor_seen=False, + done_seen=False, + fallback_scan=False, + ) + + prompt = wrap_codex_prompt(req.message, task.req_id) + + # Prefer project-bound log path if present; allow reader to follow newer logs if it changes. + preferred_log = session.codex_session_path or None + codex_session_id = session.codex_session_id or None + # Start with session_id_filter if present; drop it if we see no events early (escape hatch). + reader = CodexLogReader(log_path=preferred_log, session_id_filter=codex_session_id or None, work_dir=Path(session.work_dir)) + + state = reader.capture_state() + + backend.send_text(pane_id, prompt) + + deadline = time.time() + float(req.timeout_s) + chunks: list[str] = [] + anchor_seen = False + done_seen = False + anchor_ms: Optional[int] = None + done_ms: Optional[int] = None + fallback_scan = False + + # If we can't observe our user anchor within a short grace window, the log binding is likely stale. + # In that case we drop the bound session filter and rebind to the latest log, starting from a tail + # offset (NOT EOF) to avoid missing a reply that already landed. + anchor_grace_deadline = min(deadline, time.time() + 1.5) + anchor_collect_grace = min(deadline, time.time() + 2.0) + rebounded = False + saw_any_event = False + tail_bytes = int(os.environ.get("CCB_CASKD_REBIND_TAIL_BYTES", str(1024 * 1024 * 2)) or (1024 * 1024 * 2)) + last_pane_check = time.time() + pane_check_interval = float(os.environ.get("CCB_CASKD_PANE_CHECK_INTERVAL", "2.0") or "2.0") + + while True: + remaining = deadline - time.time() + if remaining <= 0: + break + + # Fail fast if the pane dies mid-request (e.g. Codex killed). + if time.time() - last_pane_check >= pane_check_interval: + try: + alive = bool(backend.is_alive(pane_id)) + except Exception: + alive = False + if not alive: + _write_log(f"[ERROR] Pane {pane_id} died during request session={self.session_key} req_id={task.req_id}") + log_path = None + try: + lp = reader.current_log_path() + if lp: + log_path = str(lp) + except Exception: + log_path = None + return CaskdResult( + exit_code=1, + reply="❌ Codex pane died during request", + req_id=task.req_id, + session_key=self.session_key, + log_path=log_path, + anchor_seen=anchor_seen, + done_seen=False, + fallback_scan=fallback_scan, + anchor_ms=anchor_ms, + done_ms=None, + ) + # Check for Codex interrupted state + # Only trigger if "■ Conversation interrupted" appears AFTER "CCB_REQ_ID" (our request) + # This ensures we're detecting interrupt for current task, not history + if hasattr(backend, 'get_text'): + try: + pane_text = backend.get_text(pane_id, lines=15) + if pane_text and '■ Conversation interrupted' in pane_text: + # Verify this is for current request: interrupt should appear after our req_id + req_id_pos = pane_text.find(task.req_id) + interrupt_pos = pane_text.find('■ Conversation interrupted') + # Only trigger if interrupt is after our request ID (or if req_id not found but interrupt is recent) + is_current_interrupt = (req_id_pos >= 0 and interrupt_pos > req_id_pos) or (req_id_pos < 0 and interrupt_pos >= 0) + else: + is_current_interrupt = False + if is_current_interrupt: + _write_log(f"[WARN] Codex interrupted - skipping task session={self.session_key} req_id={task.req_id}") + log_path = None + try: + lp = reader.current_log_path() + if lp: + log_path = str(lp) + except Exception: + log_path = None + return CaskdResult( + exit_code=1, + reply="❌ Codex interrupted. Please recover Codex manually, then retry. Skipping to next task.", + req_id=task.req_id, + session_key=self.session_key, + log_path=log_path, + anchor_seen=anchor_seen, + done_seen=False, + fallback_scan=fallback_scan, + anchor_ms=anchor_ms, + done_ms=None, + ) + except Exception: + pass + last_pane_check = time.time() + + event, state = reader.wait_for_event(state, min(remaining, 0.5)) + if event is None: + if (not rebounded) and (not anchor_seen) and time.time() >= anchor_grace_deadline and codex_session_id: + # Escape hatch: drop the session_id_filter so the reader can follow the latest log for this work_dir. + codex_session_id = None + reader = CodexLogReader(log_path=preferred_log, session_id_filter=None, work_dir=Path(session.work_dir)) + log_hint = reader.current_log_path() + state = _tail_state_for_log(log_hint, tail_bytes=tail_bytes) + fallback_scan = True + rebounded = True + continue + + role, text = event + saw_any_event = True + if role == "user": + if f"{REQ_ID_PREFIX} {task.req_id}" in text: + anchor_seen = True + if anchor_ms is None: + anchor_ms = _now_ms() - started_ms + continue + + if role != "assistant": + continue + + # Avoid collecting unrelated assistant messages until our request is visible in logs. + # Some Codex builds may omit user entries; after a short grace period, start collecting anyway. + if (not anchor_seen) and time.time() < anchor_collect_grace: + continue + + chunks.append(text) + combined = "\n".join(chunks) + if is_done_text(combined, task.req_id): + done_seen = True + done_ms = _now_ms() - started_ms + break + + combined = "\n".join(chunks) + reply = strip_done_text(combined, task.req_id) + log_path = None + try: + lp = state.get("log_path") + if lp: + log_path = str(lp) + except Exception: + log_path = None + + if done_seen and log_path: + sid = _extract_codex_session_id_from_log(Path(log_path)) + session.update_codex_log_binding(log_path=log_path, session_id=sid) + + exit_code = 0 if done_seen else 2 + result = CaskdResult( + exit_code=exit_code, + reply=reply, + req_id=task.req_id, + session_key=self.session_key, + log_path=log_path, + anchor_seen=anchor_seen, + done_seen=done_seen, + fallback_scan=fallback_scan, + anchor_ms=anchor_ms, + done_ms=done_ms, + ) + _write_log( + f"[INFO] done session={self.session_key} req_id={task.req_id} exit={result.exit_code} " + f"anchor={result.anchor_seen} done={result.done_seen} fallback={result.fallback_scan} " + f"log={result.log_path or ''} anchor_ms={result.anchor_ms or ''} done_ms={result.done_ms or ''}" + ) + return result + + +@dataclass +class _SessionEntry: + work_dir: Path + session: Optional[CodexProjectSession] + session_file: Optional[Path] + file_mtime: float + last_check: float + valid: bool = True + + +class SessionRegistry: + """Manages and monitors all active Codex sessions.""" + + CHECK_INTERVAL = 10.0 # seconds between validity checks + + def __init__(self): + self._lock = threading.Lock() + self._sessions: dict[str, _SessionEntry] = {} # work_dir -> entry + self._stop = threading.Event() + self._monitor_thread: Optional[threading.Thread] = None + + def start_monitor(self) -> None: + if self._monitor_thread is None: + self._monitor_thread = threading.Thread(target=self._monitor_loop, daemon=True) + self._monitor_thread.start() + + def stop_monitor(self) -> None: + self._stop.set() + + def get_session(self, work_dir: Path) -> Optional[CodexProjectSession]: + key = str(work_dir) + with self._lock: + entry = self._sessions.get(key) + if entry: + # If the session entry is invalid but the session file was updated (e.g. new pane info), + # reload and re-validate so we can recover. + session_file = entry.session_file or find_project_session_file(work_dir) or (work_dir / ".codex-session") + if session_file.exists(): + try: + current_mtime = session_file.stat().st_mtime + if (not entry.session_file) or (session_file != entry.session_file) or (current_mtime != entry.file_mtime): + _write_log(f"[INFO] Session file changed, reloading: {work_dir}") + entry = self._load_and_cache(work_dir) + except Exception: + pass + + if entry and entry.valid: + return entry.session + else: + entry = self._load_and_cache(work_dir) + if entry: + return entry.session + + return None + + def _load_and_cache(self, work_dir: Path) -> Optional[_SessionEntry]: + session = load_project_session(work_dir) + session_file = session.session_file if session else (find_project_session_file(work_dir) or (work_dir / ".codex-session")) + mtime = 0.0 + if session_file.exists(): + try: + mtime = session_file.stat().st_mtime + except Exception: + pass + + valid = False + if session is not None: + try: + ok, _ = session.ensure_pane() + valid = bool(ok) + except Exception: + valid = False + + entry = _SessionEntry( + work_dir=work_dir, + session=session, + session_file=session_file if session_file.exists() else None, + file_mtime=mtime, + last_check=time.time(), + valid=valid, + ) + self._sessions[str(work_dir)] = entry + return entry if entry.valid else None + + def invalidate(self, work_dir: Path) -> None: + key = str(work_dir) + with self._lock: + if key in self._sessions: + self._sessions[key].valid = False + _write_log(f"[INFO] Session invalidated: {work_dir}") + + def remove(self, work_dir: Path) -> None: + key = str(work_dir) + with self._lock: + if key in self._sessions: + del self._sessions[key] + _write_log(f"[INFO] Session removed: {work_dir}") + + def _monitor_loop(self) -> None: + while not self._stop.wait(self.CHECK_INTERVAL): + self._check_all_sessions() + + def _check_all_sessions(self) -> None: + with self._lock: + keys_to_remove = [] + for key, entry in self._sessions.items(): + if not entry.valid: + continue + if entry.session_file and not entry.session_file.exists(): + _write_log(f"[WARN] Session file deleted: {entry.work_dir}") + entry.valid = False + continue + if entry.session: + ok, _ = entry.session.ensure_pane() + if not ok: + _write_log(f"[WARN] Session pane invalid: {entry.work_dir}") + entry.valid = False + entry.last_check = time.time() + for key, entry in list(self._sessions.items()): + if not entry.valid and time.time() - entry.last_check > 300: + keys_to_remove.append(key) + for key in keys_to_remove: + del self._sessions[key] + + def get_status(self) -> dict: + with self._lock: + return { + "total": len(self._sessions), + "valid": sum(1 for e in self._sessions.values() if e.valid), + "sessions": [{"work_dir": str(e.work_dir), "valid": e.valid} for e in self._sessions.values()], + } + + +_session_registry: Optional[SessionRegistry] = None + + +def get_session_registry() -> SessionRegistry: + global _session_registry + if _session_registry is None: + _session_registry = SessionRegistry() + _session_registry.start_monitor() + return _session_registry + + +class _WorkerPool: + def __init__(self): + self._lock = threading.Lock() + self._workers: dict[str, _SessionWorker] = {} + + def submit(self, request: CaskdRequest) -> _QueuedTask: + req_id = make_req_id() + task = _QueuedTask(request=request, created_ms=_now_ms(), req_id=req_id, done_event=threading.Event()) + + session = load_project_session(Path(request.work_dir)) + session_key = compute_session_key(session) if session else "codex:unknown" + + with self._lock: + worker = self._workers.get(session_key) + if worker is None: + worker = _SessionWorker(session_key) + self._workers[session_key] = worker + worker.start() + + worker.enqueue(task) + return task + + +class CaskdServer: + def __init__(self, host: str = "127.0.0.1", port: int = 0, *, state_file: Optional[Path] = None): + self.host = host + self.port = port + self.state_file = state_file or _state_file_path() + self.token = _random_token() + self.pool = _WorkerPool() + + def serve_forever(self) -> int: + _run_dir().mkdir(parents=True, exist_ok=True) + + # Single-instance lock (global, not per-cwd) + lock = ProviderLock("caskd", cwd="global", timeout=0.1) + if not lock.try_acquire(): + return 2 + + class Handler(socketserver.StreamRequestHandler): + def handle(self) -> None: + try: + line = self.rfile.readline() + if not line: + return + msg = json.loads(line.decode("utf-8", errors="replace")) + except Exception: + return + + if msg.get("token") != self.server.token: + self._write({"type": "cask.response", "v": 1, "id": msg.get("id"), "exit_code": 1, "reply": "Unauthorized"}) + return + + if msg.get("type") == "cask.ping": + self._write({"type": "cask.pong", "v": 1, "id": msg.get("id"), "exit_code": 0, "reply": "OK"}) + return + + if msg.get("type") == "cask.shutdown": + self._write({"type": "cask.response", "v": 1, "id": msg.get("id"), "exit_code": 0, "reply": "OK"}) + threading.Thread(target=self.server.shutdown, daemon=True).start() + return + + if msg.get("type") != "cask.request": + self._write({"type": "cask.response", "v": 1, "id": msg.get("id"), "exit_code": 1, "reply": "Invalid request"}) + return + + try: + req = CaskdRequest( + client_id=str(msg.get("id") or ""), + work_dir=str(msg.get("work_dir") or ""), + timeout_s=float(msg.get("timeout_s") or 300.0), + quiet=bool(msg.get("quiet") or False), + message=str(msg.get("message") or ""), + output_path=str(msg.get("output_path")) if msg.get("output_path") else None, + ) + except Exception as exc: + self._write({"type": "cask.response", "v": 1, "id": msg.get("id"), "exit_code": 1, "reply": f"Bad request: {exc}"}) + return + + task = self.server.pool.submit(req) + task.done_event.wait(timeout=req.timeout_s + 5.0) + result = task.result + if not result: + self._write({"type": "cask.response", "v": 1, "id": req.client_id, "exit_code": 2, "reply": ""}) + return + + self._write( + { + "type": "cask.response", + "v": 1, + "id": req.client_id, + "req_id": result.req_id, + "exit_code": result.exit_code, + "reply": result.reply, + "meta": { + "session_key": result.session_key, + "log_path": result.log_path, + "anchor_seen": result.anchor_seen, + "done_seen": result.done_seen, + "fallback_scan": result.fallback_scan, + "anchor_ms": result.anchor_ms, + "done_ms": result.done_ms, + }, + } + ) + + def _write(self, obj: dict) -> None: + try: + data = (json.dumps(obj, ensure_ascii=False) + "\n").encode("utf-8") + self.wfile.write(data) + self.wfile.flush() + except Exception: + pass + + class Server(socketserver.ThreadingTCPServer): + allow_reuse_address = True + + with Server((self.host, self.port), Handler) as httpd: + httpd.token = self.token + httpd.pool = self.pool + actual_host, actual_port = httpd.server_address + self._write_state(actual_host, int(actual_port)) + _write_log(f"[INFO] caskd started pid={os.getpid()} addr={actual_host}:{actual_port}") + try: + httpd.serve_forever(poll_interval=0.2) + finally: + _write_log("[INFO] caskd stopped") + return 0 + + def _write_state(self, host: str, port: int) -> None: + payload = { + "pid": os.getpid(), + "host": host, + "connect_host": _normalize_connect_host(host), + "port": port, + "token": self.token, + "started_at": time.strftime("%Y-%m-%d %H:%M:%S"), + "python": sys.executable, + } + self.state_file.parent.mkdir(parents=True, exist_ok=True) + ok, _err = safe_write_session(self.state_file, json.dumps(payload, ensure_ascii=False, indent=2) + "\n") + if ok: + try: + os.chmod(self.state_file, 0o600) + except Exception: + pass + + +def read_state(state_file: Optional[Path] = None) -> Optional[dict]: + state_file = state_file or _state_file_path() + try: + raw = state_file.read_text(encoding="utf-8") + obj = json.loads(raw) + return obj if isinstance(obj, dict) else None + except Exception: + return None + + +def ping_daemon(timeout_s: float = 0.5, state_file: Optional[Path] = None) -> bool: + st = read_state(state_file) + if not st: + return False + try: + host = st.get("connect_host") or st["host"] + port = int(st["port"]) + token = st["token"] + except Exception: + return False + try: + with socket.create_connection((host, port), timeout=timeout_s) as sock: + req = {"type": "cask.ping", "v": 1, "id": "ping", "token": token} + sock.sendall((json.dumps(req) + "\n").encode("utf-8")) + buf = b"" + deadline = time.time() + timeout_s + while b"\n" not in buf and time.time() < deadline: + chunk = sock.recv(1024) + if not chunk: + break + buf += chunk + if b"\n" not in buf: + return False + line = buf.split(b"\n", 1)[0].decode("utf-8", errors="replace") + resp = json.loads(line) + return resp.get("type") in ("cask.pong", "cask.response") and int(resp.get("exit_code") or 0) == 0 + return True + except Exception: + return False + + +def shutdown_daemon(timeout_s: float = 1.0, state_file: Optional[Path] = None) -> bool: + st = read_state(state_file) + if not st: + return False + try: + host = st.get("connect_host") or st["host"] + port = int(st["port"]) + token = st["token"] + except Exception: + return False + try: + with socket.create_connection((host, port), timeout=timeout_s) as sock: + req = {"type": "cask.shutdown", "v": 1, "id": "shutdown", "token": token} + sock.sendall((json.dumps(req) + "\n").encode("utf-8")) + _ = sock.recv(1024) + return True + except Exception: + return False diff --git a/lib/caskd_protocol.py b/lib/caskd_protocol.py new file mode 100644 index 0000000..7a0bc78 --- /dev/null +++ b/lib/caskd_protocol.py @@ -0,0 +1,78 @@ +from __future__ import annotations + +import re +import secrets +from dataclasses import dataclass + + +REQ_ID_PREFIX = "CCB_REQ_ID:" +DONE_PREFIX = "CCB_DONE:" + +DONE_LINE_RE_TEMPLATE = r"^\s*CCB_DONE:\s*{req_id}\s*$" + + +def make_req_id() -> str: + # 128-bit token is enough; hex string is log/grep friendly. + return secrets.token_hex(16) + + +def wrap_codex_prompt(message: str, req_id: str) -> str: + message = (message or "").rstrip() + return ( + f"{REQ_ID_PREFIX} {req_id}\n\n" + f"{message}\n\n" + "IMPORTANT:\n" + "- Reply normally.\n" + "- End your reply with this exact final line (verbatim, on its own line):\n" + f"{DONE_PREFIX} {req_id}\n" + ) + + +def done_line_re(req_id: str) -> re.Pattern[str]: + return re.compile(DONE_LINE_RE_TEMPLATE.format(req_id=re.escape(req_id))) + + +def is_done_text(text: str, req_id: str) -> bool: + lines = [ln.rstrip() for ln in (text or "").splitlines()] + for i in range(len(lines) - 1, -1, -1): + if lines[i].strip() == "": + continue + return bool(done_line_re(req_id).match(lines[i])) + return False + + +def strip_done_text(text: str, req_id: str) -> str: + lines = [ln.rstrip("\n") for ln in (text or "").splitlines()] + if not lines: + return "" + i = len(lines) - 1 + while i >= 0 and lines[i].strip() == "": + i -= 1 + if i >= 0 and done_line_re(req_id).match(lines[i] or ""): + lines = lines[:i] + return "\n".join(lines).rstrip() + + +@dataclass(frozen=True) +class CaskdRequest: + client_id: str + work_dir: str + timeout_s: float + quiet: bool + message: str + output_path: str | None = None + + +@dataclass(frozen=True) +class CaskdResult: + exit_code: int + reply: str + req_id: str + session_key: str + log_path: str | None + anchor_seen: bool + done_seen: bool + fallback_scan: bool + anchor_ms: int | None = None + done_ms: int | None = None + diff --git a/lib/caskd_session.py b/lib/caskd_session.py new file mode 100644 index 0000000..bbdbd2b --- /dev/null +++ b/lib/caskd_session.py @@ -0,0 +1,137 @@ +from __future__ import annotations + +import json +import os +import time +from dataclasses import dataclass +from pathlib import Path +from typing import Optional, Tuple + +from ccb_config import apply_backend_env +from session_utils import safe_write_session +from terminal import get_backend_for_session + +apply_backend_env() + + +def find_project_session_file(work_dir: Path) -> Optional[Path]: + current = Path(work_dir) + while current != current.parent: + candidate = current / ".codex-session" + if candidate.exists(): + return candidate + current = current.parent + return None + + +def _read_json(path: Path) -> dict: + try: + raw = path.read_text(encoding="utf-8-sig") + obj = json.loads(raw) + return obj if isinstance(obj, dict) else {} + except Exception: + return {} + + +def _now_str() -> str: + return time.strftime("%Y-%m-%d %H:%M:%S") + + +@dataclass +class CodexProjectSession: + session_file: Path + data: dict + + @property + def terminal(self) -> str: + return (self.data.get("terminal") or "tmux").strip() or "tmux" + + @property + def pane_id(self) -> str: + v = self.data.get("pane_id") if self.terminal in ("wezterm", "iterm2") else self.data.get("tmux_session") + return str(v or "").strip() + + @property + def pane_title_marker(self) -> str: + return str(self.data.get("pane_title_marker") or "").strip() + + @property + def codex_session_path(self) -> str: + return str(self.data.get("codex_session_path") or "").strip() + + @property + def codex_session_id(self) -> str: + return str(self.data.get("codex_session_id") or "").strip() + + @property + def work_dir(self) -> str: + return str(self.data.get("work_dir") or self.session_file.parent) + + def backend(self): + return get_backend_for_session(self.data) + + def ensure_pane(self) -> Tuple[bool, str]: + backend = self.backend() + if not backend: + return False, "Terminal backend not available" + pane_id = self.pane_id + if pane_id and backend.is_alive(pane_id): + return True, pane_id + marker = self.pane_title_marker + resolver = getattr(backend, "find_pane_by_title_marker", None) + if marker and callable(resolver): + resolved = resolver(marker) + if resolved: + self.data["pane_id"] = str(resolved) + self.data["updated_at"] = _now_str() + self._write_back() + return True, str(resolved) + return False, f"Pane not alive: {pane_id}" + + def update_codex_log_binding(self, *, log_path: Optional[str], session_id: Optional[str]) -> None: + updated = False + if log_path and self.data.get("codex_session_path") != log_path: + self.data["codex_session_path"] = log_path + updated = True + if session_id and self.data.get("codex_session_id") != session_id: + self.data["codex_session_id"] = session_id + self.data["codex_start_cmd"] = f"codex resume {session_id}" + updated = True + if updated: + self.data["updated_at"] = _now_str() + if self.data.get("active") is False: + self.data["active"] = True + self._write_back() + + def _write_back(self) -> None: + payload = json.dumps(self.data, ensure_ascii=False, indent=2) + "\n" + ok, err = safe_write_session(self.session_file, payload) + if not ok: + # Best-effort: never raise (daemon should continue). + _ = err + + +def load_project_session(work_dir: Path) -> Optional[CodexProjectSession]: + session_file = find_project_session_file(work_dir) + if not session_file: + return None + data = _read_json(session_file) + if not data: + return None + return CodexProjectSession(session_file=session_file, data=data) + + +def compute_session_key(session: CodexProjectSession) -> str: + # Use a stable per-pane key for serialization. + # codex_session_id can change when the user runs `codex resume` inside the same pane; using it as a key + # can accidentally create a second worker and cause concurrent injection to the same pane. + marker = session.pane_title_marker + if marker: + return f"codex_marker:{marker}" + pane = session.pane_id + if pane: + return f"codex_pane:{pane}" + sid = session.codex_session_id + if sid: + return f"codex:{sid}" + return f"codex_file:{session.session_file}" diff --git a/lib/codex_comm.py b/lib/codex_comm.py index 7a9e549..236a5c3 100644 --- a/lib/codex_comm.py +++ b/lib/codex_comm.py @@ -241,6 +241,19 @@ def try_get_message(self, state: Dict[str, Any]) -> Tuple[Optional[str], Dict[st """Non-blocking read for reply""" return self._read_since(state, timeout=0.0, block=False) + def wait_for_event(self, state: Dict[str, Any], timeout: float) -> Tuple[Optional[Tuple[str, str]], Dict[str, Any]]: + """ + Block and wait for a new event. + + Returns: + ((role, text), new_state) or (None, state) on timeout. + """ + return self._read_event_since(state, timeout, block=True) + + def try_get_event(self, state: Dict[str, Any]) -> Tuple[Optional[Tuple[str, str]], Dict[str, Any]]: + """Non-blocking read for an event.""" + return self._read_event_since(state, timeout=0.0, block=False) + def latest_message(self) -> Optional[str]: """Get the latest reply directly""" # Always use _latest_log() to detect newer sessions @@ -366,6 +379,106 @@ def ensure_log() -> Path: if time.time() >= deadline: return None, {"log_path": log_path, "offset": offset} + def _read_event_since(self, state: Dict[str, Any], timeout: float, block: bool) -> Tuple[Optional[Tuple[str, str]], Dict[str, Any]]: + """ + Like _read_since(), but returns structured (role, text) events. + + Role is one of: "user", "assistant". + """ + deadline = time.time() + timeout + current_path = self._normalize_path(state.get("log_path")) + offset = state.get("offset", -1) + if not isinstance(offset, int): + offset = -1 + rescan_interval = min(2.0, max(0.2, timeout / 2.0)) + last_rescan = time.time() + + def ensure_log() -> Path: + candidates = [ + self._preferred_log if self._preferred_log and self._preferred_log.exists() else None, + current_path if current_path and current_path.exists() else None, + ] + for candidate in candidates: + if candidate: + return candidate + latest = self._scan_latest() + if latest: + self._preferred_log = latest + return latest + raise FileNotFoundError("Codex session log not found") + + while True: + try: + log_path = ensure_log() + except FileNotFoundError: + if not block: + return None, {"log_path": None, "offset": 0} + time.sleep(self._poll_interval) + if time.time() >= deadline: + return None, {"log_path": None, "offset": 0} + continue + + try: + size = log_path.stat().st_size + except OSError: + size = None + + if offset < 0: + offset = size if isinstance(size, int) else 0 + + with log_path.open("rb") as fh: + try: + if isinstance(size, int) and offset > size: + offset = size + fh.seek(offset, os.SEEK_SET) + except OSError: + offset = size if isinstance(size, int) else 0 + if not block: + return None, {"log_path": log_path, "offset": offset} + time.sleep(self._poll_interval) + continue + while True: + if block and time.time() >= deadline: + return None, {"log_path": log_path, "offset": offset} + pos_before = fh.tell() + raw_line = fh.readline() + if not raw_line: + break + if not raw_line.endswith(b"\n"): + fh.seek(pos_before) + break + offset = fh.tell() + line = raw_line.decode("utf-8", errors="ignore").strip() + if not line: + continue + try: + entry = json.loads(line) + except json.JSONDecodeError: + continue + event = self._extract_event(entry) + if event is not None: + return event, {"log_path": log_path, "offset": offset} + + if time.time() - last_rescan >= rescan_interval: + latest = self._scan_latest() + if latest and latest != log_path: + current_path = latest + self._preferred_log = latest + offset = 0 + if not block: + return None, {"log_path": current_path, "offset": offset} + time.sleep(self._poll_interval) + last_rescan = time.time() + continue + last_rescan = time.time() + + if not block: + return None, {"log_path": log_path, "offset": offset} + + time.sleep(self._poll_interval) + if time.time() >= deadline: + return None, {"log_path": log_path, "offset": offset} + @staticmethod def _extract_message(entry: dict) -> Optional[str]: entry_type = entry.get("type") @@ -433,6 +546,20 @@ def _extract_user_message(entry: dict) -> Optional[str]: return "\n".join(filter(None, texts)).strip() return None + @classmethod + def _extract_event(cls, entry: dict) -> Optional[Tuple[str, str]]: + """ + Extract a (role, text) event from a JSONL entry. + Role is "user" or "assistant". + """ + user_msg = cls._extract_user_message(entry) + if isinstance(user_msg, str) and user_msg.strip(): + return "user", user_msg.strip() + ai_msg = cls._extract_message(entry) + if isinstance(ai_msg, str) and ai_msg.strip(): + return "assistant", ai_msg.strip() + return None + def latest_conversations(self, n: int = 1) -> List[Tuple[str, str]]: """Get the latest n conversations (question, reply) pairs""" # Always use _latest_log() to detect newer sessions diff --git a/lib/i18n.py b/lib/i18n.py index 839f183..3d567e6 100644 --- a/lib/i18n.py +++ b/lib/i18n.py @@ -40,7 +40,7 @@ "runtime_dir": "Runtime dir: {runtime_dir}", "active_backends": "Active backends: {backends}", "available_commands": "Available commands:", - "codex_commands": "cask/cask-w/cping/cpend - Codex communication", + "codex_commands": "cask/cask-w/caskd/cping/cpend - Codex communication", "gemini_commands": "gask/gask-w/gping/gpend - Gemini communication", "executing": "Executing: {cmd}", "user_interrupted": "User interrupted", @@ -117,7 +117,7 @@ "runtime_dir": "运行目录: {runtime_dir}", "active_backends": "活动后端: {backends}", "available_commands": "可用命令:", - "codex_commands": "cask/cask-w/cping/cpend - Codex 通信", + "codex_commands": "cask/cask-w/caskd/cping/cpend - Codex 通信", "gemini_commands": "gask/gask-w/gping/gpend - Gemini 通信", "executing": "执行: {cmd}", "user_interrupted": "用户中断", diff --git a/lib/terminal.py b/lib/terminal.py index aa27c39..17ff2f8 100644 --- a/lib/terminal.py +++ b/lib/terminal.py @@ -432,6 +432,40 @@ def is_alive(self, pane_id: str) -> bool: return True return self._pane_id_by_title_marker(panes, pane_id) is not None + def get_text(self, pane_id: str, lines: int = 20) -> Optional[str]: + """Get text content from pane (last N lines).""" + try: + result = subprocess.run( + [*self._cli_base_args(), "get-text", "--pane-id", pane_id], + capture_output=True, + text=True, + encoding="utf-8", + errors="replace", + timeout=2.0, + ) + if result.returncode != 0: + return None + text = result.stdout + if lines and text: + text_lines = text.splitlines() + return "\n".join(text_lines[-lines:]) + return text + except Exception: + return None + + def send_key(self, pane_id: str, key: str) -> bool: + """Send a special key (e.g., 'Escape', 'Enter') to pane.""" + try: + result = subprocess.run( + [*self._cli_base_args(), "send-text", "--pane-id", pane_id, "--no-paste"], + input=key.encode("utf-8"), + capture_output=True, + timeout=2.0, + ) + return result.returncode == 0 + except Exception: + return False + def kill_pane(self, pane_id: str) -> None: subprocess.run([*self._cli_base_args(), "kill-pane", "--pane-id", pane_id], stderr=subprocess.DEVNULL) From 663924917055045c69b8aab2b972445dfdac9eb6 Mon Sep 17 00:00:00 2001 From: bfly Date: Fri, 9 Jan 2026 23:35:45 +0800 Subject: [PATCH 143/153] v3.0.0: Smart Daemon Architecture - Add smart daemon layer (caskd/gaskd/oaskd) with per-session queues, auto-start and idle auto-exit - Enable stable cross-AI coordination (Claude/Codex/Gemini/OpenCode) with session_key serialization - Support chained calls across agents without reply mixing - Improve platform compatibility and harden direct-mode locking fallback --- .gitignore | 1 + AGENTS.md | 7 + README.md | 87 ++++- README_zh.md | 103 +++++- bin/cask | 27 +- bin/gask | 263 ++++++++++---- bin/gaskd | 55 +++ bin/oask | 357 ++++++++++++++++--- bin/oaskd | 55 +++ docs/caskd-wezterm-daemon-plan.md | 357 +++++++++++++++++++ install.ps1 | 10 +- install.sh | 2 + lib/caskd_daemon.py | 49 +++ lib/gaskd_daemon.py | 557 +++++++++++++++++++++++++++++ lib/gaskd_protocol.py | 83 +++++ lib/gaskd_session.py | 121 +++++++ lib/oaskd_daemon.py | 573 ++++++++++++++++++++++++++++++ lib/oaskd_protocol.py | 44 +++ lib/oaskd_session.py | 141 ++++++++ lib/opencode_comm.py | 288 ++++++++++++++- lib/terminal.py | 5 +- 21 files changed, 3034 insertions(+), 151 deletions(-) create mode 100644 AGENTS.md create mode 100644 bin/gaskd create mode 100644 bin/oaskd create mode 100644 docs/caskd-wezterm-daemon-plan.md create mode 100644 lib/gaskd_daemon.py create mode 100644 lib/gaskd_protocol.py create mode 100644 lib/gaskd_session.py create mode 100644 lib/oaskd_daemon.py create mode 100644 lib/oaskd_protocol.py create mode 100644 lib/oaskd_session.py diff --git a/.gitignore b/.gitignore index 0cac41b..d310f0a 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ tests/ .gemini-session .claude-session .opencode-session +opencode.json .claude/ *.mp4 tmp/ diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..4f8a71c --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,7 @@ +## Auto-Delegation to OpenCode + +When executor=codex+opencode: +1. Break down the task into steps +2. Use oask to delegate to OpenCode +3. Review results and iterate +4. Return final result diff --git a/README.md b/README.md index f8d159c..5197728 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@
-# Claude Code Bridge (ccb) v2.3.9 +# Claude Code Bridge (ccb) v3.0.0 **Silky Smooth Claude & Codex & Gemini Collaboration via Split-Pane Terminal** @@ -15,7 +15,7 @@ Every Model Controllable

-[![Version](https://img.shields.io/badge/version-2.3.9-orange.svg)]() +[![Version](https://img.shields.io/badge/version-3.0.0-orange.svg)]() [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) [![Platform](https://img.shields.io/badge/platform-Linux%20%7C%20macOS%20%7C%20Windows-lightgrey.svg)]() @@ -41,6 +41,82 @@ --- +

🚀 What's New in v3.0

+ +> **The Ultimate Bridge for Cross-AI Collaboration** + +v3.0 brings a revolutionary architecture change with **Smart Daemons**, enabling parallel execution, cross-agent coordination, and enterprise-grade stability. + +
+ +![Parallel](https://img.shields.io/badge/Strategy-Parallel_Queue-blue?style=flat-square) +![Stability](https://img.shields.io/badge/Daemon-Auto_Managed-green?style=flat-square) +![Interruption](https://img.shields.io/badge/Gemini-Interruption_Aware-orange?style=flat-square) + +
+ +

✨ Key Features

+ +- **🔄 True Parallelism**: Submit multiple tasks to Codex, Gemini, or OpenCode simultaneously. The new daemons (`caskd`, `gaskd`, `oaskd`) automatically queue and execute them serially, ensuring no context pollution. +- **🤝 Cross-AI Orchestration**: Claude and Codex can now simultaneously drive OpenCode agents. All requests are arbitrated by the unified daemon layer. +- **🛡️ Bulletproof Stability**: Daemons are self-managing—they start automatically on the first request and shut down after 60s of idleness to save resources. +- **⚡ Chained Execution**: Advanced workflows supported! Codex can autonomously call `oask` to delegate sub-tasks to OpenCode models. +- **🛑 Smart Interruption**: Gemini tasks now support intelligent interruption detection, automatically handling stops and ensuring workflow continuity. + +

🧩 Feature Support Matrix

+ +| Feature | `caskd` (Codex) | `gaskd` (Gemini) | `oaskd` (OpenCode) | +| :--- | :---: | :---: | :---: | +| **Parallel Queue** | ✅ | ✅ | ✅ | +| **Interruption Awareness** | ✅ | ✅ | - | +| **Response Isolation** | ✅ | ✅ | ✅ | + +
+📊 View Real-world Stress Test Results + +
+ +**Scenario 1: Claude & Codex Concurrent Access to OpenCode** +*Both agents firing requests simultaneously, perfectly coordinated by the daemon.* + +| Source | Task | Result | Status | +| :--- | :--- | :--- | :---: | +| 🤖 Claude | `CLAUDE-A` | **CLAUDE-A** | 🟢 | +| 🤖 Claude | `CLAUDE-B` | **CLAUDE-B** | 🟢 | +| 💻 Codex | `CODEX-A` | **CODEX-A** | 🟢 | +| 💻 Codex | `CODEX-B` | **CODEX-B** | 🟢 | + +**Scenario 2: Recursive/Chained Calls** +*Codex autonomously driving OpenCode for a 5-step workflow.* + +| Request | Exit Code | Response | +| :--- | :---: | :--- | +| **ONE** | `0` | `CODEX-ONE` | +| **TWO** | `0` | `CODEX-TWO` | +| **THREE** | `0` | `CODEX-THREE` | +| **FOUR** | `0` | `CODEX-FOUR` | +| **FIVE** | `0` | `CODEX-FIVE` | + +
+ +--- + +

🧠 Introducing CCA (Claude Code Autoflow)

+ +Unlock the full potential of `ccb` with **CCA** — an advanced workflow automation system built on top of this bridge. + +* **Workflow Automation**: Intelligent task assignment and automated state management. +* **Seamless Integration**: Native support for the v3.0 daemon architecture. + +[👉 View Project on GitHub](https://github.com/bfly123/claude_code_autoflow) + +**Install via CCB:** +```bash +ccb update cca +``` + +--- + ## 🚀 Quick Start **Step 1:** Install [WezTerm](https://wezfurlong.org/wezterm/) (native `.exe` for Windows) @@ -298,6 +374,13 @@ Once started, collaborate naturally. Claude will detect when to delegate tasks.
Version History +### v3.0.0 +- **Smart Daemons**: `caskd`/`gaskd`/`oaskd` with 60s idle timeout & parallel queue support +- **Cross-AI Collaboration**: Support multiple agents (Claude/Codex) calling one agent (OpenCode) simultaneously +- **Interruption Detection**: Gemini now supports intelligent interruption handling +- **Chained Execution**: Codex can call `oask` to drive OpenCode +- **Stability**: Robust queue management and lock files + ### v2.3.9 - Fix oask session tracking bug - follow new session when OpenCode creates one diff --git a/README_zh.md b/README_zh.md index 13c10e9..881fdee 100644 --- a/README_zh.md +++ b/README_zh.md @@ -1,6 +1,6 @@
-# Claude Code Bridge (ccb) v2.3 +# Claude Code Bridge (ccb) v3.0.0 **基于终端分屏的 Claude & Codex & Gemini 丝滑协作工具** @@ -15,7 +15,7 @@ Every Model Controllable

-[![Version](https://img.shields.io/badge/version-2.3-orange.svg)]() +[![Version](https://img.shields.io/badge/version-3.0.0-orange.svg)]() [![Platform](https://img.shields.io/badge/platform-Linux%20%7C%20macOS%20%7C%20Windows-lightgrey.svg)]() [English](README.md) | **中文** @@ -39,6 +39,82 @@ --- +

🚀 v3.0 新版本特性

+ +> **跨 AI 协作的终极桥梁** + +v3.0 带来了革命性的 **智能守护进程 (Smart Daemons)** 架构,实现了并行执行、跨 Agent 协调和企业级稳定性。 + +
+ +![Parallel](https://img.shields.io/badge/Strategy-Parallel_Queue-blue?style=flat-square) +![Stability](https://img.shields.io/badge/Daemon-Auto_Managed-green?style=flat-square) +![Interruption](https://img.shields.io/badge/Gemini-Interruption_Aware-orange?style=flat-square) + +
+ +

✨ 核心特性

+ +- **🔄 真·并行**: 同时提交多个任务给 Codex、Gemini 或 OpenCode。新的守护进程 (`caskd`, `gaskd`, `oaskd`) 会自动将它们排队并串行执行,确保上下文不被污染。 +- **🤝 跨 AI 编排**: Claude 和 Codex 现在可以同时驱动 OpenCode Agent。所有请求都由统一的守护进程层仲裁。 +- **🛡️ 坚如磐石**: 守护进程自我管理——首个请求自动启动,空闲 60 秒后自动关闭以节省资源。 +- **⚡ 链式调用**: 支持高级工作流!Codex 可以自主调用 `oask` 将子任务委派给 OpenCode 模型。 +- **🛑 智能打断**: Gemini 任务支持智能打断检测,自动处理停止信号并确保工作流连续性。 + +

🧩 功能支持矩阵

+ +| 特性 | `caskd` (Codex) | `gaskd` (Gemini) | `oaskd` (OpenCode) | +| :--- | :---: | :---: | :---: | +| **并行队列** | ✅ | ✅ | ✅ | +| **打断感知** | ✅ | ✅ | - | +| **响应隔离** | ✅ | ✅ | ✅ | + +
+📊 查看真实压力测试结果 + +
+ +**场景 1: Claude & Codex 同时访问 OpenCode** +*两个 Agent 同时发送请求,由守护进程完美协调。* + +| 来源 | 任务 | 结果 | 状态 | +| :--- | :--- | :--- | :---: | +| 🤖 Claude | `CLAUDE-A` | **CLAUDE-A** | 🟢 | +| 🤖 Claude | `CLAUDE-B` | **CLAUDE-B** | 🟢 | +| 💻 Codex | `CODEX-A` | **CODEX-A** | 🟢 | +| 💻 Codex | `CODEX-B` | **CODEX-B** | 🟢 | + +**场景 2: 递归/链式调用** +*Codex 自主驱动 OpenCode 执行 5 步工作流。* + +| 请求 | 退出码 | 响应 | +| :--- | :---: | :--- | +| **ONE** | `0` | `CODEX-ONE` | +| **TWO** | `0` | `CODEX-TWO` | +| **THREE** | `0` | `CODEX-THREE` | +| **FOUR** | `0` | `CODEX-FOUR` | +| **FIVE** | `0` | `CODEX-FIVE` | + +
+ +--- + +

🧠 介绍 CCA (Claude Code Autoflow)

+ +释放 `ccb` 的全部潜力 —— **CCA** 是基于本桥接工具构建的高级工作流自动化系统。 + +* **工作流自动化**: 智能任务分配和自动化状态管理。 +* **无缝集成**: 原生支持 v3.0 守护进程架构。 + +[👉 在 GitHub 上查看项目](https://github.com/bfly123/claude_code_autoflow) + +**通过 CCB 安装:** +```bash +ccb update cca +``` + +--- + ## 🚀 快速开始 **第一步:** 安装 [WezTerm](https://wezfurlong.org/wezterm/)(Windows 请安装原生 `.exe` 版本) @@ -330,17 +406,12 @@ echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zprofile --- -
- -**Windows 完全支持** (WSL + 原生 Windows 均通过 WezTerm) - ---- - -**测试用户群,欢迎加入** - -📧 Email: bfly123@126.com -💬 WeChat: seemseam-com - -微信群 - -
+
+更新历史 + +### v3.0.0 +- **智能守护进程**: `caskd`/`gaskd`/`oaskd` 支持 60秒空闲超时和并行队列 +- **跨 AI 协作**: 支持多个 Agent (Claude/Codex) 同时调用同一个 Agent (OpenCode) +- **打断检测**: Gemini 现在支持智能打断处理 +- **链式执行**: Codex 可以调用 `oask` 驱动 OpenCode +- **稳定性**: 健壮的队列管理和锁文件机制 diff --git a/bin/cask b/bin/cask index b8590c9..ed1913f 100755 --- a/bin/cask +++ b/bin/cask @@ -289,7 +289,14 @@ def _maybe_start_caskd() -> bool: candidates.append(found) if not candidates: return False - argv = [sys.executable, candidates[0]] if candidates[0].endswith(".py") else [candidates[0]] + entry = candidates[0] + lower = entry.lower() + # On Windows, prefer invoking via the running Python unless we found a real executable wrapper + # (e.g. caskd.cmd/caskd.bat) to avoid relying on shebang/extension handling. + if lower.endswith((".cmd", ".bat", ".exe")): + argv = [entry] + else: + argv = [sys.executable, entry] try: kwargs = {"stdin": subprocess.DEVNULL, "stdout": subprocess.DEVNULL, "stderr": subprocess.DEVNULL, "close_fds": True} if os.name == "nt": @@ -301,6 +308,22 @@ def _maybe_start_caskd() -> bool: except Exception: return False +def _wait_for_caskd_ready(timeout_s: float = 2.0) -> bool: + try: + from caskd_daemon import ping_daemon + except Exception: + return False + deadline = time.time() + max(0.1, float(timeout_s)) + state_file = _state_file_from_env() + while time.time() < deadline: + try: + if ping_daemon(timeout_s=0.2, state_file=state_file): + return True + except Exception: + pass + time.sleep(0.1) + return False + def _usage() -> None: print("Usage: cask [--timeout SECONDS] [--output FILE] ", file=sys.stderr) @@ -401,7 +424,7 @@ def main(argv: list[str]) -> int: daemon_result = _try_daemon_request(Path.cwd(), message, timeout, quiet) if daemon_result is None and _maybe_start_caskd(): # Give daemon a moment to write state file and start listening, then retry once. - time.sleep(0.2) + _wait_for_caskd_ready(timeout_s=min(2.0, max(0.2, float(timeout)))) daemon_result = _try_daemon_request(Path.cwd(), message, timeout, quiet) if daemon_result is not None: reply, exit_code = daemon_result diff --git a/bin/gask b/bin/gask index 92c7eb3..088cec8 100755 --- a/bin/gask +++ b/bin/gask @@ -8,7 +8,10 @@ If --output is provided, the reply is written atomically to that file and stdout from __future__ import annotations +import json import os +import socket +import shutil import subprocess import sys from pathlib import Path @@ -22,74 +25,181 @@ from process_lock import ProviderLock from cli_output import EXIT_ERROR, EXIT_NO_REPLY, EXIT_OK, atomic_write_text -COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "EXECUTION_COMPLETE").strip() or "EXECUTION_COMPLETE" - import time -def _has_completion_marker(text: str) -> bool: - """Check if last line contains COMPLETION_MARKER (flexible match).""" - lines = text.rstrip().splitlines() - return bool(lines) and COMPLETION_MARKER in lines[-1] +def _env_bool(name: str, default: bool) -> bool: + raw = os.environ.get(name) + if raw is None or raw == "": + return default + v = raw.strip().lower() + if v in ("0", "false", "no", "off"): + return False + if v in ("1", "true", "yes", "on"): + return True + return default + + +def _gaskd_autostart_enabled(default: bool = True) -> bool: + # Prefer the new name; keep CCB_AUTO_GASKD for backwards compatibility. + if "CCB_GASKD_AUTOSTART" in os.environ: + return _env_bool("CCB_GASKD_AUTOSTART", default) + if "CCB_AUTO_GASKD" in os.environ: + return _env_bool("CCB_AUTO_GASKD", default) + return default + + +def _state_file_from_env() -> Path | None: + raw = (os.environ.get("CCB_GASKD_STATE_FILE") or "").strip() + if not raw: + return None + try: + return Path(raw).expanduser() + except Exception: + return None + + +def _find_project_session_file(work_dir: Path) -> Path | None: + current = Path(work_dir).resolve() + while True: + candidate = current / ".gemini-session" + if candidate.exists(): + return candidate + if current == current.parent: + return None + current = current.parent + + +def _try_daemon_request(work_dir: Path, message: str, timeout: float, quiet: bool) -> tuple[str, int] | None: + if not _env_bool("CCB_GASKD", True): + return None + + if not _find_project_session_file(work_dir): + return None + + from gaskd_daemon import read_state + + st = read_state(state_file=_state_file_from_env()) + if not st: + return None + try: + host = st.get("connect_host") or st.get("host") + port = int(st["port"]) + token = st["token"] + except Exception: + return None + + try: + payload = { + "type": "gask.request", + "v": 1, + "id": f"gask-{os.getpid()}-{int(time.time() * 1000)}", + "token": token, + "work_dir": str(work_dir), + "timeout_s": float(timeout), + "quiet": bool(quiet), + "message": message, + } + connect_timeout = min(1.0, max(0.1, float(timeout))) + with socket.create_connection((host, port), timeout=connect_timeout) as sock: + sock.settimeout(0.5) + sock.sendall((json.dumps(payload, ensure_ascii=False) + "\n").encode("utf-8")) + buf = b"" + deadline = time.time() + float(timeout) + 5.0 + while b"\n" not in buf and time.time() < deadline: + try: + chunk = sock.recv(65536) + except socket.timeout: + continue + if not chunk: + break + buf += chunk + if b"\n" not in buf: + return None + line = buf.split(b"\n", 1)[0].decode("utf-8", errors="replace") + resp = json.loads(line) + if resp.get("type") != "gask.response": + return None + reply = str(resp.get("reply") or "") + exit_code = int(resp.get("exit_code", 1)) + return reply, exit_code + except Exception: + return None + +def _maybe_start_gaskd() -> bool: + if not _env_bool("CCB_GASKD", True): + return False + if not _gaskd_autostart_enabled(True): + return False + if not _find_project_session_file(Path.cwd()): + return False -def _strip_completion_marker(text: str) -> str: - """Remove the trailing marker line if it contains COMPLETION_MARKER.""" - lines = text.rstrip().splitlines() - if lines and COMPLETION_MARKER in lines[-1]: - return "\n".join(lines[:-1]).rstrip() - return text.rstrip() + candidates: list[str] = [] + local = (Path(__file__).resolve().parent / "gaskd") + if local.exists(): + candidates.append(str(local)) + found = shutil.which("gaskd") + if found: + candidates.append(found) + if not candidates: + return False + entry = candidates[0] + lower = entry.lower() + if lower.endswith((".cmd", ".bat", ".exe")): + argv = [entry] + else: + argv = [sys.executable, entry] + try: + kwargs = {"stdin": subprocess.DEVNULL, "stdout": subprocess.DEVNULL, "stderr": subprocess.DEVNULL, "close_fds": True} + if os.name == "nt": + kwargs["creationflags"] = getattr(subprocess, "DETACHED_PROCESS", 0) | getattr(subprocess, "CREATE_NEW_PROCESS_GROUP", 0) + else: + kwargs["start_new_session"] = True + subprocess.Popen(argv, **kwargs) + return True + except Exception: + return False -def _wait_for_complete_reply(log_reader, state: dict, timeout: float, quiet: bool): - """Wait until reply ends with COMPLETION_MARKER or timeout.""" - from cli_output import EXIT_NO_REPLY, EXIT_OK - # Pre-check: try to read existing messages (may have arrived before we started) - existing_reply = None +def _wait_for_gaskd_ready(timeout_s: float = 2.0) -> bool: try: - existing_reply, state = log_reader.wait_for_message(state, timeout=0.1) - if existing_reply and _has_completion_marker(existing_reply): - return _strip_completion_marker(existing_reply), EXIT_OK + from gaskd_daemon import ping_daemon except Exception: - pass + return False + deadline = time.time() + max(0.1, float(timeout_s)) + state_file = _state_file_from_env() + while time.time() < deadline: + try: + if ping_daemon(timeout_s=0.2, state_file=state_file): + return True + except Exception: + pass + time.sleep(0.1) + return False + +def _wait_for_done_reply(log_reader, state: dict, timeout: float, req_id: str, quiet: bool): deadline = time.time() + timeout - chunks = [] - if existing_reply: - chunks.append(existing_reply) + latest = "" + + from gaskd_protocol import extract_reply_for_req, is_done_text while True: remaining = deadline - time.time() if remaining <= 0: break - reply, state = log_reader.wait_for_message(state, remaining) + reply, state = log_reader.wait_for_message(state, min(remaining, 1.0)) if reply is None: continue - chunks.append(reply) - if _has_completion_marker(reply): - combined = "\n".join(chunks) - return _strip_completion_marker(combined), EXIT_OK - - if chunks: - if not quiet: - print("[WARN] Marker not detected, returning partial reply", file=sys.stderr) - combined = "\n".join(chunks) - return _strip_completion_marker(combined), EXIT_NO_REPLY - return None, EXIT_NO_REPLY - + latest = str(reply) + if is_done_text(latest, req_id): + return extract_reply_for_req(latest, req_id), EXIT_OK -def _with_completion_marker_request(message: str) -> str: - if not message: - return message - if COMPLETION_MARKER in message: - return message - return ( - f"{message}\n\n" - "IMPORTANT:\n" - "- You MUST reply with a final response (do not stay silent).\n" - f"- End your reply with this exact line (verbatim):\n{COMPLETION_MARKER}\n" - ) + if latest and not quiet: + print("[WARN] Done marker not detected, returning partial reply", file=sys.stderr) + return extract_reply_for_req(latest, req_id), EXIT_NO_REPLY def _check_background_mode() -> bool: @@ -106,21 +216,6 @@ def _check_background_mode() -> bool: except Exception: return False - -def _popen_detached(argv: list[str]) -> None: - kwargs = { - "stdin": subprocess.DEVNULL, - "stdout": subprocess.DEVNULL, - "stderr": subprocess.DEVNULL, - "close_fds": True, - } - if os.name == "nt": - kwargs["creationflags"] = getattr(subprocess, "DETACHED_PROCESS", 0) | getattr(subprocess, "CREATE_NEW_PROCESS_GROUP", 0) - else: - kwargs["start_new_session"] = True - subprocess.Popen(argv, **kwargs) - - def main(argv: list[str]) -> int: if len(argv) <= 1 and sys.stdin.isatty(): print("Usage: gask [--timeout SECONDS] [--output FILE] ", file=sys.stderr) @@ -173,6 +268,7 @@ def main(argv: list[str]) -> int: try: from gemini_comm import GeminiCommunicator + from gaskd_protocol import make_req_id, wrap_gemini_prompt # Strict mode: require run_in_background=true in Claude Code if os.environ.get("CLAUDECODE") == "1" and not _check_background_mode(): @@ -180,15 +276,41 @@ def main(argv: list[str]) -> int: print("Correct usage: Bash(gask \"...\", run_in_background=true)", file=sys.stderr) return EXIT_ERROR + # Prefer daemon mode: daemon performs per-session serialization and should accept concurrent submissions. + daemon_result = _try_daemon_request(Path.cwd(), message, timeout, quiet) + if daemon_result is None and _maybe_start_gaskd(): + _wait_for_gaskd_ready(timeout_s=min(2.0, max(0.2, float(timeout)))) + daemon_result = _try_daemon_request(Path.cwd(), message, timeout, quiet) + if daemon_result is not None: + reply, exit_code = daemon_result + if output_path: + atomic_write_text(output_path, reply + "\n") + return exit_code + sys.stdout.write(reply) + if not reply.endswith("\n"): + sys.stdout.write("\n") + return exit_code + comm = GeminiCommunicator(lazy_init=True) healthy, status = comm._check_session_health_impl(probe_terminal=False) if not healthy: raise RuntimeError(f"[ERROR] Session error: {status}") - # Use per-provider lock to serialize request-response cycles (non-blocking) - lock = ProviderLock("gemini") - if not lock.try_acquire(): - print("[ERROR] Another gask request is in progress. Please wait and try again.", file=sys.stderr) + marker = str(comm.session_info.get("pane_title_marker") or "").strip() + if marker: + session_key = f"gemini_marker:{marker}" + elif comm.pane_id: + session_key = f"gemini_pane:{comm.pane_id}" + else: + sid = str(comm.session_info.get("gemini_session_id") or "").strip() + if sid: + session_key = f"gemini:{sid}" + else: + session_key = f"gemini_file:{comm.project_session_file or os.getcwd()}" + + lock = ProviderLock("gemini", cwd=f"session:{session_key}", timeout=min(300.0, max(1.0, float(timeout)))) + if not lock.acquire(): + print("[ERROR] Another gask request is in progress (lock timeout).", file=sys.stderr) return EXIT_ERROR try: @@ -197,10 +319,11 @@ def main(argv: list[str]) -> int: output_path.write_text("") # Reset log state to ignore any messages before lock acquisition - comm.log_reader.capture_state() + state = comm.log_reader.capture_state() - _, state = comm._send_message(_with_completion_marker_request(message)) - reply, exit_code = _wait_for_complete_reply(comm.log_reader, state, timeout, quiet) + req_id = make_req_id() + comm._send_via_terminal(wrap_gemini_prompt(message, req_id)) + reply, exit_code = _wait_for_done_reply(comm.log_reader, state, timeout, req_id, quiet) if reply is None: if not quiet: print(f"[TIMEOUT] Timeout after {int(timeout)}s", file=sys.stderr) diff --git a/bin/gaskd b/bin/gaskd new file mode 100644 index 0000000..ba34552 --- /dev/null +++ b/bin/gaskd @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +""" +gaskd - Gemini ask daemon. + +Implements Scheme-2: per-session serialized sending + session-file-driven reply extraction with req_id. +""" +from __future__ import annotations + +import argparse +import os +import sys +from pathlib import Path + +script_dir = Path(__file__).resolve().parent +lib_dir = script_dir.parent / "lib" +sys.path.insert(0, str(lib_dir)) + +from compat import setup_windows_encoding + +setup_windows_encoding() + +from gaskd_daemon import GaskdServer, shutdown_daemon + + +def _parse_listen(value: str) -> tuple[str, int]: + value = (value or "").strip() + if not value: + return "127.0.0.1", 0 + if ":" not in value: + return value, 0 + host, port_s = value.rsplit(":", 1) + return host or "127.0.0.1", int(port_s or "0") + + +def main(argv: list[str]) -> int: + ap = argparse.ArgumentParser(description="gask daemon (Gemini)") + ap.add_argument("--listen", default=os.environ.get("CCB_GASKD_LISTEN", "127.0.0.1:0"), help="host:port (default 127.0.0.1:0)") + ap.add_argument("--state-file", default=os.environ.get("CCB_GASKD_STATE_FILE", ""), help="Override state file path") + ap.add_argument("--shutdown", action="store_true", help="Shutdown running daemon") + args = ap.parse_args(argv[1:]) + + state_file = Path(args.state_file).expanduser() if args.state_file else None + + if args.shutdown: + ok = shutdown_daemon(state_file=state_file) + return 0 if ok else 1 + + host, port = _parse_listen(args.listen) + server = GaskdServer(host=host, port=port, state_file=state_file) + return server.serve_forever() + + +if __name__ == "__main__": + raise SystemExit(main(sys.argv)) + diff --git a/bin/oask b/bin/oask index 098f4c6..783fdc8 100755 --- a/bin/oask +++ b/bin/oask @@ -7,7 +7,11 @@ If --output is provided, the reply is written atomically to that file and stdout """ from __future__ import annotations +import json import os +import socket +import shutil +import subprocess import sys import time from pathlib import Path @@ -21,72 +25,281 @@ from compat import setup_windows_encoding setup_windows_encoding() from process_lock import ProviderLock -COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "EXECUTION_COMPLETE").strip() or "EXECUTION_COMPLETE" +def _env_bool(name: str, default: bool) -> bool: + raw = os.environ.get(name) + if raw is None or raw == "": + return default + v = raw.strip().lower() + if v in ("0", "false", "no", "off"): + return False + if v in ("1", "true", "yes", "on"): + return True + return default + + +def _oaskd_autostart_enabled(default: bool = True) -> bool: + # Prefer the new name; keep CCB_AUTO_OASKD for backwards compatibility. + if "CCB_OASKD_AUTOSTART" in os.environ: + return _env_bool("CCB_OASKD_AUTOSTART", default) + if "CCB_AUTO_OASKD" in os.environ: + return _env_bool("CCB_AUTO_OASKD", default) + return default + + +def _state_file_from_env() -> Optional[Path]: + raw = (os.environ.get("CCB_OASKD_STATE_FILE") or "").strip() + if not raw: + return None + try: + return Path(raw).expanduser() + except Exception: + return None + + +def _find_project_session_file(work_dir: Path) -> Optional[Path]: + current = Path(work_dir).resolve() + while True: + candidate = current / ".opencode-session" + if candidate.exists(): + return candidate + if current == current.parent: + return None + current = current.parent + + +def _try_daemon_request(work_dir: Path, message: str, timeout: float, quiet: bool) -> Optional[tuple[str, int]]: + if not _env_bool("CCB_OASKD", True): + return None + + if not _find_project_session_file(work_dir): + return None + + from oaskd_daemon import read_state + st = read_state(state_file=_state_file_from_env()) + if not st: + return None + try: + host = st.get("connect_host") or st.get("host") + port = int(st["port"]) + token = st["token"] + except Exception: + return None + + try: + payload = { + "type": "oask.request", + "v": 1, + "id": f"oask-{os.getpid()}-{int(time.time() * 1000)}", + "token": token, + "work_dir": str(work_dir), + "timeout_s": float(timeout), + "quiet": bool(quiet), + "message": message, + } + connect_timeout = min(1.0, max(0.1, float(timeout))) + with socket.create_connection((host, port), timeout=connect_timeout) as sock: + sock.settimeout(0.5) + sock.sendall((json.dumps(payload, ensure_ascii=False) + "\n").encode("utf-8")) + buf = b"" + deadline = time.time() + float(timeout) + 5.0 + while b"\n" not in buf and time.time() < deadline: + try: + chunk = sock.recv(65536) + except socket.timeout: + continue + if not chunk: + break + buf += chunk + if b"\n" not in buf: + return None + line = buf.split(b"\n", 1)[0].decode("utf-8", errors="replace") + resp = json.loads(line) + if resp.get("type") != "oask.response": + return None + reply = str(resp.get("reply") or "") + exit_code = int(resp.get("exit_code", 1)) + return reply, exit_code + except Exception: + return None + + +def _daemon_request_with_retries(work_dir: Path, message: str, timeout: float, quiet: bool) -> Optional[tuple[str, int]]: + """ + Best-effort daemon request with retries to avoid autostart races. + + Without this, a burst of concurrent `oask` invocations can fall back to direct mode + before the daemon is fully ready, causing only some requests to be submitted. + """ + # Fast path + result = _try_daemon_request(work_dir, message, timeout, quiet) + if result is not None: + return result + + # If daemon mode is disabled or no session, don't spin. + if not _env_bool("CCB_OASKD", True): + return None + if not _find_project_session_file(work_dir): + return None + + # Stale state files can block daemon mode (e.g. daemon exited/crashed but the json remains). + state_file = _state_file_from_env() + if state_file and state_file.exists(): + try: + from oaskd_daemon import ping_daemon + + if not ping_daemon(timeout_s=0.2, state_file=state_file): + try: + state_file.unlink() + except Exception: + pass + except Exception: + pass -def _has_completion_marker(text: str) -> bool: - """Check if last line contains COMPLETION_MARKER (flexible match).""" - lines = text.rstrip().splitlines() - return bool(lines) and COMPLETION_MARKER in lines[-1] + started = _maybe_start_oaskd() + if started: + _wait_for_oaskd_ready(timeout_s=_daemon_startup_wait_s(timeout)) + # Retry briefly; re-reading state helps when multiple daemons were attempted. + wait_s = _daemon_retry_wait_s(timeout) + deadline = time.time() + min(3.0, max(0.2, float(timeout))) + while time.time() < deadline: + result = _try_daemon_request(work_dir, message, timeout, quiet) + if result is not None: + return result + time.sleep(wait_s) -def _strip_completion_marker(text: str) -> str: - """Remove the trailing marker line if it contains COMPLETION_MARKER.""" - lines = text.rstrip().splitlines() - if lines and COMPLETION_MARKER in lines[-1]: - return "\n".join(lines[:-1]).rstrip() - return text.rstrip() + return None + + +def _maybe_start_oaskd() -> bool: + if not _env_bool("CCB_OASKD", True): + return False + if not _oaskd_autostart_enabled(True): + return False + if not _find_project_session_file(Path.cwd()): + return False + + candidates: list[str] = [] + local = (Path(__file__).resolve().parent / "oaskd") + if local.exists(): + candidates.append(str(local)) + found = shutil.which("oaskd") + if found: + candidates.append(found) + if not candidates: + return False + entry = candidates[0] + lower = entry.lower() + if lower.endswith((".cmd", ".bat", ".exe")): + argv = [entry] + else: + argv = [sys.executable, entry] + try: + kwargs = {"stdin": subprocess.DEVNULL, "stdout": subprocess.DEVNULL, "stderr": subprocess.DEVNULL, "close_fds": True} + if os.name == "nt": + kwargs["creationflags"] = getattr(subprocess, "DETACHED_PROCESS", 0) | getattr(subprocess, "CREATE_NEW_PROCESS_GROUP", 0) + else: + kwargs["start_new_session"] = True + subprocess.Popen(argv, **kwargs) + return True + except Exception: + return False -def _wait_for_complete_reply(log_reader, state: dict, timeout: float, quiet: bool): - """Wait until reply ends with COMPLETION_MARKER or timeout.""" - from cli_output import EXIT_NO_REPLY, EXIT_OK - # Pre-check: try to read existing messages (may have arrived before we started) - existing_reply = None +def _wait_for_oaskd_ready(timeout_s: float = 2.0) -> bool: try: - existing_reply, state = log_reader.wait_for_message(state, timeout=0.1) - if existing_reply and _has_completion_marker(existing_reply): - return _strip_completion_marker(existing_reply), EXIT_OK + from oaskd_daemon import ping_daemon except Exception: - pass + return False + deadline = time.time() + max(0.1, float(timeout_s)) + state_file = _state_file_from_env() + while time.time() < deadline: + try: + if ping_daemon(timeout_s=0.2, state_file=state_file): + return True + except Exception: + pass + time.sleep(0.1) + return False + + +def _daemon_startup_wait_s(timeout: float) -> float: + raw = (os.environ.get("CCB_OASKD_STARTUP_WAIT_S") or "").strip() + if raw: + try: + v = float(raw) + except Exception: + v = 0.0 + if v > 0: + return min(max(0.2, v), max(0.2, float(timeout))) + # Default: allow a bit more time for concurrent first-start races. + return min(8.0, max(1.0, float(timeout))) + + +def _daemon_retry_wait_s(timeout: float) -> float: + raw = (os.environ.get("CCB_OASKD_RETRY_WAIT_S") or "").strip() + if raw: + try: + v = float(raw) + except Exception: + v = 0.0 + if v > 0: + return min(1.0, max(0.05, v)) + return min(0.3, max(0.05, float(timeout) / 50.0)) + + +def _wait_for_done_reply(log_reader, state: dict, timeout: float, req_id: str, quiet: bool): + from cli_output import EXIT_ERROR, EXIT_NO_REPLY, EXIT_OK + from oaskd_protocol import is_done_text, strip_done_text deadline = time.time() + timeout - chunks = [] - if existing_reply: - chunks.append(existing_reply) + chunks: list[str] = [] + cancel_enabled = _env_bool("CCB_OASKD_CANCEL_DETECT", False) + session_id = state.get("session_id") if cancel_enabled and isinstance(state.get("session_id"), str) else None + cancel_cursor = log_reader.open_cancel_log_cursor() if cancel_enabled and session_id else None + cancel_since_s = time.time() if cancel_enabled else 0.0 while True: remaining = deadline - time.time() if remaining <= 0: break - reply, state = log_reader.wait_for_message(state, remaining) + reply, state = log_reader.wait_for_message(state, min(remaining, 1.0)) + + # Fallback cancellation detection via OpenCode server logs. + if cancel_enabled and session_id and cancel_cursor is not None: + try: + cancelled_log, cancel_cursor = log_reader.detect_cancel_event_in_logs( + cancel_cursor, session_id=session_id, since_epoch_s=cancel_since_s + ) + if cancelled_log: + return "❌ OpenCode request cancelled.", EXIT_ERROR + except Exception: + pass + + # OpenCode cancellation writes an assistant message with MessageAbortedError (no text parts). + # + # Important: do NOT advance the caller's state baseline when not cancelled (see oaskd_daemon). + if cancel_enabled: + try: + cancelled, _new_state = log_reader.detect_cancelled_since(state, req_id=req_id) + if cancelled: + return "❌ OpenCode request cancelled.", EXIT_ERROR + except Exception: + pass + if reply is None: continue chunks.append(reply) - if _has_completion_marker(reply): - combined = "\n".join(chunks) - return _strip_completion_marker(combined), EXIT_OK - - if chunks: - if not quiet: - print("[WARN] Marker not detected, returning partial reply", file=sys.stderr) combined = "\n".join(chunks) - return _strip_completion_marker(combined), EXIT_NO_REPLY - return None, EXIT_NO_REPLY - + if is_done_text(combined, req_id): + return strip_done_text(combined, req_id), EXIT_OK -def _with_completion_marker_request(message: str) -> str: - if not message: - return message - if COMPLETION_MARKER in message: - return message - return ( - f"{message}\n\n" - "IMPORTANT:\n" - "- You MUST reply with a final response (do not stay silent).\n" - f"- End your reply with this exact line (verbatim):\n{COMPLETION_MARKER}\n" - ) + combined = "\n".join(chunks) + if combined and not quiet: + print("[WARN] Done marker not detected, returning partial reply", file=sys.stderr) + return strip_done_text(combined, req_id), EXIT_NO_REPLY def _usage() -> None: @@ -151,6 +364,8 @@ def main(argv: list[str]) -> int: try: from cli_output import EXIT_ERROR, EXIT_NO_REPLY, EXIT_OK, atomic_write_text from opencode_comm import OpenCodeCommunicator + from opencode_comm import OpenCodeLogReader + from oaskd_protocol import make_req_id, wrap_opencode_prompt output_path, timeout, message, quiet = _parse_args(argv) if not message and not sys.stdin.isatty(): @@ -164,15 +379,50 @@ def main(argv: list[str]) -> int: print("Correct usage: Bash(oask \"...\", run_in_background=true)", file=sys.stderr) return EXIT_ERROR + # Prefer daemon mode: daemon performs per-session serialization and should accept concurrent submissions. + daemon_result = _daemon_request_with_retries(Path.cwd(), message, timeout, quiet) + if daemon_result is not None: + reply, exit_code = daemon_result + if output_path: + atomic_write_text(output_path, reply + "\n") + return exit_code + sys.stdout.write(reply) + if not reply.endswith("\n"): + sys.stdout.write("\n") + return exit_code + comm = OpenCodeCommunicator(lazy_init=True) healthy, status = comm._check_session_health_impl(probe_terminal=False) if not healthy: raise RuntimeError(f"[ERROR] Session error: {status}") - # Use per-provider lock to serialize request-response cycles (non-blocking) - lock = ProviderLock("opencode") - if not lock.try_acquire(): - print("[ERROR] Another oask request is in progress. Please wait and try again.", file=sys.stderr) + # Prefer the canonical session_key computation used by the daemon to avoid cross-mode + # serialization mismatches (e.g. if one caller sees marker while another doesn't). + try: + from oaskd_session import compute_session_key, load_project_session + + session = load_project_session(Path.cwd()) + except Exception: + session = None + + if session: + session_key = compute_session_key(session) + else: + marker = str(comm.session_info.get("pane_title_marker") or "").strip() + if marker: + session_key = f"opencode_marker:{marker}" + elif comm.pane_id: + session_key = f"opencode_pane:{comm.pane_id}" + else: + sid = str(comm.session_info.get("session_id") or comm.session_id or "").strip() + if sid: + session_key = f"opencode:{sid}" + else: + session_key = f"opencode_file:{comm.project_session_file or os.getcwd()}" + + lock = ProviderLock("opencode", cwd=f"session:{session_key}", timeout=min(300.0, max(1.0, float(timeout)))) + if not lock.acquire(): + print("[ERROR] Another oask request is in progress (lock timeout).", file=sys.stderr) return EXIT_ERROR try: @@ -180,11 +430,12 @@ def main(argv: list[str]) -> int: if output_path and output_path.exists(): output_path.write_text("") - # Reset log state to ignore any messages before lock acquisition - comm.log_reader.capture_state() + req_id = make_req_id() + log_reader = OpenCodeLogReader(work_dir=Path.cwd(), session_id_filter=(comm.session_id or None)) + state = log_reader.capture_state() + comm._send_via_terminal(wrap_opencode_prompt(message, req_id)) - _, state = comm._send_message(_with_completion_marker_request(message)) - reply, exit_code = _wait_for_complete_reply(comm.log_reader, state, timeout, quiet) + reply, exit_code = _wait_for_done_reply(log_reader, state, timeout, req_id, quiet) if reply is None: if not quiet: print(f"[TIMEOUT] Timeout after {int(timeout)}s", file=sys.stderr) diff --git a/bin/oaskd b/bin/oaskd new file mode 100644 index 0000000..82c5d8e --- /dev/null +++ b/bin/oaskd @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +""" +oaskd - OpenCode ask daemon. + +Implements Scheme-2: per-session serialized sending + storage-driven reply extraction with req_id. +""" +from __future__ import annotations + +import argparse +import os +import sys +from pathlib import Path + +script_dir = Path(__file__).resolve().parent +lib_dir = script_dir.parent / "lib" +sys.path.insert(0, str(lib_dir)) + +from compat import setup_windows_encoding + +setup_windows_encoding() + +from oaskd_daemon import OaskdServer, shutdown_daemon + + +def _parse_listen(value: str) -> tuple[str, int]: + value = (value or "").strip() + if not value: + return "127.0.0.1", 0 + if ":" not in value: + return value, 0 + host, port_s = value.rsplit(":", 1) + return host or "127.0.0.1", int(port_s or "0") + + +def main(argv: list[str]) -> int: + ap = argparse.ArgumentParser(description="oask daemon (OpenCode)") + ap.add_argument("--listen", default=os.environ.get("CCB_OASKD_LISTEN", "127.0.0.1:0"), help="host:port (default 127.0.0.1:0)") + ap.add_argument("--state-file", default=os.environ.get("CCB_OASKD_STATE_FILE", ""), help="Override state file path") + ap.add_argument("--shutdown", action="store_true", help="Shutdown running daemon") + args = ap.parse_args(argv[1:]) + + state_file = Path(args.state_file).expanduser() if args.state_file else None + + if args.shutdown: + ok = shutdown_daemon(state_file=state_file) + return 0 if ok else 1 + + host, port = _parse_listen(args.listen) + server = OaskdServer(host=host, port=port, state_file=state_file) + return server.serve_forever() + + +if __name__ == "__main__": + raise SystemExit(main(sys.argv)) + diff --git a/docs/caskd-wezterm-daemon-plan.md b/docs/caskd-wezterm-daemon-plan.md new file mode 100644 index 0000000..a1d35fe --- /dev/null +++ b/docs/caskd-wezterm-daemon-plan.md @@ -0,0 +1,357 @@ +# 方案2(最终形态):`caskd`(WezTerm)——稳定、跨系统、可并行的 Codex 同步问答守护进程(详细执行方案) + +适用范围:本仓库当前架构(`bin/cask` 发送;`lib/codex_comm.py` 从 `~/.codex/sessions/**/*.jsonl` 读回;WezTerm 模式通过 `wezterm cli send-text` 注入)。 + +目标:把 `cask` 的“回复提取”从“读到第一条 assistant 就返回”升级为“请求↔回复强关联”,并在 **不同工作目录** 使用 **不同 Codex session/pane** 时实现真正并行(互不阻塞、互不串台)。 + +--- + +## 1. 现状与问题(为什么要上方案2) + +### 1.1 现状(简述) +- **发送路径(WezTerm)**:直接把用户文本注入 Codex TUI pane(不带可关联的请求 ID)。 +- **接收路径**:从 Codex 官方 JSONL 日志中“从 offset 往后读”,抽取到一条 assistant 文本就返回。 +- **完成判定**:依赖一个固定字符串 marker(默认 `EXECUTION_COMPLETE`),且通常是“最后一行包含子串即完成”。 + +### 1.2 核心不稳定点(必须解决) +- **缺乏请求↔回复关联**:日志读取只认“下一条 assistant”,任何手动输入/其他脚本/并发请求都可能造成串台。 +- **并发粒度不对**:当前锁偏向“按目录”而不是“按 session”,不同目录共享同一 session 时会绕开锁,导致乱序注入 + 互读对方回复。 +- **marker 误判/短路**:固定子串既可能被用户问题触发导致不追加结束约束,也可能被模型自然输出触发误判完成。 + +--- + +## 2. 方案2总览(核心原则:三件事缺一不可) + +### 2.1 三个核心策略 +1) **请求级 `req_id` 协议**:每次请求生成高熵 `req_id`,把它写进发给 Codex 的 user 消息中,并要求 assistant 以严格的独占行 `CCB_DONE: ` 结束。 +2) **日志锚定配对**:从 JSONL 日志里先定位该 `req_id` 的 user 锚点,再收集 assistant 输出直到 `CCB_DONE: `。 +3) **session 粒度队列**:同一 `session_key`(同一 Codex session/pane)只能串行发送;不同 `session_key` 并行。 + +### 2.2 为什么需要守护进程 `caskd` +即便你把“锚定配对”做对了,如果多个 `cask` 进程同时调用 `wezterm cli` 注入,仍会出现: +- 注入乱序/交错(TUI 输入通道是单路串行的); +- 多进程反复扫描日志,性能差且容易踩到边界; +- `.codex-session` 的 session 绑定无法被统一修正与跟随更新。 + +`caskd` 把这些问题集中治理: +- 每个 session 一个发送队列(串行化注入); +- 每个 session 一个日志 tailer(复用读取,按 `req_id` 分发); +- 统一维护 `.codex-session`(根据“锚点观测”动态修正)。 + +--- + +## 3. 设计目标与非目标 + +### 3.1 设计目标 +- **稳定**:不串台;不误判完成;对日志切换/会话恢复更鲁棒。 +- **跨系统**:Linux/macOS/Windows/WSL 统一行为(WezTerm 为主)。 +- **可并行**: + - 不同 `session_key`:并行执行(互不影响)。 + - 同一 `session_key`:并行等待、串行发送(物理限制)。 +- **兼容现有 CLI**:`cask` 参数、stdout/stderr、退出码、`--output` 行为不变。 + +### 3.2 非目标(明确边界) +- 不试图在同一 Codex TUI session 内实现真正并行“同时执行多个请求”(输入通道与上下文决定了必须串行提交)。 +- 不依赖 Codex 官方提供 request_id(当前日志结构不稳定,不能假设存在)。 + +--- + +## 4. 组件与职责 + +### 4.1 新增/改造组件 +- `bin/cask`:客户端(保持用户接口);优先走 daemon;失败可 fallback(可配置)。 +- `bin/caskd`:守护进程;提供本地 RPC;管理 per-session worker、日志 tail、`.codex-session` 更新。 + +### 4.2 复用既有组件 +- `lib/terminal.py`:复用 `WeztermBackend.send_text()`(enter 重试、paste/no-paste 策略、WSL/Windows 兼容)。 +- `lib/codex_comm.py`:复用 JSONL tail 框架,但需要扩展成 **事件级**(同时识别 user+assistant)。 +- `lib/process_lock.py`:可用于 `caskd` 单实例锁(全局 lockfile),也可用于 client fallback 模式。 + +--- + +## 5. 协议(最关键的稳定性来源) + +### 5.1 Codex 对话内协议(req_id + done 行) + +#### req_id 生成 +推荐:`uuid4().hex` 或 `secrets.token_hex(16)`(>=128bit)。 + +#### 发送给 Codex 的最终文本模板(必须严格) +要求: +- `CCB_REQ_ID` 行必须是独占一行; +- `CCB_DONE` 行必须是 **最后一个非空行**; +- 完成判定必须是严格匹配,不用子串包含。 + +模板: +```text +CCB_REQ_ID: + +<用户原始 message> + +IMPORTANT: +- Reply normally. +- End your reply with this exact final line (verbatim, on its own line): +CCB_DONE: +``` + +#### 完成判定与剥离 +- 将已收集文本按行 `splitlines()`; +- 找到最后一个非空行; +- **仅当**其严格等于 `CCB_DONE: ` 才视为完成; +- 返回时剥离该行(以及其后的空白)。 + +> 这一步直接规避现有固定 marker 的短路/误判。 + +--- + +### 5.2 `cask` ↔ `caskd` IPC 协议(跨系统稳定) + +#### 传输 +- 本地 TCP:`127.0.0.1:`(跨平台统一;避免 Unix domain socket 在 Windows 的坑)。 +- 帧格式:newline-delimited JSON(每行一个 JSON,对调试友好)。 +- 认证:daemon 启动生成随机 token;客户端请求必须带 token(状态文件权限 0600)。 + +#### 请求格式(示例) +```json +{ + "type": "cask.request", + "v": 1, + "id": "client_req_uuid", + "work_dir": "/path/to/proj", + "timeout_s": 3600, + "quiet": false, + "message": "..." +} +``` + +#### 响应格式(示例) +```json +{ + "type": "cask.response", + "v": 1, + "id": "client_req_uuid", + "req_id": "generated_req_id", + "exit_code": 0, + "reply": "...", + "meta": { + "session_key": "...", + "log_path": "...", + "fallback_scan": false, + "anchor_seen": true, + "done_seen": true, + "anchor_ms": 120, + "done_ms": 980 + } +} +``` + +#### 退出码(与现有 `cli_output` 对齐) +- `0`:完成(命中 `CCB_DONE:`)。 +- `2`:超时/未完成(允许返回 partial)。 +- `1`:错误(session 不健康、pane 不存在、日志不可读等)。 + +--- + +## 6. Session 路由、绑定与 `.codex-session` 动态维护 + +### 6.1 `.codex-session` 的定位规则(work_dir → session 文件) +对请求中的 `work_dir` 执行“向上查找”: +- `work_dir/.codex-session` +- `work_dir/../.codex-session` +- …直到根目录 + +> 注意:daemon **不能**使用 `Path.cwd()` 这种隐式行为,必须全程以入参 `work_dir` 为准。 + +### 6.2 session_key 的选择(队列/锁粒度) +优先级: +1) `.codex-session.codex_session_id`(最稳定,来自官方 log 的 UUID)。 +2) `.codex-session.pane_title_marker`(WezTerm 可重定位)。 +3) `.codex-session.pane_id`(最后兜底;pane 可能重建)。 + +### 6.3 WezTerm pane 自愈(防 pane_id 过期) +发送前检查: +- 如果 `pane_id` 不存在:用 `pane_title_marker` 调 `WeztermBackend.find_pane_by_title_marker(marker)` 重定位。 +- 重定位成功则更新 `.codex-session.pane_id`(可选,但推荐)。 + +### 6.4 “绑定不会失败”的关键:以 req_id 锚点观测为真相 +`.codex-session` 仅作为缓存提示。真正绑定由本次请求的 `req_id` 决定: +- 在某个 `log_path` 中观测到 user 锚点(包含 `CCB_REQ_ID:`)或 done 行(包含 `CCB_DONE:`),即可确认该请求属于此 `log_path`/session。 + +### 6.5 跟随对话更新(session 切换/日志轮转) +当观测到 `req_id` 实际落在某个 `log_path` 后: +1) 从 `log_path` 提取 `codex_session_id`(文件名或首行 `session_meta` 等)。 +2) 写回 `.codex-session`: + - `codex_session_path` + - `codex_session_id` + - `updated_at` + - `active`(必要时修正) + +推荐复用本仓库已有的更新逻辑思路(类似 `CodexCommunicator._remember_codex_session(log_path)`),但要做到 **可传入 session_file 路径**。 + +> 结果:用户在 pane 内 `codex resume` 切换会话后,下一次请求会命中新 log 并自动更新 `.codex-session`,而不是靠 mtime 猜。 + +--- + +## 7. 日志读取:事件级 tail(user+assistant) + +### 7.1 为什么必须事件级 +只抽 assistant 文本无法定位 user 锚点,无法构建“从锚点开始收集”的窗口,串台问题无法根治。 + +### 7.2 事件抽取要求 +从每行 JSONL entry 中抽取: +- `role`:`user` 或 `assistant`(最低要求) +- `text`:对应消息的文本(可能是多段 content 拼接) +- 其他:可选 `timestamp`、`entry_type`、`session_id` + +实现建议: +- 将现有逻辑整合成单一函数:`extract_event(entry) -> Optional[(role, text)]`。 +- 兼容多种 entry type(`response_item`、`event_msg`、以及 fallback `payload.role`)。 + +### 7.3 读取算法(稳健点) +复用现有 tailing 关键点: +- 二进制 `readline()`; +- 若末行无 `\n`,回退 offset 等待 writer 续写(避免 JSON 半行)。 + +### 7.4 req_id 状态机(per request watcher) +每个 `req_id` 一个 watcher,状态: +- `WAIT_ANCHOR`:等待 `role=user` 且 `text` 含 `CCB_REQ_ID:` +- `COLLECTING`:收集 `role=assistant` 的文本片段 +- `DONE`:assembled 文本最后非空行严格等于 `CCB_DONE:` +- `TIMEOUT`:超时,返回 partial(exit_code=2) + +### 7.5 fallback 扫描(保证锚点总能找到) +触发条件:发送后在 `preferred_log` 中 T 秒(建议 2~3s)未命中锚点(或 log 不存在)。 + +扫描策略(性能护栏必须有): +- 只扫描最近更新的 K 个日志文件(建议 K=20 或限定最近 N 分钟)。 +- 每个文件只读末尾 `tail_bytes`(建议 1~8MB),直接字符串搜索 `CCB_REQ_ID:` 或 `CCB_DONE:`。 +- 命中则切换到该 `log_path`,继续 tail,并写回 `.codex-session`。 + +--- + +## 8. 并发模型(如何实现“不同目录互不影响”) + +### 8.1 结构 +daemon 维护: +- `workers[session_key]`:每个 session 一个 worker(线程/协程均可) +- `queue[session_key]`:发送队列(FIFO) +- `watchers[req_id]`:每请求 watcher(由所属 session worker 驱动) + +### 8.2 并发保证 +- 不同 `session_key`:不同 worker 并行运行,互不影响。 +- 相同 `session_key`:队列串行发送(必须);watchers 可以并行等待完成。 + +### 8.3 公平性与吞吐(可选优化) +同一 session 队列可加: +- 最大排队长度; +- 请求取消; +- 超时后自动出队; +- “短请求优先”的策略(不建议默认启用,易惊喜)。 + +--- + +## 9. 安全与运维 + +### 9.1 daemon 单实例 +在 `~/.ccb/run/` 放置: +- `caskd.lock`:进程锁(记录 pid;stale 检测) +- `caskd.json`:状态文件(host/port/token/pid/version/started_at) + +权限建议:状态文件与锁文件至少 0600(仅用户可读写)。 + +### 9.2 客户端行为(`bin/cask`) +- 默认连接 daemon: + - 读 `~/.ccb/run/caskd.json` 获取连接信息; + - token 校验; +- 连接失败时: + - 若 `CCB_CASKD_AUTOSTART=1`:尝试启动 daemon(`Popen`),等待状态文件就绪; + - 否则 fallback 到直连模式(可配置禁用 fallback 以强制使用 daemon)。 + +### 9.3 观测性(强烈建议) +daemon 日志(例如 `~/.ccb/run/caskd.log`)至少记录: +- req_id、work_dir、session_key、log_path、是否 fallback、anchor/done 耗时、错误栈。 + +--- + +## 10. 详细实施步骤(一步到位也按这个任务拆解) + +### Step 0:新增公共协议模块(推荐) +新增 `lib/ccbd_protocol.py`(名字可调整),包含: +- `make_req_id()` +- `wrap_codex_prompt(message, req_id)` +- `extract_done(text, req_id)` / `strip_done(text, req_id)` +- IPC JSON schema(request/response) + +### Step 1:扩展 `lib/codex_comm.py` 支持事件级读取 +新增: +- `CodexLogReader.wait_for_event(state, timeout)`(返回 role/text/new_state) +- `CodexLogReader.try_get_event(state)`(非阻塞) + +注意: +- 现有 `wait_for_message()` 保持不破坏(兼容旧调用方)。 + +### Step 2:实现 `bin/caskd` +实现要点: +- TCP server(建议 `socketserver.ThreadingTCPServer` 或 asyncio); +- 状态文件写入; +- token 校验; +- 解析请求,路由到 `session_key` worker。 + +### Step 3:实现 session resolver 与 `.codex-session` 更新器 +新增 `lib/session_resolver.py`: +- `find_codex_session_file(work_dir)` +- `load_session_info(session_file)` +- `write_session_update(session_file, updates)` + +更新策略:只根据 req_id 锚点观测到的 log_path 更新(不要靠“最新 mtime”猜)。 + +### Step 4:实现 per-session worker(队列 + 注入 + tail + 分发) +worker 逻辑: +1) 从队列取请求 +2) `pane` 自愈定位 +3) 注入 wrapped prompt(含 req_id) +4) 在日志中等 user 锚点 → 收集 assistant → done +5) 返回结果给 RPC handler +6) 写回 `.codex-session`(log_path/session_id) + +### Step 5:改造 `bin/cask` 为 daemon client(保持 CLI 兼容) +- 参数解析不变; +- 结果写 `--output` 原子语义不变; +- 退出码不变; +- 增加 env 控制: + - `CCB_CASKD=1/0` + - `CCB_CASKD_AUTOSTART=1/0` + - `CCB_CASKD_ADDR=127.0.0.1:port`(可选) + +### Step 6:测试(建议最低保障) +不依赖真实 Codex: +- 用 fixtures 构造 JSONL 样本(含 user/assistant/done),测试 watcher 状态机与 event 抽取。 +- 单测协议模块(wrap/done/strip)。 +- 单测 fallback 扫描策略(K 与 tail_bytes 护栏生效)。 + +--- + +## 11. 一步到位上方案2:建议(避免大爆炸) + +如果你要“一次合并全部方案2”,强烈建议同时做到: +1) **保留直连 fallback**(daemon 失效时还能用;否则会成为单点故障)。 +2) **feature flag**(随时切回旧模式止血)。 +3) **严格兼容 CLI 行为**(参数/退出码/输出文件语义必须不变)。 +4) **性能护栏**(fallback 扫描限制 K、tail_bytes、时间窗;避免全盘扫描卡死)。 +5) **观测性默认开启**(至少可通过 `CCB_DEBUG` 打开 meta/log,排障成本大幅下降)。 + +--- + +## 12. 验收标准(上线前必须满足) +- 任意用户输入包含 `EXECUTION_COMPLETE`/`CCB_DONE` 等字样,不会导致死等或误判完成。 +- 两个不同目录、两个不同 Codex session 并发:互不阻塞、不串台。 +- 同一 session 并发:请求排队但不串台;每个请求都能拿到自己的 `req_id` 回复。 +- 在同一 pane 内 `codex resume` 切换 session:下一次请求能自动跟随新 log 并更新 `.codex-session`。 + +--- + +## 附:快捷用法(已实现) + +- `ccb up ...` 会在 WezTerm/iTerm2 且包含 `codex` 后端时自动拉起 `caskd`(无感)。 +- 如需禁用自动拉起:`CCB_AUTO_CASKD=0 ccb up codex` +- 手动启动/停止:`caskd` / `caskd --shutdown` diff --git a/install.ps1 b/install.ps1 index fb2651a..29ef1fc 100644 --- a/install.ps1 +++ b/install.ps1 @@ -28,8 +28,8 @@ $script:CCB_END_MARKER = "" $script:SCRIPTS_TO_LINK = @( "ccb", "cask", "cask-w", "caskd", "cpend", "cping", - "gask", "gask-w", "gpend", "gping", - "oask", "oask-w", "opend", "oping", + "gask", "gask-w", "gaskd", "gpend", "gping", + "oask", "oask-w", "oaskd", "opend", "oping", "ccb-layout" ) @@ -230,9 +230,9 @@ function Install-Native { $scripts = @( "ccb", - "cask", "cask-w", "cping", "cpend", - "gask", "gask-w", "gping", "gpend", - "oask", "oask-w", "oping", "opend", + "cask", "cask-w", "caskd", "cping", "cpend", + "gask", "gask-w", "gaskd", "gping", "gpend", + "oask", "oask-w", "oaskd", "oping", "opend", "ccb-layout" ) diff --git a/install.sh b/install.sh index 7775392..1a6ad6a 100755 --- a/install.sh +++ b/install.sh @@ -95,10 +95,12 @@ SCRIPTS_TO_LINK=( bin/cping bin/gask bin/gask-w + bin/gaskd bin/gpend bin/gping bin/oask bin/oask-w + bin/oaskd bin/opend bin/oping bin/ccb-layout diff --git a/lib/caskd_daemon.py b/lib/caskd_daemon.py index 1b81b82..b83537c 100644 --- a/lib/caskd_daemon.py +++ b/lib/caskd_daemon.py @@ -544,6 +544,10 @@ def serve_forever(self) -> int: class Handler(socketserver.StreamRequestHandler): def handle(self) -> None: + with self.server.activity_lock: + self.server.active_requests += 1 + self.server.last_activity = time.time() + try: line = self.rfile.readline() if not line: @@ -614,15 +618,60 @@ def _write(self, obj: dict) -> None: data = (json.dumps(obj, ensure_ascii=False) + "\n").encode("utf-8") self.wfile.write(data) self.wfile.flush() + try: + with self.server.activity_lock: + self.server.last_activity = time.time() + except Exception: + pass except Exception: pass + def finish(self) -> None: + try: + super().finish() + finally: + try: + with self.server.activity_lock: + if self.server.active_requests > 0: + self.server.active_requests -= 1 + self.server.last_activity = time.time() + except Exception: + pass + class Server(socketserver.ThreadingTCPServer): allow_reuse_address = True with Server((self.host, self.port), Handler) as httpd: httpd.token = self.token httpd.pool = self.pool + httpd.active_requests = 0 + httpd.last_activity = time.time() + httpd.activity_lock = threading.Lock() + try: + httpd.idle_timeout_s = float(os.environ.get("CCB_CASKD_IDLE_TIMEOUT_S", "60") or "60") + except Exception: + httpd.idle_timeout_s = 60.0 + + def _idle_monitor() -> None: + timeout_s = float(getattr(httpd, "idle_timeout_s", 60.0) or 0.0) + if timeout_s <= 0: + return + while True: + time.sleep(0.5) + try: + with httpd.activity_lock: + active = int(httpd.active_requests or 0) + last = float(httpd.last_activity or time.time()) + except Exception: + active = 0 + last = time.time() + if active == 0 and (time.time() - last) >= timeout_s: + _write_log(f"[INFO] caskd idle timeout ({int(timeout_s)}s) reached; shutting down") + threading.Thread(target=httpd.shutdown, daemon=True).start() + return + + threading.Thread(target=_idle_monitor, daemon=True).start() + actual_host, actual_port = httpd.server_address self._write_state(actual_host, int(actual_port)) _write_log(f"[INFO] caskd started pid={os.getpid()} addr={actual_host}:{actual_port}") diff --git a/lib/gaskd_daemon.py b/lib/gaskd_daemon.py new file mode 100644 index 0000000..eb7d418 --- /dev/null +++ b/lib/gaskd_daemon.py @@ -0,0 +1,557 @@ +from __future__ import annotations + +import json +import os +import queue +import socket +import socketserver +import sys +import threading +import time +from dataclasses import dataclass +from pathlib import Path +from typing import Optional + +from gaskd_protocol import ( + GaskdRequest, + GaskdResult, + extract_reply_for_req, + is_done_text, + make_req_id, + wrap_gemini_prompt, +) +from gaskd_session import compute_session_key, load_project_session +from gemini_comm import GeminiLogReader +from process_lock import ProviderLock +from session_utils import safe_write_session +from terminal import get_backend_for_session + + +def _now_ms() -> int: + return int(time.time() * 1000) + + +def _run_dir() -> Path: + return Path.home() / ".ccb" / "run" + + +def _state_file_path() -> Path: + return _run_dir() / "gaskd.json" + + +def _log_path() -> Path: + return _run_dir() / "gaskd.log" + + +def _write_log(line: str) -> None: + try: + _run_dir().mkdir(parents=True, exist_ok=True) + with _log_path().open("a", encoding="utf-8") as handle: + handle.write(line.rstrip() + "\n") + except Exception: + pass + + +def _random_token() -> str: + return os.urandom(16).hex() + + +def _normalize_connect_host(host: str) -> str: + host = (host or "").strip() + if not host or host in ("0.0.0.0",): + return "127.0.0.1" + if host in ("::", "[::]"): + return "::1" + return host + + +def _is_cancel_text(text: str) -> bool: + s = (text or "").strip().lower() + if not s: + return False + # Observed in Gemini session JSON: {"type":"info","content":"Request cancelled."} + if "request cancelled" in s or "request canceled" in s: + return True + return False + + +def _read_session_messages(session_path: Path) -> Optional[list[dict]]: + # Gemini session JSON may be written in-place; retry briefly on JSONDecodeError. + for attempt in range(10): + try: + with session_path.open("r", encoding="utf-8") as handle: + data = json.load(handle) + messages = data.get("messages", []) if isinstance(data, dict) else [] + return messages if isinstance(messages, list) else [] + except json.JSONDecodeError: + if attempt < 9: + time.sleep(0.05) + continue + return None + except OSError: + return None + except Exception: + return None + + +def _cancel_applies_to_req(messages: list[dict], cancel_index: int, req_id: str) -> bool: + # The info message itself doesn't include req_id; match it to the nearest preceding user prompt. + needle = f"CCB_REQ_ID: {req_id}" + for j in range(cancel_index - 1, -1, -1): + msg = messages[j] + if not isinstance(msg, dict): + continue + if msg.get("type") != "user": + continue + content = msg.get("content") + if not isinstance(content, str): + content = str(content or "") + return needle in content + return False + + +def _detect_request_cancelled(session_path: Path, *, from_index: int, req_id: str) -> bool: + if from_index < 0: + from_index = 0 + messages = _read_session_messages(session_path) + if messages is None: + return False + for i in range(min(from_index, len(messages)), len(messages)): + msg = messages[i] + if not isinstance(msg, dict): + continue + if msg.get("type") != "info": + continue + content = msg.get("content") + if not isinstance(content, str): + content = str(content or "") + if not _is_cancel_text(content): + continue + if _cancel_applies_to_req(messages, i, req_id): + return True + return False + + +@dataclass +class _QueuedTask: + request: GaskdRequest + created_ms: int + req_id: str + done_event: threading.Event + result: Optional[GaskdResult] = None + + +class _SessionWorker(threading.Thread): + def __init__(self, session_key: str): + super().__init__(daemon=True) + self.session_key = session_key + self._q: "queue.Queue[_QueuedTask]" = queue.Queue() + self._stop = threading.Event() + + def enqueue(self, task: _QueuedTask) -> None: + self._q.put(task) + + def stop(self) -> None: + self._stop.set() + + def run(self) -> None: + while not self._stop.is_set(): + try: + task = self._q.get(timeout=0.2) + except queue.Empty: + continue + try: + task.result = self._handle_task(task) + except Exception as exc: + _write_log(f"[ERROR] session={self.session_key} req_id={task.req_id} {exc}") + task.result = GaskdResult( + exit_code=1, + reply=str(exc), + req_id=task.req_id, + session_key=self.session_key, + done_seen=False, + done_ms=None, + ) + finally: + task.done_event.set() + + def _handle_task(self, task: _QueuedTask) -> GaskdResult: + started_ms = _now_ms() + req = task.request + work_dir = Path(req.work_dir) + _write_log(f"[INFO] start session={self.session_key} req_id={task.req_id} work_dir={req.work_dir}") + + session = load_project_session(work_dir) + if not session: + return GaskdResult( + exit_code=1, + reply="❌ No active Gemini session found for work_dir. Run 'ccb up gemini' in that project first.", + req_id=task.req_id, + session_key=self.session_key, + done_seen=False, + done_ms=None, + ) + + ok, pane_or_err = session.ensure_pane() + if not ok: + return GaskdResult( + exit_code=1, + reply=f"❌ Session pane not available: {pane_or_err}", + req_id=task.req_id, + session_key=self.session_key, + done_seen=False, + done_ms=None, + ) + pane_id = pane_or_err + + backend = get_backend_for_session(session.data) + if not backend: + return GaskdResult( + exit_code=1, + reply="❌ Terminal backend not available", + req_id=task.req_id, + session_key=self.session_key, + done_seen=False, + done_ms=None, + ) + + log_reader = GeminiLogReader(work_dir=Path(session.work_dir)) + if session.gemini_session_path: + try: + log_reader.set_preferred_session(Path(session.gemini_session_path)) + except Exception: + pass + state = log_reader.capture_state() + + prompt = wrap_gemini_prompt(req.message, task.req_id) + backend.send_text(pane_id, prompt) + + deadline = time.time() + float(req.timeout_s) + done_seen = False + done_ms: int | None = None + latest_reply = "" + + pane_check_interval = float(os.environ.get("CCB_GASKD_PANE_CHECK_INTERVAL", "2.0") or "2.0") + last_pane_check = time.time() + + while True: + remaining = deadline - time.time() + if remaining <= 0: + break + + if time.time() - last_pane_check >= pane_check_interval: + try: + alive = bool(backend.is_alive(pane_id)) + except Exception: + alive = False + if not alive: + _write_log(f"[ERROR] Pane {pane_id} died during request session={self.session_key} req_id={task.req_id}") + return GaskdResult( + exit_code=1, + reply="❌ Gemini pane died during request", + req_id=task.req_id, + session_key=self.session_key, + done_seen=False, + done_ms=None, + ) + last_pane_check = time.time() + + scan_from = state.get("msg_count") + try: + scan_from_i = int(scan_from) if scan_from is not None else 0 + except Exception: + scan_from_i = 0 + + prev_session_path = state.get("session_path") + reply, state = log_reader.wait_for_message(state, min(remaining, 1.0)) + + # Detect user cancellation via Gemini session JSON info message. + try: + current_count = int(state.get("msg_count") or 0) + except Exception: + current_count = 0 + session_path = state.get("session_path") + if isinstance(session_path, Path) and isinstance(prev_session_path, Path) and session_path != prev_session_path: + scan_from_i = 0 + if isinstance(session_path, Path) and current_count > scan_from_i: + if _detect_request_cancelled(session_path, from_index=scan_from_i, req_id=task.req_id): + _write_log(f"[WARN] Gemini request cancelled - skipping task session={self.session_key} req_id={task.req_id}") + return GaskdResult( + exit_code=1, + reply="❌ Gemini request cancelled. Skipping to next task.", + req_id=task.req_id, + session_key=self.session_key, + done_seen=False, + done_ms=None, + ) + + if not reply: + continue + latest_reply = str(reply) + if is_done_text(latest_reply, task.req_id): + done_seen = True + done_ms = _now_ms() - started_ms + break + + final_reply = extract_reply_for_req(latest_reply, task.req_id) + return GaskdResult( + exit_code=0 if done_seen else 2, + reply=final_reply, + req_id=task.req_id, + session_key=self.session_key, + done_seen=done_seen, + done_ms=done_ms, + ) + + +class _WorkerPool: + def __init__(self): + self._lock = threading.Lock() + self._workers: dict[str, _SessionWorker] = {} + + def submit(self, request: GaskdRequest) -> _QueuedTask: + req_id = make_req_id() + task = _QueuedTask(request=request, created_ms=_now_ms(), req_id=req_id, done_event=threading.Event()) + + session = load_project_session(Path(request.work_dir)) + session_key = compute_session_key(session) if session else "gemini:unknown" + + with self._lock: + worker = self._workers.get(session_key) + if worker is None: + worker = _SessionWorker(session_key) + self._workers[session_key] = worker + worker.start() + + worker.enqueue(task) + return task + + +class GaskdServer: + def __init__(self, host: str = "127.0.0.1", port: int = 0, *, state_file: Optional[Path] = None): + self.host = host + self.port = port + self.state_file = state_file or _state_file_path() + self.token = _random_token() + self.pool = _WorkerPool() + + def serve_forever(self) -> int: + _run_dir().mkdir(parents=True, exist_ok=True) + + lock = ProviderLock("gaskd", cwd="global", timeout=0.1) + if not lock.try_acquire(): + return 2 + + class Handler(socketserver.StreamRequestHandler): + def handle(self) -> None: + with self.server.activity_lock: + self.server.active_requests += 1 + self.server.last_activity = time.time() + try: + line = self.rfile.readline() + if not line: + return + msg = json.loads(line.decode("utf-8", errors="replace")) + except Exception: + return + + if msg.get("token") != self.server.token: + self._write({"type": "gask.response", "v": 1, "id": msg.get("id"), "exit_code": 1, "reply": "Unauthorized"}) + return + + if msg.get("type") == "gask.ping": + self._write({"type": "gask.pong", "v": 1, "id": msg.get("id"), "exit_code": 0, "reply": "OK"}) + return + + if msg.get("type") == "gask.shutdown": + self._write({"type": "gask.response", "v": 1, "id": msg.get("id"), "exit_code": 0, "reply": "OK"}) + threading.Thread(target=self.server.shutdown, daemon=True).start() + return + + if msg.get("type") != "gask.request": + self._write({"type": "gask.response", "v": 1, "id": msg.get("id"), "exit_code": 1, "reply": "Invalid request"}) + return + + try: + req = GaskdRequest( + client_id=str(msg.get("id") or ""), + work_dir=str(msg.get("work_dir") or ""), + timeout_s=float(msg.get("timeout_s") or 300.0), + quiet=bool(msg.get("quiet") or False), + message=str(msg.get("message") or ""), + output_path=str(msg.get("output_path")) if msg.get("output_path") else None, + ) + except Exception as exc: + self._write({"type": "gask.response", "v": 1, "id": msg.get("id"), "exit_code": 1, "reply": f"Bad request: {exc}"}) + return + + task = self.server.pool.submit(req) + task.done_event.wait(timeout=req.timeout_s + 5.0) + result = task.result + if not result: + self._write({"type": "gask.response", "v": 1, "id": req.client_id, "exit_code": 2, "reply": ""}) + return + + self._write( + { + "type": "gask.response", + "v": 1, + "id": req.client_id, + "req_id": result.req_id, + "exit_code": result.exit_code, + "reply": result.reply, + "meta": { + "session_key": result.session_key, + "done_seen": result.done_seen, + "done_ms": result.done_ms, + }, + } + ) + + def _write(self, obj: dict) -> None: + try: + data = (json.dumps(obj, ensure_ascii=False) + "\n").encode("utf-8") + self.wfile.write(data) + self.wfile.flush() + try: + with self.server.activity_lock: + self.server.last_activity = time.time() + except Exception: + pass + except Exception: + pass + + def finish(self) -> None: + try: + super().finish() + finally: + try: + with self.server.activity_lock: + if self.server.active_requests > 0: + self.server.active_requests -= 1 + self.server.last_activity = time.time() + except Exception: + pass + + class Server(socketserver.ThreadingTCPServer): + allow_reuse_address = True + + with Server((self.host, self.port), Handler) as httpd: + httpd.token = self.token + httpd.pool = self.pool + httpd.active_requests = 0 + httpd.last_activity = time.time() + httpd.activity_lock = threading.Lock() + try: + httpd.idle_timeout_s = float(os.environ.get("CCB_GASKD_IDLE_TIMEOUT_S", "60") or "60") + except Exception: + httpd.idle_timeout_s = 60.0 + + def _idle_monitor() -> None: + # Shutdown once idle for idle_timeout_s with no active client connections. + # Disable by setting CCB_GASKD_IDLE_TIMEOUT_S=0. + timeout_s = float(getattr(httpd, "idle_timeout_s", 60.0) or 0.0) + if timeout_s <= 0: + return + while True: + time.sleep(0.5) + try: + with httpd.activity_lock: + active = int(httpd.active_requests or 0) + last = float(httpd.last_activity or time.time()) + except Exception: + active = 0 + last = time.time() + if active == 0 and (time.time() - last) >= timeout_s: + _write_log(f"[INFO] gaskd idle timeout ({int(timeout_s)}s) reached; shutting down") + threading.Thread(target=httpd.shutdown, daemon=True).start() + return + + threading.Thread(target=_idle_monitor, daemon=True).start() + + actual_host, actual_port = httpd.server_address + self._write_state(actual_host, int(actual_port)) + _write_log(f"[INFO] gaskd started pid={os.getpid()} addr={actual_host}:{actual_port}") + try: + httpd.serve_forever(poll_interval=0.2) + finally: + _write_log("[INFO] gaskd stopped") + return 0 + + def _write_state(self, host: str, port: int) -> None: + payload = { + "pid": os.getpid(), + "host": host, + "connect_host": _normalize_connect_host(host), + "port": port, + "token": self.token, + "started_at": time.strftime("%Y-%m-%d %H:%M:%S"), + "python": sys.executable, + } + self.state_file.parent.mkdir(parents=True, exist_ok=True) + ok, _err = safe_write_session(self.state_file, json.dumps(payload, ensure_ascii=False, indent=2) + "\n") + if ok: + try: + os.chmod(self.state_file, 0o600) + except Exception: + pass + + +def read_state(state_file: Optional[Path] = None) -> Optional[dict]: + state_file = state_file or _state_file_path() + try: + raw = state_file.read_text(encoding="utf-8") + obj = json.loads(raw) + return obj if isinstance(obj, dict) else None + except Exception: + return None + + +def ping_daemon(timeout_s: float = 0.5, state_file: Optional[Path] = None) -> bool: + st = read_state(state_file) + if not st: + return False + try: + host = st.get("connect_host") or st["host"] + port = int(st["port"]) + token = st["token"] + except Exception: + return False + try: + with socket.create_connection((host, port), timeout=timeout_s) as sock: + req = {"type": "gask.ping", "v": 1, "id": "ping", "token": token} + sock.sendall((json.dumps(req) + "\n").encode("utf-8")) + buf = b"" + deadline = time.time() + timeout_s + while b"\n" not in buf and time.time() < deadline: + chunk = sock.recv(1024) + if not chunk: + break + buf += chunk + if b"\n" not in buf: + return False + line = buf.split(b"\n", 1)[0].decode("utf-8", errors="replace") + resp = json.loads(line) + return resp.get("type") in ("gask.pong", "gask.response") and int(resp.get("exit_code") or 0) == 0 + except Exception: + return False + + +def shutdown_daemon(timeout_s: float = 1.0, state_file: Optional[Path] = None) -> bool: + st = read_state(state_file) + if not st: + return False + try: + host = st.get("connect_host") or st["host"] + port = int(st["port"]) + token = st["token"] + except Exception: + return False + try: + with socket.create_connection((host, port), timeout=timeout_s) as sock: + req = {"type": "gask.shutdown", "v": 1, "id": "shutdown", "token": token} + sock.sendall((json.dumps(req) + "\n").encode("utf-8")) + _ = sock.recv(1024) + return True + except Exception: + return False diff --git a/lib/gaskd_protocol.py b/lib/gaskd_protocol.py new file mode 100644 index 0000000..74ac8a3 --- /dev/null +++ b/lib/gaskd_protocol.py @@ -0,0 +1,83 @@ +from __future__ import annotations + +import re +from dataclasses import dataclass + +from caskd_protocol import ( + DONE_PREFIX, + REQ_ID_PREFIX, + is_done_text, + make_req_id, + strip_done_text, +) + +ANY_DONE_LINE_RE = re.compile(r"^\s*CCB_DONE:\s*[0-9a-f]{32}\s*$", re.IGNORECASE) + + +def wrap_gemini_prompt(message: str, req_id: str) -> str: + message = (message or "").rstrip() + return ( + f"{REQ_ID_PREFIX} {req_id}\n\n" + f"{message}\n\n" + "IMPORTANT:\n" + "- Reply normally.\n" + "- End your reply with this exact final line (verbatim, on its own line):\n" + f"{DONE_PREFIX} {req_id}\n" + ) + + +def extract_reply_for_req(text: str, req_id: str) -> str: + """ + Extract the reply segment for req_id from a Gemini message. + + Gemini sometimes emits multiple replies in a single assistant message, each ending with its own + `CCB_DONE: ` line. In that case, we want only the segment between the previous done line + (any req_id) and the done line for our req_id. + """ + lines = [ln.rstrip("\n") for ln in (text or "").splitlines()] + if not lines: + return "" + + # Find last done-line index for this req_id (may not be last line if the model misbehaves). + target_re = re.compile(rf"^\s*CCB_DONE:\s*{re.escape(req_id)}\s*$", re.IGNORECASE) + done_idxs = [i for i, ln in enumerate(lines) if ANY_DONE_LINE_RE.match(ln or "")] + target_idxs = [i for i in done_idxs if target_re.match(lines[i] or "")] + + if not target_idxs: + # Fallback: keep existing behavior (strip only if the last line matches). + return strip_done_text(text, req_id) + + target_i = target_idxs[-1] + prev_done_i = -1 + for i in reversed(done_idxs): + if i < target_i: + prev_done_i = i + break + + segment = lines[prev_done_i + 1 : target_i] + # Trim leading/trailing blank lines for nicer output. + while segment and segment[0].strip() == "": + segment = segment[1:] + while segment and segment[-1].strip() == "": + segment = segment[:-1] + return "\n".join(segment).rstrip() + + +@dataclass(frozen=True) +class GaskdRequest: + client_id: str + work_dir: str + timeout_s: float + quiet: bool + message: str + output_path: str | None = None + + +@dataclass(frozen=True) +class GaskdResult: + exit_code: int + reply: str + req_id: str + session_key: str + done_seen: bool + done_ms: int | None = None diff --git a/lib/gaskd_session.py b/lib/gaskd_session.py new file mode 100644 index 0000000..be94319 --- /dev/null +++ b/lib/gaskd_session.py @@ -0,0 +1,121 @@ +from __future__ import annotations + +import json +import time +from dataclasses import dataclass +from pathlib import Path +from typing import Optional, Tuple + +from ccb_config import apply_backend_env +from session_utils import safe_write_session +from terminal import get_backend_for_session + +apply_backend_env() + + +def find_project_session_file(work_dir: Path) -> Optional[Path]: + current = Path(work_dir) + while current != current.parent: + candidate = current / ".gemini-session" + if candidate.exists(): + return candidate + current = current.parent + return None + + +def _read_json(path: Path) -> dict: + try: + raw = path.read_text(encoding="utf-8-sig") + obj = json.loads(raw) + return obj if isinstance(obj, dict) else {} + except Exception: + return {} + + +def _now_str() -> str: + return time.strftime("%Y-%m-%d %H:%M:%S") + + +@dataclass +class GeminiProjectSession: + session_file: Path + data: dict + + @property + def terminal(self) -> str: + return (self.data.get("terminal") or "tmux").strip() or "tmux" + + @property + def pane_id(self) -> str: + v = self.data.get("pane_id") if self.terminal in ("wezterm", "iterm2") else self.data.get("tmux_session") + return str(v or "").strip() + + @property + def pane_title_marker(self) -> str: + return str(self.data.get("pane_title_marker") or "").strip() + + @property + def gemini_session_id(self) -> str: + return str(self.data.get("gemini_session_id") or "").strip() + + @property + def gemini_session_path(self) -> str: + return str(self.data.get("gemini_session_path") or "").strip() + + @property + def work_dir(self) -> str: + return str(self.data.get("work_dir") or self.session_file.parent) + + def backend(self): + return get_backend_for_session(self.data) + + def ensure_pane(self) -> Tuple[bool, str]: + backend = self.backend() + if not backend: + return False, "Terminal backend not available" + + pane_id = self.pane_id + if pane_id and backend.is_alive(pane_id): + return True, pane_id + + marker = self.pane_title_marker + resolver = getattr(backend, "find_pane_by_title_marker", None) + if marker and callable(resolver): + resolved = resolver(marker) + if resolved: + self.data["pane_id"] = str(resolved) + self.data["updated_at"] = _now_str() + self._write_back() + return True, str(resolved) + + return False, f"Pane not alive: {pane_id}" + + def _write_back(self) -> None: + payload = json.dumps(self.data, ensure_ascii=False, indent=2) + "\n" + ok, _err = safe_write_session(self.session_file, payload) + if not ok: + return + + +def load_project_session(work_dir: Path) -> Optional[GeminiProjectSession]: + session_file = find_project_session_file(work_dir) + if not session_file: + return None + data = _read_json(session_file) + if not data: + return None + return GeminiProjectSession(session_file=session_file, data=data) + + +def compute_session_key(session: GeminiProjectSession) -> str: + marker = session.pane_title_marker + if marker: + return f"gemini_marker:{marker}" + pane = session.pane_id + if pane: + return f"gemini_pane:{pane}" + sid = session.gemini_session_id + if sid: + return f"gemini:{sid}" + return f"gemini_file:{session.session_file}" + diff --git a/lib/oaskd_daemon.py b/lib/oaskd_daemon.py new file mode 100644 index 0000000..9e095cb --- /dev/null +++ b/lib/oaskd_daemon.py @@ -0,0 +1,573 @@ +from __future__ import annotations + +import json +import os +import queue +import socket +import socketserver +import sys +import threading +import time +from dataclasses import dataclass +from pathlib import Path +from typing import Optional + +from oaskd_protocol import OaskdRequest, OaskdResult, is_done_text, make_req_id, strip_done_text, wrap_opencode_prompt +from oaskd_session import compute_session_key, load_project_session +from opencode_comm import OpenCodeLogReader +from process_lock import ProviderLock +from session_utils import safe_write_session +from terminal import get_backend_for_session + + +def _now_ms() -> int: + return int(time.time() * 1000) + + +def _run_dir() -> Path: + return Path.home() / ".ccb" / "run" + + +def _state_file_path() -> Path: + return _run_dir() / "oaskd.json" + + +def _log_path() -> Path: + return _run_dir() / "oaskd.log" + + +def _write_log(line: str) -> None: + try: + _run_dir().mkdir(parents=True, exist_ok=True) + with _log_path().open("a", encoding="utf-8") as handle: + handle.write(line.rstrip() + "\n") + except Exception: + pass + + +def _random_token() -> str: + return os.urandom(16).hex() + +def _env_bool(name: str, default: bool) -> bool: + raw = os.environ.get(name) + if raw is None or raw == "": + return default + v = raw.strip().lower() + if v in ("0", "false", "no", "off"): + return False + if v in ("1", "true", "yes", "on"): + return True + return default + + +def _cancel_detection_enabled(default: bool = False) -> bool: + # Disabled by default for stability: OpenCode cancellation is session-scoped and hard to + # attribute to a specific queued task without false positives. + return _env_bool("CCB_OASKD_CANCEL_DETECT", default) + + +def _normalize_connect_host(host: str) -> str: + host = (host or "").strip() + if not host or host in ("0.0.0.0",): + return "127.0.0.1" + if host in ("::", "[::]"): + return "::1" + return host + + +def _tail_state_for_session(log_reader: OpenCodeLogReader) -> dict: + # OpenCode reader uses storage files, not an append-only log; a fresh capture_state is enough. + return log_reader.capture_state() + + +@dataclass +class _QueuedTask: + request: OaskdRequest + created_ms: int + req_id: str + done_event: threading.Event + result: Optional[OaskdResult] = None + + +class _SessionWorker(threading.Thread): + def __init__(self, session_key: str): + super().__init__(daemon=True) + self.session_key = session_key + self._q: "queue.Queue[_QueuedTask]" = queue.Queue() + self._stop = threading.Event() + + def enqueue(self, task: _QueuedTask) -> None: + self._q.put(task) + + def stop(self) -> None: + self._stop.set() + + def run(self) -> None: + while not self._stop.is_set(): + try: + task = self._q.get(timeout=0.2) + except queue.Empty: + continue + try: + task.result = self._handle_task(task) + except Exception as exc: + _write_log(f"[ERROR] session={self.session_key} req_id={task.req_id} {exc}") + task.result = OaskdResult( + exit_code=1, + reply=str(exc), + req_id=task.req_id, + session_key=self.session_key, + done_seen=False, + done_ms=None, + ) + finally: + task.done_event.set() + + def _handle_task(self, task: _QueuedTask) -> OaskdResult: + started_ms = _now_ms() + req = task.request + work_dir = Path(req.work_dir) + _write_log(f"[INFO] start session={self.session_key} req_id={task.req_id} work_dir={req.work_dir}") + + # Cross-process serialization: if another client falls back to direct mode, it uses the same + # per-session ProviderLock ("opencode", cwd=f"session:{session_key}"). Without this, daemon and + # direct-mode requests can interleave in the same OpenCode pane and cause reply mismatches/hangs. + lock_timeout = min(300.0, max(1.0, float(req.timeout_s))) + lock = ProviderLock("opencode", cwd=f"session:{self.session_key}", timeout=lock_timeout) + if not lock.acquire(): + return OaskdResult( + exit_code=1, + reply="❌ Another OpenCode request is in progress (session lock timeout).", + req_id=task.req_id, + session_key=self.session_key, + done_seen=False, + done_ms=None, + ) + + try: + session = load_project_session(work_dir) + if not session: + return OaskdResult( + exit_code=1, + reply="❌ No active OpenCode session found for work_dir. Run 'ccb up opencode' in that project first.", + req_id=task.req_id, + session_key=self.session_key, + done_seen=False, + done_ms=None, + ) + + ok, pane_or_err = session.ensure_pane() + if not ok: + return OaskdResult( + exit_code=1, + reply=f"❌ Session pane not available: {pane_or_err}", + req_id=task.req_id, + session_key=self.session_key, + done_seen=False, + done_ms=None, + ) + pane_id = pane_or_err + + backend = get_backend_for_session(session.data) + if not backend: + return OaskdResult( + exit_code=1, + reply="❌ Terminal backend not available", + req_id=task.req_id, + session_key=self.session_key, + done_seen=False, + done_ms=None, + ) + + log_reader = OpenCodeLogReader(work_dir=Path(session.work_dir), session_id_filter=(session.session_id or None)) + state = _tail_state_for_session(log_reader) + cancel_enabled = _cancel_detection_enabled(False) + session_id = state.get("session_id") if cancel_enabled and isinstance(state.get("session_id"), str) else None + cancel_cursor = log_reader.open_cancel_log_cursor() if cancel_enabled and session_id else None + cancel_since_s = time.time() if cancel_enabled else 0.0 + + prompt = wrap_opencode_prompt(req.message, task.req_id) + backend.send_text(pane_id, prompt) + + deadline = time.time() + float(req.timeout_s) + chunks: list[str] = [] + done_seen = False + done_ms: int | None = None + + pane_check_interval = float(os.environ.get("CCB_OASKD_PANE_CHECK_INTERVAL", "2.0") or "2.0") + last_pane_check = time.time() + + while True: + remaining = deadline - time.time() + if remaining <= 0: + break + + if time.time() - last_pane_check >= pane_check_interval: + try: + alive = bool(backend.is_alive(pane_id)) + except Exception: + alive = False + if not alive: + _write_log(f"[ERROR] Pane {pane_id} died during request session={self.session_key} req_id={task.req_id}") + return OaskdResult( + exit_code=1, + reply="❌ OpenCode pane died during request", + req_id=task.req_id, + session_key=self.session_key, + done_seen=False, + done_ms=None, + ) + last_pane_check = time.time() + + reply, state = log_reader.wait_for_message(state, min(remaining, 1.0)) + + # Detect user cancellation using OpenCode server logs (handles the race where storage isn't updated). + if cancel_enabled and session_id and cancel_cursor is not None: + try: + cancelled_log, cancel_cursor = log_reader.detect_cancel_event_in_logs( + cancel_cursor, session_id=session_id, since_epoch_s=cancel_since_s + ) + if cancelled_log: + _write_log( + f"[WARN] OpenCode request cancelled (log) - skipping task session={self.session_key} req_id={task.req_id}" + ) + return OaskdResult( + exit_code=1, + reply="❌ OpenCode request cancelled. Skipping to next task.", + req_id=task.req_id, + session_key=self.session_key, + done_seen=False, + done_ms=None, + ) + except Exception: + pass + + # Detect user cancellation (OpenCode writes an assistant message with MessageAbortedError). + # + # Important: do NOT advance the caller's state baseline when not cancelled. + # OpenCode may create an assistant message early (streaming), then later mark the SAME message + # as aborted; if we update state.assistant_count here, we'd stop scanning that message. + if cancel_enabled: + try: + cancelled, _new_state = log_reader.detect_cancelled_since(state, req_id=task.req_id) + if cancelled: + _write_log( + f"[WARN] OpenCode request cancelled - skipping task session={self.session_key} req_id={task.req_id}" + ) + return OaskdResult( + exit_code=1, + reply="❌ OpenCode request cancelled. Skipping to next task.", + req_id=task.req_id, + session_key=self.session_key, + done_seen=False, + done_ms=None, + ) + except Exception: + pass + + if not reply: + continue + chunks.append(reply) + combined = "\n".join(chunks) + if is_done_text(combined, task.req_id): + done_seen = True + done_ms = _now_ms() - started_ms + break + + combined = "\n".join(chunks) + final_reply = strip_done_text(combined, task.req_id) + + return OaskdResult( + exit_code=0 if done_seen else 2, + reply=final_reply, + req_id=task.req_id, + session_key=self.session_key, + done_seen=done_seen, + done_ms=done_ms, + ) + finally: + lock.release() + + +class _WorkerPool: + def __init__(self): + self._lock = threading.Lock() + self._workers: dict[str, _SessionWorker] = {} + + def submit(self, request: OaskdRequest) -> _QueuedTask: + req_id = make_req_id() + task = _QueuedTask(request=request, created_ms=_now_ms(), req_id=req_id, done_event=threading.Event()) + + session = load_project_session(Path(request.work_dir)) + session_key = compute_session_key(session) if session else "opencode:unknown" + + with self._lock: + worker = self._workers.get(session_key) + if worker is None: + worker = _SessionWorker(session_key) + self._workers[session_key] = worker + worker.start() + + worker.enqueue(task) + try: + qsize = int(worker._q.qsize()) + except Exception: + qsize = -1 + _write_log(f"[INFO] enqueued session={session_key} req_id={req_id} qsize={qsize} client_id={request.client_id}") + return task + + +class OaskdServer: + def __init__(self, host: str = "127.0.0.1", port: int = 0, *, state_file: Optional[Path] = None): + self.host = host + self.port = port + self.state_file = state_file or _state_file_path() + self.token = _random_token() + self.pool = _WorkerPool() + + def serve_forever(self) -> int: + _run_dir().mkdir(parents=True, exist_ok=True) + + # Single-instance lock (global, not per-cwd) + lock = ProviderLock("oaskd", cwd="global", timeout=0.1) + if not lock.try_acquire(): + return 2 + + class Handler(socketserver.StreamRequestHandler): + def handle(self) -> None: + with self.server.activity_lock: + self.server.active_requests += 1 + self.server.last_activity = time.time() + + try: + line = self.rfile.readline() + if not line: + return + msg = json.loads(line.decode("utf-8", errors="replace")) + except Exception: + return + + if msg.get("token") != self.server.token: + self._write({"type": "oask.response", "v": 1, "id": msg.get("id"), "exit_code": 1, "reply": "Unauthorized"}) + return + + if msg.get("type") == "oask.ping": + self._write({"type": "oask.pong", "v": 1, "id": msg.get("id"), "exit_code": 0, "reply": "OK"}) + return + + if msg.get("type") == "oask.shutdown": + self._write({"type": "oask.response", "v": 1, "id": msg.get("id"), "exit_code": 0, "reply": "OK"}) + threading.Thread(target=self.server.shutdown, daemon=True).start() + return + + if msg.get("type") != "oask.request": + self._write({"type": "oask.response", "v": 1, "id": msg.get("id"), "exit_code": 1, "reply": "Invalid request"}) + return + + try: + req = OaskdRequest( + client_id=str(msg.get("id") or ""), + work_dir=str(msg.get("work_dir") or ""), + timeout_s=float(msg.get("timeout_s") or 300.0), + quiet=bool(msg.get("quiet") or False), + message=str(msg.get("message") or ""), + output_path=str(msg.get("output_path")) if msg.get("output_path") else None, + ) + except Exception as exc: + self._write({"type": "oask.response", "v": 1, "id": msg.get("id"), "exit_code": 1, "reply": f"Bad request: {exc}"}) + return + + _write_log( + f"[INFO] recv client_id={req.client_id} work_dir={req.work_dir} timeout_s={int(req.timeout_s)} msg_len={len(req.message)}" + ) + task = self.server.pool.submit(req) + task.done_event.wait(timeout=req.timeout_s + 5.0) + result = task.result + if not result: + self._write({"type": "oask.response", "v": 1, "id": req.client_id, "exit_code": 2, "reply": ""}) + return + + self._write( + { + "type": "oask.response", + "v": 1, + "id": req.client_id, + "req_id": result.req_id, + "exit_code": result.exit_code, + "reply": result.reply, + "meta": { + "session_key": result.session_key, + "done_seen": result.done_seen, + "done_ms": result.done_ms, + }, + } + ) + + def _write(self, obj: dict) -> None: + try: + data = (json.dumps(obj, ensure_ascii=False) + "\n").encode("utf-8") + self.wfile.write(data) + self.wfile.flush() + try: + with self.server.activity_lock: + self.server.last_activity = time.time() + except Exception: + pass + except Exception: + pass + + def finish(self) -> None: + try: + super().finish() + finally: + try: + with self.server.activity_lock: + if self.server.active_requests > 0: + self.server.active_requests -= 1 + self.server.last_activity = time.time() + except Exception: + pass + + class Server(socketserver.ThreadingTCPServer): + allow_reuse_address = True + request_queue_size = 128 + + with Server((self.host, self.port), Handler) as httpd: + httpd.token = self.token + httpd.pool = self.pool + httpd.active_requests = 0 + httpd.last_activity = time.time() + httpd.activity_lock = threading.Lock() + try: + httpd.idle_timeout_s = float(os.environ.get("CCB_OASKD_IDLE_TIMEOUT_S", "60") or "60") + except Exception: + httpd.idle_timeout_s = 60.0 + + def _idle_monitor() -> None: + timeout_s = float(getattr(httpd, "idle_timeout_s", 60.0) or 0.0) + if timeout_s <= 0: + return + while True: + time.sleep(0.5) + try: + with httpd.activity_lock: + active = int(httpd.active_requests or 0) + last = float(httpd.last_activity or time.time()) + except Exception: + active = 0 + last = time.time() + if active == 0 and (time.time() - last) >= timeout_s: + _write_log(f"[INFO] oaskd idle timeout ({int(timeout_s)}s) reached; shutting down") + threading.Thread(target=httpd.shutdown, daemon=True).start() + return + + threading.Thread(target=_idle_monitor, daemon=True).start() + + actual_host, actual_port = httpd.server_address + self._write_state(actual_host, int(actual_port)) + _write_log(f"[INFO] oaskd started pid={os.getpid()} addr={actual_host}:{actual_port}") + try: + httpd.serve_forever(poll_interval=0.2) + finally: + _write_log("[INFO] oaskd stopped") + self._cleanup_state_file() + try: + lock.release() + except Exception: + pass + return 0 + + def _cleanup_state_file(self) -> None: + try: + st = read_state(self.state_file) + except Exception: + st = None + try: + if isinstance(st, dict) and int(st.get("pid") or 0) == os.getpid(): + self.state_file.unlink(missing_ok=True) # py3.8+: missing_ok + except TypeError: + try: + if isinstance(st, dict) and int(st.get("pid") or 0) == os.getpid() and self.state_file.exists(): + self.state_file.unlink() + except Exception: + pass + except Exception: + pass + + def _write_state(self, host: str, port: int) -> None: + payload = { + "pid": os.getpid(), + "host": host, + "connect_host": _normalize_connect_host(host), + "port": port, + "token": self.token, + "started_at": time.strftime("%Y-%m-%d %H:%M:%S"), + "python": sys.executable, + } + self.state_file.parent.mkdir(parents=True, exist_ok=True) + ok, _err = safe_write_session(self.state_file, json.dumps(payload, ensure_ascii=False, indent=2) + "\n") + if ok: + try: + os.chmod(self.state_file, 0o600) + except Exception: + pass + + +def read_state(state_file: Optional[Path] = None) -> Optional[dict]: + state_file = state_file or _state_file_path() + try: + raw = state_file.read_text(encoding="utf-8") + obj = json.loads(raw) + return obj if isinstance(obj, dict) else None + except Exception: + return None + + +def ping_daemon(timeout_s: float = 0.5, state_file: Optional[Path] = None) -> bool: + st = read_state(state_file) + if not st: + return False + try: + host = st.get("connect_host") or st["host"] + port = int(st["port"]) + token = st["token"] + except Exception: + return False + try: + with socket.create_connection((host, port), timeout=timeout_s) as sock: + req = {"type": "oask.ping", "v": 1, "id": "ping", "token": token} + sock.sendall((json.dumps(req) + "\n").encode("utf-8")) + buf = b"" + deadline = time.time() + timeout_s + while b"\n" not in buf and time.time() < deadline: + chunk = sock.recv(1024) + if not chunk: + break + buf += chunk + if b"\n" not in buf: + return False + line = buf.split(b"\n", 1)[0].decode("utf-8", errors="replace") + resp = json.loads(line) + return resp.get("type") in ("oask.pong", "oask.response") and int(resp.get("exit_code") or 0) == 0 + except Exception: + return False + + +def shutdown_daemon(timeout_s: float = 1.0, state_file: Optional[Path] = None) -> bool: + st = read_state(state_file) + if not st: + return False + try: + host = st.get("connect_host") or st["host"] + port = int(st["port"]) + token = st["token"] + except Exception: + return False + try: + with socket.create_connection((host, port), timeout=timeout_s) as sock: + req = {"type": "oask.shutdown", "v": 1, "id": "shutdown", "token": token} + sock.sendall((json.dumps(req) + "\n").encode("utf-8")) + _ = sock.recv(1024) + return True + except Exception: + return False diff --git a/lib/oaskd_protocol.py b/lib/oaskd_protocol.py new file mode 100644 index 0000000..964632c --- /dev/null +++ b/lib/oaskd_protocol.py @@ -0,0 +1,44 @@ +from __future__ import annotations + +from dataclasses import dataclass + +from caskd_protocol import ( + DONE_PREFIX, + REQ_ID_PREFIX, + is_done_text, + make_req_id, + strip_done_text, +) + + +def wrap_opencode_prompt(message: str, req_id: str) -> str: + message = (message or "").rstrip() + return ( + f"{REQ_ID_PREFIX} {req_id}\n\n" + f"{message}\n\n" + "IMPORTANT:\n" + "- Reply normally.\n" + "- End your reply with this exact final line (verbatim, on its own line):\n" + f"{DONE_PREFIX} {req_id}\n" + ) + + +@dataclass(frozen=True) +class OaskdRequest: + client_id: str + work_dir: str + timeout_s: float + quiet: bool + message: str + output_path: str | None = None + + +@dataclass(frozen=True) +class OaskdResult: + exit_code: int + reply: str + req_id: str + session_key: str + done_seen: bool + done_ms: int | None = None + diff --git a/lib/oaskd_session.py b/lib/oaskd_session.py new file mode 100644 index 0000000..1e8de0d --- /dev/null +++ b/lib/oaskd_session.py @@ -0,0 +1,141 @@ +from __future__ import annotations + +import json +import time +from dataclasses import dataclass +from pathlib import Path +from typing import Optional, Tuple + +from ccb_config import apply_backend_env +from session_utils import safe_write_session +from terminal import get_backend_for_session + +apply_backend_env() + + +def find_project_session_file(work_dir: Path) -> Optional[Path]: + current = Path(work_dir) + while current != current.parent: + candidate = current / ".opencode-session" + if candidate.exists(): + return candidate + current = current.parent + return None + + +def _read_json(path: Path) -> dict: + try: + raw = path.read_text(encoding="utf-8-sig") + obj = json.loads(raw) + return obj if isinstance(obj, dict) else {} + except Exception: + return {} + + +def _now_str() -> str: + return time.strftime("%Y-%m-%d %H:%M:%S") + + +@dataclass +class OpenCodeProjectSession: + session_file: Path + data: dict + + @property + def session_id(self) -> str: + # Current .opencode-session uses "session_id". Keep compatibility with older/alternate keys. + return str(self.data.get("session_id") or self.data.get("opencode_session_id") or "").strip() + + @property + def terminal(self) -> str: + return (self.data.get("terminal") or "tmux").strip() or "tmux" + + @property + def pane_id(self) -> str: + v = self.data.get("pane_id") if self.terminal in ("wezterm", "iterm2") else self.data.get("tmux_session") + return str(v or "").strip() + + @property + def pane_title_marker(self) -> str: + return str(self.data.get("pane_title_marker") or "").strip() + + @property + def opencode_session_id(self) -> str: + # Backwards-compatible alias. + return self.session_id + + @property + def opencode_project_id(self) -> str: + return str(self.data.get("opencode_project_id") or "").strip() + + @property + def work_dir(self) -> str: + return str(self.data.get("work_dir") or self.session_file.parent) + + def backend(self): + return get_backend_for_session(self.data) + + def ensure_pane(self) -> Tuple[bool, str]: + backend = self.backend() + if not backend: + return False, "Terminal backend not available" + + pane_id = self.pane_id + if pane_id and backend.is_alive(pane_id): + return True, pane_id + + marker = self.pane_title_marker + resolver = getattr(backend, "find_pane_by_title_marker", None) + if marker and callable(resolver): + resolved = resolver(marker) + if resolved: + self.data["pane_id"] = str(resolved) + self.data["updated_at"] = _now_str() + self._write_back() + return True, str(resolved) + + return False, f"Pane not alive: {pane_id}" + + def update_opencode_binding(self, *, session_id: Optional[str], project_id: Optional[str]) -> None: + updated = False + if session_id and self.data.get("opencode_session_id") != session_id: + self.data["opencode_session_id"] = session_id + updated = True + if project_id and self.data.get("opencode_project_id") != project_id: + self.data["opencode_project_id"] = project_id + updated = True + if updated: + self.data["updated_at"] = _now_str() + if self.data.get("active") is False: + self.data["active"] = True + self._write_back() + + def _write_back(self) -> None: + payload = json.dumps(self.data, ensure_ascii=False, indent=2) + "\n" + ok, _err = safe_write_session(self.session_file, payload) + if not ok: + # Best-effort: never raise (daemon should continue). + return + + +def load_project_session(work_dir: Path) -> Optional[OpenCodeProjectSession]: + session_file = find_project_session_file(work_dir) + if not session_file: + return None + data = _read_json(session_file) + if not data: + return None + return OpenCodeProjectSession(session_file=session_file, data=data) + + +def compute_session_key(session: OpenCodeProjectSession) -> str: + marker = session.pane_title_marker + if marker: + return f"opencode_marker:{marker}" + pane = session.pane_id + if pane: + return f"opencode_pane:{pane}" + sid = session.session_id + if sid: + return f"opencode:{sid}" + return f"opencode_file:{session.session_file}" diff --git a/lib/opencode_comm.py b/lib/opencode_comm.py index 550e373..446c340 100644 --- a/lib/opencode_comm.py +++ b/lib/opencode_comm.py @@ -14,15 +14,19 @@ import shutil import sys import time +from datetime import datetime, timezone from pathlib import Path from typing import Any, Dict, List, Optional, Tuple +from caskd_protocol import REQ_ID_PREFIX from ccb_config import apply_backend_env from i18n import t from terminal import get_backend_for_session, get_pane_id_from_session apply_backend_env() +_REQ_ID_RE = re.compile(rf"{re.escape(REQ_ID_PREFIX)}\s*([0-9a-fA-F]{{32}})") + def compute_opencode_project_id(work_dir: Path) -> str: """ @@ -92,6 +96,8 @@ def _read_cached_project_id(git_dir: Path | None) -> str | None: ["git", "rev-list", "--max-parents=0", "--all"], cwd=str(git_root or cwd), text=True, + encoding="utf-8", + errors="replace", stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, check=False, @@ -217,6 +223,76 @@ def _default_opencode_storage_root() -> Path: OPENCODE_STORAGE_ROOT = _default_opencode_storage_root() +def _default_opencode_log_root() -> Path: + env = (os.environ.get("OPENCODE_LOG_ROOT") or "").strip() + if env: + return Path(env).expanduser() + + candidates: list[Path] = [] + xdg_data_home = (os.environ.get("XDG_DATA_HOME") or "").strip() + if xdg_data_home: + candidates.append(Path(xdg_data_home) / "opencode" / "log") + candidates.append(Path.home() / ".local" / "share" / "opencode" / "log") + candidates.append(Path.home() / ".opencode" / "log") + + for candidate in candidates: + try: + if candidate.exists(): + return candidate + except Exception: + continue + + return candidates[0] + + +OPENCODE_LOG_ROOT = _default_opencode_log_root() + + +def _latest_opencode_log_file(root: Path = OPENCODE_LOG_ROOT) -> Path | None: + try: + if not root.exists(): + return None + paths = [p for p in root.glob("*.log") if p.is_file()] + except Exception: + return None + if not paths: + return None + try: + paths.sort(key=lambda p: p.stat().st_mtime, reverse=True) + except Exception: + paths.sort() + return paths[0] + + +def _is_cancel_log_line(line: str, *, session_id: str) -> bool: + if not line: + return False + sid = (session_id or "").strip() + if not sid: + return False + if f"sessionID={sid} cancel" in line: + return True + if f"path=/session/{sid}/abort" in line: + return True + return False + + +def _parse_opencode_log_epoch_s(line: str) -> float | None: + """ + Parse OpenCode log timestamp into epoch seconds (UTC). + + Observed format: "INFO 2026-01-09T12:11:12 +1ms service=..." + """ + try: + parts = (line or "").split() + if len(parts) < 2: + return None + ts = parts[1] + dt = datetime.strptime(ts, "%Y-%m-%dT%H:%M:%S").replace(tzinfo=timezone.utc) + return float(dt.timestamp()) + except Exception: + return None + class OpenCodeLogReader: """ @@ -228,12 +304,20 @@ class OpenCodeLogReader: storage/part//prt_*.json """ - def __init__(self, root: Path = OPENCODE_STORAGE_ROOT, work_dir: Optional[Path] = None, project_id: str = "global"): + def __init__( + self, + root: Path = OPENCODE_STORAGE_ROOT, + work_dir: Optional[Path] = None, + project_id: str = "global", + *, + session_id_filter: str | None = None, + ): self.root = Path(root).expanduser() self.work_dir = work_dir or Path.cwd() env_project_id = (os.environ.get("OPENCODE_PROJECT_ID") or "").strip() explicit_project_id = bool(env_project_id) or ((project_id or "").strip() not in ("", "global")) self.project_id = (env_project_id or project_id or "global").strip() or "global" + self._session_id_filter = (session_id_filter or "").strip() or None if not explicit_project_id: detected = self._detect_project_id_for_workdir() if detected: @@ -360,6 +444,18 @@ def _get_latest_session(self) -> Optional[dict]: if not sessions_dir.exists(): return None + if self._session_id_filter: + try: + for path in sessions_dir.glob("ses_*.json"): + if not path.is_file(): + continue + payload = self._load_json(path) + sid = payload.get("id") + if isinstance(sid, str) and sid == self._session_id_filter: + return {"path": path, "payload": payload} + except Exception: + pass + candidates = self._work_dir_candidates() best_match: dict | None = None best_updated = -1 @@ -565,7 +661,8 @@ def _find_new_assistant_reply(self, session_id: str, state: Dict[str, Any]) -> O parts = self._read_parts(str(latest_id)) text = self._extract_text(parts, allow_reasoning_fallback=False) completion_marker = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "[EXECUTION_COMPLETE]").strip() or "[EXECUTION_COMPLETE]" - if text and completion_marker in text: + has_done = bool(text) and ("CCB_DONE:" in text) + if text and (completion_marker in text or has_done): completed_i = int(time.time() * 1000) else: return None # Still streaming, wait @@ -680,6 +777,193 @@ def latest_message(self) -> Optional[str]: text = self._extract_text(parts) return text or None + @staticmethod + def _is_aborted_error(error_obj: object) -> bool: + if not isinstance(error_obj, dict): + return False + name = error_obj.get("name") + if isinstance(name, str) and "aborted" in name.lower(): + return True + data = error_obj.get("data") + if isinstance(data, dict): + msg = data.get("message") + if isinstance(msg, str) and ("aborted" in msg.lower() or "cancel" in msg.lower()): + return True + return False + + @staticmethod + def _extract_req_id_from_text(text: str) -> Optional[str]: + if not text: + return None + m = _REQ_ID_RE.search(text) + return m.group(1).lower() if m else None + + def detect_cancelled_since(self, state: Dict[str, Any], *, req_id: str) -> Tuple[bool, Dict[str, Any]]: + """ + Detect whether the request with `req_id` was cancelled/aborted. + + Observed OpenCode cancellation behavior: + - A new assistant message is written with an `error` like: + {"name":"MessageAbortedError","data":{"message":"The operation was aborted."}} + - That assistant message contains no text parts, so naive reply polling misses it. + """ + req_id = (req_id or "").strip().lower() + if not req_id: + return False, state + + try: + prev_count = int(state.get("assistant_count") or 0) + except Exception: + prev_count = 0 + prev_last = state.get("last_assistant_id") + prev_completed = state.get("last_assistant_completed") + + new_state = self.capture_state() + session_id = new_state.get("session_id") + if not isinstance(session_id, str) or not session_id: + return False, new_state + + messages = self._read_messages(session_id) + assistants = [m for m in messages if m.get("role") == "assistant" and isinstance(m.get("id"), str)] + by_id: dict[str, dict] = {str(m.get("id")): m for m in assistants if isinstance(m.get("id"), str)} + + candidates: list[dict] = [] + if prev_count < len(assistants): + candidates.extend(assistants[prev_count:]) + + # Cancellation can be recorded by updating an existing in-flight assistant message in-place + # (assistant_count unchanged). Always inspect the latest assistant message, and also inspect the + # previous last assistant message when its completed timestamp changed. + last_id = new_state.get("last_assistant_id") + if isinstance(last_id, str) and last_id in by_id and by_id[last_id] not in candidates: + candidates.append(by_id[last_id]) + if ( + isinstance(prev_last, str) + and prev_last in by_id + and prev_last != last_id + and by_id[prev_last] not in candidates + ): + # Include the previous last assistant too (rare session switching / reordering). + candidates.append(by_id[prev_last]) + if ( + isinstance(prev_last, str) + and prev_last in by_id + and prev_last == last_id + and by_id[prev_last] not in candidates + and new_state.get("last_assistant_completed") != prev_completed + ): + candidates.append(by_id[prev_last]) + + if not candidates: + return False, new_state + + for msg in candidates: + if not self._is_aborted_error(msg.get("error")): + continue + parent_id = msg.get("parentID") + if not isinstance(parent_id, str) or not parent_id: + continue + parts = self._read_parts(parent_id) + prompt_text = self._extract_text(parts, allow_reasoning_fallback=True) + prompt_req_id = self._extract_req_id_from_text(prompt_text) + if prompt_req_id and prompt_req_id == req_id: + return True, new_state + + return False, new_state + + def open_cancel_log_cursor(self) -> Dict[str, Any]: + """ + Create a cursor that tails OpenCode's server logs for cancellation/abort events. + + The cursor starts at EOF so only future lines are considered. + """ + path = _latest_opencode_log_file() + if not path: + return {"path": None, "offset": 0} + try: + offset = int(path.stat().st_size) + except Exception: + offset = 0 + return {"path": str(path), "offset": offset, "mtime": float(path.stat().st_mtime) if path.exists() else 0.0} + + def detect_cancel_event_in_logs( + self, cursor: Dict[str, Any], *, session_id: str, since_epoch_s: float + ) -> Tuple[bool, Dict[str, Any]]: + """ + Detect cancellation based on OpenCode log lines. + + This is a fallback for the race where the user interrupts before the prompt/aborted message + is persisted into storage. + """ + if not isinstance(cursor, dict): + cursor = {} + current_path = cursor.get("path") + offset = cursor.get("offset") + cursor_mtime = cursor.get("mtime") + try: + offset_i = int(offset) if offset is not None else 0 + except Exception: + offset_i = 0 + try: + cursor_mtime_f = float(cursor_mtime) if cursor_mtime is not None else 0.0 + except Exception: + cursor_mtime_f = 0.0 + + latest = _latest_opencode_log_file() + if latest is None: + return False, {"path": None, "offset": 0, "mtime": 0.0} + + path = Path(str(current_path)) if isinstance(current_path, str) and current_path else None + if path is None or not path.exists(): + path = latest + offset_i = 0 + cursor_mtime_f = 0.0 + elif latest != path: + # Prefer staying on the same file unless the latest file is clearly newer than our cursor. + try: + latest_mtime = float(latest.stat().st_mtime) + except Exception: + latest_mtime = 0.0 + if latest_mtime > cursor_mtime_f + 0.5: + path = latest + offset_i = 0 + cursor_mtime_f = 0.0 + + try: + size = int(path.stat().st_size) + except Exception: + return False, {"path": str(path), "offset": 0, "mtime": cursor_mtime_f} + + if offset_i < 0 or offset_i > size: + offset_i = 0 + + try: + with path.open("r", encoding="utf-8", errors="replace") as handle: + handle.seek(offset_i) + chunk = handle.read() + except Exception: + return False, {"path": str(path), "offset": size, "mtime": cursor_mtime_f} + + try: + new_cursor_mtime = float(path.stat().st_mtime) + except Exception: + new_cursor_mtime = cursor_mtime_f + new_cursor = {"path": str(path), "offset": size, "mtime": new_cursor_mtime} + if not chunk: + return False, new_cursor + + for line in chunk.splitlines(): + if not _is_cancel_log_line(line, session_id=session_id): + continue + ts = _parse_opencode_log_epoch_s(line) + if ts is None: + continue + if ts + 0.1 < float(since_epoch_s): + continue + return True, new_cursor + + return False, new_cursor + class OpenCodeCommunicator: def __init__(self, lazy_init: bool = False): diff --git a/lib/terminal.py b/lib/terminal.py index 17ff2f8..5c88f9b 100644 --- a/lib/terminal.py +++ b/lib/terminal.py @@ -255,7 +255,10 @@ def is_alive(self, session_id: str) -> bool: try: result = subprocess.run( [self._bin(), "session", "list", "--json"], - capture_output=True, text=True + capture_output=True, + text=True, + encoding="utf-8", + errors="replace", ) if result.returncode != 0: return False From 1f50d7673e2da68194021172d572c449c39cf0c0 Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 10 Jan 2026 12:02:22 +0800 Subject: [PATCH 144/153] fix: sync VERSION constant to 3.0.0 - VERSION was still 2.3.5 while README indicated 3.0.0, causing ccb update to report old version --- ccb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccb b/ccb index 9d00f4b..76b95d1 100755 --- a/ccb +++ b/ccb @@ -37,7 +37,7 @@ backend_env = get_backend_env() if backend_env and not os.environ.get("CCB_BACKEND_ENV"): os.environ["CCB_BACKEND_ENV"] = backend_env -VERSION = "2.3.5" +VERSION = "3.0.0" GIT_COMMIT = "" GIT_DATE = "" From f620982710f57bc8b15d599ab5bc783423db78bd Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 10 Jan 2026 13:05:59 +0800 Subject: [PATCH 145/153] docs: update WeChat QR code image --- assets/weixin.png | Bin 163234 -> 371664 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/weixin.png b/assets/weixin.png index 99a506386e3727f22336a0c2b30b04355fa30956..89e9efa55e1e587e16de86d30cbf8363f8ee596f 100644 GIT binary patch literal 371664 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

5CM~nMo*v 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 Date: Sat, 10 Jan 2026 16:44:20 +0800 Subject: [PATCH 146/153] refactor: extract common daemon logic to shared modules (Step 1-4) - Add lib/env_utils.py: env_bool(), env_int() - Add lib/askd_runtime.py: run_dir(), state_file_path(), log_path(), write_log(), random_token(), normalize_connect_host() - Add lib/askd_rpc.py: read_state(), ping_daemon(), shutdown_daemon() - Add lib/providers.py: ProviderDaemonSpec with CASKD_SPEC/GASKD_SPEC/OASKD_SPEC - Add lib/askd_server.py: unified AskDaemonServer class - Refactor caskd_daemon.py, gaskd_daemon.py, oaskd_daemon.py to use shared modules - Code reduction: -849 lines, +217 lines Co-Authored-By: Warp --- bin/cask | 21 +-- bin/gask | 20 +-- bin/oask | 24 +-- lib/askd_rpc.py | 65 ++++++++ lib/askd_runtime.py | 42 ++++++ lib/askd_server.py | 208 +++++++++++++++++++++++++ lib/caskd_daemon.py | 358 ++++++++++---------------------------------- lib/env_utils.py | 25 ++++ lib/gaskd_daemon.py | 301 +++++++------------------------------ lib/oaskd_daemon.py | 342 ++++++++---------------------------------- lib/providers.py | 43 ++++++ 11 files changed, 600 insertions(+), 849 deletions(-) create mode 100644 lib/askd_rpc.py create mode 100644 lib/askd_runtime.py create mode 100644 lib/askd_server.py create mode 100644 lib/env_utils.py create mode 100644 lib/providers.py diff --git a/bin/cask b/bin/cask index ed1913f..cb6b357 100755 --- a/bin/cask +++ b/bin/cask @@ -25,6 +25,7 @@ from process_lock import ProviderLock COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "EXECUTION_COMPLETE").strip() or "EXECUTION_COMPLETE" +from env_utils import env_bool from caskd_protocol import REQ_ID_PREFIX, make_req_id, strip_done_text, wrap_codex_prompt from caskd_daemon import read_state @@ -160,24 +161,12 @@ def _with_completion_marker_request(message: str) -> str: ) -def _env_bool(name: str, default: bool) -> bool: - raw = os.environ.get(name) - if raw is None or raw == "": - return default - v = raw.strip().lower() - if v in ("0", "false", "no", "off"): - return False - if v in ("1", "true", "yes", "on"): - return True - return default - - def _caskd_autostart_enabled(default: bool = True) -> bool: # Prefer the new name; keep CCB_AUTO_CASKD for backwards compatibility. if "CCB_CASKD_AUTOSTART" in os.environ: - return _env_bool("CCB_CASKD_AUTOSTART", default) + return env_bool("CCB_CASKD_AUTOSTART", default) if "CCB_AUTO_CASKD" in os.environ: - return _env_bool("CCB_AUTO_CASKD", default) + return env_bool("CCB_AUTO_CASKD", default) return default @@ -219,7 +208,7 @@ def _read_project_terminal(work_dir: Path) -> Optional[str]: def _try_daemon_request(work_dir: Path, message: str, timeout: float, quiet: bool) -> Optional[tuple[str, int]]: - if not _env_bool("CCB_CASKD", True): + if not env_bool("CCB_CASKD", True): return None terminal = _read_project_terminal(work_dir) if terminal not in ("wezterm", "iterm2"): @@ -272,7 +261,7 @@ def _try_daemon_request(work_dir: Path, message: str, timeout: float, quiet: boo def _maybe_start_caskd() -> bool: - if not _env_bool("CCB_CASKD", True): + if not env_bool("CCB_CASKD", True): return False if not _caskd_autostart_enabled(True): return False diff --git a/bin/gask b/bin/gask index 088cec8..dc03b5c 100755 --- a/bin/gask +++ b/bin/gask @@ -27,25 +27,15 @@ from cli_output import EXIT_ERROR, EXIT_NO_REPLY, EXIT_OK, atomic_write_text import time - -def _env_bool(name: str, default: bool) -> bool: - raw = os.environ.get(name) - if raw is None or raw == "": - return default - v = raw.strip().lower() - if v in ("0", "false", "no", "off"): - return False - if v in ("1", "true", "yes", "on"): - return True - return default +from env_utils import env_bool def _gaskd_autostart_enabled(default: bool = True) -> bool: # Prefer the new name; keep CCB_AUTO_GASKD for backwards compatibility. if "CCB_GASKD_AUTOSTART" in os.environ: - return _env_bool("CCB_GASKD_AUTOSTART", default) + return env_bool("CCB_GASKD_AUTOSTART", default) if "CCB_AUTO_GASKD" in os.environ: - return _env_bool("CCB_AUTO_GASKD", default) + return env_bool("CCB_AUTO_GASKD", default) return default @@ -71,7 +61,7 @@ def _find_project_session_file(work_dir: Path) -> Path | None: def _try_daemon_request(work_dir: Path, message: str, timeout: float, quiet: bool) -> tuple[str, int] | None: - if not _env_bool("CCB_GASKD", True): + if not env_bool("CCB_GASKD", True): return None if not _find_project_session_file(work_dir): @@ -128,7 +118,7 @@ def _try_daemon_request(work_dir: Path, message: str, timeout: float, quiet: boo def _maybe_start_gaskd() -> bool: - if not _env_bool("CCB_GASKD", True): + if not env_bool("CCB_GASKD", True): return False if not _gaskd_autostart_enabled(True): return False diff --git a/bin/oask b/bin/oask index 783fdc8..394ac99 100755 --- a/bin/oask +++ b/bin/oask @@ -24,25 +24,15 @@ from compat import setup_windows_encoding setup_windows_encoding() from process_lock import ProviderLock - -def _env_bool(name: str, default: bool) -> bool: - raw = os.environ.get(name) - if raw is None or raw == "": - return default - v = raw.strip().lower() - if v in ("0", "false", "no", "off"): - return False - if v in ("1", "true", "yes", "on"): - return True - return default +from env_utils import env_bool def _oaskd_autostart_enabled(default: bool = True) -> bool: # Prefer the new name; keep CCB_AUTO_OASKD for backwards compatibility. if "CCB_OASKD_AUTOSTART" in os.environ: - return _env_bool("CCB_OASKD_AUTOSTART", default) + return env_bool("CCB_OASKD_AUTOSTART", default) if "CCB_AUTO_OASKD" in os.environ: - return _env_bool("CCB_AUTO_OASKD", default) + return env_bool("CCB_AUTO_OASKD", default) return default @@ -68,7 +58,7 @@ def _find_project_session_file(work_dir: Path) -> Optional[Path]: def _try_daemon_request(work_dir: Path, message: str, timeout: float, quiet: bool) -> Optional[tuple[str, int]]: - if not _env_bool("CCB_OASKD", True): + if not env_bool("CCB_OASKD", True): return None if not _find_project_session_file(work_dir): @@ -137,7 +127,7 @@ def _daemon_request_with_retries(work_dir: Path, message: str, timeout: float, q return result # If daemon mode is disabled or no session, don't spin. - if not _env_bool("CCB_OASKD", True): + if not env_bool("CCB_OASKD", True): return None if not _find_project_session_file(work_dir): return None @@ -173,7 +163,7 @@ def _daemon_request_with_retries(work_dir: Path, message: str, timeout: float, q def _maybe_start_oaskd() -> bool: - if not _env_bool("CCB_OASKD", True): + if not env_bool("CCB_OASKD", True): return False if not _oaskd_autostart_enabled(True): return False @@ -256,7 +246,7 @@ def _wait_for_done_reply(log_reader, state: dict, timeout: float, req_id: str, q deadline = time.time() + timeout chunks: list[str] = [] - cancel_enabled = _env_bool("CCB_OASKD_CANCEL_DETECT", False) + cancel_enabled = env_bool("CCB_OASKD_CANCEL_DETECT", False) session_id = state.get("session_id") if cancel_enabled and isinstance(state.get("session_id"), str) else None cancel_cursor = log_reader.open_cancel_log_cursor() if cancel_enabled and session_id else None cancel_since_s = time.time() if cancel_enabled else 0.0 diff --git a/lib/askd_rpc.py b/lib/askd_rpc.py new file mode 100644 index 0000000..b974d1d --- /dev/null +++ b/lib/askd_rpc.py @@ -0,0 +1,65 @@ +from __future__ import annotations + +import json +import socket +import time +from pathlib import Path + + +def read_state(state_file: Path) -> dict | None: + try: + raw = state_file.read_text(encoding="utf-8") + obj = json.loads(raw) + return obj if isinstance(obj, dict) else None + except Exception: + return None + + +def ping_daemon(protocol_prefix: str, timeout_s: float, state_file: Path) -> bool: + st = read_state(state_file) + if not st: + return False + try: + host = st.get("connect_host") or st["host"] + port = int(st["port"]) + token = st["token"] + except Exception: + return False + try: + with socket.create_connection((host, port), timeout=timeout_s) as sock: + req = {"type": f"{protocol_prefix}.ping", "v": 1, "id": "ping", "token": token} + sock.sendall((json.dumps(req) + "\n").encode("utf-8")) + buf = b"" + deadline = time.time() + timeout_s + while b"\n" not in buf and time.time() < deadline: + chunk = sock.recv(1024) + if not chunk: + break + buf += chunk + if b"\n" not in buf: + return False + line = buf.split(b"\n", 1)[0].decode("utf-8", errors="replace") + resp = json.loads(line) + return resp.get("type") in (f"{protocol_prefix}.pong", f"{protocol_prefix}.response") and int(resp.get("exit_code") or 0) == 0 + except Exception: + return False + + +def shutdown_daemon(protocol_prefix: str, timeout_s: float, state_file: Path) -> bool: + st = read_state(state_file) + if not st: + return False + try: + host = st.get("connect_host") or st["host"] + port = int(st["port"]) + token = st["token"] + except Exception: + return False + try: + with socket.create_connection((host, port), timeout=timeout_s) as sock: + req = {"type": f"{protocol_prefix}.shutdown", "v": 1, "id": "shutdown", "token": token} + sock.sendall((json.dumps(req) + "\n").encode("utf-8")) + _ = sock.recv(1024) + return True + except Exception: + return False diff --git a/lib/askd_runtime.py b/lib/askd_runtime.py new file mode 100644 index 0000000..218161f --- /dev/null +++ b/lib/askd_runtime.py @@ -0,0 +1,42 @@ +from __future__ import annotations + +import os +from pathlib import Path + + +def run_dir() -> Path: + return Path.home() / ".cache" / "ccb" + + +def state_file_path(name: str) -> Path: + if name.endswith(".json"): + return run_dir() / name + return run_dir() / f"{name}.json" + + +def log_path(name: str) -> Path: + if name.endswith(".log"): + return run_dir() / name + return run_dir() / f"{name}.log" + + +def write_log(path: Path, msg: str) -> None: + try: + path.parent.mkdir(parents=True, exist_ok=True) + with path.open("a", encoding="utf-8") as handle: + handle.write(msg.rstrip() + "\n") + except Exception: + pass + + +def random_token() -> str: + return os.urandom(16).hex() + + +def normalize_connect_host(host: str) -> str: + host = (host or "").strip() + if not host or host in ("0.0.0.0",): + return "127.0.0.1" + if host in ("::", "[::]"): + return "::1" + return host diff --git a/lib/askd_server.py b/lib/askd_server.py new file mode 100644 index 0000000..9ba81bc --- /dev/null +++ b/lib/askd_server.py @@ -0,0 +1,208 @@ +from __future__ import annotations + +import json +import os +import socketserver +import sys +import threading +import time +from pathlib import Path +from typing import Callable, Optional + +from askd_runtime import log_path, normalize_connect_host, run_dir, write_log +from process_lock import ProviderLock +from providers import ProviderDaemonSpec +from session_utils import safe_write_session + +RequestHandler = Callable[[dict], dict] + + +class AskDaemonServer: + def __init__( + self, + *, + spec: ProviderDaemonSpec, + host: str = "127.0.0.1", + port: int = 0, + token: str, + state_file: Path, + request_handler: RequestHandler, + request_queue_size: Optional[int] = None, + on_stop: Optional[Callable[[], None]] = None, + ): + self.spec = spec + self.host = host + self.port = port + self.token = token + self.state_file = state_file + self.request_handler = request_handler + self.request_queue_size = request_queue_size + self.on_stop = on_stop + + def serve_forever(self) -> int: + run_dir().mkdir(parents=True, exist_ok=True) + + lock = ProviderLock(self.spec.lock_name, cwd="global", timeout=0.1) + if not lock.try_acquire(): + return 2 + + protocol_prefix = self.spec.protocol_prefix + response_type = f"{protocol_prefix}.response" + + class Handler(socketserver.StreamRequestHandler): + def handle(self) -> None: + with self.server.activity_lock: + self.server.active_requests += 1 + self.server.last_activity = time.time() + + try: + line = self.rfile.readline() + if not line: + return + msg = json.loads(line.decode("utf-8", errors="replace")) + except Exception: + return + + if msg.get("token") != self.server.token: + self._write({"type": response_type, "v": 1, "id": msg.get("id"), "exit_code": 1, "reply": "Unauthorized"}) + return + + msg_type = msg.get("type") + if msg_type == f"{protocol_prefix}.ping": + self._write({"type": f"{protocol_prefix}.pong", "v": 1, "id": msg.get("id"), "exit_code": 0, "reply": "OK"}) + return + + if msg_type == f"{protocol_prefix}.shutdown": + self._write({"type": response_type, "v": 1, "id": msg.get("id"), "exit_code": 0, "reply": "OK"}) + threading.Thread(target=self.server.shutdown, daemon=True).start() + return + + if msg_type != f"{protocol_prefix}.request": + self._write({"type": response_type, "v": 1, "id": msg.get("id"), "exit_code": 1, "reply": "Invalid request"}) + return + + try: + resp = self.server.request_handler(msg) + except Exception as exc: + try: + write_log(log_path(self.server.spec.log_file_name), f"[ERROR] request handler error: {exc}") + except Exception: + pass + self._write({"type": response_type, "v": 1, "id": msg.get("id"), "exit_code": 1, "reply": f"Internal error: {exc}"}) + return + + if isinstance(resp, dict): + self._write(resp) + else: + self._write({"type": response_type, "v": 1, "id": msg.get("id"), "exit_code": 1, "reply": "Invalid response"}) + + def _write(self, obj: dict) -> None: + try: + data = (json.dumps(obj, ensure_ascii=False) + "\n").encode("utf-8") + self.wfile.write(data) + self.wfile.flush() + try: + with self.server.activity_lock: + self.server.last_activity = time.time() + except Exception: + pass + except Exception: + pass + + def finish(self) -> None: + try: + super().finish() + finally: + try: + with self.server.activity_lock: + if self.server.active_requests > 0: + self.server.active_requests -= 1 + self.server.last_activity = time.time() + except Exception: + pass + + class Server(socketserver.ThreadingTCPServer): + allow_reuse_address = True + + if self.request_queue_size is not None: + try: + Server.request_queue_size = int(self.request_queue_size) + except Exception: + pass + + try: + with Server((self.host, self.port), Handler) as httpd: + httpd.spec = self.spec + httpd.token = self.token + httpd.request_handler = self.request_handler + httpd.active_requests = 0 + httpd.last_activity = time.time() + httpd.activity_lock = threading.Lock() + try: + httpd.idle_timeout_s = float(os.environ.get(self.spec.idle_timeout_env, "60") or "60") + except Exception: + httpd.idle_timeout_s = 60.0 + + def _idle_monitor() -> None: + timeout_s = float(getattr(httpd, "idle_timeout_s", 60.0) or 0.0) + if timeout_s <= 0: + return + while True: + time.sleep(0.5) + try: + with httpd.activity_lock: + active = int(httpd.active_requests or 0) + last = float(httpd.last_activity or time.time()) + except Exception: + active = 0 + last = time.time() + if active == 0 and (time.time() - last) >= timeout_s: + write_log( + log_path(self.spec.log_file_name), + f"[INFO] {self.spec.daemon_key} idle timeout ({int(timeout_s)}s) reached; shutting down", + ) + threading.Thread(target=httpd.shutdown, daemon=True).start() + return + + threading.Thread(target=_idle_monitor, daemon=True).start() + + actual_host, actual_port = httpd.server_address + self._write_state(str(actual_host), int(actual_port)) + write_log( + log_path(self.spec.log_file_name), + f"[INFO] {self.spec.daemon_key} started pid={os.getpid()} addr={actual_host}:{actual_port}", + ) + try: + httpd.serve_forever(poll_interval=0.2) + finally: + write_log(log_path(self.spec.log_file_name), f"[INFO] {self.spec.daemon_key} stopped") + if self.on_stop: + try: + self.on_stop() + except Exception: + pass + finally: + try: + lock.release() + except Exception: + pass + return 0 + + def _write_state(self, host: str, port: int) -> None: + payload = { + "pid": os.getpid(), + "host": host, + "connect_host": normalize_connect_host(host), + "port": port, + "token": self.token, + "started_at": time.strftime("%Y-%m-%d %H:%M:%S"), + "python": sys.executable, + } + self.state_file.parent.mkdir(parents=True, exist_ok=True) + ok, _err = safe_write_session(self.state_file, json.dumps(payload, ensure_ascii=False, indent=2) + "\n") + if ok: + try: + os.chmod(self.state_file, 0o600) + except Exception: + pass + diff --git a/lib/caskd_daemon.py b/lib/caskd_daemon.py index b83537c..f54d5fe 100644 --- a/lib/caskd_daemon.py +++ b/lib/caskd_daemon.py @@ -3,9 +3,6 @@ import json import os import queue -import socket -import socketserver -import sys import threading import time from dataclasses import dataclass @@ -16,7 +13,7 @@ CaskdRequest, CaskdResult, REQ_ID_PREFIX, - DONE_PREFIX, + make_req_id, is_done_text, strip_done_text, @@ -24,49 +21,17 @@ ) from caskd_session import CodexProjectSession, compute_session_key, find_project_session_file, load_project_session from codex_comm import CodexLogReader, CodexCommunicator -from process_lock import ProviderLock -from session_utils import safe_write_session from terminal import get_backend_for_session +from askd_runtime import state_file_path, log_path, write_log, random_token +import askd_rpc +from askd_server import AskDaemonServer +from providers import CASKD_SPEC def _now_ms() -> int: return int(time.time() * 1000) -def _run_dir() -> Path: - return Path.home() / ".ccb" / "run" - - -def _state_file_path() -> Path: - return _run_dir() / "caskd.json" - - -def _log_path() -> Path: - return _run_dir() / "caskd.log" - - -def _write_log(line: str) -> None: - try: - _run_dir().mkdir(parents=True, exist_ok=True) - with _log_path().open("a", encoding="utf-8") as handle: - handle.write(line.rstrip() + "\n") - except Exception: - pass - - -def _random_token() -> str: - return os.urandom(16).hex() - - -def _normalize_connect_host(host: str) -> str: - host = (host or "").strip() - if not host or host in ("0.0.0.0",): - return "127.0.0.1" - if host in ("::", "[::]"): - return "::1" - return host - - def _extract_codex_session_id_from_log(log_path: Path) -> Optional[str]: try: return CodexCommunicator._extract_session_id(log_path) @@ -116,7 +81,7 @@ def run(self) -> None: try: task.result = self._handle_task(task) except Exception as exc: - _write_log(f"[ERROR] session={self.session_key} req_id={task.req_id} {exc}") + write_log(log_path(CASKD_SPEC.log_file_name), f"[ERROR] session={self.session_key} req_id={task.req_id} {exc}") task.result = CaskdResult( exit_code=1, reply=str(exc), @@ -134,7 +99,7 @@ def _handle_task(self, task: _QueuedTask) -> CaskdResult: started_ms = _now_ms() req = task.request work_dir = Path(req.work_dir) - _write_log(f"[INFO] start session={self.session_key} req_id={task.req_id} work_dir={req.work_dir}") + write_log(log_path(CASKD_SPEC.log_file_name), f"[INFO] start session={self.session_key} req_id={task.req_id} work_dir={req.work_dir}") session = load_project_session(work_dir) if not session: return CaskdResult( @@ -229,20 +194,20 @@ def _handle_task(self, task: _QueuedTask) -> CaskdResult: except Exception: alive = False if not alive: - _write_log(f"[ERROR] Pane {pane_id} died during request session={self.session_key} req_id={task.req_id}") - log_path = None + write_log(log_path(CASKD_SPEC.log_file_name), f"[ERROR] Pane {pane_id} died during request session={self.session_key} req_id={task.req_id}") + codex_log_path = None try: lp = reader.current_log_path() if lp: - log_path = str(lp) + codex_log_path = str(lp) except Exception: - log_path = None + codex_log_path = None return CaskdResult( exit_code=1, reply="❌ Codex pane died during request", req_id=task.req_id, session_key=self.session_key, - log_path=log_path, + log_path=codex_log_path, anchor_seen=anchor_seen, done_seen=False, fallback_scan=fallback_scan, @@ -264,20 +229,20 @@ def _handle_task(self, task: _QueuedTask) -> CaskdResult: else: is_current_interrupt = False if is_current_interrupt: - _write_log(f"[WARN] Codex interrupted - skipping task session={self.session_key} req_id={task.req_id}") - log_path = None + write_log(log_path(CASKD_SPEC.log_file_name), f"[WARN] Codex interrupted - skipping task session={self.session_key} req_id={task.req_id}") + codex_log_path = None try: lp = reader.current_log_path() if lp: - log_path = str(lp) + codex_log_path = str(lp) except Exception: - log_path = None + codex_log_path = None return CaskdResult( exit_code=1, reply="❌ Codex interrupted. Please recover Codex manually, then retry. Skipping to next task.", req_id=task.req_id, session_key=self.session_key, - log_path=log_path, + log_path=codex_log_path, anchor_seen=anchor_seen, done_seen=False, fallback_scan=fallback_scan, @@ -326,17 +291,17 @@ def _handle_task(self, task: _QueuedTask) -> CaskdResult: combined = "\n".join(chunks) reply = strip_done_text(combined, task.req_id) - log_path = None + codex_log_path = None try: lp = state.get("log_path") if lp: - log_path = str(lp) + codex_log_path = str(lp) except Exception: - log_path = None + codex_log_path = None - if done_seen and log_path: - sid = _extract_codex_session_id_from_log(Path(log_path)) - session.update_codex_log_binding(log_path=log_path, session_id=sid) + if done_seen and codex_log_path: + sid = _extract_codex_session_id_from_log(Path(codex_log_path)) + session.update_codex_log_binding(log_path=codex_log_path, session_id=sid) exit_code = 0 if done_seen else 2 result = CaskdResult( @@ -344,14 +309,14 @@ def _handle_task(self, task: _QueuedTask) -> CaskdResult: reply=reply, req_id=task.req_id, session_key=self.session_key, - log_path=log_path, + log_path=codex_log_path, anchor_seen=anchor_seen, done_seen=done_seen, fallback_scan=fallback_scan, anchor_ms=anchor_ms, done_ms=done_ms, ) - _write_log( + write_log(log_path(CASKD_SPEC.log_file_name), f"[INFO] done session={self.session_key} req_id={task.req_id} exit={result.exit_code} " f"anchor={result.anchor_seen} done={result.done_seen} fallback={result.fallback_scan} " f"log={result.log_path or ''} anchor_ms={result.anchor_ms or ''} done_ms={result.done_ms or ''}" @@ -400,7 +365,7 @@ def get_session(self, work_dir: Path) -> Optional[CodexProjectSession]: try: current_mtime = session_file.stat().st_mtime if (not entry.session_file) or (session_file != entry.session_file) or (current_mtime != entry.file_mtime): - _write_log(f"[INFO] Session file changed, reloading: {work_dir}") + write_log(log_path(CASKD_SPEC.log_file_name), f"[INFO] Session file changed, reloading: {work_dir}") entry = self._load_and_cache(work_dir) except Exception: pass @@ -448,14 +413,14 @@ def invalidate(self, work_dir: Path) -> None: with self._lock: if key in self._sessions: self._sessions[key].valid = False - _write_log(f"[INFO] Session invalidated: {work_dir}") + write_log(log_path(CASKD_SPEC.log_file_name), f"[INFO] Session invalidated: {work_dir}") def remove(self, work_dir: Path) -> None: key = str(work_dir) with self._lock: if key in self._sessions: del self._sessions[key] - _write_log(f"[INFO] Session removed: {work_dir}") + write_log(log_path(CASKD_SPEC.log_file_name), f"[INFO] Session removed: {work_dir}") def _monitor_loop(self) -> None: while not self._stop.wait(self.CHECK_INTERVAL): @@ -468,13 +433,13 @@ def _check_all_sessions(self) -> None: if not entry.valid: continue if entry.session_file and not entry.session_file.exists(): - _write_log(f"[WARN] Session file deleted: {entry.work_dir}") + write_log(log_path(CASKD_SPEC.log_file_name), f"[WARN] Session file deleted: {entry.work_dir}") entry.valid = False continue if entry.session: ok, _ = entry.session.ensure_pane() if not ok: - _write_log(f"[WARN] Session pane invalid: {entry.work_dir}") + write_log(log_path(CASKD_SPEC.log_file_name), f"[WARN] Session pane invalid: {entry.work_dir}") entry.valid = False entry.last_check = time.time() for key, entry in list(self._sessions.items()): @@ -530,232 +495,69 @@ class CaskdServer: def __init__(self, host: str = "127.0.0.1", port: int = 0, *, state_file: Optional[Path] = None): self.host = host self.port = port - self.state_file = state_file or _state_file_path() - self.token = _random_token() + self.state_file = state_file or state_file_path(CASKD_SPEC.state_file_name) + self.token = random_token() self.pool = _WorkerPool() def serve_forever(self) -> int: - _run_dir().mkdir(parents=True, exist_ok=True) - - # Single-instance lock (global, not per-cwd) - lock = ProviderLock("caskd", cwd="global", timeout=0.1) - if not lock.try_acquire(): - return 2 - - class Handler(socketserver.StreamRequestHandler): - def handle(self) -> None: - with self.server.activity_lock: - self.server.active_requests += 1 - self.server.last_activity = time.time() - - try: - line = self.rfile.readline() - if not line: - return - msg = json.loads(line.decode("utf-8", errors="replace")) - except Exception: - return - - if msg.get("token") != self.server.token: - self._write({"type": "cask.response", "v": 1, "id": msg.get("id"), "exit_code": 1, "reply": "Unauthorized"}) - return - - if msg.get("type") == "cask.ping": - self._write({"type": "cask.pong", "v": 1, "id": msg.get("id"), "exit_code": 0, "reply": "OK"}) - return - - if msg.get("type") == "cask.shutdown": - self._write({"type": "cask.response", "v": 1, "id": msg.get("id"), "exit_code": 0, "reply": "OK"}) - threading.Thread(target=self.server.shutdown, daemon=True).start() - return - - if msg.get("type") != "cask.request": - self._write({"type": "cask.response", "v": 1, "id": msg.get("id"), "exit_code": 1, "reply": "Invalid request"}) - return - - try: - req = CaskdRequest( - client_id=str(msg.get("id") or ""), - work_dir=str(msg.get("work_dir") or ""), - timeout_s=float(msg.get("timeout_s") or 300.0), - quiet=bool(msg.get("quiet") or False), - message=str(msg.get("message") or ""), - output_path=str(msg.get("output_path")) if msg.get("output_path") else None, - ) - except Exception as exc: - self._write({"type": "cask.response", "v": 1, "id": msg.get("id"), "exit_code": 1, "reply": f"Bad request: {exc}"}) - return - - task = self.server.pool.submit(req) - task.done_event.wait(timeout=req.timeout_s + 5.0) - result = task.result - if not result: - self._write({"type": "cask.response", "v": 1, "id": req.client_id, "exit_code": 2, "reply": ""}) - return - - self._write( - { - "type": "cask.response", - "v": 1, - "id": req.client_id, - "req_id": result.req_id, - "exit_code": result.exit_code, - "reply": result.reply, - "meta": { - "session_key": result.session_key, - "log_path": result.log_path, - "anchor_seen": result.anchor_seen, - "done_seen": result.done_seen, - "fallback_scan": result.fallback_scan, - "anchor_ms": result.anchor_ms, - "done_ms": result.done_ms, - }, - } + def _handle_request(msg: dict) -> dict: + try: + req = CaskdRequest( + client_id=str(msg.get("id") or ""), + work_dir=str(msg.get("work_dir") or ""), + timeout_s=float(msg.get("timeout_s") or 300.0), + quiet=bool(msg.get("quiet") or False), + message=str(msg.get("message") or ""), + output_path=str(msg.get("output_path")) if msg.get("output_path") else None, ) + except Exception as exc: + return {"type": "cask.response", "v": 1, "id": msg.get("id"), "exit_code": 1, "reply": f"Bad request: {exc}"} - def _write(self, obj: dict) -> None: - try: - data = (json.dumps(obj, ensure_ascii=False) + "\n").encode("utf-8") - self.wfile.write(data) - self.wfile.flush() - try: - with self.server.activity_lock: - self.server.last_activity = time.time() - except Exception: - pass - except Exception: - pass - - def finish(self) -> None: - try: - super().finish() - finally: - try: - with self.server.activity_lock: - if self.server.active_requests > 0: - self.server.active_requests -= 1 - self.server.last_activity = time.time() - except Exception: - pass + task = self.pool.submit(req) + task.done_event.wait(timeout=req.timeout_s + 5.0) + result = task.result + if not result: + return {"type": "cask.response", "v": 1, "id": req.client_id, "exit_code": 2, "reply": ""} - class Server(socketserver.ThreadingTCPServer): - allow_reuse_address = True + return { + "type": "cask.response", + "v": 1, + "id": req.client_id, + "req_id": result.req_id, + "exit_code": result.exit_code, + "reply": result.reply, + "meta": { + "session_key": result.session_key, + "log_path": result.log_path, + "anchor_seen": result.anchor_seen, + "done_seen": result.done_seen, + "fallback_scan": result.fallback_scan, + "anchor_ms": result.anchor_ms, + "done_ms": result.done_ms, + }, + } - with Server((self.host, self.port), Handler) as httpd: - httpd.token = self.token - httpd.pool = self.pool - httpd.active_requests = 0 - httpd.last_activity = time.time() - httpd.activity_lock = threading.Lock() - try: - httpd.idle_timeout_s = float(os.environ.get("CCB_CASKD_IDLE_TIMEOUT_S", "60") or "60") - except Exception: - httpd.idle_timeout_s = 60.0 - - def _idle_monitor() -> None: - timeout_s = float(getattr(httpd, "idle_timeout_s", 60.0) or 0.0) - if timeout_s <= 0: - return - while True: - time.sleep(0.5) - try: - with httpd.activity_lock: - active = int(httpd.active_requests or 0) - last = float(httpd.last_activity or time.time()) - except Exception: - active = 0 - last = time.time() - if active == 0 and (time.time() - last) >= timeout_s: - _write_log(f"[INFO] caskd idle timeout ({int(timeout_s)}s) reached; shutting down") - threading.Thread(target=httpd.shutdown, daemon=True).start() - return - - threading.Thread(target=_idle_monitor, daemon=True).start() - - actual_host, actual_port = httpd.server_address - self._write_state(actual_host, int(actual_port)) - _write_log(f"[INFO] caskd started pid={os.getpid()} addr={actual_host}:{actual_port}") - try: - httpd.serve_forever(poll_interval=0.2) - finally: - _write_log("[INFO] caskd stopped") - return 0 - - def _write_state(self, host: str, port: int) -> None: - payload = { - "pid": os.getpid(), - "host": host, - "connect_host": _normalize_connect_host(host), - "port": port, - "token": self.token, - "started_at": time.strftime("%Y-%m-%d %H:%M:%S"), - "python": sys.executable, - } - self.state_file.parent.mkdir(parents=True, exist_ok=True) - ok, _err = safe_write_session(self.state_file, json.dumps(payload, ensure_ascii=False, indent=2) + "\n") - if ok: - try: - os.chmod(self.state_file, 0o600) - except Exception: - pass + server = AskDaemonServer( + spec=CASKD_SPEC, + host=self.host, + port=self.port, + token=self.token, + state_file=self.state_file, + request_handler=_handle_request, + ) + return server.serve_forever() def read_state(state_file: Optional[Path] = None) -> Optional[dict]: - state_file = state_file or _state_file_path() - try: - raw = state_file.read_text(encoding="utf-8") - obj = json.loads(raw) - return obj if isinstance(obj, dict) else None - except Exception: - return None + state_file = state_file or state_file_path(CASKD_SPEC.state_file_name) + return askd_rpc.read_state(state_file) def ping_daemon(timeout_s: float = 0.5, state_file: Optional[Path] = None) -> bool: - st = read_state(state_file) - if not st: - return False - try: - host = st.get("connect_host") or st["host"] - port = int(st["port"]) - token = st["token"] - except Exception: - return False - try: - with socket.create_connection((host, port), timeout=timeout_s) as sock: - req = {"type": "cask.ping", "v": 1, "id": "ping", "token": token} - sock.sendall((json.dumps(req) + "\n").encode("utf-8")) - buf = b"" - deadline = time.time() + timeout_s - while b"\n" not in buf and time.time() < deadline: - chunk = sock.recv(1024) - if not chunk: - break - buf += chunk - if b"\n" not in buf: - return False - line = buf.split(b"\n", 1)[0].decode("utf-8", errors="replace") - resp = json.loads(line) - return resp.get("type") in ("cask.pong", "cask.response") and int(resp.get("exit_code") or 0) == 0 - return True - except Exception: - return False + state_file = state_file or state_file_path(CASKD_SPEC.state_file_name) + return askd_rpc.ping_daemon("cask", timeout_s, state_file) def shutdown_daemon(timeout_s: float = 1.0, state_file: Optional[Path] = None) -> bool: - st = read_state(state_file) - if not st: - return False - try: - host = st.get("connect_host") or st["host"] - port = int(st["port"]) - token = st["token"] - except Exception: - return False - try: - with socket.create_connection((host, port), timeout=timeout_s) as sock: - req = {"type": "cask.shutdown", "v": 1, "id": "shutdown", "token": token} - sock.sendall((json.dumps(req) + "\n").encode("utf-8")) - _ = sock.recv(1024) - return True - except Exception: - return False + state_file = state_file or state_file_path(CASKD_SPEC.state_file_name) + return askd_rpc.shutdown_daemon("cask", timeout_s, state_file) diff --git a/lib/env_utils.py b/lib/env_utils.py new file mode 100644 index 0000000..1be5076 --- /dev/null +++ b/lib/env_utils.py @@ -0,0 +1,25 @@ +from __future__ import annotations + +import os + + +def env_bool(name: str, default: bool = False) -> bool: + raw = os.environ.get(name) + if raw is None or raw == "": + return default + v = raw.strip().lower() + if v in ("0", "false", "no", "off"): + return False + if v in ("1", "true", "yes", "on"): + return True + return default + + +def env_int(name: str, default: int) -> int: + raw = os.environ.get(name) + if raw is None or raw == "": + return default + try: + return int(raw.strip()) + except (ValueError, TypeError): + return default diff --git a/lib/gaskd_daemon.py b/lib/gaskd_daemon.py index eb7d418..8f2fdd9 100644 --- a/lib/gaskd_daemon.py +++ b/lib/gaskd_daemon.py @@ -3,9 +3,6 @@ import json import os import queue -import socket -import socketserver -import sys import threading import time from dataclasses import dataclass @@ -22,47 +19,19 @@ ) from gaskd_session import compute_session_key, load_project_session from gemini_comm import GeminiLogReader -from process_lock import ProviderLock -from session_utils import safe_write_session from terminal import get_backend_for_session +from askd_runtime import state_file_path, log_path, write_log, random_token +import askd_rpc +from askd_server import AskDaemonServer +from providers import GASKD_SPEC def _now_ms() -> int: return int(time.time() * 1000) -def _run_dir() -> Path: - return Path.home() / ".ccb" / "run" - - -def _state_file_path() -> Path: - return _run_dir() / "gaskd.json" - - -def _log_path() -> Path: - return _run_dir() / "gaskd.log" - - def _write_log(line: str) -> None: - try: - _run_dir().mkdir(parents=True, exist_ok=True) - with _log_path().open("a", encoding="utf-8") as handle: - handle.write(line.rstrip() + "\n") - except Exception: - pass - - -def _random_token() -> str: - return os.urandom(16).hex() - - -def _normalize_connect_host(host: str) -> str: - host = (host or "").strip() - if not host or host in ("0.0.0.0",): - return "127.0.0.1" - if host in ("::", "[::]"): - return "::1" - return host + write_log(log_path(GASKD_SPEC.log_file_name), line) def _is_cancel_text(text: str) -> bool: @@ -331,227 +300,65 @@ class GaskdServer: def __init__(self, host: str = "127.0.0.1", port: int = 0, *, state_file: Optional[Path] = None): self.host = host self.port = port - self.state_file = state_file or _state_file_path() - self.token = _random_token() + self.state_file = state_file or state_file_path(GASKD_SPEC.state_file_name) + self.token = random_token() self.pool = _WorkerPool() def serve_forever(self) -> int: - _run_dir().mkdir(parents=True, exist_ok=True) - - lock = ProviderLock("gaskd", cwd="global", timeout=0.1) - if not lock.try_acquire(): - return 2 - - class Handler(socketserver.StreamRequestHandler): - def handle(self) -> None: - with self.server.activity_lock: - self.server.active_requests += 1 - self.server.last_activity = time.time() - try: - line = self.rfile.readline() - if not line: - return - msg = json.loads(line.decode("utf-8", errors="replace")) - except Exception: - return - - if msg.get("token") != self.server.token: - self._write({"type": "gask.response", "v": 1, "id": msg.get("id"), "exit_code": 1, "reply": "Unauthorized"}) - return - - if msg.get("type") == "gask.ping": - self._write({"type": "gask.pong", "v": 1, "id": msg.get("id"), "exit_code": 0, "reply": "OK"}) - return - - if msg.get("type") == "gask.shutdown": - self._write({"type": "gask.response", "v": 1, "id": msg.get("id"), "exit_code": 0, "reply": "OK"}) - threading.Thread(target=self.server.shutdown, daemon=True).start() - return - - if msg.get("type") != "gask.request": - self._write({"type": "gask.response", "v": 1, "id": msg.get("id"), "exit_code": 1, "reply": "Invalid request"}) - return - - try: - req = GaskdRequest( - client_id=str(msg.get("id") or ""), - work_dir=str(msg.get("work_dir") or ""), - timeout_s=float(msg.get("timeout_s") or 300.0), - quiet=bool(msg.get("quiet") or False), - message=str(msg.get("message") or ""), - output_path=str(msg.get("output_path")) if msg.get("output_path") else None, - ) - except Exception as exc: - self._write({"type": "gask.response", "v": 1, "id": msg.get("id"), "exit_code": 1, "reply": f"Bad request: {exc}"}) - return - - task = self.server.pool.submit(req) - task.done_event.wait(timeout=req.timeout_s + 5.0) - result = task.result - if not result: - self._write({"type": "gask.response", "v": 1, "id": req.client_id, "exit_code": 2, "reply": ""}) - return - - self._write( - { - "type": "gask.response", - "v": 1, - "id": req.client_id, - "req_id": result.req_id, - "exit_code": result.exit_code, - "reply": result.reply, - "meta": { - "session_key": result.session_key, - "done_seen": result.done_seen, - "done_ms": result.done_ms, - }, - } - ) - - def _write(self, obj: dict) -> None: - try: - data = (json.dumps(obj, ensure_ascii=False) + "\n").encode("utf-8") - self.wfile.write(data) - self.wfile.flush() - try: - with self.server.activity_lock: - self.server.last_activity = time.time() - except Exception: - pass - except Exception: - pass - - def finish(self) -> None: - try: - super().finish() - finally: - try: - with self.server.activity_lock: - if self.server.active_requests > 0: - self.server.active_requests -= 1 - self.server.last_activity = time.time() - except Exception: - pass - - class Server(socketserver.ThreadingTCPServer): - allow_reuse_address = True - - with Server((self.host, self.port), Handler) as httpd: - httpd.token = self.token - httpd.pool = self.pool - httpd.active_requests = 0 - httpd.last_activity = time.time() - httpd.activity_lock = threading.Lock() + def _handle_request(msg: dict) -> dict: try: - httpd.idle_timeout_s = float(os.environ.get("CCB_GASKD_IDLE_TIMEOUT_S", "60") or "60") - except Exception: - httpd.idle_timeout_s = 60.0 - - def _idle_monitor() -> None: - # Shutdown once idle for idle_timeout_s with no active client connections. - # Disable by setting CCB_GASKD_IDLE_TIMEOUT_S=0. - timeout_s = float(getattr(httpd, "idle_timeout_s", 60.0) or 0.0) - if timeout_s <= 0: - return - while True: - time.sleep(0.5) - try: - with httpd.activity_lock: - active = int(httpd.active_requests or 0) - last = float(httpd.last_activity or time.time()) - except Exception: - active = 0 - last = time.time() - if active == 0 and (time.time() - last) >= timeout_s: - _write_log(f"[INFO] gaskd idle timeout ({int(timeout_s)}s) reached; shutting down") - threading.Thread(target=httpd.shutdown, daemon=True).start() - return - - threading.Thread(target=_idle_monitor, daemon=True).start() - - actual_host, actual_port = httpd.server_address - self._write_state(actual_host, int(actual_port)) - _write_log(f"[INFO] gaskd started pid={os.getpid()} addr={actual_host}:{actual_port}") - try: - httpd.serve_forever(poll_interval=0.2) - finally: - _write_log("[INFO] gaskd stopped") - return 0 - - def _write_state(self, host: str, port: int) -> None: - payload = { - "pid": os.getpid(), - "host": host, - "connect_host": _normalize_connect_host(host), - "port": port, - "token": self.token, - "started_at": time.strftime("%Y-%m-%d %H:%M:%S"), - "python": sys.executable, - } - self.state_file.parent.mkdir(parents=True, exist_ok=True) - ok, _err = safe_write_session(self.state_file, json.dumps(payload, ensure_ascii=False, indent=2) + "\n") - if ok: - try: - os.chmod(self.state_file, 0o600) - except Exception: - pass + req = GaskdRequest( + client_id=str(msg.get("id") or ""), + work_dir=str(msg.get("work_dir") or ""), + timeout_s=float(msg.get("timeout_s") or 300.0), + quiet=bool(msg.get("quiet") or False), + message=str(msg.get("message") or ""), + output_path=str(msg.get("output_path")) if msg.get("output_path") else None, + ) + except Exception as exc: + return {"type": "gask.response", "v": 1, "id": msg.get("id"), "exit_code": 1, "reply": f"Bad request: {exc}"} + + task = self.pool.submit(req) + task.done_event.wait(timeout=req.timeout_s + 5.0) + result = task.result + if not result: + return {"type": "gask.response", "v": 1, "id": req.client_id, "exit_code": 2, "reply": ""} + + return { + "type": "gask.response", + "v": 1, + "id": req.client_id, + "req_id": result.req_id, + "exit_code": result.exit_code, + "reply": result.reply, + "meta": { + "session_key": result.session_key, + "done_seen": result.done_seen, + "done_ms": result.done_ms, + }, + } + + server = AskDaemonServer( + spec=GASKD_SPEC, + host=self.host, + port=self.port, + token=self.token, + state_file=self.state_file, + request_handler=_handle_request, + ) + return server.serve_forever() def read_state(state_file: Optional[Path] = None) -> Optional[dict]: - state_file = state_file or _state_file_path() - try: - raw = state_file.read_text(encoding="utf-8") - obj = json.loads(raw) - return obj if isinstance(obj, dict) else None - except Exception: - return None + state_file = state_file or state_file_path(GASKD_SPEC.state_file_name) + return askd_rpc.read_state(state_file) def ping_daemon(timeout_s: float = 0.5, state_file: Optional[Path] = None) -> bool: - st = read_state(state_file) - if not st: - return False - try: - host = st.get("connect_host") or st["host"] - port = int(st["port"]) - token = st["token"] - except Exception: - return False - try: - with socket.create_connection((host, port), timeout=timeout_s) as sock: - req = {"type": "gask.ping", "v": 1, "id": "ping", "token": token} - sock.sendall((json.dumps(req) + "\n").encode("utf-8")) - buf = b"" - deadline = time.time() + timeout_s - while b"\n" not in buf and time.time() < deadline: - chunk = sock.recv(1024) - if not chunk: - break - buf += chunk - if b"\n" not in buf: - return False - line = buf.split(b"\n", 1)[0].decode("utf-8", errors="replace") - resp = json.loads(line) - return resp.get("type") in ("gask.pong", "gask.response") and int(resp.get("exit_code") or 0) == 0 - except Exception: - return False + state_file = state_file or state_file_path(GASKD_SPEC.state_file_name) + return askd_rpc.ping_daemon("gask", timeout_s, state_file) def shutdown_daemon(timeout_s: float = 1.0, state_file: Optional[Path] = None) -> bool: - st = read_state(state_file) - if not st: - return False - try: - host = st.get("connect_host") or st["host"] - port = int(st["port"]) - token = st["token"] - except Exception: - return False - try: - with socket.create_connection((host, port), timeout=timeout_s) as sock: - req = {"type": "gask.shutdown", "v": 1, "id": "shutdown", "token": token} - sock.sendall((json.dumps(req) + "\n").encode("utf-8")) - _ = sock.recv(1024) - return True - except Exception: - return False + state_file = state_file or state_file_path(GASKD_SPEC.state_file_name) + return askd_rpc.shutdown_daemon("gask", timeout_s, state_file) diff --git a/lib/oaskd_daemon.py b/lib/oaskd_daemon.py index 9e095cb..121d56e 100644 --- a/lib/oaskd_daemon.py +++ b/lib/oaskd_daemon.py @@ -3,9 +3,6 @@ import json import os import queue -import socket -import socketserver -import sys import threading import time from dataclasses import dataclass @@ -16,63 +13,22 @@ from oaskd_session import compute_session_key, load_project_session from opencode_comm import OpenCodeLogReader from process_lock import ProviderLock -from session_utils import safe_write_session from terminal import get_backend_for_session +from askd_runtime import state_file_path, log_path, write_log, random_token +from env_utils import env_bool +import askd_rpc +from askd_server import AskDaemonServer +from providers import OASKD_SPEC def _now_ms() -> int: return int(time.time() * 1000) -def _run_dir() -> Path: - return Path.home() / ".ccb" / "run" - - -def _state_file_path() -> Path: - return _run_dir() / "oaskd.json" - - -def _log_path() -> Path: - return _run_dir() / "oaskd.log" - - -def _write_log(line: str) -> None: - try: - _run_dir().mkdir(parents=True, exist_ok=True) - with _log_path().open("a", encoding="utf-8") as handle: - handle.write(line.rstrip() + "\n") - except Exception: - pass - - -def _random_token() -> str: - return os.urandom(16).hex() - -def _env_bool(name: str, default: bool) -> bool: - raw = os.environ.get(name) - if raw is None or raw == "": - return default - v = raw.strip().lower() - if v in ("0", "false", "no", "off"): - return False - if v in ("1", "true", "yes", "on"): - return True - return default - - def _cancel_detection_enabled(default: bool = False) -> bool: # Disabled by default for stability: OpenCode cancellation is session-scoped and hard to # attribute to a specific queued task without false positives. - return _env_bool("CCB_OASKD_CANCEL_DETECT", default) - - -def _normalize_connect_host(host: str) -> str: - host = (host or "").strip() - if not host or host in ("0.0.0.0",): - return "127.0.0.1" - if host in ("::", "[::]"): - return "::1" - return host + return env_bool("CCB_OASKD_CANCEL_DETECT", default) def _tail_state_for_session(log_reader: OpenCodeLogReader) -> dict: @@ -111,7 +67,7 @@ def run(self) -> None: try: task.result = self._handle_task(task) except Exception as exc: - _write_log(f"[ERROR] session={self.session_key} req_id={task.req_id} {exc}") + write_log(log_path(OASKD_SPEC.log_file_name), f"[ERROR] session={self.session_key} req_id={task.req_id} {exc}") task.result = OaskdResult( exit_code=1, reply=str(exc), @@ -127,7 +83,7 @@ def _handle_task(self, task: _QueuedTask) -> OaskdResult: started_ms = _now_ms() req = task.request work_dir = Path(req.work_dir) - _write_log(f"[INFO] start session={self.session_key} req_id={task.req_id} work_dir={req.work_dir}") + write_log(log_path(OASKD_SPEC.log_file_name), f"[INFO] start session={self.session_key} req_id={task.req_id} work_dir={req.work_dir}") # Cross-process serialization: if another client falls back to direct mode, it uses the same # per-session ProviderLock ("opencode", cwd=f"session:{session_key}"). Without this, daemon and @@ -208,7 +164,7 @@ def _handle_task(self, task: _QueuedTask) -> OaskdResult: except Exception: alive = False if not alive: - _write_log(f"[ERROR] Pane {pane_id} died during request session={self.session_key} req_id={task.req_id}") + write_log(log_path(OASKD_SPEC.log_file_name), f"[ERROR] Pane {pane_id} died during request session={self.session_key} req_id={task.req_id}") return OaskdResult( exit_code=1, reply="❌ OpenCode pane died during request", @@ -228,7 +184,7 @@ def _handle_task(self, task: _QueuedTask) -> OaskdResult: cancel_cursor, session_id=session_id, since_epoch_s=cancel_since_s ) if cancelled_log: - _write_log( + write_log(log_path(OASKD_SPEC.log_file_name), f"[WARN] OpenCode request cancelled (log) - skipping task session={self.session_key} req_id={task.req_id}" ) return OaskdResult( @@ -251,7 +207,7 @@ def _handle_task(self, task: _QueuedTask) -> OaskdResult: try: cancelled, _new_state = log_reader.detect_cancelled_since(state, req_id=task.req_id) if cancelled: - _write_log( + write_log(log_path(OASKD_SPEC.log_file_name), f"[WARN] OpenCode request cancelled - skipping task session={self.session_key} req_id={task.req_id}" ) return OaskdResult( @@ -313,7 +269,7 @@ def submit(self, request: OaskdRequest) -> _QueuedTask: qsize = int(worker._q.qsize()) except Exception: qsize = -1 - _write_log(f"[INFO] enqueued session={session_key} req_id={req_id} qsize={qsize} client_id={request.client_id}") + write_log(log_path(OASKD_SPEC.log_file_name), f"[INFO] enqueued session={session_key} req_id={req_id} qsize={qsize} client_id={request.client_id}") return task @@ -321,161 +277,59 @@ class OaskdServer: def __init__(self, host: str = "127.0.0.1", port: int = 0, *, state_file: Optional[Path] = None): self.host = host self.port = port - self.state_file = state_file or _state_file_path() - self.token = _random_token() + self.state_file = state_file or state_file_path(OASKD_SPEC.state_file_name) + self.token = random_token() self.pool = _WorkerPool() def serve_forever(self) -> int: - _run_dir().mkdir(parents=True, exist_ok=True) - - # Single-instance lock (global, not per-cwd) - lock = ProviderLock("oaskd", cwd="global", timeout=0.1) - if not lock.try_acquire(): - return 2 - - class Handler(socketserver.StreamRequestHandler): - def handle(self) -> None: - with self.server.activity_lock: - self.server.active_requests += 1 - self.server.last_activity = time.time() - - try: - line = self.rfile.readline() - if not line: - return - msg = json.loads(line.decode("utf-8", errors="replace")) - except Exception: - return - - if msg.get("token") != self.server.token: - self._write({"type": "oask.response", "v": 1, "id": msg.get("id"), "exit_code": 1, "reply": "Unauthorized"}) - return - - if msg.get("type") == "oask.ping": - self._write({"type": "oask.pong", "v": 1, "id": msg.get("id"), "exit_code": 0, "reply": "OK"}) - return - - if msg.get("type") == "oask.shutdown": - self._write({"type": "oask.response", "v": 1, "id": msg.get("id"), "exit_code": 0, "reply": "OK"}) - threading.Thread(target=self.server.shutdown, daemon=True).start() - return - - if msg.get("type") != "oask.request": - self._write({"type": "oask.response", "v": 1, "id": msg.get("id"), "exit_code": 1, "reply": "Invalid request"}) - return - - try: - req = OaskdRequest( - client_id=str(msg.get("id") or ""), - work_dir=str(msg.get("work_dir") or ""), - timeout_s=float(msg.get("timeout_s") or 300.0), - quiet=bool(msg.get("quiet") or False), - message=str(msg.get("message") or ""), - output_path=str(msg.get("output_path")) if msg.get("output_path") else None, - ) - except Exception as exc: - self._write({"type": "oask.response", "v": 1, "id": msg.get("id"), "exit_code": 1, "reply": f"Bad request: {exc}"}) - return - - _write_log( - f"[INFO] recv client_id={req.client_id} work_dir={req.work_dir} timeout_s={int(req.timeout_s)} msg_len={len(req.message)}" - ) - task = self.server.pool.submit(req) - task.done_event.wait(timeout=req.timeout_s + 5.0) - result = task.result - if not result: - self._write({"type": "oask.response", "v": 1, "id": req.client_id, "exit_code": 2, "reply": ""}) - return - - self._write( - { - "type": "oask.response", - "v": 1, - "id": req.client_id, - "req_id": result.req_id, - "exit_code": result.exit_code, - "reply": result.reply, - "meta": { - "session_key": result.session_key, - "done_seen": result.done_seen, - "done_ms": result.done_ms, - }, - } + def _handle_request(msg: dict) -> dict: + try: + req = OaskdRequest( + client_id=str(msg.get("id") or ""), + work_dir=str(msg.get("work_dir") or ""), + timeout_s=float(msg.get("timeout_s") or 300.0), + quiet=bool(msg.get("quiet") or False), + message=str(msg.get("message") or ""), + output_path=str(msg.get("output_path")) if msg.get("output_path") else None, ) + except Exception as exc: + return {"type": "oask.response", "v": 1, "id": msg.get("id"), "exit_code": 1, "reply": f"Bad request: {exc}"} - def _write(self, obj: dict) -> None: - try: - data = (json.dumps(obj, ensure_ascii=False) + "\n").encode("utf-8") - self.wfile.write(data) - self.wfile.flush() - try: - with self.server.activity_lock: - self.server.last_activity = time.time() - except Exception: - pass - except Exception: - pass - - def finish(self) -> None: - try: - super().finish() - finally: - try: - with self.server.activity_lock: - if self.server.active_requests > 0: - self.server.active_requests -= 1 - self.server.last_activity = time.time() - except Exception: - pass - - class Server(socketserver.ThreadingTCPServer): - allow_reuse_address = True - request_queue_size = 128 - - with Server((self.host, self.port), Handler) as httpd: - httpd.token = self.token - httpd.pool = self.pool - httpd.active_requests = 0 - httpd.last_activity = time.time() - httpd.activity_lock = threading.Lock() - try: - httpd.idle_timeout_s = float(os.environ.get("CCB_OASKD_IDLE_TIMEOUT_S", "60") or "60") - except Exception: - httpd.idle_timeout_s = 60.0 - - def _idle_monitor() -> None: - timeout_s = float(getattr(httpd, "idle_timeout_s", 60.0) or 0.0) - if timeout_s <= 0: - return - while True: - time.sleep(0.5) - try: - with httpd.activity_lock: - active = int(httpd.active_requests or 0) - last = float(httpd.last_activity or time.time()) - except Exception: - active = 0 - last = time.time() - if active == 0 and (time.time() - last) >= timeout_s: - _write_log(f"[INFO] oaskd idle timeout ({int(timeout_s)}s) reached; shutting down") - threading.Thread(target=httpd.shutdown, daemon=True).start() - return - - threading.Thread(target=_idle_monitor, daemon=True).start() - - actual_host, actual_port = httpd.server_address - self._write_state(actual_host, int(actual_port)) - _write_log(f"[INFO] oaskd started pid={os.getpid()} addr={actual_host}:{actual_port}") - try: - httpd.serve_forever(poll_interval=0.2) - finally: - _write_log("[INFO] oaskd stopped") - self._cleanup_state_file() - try: - lock.release() - except Exception: - pass - return 0 + write_log( + log_path(OASKD_SPEC.log_file_name), + f"[INFO] recv client_id={req.client_id} work_dir={req.work_dir} timeout_s={int(req.timeout_s)} msg_len={len(req.message)}", + ) + task = self.pool.submit(req) + task.done_event.wait(timeout=req.timeout_s + 5.0) + result = task.result + if not result: + return {"type": "oask.response", "v": 1, "id": req.client_id, "exit_code": 2, "reply": ""} + + return { + "type": "oask.response", + "v": 1, + "id": req.client_id, + "req_id": result.req_id, + "exit_code": result.exit_code, + "reply": result.reply, + "meta": { + "session_key": result.session_key, + "done_seen": result.done_seen, + "done_ms": result.done_ms, + }, + } + + server = AskDaemonServer( + spec=OASKD_SPEC, + host=self.host, + port=self.port, + token=self.token, + state_file=self.state_file, + request_handler=_handle_request, + request_queue_size=128, + on_stop=self._cleanup_state_file, + ) + return server.serve_forever() def _cleanup_state_file(self) -> None: try: @@ -494,80 +348,16 @@ def _cleanup_state_file(self) -> None: except Exception: pass - def _write_state(self, host: str, port: int) -> None: - payload = { - "pid": os.getpid(), - "host": host, - "connect_host": _normalize_connect_host(host), - "port": port, - "token": self.token, - "started_at": time.strftime("%Y-%m-%d %H:%M:%S"), - "python": sys.executable, - } - self.state_file.parent.mkdir(parents=True, exist_ok=True) - ok, _err = safe_write_session(self.state_file, json.dumps(payload, ensure_ascii=False, indent=2) + "\n") - if ok: - try: - os.chmod(self.state_file, 0o600) - except Exception: - pass - - def read_state(state_file: Optional[Path] = None) -> Optional[dict]: - state_file = state_file or _state_file_path() - try: - raw = state_file.read_text(encoding="utf-8") - obj = json.loads(raw) - return obj if isinstance(obj, dict) else None - except Exception: - return None + state_file = state_file or state_file_path(OASKD_SPEC.state_file_name) + return askd_rpc.read_state(state_file) def ping_daemon(timeout_s: float = 0.5, state_file: Optional[Path] = None) -> bool: - st = read_state(state_file) - if not st: - return False - try: - host = st.get("connect_host") or st["host"] - port = int(st["port"]) - token = st["token"] - except Exception: - return False - try: - with socket.create_connection((host, port), timeout=timeout_s) as sock: - req = {"type": "oask.ping", "v": 1, "id": "ping", "token": token} - sock.sendall((json.dumps(req) + "\n").encode("utf-8")) - buf = b"" - deadline = time.time() + timeout_s - while b"\n" not in buf and time.time() < deadline: - chunk = sock.recv(1024) - if not chunk: - break - buf += chunk - if b"\n" not in buf: - return False - line = buf.split(b"\n", 1)[0].decode("utf-8", errors="replace") - resp = json.loads(line) - return resp.get("type") in ("oask.pong", "oask.response") and int(resp.get("exit_code") or 0) == 0 - except Exception: - return False + state_file = state_file or state_file_path(OASKD_SPEC.state_file_name) + return askd_rpc.ping_daemon("oask", timeout_s, state_file) def shutdown_daemon(timeout_s: float = 1.0, state_file: Optional[Path] = None) -> bool: - st = read_state(state_file) - if not st: - return False - try: - host = st.get("connect_host") or st["host"] - port = int(st["port"]) - token = st["token"] - except Exception: - return False - try: - with socket.create_connection((host, port), timeout=timeout_s) as sock: - req = {"type": "oask.shutdown", "v": 1, "id": "shutdown", "token": token} - sock.sendall((json.dumps(req) + "\n").encode("utf-8")) - _ = sock.recv(1024) - return True - except Exception: - return False + state_file = state_file or state_file_path(OASKD_SPEC.state_file_name) + return askd_rpc.shutdown_daemon("oask", timeout_s, state_file) diff --git a/lib/providers.py b/lib/providers.py new file mode 100644 index 0000000..587e4fa --- /dev/null +++ b/lib/providers.py @@ -0,0 +1,43 @@ +from __future__ import annotations + +from dataclasses import dataclass + + +@dataclass +class ProviderDaemonSpec: + daemon_key: str + protocol_prefix: str + state_file_name: str + log_file_name: str + idle_timeout_env: str + lock_name: str + + +CASKD_SPEC = ProviderDaemonSpec( + daemon_key="caskd", + protocol_prefix="cask", + state_file_name="caskd.json", + log_file_name="caskd.log", + idle_timeout_env="CCB_CASKD_IDLE_TIMEOUT_S", + lock_name="caskd", +) + + +GASKD_SPEC = ProviderDaemonSpec( + daemon_key="gaskd", + protocol_prefix="gask", + state_file_name="gaskd.json", + log_file_name="gaskd.log", + idle_timeout_env="CCB_GASKD_IDLE_TIMEOUT_S", + lock_name="gaskd", +) + + +OASKD_SPEC = ProviderDaemonSpec( + daemon_key="oaskd", + protocol_prefix="oask", + state_file_name="oaskd.json", + log_file_name="oaskd.log", + idle_timeout_env="CCB_OASKD_IDLE_TIMEOUT_S", + lock_name="oaskd", +) From f929d6d95e44ec2ae2dc3d77b8a8bbaf7f796233 Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 10 Jan 2026 18:07:16 +0800 Subject: [PATCH 147/153] refactor: extract common client logic to askd_client.py (Step 5) - Add lib/askd_client.py: autostart_enabled, state_file_from_env, find_project_session_file, try_daemon_request, maybe_start_daemon, wait_for_daemon_ready, check_background_mode - Add ProviderClientSpec to lib/providers.py with CASK/GASK/OASK_CLIENT_SPEC - Refactor bin/cask, bin/gask, bin/oask to use shared client functions - Code reduction: -438 lines, +105 lines (net -333 lines) Co-Authored-By: Warp --- bin/cask | 123 ++++------------------------- bin/gask | 184 +++++--------------------------------------- bin/oask | 188 +++++---------------------------------------- lib/askd_client.py | 171 +++++++++++++++++++++++++++++++++++++++++ lib/providers.py | 48 ++++++++++++ 5 files changed, 276 insertions(+), 438 deletions(-) create mode 100644 lib/askd_client.py diff --git a/bin/cask b/bin/cask index cb6b357..58dfd08 100755 --- a/bin/cask +++ b/bin/cask @@ -9,8 +9,6 @@ from __future__ import annotations import json import os import socket -import shutil -import subprocess import sys import time from pathlib import Path @@ -28,6 +26,15 @@ COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "EXECUTI from env_utils import env_bool from caskd_protocol import REQ_ID_PREFIX, make_req_id, strip_done_text, wrap_codex_prompt from caskd_daemon import read_state +from askd_client import ( + autostart_enabled, + state_file_from_env, + find_project_session_file, + maybe_start_daemon, + wait_for_daemon_ready, + check_background_mode, +) +from providers import CASK_CLIENT_SPEC SUPERVISOR_PROMPT = """## Executor Mode: codex+opencode You are the SUPERVISOR, NOT the executor. @@ -161,38 +168,9 @@ def _with_completion_marker_request(message: str) -> str: ) -def _caskd_autostart_enabled(default: bool = True) -> bool: - # Prefer the new name; keep CCB_AUTO_CASKD for backwards compatibility. - if "CCB_CASKD_AUTOSTART" in os.environ: - return env_bool("CCB_CASKD_AUTOSTART", default) - if "CCB_AUTO_CASKD" in os.environ: - return env_bool("CCB_AUTO_CASKD", default) - return default - - -def _state_file_from_env() -> Optional[Path]: - raw = (os.environ.get("CCB_CASKD_STATE_FILE") or "").strip() - if not raw: - return None - try: - return Path(raw).expanduser() - except Exception: - return None - - -def _find_project_session_file(work_dir: Path) -> Optional[Path]: - current = Path(work_dir).resolve() - while True: - candidate = current / ".codex-session" - if candidate.exists(): - return candidate - if current == current.parent: - return None - current = current.parent - def _read_project_terminal(work_dir: Path) -> Optional[str]: - session_file = _find_project_session_file(work_dir) + session_file = find_project_session_file(work_dir, CASK_CLIENT_SPEC.session_filename) if not session_file: return None try: @@ -213,7 +191,7 @@ def _try_daemon_request(work_dir: Path, message: str, timeout: float, quiet: boo terminal = _read_project_terminal(work_dir) if terminal not in ("wezterm", "iterm2"): return None - st = read_state(state_file=_state_file_from_env()) + st = read_state(state_file=state_file_from_env(CASK_CLIENT_SPEC.state_file_env)) if not st: return None try: @@ -261,91 +239,24 @@ def _try_daemon_request(work_dir: Path, message: str, timeout: float, quiet: boo def _maybe_start_caskd() -> bool: + """Start caskd daemon if conditions are met (cask-specific: requires wezterm/iterm2).""" if not env_bool("CCB_CASKD", True): return False - if not _caskd_autostart_enabled(True): + if not autostart_enabled(CASK_CLIENT_SPEC.autostart_env_primary, CASK_CLIENT_SPEC.autostart_env_legacy, True): return False terminal = _read_project_terminal(Path.cwd()) if terminal not in ("wezterm", "iterm2"): return False - # Prefer repo-local caskd when running from source; fallback to PATH. - candidates: list[str] = [] - local = (Path(__file__).resolve().parent / "caskd") - if local.exists(): - candidates.append(str(local)) - found = shutil.which("caskd") - if found: - candidates.append(found) - if not candidates: - return False - entry = candidates[0] - lower = entry.lower() - # On Windows, prefer invoking via the running Python unless we found a real executable wrapper - # (e.g. caskd.cmd/caskd.bat) to avoid relying on shebang/extension handling. - if lower.endswith((".cmd", ".bat", ".exe")): - argv = [entry] - else: - argv = [sys.executable, entry] - try: - kwargs = {"stdin": subprocess.DEVNULL, "stdout": subprocess.DEVNULL, "stderr": subprocess.DEVNULL, "close_fds": True} - if os.name == "nt": - kwargs["creationflags"] = getattr(subprocess, "DETACHED_PROCESS", 0) | getattr(subprocess, "CREATE_NEW_PROCESS_GROUP", 0) - else: - kwargs["start_new_session"] = True - subprocess.Popen(argv, **kwargs) - return True - except Exception: - return False + return maybe_start_daemon(CASK_CLIENT_SPEC, Path.cwd()) + def _wait_for_caskd_ready(timeout_s: float = 2.0) -> bool: - try: - from caskd_daemon import ping_daemon - except Exception: - return False - deadline = time.time() + max(0.1, float(timeout_s)) - state_file = _state_file_from_env() - while time.time() < deadline: - try: - if ping_daemon(timeout_s=0.2, state_file=state_file): - return True - except Exception: - pass - time.sleep(0.1) - return False + return wait_for_daemon_ready(CASK_CLIENT_SPEC, timeout_s, state_file_from_env(CASK_CLIENT_SPEC.state_file_env)) def _usage() -> None: print("Usage: cask [--timeout SECONDS] [--output FILE] ", file=sys.stderr) -def _check_background_mode() -> bool: - """Return True when stdout looks like Claude Code run_in_background output capture.""" - if os.environ.get("CLAUDECODE") != "1": - return True - if os.environ.get("CCB_ALLOW_FOREGROUND") in ("1", "true", "yes"): - return True - # Claude Code's run_in_background captures stdout via file, socket, or FIFO/pipe. - try: - import stat - mode = os.fstat(sys.stdout.fileno()).st_mode - return stat.S_ISREG(mode) or stat.S_ISSOCK(mode) or stat.S_ISFIFO(mode) - except Exception: - return False - - -def _popen_detached(argv: list[str]) -> None: - kwargs = { - "stdin": subprocess.DEVNULL, - "stdout": subprocess.DEVNULL, - "stderr": subprocess.DEVNULL, - "close_fds": True, - } - if os.name == "nt": - kwargs["creationflags"] = getattr(subprocess, "DETACHED_PROCESS", 0) | getattr(subprocess, "CREATE_NEW_PROCESS_GROUP", 0) - else: - kwargs["start_new_session"] = True - subprocess.Popen(argv, **kwargs) - - def _parse_args(argv: list[str]) -> Tuple[Optional[Path], float, str, bool]: output: Optional[Path] = None timeout: Optional[float] = None @@ -398,7 +309,7 @@ def main(argv: list[str]) -> int: return EXIT_ERROR # Strict mode: require run_in_background=true in Claude Code - if os.environ.get("CLAUDECODE") == "1" and not _check_background_mode(): + if os.environ.get("CLAUDECODE") == "1" and not check_background_mode(): print("[ERROR] cask MUST be called with run_in_background=true", file=sys.stderr) print("Correct usage: Bash(cask \"...\", run_in_background=true)", file=sys.stderr) return EXIT_ERROR diff --git a/bin/gask b/bin/gask index dc03b5c..76ba72a 100755 --- a/bin/gask +++ b/bin/gask @@ -3,15 +3,12 @@ gask - Send message to Gemini and wait for reply (sync). Designed to be used with Claude Code's run_in_background=true. -If --output is provided, the reply is written atomically to that file and stdout stays empty. +If --output is provided, reply is written atomically to that file and stdout stays empty. """ from __future__ import annotations -import json import os -import socket -import shutil import subprocess import sys from pathlib import Path @@ -20,155 +17,24 @@ script_dir = Path(__file__).resolve().parent lib_dir = script_dir.parent / "lib" sys.path.insert(0, str(lib_dir)) from compat import setup_windows_encoding + setup_windows_encoding() -from process_lock import ProviderLock from cli_output import EXIT_ERROR, EXIT_NO_REPLY, EXIT_OK, atomic_write_text import time from env_utils import env_bool - - -def _gaskd_autostart_enabled(default: bool = True) -> bool: - # Prefer the new name; keep CCB_AUTO_GASKD for backwards compatibility. - if "CCB_GASKD_AUTOSTART" in os.environ: - return env_bool("CCB_GASKD_AUTOSTART", default) - if "CCB_AUTO_GASKD" in os.environ: - return env_bool("CCB_AUTO_GASKD", default) - return default - - -def _state_file_from_env() -> Path | None: - raw = (os.environ.get("CCB_GASKD_STATE_FILE") or "").strip() - if not raw: - return None - try: - return Path(raw).expanduser() - except Exception: - return None - - -def _find_project_session_file(work_dir: Path) -> Path | None: - current = Path(work_dir).resolve() - while True: - candidate = current / ".gemini-session" - if candidate.exists(): - return candidate - if current == current.parent: - return None - current = current.parent - - -def _try_daemon_request(work_dir: Path, message: str, timeout: float, quiet: bool) -> tuple[str, int] | None: - if not env_bool("CCB_GASKD", True): - return None - - if not _find_project_session_file(work_dir): - return None - - from gaskd_daemon import read_state - - st = read_state(state_file=_state_file_from_env()) - if not st: - return None - try: - host = st.get("connect_host") or st.get("host") - port = int(st["port"]) - token = st["token"] - except Exception: - return None - - try: - payload = { - "type": "gask.request", - "v": 1, - "id": f"gask-{os.getpid()}-{int(time.time() * 1000)}", - "token": token, - "work_dir": str(work_dir), - "timeout_s": float(timeout), - "quiet": bool(quiet), - "message": message, - } - connect_timeout = min(1.0, max(0.1, float(timeout))) - with socket.create_connection((host, port), timeout=connect_timeout) as sock: - sock.settimeout(0.5) - sock.sendall((json.dumps(payload, ensure_ascii=False) + "\n").encode("utf-8")) - buf = b"" - deadline = time.time() + float(timeout) + 5.0 - while b"\n" not in buf and time.time() < deadline: - try: - chunk = sock.recv(65536) - except socket.timeout: - continue - if not chunk: - break - buf += chunk - if b"\n" not in buf: - return None - line = buf.split(b"\n", 1)[0].decode("utf-8", errors="replace") - resp = json.loads(line) - if resp.get("type") != "gask.response": - return None - reply = str(resp.get("reply") or "") - exit_code = int(resp.get("exit_code", 1)) - return reply, exit_code - except Exception: - return None - - -def _maybe_start_gaskd() -> bool: - if not env_bool("CCB_GASKD", True): - return False - if not _gaskd_autostart_enabled(True): - return False - if not _find_project_session_file(Path.cwd()): - return False - - candidates: list[str] = [] - local = (Path(__file__).resolve().parent / "gaskd") - if local.exists(): - candidates.append(str(local)) - found = shutil.which("gaskd") - if found: - candidates.append(found) - if not candidates: - return False - - entry = candidates[0] - lower = entry.lower() - if lower.endswith((".cmd", ".bat", ".exe")): - argv = [entry] - else: - argv = [sys.executable, entry] - try: - kwargs = {"stdin": subprocess.DEVNULL, "stdout": subprocess.DEVNULL, "stderr": subprocess.DEVNULL, "close_fds": True} - if os.name == "nt": - kwargs["creationflags"] = getattr(subprocess, "DETACHED_PROCESS", 0) | getattr(subprocess, "CREATE_NEW_PROCESS_GROUP", 0) - else: - kwargs["start_new_session"] = True - subprocess.Popen(argv, **kwargs) - return True - except Exception: - return False - - -def _wait_for_gaskd_ready(timeout_s: float = 2.0) -> bool: - try: - from gaskd_daemon import ping_daemon - except Exception: - return False - deadline = time.time() + max(0.1, float(timeout_s)) - state_file = _state_file_from_env() - while time.time() < deadline: - try: - if ping_daemon(timeout_s=0.2, state_file=state_file): - return True - except Exception: - pass - time.sleep(0.1) - return False - +from askd_client import ( + autostart_enabled, + state_file_from_env, + find_project_session_file, + try_daemon_request, + maybe_start_daemon, + wait_for_daemon_ready, + check_background_mode, +) +from providers import GASK_CLIENT_SPEC def _wait_for_done_reply(log_reader, state: dict, timeout: float, req_id: str, quiet: bool): deadline = time.time() + timeout @@ -192,19 +58,9 @@ def _wait_for_done_reply(log_reader, state: dict, timeout: float, req_id: str, q return extract_reply_for_req(latest, req_id), EXIT_NO_REPLY -def _check_background_mode() -> bool: - """Return True when stdout looks like Claude Code run_in_background output capture.""" - if os.environ.get("CLAUDECODE") != "1": - return True - if os.environ.get("CCB_ALLOW_FOREGROUND") in ("1", "true", "yes"): - return True - # Claude Code's run_in_background captures stdout via file, socket, or FIFO/pipe. - try: - import stat - mode = os.fstat(sys.stdout.fileno()).st_mode - return stat.S_ISREG(mode) or stat.S_ISSOCK(mode) or stat.S_ISFIFO(mode) - except Exception: - return False +def _usage() -> None: + print("Usage: gask [--timeout SECONDS] [--output FILE] ", file=sys.stderr) + def main(argv: list[str]) -> int: if len(argv) <= 1 and sys.stdin.isatty(): @@ -261,16 +117,16 @@ def main(argv: list[str]) -> int: from gaskd_protocol import make_req_id, wrap_gemini_prompt # Strict mode: require run_in_background=true in Claude Code - if os.environ.get("CLAUDECODE") == "1" and not _check_background_mode(): + if os.environ.get("CLAUDECODE") == "1" and not check_background_mode(): print("[ERROR] gask MUST be called with run_in_background=true", file=sys.stderr) print("Correct usage: Bash(gask \"...\", run_in_background=true)", file=sys.stderr) return EXIT_ERROR # Prefer daemon mode: daemon performs per-session serialization and should accept concurrent submissions. - daemon_result = _try_daemon_request(Path.cwd(), message, timeout, quiet) - if daemon_result is None and _maybe_start_gaskd(): - _wait_for_gaskd_ready(timeout_s=min(2.0, max(0.2, float(timeout)))) - daemon_result = _try_daemon_request(Path.cwd(), message, timeout, quiet) + daemon_result = try_daemon_request(GASK_CLIENT_SPEC, Path.cwd(), message, timeout, quiet, state_file_from_env(GASK_CLIENT_SPEC.state_file_env)) + if daemon_result is None and maybe_start_daemon(GASK_CLIENT_SPEC, Path.cwd()): + wait_for_daemon_ready(GASK_CLIENT_SPEC, timeout_s=min(2.0, max(0.2, float(timeout)))) + daemon_result = try_daemon_request(GASK_CLIENT_SPEC, Path.cwd(), message, timeout, quiet, state_file_from_env(GASK_CLIENT_SPEC.state_file_env)) if daemon_result is not None: reply, exit_code = daemon_result if output_path: diff --git a/bin/oask b/bin/oask index 394ac99..cb81f5b 100755 --- a/bin/oask +++ b/bin/oask @@ -7,11 +7,7 @@ If --output is provided, the reply is written atomically to that file and stdout """ from __future__ import annotations -import json import os -import socket -import shutil -import subprocess import sys import time from pathlib import Path @@ -23,95 +19,18 @@ sys.path.insert(0, str(lib_dir)) from compat import setup_windows_encoding setup_windows_encoding() -from process_lock import ProviderLock from env_utils import env_bool - - -def _oaskd_autostart_enabled(default: bool = True) -> bool: - # Prefer the new name; keep CCB_AUTO_OASKD for backwards compatibility. - if "CCB_OASKD_AUTOSTART" in os.environ: - return env_bool("CCB_OASKD_AUTOSTART", default) - if "CCB_AUTO_OASKD" in os.environ: - return env_bool("CCB_AUTO_OASKD", default) - return default - - -def _state_file_from_env() -> Optional[Path]: - raw = (os.environ.get("CCB_OASKD_STATE_FILE") or "").strip() - if not raw: - return None - try: - return Path(raw).expanduser() - except Exception: - return None - - -def _find_project_session_file(work_dir: Path) -> Optional[Path]: - current = Path(work_dir).resolve() - while True: - candidate = current / ".opencode-session" - if candidate.exists(): - return candidate - if current == current.parent: - return None - current = current.parent - - -def _try_daemon_request(work_dir: Path, message: str, timeout: float, quiet: bool) -> Optional[tuple[str, int]]: - if not env_bool("CCB_OASKD", True): - return None - - if not _find_project_session_file(work_dir): - return None - - from oaskd_daemon import read_state - - st = read_state(state_file=_state_file_from_env()) - if not st: - return None - try: - host = st.get("connect_host") or st.get("host") - port = int(st["port"]) - token = st["token"] - except Exception: - return None - - try: - payload = { - "type": "oask.request", - "v": 1, - "id": f"oask-{os.getpid()}-{int(time.time() * 1000)}", - "token": token, - "work_dir": str(work_dir), - "timeout_s": float(timeout), - "quiet": bool(quiet), - "message": message, - } - connect_timeout = min(1.0, max(0.1, float(timeout))) - with socket.create_connection((host, port), timeout=connect_timeout) as sock: - sock.settimeout(0.5) - sock.sendall((json.dumps(payload, ensure_ascii=False) + "\n").encode("utf-8")) - buf = b"" - deadline = time.time() + float(timeout) + 5.0 - while b"\n" not in buf and time.time() < deadline: - try: - chunk = sock.recv(65536) - except socket.timeout: - continue - if not chunk: - break - buf += chunk - if b"\n" not in buf: - return None - line = buf.split(b"\n", 1)[0].decode("utf-8", errors="replace") - resp = json.loads(line) - if resp.get("type") != "oask.response": - return None - reply = str(resp.get("reply") or "") - exit_code = int(resp.get("exit_code", 1)) - return reply, exit_code - except Exception: - return None +from process_lock import ProviderLock +from askd_client import ( + autostart_enabled, + state_file_from_env, + find_project_session_file, + try_daemon_request, + maybe_start_daemon, + wait_for_daemon_ready, + check_background_mode, +) +from providers import OASK_CLIENT_SPEC def _daemon_request_with_retries(work_dir: Path, message: str, timeout: float, quiet: bool) -> Optional[tuple[str, int]]: @@ -121,19 +40,20 @@ def _daemon_request_with_retries(work_dir: Path, message: str, timeout: float, q Without this, a burst of concurrent `oask` invocations can fall back to direct mode before the daemon is fully ready, causing only some requests to be submitted. """ + state_file = state_file_from_env(OASK_CLIENT_SPEC.state_file_env) + # Fast path - result = _try_daemon_request(work_dir, message, timeout, quiet) + result = try_daemon_request(OASK_CLIENT_SPEC, work_dir, message, timeout, quiet, state_file) if result is not None: return result # If daemon mode is disabled or no session, don't spin. - if not env_bool("CCB_OASKD", True): + if not env_bool(OASK_CLIENT_SPEC.enabled_env, True): return None - if not _find_project_session_file(work_dir): + if not find_project_session_file(work_dir, OASK_CLIENT_SPEC.session_filename): return None # Stale state files can block daemon mode (e.g. daemon exited/crashed but the json remains). - state_file = _state_file_from_env() if state_file and state_file.exists(): try: from oaskd_daemon import ping_daemon @@ -146,15 +66,15 @@ def _daemon_request_with_retries(work_dir: Path, message: str, timeout: float, q except Exception: pass - started = _maybe_start_oaskd() + started = maybe_start_daemon(OASK_CLIENT_SPEC, work_dir) if started: - _wait_for_oaskd_ready(timeout_s=_daemon_startup_wait_s(timeout)) + wait_for_daemon_ready(OASK_CLIENT_SPEC, _daemon_startup_wait_s(timeout), state_file) # Retry briefly; re-reading state helps when multiple daemons were attempted. wait_s = _daemon_retry_wait_s(timeout) deadline = time.time() + min(3.0, max(0.2, float(timeout))) while time.time() < deadline: - result = _try_daemon_request(work_dir, message, timeout, quiet) + result = try_daemon_request(OASK_CLIENT_SPEC, work_dir, message, timeout, quiet, state_file) if result is not None: return result time.sleep(wait_s) @@ -162,59 +82,6 @@ def _daemon_request_with_retries(work_dir: Path, message: str, timeout: float, q return None -def _maybe_start_oaskd() -> bool: - if not env_bool("CCB_OASKD", True): - return False - if not _oaskd_autostart_enabled(True): - return False - if not _find_project_session_file(Path.cwd()): - return False - - candidates: list[str] = [] - local = (Path(__file__).resolve().parent / "oaskd") - if local.exists(): - candidates.append(str(local)) - found = shutil.which("oaskd") - if found: - candidates.append(found) - if not candidates: - return False - - entry = candidates[0] - lower = entry.lower() - if lower.endswith((".cmd", ".bat", ".exe")): - argv = [entry] - else: - argv = [sys.executable, entry] - try: - kwargs = {"stdin": subprocess.DEVNULL, "stdout": subprocess.DEVNULL, "stderr": subprocess.DEVNULL, "close_fds": True} - if os.name == "nt": - kwargs["creationflags"] = getattr(subprocess, "DETACHED_PROCESS", 0) | getattr(subprocess, "CREATE_NEW_PROCESS_GROUP", 0) - else: - kwargs["start_new_session"] = True - subprocess.Popen(argv, **kwargs) - return True - except Exception: - return False - - -def _wait_for_oaskd_ready(timeout_s: float = 2.0) -> bool: - try: - from oaskd_daemon import ping_daemon - except Exception: - return False - deadline = time.time() + max(0.1, float(timeout_s)) - state_file = _state_file_from_env() - while time.time() < deadline: - try: - if ping_daemon(timeout_s=0.2, state_file=state_file): - return True - except Exception: - pass - time.sleep(0.1) - return False - - def _daemon_startup_wait_s(timeout: float) -> float: raw = (os.environ.get("CCB_OASKD_STARTUP_WAIT_S") or "").strip() if raw: @@ -296,21 +163,6 @@ def _usage() -> None: print("Usage: oask [--timeout SECONDS] [--output FILE] ", file=sys.stderr) -def _check_background_mode() -> bool: - """Return True when stdout looks like Claude Code run_in_background output capture.""" - if os.environ.get("CLAUDECODE") != "1": - return True - if os.environ.get("CCB_ALLOW_FOREGROUND") in ("1", "true", "yes"): - return True - try: - import stat - - mode = os.fstat(sys.stdout.fileno()).st_mode - return stat.S_ISREG(mode) or stat.S_ISSOCK(mode) or stat.S_ISFIFO(mode) - except Exception: - return False - - def _parse_args(argv: list[str]) -> Tuple[Optional[Path], float, str, bool]: output: Optional[Path] = None timeout: Optional[float] = None @@ -364,7 +216,7 @@ def main(argv: list[str]) -> int: _usage() return EXIT_ERROR - if os.environ.get("CLAUDECODE") == "1" and not _check_background_mode(): + if os.environ.get("CLAUDECODE") == "1" and not check_background_mode(): print("[ERROR] oask MUST be called with run_in_background=true", file=sys.stderr) print("Correct usage: Bash(oask \"...\", run_in_background=true)", file=sys.stderr) return EXIT_ERROR diff --git a/lib/askd_client.py b/lib/askd_client.py new file mode 100644 index 0000000..96bbeb2 --- /dev/null +++ b/lib/askd_client.py @@ -0,0 +1,171 @@ +from __future__ import annotations + +import json +import os +import shutil +import socket +import subprocess +import sys +import time +from pathlib import Path +from typing import Optional, Tuple + +from env_utils import env_bool +from providers import ProviderClientSpec + + +def autostart_enabled(primary_env: str, legacy_env: str, default: bool = True) -> bool: + if primary_env in os.environ: + return env_bool(primary_env, default) + if legacy_env in os.environ: + return env_bool(legacy_env, default) + return default + + +def state_file_from_env(env_name: str) -> Optional[Path]: + raw = (os.environ.get(env_name) or "").strip() + if not raw: + return None + try: + return Path(raw).expanduser() + except Exception: + return None + + +def find_project_session_file(work_dir: Path, session_filename: str) -> Optional[Path]: + current = Path(work_dir).resolve() + while True: + candidate = current / session_filename + if candidate.exists(): + return candidate + if current == current.parent: + return None + current = current.parent + + +def try_daemon_request(spec: ProviderClientSpec, work_dir: Path, message: str, timeout: float, quiet: bool, state_file: Optional[Path] = None) -> Optional[Tuple[str, int]]: + if not env_bool(spec.enabled_env, True): + return None + + if not find_project_session_file(work_dir, spec.session_filename): + return None + + from importlib import import_module + daemon_module = import_module(spec.daemon_module) + read_state = getattr(daemon_module, "read_state") + + st = read_state(state_file=state_file) + if not st: + return None + try: + host = st.get("connect_host") or st.get("host") + port = int(st["port"]) + token = st["token"] + except Exception: + return None + + try: + payload = { + "type": f"{spec.protocol_prefix}.request", + "v": 1, + "id": f"{spec.protocol_prefix}-{os.getpid()}-{int(time.time() * 1000)}", + "token": token, + "work_dir": str(work_dir), + "timeout_s": float(timeout), + "quiet": bool(quiet), + "message": message, + } + connect_timeout = min(1.0, max(0.1, float(timeout))) + with socket.create_connection((host, port), timeout=connect_timeout) as sock: + sock.settimeout(0.5) + sock.sendall((json.dumps(payload, ensure_ascii=False) + "\n").encode("utf-8")) + buf = b"" + deadline = time.time() + float(timeout) + 5.0 + while b"\n" not in buf and time.time() < deadline: + try: + chunk = sock.recv(65536) + except socket.timeout: + continue + if not chunk: + break + buf += chunk + if b"\n" not in buf: + return None + line = buf.split(b"\n", 1)[0].decode("utf-8", errors="replace") + resp = json.loads(line) + if resp.get("type") != f"{spec.protocol_prefix}.response": + return None + reply = str(resp.get("reply") or "") + exit_code = int(resp.get("exit_code", 1)) + return reply, exit_code + except Exception: + return None + + +def maybe_start_daemon(spec: ProviderClientSpec, work_dir: Path) -> bool: + if not env_bool(spec.enabled_env, True): + return False + if not autostart_enabled(spec.autostart_env_primary, spec.autostart_env_legacy, True): + return False + if not find_project_session_file(work_dir, spec.session_filename): + return False + + candidates: list[str] = [] + local = (Path(__file__).resolve().parent.parent / "bin" / spec.daemon_bin_name) + if local.exists(): + candidates.append(str(local)) + found = shutil.which(spec.daemon_bin_name) + if found: + candidates.append(found) + if not candidates: + return False + + entry = candidates[0] + lower = entry.lower() + if lower.endswith((".cmd", ".bat", ".exe")): + argv = [entry] + else: + argv = [sys.executable, entry] + try: + kwargs = {"stdin": subprocess.DEVNULL, "stdout": subprocess.DEVNULL, "stderr": subprocess.DEVNULL, "close_fds": True} + if os.name == "nt": + kwargs["creationflags"] = getattr(subprocess, "DETACHED_PROCESS", 0) | getattr(subprocess, "CREATE_NEW_PROCESS_GROUP", 0) + else: + kwargs["start_new_session"] = True + subprocess.Popen(argv, **kwargs) + return True + except Exception: + return False + + +def wait_for_daemon_ready(spec: ProviderClientSpec, timeout_s: float = 2.0, state_file: Optional[Path] = None) -> bool: + try: + from importlib import import_module + daemon_module = import_module(spec.daemon_module) + ping_daemon = getattr(daemon_module, "ping_daemon") + except Exception: + return False + deadline = time.time() + max(0.1, float(timeout_s)) + if state_file is None: + state_file = state_file_from_env(spec.state_file_env) + while time.time() < deadline: + try: + if ping_daemon(timeout_s=0.2, state_file=state_file): + return True + except Exception: + pass + time.sleep(0.1) + return False + + +def check_background_mode() -> bool: + if os.environ.get("CLAUDECODE") != "1": + return True + if os.environ.get("CCB_ALLOW_FOREGROUND") in ("1", "true", "yes"): + return True + try: + import stat + mode = os.fstat(sys.stdout.fileno()).st_mode + return stat.S_ISREG(mode) or stat.S_ISSOCK(mode) or stat.S_ISFIFO(mode) + except Exception: + return False diff --git a/lib/providers.py b/lib/providers.py index 587e4fa..03ab16d 100644 --- a/lib/providers.py +++ b/lib/providers.py @@ -13,6 +13,18 @@ class ProviderDaemonSpec: lock_name: str +@dataclass +class ProviderClientSpec: + protocol_prefix: str + enabled_env: str + autostart_env_primary: str + autostart_env_legacy: str + state_file_env: str + session_filename: str + daemon_bin_name: str + daemon_module: str + + CASKD_SPEC = ProviderDaemonSpec( daemon_key="caskd", protocol_prefix="cask", @@ -41,3 +53,39 @@ class ProviderDaemonSpec: idle_timeout_env="CCB_OASKD_IDLE_TIMEOUT_S", lock_name="oaskd", ) + + +CASK_CLIENT_SPEC = ProviderClientSpec( + protocol_prefix="cask", + enabled_env="CCB_CASKD", + autostart_env_primary="CCB_CASKD_AUTOSTART", + autostart_env_legacy="CCB_AUTO_CASKD", + state_file_env="CCB_CASKD_STATE_FILE", + session_filename=".codex-session", + daemon_bin_name="caskd", + daemon_module="caskd_daemon", +) + + +GASK_CLIENT_SPEC = ProviderClientSpec( + protocol_prefix="gask", + enabled_env="CCB_GASKD", + autostart_env_primary="CCB_GASKD_AUTOSTART", + autostart_env_legacy="CCB_AUTO_GASKD", + state_file_env="CCB_GASKD_STATE_FILE", + session_filename=".gemini-session", + daemon_bin_name="gaskd", + daemon_module="gaskd_daemon", +) + + +OASK_CLIENT_SPEC = ProviderClientSpec( + protocol_prefix="oask", + enabled_env="CCB_OASKD", + autostart_env_primary="CCB_OASKD_AUTOSTART", + autostart_env_legacy="CCB_AUTO_OASKD", + state_file_env="CCB_OASKD_STATE_FILE", + session_filename=".opencode-session", + daemon_bin_name="oaskd", + daemon_module="oaskd_daemon", +) From 3f4f58e9709ccd97329b85f1eb633e66b14b5574 Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 10 Jan 2026 18:26:50 +0800 Subject: [PATCH 148/153] refactor: unify session helpers, worker pool, and protocol module --- bin/cask | 4 +-- lib/askd_client.py | 12 +------ lib/caskd_daemon.py | 64 ++++++++++------------------------- lib/caskd_protocol.py | 78 ++----------------------------------------- lib/caskd_session.py | 10 ++---- lib/ccb_protocol.py | 77 ++++++++++++++++++++++++++++++++++++++++++ lib/gaskd_daemon.py | 58 +++++++++----------------------- lib/gaskd_protocol.py | 2 +- lib/gaskd_session.py | 11 ++---- lib/oaskd_daemon.py | 58 +++++++++----------------------- lib/oaskd_protocol.py | 3 +- lib/oaskd_session.py | 10 ++---- lib/opencode_comm.py | 2 +- lib/session_utils.py | 11 ++++++ lib/worker_pool.py | 72 +++++++++++++++++++++++++++++++++++++++ 15 files changed, 222 insertions(+), 250 deletions(-) create mode 100644 lib/ccb_protocol.py create mode 100644 lib/worker_pool.py diff --git a/bin/cask b/bin/cask index 58dfd08..42a1228 100755 --- a/bin/cask +++ b/bin/cask @@ -24,7 +24,7 @@ from process_lock import ProviderLock COMPLETION_MARKER = (os.environ.get("CCB_EXECUTION_COMPLETE_MARKER") or "EXECUTION_COMPLETE").strip() or "EXECUTION_COMPLETE" from env_utils import env_bool -from caskd_protocol import REQ_ID_PREFIX, make_req_id, strip_done_text, wrap_codex_prompt +from ccb_protocol import REQ_ID_PREFIX, make_req_id, strip_done_text, wrap_codex_prompt from caskd_daemon import read_state from askd_client import ( autostart_enabled, @@ -145,7 +145,7 @@ def _wait_for_done_reply(log_reader, state: dict, timeout: float, req_id: str, q continue chunks.append(text) combined = "\n".join(chunks) - from caskd_protocol import is_done_text + from ccb_protocol import is_done_text if is_done_text(combined, req_id): return strip_done_text(combined, req_id), EXIT_OK diff --git a/lib/askd_client.py b/lib/askd_client.py index 96bbeb2..f825f58 100644 --- a/lib/askd_client.py +++ b/lib/askd_client.py @@ -12,6 +12,7 @@ from env_utils import env_bool from providers import ProviderClientSpec +from session_utils import find_project_session_file def autostart_enabled(primary_env: str, legacy_env: str, default: bool = True) -> bool: @@ -32,17 +33,6 @@ def state_file_from_env(env_name: str) -> Optional[Path]: return None -def find_project_session_file(work_dir: Path, session_filename: str) -> Optional[Path]: - current = Path(work_dir).resolve() - while True: - candidate = current / session_filename - if candidate.exists(): - return candidate - if current == current.parent: - return None - current = current.parent - - def try_daemon_request(spec: ProviderClientSpec, work_dir: Path, message: str, timeout: float, quiet: bool, state_file: Optional[Path] = None) -> Optional[Tuple[str, int]]: if not env_bool(spec.enabled_env, True): return None diff --git a/lib/caskd_daemon.py b/lib/caskd_daemon.py index f54d5fe..f18ebf6 100644 --- a/lib/caskd_daemon.py +++ b/lib/caskd_daemon.py @@ -2,14 +2,15 @@ import json import os -import queue import threading import time from dataclasses import dataclass from pathlib import Path from typing import Any, Optional, Tuple -from caskd_protocol import ( +from worker_pool import BaseSessionWorker, PerSessionWorkerPool + +from ccb_protocol import ( CaskdRequest, CaskdResult, REQ_ID_PREFIX, @@ -59,41 +60,19 @@ class _QueuedTask: result: Optional[CaskdResult] = None -class _SessionWorker(threading.Thread): - def __init__(self, session_key: str): - super().__init__(daemon=True) - self.session_key = session_key - self._q: "queue.Queue[_QueuedTask]" = queue.Queue() - self._stop = threading.Event() - - def enqueue(self, task: _QueuedTask) -> None: - self._q.put(task) - - def stop(self) -> None: - self._stop.set() - - def run(self) -> None: - while not self._stop.is_set(): - try: - task = self._q.get(timeout=0.2) - except queue.Empty: - continue - try: - task.result = self._handle_task(task) - except Exception as exc: - write_log(log_path(CASKD_SPEC.log_file_name), f"[ERROR] session={self.session_key} req_id={task.req_id} {exc}") - task.result = CaskdResult( - exit_code=1, - reply=str(exc), - req_id=task.req_id, - session_key=self.session_key, - log_path=None, - anchor_seen=False, - done_seen=False, - fallback_scan=False, - ) - finally: - task.done_event.set() +class _SessionWorker(BaseSessionWorker[_QueuedTask, CaskdResult]): + def _handle_exception(self, exc: Exception, task: _QueuedTask) -> CaskdResult: + write_log(log_path(CASKD_SPEC.log_file_name), f"[ERROR] session={self.session_key} req_id={task.req_id} {exc}") + return CaskdResult( + exit_code=1, + reply=str(exc), + req_id=task.req_id, + session_key=self.session_key, + log_path=None, + anchor_seen=False, + done_seen=False, + fallback_scan=False, + ) def _handle_task(self, task: _QueuedTask) -> CaskdResult: started_ms = _now_ms() @@ -470,8 +449,7 @@ def get_session_registry() -> SessionRegistry: class _WorkerPool: def __init__(self): - self._lock = threading.Lock() - self._workers: dict[str, _SessionWorker] = {} + self._pool = PerSessionWorkerPool[_SessionWorker]() def submit(self, request: CaskdRequest) -> _QueuedTask: req_id = make_req_id() @@ -480,13 +458,7 @@ def submit(self, request: CaskdRequest) -> _QueuedTask: session = load_project_session(Path(request.work_dir)) session_key = compute_session_key(session) if session else "codex:unknown" - with self._lock: - worker = self._workers.get(session_key) - if worker is None: - worker = _SessionWorker(session_key) - self._workers[session_key] = worker - worker.start() - + worker = self._pool.get_or_create(session_key, _SessionWorker) worker.enqueue(task) return task diff --git a/lib/caskd_protocol.py b/lib/caskd_protocol.py index 7a0bc78..ada86a3 100644 --- a/lib/caskd_protocol.py +++ b/lib/caskd_protocol.py @@ -1,78 +1,4 @@ from __future__ import annotations -import re -import secrets -from dataclasses import dataclass - - -REQ_ID_PREFIX = "CCB_REQ_ID:" -DONE_PREFIX = "CCB_DONE:" - -DONE_LINE_RE_TEMPLATE = r"^\s*CCB_DONE:\s*{req_id}\s*$" - - -def make_req_id() -> str: - # 128-bit token is enough; hex string is log/grep friendly. - return secrets.token_hex(16) - - -def wrap_codex_prompt(message: str, req_id: str) -> str: - message = (message or "").rstrip() - return ( - f"{REQ_ID_PREFIX} {req_id}\n\n" - f"{message}\n\n" - "IMPORTANT:\n" - "- Reply normally.\n" - "- End your reply with this exact final line (verbatim, on its own line):\n" - f"{DONE_PREFIX} {req_id}\n" - ) - - -def done_line_re(req_id: str) -> re.Pattern[str]: - return re.compile(DONE_LINE_RE_TEMPLATE.format(req_id=re.escape(req_id))) - - -def is_done_text(text: str, req_id: str) -> bool: - lines = [ln.rstrip() for ln in (text or "").splitlines()] - for i in range(len(lines) - 1, -1, -1): - if lines[i].strip() == "": - continue - return bool(done_line_re(req_id).match(lines[i])) - return False - - -def strip_done_text(text: str, req_id: str) -> str: - lines = [ln.rstrip("\n") for ln in (text or "").splitlines()] - if not lines: - return "" - i = len(lines) - 1 - while i >= 0 and lines[i].strip() == "": - i -= 1 - if i >= 0 and done_line_re(req_id).match(lines[i] or ""): - lines = lines[:i] - return "\n".join(lines).rstrip() - - -@dataclass(frozen=True) -class CaskdRequest: - client_id: str - work_dir: str - timeout_s: float - quiet: bool - message: str - output_path: str | None = None - - -@dataclass(frozen=True) -class CaskdResult: - exit_code: int - reply: str - req_id: str - session_key: str - log_path: str | None - anchor_seen: bool - done_seen: bool - fallback_scan: bool - anchor_ms: int | None = None - done_ms: int | None = None - +# Backwards compatibility shim (internal modules should prefer `ccb_protocol`). +from ccb_protocol import * # noqa: F401,F403 diff --git a/lib/caskd_session.py b/lib/caskd_session.py index bbdbd2b..7dd2778 100644 --- a/lib/caskd_session.py +++ b/lib/caskd_session.py @@ -8,20 +8,14 @@ from typing import Optional, Tuple from ccb_config import apply_backend_env -from session_utils import safe_write_session +from session_utils import find_project_session_file as _find_project_session_file, safe_write_session from terminal import get_backend_for_session apply_backend_env() def find_project_session_file(work_dir: Path) -> Optional[Path]: - current = Path(work_dir) - while current != current.parent: - candidate = current / ".codex-session" - if candidate.exists(): - return candidate - current = current.parent - return None + return _find_project_session_file(work_dir, ".codex-session") def _read_json(path: Path) -> dict: diff --git a/lib/ccb_protocol.py b/lib/ccb_protocol.py new file mode 100644 index 0000000..e952b42 --- /dev/null +++ b/lib/ccb_protocol.py @@ -0,0 +1,77 @@ +from __future__ import annotations + +import re +import secrets +from dataclasses import dataclass + + +REQ_ID_PREFIX = "CCB_REQ_ID:" +DONE_PREFIX = "CCB_DONE:" + +DONE_LINE_RE_TEMPLATE = r"^\s*CCB_DONE:\s*{req_id}\s*$" + + +def make_req_id() -> str: + # 128-bit token is enough; hex string is log/grep friendly. + return secrets.token_hex(16) + + +def wrap_codex_prompt(message: str, req_id: str) -> str: + message = (message or "").rstrip() + return ( + f"{REQ_ID_PREFIX} {req_id}\n\n" + f"{message}\n\n" + "IMPORTANT:\n" + "- Reply normally.\n" + "- End your reply with this exact final line (verbatim, on its own line):\n" + f"{DONE_PREFIX} {req_id}\n" + ) + + +def done_line_re(req_id: str) -> re.Pattern[str]: + return re.compile(DONE_LINE_RE_TEMPLATE.format(req_id=re.escape(req_id))) + + +def is_done_text(text: str, req_id: str) -> bool: + lines = [ln.rstrip() for ln in (text or "").splitlines()] + for i in range(len(lines) - 1, -1, -1): + if lines[i].strip() == "": + continue + return bool(done_line_re(req_id).match(lines[i])) + return False + + +def strip_done_text(text: str, req_id: str) -> str: + lines = [ln.rstrip("\n") for ln in (text or "").splitlines()] + if not lines: + return "" + i = len(lines) - 1 + while i >= 0 and lines[i].strip() == "": + i -= 1 + if i >= 0 and done_line_re(req_id).match(lines[i] or ""): + lines = lines[:i] + return "\n".join(lines).rstrip() + + +@dataclass(frozen=True) +class CaskdRequest: + client_id: str + work_dir: str + timeout_s: float + quiet: bool + message: str + output_path: str | None = None + + +@dataclass(frozen=True) +class CaskdResult: + exit_code: int + reply: str + req_id: str + session_key: str + log_path: str | None + anchor_seen: bool + done_seen: bool + fallback_scan: bool + anchor_ms: int | None = None + done_ms: int | None = None diff --git a/lib/gaskd_daemon.py b/lib/gaskd_daemon.py index 8f2fdd9..89e85a0 100644 --- a/lib/gaskd_daemon.py +++ b/lib/gaskd_daemon.py @@ -2,13 +2,14 @@ import json import os -import queue import threading import time from dataclasses import dataclass from pathlib import Path from typing import Optional +from worker_pool import BaseSessionWorker, PerSessionWorkerPool + from gaskd_protocol import ( GaskdRequest, GaskdResult, @@ -110,39 +111,17 @@ class _QueuedTask: result: Optional[GaskdResult] = None -class _SessionWorker(threading.Thread): - def __init__(self, session_key: str): - super().__init__(daemon=True) - self.session_key = session_key - self._q: "queue.Queue[_QueuedTask]" = queue.Queue() - self._stop = threading.Event() - - def enqueue(self, task: _QueuedTask) -> None: - self._q.put(task) - - def stop(self) -> None: - self._stop.set() - - def run(self) -> None: - while not self._stop.is_set(): - try: - task = self._q.get(timeout=0.2) - except queue.Empty: - continue - try: - task.result = self._handle_task(task) - except Exception as exc: - _write_log(f"[ERROR] session={self.session_key} req_id={task.req_id} {exc}") - task.result = GaskdResult( - exit_code=1, - reply=str(exc), - req_id=task.req_id, - session_key=self.session_key, - done_seen=False, - done_ms=None, - ) - finally: - task.done_event.set() +class _SessionWorker(BaseSessionWorker[_QueuedTask, GaskdResult]): + def _handle_exception(self, exc: Exception, task: _QueuedTask) -> GaskdResult: + _write_log(f"[ERROR] session={self.session_key} req_id={task.req_id} {exc}") + return GaskdResult( + exit_code=1, + reply=str(exc), + req_id=task.req_id, + session_key=self.session_key, + done_seen=False, + done_ms=None, + ) def _handle_task(self, task: _QueuedTask) -> GaskdResult: started_ms = _now_ms() @@ -275,8 +254,7 @@ def _handle_task(self, task: _QueuedTask) -> GaskdResult: class _WorkerPool: def __init__(self): - self._lock = threading.Lock() - self._workers: dict[str, _SessionWorker] = {} + self._pool = PerSessionWorkerPool[_SessionWorker]() def submit(self, request: GaskdRequest) -> _QueuedTask: req_id = make_req_id() @@ -285,13 +263,7 @@ def submit(self, request: GaskdRequest) -> _QueuedTask: session = load_project_session(Path(request.work_dir)) session_key = compute_session_key(session) if session else "gemini:unknown" - with self._lock: - worker = self._workers.get(session_key) - if worker is None: - worker = _SessionWorker(session_key) - self._workers[session_key] = worker - worker.start() - + worker = self._pool.get_or_create(session_key, _SessionWorker) worker.enqueue(task) return task diff --git a/lib/gaskd_protocol.py b/lib/gaskd_protocol.py index 74ac8a3..abc754e 100644 --- a/lib/gaskd_protocol.py +++ b/lib/gaskd_protocol.py @@ -3,7 +3,7 @@ import re from dataclasses import dataclass -from caskd_protocol import ( +from ccb_protocol import ( DONE_PREFIX, REQ_ID_PREFIX, is_done_text, diff --git a/lib/gaskd_session.py b/lib/gaskd_session.py index be94319..e84d2b8 100644 --- a/lib/gaskd_session.py +++ b/lib/gaskd_session.py @@ -7,20 +7,14 @@ from typing import Optional, Tuple from ccb_config import apply_backend_env -from session_utils import safe_write_session +from session_utils import find_project_session_file as _find_project_session_file, safe_write_session from terminal import get_backend_for_session apply_backend_env() def find_project_session_file(work_dir: Path) -> Optional[Path]: - current = Path(work_dir) - while current != current.parent: - candidate = current / ".gemini-session" - if candidate.exists(): - return candidate - current = current.parent - return None + return _find_project_session_file(work_dir, ".gemini-session") def _read_json(path: Path) -> dict: @@ -118,4 +112,3 @@ def compute_session_key(session: GeminiProjectSession) -> str: if sid: return f"gemini:{sid}" return f"gemini_file:{session.session_file}" - diff --git a/lib/oaskd_daemon.py b/lib/oaskd_daemon.py index 121d56e..efb1b4f 100644 --- a/lib/oaskd_daemon.py +++ b/lib/oaskd_daemon.py @@ -2,13 +2,14 @@ import json import os -import queue import threading import time from dataclasses import dataclass from pathlib import Path from typing import Optional +from worker_pool import BaseSessionWorker, PerSessionWorkerPool + from oaskd_protocol import OaskdRequest, OaskdResult, is_done_text, make_req_id, strip_done_text, wrap_opencode_prompt from oaskd_session import compute_session_key, load_project_session from opencode_comm import OpenCodeLogReader @@ -45,39 +46,17 @@ class _QueuedTask: result: Optional[OaskdResult] = None -class _SessionWorker(threading.Thread): - def __init__(self, session_key: str): - super().__init__(daemon=True) - self.session_key = session_key - self._q: "queue.Queue[_QueuedTask]" = queue.Queue() - self._stop = threading.Event() - - def enqueue(self, task: _QueuedTask) -> None: - self._q.put(task) - - def stop(self) -> None: - self._stop.set() - - def run(self) -> None: - while not self._stop.is_set(): - try: - task = self._q.get(timeout=0.2) - except queue.Empty: - continue - try: - task.result = self._handle_task(task) - except Exception as exc: - write_log(log_path(OASKD_SPEC.log_file_name), f"[ERROR] session={self.session_key} req_id={task.req_id} {exc}") - task.result = OaskdResult( - exit_code=1, - reply=str(exc), - req_id=task.req_id, - session_key=self.session_key, - done_seen=False, - done_ms=None, - ) - finally: - task.done_event.set() +class _SessionWorker(BaseSessionWorker[_QueuedTask, OaskdResult]): + def _handle_exception(self, exc: Exception, task: _QueuedTask) -> OaskdResult: + write_log(log_path(OASKD_SPEC.log_file_name), f"[ERROR] session={self.session_key} req_id={task.req_id} {exc}") + return OaskdResult( + exit_code=1, + reply=str(exc), + req_id=task.req_id, + session_key=self.session_key, + done_seen=False, + done_ms=None, + ) def _handle_task(self, task: _QueuedTask) -> OaskdResult: started_ms = _now_ms() @@ -247,8 +226,7 @@ def _handle_task(self, task: _QueuedTask) -> OaskdResult: class _WorkerPool: def __init__(self): - self._lock = threading.Lock() - self._workers: dict[str, _SessionWorker] = {} + self._pool = PerSessionWorkerPool[_SessionWorker]() def submit(self, request: OaskdRequest) -> _QueuedTask: req_id = make_req_id() @@ -257,13 +235,7 @@ def submit(self, request: OaskdRequest) -> _QueuedTask: session = load_project_session(Path(request.work_dir)) session_key = compute_session_key(session) if session else "opencode:unknown" - with self._lock: - worker = self._workers.get(session_key) - if worker is None: - worker = _SessionWorker(session_key) - self._workers[session_key] = worker - worker.start() - + worker = self._pool.get_or_create(session_key, _SessionWorker) worker.enqueue(task) try: qsize = int(worker._q.qsize()) diff --git a/lib/oaskd_protocol.py b/lib/oaskd_protocol.py index 964632c..d594b83 100644 --- a/lib/oaskd_protocol.py +++ b/lib/oaskd_protocol.py @@ -2,7 +2,7 @@ from dataclasses import dataclass -from caskd_protocol import ( +from ccb_protocol import ( DONE_PREFIX, REQ_ID_PREFIX, is_done_text, @@ -41,4 +41,3 @@ class OaskdResult: session_key: str done_seen: bool done_ms: int | None = None - diff --git a/lib/oaskd_session.py b/lib/oaskd_session.py index 1e8de0d..9263235 100644 --- a/lib/oaskd_session.py +++ b/lib/oaskd_session.py @@ -7,20 +7,14 @@ from typing import Optional, Tuple from ccb_config import apply_backend_env -from session_utils import safe_write_session +from session_utils import find_project_session_file as _find_project_session_file, safe_write_session from terminal import get_backend_for_session apply_backend_env() def find_project_session_file(work_dir: Path) -> Optional[Path]: - current = Path(work_dir) - while current != current.parent: - candidate = current / ".opencode-session" - if candidate.exists(): - return candidate - current = current.parent - return None + return _find_project_session_file(work_dir, ".opencode-session") def _read_json(path: Path) -> dict: diff --git a/lib/opencode_comm.py b/lib/opencode_comm.py index 446c340..dfe9e8d 100644 --- a/lib/opencode_comm.py +++ b/lib/opencode_comm.py @@ -18,7 +18,7 @@ from pathlib import Path from typing import Any, Dict, List, Optional, Tuple -from caskd_protocol import REQ_ID_PREFIX +from ccb_protocol import REQ_ID_PREFIX from ccb_config import apply_backend_env from i18n import t from terminal import get_backend_for_session, get_pane_id_from_session diff --git a/lib/session_utils.py b/lib/session_utils.py index 3b3b3a7..2ad283e 100644 --- a/lib/session_utils.py +++ b/lib/session_utils.py @@ -112,3 +112,14 @@ def print_session_error(msg: str, to_stderr: bool = True) -> None: import sys output = sys.stderr if to_stderr else sys.stdout print(msg, file=output) + + +def find_project_session_file(work_dir: Path, session_filename: str) -> Optional[Path]: + current = Path(work_dir).resolve() + while True: + candidate = current / session_filename + if candidate.exists(): + return candidate + if current == current.parent: + return None + current = current.parent diff --git a/lib/worker_pool.py b/lib/worker_pool.py new file mode 100644 index 0000000..c3b6ea5 --- /dev/null +++ b/lib/worker_pool.py @@ -0,0 +1,72 @@ +from __future__ import annotations + +import queue +import threading +from typing import Callable, Generic, Optional, Protocol, TypeVar + + +ResultT = TypeVar("ResultT") + + +class QueuedTaskLike(Protocol[ResultT]): + req_id: str + done_event: threading.Event + result: Optional[ResultT] + + +TaskT = TypeVar("TaskT", bound=QueuedTaskLike) + + +class BaseSessionWorker(threading.Thread, Generic[TaskT, ResultT]): + def __init__(self, session_key: str): + super().__init__(daemon=True) + self.session_key = session_key + self._q: "queue.Queue[TaskT]" = queue.Queue() + self._stop = threading.Event() + + def enqueue(self, task: TaskT) -> None: + self._q.put(task) + + def stop(self) -> None: + self._stop.set() + + def run(self) -> None: + while not self._stop.is_set(): + try: + task = self._q.get(timeout=0.2) + except queue.Empty: + continue + try: + task.result = self._handle_task(task) + except Exception as exc: + task.result = self._handle_exception(exc, task) + finally: + task.done_event.set() + + def _handle_task(self, task: TaskT) -> ResultT: + raise NotImplementedError + + def _handle_exception(self, exc: Exception, task: TaskT) -> ResultT: + raise NotImplementedError + + +WorkerT = TypeVar("WorkerT", bound=threading.Thread) + + +class PerSessionWorkerPool(Generic[WorkerT]): + def __init__(self): + self._lock = threading.Lock() + self._workers: dict[str, WorkerT] = {} + + def get_or_create(self, session_key: str, factory: Callable[[str], WorkerT]) -> WorkerT: + created = False + with self._lock: + worker = self._workers.get(session_key) + if worker is None: + worker = factory(session_key) + self._workers[session_key] = worker + created = True + if created: + worker.start() + return worker + From 1f1e9f3206ce2846c2771f103ab6fa4853731eb3 Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 10 Jan 2026 18:41:31 +0800 Subject: [PATCH 149/153] fix: improve Windows native compatibility --- bin/cask | 12 ++- bin/cask-w | 2 +- bin/caskd | 3 +- bin/ccb-layout | 3 +- bin/cpend | 2 +- bin/cping | 2 +- bin/gask | 2 +- bin/gask-w | 2 +- bin/gaskd | 3 +- bin/gpend | 2 +- bin/gping | 2 +- bin/oask | 2 +- bin/oask-w | 3 +- bin/oaskd | 3 +- bin/opend | 3 +- bin/oping | 3 +- ccb | 2 +- install.sh | 205 ++++++++++++++++++++++++--------------- lib/askd_runtime.py | 13 +++ lib/askd_server.py | 10 +- lib/codex_comm.py | 1 - lib/codex_dual_bridge.py | 1 - lib/gemini_comm.py | 1 - lib/opencode_comm.py | 1 - lib/session_utils.py | 40 ++++---- lib/terminal.py | 23 ++++- 26 files changed, 211 insertions(+), 135 deletions(-) diff --git a/bin/cask b/bin/cask index 42a1228..4b86c35 100755 --- a/bin/cask +++ b/bin/cask @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python """ cask - Send message to Codex and wait for reply (sync). @@ -53,6 +53,16 @@ def _get_executor_from_roles() -> Optional[str]: Path(".autoflow/roles.json"), Path.home() / ".config" / "cca" / "roles.json", ] + xdg_config = (os.environ.get("XDG_CONFIG_HOME") or "").strip() + if xdg_config: + candidates.append(Path(xdg_config) / "cca" / "roles.json") + if os.name == "nt": + appdata = (os.environ.get("APPDATA") or "").strip() + if appdata: + candidates.append(Path(appdata) / "cca" / "roles.json") + localappdata = (os.environ.get("LOCALAPPDATA") or "").strip() + if localappdata: + candidates.append(Path(localappdata) / "cca" / "roles.json") for cfg_path in candidates: if cfg_path.exists(): try: diff --git a/bin/cask-w b/bin/cask-w index 0c51c06..52f3585 100755 --- a/bin/cask-w +++ b/bin/cask-w @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python """ cask-w - Send message to Codex and wait for reply (foreground sync). diff --git a/bin/caskd b/bin/caskd index 310b819..c8dc7b8 100755 --- a/bin/caskd +++ b/bin/caskd @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python """ caskd - Codex ask daemon (WezTerm/iTerm2). @@ -52,4 +52,3 @@ def main(argv: list[str]) -> int: if __name__ == "__main__": raise SystemExit(main(sys.argv)) - diff --git a/bin/ccb-layout b/bin/ccb-layout index e45e754..dcc12ed 100644 --- a/bin/ccb-layout +++ b/bin/ccb-layout @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python """ ccb-layout - Start a 2x2 four-AI layout (Claude + Codex + Gemini + OpenCode). @@ -43,4 +43,3 @@ def main(argv: list[str]) -> int: if __name__ == "__main__": raise SystemExit(main(sys.argv)) - diff --git a/bin/cpend b/bin/cpend index 4e5f262..aeea377 100755 --- a/bin/cpend +++ b/bin/cpend @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python """ cpend - View latest Codex reply """ diff --git a/bin/cping b/bin/cping index c102fdb..702478f 100755 --- a/bin/cping +++ b/bin/cping @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python """ cping command entry point Test connectivity with Codex diff --git a/bin/gask b/bin/gask index 76ba72a..cbb847b 100755 --- a/bin/gask +++ b/bin/gask @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python """ gask - Send message to Gemini and wait for reply (sync). diff --git a/bin/gask-w b/bin/gask-w index 408cd1b..8690547 100755 --- a/bin/gask-w +++ b/bin/gask-w @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python """ gask-w - Send message to Gemini and wait for reply (foreground sync). diff --git a/bin/gaskd b/bin/gaskd index ba34552..6db1c05 100644 --- a/bin/gaskd +++ b/bin/gaskd @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python """ gaskd - Gemini ask daemon. @@ -52,4 +52,3 @@ def main(argv: list[str]) -> int: if __name__ == "__main__": raise SystemExit(main(sys.argv)) - diff --git a/bin/gpend b/bin/gpend index 3cb9477..84bd674 100755 --- a/bin/gpend +++ b/bin/gpend @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python """ gpend - View latest Gemini reply """ diff --git a/bin/gping b/bin/gping index 3d7922e..d49c65f 100755 --- a/bin/gping +++ b/bin/gping @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python """ gping - Test Gemini connectivity """ diff --git a/bin/oask b/bin/oask index cb81f5b..fac98c2 100755 --- a/bin/oask +++ b/bin/oask @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python """ oask - Send message to OpenCode and wait for reply (sync). diff --git a/bin/oask-w b/bin/oask-w index 2186b6d..6316adb 100755 --- a/bin/oask-w +++ b/bin/oask-w @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python """ oask-w - Send message to OpenCode and wait for reply (foreground sync). @@ -98,4 +98,3 @@ def main(argv: list[str]) -> int: if __name__ == "__main__": raise SystemExit(main(sys.argv)) - diff --git a/bin/oaskd b/bin/oaskd index 82c5d8e..3ae80c2 100644 --- a/bin/oaskd +++ b/bin/oaskd @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python """ oaskd - OpenCode ask daemon. @@ -52,4 +52,3 @@ def main(argv: list[str]) -> int: if __name__ == "__main__": raise SystemExit(main(sys.argv)) - diff --git a/bin/opend b/bin/opend index bb69661..f8c7e6e 100755 --- a/bin/opend +++ b/bin/opend @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python """ opend - View latest OpenCode reply """ @@ -74,4 +74,3 @@ def main(argv: list[str]) -> int: if __name__ == "__main__": sys.exit(main(sys.argv)) - diff --git a/bin/oping b/bin/oping index 3aea09a..30c8712 100755 --- a/bin/oping +++ b/bin/oping @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python """ oping - Test OpenCode connectivity """ @@ -32,4 +32,3 @@ try: except ImportError as exc: print(f"[ERROR] Module import failed: {exc}") sys.exit(1) - diff --git a/ccb b/ccb index 76b95d1..ec1b024 100755 --- a/ccb +++ b/ccb @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python """ ccb (Claude Code Bridge) - Unified AI Launcher Supports Claude + Codex / Claude + Gemini / all three simultaneously diff --git a/install.sh b/install.sh index 1a6ad6a..72bab7c 100755 --- a/install.sh +++ b/install.sh @@ -178,16 +178,55 @@ require_command() { fi } +PYTHON_BIN="${CCB_PYTHON_BIN:-}" + +_python_check_310() { + local cmd="$1" + command -v "$cmd" >/dev/null 2>&1 || return 1 + "$cmd" -c 'import sys; raise SystemExit(0 if sys.version_info >= (3, 10) else 1)' >/dev/null 2>&1 +} + +pick_python_bin() { + if [[ -n "${PYTHON_BIN}" ]] && _python_check_310 "${PYTHON_BIN}"; then + return 0 + fi + for cmd in python3 python; do + if _python_check_310 "$cmd"; then + PYTHON_BIN="$cmd" + return 0 + fi + done + return 1 +} + +pick_any_python_bin() { + if [[ -n "${PYTHON_BIN}" ]] && command -v "${PYTHON_BIN}" >/dev/null 2>&1; then + return 0 + fi + for cmd in python3 python; do + if command -v "$cmd" >/dev/null 2>&1; then + PYTHON_BIN="$cmd" + return 0 + fi + done + return 1 +} + require_python_version() { # ccb requires Python 3.10+ (PEP 604 type unions: `str | None`, etc.) + if ! pick_python_bin; then + echo "ERROR: Missing dependency: python (3.10+ required)" + echo " Please install Python 3.10+ and ensure it is on PATH, then re-run install.sh" + exit 1 + fi local version - version="$(python3 -c 'import sys; print("{}.{}.{}".format(sys.version_info[0], sys.version_info[1], sys.version_info[2]))' 2>/dev/null || echo unknown)" - if ! python3 -c 'import sys; raise SystemExit(0 if sys.version_info >= (3, 10) else 1)'; then + version="$("$PYTHON_BIN" -c 'import sys; print("{}.{}.{}".format(sys.version_info[0], sys.version_info[1], sys.version_info[2]))' 2>/dev/null || echo unknown)" + if ! _python_check_310 "$PYTHON_BIN"; then echo "ERROR: Python version too old: $version" echo " Requires Python 3.10+, please upgrade and retry" exit 1 fi - echo "OK: Python $version" + echo "OK: Python $version ($PYTHON_BIN)" } # Return linux / macos / unknown based on uname @@ -311,21 +350,25 @@ install_it2() { echo echo "INFO: Installing it2 CLI..." - # Check if pip3 is available - if ! command -v pip3 >/dev/null 2>&1; then - echo "ERROR: pip3 not found, cannot auto-install it2" - echo " Please run manually: python3 -m pip install it2" + if ! pick_python_bin; then + echo "ERROR: Python 3.10+ not found, cannot auto-install it2" + echo " Please install Python 3.10+ and retry" + return 1 + fi + if ! "$PYTHON_BIN" -m pip --version >/dev/null 2>&1; then + echo "ERROR: pip not found for ${PYTHON_BIN}, cannot auto-install it2" + echo " Please run manually: ${PYTHON_BIN} -m pip install it2" return 1 fi # Install it2 - if pip3 install it2 --user 2>&1; then + if "$PYTHON_BIN" -m pip install it2 --user 2>&1; then echo "OK: it2 CLI installed successfully" # Check if in PATH if ! command -v it2 >/dev/null 2>&1; then local user_bin - user_bin="$(python3 -m site --user-base)/bin" + user_bin="$("$PYTHON_BIN" -m site --user-base)/bin" echo echo "WARN: it2 may not be in PATH, please add the following to your shell config:" echo " export PATH=\"$user_bin:\$PATH\"" @@ -501,8 +544,9 @@ save_wezterm_config() { local wezterm_path wezterm_path="$(detect_wezterm_path)" if [[ -n "$wezterm_path" ]]; then - mkdir -p "$HOME/.config/ccb" - echo "CODEX_WEZTERM_BIN=${wezterm_path}" > "$HOME/.config/ccb/env" + local cfg_root="${XDG_CONFIG_HOME:-$HOME/.config}" + mkdir -p "$cfg_root/ccb" + echo "CODEX_WEZTERM_BIN=${wezterm_path}" > "$cfg_root/ccb/env" echo "OK: WezTerm path cached: $wezterm_path" fi } @@ -696,16 +740,16 @@ remove_codex_mcp() { return fi - if ! command -v python3 >/dev/null 2>&1; then - echo "WARN: python3 required to detect MCP configuration" + if ! pick_python_bin; then + echo "WARN: python required to detect MCP configuration" return fi local has_codex_mcp - has_codex_mcp=$(python3 -c " -import json -try: - with open('$claude_config', 'r') as f: + has_codex_mcp=$("$PYTHON_BIN" -c " + import json + try: + with open('$claude_config', 'r') as f: data = json.load(f) found = False for proj, cfg in data.get('projects', {}).items(): @@ -717,16 +761,16 @@ try: if found: break print('yes' if found else 'no') -except: - print('no') -" 2>/dev/null) + except: + print('no') + " 2>/dev/null) if [[ "$has_codex_mcp" == "yes" ]]; then echo "WARN: Detected codex-related MCP configuration, removing to avoid conflicts..." - python3 -c " -import json -with open('$claude_config', 'r') as f: - data = json.load(f) + "$PYTHON_BIN" -c " + import json + with open('$claude_config', 'r') as f: + data = json.load(f) removed = [] for proj, cfg in data.get('projects', {}).items(): servers = cfg.get('mcpServers', {}) @@ -738,9 +782,9 @@ with open('$claude_config', 'w') as f: json.dump(data, f, indent=2) if removed: print('Removed the following MCP configurations:') - for r in removed: - print(f' - {r}') -" + for r in removed: + print(f' - {r}') + " echo "OK: Codex MCP configuration cleaned" fi } @@ -748,6 +792,10 @@ if removed: install_claude_md_config() { local claude_md="$HOME/.claude/CLAUDE.md" mkdir -p "$HOME/.claude" + if ! pick_python_bin; then + echo "ERROR: python required to update CLAUDE.md" + return 1 + fi # Use temp file to avoid Bash 3.2 heredoc parsing bug with single quotes local ccb_tmpfile="" @@ -795,22 +843,22 @@ AI_RULES if [[ -f "$claude_md" ]]; then if grep -q "$CCB_START_MARKER" "$claude_md" 2>/dev/null; then echo "Updating existing CCB config block..." - python3 -c " -import re -with open('$claude_md', 'r', encoding='utf-8') as f: - content = f.read() + "$PYTHON_BIN" -c " + import re + with open('$claude_md', 'r', encoding='utf-8') as f: + content = f.read() pattern = r'.*?' new_block = '''$ccb_content''' content = re.sub(pattern, new_block, content, flags=re.DOTALL) -with open('$claude_md', 'w', encoding='utf-8') as f: - f.write(content) -" + with open('$claude_md', 'w', encoding='utf-8') as f: + f.write(content) + " elif grep -qE "$LEGACY_RULE_MARKER|## Codex Collaboration Rules|## Gemini|## OpenCode" "$claude_md" 2>/dev/null; then echo "Removing legacy rules and adding new CCB config block..." - python3 -c " -import re -with open('$claude_md', 'r', encoding='utf-8') as f: - content = f.read() + "$PYTHON_BIN" -c " + import re + with open('$claude_md', 'r', encoding='utf-8') as f: + content = f.read() patterns = [ r'## Codex Collaboration Rules.*?(?=\n## (?!Gemini)|\Z)', r'## Codex 协作规则.*?(?=\n## |\Z)', @@ -822,9 +870,9 @@ patterns = [ for p in patterns: content = re.sub(p, '', content, flags=re.DOTALL) content = content.rstrip() + '\n' -with open('$claude_md', 'w', encoding='utf-8') as f: - f.write(content) -" + with open('$claude_md', 'w', encoding='utf-8') as f: + f.write(content) + " echo "$ccb_content" >> "$claude_md" else echo "$ccb_content" >> "$claude_md" @@ -884,20 +932,20 @@ SETTINGS local added=0 for perm in "${perms_to_add[@]}"; do if ! grep -q "$perm" "$settings_file" 2>/dev/null; then - if command -v python3 >/dev/null 2>&1; then - python3 -c " -import json, sys -with open('$settings_file', 'r') as f: - data = json.load(f) -if 'permissions' not in data: + if pick_python_bin; then + "$PYTHON_BIN" -c " + import json, sys + with open('$settings_file', 'r') as f: + data = json.load(f) + if 'permissions' not in data: data['permissions'] = {'allow': [], 'deny': []} if 'allow' not in data['permissions']: data['permissions']['allow'] = [] if '$perm' not in data['permissions']['allow']: data['permissions']['allow'].append('$perm') -with open('$settings_file', 'w') as f: - json.dump(data, f, indent=2) -" + with open('$settings_file', 'w') as f: + json.dump(data, f, indent=2) + " added=1 fi fi @@ -913,7 +961,6 @@ with open('$settings_file', 'w') as f: install_requirements() { check_wsl_compatibility confirm_backend_env_wsl - require_command python3 python3 require_python_version require_terminal_backend if ! has_wezterm; then @@ -956,28 +1003,28 @@ uninstall_claude_md_config() { if grep -q "$CCB_START_MARKER" "$claude_md" 2>/dev/null; then echo "Removing CCB config block from CLAUDE.md..." - if command -v python3 >/dev/null 2>&1; then - python3 -c " -import re -with open('$claude_md', 'r', encoding='utf-8') as f: - content = f.read() + if pick_any_python_bin; then + "$PYTHON_BIN" -c " + import re + with open('$claude_md', 'r', encoding='utf-8') as f: + content = f.read() pattern = r'\n?.*?\n?' content = re.sub(pattern, '\n', content, flags=re.DOTALL) content = content.strip() + '\n' -with open('$claude_md', 'w', encoding='utf-8') as f: - f.write(content) -" + with open('$claude_md', 'w', encoding='utf-8') as f: + f.write(content) + " echo "Removed CCB config from CLAUDE.md" else - echo "WARN: python3 required to clean CLAUDE.md, please manually remove CCB_CONFIG block" + echo "WARN: python required to clean CLAUDE.md, please manually remove CCB_CONFIG block" fi elif grep -qE "$LEGACY_RULE_MARKER|## Codex Collaboration Rules|## Gemini|## OpenCode" "$claude_md" 2>/dev/null; then echo "Removing legacy collaboration rules from CLAUDE.md..." - if command -v python3 >/dev/null 2>&1; then - python3 -c " -import re -with open('$claude_md', 'r', encoding='utf-8') as f: - content = f.read() + if pick_any_python_bin; then + "$PYTHON_BIN" -c " + import re + with open('$claude_md', 'r', encoding='utf-8') as f: + content = f.read() patterns = [ r'## Codex Collaboration Rules.*?(?=\n## (?!Gemini)|\Z)', r'## Codex 协作规则.*?(?=\n## |\Z)', @@ -989,12 +1036,12 @@ patterns = [ for p in patterns: content = re.sub(p, '', content, flags=re.DOTALL) content = content.rstrip() + '\n' -with open('$claude_md', 'w', encoding='utf-8') as f: - f.write(content) -" + with open('$claude_md', 'w', encoding='utf-8') as f: + f.write(content) + " echo "Removed collaboration rules from CLAUDE.md" else - echo "WARN: python3 required to clean CLAUDE.md, please manually remove collaboration rules" + echo "WARN: python required to clean CLAUDE.md, please manually remove collaboration rules" fi fi } @@ -1021,7 +1068,7 @@ uninstall_settings_permissions() { 'Bash(oping)' ) - if command -v python3 >/dev/null 2>&1; then + if pick_any_python_bin; then local has_perms=0 for perm in "${perms_to_remove[@]}"; do if grep -q "$perm" "$settings_file" 2>/dev/null; then @@ -1032,10 +1079,10 @@ uninstall_settings_permissions() { if [[ $has_perms -eq 1 ]]; then echo "Removing permission configuration from settings.json..." - python3 -c " -import json -perms_to_remove = [ - 'Bash(cask:*)', + "$PYTHON_BIN" -c " + import json + perms_to_remove = [ + 'Bash(cask:*)', 'Bash(cask-w:*)', 'Bash(cpend)', 'Bash(cping)', @@ -1055,13 +1102,13 @@ if 'permissions' in data and 'allow' in data['permissions']: p for p in data['permissions']['allow'] if p not in perms_to_remove ] -with open('$settings_file', 'w') as f: - json.dump(data, f, indent=2) -" + with open('$settings_file', 'w') as f: + json.dump(data, f, indent=2) + " echo "Removed permission configuration from settings.json" fi else - echo "WARN: python3 required to clean settings.json, please manually remove related permissions" + echo "WARN: python required to clean settings.json, please manually remove related permissions" fi } @@ -1109,7 +1156,7 @@ uninstall_all() { uninstall_settings_permissions echo "OK: Uninstall complete" - echo " NOTE: Dependencies (python3, tmux, wezterm, it2) were not removed" + echo " NOTE: Dependencies (python, tmux, wezterm, it2) were not removed" } main() { diff --git a/lib/askd_runtime.py b/lib/askd_runtime.py index 218161f..dbd79b7 100644 --- a/lib/askd_runtime.py +++ b/lib/askd_runtime.py @@ -5,6 +5,19 @@ def run_dir() -> Path: + override = (os.environ.get("CCB_RUN_DIR") or "").strip() + if override: + return Path(override).expanduser() + + if os.name == "nt": + base = (os.environ.get("LOCALAPPDATA") or os.environ.get("APPDATA") or "").strip() + if base: + return Path(base) / "ccb" + return Path.home() / "AppData" / "Local" / "ccb" + + xdg_cache = (os.environ.get("XDG_CACHE_HOME") or "").strip() + if xdg_cache: + return Path(xdg_cache) / "ccb" return Path.home() / ".cache" / "ccb" diff --git a/lib/askd_server.py b/lib/askd_server.py index 9ba81bc..08e11c8 100644 --- a/lib/askd_server.py +++ b/lib/askd_server.py @@ -201,8 +201,8 @@ def _write_state(self, host: str, port: int) -> None: self.state_file.parent.mkdir(parents=True, exist_ok=True) ok, _err = safe_write_session(self.state_file, json.dumps(payload, ensure_ascii=False, indent=2) + "\n") if ok: - try: - os.chmod(self.state_file, 0o600) - except Exception: - pass - + if os.name != "nt": + try: + os.chmod(self.state_file, 0o600) + except Exception: + pass diff --git a/lib/codex_comm.py b/lib/codex_comm.py index 236a5c3..9ebdcbb 100644 --- a/lib/codex_comm.py +++ b/lib/codex_comm.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python3 """ Codex communication module (log-driven version) Sends requests via FIFO and parses replies from ~/.codex/sessions logs. diff --git a/lib/codex_dual_bridge.py b/lib/codex_dual_bridge.py index 1da8876..d429ee6 100644 --- a/lib/codex_dual_bridge.py +++ b/lib/codex_dual_bridge.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python3 """ Codex dual-window bridge Sends commands to Codex, supports tmux and WezTerm. diff --git a/lib/gemini_comm.py b/lib/gemini_comm.py index f0d6879..3b62ba8 100755 --- a/lib/gemini_comm.py +++ b/lib/gemini_comm.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python3 """ Gemini communication module Supports tmux and WezTerm terminals, reads replies from ~/.gemini/tmp//chats/session-*.json diff --git a/lib/opencode_comm.py b/lib/opencode_comm.py index dfe9e8d..1eaf0e0 100644 --- a/lib/opencode_comm.py +++ b/lib/opencode_comm.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python3 """ OpenCode communication module diff --git a/lib/session_utils.py b/lib/session_utils.py index 2ad283e..10cd85e 100644 --- a/lib/session_utils.py +++ b/lib/session_utils.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python3 """ session_utils.py - Session file permission check utility """ @@ -45,23 +44,28 @@ def check_session_writable(session_file: Path) -> Tuple[bool, Optional[str], Opt if not session_file.is_file(): return False, "Not a regular file", f"rm -f {session_file}" - # 5. Check file ownership - try: - file_stat = session_file.stat() - file_uid = file_stat.st_uid - current_uid = os.getuid() - - if file_uid != current_uid: - import pwd - try: - owner_name = pwd.getpwuid(file_uid).pw_name - except KeyError: - owner_name = str(file_uid) - current_name = pwd.getpwuid(current_uid).pw_name - return False, f"File owned by {owner_name} (current user: {current_name})", \ - f"sudo chown {current_name}:{current_name} {session_file}" - except Exception: - pass + # 5. Check file ownership (POSIX only) + if os.name != "nt" and hasattr(os, "getuid"): + try: + file_stat = session_file.stat() + file_uid = getattr(file_stat, "st_uid", None) + current_uid = os.getuid() + + if isinstance(file_uid, int) and file_uid != current_uid: + import pwd + + try: + owner_name = pwd.getpwuid(file_uid).pw_name + except KeyError: + owner_name = str(file_uid) + current_name = pwd.getpwuid(current_uid).pw_name + return ( + False, + f"File owned by {owner_name} (current user: {current_name})", + f"sudo chown {current_name}:{current_name} {session_file}", + ) + except Exception: + pass # 6. Check if file is writable if not os.access(session_file, os.W_OK): diff --git a/lib/terminal.py b/lib/terminal.py index 5c88f9b..34b9263 100644 --- a/lib/terminal.py +++ b/lib/terminal.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python3 from __future__ import annotations import json import os @@ -85,16 +84,30 @@ def _extract_wsl_path_from_unc_like_path(raw: str) -> str | None: def _load_cached_wezterm_bin() -> str | None: """Load cached WezTerm path from installation""" - config = Path.home() / ".config/ccb/env" - if config.exists(): + candidates: list[Path] = [] + xdg = (os.environ.get("XDG_CONFIG_HOME") or "").strip() + if xdg: + candidates.append(Path(xdg) / "ccb" / "env") + if os.name == "nt": + localappdata = (os.environ.get("LOCALAPPDATA") or "").strip() + if localappdata: + candidates.append(Path(localappdata) / "ccb" / "env") + appdata = (os.environ.get("APPDATA") or "").strip() + if appdata: + candidates.append(Path(appdata) / "ccb" / "env") + candidates.append(Path.home() / ".config" / "ccb" / "env") + + for config in candidates: try: - for line in config.read_text().splitlines(): + if not config.exists(): + continue + for line in config.read_text(encoding="utf-8", errors="replace").splitlines(): if line.startswith("CODEX_WEZTERM_BIN="): path = line.split("=", 1)[1].strip() if path and Path(path).exists(): return path except Exception: - pass + continue return None From f5e0da2374149ad8407fc265a90f429d0573aedc Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 10 Jan 2026 18:54:55 +0800 Subject: [PATCH 150/153] fix(install): normalize embedded python indentation --- install.sh | 239 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 143 insertions(+), 96 deletions(-) diff --git a/install.sh b/install.sh index 72bab7c..e90b7ea 100755 --- a/install.sh +++ b/install.sh @@ -747,44 +747,63 @@ remove_codex_mcp() { local has_codex_mcp has_codex_mcp=$("$PYTHON_BIN" -c " - import json - try: - with open('$claude_config', 'r') as f: +import json + +try: + with open('$claude_config', 'r', encoding='utf-8') as f: data = json.load(f) + projects = data.get('projects', {}) if isinstance(data, dict) else {} found = False - for proj, cfg in data.get('projects', {}).items(): - servers = cfg.get('mcpServers', {}) - for name in list(servers.keys()): - if 'codex' in name.lower(): - found = True + if isinstance(projects, dict): + for _proj, cfg in projects.items(): + if not isinstance(cfg, dict): + continue + servers = cfg.get('mcpServers', {}) + if not isinstance(servers, dict): + continue + for name in list(servers.keys()): + if 'codex' in str(name).lower(): + found = True + break + if found: break - if found: - break print('yes' if found else 'no') - except: - print('no') - " 2>/dev/null) +except Exception: + print('no') +" 2>/dev/null) if [[ "$has_codex_mcp" == "yes" ]]; then echo "WARN: Detected codex-related MCP configuration, removing to avoid conflicts..." "$PYTHON_BIN" -c " - import json - with open('$claude_config', 'r') as f: - data = json.load(f) -removed = [] -for proj, cfg in data.get('projects', {}).items(): - servers = cfg.get('mcpServers', {}) - for name in list(servers.keys()): - if 'codex' in name.lower(): - del servers[name] - removed.append(f'{proj}: {name}') -with open('$claude_config', 'w') as f: - json.dump(data, f, indent=2) -if removed: - print('Removed the following MCP configurations:') - for r in removed: - print(f' - {r}') - " +import json +import sys + +try: + with open('$claude_config', 'r', encoding='utf-8') as f: + data = json.load(f) + removed = [] + projects = data.get('projects', {}) if isinstance(data, dict) else {} + if isinstance(projects, dict): + for proj, cfg in projects.items(): + if not isinstance(cfg, dict): + continue + servers = cfg.get('mcpServers') + if not isinstance(servers, dict): + continue + for name in list(servers.keys()): + if 'codex' in str(name).lower(): + del servers[name] + removed.append(f'{proj}: {name}') + with open('$claude_config', 'w', encoding='utf-8') as f: + json.dump(data, f, indent=2) + if removed: + print('Removed the following MCP configurations:') + for r in removed: + print(f' - {r}') +except Exception as e: + sys.stderr.write(f'WARN: failed cleaning MCP config: {e}\\n') + sys.exit(0) +" echo "OK: Codex MCP configuration cleaned" fi } @@ -844,35 +863,37 @@ AI_RULES if grep -q "$CCB_START_MARKER" "$claude_md" 2>/dev/null; then echo "Updating existing CCB config block..." "$PYTHON_BIN" -c " - import re - with open('$claude_md', 'r', encoding='utf-8') as f: - content = f.read() +import re + +with open('$claude_md', 'r', encoding='utf-8') as f: + content = f.read() pattern = r'.*?' new_block = '''$ccb_content''' content = re.sub(pattern, new_block, content, flags=re.DOTALL) - with open('$claude_md', 'w', encoding='utf-8') as f: - f.write(content) - " +with open('$claude_md', 'w', encoding='utf-8') as f: + f.write(content) +" elif grep -qE "$LEGACY_RULE_MARKER|## Codex Collaboration Rules|## Gemini|## OpenCode" "$claude_md" 2>/dev/null; then echo "Removing legacy rules and adding new CCB config block..." "$PYTHON_BIN" -c " - import re - with open('$claude_md', 'r', encoding='utf-8') as f: - content = f.read() +import re + +with open('$claude_md', 'r', encoding='utf-8') as f: + content = f.read() patterns = [ - r'## Codex Collaboration Rules.*?(?=\n## (?!Gemini)|\Z)', - r'## Codex 协作规则.*?(?=\n## |\Z)', - r'## Gemini Collaboration Rules.*?(?=\n## |\Z)', - r'## Gemini 协作规则.*?(?=\n## |\Z)', - r'## OpenCode Collaboration Rules.*?(?=\n## |\Z)', - r'## OpenCode 协作规则.*?(?=\n## |\Z)', + r'## Codex Collaboration Rules.*?(?=\\n## (?!Gemini)|\\Z)', + r'## Codex 协作规则.*?(?=\\n## |\\Z)', + r'## Gemini Collaboration Rules.*?(?=\\n## |\\Z)', + r'## Gemini 协作规则.*?(?=\\n## |\\Z)', + r'## OpenCode Collaboration Rules.*?(?=\\n## |\\Z)', + r'## OpenCode 协作规则.*?(?=\\n## |\\Z)', ] for p in patterns: content = re.sub(p, '', content, flags=re.DOTALL) -content = content.rstrip() + '\n' - with open('$claude_md', 'w', encoding='utf-8') as f: - f.write(content) - " +content = content.rstrip() + '\\n' +with open('$claude_md', 'w', encoding='utf-8') as f: + f.write(content) +" echo "$ccb_content" >> "$claude_md" else echo "$ccb_content" >> "$claude_md" @@ -934,18 +955,32 @@ SETTINGS if ! grep -q "$perm" "$settings_file" 2>/dev/null; then if pick_python_bin; then "$PYTHON_BIN" -c " - import json, sys - with open('$settings_file', 'r') as f: - data = json.load(f) - if 'permissions' not in data: - data['permissions'] = {'allow': [], 'deny': []} -if 'allow' not in data['permissions']: - data['permissions']['allow'] = [] -if '$perm' not in data['permissions']['allow']: - data['permissions']['allow'].append('$perm') - with open('$settings_file', 'w') as f: - json.dump(data, f, indent=2) - " +import json +import sys + +path = '$settings_file' +perm = '$perm' +try: + with open(path, 'r', encoding='utf-8') as f: + data = json.load(f) + if not isinstance(data, dict): + data = {} + perms = data.get('permissions') + if not isinstance(perms, dict): + perms = {'allow': [], 'deny': []} + data['permissions'] = perms + allow = perms.get('allow') + if not isinstance(allow, list): + allow = [] + perms['allow'] = allow + if perm not in allow: + allow.append(perm) + with open(path, 'w', encoding='utf-8') as f: + json.dump(data, f, indent=2) +except Exception as e: + sys.stderr.write(f'WARN: failed updating {path}: {e}\\n') + sys.exit(0) +" added=1 fi fi @@ -1005,15 +1040,16 @@ uninstall_claude_md_config() { echo "Removing CCB config block from CLAUDE.md..." if pick_any_python_bin; then "$PYTHON_BIN" -c " - import re - with open('$claude_md', 'r', encoding='utf-8') as f: - content = f.read() -pattern = r'\n?.*?\n?' -content = re.sub(pattern, '\n', content, flags=re.DOTALL) -content = content.strip() + '\n' - with open('$claude_md', 'w', encoding='utf-8') as f: - f.write(content) - " +import re + +with open('$claude_md', 'r', encoding='utf-8') as f: + content = f.read() +pattern = r'\\n?.*?\\n?' +content = re.sub(pattern, '\\n', content, flags=re.DOTALL) +content = content.strip() + '\\n' +with open('$claude_md', 'w', encoding='utf-8') as f: + f.write(content) +" echo "Removed CCB config from CLAUDE.md" else echo "WARN: python required to clean CLAUDE.md, please manually remove CCB_CONFIG block" @@ -1022,23 +1058,24 @@ content = content.strip() + '\n' echo "Removing legacy collaboration rules from CLAUDE.md..." if pick_any_python_bin; then "$PYTHON_BIN" -c " - import re - with open('$claude_md', 'r', encoding='utf-8') as f: - content = f.read() +import re + +with open('$claude_md', 'r', encoding='utf-8') as f: + content = f.read() patterns = [ - r'## Codex Collaboration Rules.*?(?=\n## (?!Gemini)|\Z)', - r'## Codex 协作规则.*?(?=\n## |\Z)', - r'## Gemini Collaboration Rules.*?(?=\n## |\Z)', - r'## Gemini 协作规则.*?(?=\n## |\Z)', - r'## OpenCode Collaboration Rules.*?(?=\n## |\Z)', - r'## OpenCode 协作规则.*?(?=\n## |\Z)', + r'## Codex Collaboration Rules.*?(?=\\n## (?!Gemini)|\\Z)', + r'## Codex 协作规则.*?(?=\\n## |\\Z)', + r'## Gemini Collaboration Rules.*?(?=\\n## |\\Z)', + r'## Gemini 协作规则.*?(?=\\n## |\\Z)', + r'## OpenCode Collaboration Rules.*?(?=\\n## |\\Z)', + r'## OpenCode 协作规则.*?(?=\\n## |\\Z)', ] for p in patterns: content = re.sub(p, '', content, flags=re.DOTALL) -content = content.rstrip() + '\n' - with open('$claude_md', 'w', encoding='utf-8') as f: - f.write(content) - " +content = content.rstrip() + '\\n' +with open('$claude_md', 'w', encoding='utf-8') as f: + f.write(content) +" echo "Removed collaboration rules from CLAUDE.md" else echo "WARN: python required to clean CLAUDE.md, please manually remove collaboration rules" @@ -1080,9 +1117,12 @@ uninstall_settings_permissions() { if [[ $has_perms -eq 1 ]]; then echo "Removing permission configuration from settings.json..." "$PYTHON_BIN" -c " - import json - perms_to_remove = [ - 'Bash(cask:*)', +import json +import sys + +path = '$settings_file' +perms_to_remove = [ + 'Bash(cask:*)', 'Bash(cask-w:*)', 'Bash(cpend)', 'Bash(cping)', @@ -1095,16 +1135,23 @@ uninstall_settings_permissions() { 'Bash(opend)', 'Bash(oping)', ] -with open('$settings_file', 'r') as f: - data = json.load(f) -if 'permissions' in data and 'allow' in data['permissions']: - data['permissions']['allow'] = [ - p for p in data['permissions']['allow'] - if p not in perms_to_remove - ] - with open('$settings_file', 'w') as f: - json.dump(data, f, indent=2) - " +try: + with open(path, 'r', encoding='utf-8') as f: + data = json.load(f) + if not isinstance(data, dict): + sys.exit(0) + perms = data.get('permissions') + if not isinstance(perms, dict): + sys.exit(0) + allow = perms.get('allow') + if not isinstance(allow, list): + sys.exit(0) + perms['allow'] = [p for p in allow if p not in perms_to_remove] + with open(path, 'w', encoding='utf-8') as f: + json.dump(data, f, indent=2) +except Exception: + sys.exit(0) +" echo "Removed permission configuration from settings.json" fi else From 3cf18054e071aa961fa93f72301ca75958bc77cb Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 10 Jan 2026 19:54:15 +0800 Subject: [PATCH 151/153] fix: harden worker thread stop and Windows locks --- lib/process_lock.py | 20 ++++++++++++++++++-- lib/worker_pool.py | 7 +++---- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/lib/process_lock.py b/lib/process_lock.py index dcd234e..e70cf25 100644 --- a/lib/process_lock.py +++ b/lib/process_lock.py @@ -68,15 +68,31 @@ def _try_acquire_once(self) -> bool: try: if os.name == "nt": import msvcrt + # Ensure the file has at least 1 byte so region locking is reliable on Windows. + try: + st = os.fstat(self._fd) + if getattr(st, "st_size", 0) < 1: + os.lseek(self._fd, 0, os.SEEK_SET) + os.write(self._fd, b"\0") + except Exception: + pass msvcrt.locking(self._fd, msvcrt.LK_NBLCK, 1) else: import fcntl fcntl.flock(self._fd, fcntl.LOCK_EX | fcntl.LOCK_NB) # Write PID for debugging and stale lock detection - os.ftruncate(self._fd, 0) + pid_bytes = f"{os.getpid()}\n".encode() os.lseek(self._fd, 0, os.SEEK_SET) - os.write(self._fd, f"{os.getpid()}\n".encode()) + os.write(self._fd, pid_bytes) + # Keep file length >= 1 on Windows to avoid invalidating the locked region. + if os.name == "nt": + try: + os.ftruncate(self._fd, max(1, len(pid_bytes))) + except Exception: + pass + else: + os.ftruncate(self._fd, len(pid_bytes)) self._acquired = True return True except (OSError, IOError): diff --git a/lib/worker_pool.py b/lib/worker_pool.py index c3b6ea5..43eb32e 100644 --- a/lib/worker_pool.py +++ b/lib/worker_pool.py @@ -22,16 +22,16 @@ def __init__(self, session_key: str): super().__init__(daemon=True) self.session_key = session_key self._q: "queue.Queue[TaskT]" = queue.Queue() - self._stop = threading.Event() + self._stop_event = threading.Event() def enqueue(self, task: TaskT) -> None: self._q.put(task) def stop(self) -> None: - self._stop.set() + self._stop_event.set() def run(self) -> None: - while not self._stop.is_set(): + while not self._stop_event.is_set(): try: task = self._q.get(timeout=0.2) except queue.Empty: @@ -69,4 +69,3 @@ def get_or_create(self, session_key: str, factory: Callable[[str], WorkerT]) -> if created: worker.start() return worker - From 2cf3f4af84a89a232d1d9f85937a515af3cbf8fa Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 10 Jan 2026 19:54:22 +0800 Subject: [PATCH 152/153] test: add pytest unit and integration suite --- test/conftest.py | 11 ++ test/test_ccb_protocol.py | 49 +++++++++ test/test_env_utils.py | 24 +++++ test/test_integration.py | 215 +++++++++++++++++++++++++++++++++++++ test/test_session_utils.py | 33 ++++++ test/test_worker_pool.py | 79 ++++++++++++++ 6 files changed, 411 insertions(+) create mode 100644 test/conftest.py create mode 100644 test/test_ccb_protocol.py create mode 100644 test/test_env_utils.py create mode 100644 test/test_integration.py create mode 100644 test/test_session_utils.py create mode 100644 test/test_worker_pool.py diff --git a/test/conftest.py b/test/conftest.py new file mode 100644 index 0000000..318f902 --- /dev/null +++ b/test/conftest.py @@ -0,0 +1,11 @@ +from __future__ import annotations + +import sys +from pathlib import Path + + +def pytest_configure() -> None: + repo_root = Path(__file__).resolve().parents[1] + lib_dir = repo_root / "lib" + sys.path.insert(0, str(lib_dir)) + diff --git a/test/test_ccb_protocol.py b/test/test_ccb_protocol.py new file mode 100644 index 0000000..c587de3 --- /dev/null +++ b/test/test_ccb_protocol.py @@ -0,0 +1,49 @@ +from __future__ import annotations + +import re + +from ccb_protocol import DONE_PREFIX, REQ_ID_PREFIX, is_done_text, make_req_id, strip_done_text, wrap_codex_prompt + + +def test_make_req_id_format_and_uniqueness() -> None: + ids = [make_req_id() for _ in range(2000)] + assert len(set(ids)) == len(ids) + for rid in ids: + assert isinstance(rid, str) + assert len(rid) == 32 + assert re.fullmatch(r"[0-9a-f]{32}", rid) is not None + + +def test_wrap_codex_prompt_structure() -> None: + req_id = make_req_id() + message = "hello\nworld" + prompt = wrap_codex_prompt(message, req_id) + + assert f"{REQ_ID_PREFIX} {req_id}" in prompt + assert "IMPORTANT:" in prompt + assert "- Reply normally." in prompt + assert f"{DONE_PREFIX} {req_id}" in prompt + assert prompt.endswith(f"{DONE_PREFIX} {req_id}\n") + + +def test_is_done_text_recognizes_last_nonempty_line() -> None: + req_id = make_req_id() + ok = f"hi\n{DONE_PREFIX} {req_id}\n" + assert is_done_text(ok, req_id) is True + + ok_with_trailing_blanks = f"hi\n{DONE_PREFIX} {req_id}\n\n\n" + assert is_done_text(ok_with_trailing_blanks, req_id) is True + + not_last = f"{DONE_PREFIX} {req_id}\nhi\n" + assert is_done_text(not_last, req_id) is False + + other_id = make_req_id() + wrong_id = f"hi\n{DONE_PREFIX} {other_id}\n" + assert is_done_text(wrong_id, req_id) is False + + +def test_strip_done_text_removes_done_line() -> None: + req_id = make_req_id() + text = f"line1\nline2\n{DONE_PREFIX} {req_id}\n\n" + assert strip_done_text(text, req_id) == "line1\nline2" + diff --git a/test/test_env_utils.py b/test/test_env_utils.py new file mode 100644 index 0000000..d0f92e2 --- /dev/null +++ b/test/test_env_utils.py @@ -0,0 +1,24 @@ +from __future__ import annotations + +import os + +from env_utils import env_bool + + +def test_env_bool_truthy_and_falsy(monkeypatch) -> None: + monkeypatch.delenv("X", raising=False) + assert env_bool("X", default=True) is True + assert env_bool("X", default=False) is False + + for v in ("1", "true", "yes", "on", " TRUE ", "Yes"): + monkeypatch.setenv("X", v) + assert env_bool("X", default=False) is True + + for v in ("0", "false", "no", "off", " 0 ", "False"): + monkeypatch.setenv("X", v) + assert env_bool("X", default=True) is False + + monkeypatch.setenv("X", "maybe") + assert env_bool("X", default=True) is True + assert env_bool("X", default=False) is False + diff --git a/test/test_integration.py b/test/test_integration.py new file mode 100644 index 0000000..2e77381 --- /dev/null +++ b/test/test_integration.py @@ -0,0 +1,215 @@ +from __future__ import annotations + +import json +import os +import sys +import time +import types +from pathlib import Path +from threading import Thread +from typing import Any, Callable, Generator + +import pytest + +import askd_rpc +from askd_client import try_daemon_request +from askd_server import AskDaemonServer +from providers import ProviderClientSpec, ProviderDaemonSpec + + +def _wait_for_file(path: Path, timeout_s: float = 3.0) -> None: + deadline = time.time() + max(0.1, float(timeout_s)) + while time.time() < deadline: + if path.exists() and path.stat().st_size > 0: + return + time.sleep(0.05) + raise AssertionError(f"Timed out waiting for file: {path}") + + +def _make_spec() -> ProviderDaemonSpec: + unique = f"itest-{os.getpid()}-{int(time.time() * 1000)}" + return ProviderDaemonSpec( + daemon_key=unique, + protocol_prefix="itest", + state_file_name=f"{unique}.json", + log_file_name=f"{unique}.log", + idle_timeout_env="CCB_ITEST_IDLE_TIMEOUT_S", + lock_name=unique, + ) + + +@pytest.fixture() +def daemon(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> Generator[tuple[ProviderDaemonSpec, Path, Thread], None, None]: + # Isolate HOME (ProviderLock uses Path.home()) and run dir (askd_runtime). + fake_home = tmp_path / "home" + fake_home.mkdir(parents=True, exist_ok=True) + monkeypatch.setenv("HOME", str(fake_home)) + monkeypatch.setenv("CCB_RUN_DIR", str(tmp_path / "run")) + monkeypatch.setenv("CCB_ITEST_IDLE_TIMEOUT_S", "0") # disable idle shutdown in tests + + spec = _make_spec() + state_file = tmp_path / "state" / "itest.json" + state_file.parent.mkdir(parents=True, exist_ok=True) + + def handler(msg: dict) -> dict: + return { + "type": f"{spec.protocol_prefix}.response", + "v": 1, + "id": msg.get("id"), + "exit_code": 0, + "reply": f"echo:{msg.get('message') or ''}", + } + + server = AskDaemonServer( + spec=spec, + host="127.0.0.1", + port=0, + token="test-token", + state_file=state_file, + request_handler=handler, + ) + + thread = Thread(target=server.serve_forever, name="itest-daemon", daemon=True) + thread.start() + + _wait_for_file(state_file, timeout_s=3.0) + yield spec, state_file, thread + + # Best-effort shutdown if still alive. + try: + askd_rpc.shutdown_daemon(spec.protocol_prefix, timeout_s=0.5, state_file=state_file) + except Exception: + pass + thread.join(timeout=3.0) + + +def test_daemon_server_writes_state_file(daemon: tuple[ProviderDaemonSpec, Path, Thread]) -> None: + spec, state_file, _thread = daemon + st = askd_rpc.read_state(state_file) + assert isinstance(st, dict) + for k in ("pid", "host", "port", "token"): + assert k in st + assert st["token"] + assert int(st["pid"]) > 0 + assert int(st["port"]) > 0 + # host may be "127.0.0.1" or "localhost" depending on socketserver + assert isinstance(st["host"], str) and st["host"] + # connect_host should exist (AskDaemonServer writes it) + assert isinstance(st.get("connect_host"), str) + assert st.get("connect_host") + + +def test_daemon_ping_pong(daemon: tuple[ProviderDaemonSpec, Path, Thread]) -> None: + spec, state_file, _thread = daemon + assert askd_rpc.ping_daemon(spec.protocol_prefix, timeout_s=0.5, state_file=state_file) is True + + +def test_daemon_shutdown(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: + # Use a dedicated daemon instance for this test so we can shut it down. + fake_home = tmp_path / "home" + fake_home.mkdir(parents=True, exist_ok=True) + monkeypatch.setenv("HOME", str(fake_home)) + monkeypatch.setenv("CCB_RUN_DIR", str(tmp_path / "run")) + monkeypatch.setenv("CCB_ITEST_IDLE_TIMEOUT_S", "0") + + spec = _make_spec() + state_file = tmp_path / "state" / "itest.json" + state_file.parent.mkdir(parents=True, exist_ok=True) + + def handler(_msg: dict) -> dict: + return {"type": f"{spec.protocol_prefix}.response", "v": 1, "id": "x", "exit_code": 0, "reply": "OK"} + + server = AskDaemonServer( + spec=spec, + host="127.0.0.1", + port=0, + token="test-token", + state_file=state_file, + request_handler=handler, + ) + thread = Thread(target=server.serve_forever, name="itest-daemon-shutdown", daemon=True) + thread.start() + _wait_for_file(state_file, timeout_s=3.0) + + assert askd_rpc.ping_daemon(spec.protocol_prefix, timeout_s=0.5, state_file=state_file) is True + assert askd_rpc.shutdown_daemon(spec.protocol_prefix, timeout_s=0.5, state_file=state_file) is True + thread.join(timeout=3.0) + assert askd_rpc.ping_daemon(spec.protocol_prefix, timeout_s=0.2, state_file=state_file) is False + + +def test_client_try_daemon_request(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: + fake_home = tmp_path / "home" + fake_home.mkdir(parents=True, exist_ok=True) + monkeypatch.setenv("HOME", str(fake_home)) + monkeypatch.setenv("CCB_RUN_DIR", str(tmp_path / "run")) + monkeypatch.setenv("CCB_ITEST_IDLE_TIMEOUT_S", "0") + + spec = _make_spec() + state_file = tmp_path / "state" / "itest.json" + state_file.parent.mkdir(parents=True, exist_ok=True) + + def handler(msg: dict) -> dict: + return { + "type": f"{spec.protocol_prefix}.response", + "v": 1, + "id": msg.get("id"), + "exit_code": 0, + "reply": f"echo:{msg.get('message') or ''}", + } + + server = AskDaemonServer( + spec=spec, + host="127.0.0.1", + port=0, + token="test-token", + state_file=state_file, + request_handler=handler, + ) + thread = Thread(target=server.serve_forever, name="itest-daemon-client", daemon=True) + thread.start() + _wait_for_file(state_file, timeout_s=3.0) + + # Create a fake daemon module that exposes read_state(state_file=...), + # so askd_client.try_daemon_request can import it. + module_name = "itest_daemon_module" + mod = types.ModuleType(module_name) + + def _read_state(*, state_file: Path | None = None) -> dict | None: + if state_file is None: + return None + return askd_rpc.read_state(state_file) + + mod.read_state = _read_state # type: ignore[attr-defined] + sys.modules[module_name] = mod + + client_spec = ProviderClientSpec( + protocol_prefix=spec.protocol_prefix, + enabled_env="CCB_ITEST_ENABLED", + autostart_env_primary="CCB_ITEST_AUTOSTART", + autostart_env_legacy="CCB_AUTO_ITEST", + state_file_env="CCB_ITEST_STATE_FILE", + session_filename=".itest-session", + daemon_bin_name="itestd", + daemon_module=module_name, + ) + + monkeypatch.setenv(client_spec.enabled_env, "1") + # try_daemon_request requires a session file to exist in the work dir (or a parent). + work_dir = tmp_path / "work" + work_dir.mkdir(parents=True, exist_ok=True) + (work_dir / client_spec.session_filename).write_text("{}", encoding="utf-8") + + reply, exit_code = try_daemon_request( + client_spec, + work_dir, + message="hello", + timeout=1.0, + quiet=True, + state_file=state_file, + ) or (None, None) + assert reply == "echo:hello" + assert exit_code == 0 + + assert askd_rpc.shutdown_daemon(spec.protocol_prefix, timeout_s=0.5, state_file=state_file) is True + thread.join(timeout=3.0) + diff --git a/test/test_session_utils.py b/test/test_session_utils.py new file mode 100644 index 0000000..9e42cee --- /dev/null +++ b/test/test_session_utils.py @@ -0,0 +1,33 @@ +from __future__ import annotations + +from pathlib import Path + +from session_utils import find_project_session_file, safe_write_session + + +def test_find_project_session_file_walks_upwards(tmp_path: Path) -> None: + root = tmp_path / "repo" + leaf = root / "a" / "b" / "c" + leaf.mkdir(parents=True) + + session = root / ".codex-session" + session.write_text("{}", encoding="utf-8") + + found = find_project_session_file(leaf, ".codex-session") + assert found == session + + +def test_safe_write_session_atomic_write(tmp_path: Path) -> None: + target = tmp_path / "state.json" + ok, err = safe_write_session(target, '{"hello":"world"}\n') + assert ok is True + assert err is None + assert target.read_text(encoding="utf-8") == '{"hello":"world"}\n' + assert not target.with_suffix(".tmp").exists() + + ok2, err2 = safe_write_session(target, '{"hello":"again"}\n') + assert ok2 is True + assert err2 is None + assert target.read_text(encoding="utf-8") == '{"hello":"again"}\n' + assert not target.with_suffix(".tmp").exists() + diff --git a/test/test_worker_pool.py b/test/test_worker_pool.py new file mode 100644 index 0000000..02ba7c4 --- /dev/null +++ b/test/test_worker_pool.py @@ -0,0 +1,79 @@ +from __future__ import annotations + +import threading +import time +from dataclasses import dataclass +from typing import Optional + +from worker_pool import BaseSessionWorker, PerSessionWorkerPool + + +class _NoopThread(threading.Thread): + def __init__(self, session_key: str, started: list[str]): + super().__init__(daemon=True) + self.session_key = session_key + self._started = started + + def start(self) -> None: # type: ignore[override] + self._started.append(self.session_key) + + +def test_per_session_worker_pool_reuses_same_key() -> None: + started: list[str] = [] + pool: PerSessionWorkerPool[_NoopThread] = PerSessionWorkerPool() + w1 = pool.get_or_create("k1", lambda k: _NoopThread(k, started)) + w2 = pool.get_or_create("k1", lambda k: _NoopThread(k, started)) + w3 = pool.get_or_create("k2", lambda k: _NoopThread(k, started)) + + assert w1 is w2 + assert w1 is not w3 + assert started.count("k1") == 1 + assert started.count("k2") == 1 + + +@dataclass +class _Task: + req_id: str + done_event: threading.Event + result: Optional[str] = None + + +class _EchoWorker(BaseSessionWorker[_Task, str]): + def _handle_task(self, task: _Task) -> str: + return f"ok:{task.req_id}" + + def _handle_exception(self, exc: Exception, task: _Task) -> str: + return f"err:{task.req_id}:{exc}" + + +class _FailWorker(_EchoWorker): + def _handle_task(self, task: _Task) -> str: + raise RuntimeError("boom") + + +def test_base_session_worker_processes_task_and_sets_event() -> None: + worker = _EchoWorker("s1") + worker.start() + try: + task = _Task(req_id="r1", done_event=threading.Event()) + worker.enqueue(task) + assert task.done_event.wait(timeout=2.0) is True + assert task.result == "ok:r1" + finally: + worker.stop() + worker.join(timeout=2.0) + + +def test_base_session_worker_exception_path() -> None: + worker = _FailWorker("s1") + worker.start() + try: + task = _Task(req_id="r2", done_event=threading.Event()) + worker.enqueue(task) + assert task.done_event.wait(timeout=2.0) is True + assert task.result is not None + assert task.result.startswith("err:r2:") + finally: + worker.stop() + worker.join(timeout=2.0) + From 3a2ee196aaeb47e7c5863458f92fc12955c10580 Mon Sep 17 00:00:00 2001 From: bfly Date: Sat, 10 Jan 2026 19:54:30 +0800 Subject: [PATCH 153/153] ci: add GitHub Actions test matrix --- .github/workflows/test.yml | 36 ++++++++++++++++++++++++++++++++++++ README.md | 3 ++- 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..5576e43 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,36 @@ +name: Tests + +on: + push: + pull_request: + +jobs: + test: + name: ${{ matrix.os }} / py${{ matrix.python-version }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + python-version: ["3.10", "3.11", "3.12"] + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Install pytest + run: | + python -m pip install --upgrade pip + python -m pip install pytest + + - name: Syntax check + run: python -m compileall -q lib bin ccb + + - name: Run tests + run: pytest test/ -v + diff --git a/README.md b/README.md index 5197728..f39ca03 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ [![Version](https://img.shields.io/badge/version-3.0.0-orange.svg)]() [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/) +[![CI](https://github.com/bfly123/claude_code_bridge/actions/workflows/test.yml/badge.svg)](https://github.com/bfly123/claude_code_bridge/actions/workflows/test.yml) [![Platform](https://img.shields.io/badge/platform-Linux%20%7C%20macOS%20%7C%20Windows-lightgrey.svg)]() **English** | [中文](README_zh.md) @@ -411,4 +412,4 @@ Once started, collaborate naturally. Claude will detect when to delegate tasks. ### v2.3.1 - Fix race condition in gask/cask: pre-check for existing messages before wait loop -

lA9@S3g4w;n?$iCG*4Q`cq2hJ4Wj2z@f8m-0Al+gGWAi*UVWN?En$)bxD;8txEln)F_DO4oT*w;+WT?dC11Dn3RqsF4!wruK}*> zf%j*HhF=|;JvnvpDxAfogAre(;kJrWZEC z(rRH=W2qMz5f#gk-@wb7N!xH74$iIU4nh>9wWDAyrR zyd=)>z4}{mX1%RrUV+5N9Bu&A;A)r$HsnTR{fJb55jdh3eu2Izp(iltD+m<@TPW7R^fO!y`yk9cM{V9y z4u41gU7|MWqP^Zm_I(BAhHv}qB-ggsOw0DYM_%4x^)Jh6Z&Tjz7px-J7^G?(6fIYAfjf5601?`!Ko%I$|iPgOEiN zu(M^Obz^t)E{nzgF01q3VR3(j+y%cZUeLB$p?(Q`Ir=KG#*|V_md#Lx{VV0dSBm;V znH*4{Lw1jDveXrwduYFLI=+p@@r*lVX>p{e)i3N>RpHQ_fVx)LsdegquSJxiyd7Uf z>!FIA){om=^^EzJETm1}i%Yf@wKhMGNxDKZeqPBL*m$fAP<6_Zahfy8ng)Pbv@t$D z{+#X&5KJZWDm_R1gY*d?sR7hQAwNz?Ly0Fo9T^(zv7oSuLg6iN&QDUqm$hw@XjH3P zra!TBTvYIWes@cNBvPI!Rusg<2|=D@X`0z?VB&z?4tD=-miFu=7gU)G+|^tMs)F^O za096f5YN6B6=*0ES`JysQY0y(m&7UW;`Rgw5dT0awINkW17e9#yBT#96lVE}eDzvG z@k=PP5O6&*B~x9}Ngb>Ad*|LsVT3*9iuZo(;W4@And!9}hEhCezB-KOs%Ujz=?a31 z60-_j4o%Cyl*hC$g2*&P8Do`*(~^iAN4Fvrn7R(VyKvdR*b_%7Mnf*n{A<={%N}C) zb9(nr_ko*0MTMmJfk1iRXQsvVPJ&LYNRJgCA{=^?P(dfc3r^i)iyLD1%t*E1lcJ6S z9eP-!ApdK_*HA-u&lcu)NJ>=EKdQ<6%gqyB`Lo(rHd>!237mLRr%j`7^$JXGpC}B# zNrTASe!hBrK^EL^=0C|Y&oH(uFHSDJ=PUWz#vBKPX^e#xUL_;{i!Ql-{d$$*aPi!L z6rZT*88oy6;b>JE)_!;M9OHd=T`U8YF!(^~kR+uU?4wU_k9>e-a9s7Sec6p5^cfJ; zjl!`{pB;!MK~EICgWCNDxhj+b)p&AR@~fw*)uA=@H%KQ7MXwa4gzavUml z`7dBVigZZ0Klo`0H}6a!p%b(2ElqTQ2@`{5*A`0hUtCh2{ovhmZ->*mvWL1&W)+#x zxH8>jZR)#va0W_sY=u<_K$!M9SpCGF?uu^4G158RaqMA+ngepOci?U(u5rlXr_>+?h{&8qbN`xr+CU3!xe$Nv8U?f_bL2&P9-V@?XEX zcF5pK|9z{zP@#!W?dt}wH)pT{=>SOyt*&Rzn z#;tnQvMJheUjl>g`BxC!J5IFxq-e}Q1v9D?fx0kEK|>5>fj20bYIJLo!0Sm_Nj92K z-y(mZYhc{05mged>Ba#f01<( z)D7&mbi$`hIV}y2w9sSk)8BbDmX9LdnA%uB%8?;P4&LXGFCb2V&xmE3XEJ>9ccF-` z{<~&|Go60w3Eh%9eHCSFbo`gcEMH7z_)WWJAy9-IPa73u0gs%s=>GRx$CctWI&QdPtRhH&}w4r?)v-pzF|_J|$tnC>oyd8$qzVBu^9j zVbbE42~{cT`)(fvzM$b$WK#B!wdmy1wH#SHSU>XC^TQDWkV@OdN?hAioQ?5GmL(Dq z^qqHV-6}Y4S4&0vpF>%F(!T$Cnvc=%`*uk_l3&SWQ?C7CJ!T8GTy{j%%uw$7DGm@w zN?&I!)~uxomSZfdn+07~c!+qGh0{y4iio~7S%a22r))pJ2eIfdpxv+0#%A;nAEO+)AU^ z5b#))DuKR-504U$FTs9!2i@BtQovej_y|f>79TNg7|AHIJmH~#QKTnl#SPUV*boey zn~K|x6EQ~aGnw5g8~%nOIgjQ&SD8?IE&nHu1Ij>_?%k7Yg6IaBN7oZ5w6;233KHB~ zmhk10P8`ttuy)h1l!^P{bQ5GTx>9-Zu%rPT=21gf`Em`ZGAe$SJIln?(ASbD%2`^w*~ z`+VjBm0uJ)eRR!Vkg;6jkb^>AXiv6FZLGf^L1_vVa8{GxK6{We1`S+J5b|DQI|@=K z4_fe=0J9=Vh5yxKLLC4_!-~EaOuU2=^rL5IXAccbQ4CY{Uf6esnmMSCeY*9z?Vy(i zMJs1*J&1}RcmW$t05bqL4E-S8M9tCON1Jpo#{q^vuwE`rg%7(q+#~z8nJ?>g26sF_ z#_g-R_zC?$>5H&5*eF_+zt0>g(CW2181j4PYs&1Njt-z*q z3F&dA31T1z^K|UT zvhRz-&$#u`J@|vCpTxglpitnu8!)ud3@vzfo41+f{Snh$3ZJ)*;I?Sqt6zX|tSG^u zVPQAt*L{PkeiIL|43q&2W}*aX-CECFk4Ks5%8UMqzkAuTePdA|Ol|H%xS@#{~<%Wj2KNlC!W&vytIUcO#p8_<-out%vcnSKpwYhi|f9IugNzJT&=^$aRF7UFYeY&3+OJg(zDFMF1! z(*)cTAFHw&$Xkm{gIiw0z!)e&&<%@alKCrd2I81d!cGmU7iT3zFSq4u?V-uBdhdyk zWWq0<;b!3GR9?LimX&(yz2k9#@`lySC1`vB;g2x;N$&qS5RUe(pcl|eZcB6LXiQg&}Ri8l`ujSvbMSD4hWE<{AcjZR6M{X~Ac30C6U=On3G@Tz&_>AP^RP z{VU<I3`&a**4EvN z-Xi~G@p-`??O=KDv#N3x1y3RNQ#Gja`3aTOZ}t^P=G-bO~ESJ9nKDNgvUXInHh!q3)3NFwJu>%zBO@$PHgd#JKve*X8>&gl{ZXt2LmCm?tqgoNp+;0*2f#?1dEK)?R;z^hOa9GL0h z#P(tt!C@U06-27f1@MdNHpbv%fM~^m4R_MC22bQ}QHhR)Q`I|Psc-O+l?~nP0I4?w z7)VL~J0B(J?%!|+v16hN;HxTZjc8_gaZe288bkFhLwI}$hbj4Tdo*K;AT`I!xNdsS zvjvs}c&7vS=GG3hygTaNQ6XwPBNY4=_VS4e%qmo6Nu0*AnZ_~66vHfpF@^U$(+rfI z9DQ&NKLm!{p^SjU1jU?Ang^}vr>W0rv2YG8E=F>lgmK0*1Ge1@CO|BO+y$~Jy3f8a z=Hs=f$?aLgko)sVO`Udv;YYwh0o}nl6l@7q0MnN|4~?0w$(moYkAmgs{Y}C*IN}~+ zbb>PWs=6v!6paJ6(F8PURP`YikC4~D;%{rg&n}ojAKKLH{;BTWh|CYeaW*Uq5SZ*- zq~9W)HZtDcy9#kW2<^ROF|DN$5;5!q9RL`oCDnXG|Jj$Tv&DmC__m_pnof~knLZ!~ zuR3lcN$bfnNBcy2*ADEJUSB(jnMO9tHmY~?x<)m&DCSshlo-AKh{yVOwecy?p&Rb8 zqFo6+?Y_Df2|_FGO$;^JvXtcy! zUVWoW9eN`{>ibiT$TBE`0w|fQrlxhu0VtpJhx93h{eVWBo&Ti!PJ^LO@fl|RESWbs z{+RGj3~<;BoUriVNj~@ z2)#~-g~8m1PK&|Z`0Bq22?#@b0`B{H36@j<%^8A}gGnx@j%^XF2++ZIP!GX*VYq7; zA(pM-xHoPTk8V98VHXV-nvjf9t4wFeq`LT#BnlPF%xNRlj8y}c@0qx6jAB{NnD9I> zp?x0%k%$CQjJ|h@Zged#i`C8L;g#S@Ed;;M)Udi0XjQfC*>bM)nfq`d*iwzDPp4ug zXRL6Nf@5MekQJzpca@+~xaR!*fP7b--@;F388xF|Z1y0q2~xdqzFlsL+=gTh02d&; z_x*I>Inv;L-PXC^dmxa2|Cn%ro z>Zgbxah(+3BIqTYkxd)^^vUV~PUs5=4>l~BVi9kslXH|56ztK8p{BciJ4xq-Lsd^A zQj;jfH$kX@`IhQ<8GL3_(G>iNDk~?fq_`k*a;PgU!g59gb%EB0^H;WpC7~?hK1-;- zU^x((<85~yYU+i%E9)e1oLgfR|7Z6^R}{45itm5um@&Gg%q$-?v(e;AunJT+-J-Cw ziqw!+Jn$7QP`crHGva=cW8MGTJYa?xuqMqhN8DGhAWva%&gjuALWKD+ah*LL)?i{AQ4YOh)_we=vHoiEL zfH#D5LTlLw=Lqpz{j|m?5fAORSe@D#eOGsXM>1QFEW38}=W~+gdY?D*+$L<>h7~h2 zQ+bsLG_D(&Zhqx$zmdhVt}hED@|GcUGr|`dIrbsJH24^R1Gd77;pwNbqA`A;MTJ6x zNt9G|$#Y?^Fy}2w3Ihh^51^n9nP@iQiF~!InyYTgnKy|7#M*w(?*h)U@dSnct(;(w z$8wVeU>`t6whjWG)1aeQB^aM&T9zntB&hJi4b*Ds5pUq54GJ9>YndiiP96nG9ZMWLxFb9aqt&59Y-XN5g(3AZY>RD!xKt>k06 zo(gIzOh|$>`hj6sIMuS%m>`91H@{eawHt`=8vSeG7@<+DvhnfuU!(AP6XKRff{Ow48~F{?Q8;0T~hRdse4ciuj)n}+RZ$^i^fhxZKcc?Ix( zf#Lv%3=qcp2z^GWnE^2AfHP*$FZ7#cR*>vLn$CCB$_@wL&!h8l2o8cjvlTWP_9B{#tMkIKlvtDl<|vuCl9+c`~lt2-(g!Ru-n}F>eF@wgVB1Q z^p)Fl%{aRYz!IOr#0qH#KL_=V#gcysUSDQe4up_$@D>zWt#xI!N^MzR#qcww;I0+u zs8~@-2o=#MxXU)7MfZ^rhLr7bwEn2omX(-VdNiliPr;d2*#zRdk|}tmIH-uF7(#V< zlH{{uyiRhHcI3&hLT?E?c6|=;=$IV@wN%WAL&!}$TB6c!GZn6)QY$VgOM-D>&!Z9B zFCdB&xO~V$N+LZN9ChdBe>YjcASLC?u3y|ewG*+d4Bf(Q%4z z1j*&;SRxuY14wu==AlqmOJS6e-IQA+ zfk%tb8{R`WTI-J7Jv@$4`QTt3MN6zEcH3$Uy8UmOVLVfE&Jh$6>EomX0(D#uA@?`qcVZ=h#3Phl$St)14iQgfmlqk zCm869K$DM<=BZ%Vl~UO0V)D0T^D>-9(11TR#c6QzE)WN$z11E$b!s>{OD^EPNga^C zDYfTNs*P`O%9?bKy8$w46s-y1E{r9zWued_i zP&Y52&u-k@uNoEz)T8(#9F3~sN#Ldoc!8~fZ~ujx9Ix_fO!eacD~$aiB7Qn<$y6H~O*W^{O zEyBtLG8Z5Kp^pm!4PEYO>*XY*f-(u%9{I=*2BS8**U_;OVEZQY71w!uolk~81%e@= z3FpO<#O*+m2+Fr0my#ak)Bmhnl=owQ|1M<&+-`xK6yjfk@j^)1t;5#jd8u;GTvZq_ zRjrA(RXeNMW2e4-8?|gyTRp0@s=U%|P`*)Dc*PeCI|woN@rU5LEWH z73mD_pLV0?ayw7xkwf10Mrj?>c+DvJdX`Q7wO0GBxS& z+rBkdd0B1935Rc%l5^tcq80}Fwe@m%VPC(NHc?h70v-$`Qmil-g2qI|ma8k(wPguH z(9le<6=k! zW}29sv~07S$aEh>fR3mLuoYZW%^2bow4cb?KqBc&SE0PpiU|T@XK->rP_v1CE4t64 z%C4F@NFX%Sj4~^Uyt${Nf?y$3>OtfUZd8BUPtyC2dX!+>=Xg`tw?=gE^?=KZYbV~4 zMAxyf*cqRNg~&NW2WE)jG!adiN7C;JWR6DcW^;4363`fP`rPTa=vEYg zZD`UTxE6rUWaw~cZ>k_>HH=CVbpVZk1eWFHsS*Pe8PWATE1`=^>z!}_AV{>g9+B{T zc`_M}$p`VNeAXb%pRuh^l^0|*- zW26P{4XPYpPOMp`O(CU0XWT#Q-DV~#@*3V^yRx(qwsT3s98cB$lct~up61XZLd;)X zK{rrX98U$+Yo(xu=?j!r7XJ2ZeD96Jt>&TG+Zbtaps{w)*lJ$+1*UqGtp1DQa~m<| z&uYkk+UXRvO%SDSffU*Z%XzmzL<9t;9%J_%Nn2G0hv3%*YcF(~7c05WXWI+cd!RIfJA`uPBvc`Q*+IWAfVAxlGeDIlbWIU@H>(g9>0(bCavG!6A6bMkK8Cr-VMDjTryX1`)e zpPXElgdJr3Zs#qRj=!F7ZIwQauGj#K$a-J)VuUSV*jei7FR)U;A12^9&8?wPA3}-4 zm}&8qI=Je6OBhHKZlSKcW_e1F67B3e@6jk}DCu{rF9(}-$Wk+0B`g}^or@ye*j}?P z1SdZrrX9nHc=S=znrpQ?RYZ<`HNiMg7Y8@k=+To!f1&cZPgiLc4i(;q0I1BWZ2NRI z%F@?m8Sr=(&sGFmeyK01Q(Vz_>pd~_75^Sa$G3gY7L>n{uetz*EdsgSZPgAvS|>j1 zgI;0Dvxi#Kw8mHuto}LD$?s0APi-Hz@y}IWqLQ|h1rMGe=>3In663hq=xscVyInr& zOH5?hB^H*cIWiphQ8?~K+=m#iR#CKdy!FJD`D7YhJB%Smj*LhA=uIX7xM^Dzk5D8J z<-b(A8Y(-uHP3oWSt?>bkn1p??+SMg?W$~McN^=FBG?i-Iu*kFe=5vXR;5^; zg37Wq=69n|OV4zIW%f2%vwX2qS;Fgacg{Av!N_L=6?W>IHMOsh(b$30EF|CZq>M!) zz&-2nlQY5}(R!#y_~E@{S~!adx{Y-&AY$MGT?9?=Pg{I@;DK`0$C1r!ZEWq3UgYL2V1!swv6MOfVb(+I6L zl}&)1Lh%|}i+Aq#=G#t>U6t46?|$4rg*K}42R@?;UK%M86weEW6Wo)eu2B+u<9TpS z*!PYakuJG3kh{qiS+}+D(EW}~ZvAZCpJ-FGLSYd)?c1}PlinT6O_yegSyT0}3&kYs zS3bKHY*|Oj(PfDUj0Q>6jqv{YoX{}Yx$fPhJrhKbLcr)2(0(uz+*WM-&DPgxb;7Y- z)oo$r2>b#R>SitPZjZU#$lM=10qStq7)bQgtcvLkhs56 zth_&p-Nn;7elt#lC!z|4$6`@wx8(Gqg-Yw%A(Ss#^0#66tw(g;`9gG+CkkxwZlbig zR{17REb$n1?MjZZ+0cg4>bj^8KVAh7Wtx>jE*BWOjP6pLw^ladwHmelNryB)h`=`C z33)O~G{*hlZXE92=0Hcvxf`M~Kaf(cr1K>f#2^*cN*`NPqwQI7t<+n^`b9{3Yvp3B z0pLjt6)ohO%C`oFDGIi&L%9l}H6PT2HHCr}Rk#_(7r`y5g@oUnMKHn0CNTcGCYD3; zpa}~?49P{s*RU`m)D4=@#L`=;yC*PvUnzLmmwlZ{UABh@vA8DCxGOk{z#k>%EM*wE z^D?{Pt4|3O%1?QL>(HYJW!UCe%BErP$I2Gw#oZ`H1R55?#T=_7O8eHie(rIab3J6z zk!Hh~4~*L!3wIM3NWn-j{1=ss3im~)#g`oq$S#Lr2znz`@+vdGpZJvN2N*?LtUPZ& zqEqmPAr43!5Qp0D1T&{g0vlSrHobcSBLq<8-V*Qa1jU|is(ImKV`I~?Ez{Pz7#x=H z%tV_9nnN`#XzJyj!88ZL+D2?(fW+9OurTx^x>pPf&DqBka;hOpSu478V~@T>G2(;Lb6Fmh#^KH0u3i~kuBboXUVaQsF?fa}~oDG$g z@MO}^Wl7CI+D&n=a09b?#9*yt!A4eQbs>i)5l@(P1_1m zZ?MBiT{#UUk;*0}9aXTa|NChACSNY2KApf&DAqE7MyaO!^6uo-v)@hGSXAKaVh7clk#VqJCZDVqOtr@YHw zV6r#drPJp9xTQW{JA zzj)UMiXFC=5H1|FQ{9no1i}?uRzn-B8yQ*`{YTjnk$CAKpN-8o>>_qNJOY{(MR~@H zP)ETs0g;@b7Aw&=5cOl}c%_%6S@VR&ffj z-Nq$y7ewZKkUHLN>1Aru*~!YrcL*v0t>*qK0G6I^&_=&3RSUarwgBKBHV>QR)F1yz zH@6Oe-%P6DY+}l~Ibl|%Rk09C9&5F`L4KQJvO2PGgq5uzq4`JkQ00S}2}xq#)0S_EA)$$i z3&H%)jGKyq!VX@mXj}~!YS6^el7MaNA#^cT&w>Y&EG$rzJ^^9;B!wU`e&W%ao8hln zAD-ywli*{aa`5VYen{(+PyTY9IT5*tVnx~aKj$`_%M(e0>%c>-;~?tEw*8{wy%o&Y z`!Bw!&Rdrp6SE2GB5MB1D|JIKEzFWR>d}ND-+a(W@Jbv}nP75`rX^F58_OnXpl@!4 zUb1j9V_s1QH84u%&ku+jvA!=t1`@b4nZBhdv54L|xN(k`G*k!84em`Q+?3FsD0uD- z9TxN~L;fc3r+wffaBLe9Uf{SfRaDn9>~j~n>)s@BFS|x0BV>ETz6=zKxVPlTF-6N; zo4RmcOsI<-7&I(-8lNJ>AYvdT1(s@*O}6!n=f)SY9t2!kk&)Bz;zV!$p253i_)~8C zz0>S0!|X#vVPTO_|6kyJ`TSn;|5!Q?aH{+MkC$YH>`k^~WRpb6iet|>BxHqTha`KG zJ+j9!;$*Loy@~9R?4(mND^dMF=YIb8bv^fWJ=fhh&iS41_cPw_*PEF`a~KO2U8BFD z6F3dtj|;JuuN0p?-S5p!7ruwwfdpekLPNg|APw*zsGENQ)8oNOo4C^vU%fm-c+hPH zH}deR**7zez_jQQrJ#S{0|LjQ_xXWA+R9){PFFs-3S*gX!D>OD1V(B*ch;8+L{v}@ z%TLpDAE2i}nt+=Da0=*hq7jH7kdtY5Rp(4%4rmSHN>+u%VE4=SR$`xy@NdNh%C|5=}QOkQ6f{e zKx9DM;Ere@L`c1NP>AB?aRuOE<7>EMrKJHS03X19m6sLR^ip*7t3gx=oCawnD!kvq zCS)+T5|oqW1{!8N`5rA8TQ7q7%mMS%EXV1AMz3+}!D2>Zr=gMEyfgfEXHw5qt2P1j z=WF@Z7O(2V9EpXm`A8l>=W_Mm1{vI=?6N(+;kGimIEcpC? z_{c%o7q{}wyY6=F6Zdni^lbFo1-!J>;6|Os9z)VZlydR&CKDlR9dODu`V&7i`_?GD zaal?x%eHkHFit>Spj&d4(fsZu!vazsKsSDD^PT7EvZSzb)?~!7MwAFITqx8p2etIN z)e*~7Xu_CX%{{QNfxeZi&RjTIZ1pZ2bMP*i2(7<%73dK?IFVZd2Orc~fPT`#R$pU< zu`@yF!?1IA`Bh%vzvGi|bk{zxieN1n-F@^)v&zN$&j5aS-baFq()=&SKEbW4b1PGG z@&`zPpk}!l2zfH4Q{8GkBq0d#XWMF*aJPM_B8xMcX4+A_Atj8JJkCn?7*fK+mKMS| zB5d$}$Z7;31~gVEjr@z*6$>aVuHCIj3FbC@Qct za?qTyI}zs#38Mrf8Xh_!uQdK0R6qV*$2I(aY2QdiL%)2A!q}m= z9~4p1X*aU`;3zo6t{n>|&%J1m_F)@+G8+@x>!CFMc=>kN&k&18Wj`&;ERS_~ll{3; z`6i)r<^51L>WCkmp-%34PSsmD{lT{7jb4@~E#~0mhD~r)hUnr~dF-2j*S(817|oaO zK-W$nyzl}n;nZ^g&71sDs_AiCHL#*^iiwbyffS@%04d~;?`{S~8|Wq;2Q2`J`S>5xx`BV+pyUN55(dSr~;K|X;7m`a&UL6FP8iW^I_HvuI z(hRX!{+>l1rXSr>BgRrSbp_^7HZ~BOn(V*vjGrz>apb}?Q-Rc^ouJHjf*U_iA1VRX zykUI1sO%ZYd}M-H`h86#i-~V$jYU(}T6W=ms1|NvvLk1IRyrDR&L=v5eT~faeAk7b zZ>1_ z+h(_B8)eBd5ueYMZKKw@93C0f*Ab%}N^;Vli_q<(wmzRRK;0X4kAg6XT>?gZH zb)fr~g^r)mB9SQJtHh^fn*F+`TFn=oW+ECa^+?iHToq!^X>$rwn*tUOui_2GtJNQ( ze*PB?6hBk)yLZ;C;jv4kYOJdw$m#r)-x>~{Zmmak2x#2vefc75yVh3@PF@9O4b@Yq zLgqopmYS*1dA9xwC#wTsw*5^AVfedBc*~^49WCA-NzAvY^j};S)Dlpp1)iVsi#^V% z&9yl!nsMCE2b2NMq6DJ4+nHiO`J8m#924+3*0p0xg)lRaT`Ux|(X?4lFR$^rwjI?a z`95IqT`^Tj)nDW+=zMxRCn=SB^rdu4rU=&yuCa$vmC3)l|4`gXZ$Z9|zqO|JI-!NH z;L2{KDi?{D%=IX8C*HKXORtDK1xJ^)3L@CO?q_#Q?LaZ6z}|V+V1B4S^bOI1TEX&0 zN#*1Hmrg|XAZ@epB_d)+>XW zPwyWvJr+j0*Q!0m_s~?t+ND$T`NcaPE#}-*5Q$>xL?b5krMN)FK55mBAB`BZ&lg2j zx>LYvT^yRmG8|f-v>Gs83W%(suravX$k^z1DX~7Oie0UJ6FX5T@bp0hRqF7 zW;k*OI9YXYy96)1v1IiCT@%_s>Akd3L>u}M2;fM>y?iXrvM?fR8|>NGA9N3WG40Z{Q>>r%!3QSn z4K>mnYWZCP^h(y$KVR(UO%zoLaWD*_sQo#xt;P|VRTCxCtm7#d8>~n5BWFj=pZbQ( zW{hRETN1zDCMc@aJZxR&T}@QuhLl$E%=*`-R6oDbn%FG6T)S94Z0>Iwxno!Kn=X1E z)W}P>Fyo=oCmg4+hf#;9V@(1T4o)K!g1g@2?2isK%q>84n*2hxd{bQk(`OJG=N$h=ZWku8IekOTWTKE zHH~5p2PnNFqdwS~QL_$`qVyRWqtv69NE*u7(mJn)$82(fLGNZ>UU-@VI3^={NOQy= zWWwzm0rT#?z3R`^uVLA^0cipUkYW zn`PCz6+A|8L{kSEP^wYsxjHS;ay>k*m8PPSlokzsblF6z zMW_1ni(2i@LA~_od^lJ@T<2{I!8aw{*ke^rN`gDQmgD4b(mpJ%_;%$Vy<)T?5Lfr*58}p3p;rz|1enQqd9VVCg?;=}^m5;h=Vb4S{I!^ovDPSO{{r1r9dNW(?*2UGLA=8Y^JH2e zkWDO`=IebYI8+<5{DM~FQ209Z1^`vD8_g(4DWu4&q+gy9)lwRi4%-cywq84@Ml!vK z3Zxu=$))%FAv=@@FhqJuQLU(WPnjoDjB=l{C5re2zn{^%5X|!y!zhUhUtyD&Ccvfb z&`KyRO@rGR)CK>Q@Ckr(Pdu}DZ+iQX^1C4tG-aq+AaV;GBl#1j^-9#IsjFQzqC~Mz z@87>-BV%$GzYgw(n~TSUwj73quu^qy20b~(*h(gm>w3w8^YB~vsiK&yuYj0B`m$o| zQPci)Xq`9{&4u~g?ck96lgn(FhH(jDZ%NVQxA2op+3?pPS+=NNg357APObr3EP>Qe(Ue{J;X*$%{|;g2x-sd< zRzQIW0+9+j`W1+7@NjF2W=TDwU+gOc9lMYn@Fhe8rSCM8pMd_ z6%@+CNuHWnggy3{56!R1&1S}9FD6tGlTRLEr--Kzj}P)haIjOy^hNh^&Pt2Wd+{6J z!!y4WJPdAVT|~7b2#}nR{1$P-bNn*Xy1f`m($fq(v8b2{70Vz+L^`A}ZTQ?tr;e}AKXKUkAnXu>Tbl0>_udKCF74Un zik7XdUaGD+pAj1wOvaoX_E{1H`?nxneOSm@rI$pT)HbT?7I2kT_qEEn)&+@5=wehVq*p?jQ%Xy&WtJSED2edj0_?-Wf4>jzjsqnDv0l%FJhN@$ z1bd{6>3S~|)vm6to}PxgG}j)6cx1l-W)P=@@g!_C zlpCrzIO5%*xbiv9sc8wvJOvSa`jE{p!RWyUHS_R80tpIE+Djq!oQe7JKXF#pU+XbZ zUIor@pb^C}hX>ubolm*35e?r}a4?8xlFqS2DMN1#rk0<$@9k`*DZu;i@$B!p+^^F6 zhh)VgU5}x=3JE#@ptvlHHw5D$ko)~v`S<6(OCz+-SD*s|ZPKSh-`XqesmQpvxOS+_ zVReh;&rN%rEn%-+^qzr%AwLUkD4^E@e6+XlpTBqf`@1Rp!3A2tfV2GpfHuAYL1^*R z!xTm^0zxR)01li<59}Dwq}ACKB!0-3liG3qJN7uB&f$IGnCL*pAx+jpOh^~IRz&Y9 zCRUiLj=M%-)zq|mPsTFi35-9XI{ddd_m-EJRmId_qsl@IuV%s7`|sJw^p#iYXv*eG z(N-z?IHzu*N(_$xODmsr0LsL;0ZI*jNMJhL9>2oM%JUaS z@c#*pT0a-YXkXt-0nD6mx>X`r+~KiW=>Vl4Fd^Y@TjM6mn}iSX5Y{xd4h}>M*;+@j z6L;5G<$$IHNp}r^4?2)TIsGUx6aYdB>^aVNtmw>9C>?<;BS)ND)gmj{0d$1_Zo zs;*;oKQPS^X6V`Zav@DX&%!Ag@?5)#FVP9*BhpbHKyYB%?v}Ye4h{=ks0&Vu(00Sj zEhjfliv))SGqq}{NzoT7k<5EE06C{w|~Ly44N+ zosp)F9o@&mH_)Jj4k*z@J@ed-vM#L`Ui&SBI95p{PPz(~+=&$@}b z3x|%wU2`;HBPqLA1yYCS0Jn#Grz5d|IaK#NgN-_#W$p;~cEo{<=!b^`rAGAWxjpr> z;9f<#R*p^5zYAQ9HDrm>7m2xgXIMkbs{4}7?dpL1CD4 zD}AH$ANb~$%yzOR6Vliw-D)ap|0(lczcL(6IpaNzF$kT0$AS(~ z<>Y8ZXC^gr?VY(bn(AXCH0ck^Xs#XHoxDEwyw&H`K|BIIp{`q!_3G*}D`#eGw@%$c zD1{=TVAhCSyJZ6S{2(70a(^IXk;m%i}XkOOwJtHYGDYKE9g@ z%-DA0xnuTUkRe^GK%l%KDXCm@!%za6$i-Tq(cMYn1pGzb>4)vgSZZaA-!8X;77ztt zPxc%a#A)sd3QtXgGDX~N0-c;ra4U{3dEuIzoaQ(D9^iKoIrpUDTyfpg3q1w%0&B;9 zkaL>}p+vaV9X>4J4ej-M`w|T_h#+NZZBp-(Az(Og+rE!~e>54;8kZaTNbR*hmDh%s zP0hyW4aQ7=a35w`e)k!;;qw-Jw?-~-ApsBI5v2TYQSq!7BJTXYl%E;Zn6yD2YUQ2beaY_vP-0H^ z(cdQx;&&_AQ4lJ^x!iCXD`LKEpxHx&H+zmZEZ@PLdh>czGK~Fj4sKv$B-D2<+n|?^ zeB=N#2sZDfv!5S5gp0<`HCqEet{Q$z=#qKzRMaAtpT&f6=s#}vmOJi3TKf1y8a)jL z#7qL34Xyai0F5>AMO2q_rs$)9lac#LM)_5vzg^YoE$19DAgkc-<&W4~Z9riFC1%JA zQRJ{v&6ulhNIGf;Un!=k?zOFHz`V0GW#dy&*W&1WRf2DO{;&b(6Ry_P%K-ee63jeC zy|@K52uNJ6F_}jF`*ODfg{@D|hbZcQ|4yI(dvRUI!=s8XEbi)MXqiC58h8vjyVDgw|CXXA_}9Pl)J+r)b2D@{6_&uK>uN2gKtPtMdg3M58_vqOH~{8 zWRs?u#d}g8nxfA@hp^{IL)r`(aXZ@!40VFqTc|j}WyK}HGtaX~lb?^YawP5rkraIP zq#HoAxxP~jV#fP04ao1z6MH~VbuLG)oz|^RjF{-WAaV#<4ld>)8>lOXm?xS?7dd6e zzzyTU$kSW??N&if;N+NgDK#m9iVWWOIdDaDQtHX}0MkQ2ZIKHzzjY>LI@xrgyguMT za-jGSFilh;!jXmqOxr+if==}4e#6{(+aLOu$;mmj#t4*U9%|`k;MYAWH(aM}T;XD7 zCVAQqz{T?kbYj2!btkPfKv@9$qF2wz!)>X;uW(QUav25>0Sad%qwI_63!T3_vVVR2 zC?fO~)IZNRh?2tP z4O?{Y{q&QapYO&Yd*H$swYNf)s&@Z2d(#zJYqsQQb-sHZeTkZlyG+7#0PW;~+M)oX zeTz9=nBB`grnqn!HK0MoHOxZaqBO39g)L4UiWDF_5cd^DfN79i5{s2Cp;#26vv-H} z7yJVT?k4*juUQ(a z@5s(nCtYM${0erhMogXEzdWUIRwZ+K2v8xMoK9bFV|Iw6tUV~cXmdAR0Bj~3Z+wk@&~rxZ^A-zXMzkFDwn%RIBT7ynThZzcEdPB zHqZ}(@)*JsHF--D9tXVYbcrC4a33l3rHR7DbVtio`)d}Ggt4aRa=N7I4}bIS@tt&# zbT|dUMVZS_Ke>+r3O=VGQ)*cazBIXW1jL0ImnHz_%tUgqJCa#UX1+=}IPs^+kD+0o zf(aM6L-NKWBtQoVlQS6>Ro9}qYmXiXa5Pp~F&GjjdD@bQ8L@MB`o#5FV~jO=qiTvv zzgXu}qe%=aeQgFEe$1e_jM?KrE(+v2kTu0Us4=0JrxRP?|FzaS@hW}zN=2T+(gj9C z^NWb^*6jO|)Prp7%2Pa{+*kqr`?jT&&dxGl86Ut+bdKvLE@@4jzb-MAN#Z2~?Ki?b zR&XghJJ3CO$8|+UqE(~n`(sWb;K1Gl=GA%iIGIoE%w}?IdA;%4_vljA3hxQ1dw`s3 z>6%}KH@Q_^!PE{|Ab3m1w_AZQ0SWBTx&OoAJOJ_Ix0!ecMkB~X0!9gxg9FOadi(GM zdXGGuOA>xb1nAxzpyCc z2`u&lg^yd+dEP`v^F~Z>c-&4b^sfS`P*}m41^Jl{^@ajgY-@a$JU4Q*rD=OaVP`9z zIgJ7%TqVNTG4Vv%;ClLqmeS>*N8v8`vOiKX9k(Tv3R0lxIPnjlx?j-nZu@XLZNdxU z$ANMV?2hfjW~*3}x`ld`De24L#G^DYR}T2~8(W3TfAyAO0geaG4*;>D0CcMMDt?h& z!h|^nqJA1IAVBCMfL`6fo=g#S2M_u%SoO#Ej=>FOS*SPF_nEY+q?Cu#|v+~ z(kY1SgV*0~arr;MBaF+i$-F#1B8++`1+i)nW9bU#89$f)=NXNsQ|vOTZI| z-+Z(sC$ncfb}%MO?CgA!;Z66S3LRFxTb7l+rsZJ=!Ot!h`Ti#$oQPA9FI)KzixDJ0 zd2*6d=@if!fkFB7*>k6kEeFXjKTn6AQnaq$W!Q&kq-QXWNS5gU3-S0a7R$`c>?EBf zd9uc4X@)?9^76q`qAW57I{artv=G%%Y0=IUfy;h@JhCj;wg%O1N9-QoujCft$srPQ<4HXKpAb70vO|wjs0o{ zPI@IvYmx7P?**XUk zNWi+!uq&xlB^Vcu8Sg0O{T#y{a;@u+t{pi(eHgYN?V)4q4QJ;+pBvaiz(T_SH%wv{ z2zW>c6UCnqIJ&3k0~-ztLp)WItXnign(vWHW`+XQ*Aints}>qpFoy5Ln&*h7!?tLThIVKo-|R6%SN z!V;j62h+;e&kNAnmUmHyT&9|Va1>zmg5<)u!V5Sj75rPsTG}Z;^5K<}Q9+Q{zJkf1 zStjbd@q5pkpg#f_9qGF%c+|?<*+`;)jfVXJ64+zVTUMAhVWw_S5CJ)&8ik4Ol}WiX zd-1j@{ZpVjvlb-i3)ANI4xF zkdvUKWi!&S&x;J0@@r zD@DphK?LXWLY;k&ru(wjT;kOQ2s42v2huK}n|3`I;(Oo#ZXNydP48Anya1ou9QF>( zXMuJ!hfVak6huWSPK@i@7k4~~%mnHl>vz<|D+cuC5rw?kThT~5e?CF6z;y?mj%!zO zn6>A?_rHjD-jLGo8CJT4APL{n7v$*hWyFmIwXQ86feYwqyTzLsV5xH^S~h0GViMOR z=)Z!U;Lo4-bql*QC)mrijEj|iaA?8MF;?Q8DCq`dCq1WJ?h-w&toE zUaa|Bd+nlqkloXaYKy0GY!y!xSYph=uUnXoiY$;;Zm{R^mC?W{hdqZPHfoq{G1vYp zXkIvby5+d=CX`x~hJ^CpMn<{&Wd_3G%aQuYF{N~ZOmXYBZd~Fz&Cotwt;=?#!W);y zKgfOkg0l-hmkv!6f4k^?^(&GC;lcC6+3qN(SCcC*iScaf{TM#%129V7?N8^t-5)R z@<$c50)*$Hnv0M5riq3!x9nP7%WL9I|MUO?j6^8s!k0Lb3C<1nz~|*LnsLpNvyMD3 z26_kzG%cK8Gb-9Q8#6xlr?q{nJNc%wdFXC+!K&UwW?)jt0G{nEzPtMDOJPWaxZ<6f z7&k_erma>L^{5TDb32|)>b!J0MLj-fqk zC`|a~STwERXJ_h}FklLT7u`r5l=S}o*%lV4Xjbxpy**cUioFwm_@dGLR-!Lz06RmN zBBZRQj@S}(ZR}T?w*bu;Qh8tx@fENxPGiWQX-Shio}b*W%U%O&9#1Yn%ppky_HL!+ ze*XUcuCAgv+8X2oP|*-`&wvrJ*#5H$MR?$7MB&X3mYUoCxCEazi^tMgKzng%x&et= zbqf$PgP?&+tdEqZrO9T93XJ11eL&}7w*Y7tj2+?dfrAq6V*KKkTuaerpMC59BwQm~ z;!!y!LejFbOfh|=JsIG1)g{#u&Bstsn=-tPV%LzNjzm1)pXFhvzg~m0}MMj1IF73~QE2kOG+AyL<`rLZ5`@zhm#n#{7+(~QH z#EDGj$FxO~WFZbXY+h}78x-7ay~1kO^@?-tYB#6o$voe+#*)$;~63N+J_L9T=2rvnU=fGc@?8|R}8!2Udi z_>Gxn9d4=>$OEch5HD*8z|EWB&!fuSu7|bF!8V-A5QsgUX1q-NdFIT@6R{g&5%=tP>R$U+{_kUGe+(>T85sf23BM?4Lj#>O`x~d&2mJ4A&4(5pDDu8lgZ%d;4Qy;|I0K69CSRyD=tQ9C_yZu1gS%OIbzS{t)Hs!a zM+iKCRXE!-m^&_Nsp*;g26=mR{s*6pI0hTVn3|}@Al$(WkXj@^sT;gZx<+LzE`131 zX>2@h*-Fcluy>bhVyBdBkerdM*aK8@ilG40l4cdnY6a}Xy_FzJtUpK6){)8XW1wayG1jWb0+@BQE zX_ojyCTN;%b>8G_EB+FMBKO{S<~{qNhrFJn&3`e}2MpBv>!W$M{sA_Fap2Zo=Y@<7 z*hE`e25xXLLGekt11;8X2w;*(dd&27HAHB61;&*;U%NTWHA~fGlXPU(@UI_2w!%ZP z6d1)PUZU#(zDC$pRDEP}9me@~hA1HAzU-HJ^=|{$`M*7CTEg+w!!0gLHK4F?woZwX zqJDo?3*nW^8iVW1F&YOvDrnqrm4OmhIHKqM+#KPBYs{kQG^7NOGFG7LbM*dBA~)1H z9VcUtf6c3F-!YJLLnU!5CVvy@6KRKIMcZrXT^Y{`xW!7!rU-1;9P(jVT!mJ5fVK) zoGJ*TGa#dsPWi%4AVt4h35YT8OD0fUa^jMbxGb$D7>a=kt)BixY%HSgOZ(IgMLnF{ z@J^VQ8+IRmd0lX`KM%o{naniCCbD|L zewxkg~5fjN@d2g0xO2kf;#JdG9C>muh!)q z&&7@X6eI)`89`Y6jDWAbKlt3Nm+N4{fS>{4ckd+?^W+t#|5S^{K>ue74@y-qzMY94 zoeVEaLA~{F5yx8Fo|U@p@tsE)*U!SH!%%>Dh4O|i0K6*2NR>=Xo#!(ep`{b0hEMiC zw3Hep5E=5u!LhirYlO5~Iee8iVk?-QC@xVk+c3T63QW?@YW3<6Hd?jJMoXp=dgfoERHI0=ccV~N>8r0`J~nSSpG3Tf@lBNXq-sW?X~L#aP7Hdw8mq4p?=+ak zI%__Mk@@ggRM?>s-TC1F*&J<N!7O*Jw2=mqg87GPEn3f|ZIV`35!o^)+_W*Pf zEC4OQuKONf^CMz9eOva*9O*PCiS9RjNu$!NO1F=!>&rbTp(&Zy!Z^5qt6$BXZkVqtdbUx0L<9_g~5UY8K(9cMB$ISrN zBfEySixg+RE#`J*C;F8XqvX!<4TTYhgiUezyxHr$#`|O`DqkENbgn5}8Dw1br~ zZM0414B`T)S5!4>71WQ>q3nc&r`gBdb3{Ar5Yyi*hw*#QL_5`ZeA=wU&JOw-Y$; zwedDBX(=RH(Ok4f#7@|+;>l#NreIjH9q@MdSiRfW_emPs92|_Cc8OZ;+5C-=zJPf3 zNo=3m*T%I`*U9EC<3h$?iYRkqDpa(3eJvHlg^)~uoJLKI%BX;5N|BuMqQgIdMpSR4#bq;owYBNm}5~<;{0PONPacmM#h~ zt`#Z6HsY}2Zf{#~M){^$a>OcguDSY99Wk-J;7cFTd(MNh(?|8Z9Zc*!n{QK>u@syz z294dk=hm#+rF^zPMQXYW#XQb(^K^<=8%oSk<3X(m7f6+Wt_BwTwLd%sJVXp+bl}cY zrf9tKKD%Tv*9hb|cPotOc%liQ`02Z4tmiQd(=xa_K>16~Gpf6eMZxAnla+Go>-;+6 zZxT;Jw6eC~OzvXJBV#0Eco$RTnMQgR74x!qjj$x)5Wr+w=bcI^s^qZ5T5m?TU1gkU ziD20@A+Se>K!;`qqPQG1?+Mc{+MJnZp5ae=qeo57Ii+*!y}tzn`3I8Nz*$+g7dLX= znF#T+j$+@43}a759l5%QY8gLNrd*scQUAT(~sl3l_WK_z;h-kqnwj?b4xVI>O;vS+`-d zt)%xwi^nubV&m`xR=nyhqJh1v4;_qoFNEtye<^ZocmqPSuXe9u*)LcXZDkWtCI3yc zT&u@}s!p8q853X`N0Y?07@H@bK0`x@$aRMd%32NnmV&eJ@F1WTO{INtZwU=#D8wVe z#Z-ij!z}qaXfO+<-5ngD#xbfenru`qg6|H&wZx~~n^7Z{f0Cabo&Ko}tY3Qc%job# zuAS@`f${Br;?=vH8w%teFl$aLykiwwDjunpjrE%`!1@{G^u@$`+3PMkZ|VKG%7@Ni!?)-F>K)+b!B2RZ^QpLj;E(5P|O^(NhnF zXI>RRGSicJE5hp#$twpbs6a{2(2q_CJx=3i^c#Qr5mXRr;tm)bweveDBq=Iu6x`hZ zN<-%doi)slSw1*6;F5}G8Po7gFPuC91t#uqgMo%fdZnS$#k0r$p9W!e0S%R!A+mVu z9QIbCS{wXn;2D@}m<@ecKZ{$w48*(?A2{p*ede9FF8=;)b2{!J=gC+@>c9sLQw0+{ zkz6WQ$aV7Zhsi2vZ1NE0HF1m8HR}7%Q-k62V{^dl_&gZ#1snVS!dB71!c)$6Fm1QE z!ong4G8D?a!o6?_3YA^O`lbR)=AwVcKpXXIF;|TRq%B2m>AlC$CW9USjea!2eHb%V z&4CP5^^DNx0*?rgCE$seOV*Z+LL}lxPiMI?x`jYf$Mym?Ot?j_;VIBTU@7h@^VL-b z<~`o?RuQ0B;Y>w#AuSLzh3`K@E+0fZbK&av{O@tU4CL4#wFAHdzuJ5cQx=rKpaHV^R*;P6%&reI<@zkvKxd-@skXt+|2dOs@2FS_C z9%A5N0l}TxwL#T))GbNIMj5J%dpIW9+W7jcd~iw=P8W--#be` zetTl~`+h3F;}0Ae7E*dR9}Q+yx52y`aM%z@Q=-rB$)Kj|j|-rB>wle2z&%v01l}YV zIOKxH)bKj;Zs!|zjVqE)Hi2~uUolM|!N07k6AXjuRAh|_sdyfa*Z>oi?CTySM@&F& z`v5Nk^cCU3QFXYLJX~P0L8z7!ps6G3@2(8 z^tf#Fc=|Q0{|#`2P-o*vPKMS7lWop5aD7&X=>0Q7?hC$3`V}RVXyBs`N6|}=ynOJ; z7#t)Yq`#fhWt2F_dz1=G*Z9=83j7BgEgiSnf_2|=QUvv})AqYQNm#cZ>HT0|0Xh`( zq+&dqkzV6`_6XVYGBFMaX zFqi66(&bfR`bKzGjKb6wPh-8Bmaa~ox2S3YC$n4XwY$x!*JDx2*eoZW#nRp@>l?ZV z8wOQThLnc%5Wwnz%j6F+%8GmGgcI&_fz;2$jepnhby<6@`(OZ-YI)Q0DtKihz;rU6CodyI ze=OT*R_BOe8Y$e2u`PwlPJgLKhkHcmR%Z93KwXF#1zEYZJjL5?e0nRrA1wg*(6GFh zvnE2-p-5zws?YFyxR@`=M8$RO`1Ev)()X)^vr(2!&N(uLjWEcHZ+` z_WLy^Df1kf-r!>}1NzQy0vhplz~bSe!Bhz!E@ugHjh+f& zLP4sKV8yVGX3s88vA(|oucyqbj8Ky$Z~W)!%D>zd_{iPJWI_S3SylCYHRLicfx1JraRu%V z^^pNU>une5EW%684on8FJMjGBzl}L+Xv@1c>LP3jQ}vJJ zCI0H%JmG#sMJ2U;4B?QFzn*#Hi7+XNq$9{AA)!|;Z@kBTxO(p!EJENy*D0MkQc)}F zL!H-P(~cLvZ=W{~8;GQ}wKZ@Ip=pk@-S30G0TO8-oDZPHQ#)$R8Dz|lIgZ{?cK6qJ ze)=kz)7X4GYX*=el|Em^UN`t*-frhUbqD|i5v0pQVn?GC5Ki{9)I0LEv z*7$Rv&C2Hdg(Qi=LDvpIK>bsyywvFK)O+d47VIIiW?#mnF zaM+L9h(pp_QMM=xxxwpvTnTJ|dxI5W`f%!^q3?;CJ^;c~~_P#=##Wt*~lahAsl8=?0Iikl9w zi!{4`Jc9b~0>*)=+tBiWZ_V}Bz3+bXIs%Z}^8=ScCus?1&YDyBfg1lYZofh|uUIhg zEPE(y{hh77horLpDjG0vP() zj^*e7{)mY~Np|xf@r9`08SS_e5YG|;Jt~9KoX51*?o%w%)w~hU9L3RoK3xPfWuUYl zkuN@IdS5!dF0hC{k-${Lnc&uN@XmT4n7jKQan3AwT1h{^lklH=5Y`PVNoEj!n9acy z_YsIwfUrCLIV_nb1}^;;1HP^B0(^m+56Z0u6cl_Npr&ELRwu_N zgrw@jLz3glljGLU*i79$D8v>flncif#(e3<$9-~QrD|T23xvpWT?8(>@IM%wdAU~* zS$uFI3gbP<5m6~MfM_sz?{EZ8xn&=uB;*X}&OalP{y3Q*ABoBVO+xDMJz4XDeUO}o zDF*G$fTs+`!3e#3jn1Y(?zm9&Dx&vE=@iFnAW-6by&zR^X-Xd21R}Y1nz`Y8nTS4; zHb$i_ac#}29!(w93uvU`6c{l;+b1bIX*b+09^b9~-=GnWuVS1i&|r8xzC!EWZ8X@L zo^GYyEu#WF3{FY=2~4Q~ckxft|70m@Qf^2RhPUuf7jd*6BO(A5o`4E6cF{7Y!8m_E{XzFr^HD$ddx8W$RT=l@KzyD@5{34vQp@jjt@GHF|Wb*-?xV|;gIUYV0|o?G_wU~qW$0CfPO?@-eg5>Hxoau) zX@>sYHu6_4poD3+h!9FW$EO;*Ck4+rJP5){DAr9uzzbdNwkGV_0PH}jxK2=AfFnOr3$H_p-OGVrx>fo!7gcZ*93x8&316Ba$O>bFN<9mzsCSswYfmf(LT_fd6MY@fBIDS)YSFIo*z%fU+ zAZ7dd?vca3AP!wrm-C$YvDCc8$9^*=eG{HIx3h$HX;>|c*sj51)3(mE;4;;0Jj}Rq zqYFg%N*hfw$pL&la3wz@x7rV_&oLja#ojxgO&!4jm%&{H7Zc(1b_^B$M(y&<_nJ$qrMJ%N_w zM)CyN5JrzK?4;XPux{2=UvQXPJjsPHJo0>=LKXL0##{#dS-JRfo;!SR2g8O=I({@% z@uOkO2ks;J95WKG(^)c%)b}~syXIZywthc9Mm6BM)hieMw$f=(_1FAeWmYMdcy>vNEKs(Tc&P$!vJICIs|B^<$Jh{l<;2 zD2Of*x}4iNR$v!}stcaPKbM*1Y6RymEPZPu^A+ead{6A^c7C41kZb-4u+!cW-azOnCDEew`6-AfmLVIR8aP-d z95?evUxVG370?S;@>Mko8ov2rJer5;KMgNbc^A5y% z|KGorP4)^|*_-TavR4R6cA42bdvDp<}`d5cPZB=kxuYe>=e;Jwv)s20#jes6=0G{H+e8{_M9!+TCx zn69kF0FhzxW4axM+H*B3Trc9Z%|zRd+eGrba7B?*j)^MBUIjvc zeTz7Zs8sd-`8$u?5?hwYL~xNhFujY@$03Q8NiWF@?(I*y@XYVr>wX=JrYB7;-QPcJ^xd2q z(}A$)v%L`FmiLM5`IY$s zina~ibwV9?4KKbFmUMOAa;Si`Vqo{1o|;t};xnJ^s`R(3q2%feKd9-jhdVrVp2-*F zXGc_QKNbz)lfKz~mXHKM@*ScV7OZ!K7fzz;Y^aJIPk@Tro&hyR*@3 zlk1i^z2hbqo{#s^<)YAH9rSF#?bY_){rb=()+KVgjMct?G0|cy&CIr!FxP}yup}h_ zo^sk4MT_QIqg%0Ml+W41A4KMc%N9WHmKKGJV9ZjpUM1Rvi67s^Q+DFxYIKSLb8zTYO%@}lMNiZX*8_949|E5I{DqZ-QZjZkBC6D)%^Hi zt8_y0W|H}L7dK0<2Q4#(-%BW0&6bIP97MMJydk158QSZ*fu9PP_6d zCJ|$aQ)EmZPwK3kvt`;qzz3~n-y(T__Jg}CznorWugZM6D5C_AAG@1IZV9v4m zXjC#zE4dkAjel0y84~%?CS77&Tu1#rMOo;hbF*Jh} zCDWpOQYk(~G!`QwiV*t^IOvGKr+I&cF8UiMxf;6BHJ{$-y$xEr9<@I~K&rcGS#f;G zkQ84YTseW;$u6; z7}ABl+SWerfCWD?UzJAcAE{0ZRMi4@LCHXJF#;TcKrA7_mOpwcO2J_`@o1?O?1%pm zl?IM33v`hh*j#u|F2ED_l#MiD_~+#{qUZq|T`sC|y%-H82wLo=+@LPrFZc@`vhJ)J zqRDbJK`B{?3eQ6&Ls6Mot61(JF`3xj!qUl~DNZ^uLE2w}b_YcX6I!Lh!#bb&pcOOA zOrvb!Iek1v8$n$o2gUQ^pxi1rNB?`2=-15?IvcfT7`MhAjd-+iJ9UF4Z`qZ_}@y1JK zYkSN}V!&X)%|slzs;UYt8FB~4naU&ZMpn}7x%FY}Pm`ouJ>09YKLW9I&z9QKBQH$9;w1PrK} zXuW%GAn7!y#y)FxEUr||NO!Il5!geSC)2lpXbS&pAnQ%-x@G-uJDypAQ;^mkdCXu? zP!NsBq72)uI=U)Jcfvv2%&Q?zu!_$(MeJocq6+6_sY~IMta=9x6e{^QdO(~ zOlxr2WQ2F5VDEYLZvdBwtr%`qb4R~hmJb2FEH??+sN?5!GA!@4Imw<>%_Cz_2S!0g z6E+cH_PZnNbd)lfhHuC`KHIQVlr~1ubrt{DX#(8fVJK$&S8)5)3y?V8%J1GfGI;Z3 zKH6k>qeT~PdL=)gvEFThZx~_Rg4%;dvN(g}r!%~9bl6r*14dQ)l6ipJfUgJ?wzwY0 zdv>65d^!3J8Ol=+-k;t9-m7fZat|D!zmnvjYTvi2^Fa?_HQ(Il$kBL2M}i+ASD*#7 zpuxeb-(C{H^gVsSw&yCe~B)>v@|VM7|eVgInV z&kpeOy9Prb%jWHS+N>my=9yl0f(cZAipt>;6wobza1*>0q7xm>Rvv_ph9bP;mfSp& z@)Z&V1I(#xf9P~(PP`-lEDg`*V21i%)yr2gkLWXylIe!qjjJJbA_;fS#0aNrU}lg~ zQra~^`a!*P2JVqZh?AMR-mFf!8+@8EK1=$G37S`HsCVJD&T{x>3TRY!+Gh|~hY#)u zbq|pL_J+C08SA5u-wZIag_y(O6@ee)H?X_^Kzb~{NpUKHojmDVs*M011U?Y9IqwAK zvQmy>gn;8+3egG(@xai8*U+i*A>0gsY`!*@Jyyj^TxZZ1*r)E>;CrsSOh2~BvUfvj=1w>F9Z=) zxh^O0W&rxf?iIv19;qqRD!$GW(M3#prz?d?wH|()y6XE1lNd;;%W;w=b2z^dd`RMo zr~{l1?7cYi>4H43;YonD<{hE0^?@J3^#MW>B47k<>+m->82&FStT9!XCxc7|-(>JJ-M5>Eg%W6~ zD#fn}-Z@T>&hP<2)lK&~ev%E1e1~4Zsqv+7=9N! z6PXR*bmnLvj*58?e1QV8#QJ-uaV9n7z7I0hPQU30UO>Wn>Ls0fuCWs<$!FLLK)EqM zy|-AW4@2F!?QWffGcYy7SVW(lwA9d1o>63U5r7T+1ehc-gBqoBLjB=!EhGp&`4cJ{ zoIP6Sa>x_YcYXThIq}t;gE(*QZP6tDW}6PuCOd+^O+J9(Idu_#Z$W+_|VGDH_|RE z&Mp13UtfX)-i9ivjeo4|Vq)`0p@mgVe==%L3GW#!FmMCJMdv#&8%nBo;pqQ%hRhRV zwA@C2MDCh9Xf}C{J@TaX?^@V~K+$tjt~3#)VOeR;XY4$jFIj)!RTLUy4JrsCxlK5t zfr-|Io+T+JUCPpis5CfrSWLffbm&P5=XTOQyP&yt>Jz$UWtRlMVB8X~)L3+r&XI=2 z$uXg?I*8la9UMb7tKWrXvuz9<<0XZYV_t?QzOAk`c7I>8@jaz9ap2E0%~0uyeM)R+ z5v<3jZhCHZY_RqUW_0>;Xq#E1;dTRfg((9cxaMQ$tjy5{_}4;a_O{w9ORmv|Uq0$F zd09%9wew&SD%?j*2?Ux3O44m+avU0PDt`nyVb2i6W>$Y~oj6q-d4t7MidlhBgKb$! z>X$@Ym`AErbRLs6HqjmklK!Y{uWeNpvae)0*zO-v4C;)of-XiNSgpWv2P!W^t@^7- z9rmnA=rZ?*RT##%tjKcjxCpOIR)^EDyH{(P6b%3ryme>w0^I^%Q%d(lcP-m(T6tQO z_f=p#8r2*^9s)|Y3w9%!mW&`TZ>`gMpGCYVIwRI&2;rH$I-i4)IVgTaQP7<127~Jl z)(wJ&xgZ>!`#b;%;zrYI7DiYIzPTfP`ZyjwK6pxP>$uww_}M3$Nj`oW`XVaNYFtf@!2~3tnxFQaFx+?A``E;&(nwOx=G0-Vf;)M2_GY7zDsaf)HmI26D%@ z!9WM*fHFj+R(A^cw6I5>!r+vKk`k&(Af=n6)Kf-=9|1Bvg3EFHgSqnarA0C6OR{s_ z!evv3;rhavy=)Nep$MXLc(ab#4Dlv~7c9gP2sL{d{Au}m`N5OD_}V`}kSg`Bu5thZ z|3xh%Az|;pl&aq`nc(jH_RL;TnA&YPO{EyN5pLQ9oCl&EdDDJ=uulGR%5H~>cQ~>x zX$hz!;o*XkP^1tl>rizL(ZAuB&OB9mBap5EX9=}_#atP~qE-6S6gJPpMnO5~u7nK; zM&VA!C0#QnuK(;E7IBk*Lcv)gxe6|)HVq&aV7>a9@$(40?qhFR!MQvC^Mj8>uJ_Mx zhPO?iQXVl^FVVj@v|(E-`n+Ro&)XgYmeP6Ktt&m3QD23gevv{BW~Hhj}4p zV;g!#a!B>If0e@$yO@fA++7A+{d)5UTk;SC? z=ChHhI+4olD?bAMv;?$+C>RkDF|*f5BkDsJ|GAFx;Bfs5AS2@nU=60958o?c`C z|BQzK)4t3%KPC8%G~i6FhnWUn>qn?DqmDnPBM5|a;;lVCUR*{<_7Q?~d<|L9iEPms zkK4^uBrytTl+^ebYFgmSi1DSn%7TIGd5TW6uc?LHf5>KRjYqyZY*778*UOozQZH&# zMTn=TB9jdd?1Ff7b{Q*F8Ffa6Emet$DsJfeT!k|_P!t?uOlmyAK*9P}LoNocPS*UH z04ZW6aYBW6-GOv>yf8kNFI04H&kgouc!7?|Chf-1>7~6B zFDItNO2s?X3!7#ZKJm*J6AUGOEIb`cSyfa_r>js7y${;P8EQ_X#_w2f+7F zRr$|6MXYY0vGxqA_g+m-Rss0nLXTacBzw zi-0s81Q;$z|0ZMrvr@mn+sbp+$RbgDMgFmHPR_)ZNkT;2UKj)$8k_)LB1p9*5j6tJ zd%g}4E_%667Ijk6vEV1Y8Z`zgZDROi>X6EMe#$zS)hZj+J6*F=;DWI7Er20u_xxfh zLj{-(*Zm&t0O(U*slnkDOhmRgZva#Me*ldkMPxG?-G11Qk$L-hc^5*}yN$VV?%kDf zv{D>5_~wK7xV(mIt@#>8UK;CtMUCjca!sBc7)hs+EFq;3rzqzI>VX)Lssr<#R_WL>&y3Vvu}(jn2utF-RomKebUc6@-))t4gb?yBLSlcV4?x@ z+3!EzH1_uDYnjo0q4RB>j=Z8^UnOy%{<1G#TNj4t6Lsr<(|NcrR=?sXSE9IJzf*6qi=LtD}clArs{D=+-IjH(nnvP%`+=f+MxF$T2pZg2rOfB{U69Z~3 zz}EtRk zwlr}7dlih5M6(&gMnf41@)XPQ>5NYfyu&GL&zYt3Tvk5QGt`(tPt#3^!ZAX>mROKj3hYv?=84wW`K7=7FJutWb~rnLz@1Q4|n1 z-`?n8Us2sjM%8AJ1h^_#Zfu))^ReoPwFGf3e8{F7jkqukFo$ic@cQAJ(Kk5YG4gHa z_n*3K(5Ks1tn1ftrFXZSMBv?SU%`*)*Qb=6t-Qce&ub+XoIse%cv;1WgzPZ~b{{@Q z+iW+fdB{L`imu;aPxK12G6MM2kb%ik2c(E9s!1IpTF+~dY8b9D5w`UNMrYX>OkRcr z@_&|w^pPs0`NRF`2ndiVN9hfIVo@u$q7`z9ms2YJ+gZR9t#j;;70eT>`}RHBpY0J-#Np| z>{VS?YRL=0WMb?L{NEalpGbM!d5lD?E@sT2V!DlW^gwL>(jvBRNyOVy_Wx3 zXGT$HZ~*udcm<&GZRcl>-|1)yLaS<7ejp^o{Ph-FBmgbodcSOZSBQBnQ4Sw!<3y4v z3?Mi5v=8JtO>Wz5m2zcW)m$(yI7xVQnzXWcyTXu1g!&t)2w1j81LyY7;dsnUg55i* zu=7B_=1J_A_hMbV2Gl`#2?h5B+a`Ew?8-54=aN<#1>RQWzD83RQ07yz4j&g!M#45D}oBnBi`5O8>eDOmM+>(Kvs0+kSU6W^e-z=pw!MQwIg8 z@e#HQqy7IZ`%UvaFx^5VljBQ|M~x7>ST`8^UQ{{1@_pbUR04#q7Jx8=%{BYnytZ)~}Cu=fN->kN(5j72eMEMky*=KKyZX zME>qOC70n zmV0WXDg^47_*37rJ!!E%#f8%Jc|pS57Bh<*#Idby9niGJx=lu5>|g-w??yja4GqKk z8UGK~E!a-xL=0WBtj$zlhC3)}`Y`D4Gd2Z`ku!S}CJFRCaeNlV*9Hnk`~O|bFW>V& zrzy5esROOeYF%j(vdLcAc+U9#|;Mqx(Z+z%*21eBk+g` zpIHP;HsaoR&LQ{b473B%0YzaE#5+-YhfQD~??}>@w7!da2qTT_3u>&;Ueh6#{Nu>m zZzb3K61z+!rF~d2X58{RzaSmS&njXWAaNuAmANV0bxjht>K{3I#rtvYQMxY;SW zhZH?)P`KDH9O5Phqid!PDyFq||_QSQPI zoI)?Dw=nEz)%a(wl7+WXUNVoj6tZ z$Mee=SY5@LdyCbBF_s_H@`)m98t#N)ne7#;rX#NIyBckHI5x7QmjSm-iqZ;rzg)WQcOc`Aodh;Zr5Fn2J!v{8 z$OF8B7Gn8y6cJazr=BZ%ncSfeOM%r3+L3+4$oDq5 zNU-5jmp(q3`{0iNpnhPrWYOgvFX0dSg<{V0IZF8w+znI2j`R zl(Unrs?T>}BZe~j*p+%{0{di;qGaahjfnQOewFuMXn)V-J9{^{{+YC+1vjC-V z+ncuJkLmzP67pz}IRAy<-<2u0yX*8m!DDabl_|VH|Dw*Dv^EsHeECs46|Wyog?WF^ zO7HRSxQPvl5D%`__@7r8?Sq43v>ooWy=g@g=!Tb1if3VV3!KTj1Y+h+mhRyT#%#BI zqj*o?0By9~^&Sb9BZV$%(SkH2w);KcLQFV&^9q`p7KfLr+2ka4?jhELO27%Yhac`3Nqyal!<*cZplC2{<2KNZN<* z*Gm^22E_{H9UpeykOgGJhE>;j347i%+4?W;O z;mLQnapEPE^%R07!^>*8Fi=3?$h8ya8g$AJzz=2+l#u}D+ymOZB-oO`7nmZ&lRoYe zo{Myq1cq$rBG;{c6l)}?UYrVsJxM4Dzg~y=KD!<8vZ*UM`;_4XpkwFOgNz|UjXxBD zr%a8mh8&Bk@zt@VXsRsI&k*?~jf8^vgEb1ekv6uW9TnRml>JI=%;evqyq}eq`)>Xy!`8wD3V_Yj^&K8vK7NCnLFwF0L-enUBjDE zibeC$%!UTw0tS&_b$|TJ20c#ETnahQ3N#hr52A3y%psD~B)2L=;t7fu7N(J}Qe8 zxdOz$fW_iyAt7wQCCq&V{|yC5=OCPr_(D)#5+2<8eYih>S4zkF^4utHZ4wJoRpq+S z3IIxF`^w0en;4A;rdworc7Z2YSLmF_&MkJ<(cwBmjrG}KedXbf0h@w#U>jkm_TCQJ zZ^o=iID}-VWowkqx9ODEa*X@}Kh!5+LbHdP;o{?u#l1-0Gk=t?%MJlTl*700DEX{> zLL>%GPMm#;U;+g3`>XOi#VC+-Y^xwMBSE|HFR$}oY(r(`^uKj?mk*@kpJeh!U&{xx z1_v`{px+`?aMp?qK_+mO=8KKo#S9Vqe(lbSPsh*5iye(plrI>KN%SUuPS5@OR`!pb z!QU+l4G&hHy5&^Ab2P0XzY%r!$?H6NHB4IV&Se3{*7E*cMFPHF{!Il9 z23Q+23rjh(@)hJvz<&Azi;f_?jO$7BgocG_C5dbH{p?q^M72ApeA8j8F9e~~M^qRr zYs-I|Tkext*g%Y;SO*MuH}8zOmuu?&r7abE3s+@M2I|7p3rN&F@Je|@ zaIWF409~ET$sqQ>2^qmdZmxHBJ!T=oTGZaHn3~dt?+)aeoI#DsNE~~lazu{x@ZIZq-xB_TFyiqN6{d*M8H_8iY5c(I0lAZT-bN= zd3bLFGS3sZb<{2cY6JDMHg{ww#DW6l1gXMAfICO{9NK8Th#_9{=@S9|AdDO%UJ`0( zopRJRxq0l(>cqfxOFXmWBO3g)XxouK1y#YiW)ZLl@3~R&gcq&jaoUfsIFip6){~@+ zTX_(*rPIXjpG?6qs(Tf-TG-k6+Xt(CdD@9j?%u3Q;(a~(ZI|oDOA$M04mgyp+Pywu z{arau@>s_XV1h(yuR7?pVl`uD-LVX5_ob%xj*fE06s@o5OZ)8DB03bwQub@ru>}w> zr86>8ayLz=4puB83}kIL(uXj3W}5}Ky;mJA?e_l*r%_@9B%+hjycOzgod9!z8$7&CtK8+B^Rj*KBZ@C4mT{1>iDY>8feZ_LQ- zEQtpH3%%#o))%x@kWqWIBrQK8NH;CZ&7Ue*3$PjNQW0TDq`=(^=$|t0jjLhtvu%PU zQs0mvsRxM>Q_e{ADO$uUIszC0T?1+XoD!ctfdygQx`CnaDpTmCOfksj>gw9UM#DI@ z{KQd9Kt26=+3|?@w++u&BhEhgxZysni#n_&g~~q}zDL7ab5K2o7B@pf9e;HS-X-qz z8MIYNl@`gM82!ptWIj#t(?@sJrS;@%ABdjXU zbrucIOw#*k3wn`y)!>*uijZ!!EwxUQg&gwOuE_j6ART!;xmNlCdJ~2TxMr z5?SWJP|D{VR8mYdksdIwJOK2qlhkjY2iGUtF5b{|m;C@If@gXH+d@r*8ojZ9^Gpe~ zEaW4tro=9%J(30A54LPrGfbJJQ8Gp?wZh8N)$TSgJDf48jE48Go7Z8EfV9(U%v~jL zi)hq9w*juOe&}(}PRKCROu#8va$6Ql4zN0l0vu#Yn17FDRP~PMP3wBzQChqnwY=L| z!l)?)P6v`6BEtEkNM1g==05sP0jhV54VX_cnA29!@x_`ASBg?gfAgc>Y$x z45h-ITJ}ra<59;ah29{-`bj1@Nb6&n;T3C=?kCPSnhq5w2z$u<5g@=cHTm4DJFxm9 zVPSu60_|b$P_Xr=W4}Hf!@I$H=`s}VWfH*rA(=TxVcw6@+gpg{4pqKi6vzeI1#|MK zp}CL8tDFav!*SoRe?OgQMn`}B4`6syUJK(SR%l1T2L5T_fRT28cu0R&&2?vBXk#ss zQJg0}Y;A-a%XA4O^MqmTSF^Nq6Ju5)Qf({Tfi7#TmNBPho=th`Le%)lb6|&ZyALib z!a|#(Z0>_^e#{AQP3?6nU}fZ0VC@2(ZKgz>^#(0Q^g`RDPWeJjiJmrLvwr%`3_-3I zOU5_FgywC8PJk!)F>@_kKNAqY`>g)cWkS>?h7yK@hq&Z zaZVeOS|nQUjlWXz#1=AKLK(u>*x)XtV3&YWluJ(OelU>H(GP~#v-1q80Kumq#ZHuAv&!Phwc*22xJ zJ3l8UCV;)}B!YWf1ViKkMf>~wgweC$S(gwThzyz`@LMx}7{}~{%hw$V@g`g&B8jjU zL(&Q-jMEvq>~n`6uvzbV*Ih?S=vK;O*7a!PtVjVKs7_4e08oQ%_V10q<&(x7r7FqR z8N4NP;iZ6aA%S4|6O#VGU@N2v(0u4gaz`4D^M3}<%Jq;y?J}IbOmB74M9K5&!afRY zuD?b1GQ9~bWN^xB(c6>}Wx4#Bux`Qr5|c9*8W|EBBi^7cGZD$C z@7RY^3(zK1>_pA-b?h04i$o!JL@O0d^{C?Ah4I5fhry7+`P-hQk!xzQF$ye>O-7KE zk7smL!VZmGqkFddSLPw)Ib#f183`n*rQUdIuUN-SP?=rJp9PzaAUcRD)!sC` z3EY%LQ$C$tn0%B8!>HvPL#{2$#XSN=aOj#1X|)bMwODV3qkb>T?jaw9`?Sk-!B|ZnY(Z>-mhhTUQ{aE! zZW1a&{0OPzpxbLa7-lFf55kfEeztD#hBy>QD2=-3ZzIg;OwsRUMf%moSbK2>Z9Gf; zFtiR$fHL~V^>s7CJ&$%k|EGN;2BGi)#fVV#!an2^L3O7)5hTFu008gvEN1bvtQbtT zsY4In7cX`J9SGC#Uej8ga$}d#d+)lV!&+c|{E5MN%MVhJPeZxkoD0L()qRuSVs-Hk zOfq}*Bqo4I=nwR|qOnS7&KrbVqJAX-jvG!|x+`JNH2j-wkQNCN5!+6A1Xf=5)Qw!D zc4+}_usgtAUhdQCwo49JEezOHj5AbrhtGg1{!$GI`*F)!D|6oK|v4> z9!N+`&^Rqa5EU^_@bKunMU*}c{w@uPlL6}nWkYoMeeU?MlE6@8AO+FW1^;u=FN~VL zmxvH!2T*9rUPBKg16Qnnr->BIcTs`@VO1fW%8{4jb8Pve{?dmSO`cP_N_{At3>O`u zbE+n%M1+*!5KA&V5F9+N^;fV2TiOG-j^3|WTpat_a1U;$P)TQnu=5huEcni9KLm;I zfHgdD<~z)J_1bn2r4%VoSF0nHBxt3e228{%R_}*{XF>?0=6%DpX#04Hn_>e_l$la~ zK1p6ZN0JR7z5Lsh`Wu2hR;)9+_}!S@x8E@-?vC*3dO-v&xYbH;JbJM5AWyzHIy$Of zasU4P!EwjM+MpO13-D6tmNrEK#6cKPf^Mn>TD(ILQ3E&IZB;B|NsQN55r~lGC){e` zA!FCc`(Vu`ib|XgB#w#4i|9w7EyxR8y>3}d{2!NM4UBF?DV@ZGYnH%uFllk5ArE0g z(fIcJk8}LHKiI^(P=MnPa>hB^r1eiQ`4VU4Y04`qDxO)bo~E@({Jq#T#*N%Z&_B_g zGKW^dIskWgY%HQfz9BH9ORf8GW#v=kLUVZg>dglOcV05xjPLvNRlWe09G+BP6a+P2^?A6PUPK9GPQaJ(gOyXR7=K33J@v8~gYTz6lt-{lHb+bw z>a)zi$p+s~7}b6;TWND|`0}ixV5u9y|J*!jeISCwo_ev4V{#k}mcYnW@TFA`NAykQ z-%niyqz14l0CaS?%6LN;=tVY6E1jV*i#EB6OXk<6f2{J%q=p)*H{TK)igAq?I{}5 z8*_`pRgPL}fcUJ%ejn};AGBWkocmbdQd)l+440+9-p)sGt-+Dr+=!uh-FK4hC_c~_ zZ8B}9a6EDH%ng5)_4ez?#P9+u^HEk1F9yw%UIeDm6w?Zb-jOhR?;JI{djLkvL36@( zRhHMUO72tPsR+Yxx;TQtQSL3ytsJacOo2E$+{W9=S6=0!hicC)sbn`bv)b#;Y*rVSD8|60fL33i)jvRwF^ia+AmW%VF6bNzDEQ#({tXjp=KtA~PCi#-9)5QR^I zy-}SAUXxmafmqwSW@@Rip3eN6q8;p`iefPvE;N~;44A@*szkhC&7XRa_-~TZUaGj& zq+8pFrEdCmh6Gc@u8@Lwd1xC-zgF1rnQB~#%jRn`EX1f`4 z`g1?DUK~1GCMn49WORABPC4%K3zNkq{D5{B4(|xfdzETsFcuu1Mku zU!zwP9YQ1@$D5!>&+YuIV=I@kdV+&o;7Ij${fq0vt0xUhTXVCGPH>VzCm7~hhqK`x z+JSlPlka@tT@{>)mNbb>V?h`k#U;xqP8caXLZ3>%C7{&EFK5;KTE;pjJ&o_GzP{QT z`EKQxz+5UJWsa)9_W)-5|Lp#~Pun(+*DXVh)7&SS$QaeI52YP3pWwENJwZj)o%l zn&Wbb9Y@%;=|P@Ku64Im%k=X@mHT#`-JRZo8GrU4#qwqJnkU^_J}N3&eH`?aqMv`3 zCjX_BE`Fo8+dpT`Klb$V1yN5_^h;`L{xpAkQFq@t=mYYfytbXJOYWn&$CP+3mXk8y z+YKJ(b%uRxt8sk1n0~M~VxFq`L*V)#9U`RuBPDOw=N;_W8NsMt-k2J0*4|g)?6ve{ zH&liM0-Ahf0Cg1r!$i ztoe8KU*`pY7|%mM4gU1$6EU=VRz82Q|1Ik!*q@z@ZRsxdxTLifZ;o0w;{g==>iDWC z$5$d3Hnff5tMh%i0)nPF>GSJj&=@ad##7HKq`M?Vq$lfm9uT@IW%1BvY*F1yEZ4Z zU8g_vXrHr%IEk6`L0}8m)L_Adj}3?>%~#(afv8(phy4pWjiEsGAB@n8hMHJ2GSrx1 zF33c52@s3h<=x-H|H3Zfz0m&E{gVua1MGoWsEvRaZ!&UlanY&#{Qc}Z)T$vIX&$foC+Oo;F8GeXKE^OT6p8WR-q%y(1L>XD-;p6zz}OHR0Q+sTtER zus{6 zpOBPU7tih!6qTYWu*t)h;8%4mDlQCyf+F|!Z2ZBojwnW*KHS~)m}CaG_jb={{JGB! zNL{$4?!d}Y7AZas7~VXAY)k-b-X2}?IV2qkz@O+fNOY_jqD3&v0q!d~Z{?Bgs-qH@sCWRAZh8ATZAAHKKt`|!3#nM&1U`R_3oM1^1rr@3`G!_ zuIBs9{SwW2TIhM}x)&`0e}r>JZBcjC0C)`2{(lpxQ;t5nc#+cy!vC&hXd4=#F5RG? zXg>4(#qwqwBxmw;m3z1H%3i0g+_c2M!e}HT!4=8IWJd<$qNK{i_$Pk>3(UfPu{KIfHuia+r3fP0@;pgLgxlB zC*{$MIB>aSS5*D8K6K}$G4<6OM8=4mt?b3q_av5wKkt>3DQHU^l68fy*txmQ8sM^v z1w-aLLM>h5&6(77zZ5t~JlfU$q~-HT!!Hy{Lw~R!elRSaiE}F{DBrG70mD6|{xyj$ zAqcwQHLhGf{4Cs(lLEA&FSPSeqaraLuP{LQG8VAZ@NslAnHTcL=m88hhDMF?(r@!l zoPwu7f~+`c1kfv>N4Eyh%g|zi5usW-u~*thJ{Q_wlRr*!>jJHI= z1jfRjqmhgbxn-EdL#<@GWm1nJSHYkro^Y z!)y56T}9N}IXy*v)cbQxc_>M7gJ!$`+W+6g1a2AEX%6$s3;5jP2{0)d4w7`5^R7(A-9JAmn;r)1rj)Ka&JmZm_9V%?70~Ud?q&{iVEdt z-?&3YNWd5^j#14_);vssYA!#%4kGWoy-?QqpBpMQUi}j06ys>~=VahW;U{3FgOvVW zK= zE%_;P`v%8)n||tWl3`sW7Fxuv_it@6amdQ|m}g!N-JW^;mNY8z$VVUTaWq8MUZH6Zo3S0xS!8JLJNeo8D;cz@dZ* z92z|(iA#*Ad7}p&CU^9}$Cm*x7R~){vR92=igF&lG(W|nD+NbEkU+uT64DEn2Cu2GZ?dvY(%pa z80!6ReEgMsLBIRY81T+AQmK7~c1;U_)o)VN;_k@NUBnm0*>ly3k*!hi;lt0#%z5Iru4{{fR=g zSjR|mhNAyGI}+9M$Nau~`Z&BQpAUuDTO+}Lsl-&sq$`2H{j&NuK%fN#1mH*`MHtZG zNkGX)Nto+P*sGtNoo(D?tM^O=!pfPMnKE?*93;Gf;mF}CqdIj8pb*^z9AC;vy7x%5TmXWy`1+7(FnUY75e@H!syA!NbboROiuXGFGaJk}`PW7>ELIna(fk-k^I*fc+uQFAdZnm%0>gJbE=L^B;N79p67P#a+2j%vCaf%lG z;dn5bHP=QeIy#jvArlVjkJiUS@9kTY$sE!(?aXH+>XXgN3$ynp)AqWpLHvzK=r*rt zpcC#DlEPKl3`29AuKa(7V(^hzNpuof0g!HD_9s{`n3&cfo- zj1O~d{x<+9^S!gh`W!u=@Jr0LD{Sv15jv$JXMW$ULrm{*C3BplCG}w{ku>gB*QOq= z!;^H{4KDp&K?pKA(gkQ|U>Q{*8l!wwUF|rx@E)sp_}gb%t}EuW>LG8FPTq)@4< z+OC~dUJF^(@3xCv(=muB(EY>3$(Qm0EY4`A0`wVyG{uM6cK`NY0D9o;X_L_4n=N^F z^o);i)7+tL*>LUE(&tFrk0!4wI^pfH(R?}Ew?W!0!8>6f1a6X)x$;hGN zN&l=13Hw|h8Gd2DATJ5Y`}g&#^rt$t)OQUe^07Ph9EXwpu3v<1p$1kke~afamXj`f zglZXIh?ZzHIXd}!0+4zSU)fcKs!XV`5c%kcQ0sdw!&OkJx%V~AQ|^VcGr?p-`PZXw z=NlQ+f{37w7$}`cB1eubF*^q1F8gabL>k(xI7#+xRcl?KQ-e6_MPh?KK+I~~BiK_M z&HpgE5B@rI($%74WRl+C;(e0+U>)wXv?%R|zr4$J&27Qgs2)Jh(JM@wuTQYmxQsY8u%Y4lc|& z-aM&UFsndv;9-C}QPe+YHs|Af=U{tnbWNRX&)=#%mG)md3^`vBE>wOSe7z=PK+V92 z1pH9*OA^ruEiEwV*8PR9DXFYG@% zO8V@j>RCc~Yelyx6fG4w7p#kQdTksy>%A$G$$Dj>ROF7Zqi&dvoSs3JG#a$H=(FC0 zh*DvP8C8a#RVV~ zmeC-8UCML)h$oa~WjZLdl?I%zzZ@{pi=5(;{O`hL-1^RLD=!Mu%2~I902)(N<}9y^ z%tbL%IZ1QCNM#|KDAxQ@@{bec^Gk+ZwRT{4PlKWCo{+vwii-sdh^NqQ*Y)f#*^})O z7Tan!%-+V`<&JyewIC-7c>_ths6?1N4Rf#Mn*fjy*ks`6x!~FL7-_`p$TbW;Dp}Jow{z8l4+~QycB}10_2KbzDgb?B^DCwq?5u*busLG9`M`T`#4Gh zdM}9_+Ve8QQu9aWpnyUD1vXR;>y(GamD*svI3|(*`R7JLn}gI;Lpne7$h-Pz-=lpm zpbv9`)!f{Y*|hUhEwaa*KE_3KrnDDitp>{CYd3I1fw>pGYq=!%{P!77#+7?zhe(++ zVmbQu6Mj)bI`3m4Zg+7Z!l@Wr+1bZv5%E4)8zbXkLj|czI2YWVOG-DkoN1iBuFMNNze_s0weiJy{t%1fmq#yhVPcHo+pYb+X z1CFIn7hdP8TfcWj2ryrOT4@=>P8_d6VZu(E5O7}c3~oGw=2H|ulk=|SE7=LQrar$< zK(2WGYNFL_0m6{!e#v^NqZ}dwH!5IkJ3UlCwRH zF*z$l+<;x*72mJ@0ySo@1STcJ0^_e?MkK6%|23iloFJvVPX4I_p>nYf1v=CU z6n1iUX`f;7UGHs!d6-5H=Uko_op8D%;6+YcK$X$Yhx`SfGeEHn>TS_YAMHJL=!y}2 zfv~teCqqIq=Mg&^mOg3b7qg>>Z6b85LEdS3@gbsy9bBt&9K2eh*TN7{cF_1SH0U-}-9*C?<2KfVb+TYJ=2_?n)GakL&UfCtQuKljfl z&8nt%pziHyC1?3$aesj^YWi`>tC6*`r_Q4a!%O8;0YwLvWPX5*{MWoLnx~F^EmKph zUz$&yJ4?H2c>_ODQM9TcW`oji_ z*gSpd{MdG#4c33aFb$4sk)QLb>~TtYmQnf4o0RzbRW^*KTJ{|*;Ih!Y4>DQv;b2N? zDjbQs9K%r&;1)(a^OxbIKc3t@JR7fm z{fU5!!6&bBy@GHUW9~hWTR>&bYgTIrldz>6CL`8hID-a7hvPCWQAU%%8r(wYUZOV zMqw?w;31Zwlm}4`Y!B1bM_eP!R2HTzq+%_6Jsa8ZR1T*JCjQBjTp96KrtNjc*jw-q z#VBOHAkkVkoR|HMyb~X;0P90)>ZKRNJUy1Il@tByYWQB{?C9m~VP6AfdwGkr0G8C; z-rb|rp2-sdK(F9!+nqtqxW(<#~N@J+oI@BQN&togA)no8d8+;I`=0fP^d4B z@3!lgVm$D)0P@-oz_@8eQm8CsK>`?77d@20FDY^J-oZnH)Mf3MOlxR|={TNLYka|J zcl%K?Ns%$(f}){v+OiB&$FCr*_}5WN-tI|V$?4+_Q%1@)DG`j`L#P4{^pWP%^zPD z-jaT&+flgv5BxO;c%}mkV#Owk@t4L&O8Qh1GO7$tjKg|Pj%!6cb__4mSJAt9W8<<5 z_RuL*G!61_=*y+ee$tNCsrBe`tN&f*(9gaJeUtZF@iTuERx9#2)-Gy5ez6;kmeX-M zEXICb$lHRU+*UFdwe$RE0jIZV;vV{Vwg1byG&UVs2(2xi5}#uGU50y+MG(Xz z$MMsJT~puG)kGn?;=S>_qZ3@#ErLnCkvl~di&l@->oi+yCdwpoy z6!}cGH4-VFj%#l3{^XF+49gtE#7;rV6H9MLDYEb*8KhfUIWiRBv5&OYnRTvpij&3#br{fF8Rjhr1^C{|KFss-$&}$ z3oi0N@%ZM-s_ye(RVV)AmuKaWZjb74R8Fw^x+7av%bRmgI+fUp{y{^R)`HRRKPk2} zk;^pHnX;5|EJG@Cxg|=~M>L+c<=th?y8X_xT5(D3gDC}TlEverm{hp>KkPFFgvkBO zBtk?_Z-oZ$nvNc^;pJVMBRN~hr*Bp@nW(_&Y6S)L1J4=^5>51F(OO}7q)Ti3b(h`X z&w!~XW_Ql0At-iXddTZx0!L(5p13#{)TbgaP6EWKMr zIp60CK8JoE&3p1{C@K|wcqk!HeX}~_%7&3>nBTtgly;o&k;FB|vHh6`tl^6y%NUS) zx=eZaRM$R7mbdtnwR|U?zXam?p;UkIEK8coIjZQ8jrw7N(VwFf1*ZjZw(Ceys?I)#VNao9WZ<+G$QUHaqxlT~H?p<9GP^ z`26*;xyxDK6?eRYR+(*jUR}=aAhDy{yluM?lkYh`DLoLgx38Y|_)0Tp{G#aBna6PH zrwkac{0W2pJfSjrUVAP+mKiFi)o zu7uYp+LH*&n<7l!>HQFPlwAl-rC!H39C--z#Jq|WB=@`HUIRvP%^+}LL4$erwN>bC zTfT8^d3kvTk9|omFpk9|Iu1VH`OFGlFMK(=Shh4rl3&VDt$Df_1fs8up!bv=*=k8^ z-ussA=O9$f+UgXKgR!Sfx3Y89L6RF5CKpu?0OTQlxkxyc=pp6}JennK00D%^NNw^S zv4LcJ3Yn?q9IvUEz;?xlj~}~!#ebBUhl~plG&n6DBSnrQrUL(nPPp#u5ecJLLe_pdLZhw;d(`AghDQixE|dI}3D z3A~)&K1LwfK&NEDXaM)#izesNL0u+PktdDmOflcV%~SN@z;G25HVL}*x)=o+ZZx`b zD7F8pYc&9}Xd^^BURptl`SYOiZA*1Tl>%S%hk78pOg66xINt(zR27aRPRk-(C{P>R z-~~cDEJxeQ!l0l8#fmV|1AF_T^=$09CdMRCXd{Ea&Gy^kag$VwBD?r0H0g%2E z>dq81e8o*m068qNgRWaPDR9fA?Rl`pN)Di6Ax%9*^=$__%Ojg9Bs-pjzLpi1`;{p~ zp6&{~NtfTeFXhdY^VD5Ol`WZyJ&aSn08b?e6^#}vAavl)ErOtOXiswR1EleaOD{7y z7Ft6(i~nnT0K^q>*GrJ2jJa4?tid!>?&iF+iNiVM`R83hK|$@SbM{kb+3y)yEG08A zDnD~%#3cV9`GRsEMD#D$q1ilHyK0tb)`YtwFb{ShA{!3WD4a6NAaq4tO?Uw5*ne$KV>MkO?ZBFw}g2v5@LkN&ll^jCVEqx{DE9-SG!ot4Qr3EM- zX%n9!%7B{tn&|714M~QDSN08_lY5J6P#j?f@sQWQ=D16gX7j-<_Clmk zI{9g0pCc;5?$;$}WR7WS^7DZ0ePVh#AktVnE$-WV3xcb3mc1eU`_N_R2i|ZV>&dcl z0@&2UtG;35$OD)412N_M#8c1@szJC&S)hfT z2&2vsndoz z5aamcN>u-jWFXw8{x=XtViY7$JMHPix;Ky$`efO4PNKchG99Mt_eK2Y^>@p9T|r?QYzY;p6@BLs4m#r@X6YJ9Mnl@E%}K zN)74>KKMgS@62P4a?G|KqGHS>h1$hFI}tD{`_uXW4xrt`ESMuzd8-ae!*@uZflD9w z87U9n_@(`z9NRu-k7H$mT@N_vNwE2KKG%Qmhvw>J-kL)xQ=!JTl?Jd8zzR}`4CF}4 zsBeH+DG@e5i6wi$$CuMhHGHDFp{FrmF-CwpqnITp-!z;5!I6>ZvnFR8Hbt=D$ayHueAnmBLSMZ|=p|$~PhNa@Kyu@GknzMj^LieuRN1+7n z9UBAEjuNuI1xUvMrI$=z8DLOv$}0ufB;U&mKxCCjc(g^?oh47}?Vmwh4FzkPTkPzg zluEU6-Gx&IAmD-G2{ltKK$1qf3*<8ewnWa4KZQG#Ee%NZI#->kH{0bH&=Bt2X<6l@wo{f#d5FI#e-@ z8tD=N;>}|>_CFyqenmY~;&#Xy@BK2Y5B|c|R73=iP+(T-YQdp#25KzCD7n_H+}zw& zdp`wAWoZ`=h1aBeELfe^$VnsWUY&5=TPYg7(J zI9HvG>C+hzNx@Zzq#!pDdiTNx2}Y#YlsV+{y)&z4K+y38SyfL79M~Yc(m#1X>KQL# z)c^KC)I@wp$DP*oLoi}TEFVTc8i1nEYMub?ICgc=Zp372GmWz&ceaq}&}g{x@xX<4 zs9u-(yn$x2)By8X;H)=IMZVbP7nufn*ie5zI6l3Ksjw=zL$Hp{OojEJxG~Z|mz0O* zGqOB$R@9~?o9xxQWO|~oZq*PG`e)1}(_fs5gTW;)W)+zhCzT~ZayyI0?=}-4?Myy` z8+vk(p?w_|-Vjj-eVLwKE(Ssv8@G^p`&O$?+R{!pI5-2EVWBrX99_9|jff>sNn(JB z0G3Kw&xRC17*&iF6#T@mZAM!3iIZwF6^+Hr(o&)N#|UH6?cse58+TZMW=MSP9z_Z_ z35Vna7+Axo-wRvx82$zdnW~ilzgnsGG%~cOP(yb@rEYj*ZnM#bL5T*6HaxU->ZeEo z)|i#m9+C%7g7YqE45BJT63rM5ZIyyT*uZg2Qz;1XgKu!^;XRQfyIZ&H+U?sfmZ~X= z7m}xbsuF{adW3Pc*v8lCi*DM`>gBiy)XEw1$yA3XjOaKJ%!_ruR4eIf_fE8CSXqWM7LGu4lF59EvGiT zPyCY}$-08_k}APYgqk|s1Hl+A&QDd-cO!n9ku3)dQL_1;{rty%;MTG|S+2v59!%`O zGa}w46`;BY#~Y6u~7^9C>miN+RHIUB!wWDn?WD= zfZ=$J8eUEwh8Og;NDHW*J9Gbeu;8UQEsWaL#lP_3-gg2G=o@dO-JmeDXVS>wro@Aq z<%zoieMn|@wBS7h71fuS+@3FI*s8YTb}dsxCA)3yaPQ9N2R-Qg1er=^WcwCTEUXny z+uDZWu*pOHxaBS=&~6U@BXD0BV%-qv3x5_#e)UXp+NopvHq+F8!#egaP$72AA-Gl) zLX!0t|7f`3Y`s{N(#ugya0;HsGrswAQs&}KA8SdI$$A`cAUTcw_yxy+S&5Rm@K%r>4sNtkM@;*Z*Rx!sG&KRccZ1m1 zLq(~Q_d-TD@GFsbe#C5eZ@o>~KJ{y)rU9jXVWYdKQiEwJJGMZU-Y*!=mtVp-pPSmZ z+u85 zFWr&At80eZuzdXwR_mF)cRC>hbX^p>^gAFS#a}9J$jZik{N#% z`|#7C&LjMb2WDOQ0}WxND0uPyZqI7w0@u2@xU2Met%CaZ)-usIr^IUsYSL~?quyyI zW_?8d7OF{L*Q`5TT|R}S_v*aurS}4(-Fj7IyICjhwP|Z`y8$g??M6T?tSX zY#y;ztbjhITtXC9D&t@vF>T)RkvRRh{2*l@8$+$Yrs87nwO^V%F5SnEn*@f;hPFB0Tf-L_v^Mg zlMOnX=@vZUoz8{z?6IYdX~^Y$PJnmkBQNx0X!^6jp!1Uf*C-mUEa{` zD0v;tUlLI5LW>a`VxkQ9g$$FV4VbK~cJ7gc{IseC%Ni`5O0^|BgSDO$EZiFN$)w%S zg_~!;TKDeKi0Xd$`AGNZ{mT5{XM=wFBVprs`ZU){(-5bG6>x+-}txj2@)raaiy<8I&rvC;Hvd6FfUSu`tyq?;?ZfnO&>Ot9Fdf_K-YqX8 z4;^hs=e#x+)ZbwelF`%4YHmMfAurg9l`7ti!HIi#?3O)@^cxJyv_BRwyLwyc76LxN zNcqFA7s$=Rp4`f?Igp7V!xfn&H&h^0We^V~?!|01aY_K8RLEP!j~r`;R$SED_cau? zRVp@ERGfgs;V3kq4AVQ~mBie)W&1eF&_~jfU;l#G17#cZQC!%RIOK3wD7_{aN(~6i zwzJ%kvWD7yKgUm`wm|kZ^b);ST+gqEHwN@1m|QG|oF-Zlwfr zN=Han<+LvaKlsk52GDrR3)0S2nE31F(JLIb*Xgvmi)F|kVx)In>lKefZay1(fC+_O zy`+MT?^ZFYO0M3oLVNMbnYlC-Ov_t!p^+%4%y0&vUB(>DV*NyJi<(@1u_q=LKSMv>O2F6W#}r zk8F)fwX-HZ#K(PAhnw<39+Szc5{$Wy_Lh66I-+j`BYwW_#facj)Ii~X=Q9SMurDD! z9UYy->vlQ65%s%U1*+^_2NKuW!O@gL7a=bR$GA3vnQaJcJkcp1A6LOCCPV3M+o7MH zfT-wGpFCCeOjlrW?qk53X1ik0Y;FDz$>}?_YE{R~SGVoa^JM6Ddria(F5vh-lVqCr zq^LaM$df!0FE0Ga!?2=HnZG|J$Z>RoAO__mayc#sKk(ZVqNY&;qNv7g>u;CSwp(^k z!a53%&Rw8jX1D(p`ROx&-)b}9 z4XSQd*IK>$E9k@jOo(6Tl}xTtdAVLSaN~en*-W?-|AnLDM_6^Lg^$S07bmU@yL$iu6QEQPf2MsjIhZONhaZmjHXe_z+lIKfAqXW~p~6IYbKTX3(1?4D45<;eeUuZt z!VL=lppXX5>yrsnCcm9>f6S}0yN(^`a55qr=}ZljT12R_Y_tLzwe&>451`3Gf(q@s zhuBdTq5Y+$N5=NCjqt@zHMr^(@>3z8Io)Rj!M>mmA5^c-N+)zeyG%4pYajJKxzk|HC2XaNYwsUuPu#?C7%^$R)fJmHNvoZ_*wPK70&WU>!+s;a}SI| zbOnj(e|y3g% z!G>emn5-9g1nI`w*%P-iS1nzbIu#^u9AH&wDm02zboO^5R}EsNWek}+KzQ=JxtK4H zcEqusiq&m4+C!{d;47o zE!r+u?@KgGjPw^0EZ{$yLGn^8wI8o=CDOFmdEArOcfZZU#zy(Bh^P)qt*MU4TB4bc zhQrm_dPaHaDr(AY1YUySV(J^bCqLb@D5NUEAFk@{NkkN*5@Es3kf*rnPcjR(5(sGE z^R7a_(OaXwA^*WqE6183v95M{W3eHosd#9vcnv+*&?ceYbj#cz@B)H0?~2F$qzUi0 zdkB0eO`Ihe+0XGaCVP_qYM9}AAJaiC@lvImUw)1A-eHZ;iO^r=Xt|sNSPWmno)T#i z{57{i&@No=B?v>j!y7h?GEBrzh11j1uMtrWh$0dQx;Gk5{N;fh38Xz+p!=xnZ`v}y z&|<)?hi~V?9}$0*F1||#k~nN1IY1+LwC+0OPVb#f3t$P@7uhZ$g0F}u4?p;TVeJJG z%mnx-_wxYi1-qsre-H*h90tnaN;uyjCF8sb@tsFAc3sUtdZ)bAzSZ{F`jY^j}(b~W^^YJa)UU(A7J6p54jqo_pkxK%CG z7wjQg*I8q!C~=vYhM)iy*k`c0>%gIHXD=*wpWTLV=D*-z9*c_0K}6?^K)EZv;Adr4 zX;!2VXj6Z=`>VD+Li6!8v}RsZMtK4l?7a}3mA}s+LD1JvN~;jajDL0;4UkIBL?$V)0tq1tZtf>QDZ8uP#!rue`N(`29feXPf{-o!C!59EqKYv~}ekf(X zgXj?F$(Q9T;hybtbX-$xnF?KI-_e?&#ktasoaxKwTe>;PkXpGs z9GY)-t#aGfi0KAjk-yK0Esh~nE9 z1kF=)uB`t7JLGYHV4SjQ32Qzbq0GVdw&}erPwPPahs~B6Y|Q5KFkc8+*T{j^*F9UY z`c82Rva$cZP(h*Y(aNQEiMfX9KYk}GD;#+a9AqQK%I{Q*X;4AmG^qJBuK-@5Vck3N zNbS~DzOS&mQre<4Xt-u0n$3+dnEZr8)4Pb6nhCU4jg{!%Se#0no4O#q&%fE6Dv-~g z1tbe=?Ba_`-aSQW8Lj`a^#Pp5{-S=B7@pra0YmW?6{U=d?p1Nhf@(Wx`9%gBimY{X8e_?~2~bP}w2Pie;%n^*roc0Z6)UnQzhB{JQ=Z~a+CZJS z*zhsGJ5-eHLw?NkYL? zPfhyGb^W>3eOt)KDlgiNg-t8(#kAK&iLhtc)$RsnWz9RM$Ap<3`%EYEMccnx@9F+L z(Qg!r=w36?3aU9-LAuKEc6elFf3ofU+O*x!3=3y?k|e@~N40Br&e4;<7=j(@T|xj= z(0Fn~ffMK=QZ|92FQ`}7YgT+GuZimGqYIZpr8f-k4VgX4ttG=0+7%`41zG&w?z5Wj ze514~dHHXvjk08LHnNKnPWSAypRti_{<WFFJ~!_eMb4V}S!K7n@5d=}Z5tT?`)^ZAaQQDxQq5lx-h1#nq`G~>Fh=F1)?ILTWF-Qum84l?)yyC8 zpsfmz3i_YmrF~!szT<0FTTT1Zzp0agQ{ zZP`hpZuC+kjy;)@ZHQBIVY$j<1I0gvH5^457i+nd70tP+A0HIW?0Xo0-^m%Xd3dHC z^=AA*B2BXB=qm;SBI(R)Y9rt}*i~}H5RB*7khUZF;fH86zoqIll&Qgd-fI*s89OTr z)-u#w&CWidpq)zcRuPpW!!s2LxHa*HZ{qevzB z8nh`kIk@;i8IPR!&9ZGxg?{N0_2+S`6S5k}~$pby8lf@T_FaAuTE9${7~Zl(Q2#s}|B#K|j(k6Bf#B*Lo%t znIIRxIeBq-3p=Cc*QivSY4vt|FwxFRuxM6vzGY0&?VZi}11ut!U}G#&S=cs!|r&Sn_%x|M=uc3iUH^^@X|<@WAk zeOfrkx~yRd!M6y;x)$*a{k>}h&-J#;zBW725PRSt0zRXwXrxA*7~EIJUGO`_--(KZ zz&0KcFMDhWI)DX+_1_H$zCDwA$X!pNk@6n4?LH&WcC6lNMQmL;nz@;TPKNOa#7QvS zS1Z7AD)SYtJqm_XA^<@*JRF{wr5e zTHzrZbwukb_uDKs%hcIfIuMnEg;k&;qdgGJL_$i+H^@etg+Pl#QqIKTw4G zD%Xp`x3Bg*fZw6aig@)_zxqgZvyl@;55a0ClzQLiT408S!Y4!xw@WYVMS0d>{GNr0 zqg!r)H9kLGrQn(1VgS6#9X#(P074oJjTC8LhyO`7&K;M%2iz6R&U>%Fp&s34*ic-7 z(huEg3;gNb6I)+Fc1k=k$T{|a#QxUe=`y`U4b_U}!6MXuo#A1%$&RQ=2y)oI7S6H z(cR=8P|EnLS+BrQcJiy%y1u2Y()8Q!Ia-n^fWpo?O+p)z!yx2MAiT6rufj}Hkl}T1 z$c?7uhbTq6`=Zs*?2cRHRwdNWxO)ScR(2Mk9gZWizy0JC;#JQ;%#Seoy?qRH4Utyn zBgqjiS)<0;KX7<~AN~CK6LQU_7O0emv4^SzXlE^Wdn&QO@`mYL9I3t^36}DRBZryX zuMksBZsY42m*oh&2}q9*i5x0ZGvHy^3yto;DK-i5>*qZV2b|xS`9iDQjN{l-)58J` ze@TxTQ&)qpi~9&#hvB_Py56neEtUVF5r$Q4)F&AH9r|nV`|QdmFV?-UU+vdUGPRj)+m&-#Y{{K;NOmRO23ixM@$}e7b=>(q zHnG%~qZoO5*R#GC5RSD#_CplmLAt7`vcJu>{@qT>K1JK9tmVIR8`O)LrUgG-!HV!* zbNjBCGzx^#yi&IKrYdIoH9JU2^0~N@W5t13JuEvkDjM#EI)iu2Bx+LQ$fj7DLODwQy6HMCjUOM6KEE{o zJ*scT{h8u%nhL_{ymoH$u=xEQ0jYTuA=b!!IFsbQiVaL5ff8}IcfDt~je>qf^uDa;9G`!t zer^1(AdZZ{frWaau{Q{2UY+t+?4YfN^h_z*I3+djyu80``dPC(^yQCv`5Voswxv+6 zhU<6(TNB$u(NI>G$LUYR5f@xfBJ>s_TsI%p>9gKWZ}lSD+xq7(qTZ_m0I5(TkC38( zwAhZ8yKC5573+=(*htQ;^c$Z4&Z%DFdU1why9ogK>E#0=&#HP_ZJt>zcyx8ZGi>`9 z3x8S^_hdkxO|DYcyo&DqjC}wr|F9Jyqowk&x|QJ=52;Y`Ox*=I6ZbMqJ8ABq7k6SryQc?9b2Q?|104RLF#=P+@0d zvV*$d+u4^c-5dKXPvWD0gjyBf{VNd)S&Xkgb?V;Dt)tFx1iWugrZH34ZAUNuv_mcl zTONU(F24e<@9s7>;X)mNk5FZQAoRdA<_QGEe>`I>q*LcW=%#>6KRODu6-RnG+9b=I zG5{Q#kG;>%kr^HGCX%+V6!jo4+GwaE^J}+`^^Zm&2rhsVmSM{3#@~pBqmCGAZvmIY z3MyAY0685!PGC)9y=V(P|IPk>MYg3vbCw5kNG=-tQR4}I?uaE6@d2_rJCiHyCA{!@ z+9`9!Q8#KDPoj7}$S{Ut7!T!`94^8A2Q&J4>!I-ZNkmxZIHdw;?X`G`^yPfBAC(X# zgLlcHFitfd+FML3v7%5Gl9cjL1a36}-hxG`+Gd(pp`JZjK7#ZiL*>g6i4T3%iS9j= zB8<$|Ay^(SVNrQ{OOeCkpX7QHO>&%+QP3JLaelt7e{h3gnL}ghfCa}7HYR8T-RgIaAr3%Cq*EkVd$!r`Pm>bHV;7ks6sy@w2O$L-S{Sr5m zPbtq7)ht}mu)k49KInl7T*UX>bgOAp72}tWdhO1}8m*U|ZM03$MZ{rxy@V`LF@S)& zcAb}h-A(9Qc?u=+MKa5wW41rDn@!Ql;hPM}N)+AlFJSr@93CFN@QTT?0;pyiA)wfb zWdvOZD&_shEBCF@Q|-voEuZ{h5E!f-)Sz7qaVbHxTC6{QICuJvd~PS8lzFu={Byob zzPz*Ekk={KG|Ngz@2vK-P%0}L@nPyRlYnzi_apACmj%ki{R}u?-@f=388`{083b~- ze)OAIL`Fn#+z_&e0XlOGTiy8R!kky}S^n5-ZM5*>8qBcdW0lR9#94qmwPeBUr{8dd zpvOT0r+iXyG|Cf!mzVjf(xF(J{E*cm34wIH?OZd}yBfoL@9^KHuiMUk5ulDRRUnM+ z$A3!n{ob2TR#T8S-A_CBT(_Qyh}a?NplhEfpeO3?rwmJrCxAL)AkAU1vjSz-bbTaE zkL#SHbRE*-@rESG=V+EQ_1Mm(GsfGxaWL0_q*!lHUh1XrDX~`OFtp ztzrN5_a|6>%7#;;GVwlqi1C|I0wrB|%DIF&(TXnQQ(~4t%5L|^%34Tb?!CNQ$5eII zpzB0@*$VH1B!^2PwD)eWmk=miR08XD;#`)#p9-n zfMkI8x4P~yr9W=~(`Ocng+3`RAgn33X>taR!u&Aa1RyiyGF7?gFKDJ}d>t|+CYao; zj7*+i? z#x?;c4!h>4ZGIqY*#ek%&T{ zVts?=4`qE%mJ!}bUCKl%a#9NTH?A*U{C0YaDn`tenN@RcdZqzTfknL|g`IccZWBBXFA=w{szfL?1e}@KRIx$te8G_*z;A>3 z%-~xFMzAL4E#ga$I3p=D)iu=`F0lS6miJTkTDIm~aOnvB!eGNEP#BnB^3H0QpbQKq z!mOBl@QeIOs1lUDC_WDl7Ahp0TgPab&m4JX}_;EG>izbR4Lrvv_ZOKN`~HB4I8j-D?W) zCORr2e@>mLvzzy%g1jsF0nW^%V3w7O{@w5l)G-EXYN-&yKq>06VHvCB(lvY^r{NFO zt9R53@|fd3z8HIuJ@UDQh=zrj@_sj$U%Sa}@rS3LtH^gfcmv~VD6~=pu;|E*u(@#` zyvSz16Ty@{X-b&+%ajvgB#2q7{I_Mm#TBPQQD2OWyuA$UmM})qCLv{O3ajm_Gjx9&3})S2N`esD5jNR0 ze`OX_89?C(X&%UOwB!1?JeA9dQOc`vjNvrj;AvK1Cwq%EI;}Nv1Vae5X16iSS)xqF0H#Bd|cRc3)L&_Nbx>&D31v_)$f3>;Gx=5tz8^LfyIfPCqFU=hN=ZL%*SuDGNBJ3P--J)m;%le ztqwT2w`sG(y@2%|#HgmlbGr*lE-r!B=gj=Mjy;a{QghJ4XhbJK0C*-%vlz7~v<#&b z8suiE9=JH$Oy)*VAqjK4aSH%{z%JB}%55jduw=-vaLv91?}j90s7lIvC)<~+*{EAK z0lD03{PX}33mfAp6vjcY+cMu-Y|KbXLYDXaG8D#MhRxv1npcrz_lmfKzMalzIn|OT z|9Qa}q}mg$bXgl(#-+3;?wf}AXH@_YCY;B-$g$~pxLoPJ&+1Syemjdm*wLmp8j-|d zb?ZLwFdpxRBpSOmavXFUW-B&6t3;k~;uKUxLCa$1c$pkELy=(*;sj&j5fUpserkMe zd8n}b3fI~Zk_U7;@um!raJ)?3mCJa<2$=^IsGb9(XY{t&_Csv}TMISd3oG3@r1RHW zM-QP*O`(?CxKjvTxo`?m!$Qqe<(CLnA{>&{@{G!@IZJ~f&}?r5m7fm^;Q(M`<#H|P z0_dB&bAN_*8MnH`{jcw7iaL~48KXuG?&f}M17FLa$`=9ej^n5#i0@J)9twzYlPQt74*9~ zdy9Y3i#ZUhU5YA|_6xmTf3kFNn*TIqxQ)s-&gP{!fO!fvLj?qUx;uw~QDQaEYljD{ z7N)QC_}CVnB85|zD|?}`3t@LMR*-ekhJD+wd2qg1g#1)Pr#i;^O@hmvF?36U@$^Hy z96hjKz;s&Sp-w)$eGDGhVS!;LVAkVNW>Y0HIM-dIQ7m!x5-E}2rxG*Gp$8|=VM>Vg zBmvntgdGmNmlhMiR>|5dRo62#d&`Ot&l%BEh zl5nZZH$&z{6hzA2;t5P$fga#;JF^`#6($T2%dasWJ~!?lmQR;yj|B%2kmA0Ir7PvB zs*m3ZCKrSJ$Fu#D1FAfe_>1Lb2=4+(kD|7<(C<_Cnq%APQkaSQx=usuPuZFrUXx6y z-5Z4EAJ(96Q%4^M6Xb>=Uk|ur@C|I`6i(2bXqo>$kxWy0Woa4AsZvz95GU0Zlq7lj?X*V(rMG@*riaZkvf5e&+E6<-=cs`YaWPFgCgbD{2~V`2vqT)*Wn~2nV8n6 z2LSF1zXy0PFNpbUG*`V#v-f;J+5ESct5#?nsR{sY#3s|~vbcmOMa*dOJw=19MA-%} zYxS>s9<^4&JYLD-5?tzR@PN`|z}m=@zFaI7wn-v`705edixmIIDo?Vm^ zPij60EttjSt<HuXVe-+6$ftt6aB@J!$YaxgK6lfAo#9c zmAR>@pD51t7uOwH`SjaW!eJl5>J zL_>bkaM_B5-Phwgv_tWP(8x^9>s#GESedV?^_sPll-EMJ%7$lN%>MbI`qOEI0#lWj z#U&pB^YgoWUH{vKt6Lo_{V;VMWc5AOx3P1QirYIczwh9GUq39=#7RCu5CUkQ8bRo3 z0NV33IbrQ<1b}S-Dq}bd7+gZ2>vE#L6K`CyKtGhf#mX=1^40N$Fwz*r>b!o& z0hjp*j^ey~=Dd$ZMd>2s5Y^Q8{f3$h@ASTHd7+t!zw?C?K1EF%sp4My$=76hIbmnWSBO3?_o;fG24~i0Uiwjt9M^kG}%s zFF$`5wkPzKp{#5aYc~;fvS&E|dJUVF2fpAwh>VJYf>IB$Ho#}5xos6flUk@l-q7)N zPa-0@hJX($=$SME2V3NPBL_Oi-oQP2KAJ$OVWD5D-Lx8SfJo*5*hn?V8r=0iKC%F8 z1opy)_g+8;)2}nj$57392JAk(cenv+@LN+Jy+!nZn?Wdlnc*h!b^8_Y(#~tkJ$K=j zG3&HcA1CkV3L5|5rb%OS1*LWE4u9nz7Z#oR51UrA5v)Z*12KjW=7Y7BOEeq zLkOnfh^Es=L)^g5{e7@DUCjM!m4B*;?~3S~1df)WI5;blQ~FlH9tqn{5dZ75R}Y8f za_r$x1W%#rE20bNF^uIw+~MiaSeE-}Bi|EII`^V2eSzChy#kxY3~H!K##DqO7P2Du z2HRR~$~&*xuU?0%Nr?Ln=$D?r-{1;Ye0Dt2Q|wPrZVAei2bhkSZr;q*bC`uY7zaDK z!7NhWdR%I1RxnIY$-p2EmLH>oP#vPtuF>l1P#_cz{ueKxk@=@8CgJLPC|zGI=7hr* z$`ovYiR9CaIb-vPt({}>?n+yoXu(DA!+&&-*|i|b5cf10dH2IsxwDgZ8M)uXM8bv1 zO(L!QLO*3C+A>wnK2yD{iY-q#?2QBrqt;NRlJ~wxE0Kzd2C|tl>(@41Q7ULU0%3xz zVaS~$nHGn2I-j-2FSJFSw?DjHA1NEDNL$cX7qd>~Iin~ZgB2PQXM`np&F3^!6#P{T zZh5UA9Sv^7K2V&?B49W3k=7=o-Z5BrEtG)arfP2F*AIH~zQA%}>4GtiguZ|_)y4Pq~`fN9O9${My`OY@6CJ1Zf73p8%do4-F5eopZR@N zVoP^+$Z+QRy%XDepY7eFp|x45;oqE3xgXOAM#U}pNnpC)Z%F_IVG`a()!BfwF}8J@ z4bx+fxs&6h_3${Rhjeus|8G}l`XuAYS1&KSR&{&jXTk(DDh+I+8pmv=c|vy54lKu) z78iB%_%=24X4SNh-Bh4KW>D%18#BZUyXwUnrS#MUdf?nlft}rhx5c>GT$v~ijt6Z= zb-xsHZGXpByS^7~JO1hyO3i6$bFQw>PLYOT^F`g@Uh2lw$dD&FD|Yz_Rq$12ZMG)5 z4kq(C`Mdl*Tii*nG{Wf02Tht!CR}-SUv*+*NJc#0UGv@zt?ePIVY9AH9>teDh-}H4 zG&`p@qdXUTN%siZz*o0ej_u*&0nhL+yyOE5ed<(tIF(Kg1oTPV>O(0A5h zhDJ8+1Q@`CQAdUtBok!PW-Rkyc!a4M08PvGoJ=%OtiycWh)Bn>Zkkkw_4d|vDwbSq zLY`J~lsO~>niW$9V1M~p9P!evOpFwaK-3sQBqtF^mKj(RwG#af3%-~ROjfMh@W8^r zE*x6_+M%qd)|?oyJWgp@{~MA%aD;^43JVZSNq^~+bqIQ6ZeVJOLDPX)#=kQUP>oY- z;dvib$g`H|Pmuh+e!`Y`u9Na`!Jkkn1UKLgDb5>Mev*el=QWIV8z0EeRb?i9sp1_p zshg!RpTpV=(71>{kTpx1jkl?y3Q!t_nw@8Go~c>Vg-lg)vKw?daMv-WK=&ZTMU~^Z zzasyD7ARKNbLb5wP7&{1KA7>oxzevjanrt*;Xuf3qfGB^YON>1bY=4pcQibU`SJMP zzjDLIkA^GVdWMj2M$;fjN%~||KKbq2H`oRLn|{S0GN51Z^7bzYQmpaA>x(_uDP(6- z#_4qpPi^Ux=w|(FKS}d8>S}EdkpffI@%AJtJ9;5j2U2?<_~e8F+;FR_34a?DXFPiI z3r(*gSfW0ViQsCx>SZ5)Xjruwe3C0O#T0mD4=ap77_Jvp5^2Je9H;|(J=@!y5$M?n z`zSWumuE7$3sSywE1LU6>Yd1)xc|8Y2v8Cfaz;)!3!>A8pIWO zdots!ITQ0I2Fl^pdN~BJmw_>-^}rcb8ANv@q^_sRZ#JKK3&EaOz*86^v_cR%1~(i` zMES#>7r*D>*{h_hA+rMDTn}i1j`%bL&AebCz^QW)brGx|mWAmn6((E4{p3Uw$YamX zff~z|lJ)RIHSD?#z0Ov{1n9_B6ZxRP6O3}GzcbGo_K*1N)-$}ta%02B(&r(vTkbYq z?89o!a;KXV-nK9*h(Ex6IFw=G@cT`D8pxQi;;_-NxX*El_YWE~JTH#L&qtyN#4qhQ z!>Szw^u#Ig=-oE5;5E*z^O4tmKwuK|g6{-1>j#w!zo6lA=;dX@^6=D1Z=1mn<|2fXfABwJQ?Rd3$#mgJ34-hbiX}b>oDH0 z8BP^CX9E@;>xOdzsAUq;3_WdaSkEXK>tFqm?HXRbu-3`)$(j_fj0@B?eC8>0W zNP{#;H;8nHG)NxZ#tZ7a+z# zfapihMc-V;eO3#eMo6QMd-y1Or*f0C(XR^+0Kx(gW-(Lc> z@NfDw1mL6O{1gLZf5chv2>mtG&Z=1bgp4*9r`i3^0UoAzHuKXgSPswVf~lQ+5O2d* zWWH2Vi>NJ<2(DJ505GEvALgQp%GFQI>Oa%>0pd>ZyBAb_y_==qi4IkPv=YurtGe|eyw-cj-%d|XkZ@8xV{3r^%s*H_$@ucD|d~|2HU+m_$JPN{wOWS zmFs;3lY&L_F?0mC5iFW;8+1F>*L)pPucS-M1{QgiV#h4s zg*T8XkD)3?_NrcPr5n&tvBv%CyIs+mxXS`;+*70a<=l5RfO_?Ar26^8w-YW3Yg-$_ zDmxE3+#>VkcXi)n44Ei0=1#5gM5CuGmdNs=g$mN$dX9fi=g5y%veOpz{k@K%DwABd z*;dSgFMR5-cX7)A*Nhb-&*LY|dUuG|M^Nfe%`!pi;UF1vnr$K-p&0iWypZ2P74{aU ziO^8IclS5@^`mNHE}j)RoV!roc{ejnH^#;9O`dUW)OsLYo57XS{Lr>pee@bsR~n+f zQ0sf8NQHgY<&&_}c&DOltf)lz3v?;|N6~GGSmGKDk8wcmRAamQP=}yxTRq#cL7I@! z(q}z2Yj|z(i6%dFWt)T2znJa)@+jB>Y9Hw3b2|>LG&RB_(rpIW-?uBLD784Um-faJ z@u@9$ldpe_-Iaay!51pmTE3NT^eY;nc4K^pl3uupPQ@07YKuRdk$?_Q%(s)Ab>eK| zQrSd#8qv54ax`gHk-s$MmAy;coHz5H+`v9?gw;vjF}+bZ{Rlid0PsCx?5kd+0wUO}}KhiHdHD_yTj z)EGB;-~I33dnHXRf`|xLstaWr_#SX!!$wds!?DjvPF>Gy!*H^E$_^T>i^>2Op(cM^ z-h^aCZrqa@hMlJ|s?n+zE1(uY$hdD%prP8rO~zP{L0v=_mVo6Msmua)dEpDuA0Lc@ z%YF_Ce$BcZ`TWC*w6AAv-`m6b4!%>5{E6G@ULmPn)t1q+DAE-{yf=iHufJ=mW)9In z^g>Nk$i+_>>yD!*{}ZGrR4I;EvH=~dIA<|f2D+UaBiX~@cANESz43Xa2GykT3Q4AJ z)#Nc)r5!A3&8!38`TzI9|Bq`&VQjG&p$p1tEY=0M7sA*QU&2j#Rp#B6+ zo)^9dE0*UoL&FIjOEz^RCX8d}9~UFoLpy=qic{j4u_2V}--uSx^qF1e6lDmxpAKh4 zd733U@sPb1aUpRK)F+BXGuQ@|X4M&9~&C7&BGP*D_8)AJ!%jVVAybXU@&~TywyO(Esr{72!`ail0R2Dv@=!GHB4_k+3w{kWX(`N|EaM9! z{~lK_!j>4=f{GN=|Bh{Y zqT$J-aSK)t7KsHTj@kxVt-yT=!X3arNxfxt$P-0~_I zd!~D-GHX=n{opCmxgk>uQY!4FVEOT+eyec_!y)p;W!}vP`X8N3IYZ5`R$pLOFynKP z^ZO~D~;C1X%H*(QQ_dg@#4`Sp*;T{G(lQT1gColY0BW7Yv+gMIg!!#lGSWA zfoM{{{Aq3}cYRf(b?h}S8IRx>M8)QG!V{ZJw8e~>L)B7BhlTv>g(F`t36G3s^XAP@ zVR`lEdu$Wohw@~`=88}CwZ^P2Bjn+iSL9VFIjaHf1D|!}Ni>U<(03APBPVNH4ATws z-FqaO1?NZ{HCBe^H=s3{~#Ju znpSdNc0fiJ*T(>p+i7Y26D7t{yW|_Z280fTbAp6od4F;eNtYdjR$h;93+{%oX&fr^ z2UhGPg_icyG_o=tG@ywgK8;=ZMXZ<#>7Vwtvyx+<&cNM2X=J!OJSuhx zP*a*C88#j^(Bi5cANd069rZ0<(gQ$dVdsKRA!2*$kjbkYwJ94+#p{vd+~OMb^h&z%+kj%rlT#iWhEIakO6mC=g#is4>zs9GFTFg0$c#q$;BEWHy@uadAzQ~f zhB@Dl1Ii?Kk>6$-E;yY#3x)KNgy~z^*vQL1Y3|}%$7(iKC$FkqjU7IM76zy(Kq;_$ zZVtJ~Iz(2zlZC-Nc3+7p1x~$~vJuX-80*g4%7b+3DJA{0!t10#m*1W)gmf;cp?AJg zW?6BX+afJSRlTJbZfL<$;V55f$o(g%2l6Fz21$}F`i(?8L*uz$hktGY1xTJL^bKMB zaEua!{CUImOBS6Rg=6!`3){LFs%|@Q^yz`SjUPj`nasoQ+pP*7AG}}RYYiTDm!kz~ z>F&(gw=?&bE9Zl74N>hCyGb;XaVT4LYlC$`0S0<4xiQ#O;^(GS#;s&~8GSH?;tjQ# z)tA5n0nvId+8Kd977q2{fi&Gld3i9V5Mtw^-iuZ(d#T2jt<8U@u;3?gA{kK+Lv*@N zw}T2>7fI(G;iAgNH2Bc~?NA}XA(62TWbx4EAc-N>qLOQSDqOvFQe+`lGG{2#!EO)$ z4bC{Fhn6{MVP|sL{<9%gjnqfV%F@hH1j(aEbJ#SRf67-rTxOB^ahw|XW-zi*#|rr6 z2+6u-j99Rr5aTl_8X0k3)kQm2fn2Y04CD<&yZe79IFY9pv@@2>0d`7pba=2xz{Gm- zd;hwCfB+*IqmcNO#GimgFVHDwHxAA^M!#5=EU@{A@5izEw3|cM+Nq4#<&03HsF$Cr_yzY@-WPh{;j3Wt2lhGzGK2(wOd@gTUUxl%~+x zUM;c{B$eFkPpGA->C?~2%LJ!1yF>G;{0ShS<IVlej(hbaPA`LCC%%S(u<8I#i!RxjO)M)FNU5Ey8YX+`g{m7OV0WTMRR6S~c;teD8+3EzC{Bti{Q#_z!f2bq9C zk;}uFyzI0>h-EHGB(6qI;mMg<89+&zGX4D=Nm9V_f)VnW9LM7gGeERq8og@5Ns=%{ z|Kn<{A1DeTSCMe-LgcHaGBCEnT2TABLUDTb51nIp%I`dVc9Od(u@!ZVMXGi@9z-MyysvZ zKRtqU<~#NR7xvLDBjZQkhln+4YIZm_R@~YkIk==kqE6+XqyiSTed>!3Y@t5%9NhiZAlBeK~7^kIej8 z$2soaz>?`bmA{pC1t*RNw0dzB3t;TLM_l59afZyO1?ZADp_FxGEfdJ*;P|JznmX!* z3L98HbOOtHYMOLt!>4^WKd>d__nYIF7W{rAl=hQ4SS}WgKjvAUQ(J?_EubHroL_AP zz^I*$GZ5AG0JXA_D7IzNIu+~U*y!Ohz1O6`tsirz%@D1B6EuL$PT`DNKD(P_(|Hq! zh)UnSeL(jxWI*ax!Nm}}Q)^DfOeYw||0EFw8d`%`a|6qx(sh*S657`2`7v*cO1;nH zup}UJR(i-8$n&J#1pbUoNI0}+zKU~9!exk0Gua+{Z5La0f-Ur8FxuYvhNV^IxBXZ5FAaFew5f(;Y&hKCkB~D0AMl4b==)>G={wH5O z>wOMa*YC^(ZGKVUO^0?{`$tkk=wMA=p%=L?3(#tK))i z5lBh#!pk_`4_-6awQBhHBY;0qK(q{|0w?(!>6t?gOIsv-!@1XaeGkkB^ zYIXqu9m@yW;xzS^wFZHJA5GUNXM{#U(+iRp)NXGPeX}Us0O6EL;7HmAMD#j~znpeAy-mKFFpKANETih+usxaZz zr9OamJ%&d_GBUxNJ_2uaZjVs#=tG+n;se!GS5KLr;%{9)l4lYS7WRS9GY`u2gxoVw z20Q2JY90GjyMX*o4=8is+1b{!<(TqjX7W7tomXM!G3`iOi)4%_k5&6pV?P9Wldi?V4Zr1Bi~<`Q+s8 zt>TPO*lK-Zfy5m{?h)R{^k0g>Bv*PPMN%XH2G9Xtk0v|YvphQ+ykBMp(lj^{n$!lLTQPWQdlL%B-FF%Kbk(qd}#4>Osr7UY39FRIn8c$4pqI7A}T z3SVJv96vRk+-#nYbzS2p_WqDKtZQE%Hpwe+^{>#sFK4GZS@)c4%9ps>gHDBe-S?4s z_>);duc2Ef)4Y?4c2p_Ru2b6jyQk`wcv0$>&)7nlXITDg#MT!HPEa-O~v^&dPQ_ix`iKaJtGFx#*-*oeDhN=G7 z?Ym-U^%(!0Xd}(pLoofRB89H0cSnZywokg_^D1N9P>Pe#?RN!L75h8PWWNPSB-cCK zTQO>v4Bnr)Ez4s&A0}u9^pt8=>MQ8VFT5|R%l3CkmwIHnW5t?s(w#&;AzRa(7lKNW z6HJ@8ts&R>x(TF}P1t}psOkpS zz+!38lHd~jAyFL`t6PU|y_ZBAPR^}swQV1()Ygro?*Jp{XD`&?we&`=d`tK~@{c6G z(-G`%i0CB43n=T!R)enJHe((^;Te%HxT^x6Hj<`qPwRdBiCD$LD^|CXBth~rNQx@) z&-F8n5?xKnbT8%G&5zyM%jO)k4sNl|P@ob!bEPAY3VW9>_rTY^uS!U(1vZ^;k^&*`EF*qz6~%H zZ^K_epMfANI~%4A{u3@sMCIzwQF=`*x%7}9(4!z<04FX8NEN7t)r-(eP%^jYm48Ar zRaGAU9imn61FBwx?n|_{++_fb0DM1Rp2i)zfV%m8Z!o0)f^*nqqa$4;m#m=JZ2=N# zx4vumoPsL$54Pb&J7OxTeuaad;BFvwP}3}L1NH_#Kfk&}S<8-}Bh=2VRIDUmOt@<< z4~CaAolAsrLTE`hPm0*qo}#kw6#gYlQf5nq3PbLXKasheC<5J}9qn5_c+hn)$;nc6zpK ze!C`qmiH$Cl^2AqzJt+Kl@!lnpI!PA+lbYs&Ux;gRU_h%=ZF&~xdq=8*rP!I0z3?! zTc46k0wood*!hZek(fo|3l+gWq7|NEMqO*%$8I3GArg~EW``%2P{Zmzf6NfIl)8X$ zeRYZx4y4#;K7siG$PY8Z) zUQRzfUvuVb6#WJ3CJvGTLc}q!;W3D3QbXw(pPK*nt{@x@kfS3$1&YhLkh4&Fa?n?1 z)vE5=!@W1S83H?i%9e)6-*L~zgXR_}I==>Q$rMHSKWIJV?K~8`U{yd95qax@e>I3N zeuyc35!&ea1MCgbfSLIepch4UReAmya(xgWUCN)?_C)ZN-$gBtSd0`3bbThRpZz*4 zshTw-eYHB1=5Js+Fy}x5QFb7U?BqCeELkQ%h{haLWR(%Hor{T*PI`rjW@`vizDVcZi3FPmZ#8wa80c~Oa>t$wxTsAHMyDxz3z`%4K zWJL8 z)KpwFfE8N2y8Diro*q%a+a_u3Taq{HAjDv0-0DQi#eDONH&lj!EF)B9{75<9j4CiP`b+5(!xV@_;Sf|=XLSOqiW z_|ag$V`pON)_$HCpfWa4${81}jAtc21d?uyAA%%C-O}EAAc= z!fQ<>ewj1o_58983iZ@al2L_Lcj5- z@5NxzSp8YzR-A3SV2sKuD8y62}-@^Zgh7$UpL{n*iO{HEllneg}C}#c+I9|AE zI^Aw<)D68UVuKECA)LhSq|I*`6PU9iQU%EYi)r7(6up#=^nTG?vr#4fgDZU8Q`i0+PyLS%^WGTr&uu(mE2r;$V z6@_dyIJO#J1aqoIDa{`FLgG&R_K1W*J}`YRgL+JOoue9K2$pwHg!m<2ARV5!THgOG zK6mxFc4=iLD}!5MF-n7r20wL3V&(dYmnVPtqn+VKG{2v!WyQ9#`>Y=7kh8lR`^~Px z7E+Pn?W-;j)%{HLVB+THis!?3uxqFkgWx%dhC;G{TkKkzU5ptXyqpU++7jPGZAdCt zzEfC=Sh;1THJbSyJrm^xYA&dgx^%gXSQz0s63k2y-q5>QsYgXg3Av~}!_sxZHp^lg zdAN4Y=I^fkQ!Hr=y7ctBmnZ=LdC$2KsvGzp`ByNe8O;QcC0KH^_F2okQ~8OD zh61ka2BUE?*H&Zj)H#NjRrudz>8o2tnF~e3+gN(ZdI&J-OyR>+Mq}Tm)Rar8%yDO|QjPWr8 zKRHK7RJ5xXkNLL981E076%l=5A-N??g-64o$>Y`t?bH@=maOSx-Kdt;kdAp{KYkQ? zRm2?lc2c@AggI%FNsl>-U#egRUiC132gv?Jvo53bpa2|HwrBb+m4eN$TN>pLwjMt; z`4s&1d8-L;6|Rb>6C(%CxLXTB1qw8*f#o&s9zm@9mcNie6Xu#ke|Gyvb4QhnRBuHh zv*9LUi<`;7#8w;9OqoNN*qznVU zfWVx~J3$n=lNb#60K;AW_@4xlqxaqD#lL;^Hy_jI6gi-r-_ z<2+>Sl$LuSFX(dl&x_xxoFQ^DM+1RwO|)Vn5+Y~#x=lF|$m)1)2l3*Z4h0@3mdvqO zYJ5z^*BH?Z!K_TMMJ0+wQVf&9NGHV8e`34gMt)y3v1ZXJ0t+b;wZK7$3fSf==(k?P zz|g>@m@*wB4XA&**kZKKCt7xdS-wZ|hBTkDG#x&M$Y?o$P73+w3?g=IQ%o9kG2Uf< zvOT;NMkW*@SVlV)aOk0S``3k$C0P>OicGW1=R_8t1sIKEm8Z_!4s_h^d(ZC+jUa6i zsA3kc<1JMemc!Xnk4vX0uVp_h=$$*oW+djs&+&%Nle)2n#Ev`X^c9->{Q_b23?HS4 zXpF5dg&sd%eXnQ3^Tn^kN{AF>>vyjCp|Mam=OCk4O38QROT8fm^t!_#^jP@;!&o$% z8RD+u&8$}+E>+@_Dsc+RSG4uH4F?Eu>9wJ8jdA1giVrs1mMlM6>z#Tnu5@@E9rFRk zu`ESPO6=Mt0lBckj!SmBe`ozO&JtUpJXu~0zs@?O+vILxdPO-o%h=OCvDy7!su!{) z4iUz7^Iv{8Jg-#JJ+K56HpF;8me9>!k|qJrHHko^)RgxTFmioglWoenA56#?#uyxR zLB=u3vhdx-Cl7Y7uhl&$v9l&WZW~Zcg*Q_kzDUY5H2VYyo+0{kqO(UuZyBm`V$#zg z`qAP-V5>DOw$@(|gY^SFKlg#@B~9u(mZuM%zz^!Jv}0f2N>yYkJT@wXQrcEnlLD`D zRH>^P(Vgza>nDXz@3uMR71M-^DhiX|@c|rVEfdNiT97Xk%(A7fy7-0&wrv@vRT6in zvWBc;3|IyQ(U@k4g~R82MDPgE;a?I>c*$L(3M`P6LPo~*n#=9`KE=4k2}b{HtrmXh zUP5rU6{77qcTh?CFhn_-Z2tApjS%l2$rXXVmUWE!!Q8QjV;Q{#L#;RFh3Ql-5qptc z3^3%i3uYdHohdSGjacz`S#qH!Rs1C4UHDf0O z!H2O#4c0czMt@P%axM7B)UyJ&;#(-nVxUvauFwE`7H<_l>=wdo1IqwNQ#d{8mb|O! z*ok73wo$m~)ZbtGsq@H8T3DDA7vtoz>le+TnU$MTe%$}oArP%X!Sag{9l79Jv_0!0 zPjPFTSkgSC=I)oUGwEk4M;A=bRiH1jFhRPDR?|p!aryU+eO*|4nOL-3e#>}rKuMzh zCe@Sc?#X%SS3OWkJ1zTL$3grlTXzI;<~h^?@Nmh8F%X>WR*Kk@%oC!2a3)M@nJnIcj9@(7TBGT ztmi4LV?3-je|eeQ{hEdR>b)^#soIu!p&LeRaiHVv@G5q{XWzF|Ilx znOxkSAaWC9>qX%Ct0=IjG!EUsU@NtIV9$-P>^mW$F+NdFOxHKdimc{~S9bgKgkbvo zr1qKc{37{J+15HCqDl6C6;X&bGBSP@MtTC=+Z$Pdd}_P@HvJoo2bGTayDvXypEb~L z=_@8fhf!kz(Hv5)V zl~dvOa9qv#IE7zfqZFE6dI9QPG_w6B!hAC5peJ>1mwcYyB> zmtnYJl#3e>B;G}~`J6fsVOj9>cw1rppOC4LZr2?9xcdEm;mi{vj!uqmgqUiLhS2MA z{<*~E`lKSoYcQZ2qI#!TgcG|Fc@{GwUuhPP{Mrfxjw1@qow^hpB^{&}BCM(#TTjB4 z&1IRP11q$5j~@5cw`-W>fLC4hn7glKp8I7K)(eR6@-Ojb#t&c_caUCF+%SDjZ#3kl zOAfz=2^1hNDxZJ)fm>fMDuHA;3fuPZ~5#;;T>sl5=8=2i_YnV$splvj^N;K0iqXp2aU@dM|zoy=MW|YDHRF zA8_6@aR$E0kcIDPS2Cp2;PTw6MdyzHDV|RQXF0fr$9aiES>j zcmOjroCB-`C0dufUh!CnL*DSV=f`$8TU-u0GKTx5yKz{1QiP%0%13HCq5iT?{0D|F zuC7`8h=n?tK9RzFnXL=Y`42?sp&u+MTt+1^p-|J6@TnK zH2pwT@48H5LuZ?`s1c`MjUj#w--S#pOCP25@|D*E4QB@-Xfo2lG6eoysVBp+_D`L;yv_v(oAN4@H@ZJbJPw@wKjuJ$C5%OQdo?D<1 zbpC6xdG`{^d81MUM}UwF_{P8r)rNFp!&&BU(180E6hV=8|8WF3twStZP0npFeNPf@ z;h$mO(cbfZA9`&y;i7F4GNFrnEpe(3sR&pvbai6bp8pgafv^D&CapKY2Wfh zT$soiW`!1h!fs9TG|^*aFj{chnaWGuT+Zm;&FV*FXoA)p%VX11xeU0IS{&<_16OS` z9XVX;j^K(9z0SXHBmo&r^bq;i)peTfR_*)!Q%Iz$%@kfe0~TU`vxc){xS_WuV9zgr zxECM&EChy$bVzMn=iEvtf6(s-K>P-|WD5J`B9Z}ASH>1c`lb=sB8 zy!EF8)N_!xz;J4_4*qK%uk$V_k^2CAM8z*q0Z4eKJi{jd;w#N9 zDv1!vPHTkzXXw%43z&-^dr4KZ@D4t$v#xg-2E>wN@viW4f;}#KAIMe9z~VW3APi+>jp*7djI%?v#5#{{rHkP;sW(qol&ZK3mRJ#@&!*m}8UTC5*p7{Xl# znit^QHU7~ZI@P@WeSCbJBkbJ3k#9Ulq;yX6pRAl)fifyOZiy?JY#7Jq#wDprF1P#T zSVokX5Pt)#Xvw20&Ebz@6VO}4re3TQbEB<}gcY-dg+0}#{3NYk=E2T`R;#QK%`evF zS8FgxSTUk=FBdo~dy!PpfFWPO-V+iFf*!Qk?z6vlM^>C$J!#^wj+Uhbu-~RHSw`|> zt`Uzo%(M_ta7(3*fm!>>?m;~Nx{70DhkP%I^Jl1Wi*Y^-MmJ1yZ@Jk=E0}?9;oTQT zQb@;z#n-b$ z9c{djO(*Na#J1!Gja#k_y~1+T-gPKV1FHLh2dg}2-OZ-E7z3kgK<_JMyNi7Kukbt@ z`dC0jYFyH7gVs^M~9O8ILs-lcveVE4)Jn~2@eTBHEBLu_~6A0tiO>xPSB{6I1F;Ad9i zPeh&DT|y}2HXmDiR{UXI>f5iFqyCFshGDG~Ydc;C7bX(bDe>t1mkg*}Nyg?@4+<+E z>P)p;@K->~T>MTWH71-7OnhX@9aN&Fp1;WSI$G~M@Rni_sAX4hzw6it1TgM+VlC6-LNcaVM2!zISO+*jw_X@W^0bB%zw#Sw^{Nm)%JC~HSploNeT zWy*a_yFanEizJTPHW0zw(1000;LCzry@Ee}R7Y;DZ_Kh(?yO735I=(`p$5I{gaI(n zFB4%yfGCFm#{69@%oa%^-e9Rs1Y$V-&ZBSb718gxd(3>F$56qx8T@9~SDQC~!#8!Xgr;e>R0I>D8H-9ZH9FgCnDo)t6MsVFM%WU;d#&BXt!>>s z_~3CSz$8Q(ee9MIS`aj`-MtIrFW8AC?gFL&?su0#|31g_(NR&&WA`e7qZl_*F4NSP za_A%on+Z$$=i`sRGHe7XlSj#U49+3`^c!4M(182(Z8d#b2ofhp75kJvux?>Ma(u(a ztwRX)0}wbhhIc;Dr9qc+=}awtzaR7o$DDzk;w23a4y@hG&YLnNK|MB*dxM-1cXQQy za|N=+!zxKOp&t*AcTwptLgoYTeQ%Cb3ld#7Lwk=S`Jmejsu3d5igna}>2aMQLaahj z74ZT)VBYeE1II?NV#h?2;v6PRM08bqPhcMYR_Tw-MB&XXir+IzgoTEJ_&UHmQU52n zZGGeIlP_Qp`2!9Jf^0oHr?nvHbgeV%rV_M$tA#LFZT{W452S{XgiuA;_rhLA3iN*j zCgX5#)~@*yF?>R%l#eVvf}@?zxpdJf7|w%TL9Whq*9lj2aeC@>?ieUnzTD0ngr?(> z_(m={;J?N5cEA-hPdae2YQ{MPAqg&8rA6#C%!6oYWS{2)iOZKQQ!hj<(Uf+$|1%Jj zziBb%`Nb)VL=QPYCL&ljaXSjKiZ4LCE>doCcq9uF8(isj&tWh|qenbFyhcrEQtnOP zL1gF{lAxQJFgq7yc!0oU2f{P*g0ws*!j1q`Q}`G&+PZ9EH2lNx;Z;EN(Jj7*exKl3 zc-_>!(FJc#hfqX|1ssdcZ~HEfKvIRtv>~ZwHAOi>cNbK(AULV_X!zfc(s(6w7pF40 z74;)NBTNcDDtKUl&X6=Wr;Rc8?ARj$`Yz)6dY~lbq-P}SPTkuuq3>E8@W&mFgsdMy zXDaOTU{;j^{q^_)D!7>=0_!|M_J zqCV%7B+crW91=au;J$=r59fqXekb@KpmiqSQ2$csQ&t98Okn*w6-&=>(rQp0diW?` zKzP2(%v~@W7W%BtzURS?b;VzAsaZg|Cjw&)lhV<9W+UC2YaqR>X-ppfS?-1OaNn%0 z(hrYl1jZVm(;+!qetvWDWx87gu6SZHLM5%w*Rl=bFVpCk=s&$*p*#sq&CSG(;)-;OMJ&@J6weoKEqj z3I~bKntY7;p?ejdaGxJ({IJVC>iFT)nn-bFO4BnV`aiSLe%pW`LOs`M9E((D+)__h z{eiGAkOefQWa75oiNlehqAGD>mCcWI!)5LS)ieO*I3_z& zM$RXC{hEGs9PoZ1D3qz3E7~B%j|T0To9qhG=99D^;n1l%iOl$Nq2(q(bQ|si%Mkhg z*_D~MU~aBUZ<8Qf4=**RR?j=Z1O>rT^o=-XMVfPM?pdmjBCR9a-k8^y%-GES`!8yL zA?4Vpe`&p98)tM0etzJ<^p=^f91?Pyym$;LXURf}s*5(=Wr zN1C$wAY4Hx(qs|JFX8oSEpn6K6Bpyd53CuNwHEBs&X@0J%ntMpu7I4CX19p0QUy7Z zK1=L=_tmCIHK6?57ZO72jcY6%vB@FAgOFw%_3QdRZLp@I2qWHbLTGULk)W_a&p3q^ zB{~`ZR=Z|wTXB=KE)q=8)}Y%ERKDZaklp|dKCU(|zWe>Y%tH4p$|JE39HDPo6V`m6 z=2-9o2&v$ToWW~a#abX#A5zCZ5+TQ!1ID~rw%keyjj*x_`+huw*% z=SwFdt9}gz{t$Pwc+zQoq3(!D_j@fMU9(z2O%?p+UMjQf(8{{i{5l>t?C?La`$+ql z`JPZ6as&Xdl|}46L2VxVQ@vyvc~_2SGXdb?CRdvbJ0u;KqX5x-Sdu8=Lkevc_XYIh ziOrXi2O%3P_iVWBdWw#qe2Gv`5MpWcvuLgH`;QU>x2%`G#u6I-f-R}wDC4I92YsZR ztY}*E>LK?@oa|81gJHFW^LS^O03c+u1rrk5|lV$?DT^eP$RgYjrE;e=EVMi}U*JM)u(5NJW6*K8GhM!M$yjsU#+Ht_Z9*VKDHk2%TW z32>nQs08P8fRgE~)d)jArvoi6hG>^|!tusu^93Q@xOQGSs#iOupkV4x0A2X4Yln9H z0p6^%S2}RvY7P2FGbgqoowBUk+(Dg)LEL1>J?$3soeWM3Sav~W&@FBfLF0IGK(049 z&Hg3pki-QYcdjak!O&00NhpM#;fGhZ^exJ@blME{agdsM(qZey2Qr`c(9VN^`vkK0 z$gI^Q=*l}`ADZvk`KB#ZuEzzU-T^F;u_pG7pYK6QK+y>&zl8a<%kSnb?!NP=bi*1U zE5gv@kjp-^{?jG>L|k4$bz7M^Qu5d z%b*%srio(J)YTQ32x%sRbMx$U;c`6;i)oA5j`FX$ZjZ*Ibq6}(Bz>d6YCqd@uW>=i z3ai~D=>j8(Da~bLsP#>SlV`=)NL5`2Gx!FBwxW&u(x1QkF}dv-DuXoj*clFAeIe{X zZ}f7)(_<3H{!0%6$%h7^ju zSNC%e`CkJc!{T8PE_#J1EAM-XG$vP%2x6zfL{qMGsG^2xY}=FH9iKokWUL4-Mn{kF z7-C3ske((TSkiUoKq;w{5Is~@ev*A5H)*N-5c`Fbs0}N>#in(j{rmS=Jju%C@Ap3E z@ZEVM&wY)NMV5B^G~pMOWB8{59p<79w+EizpiVk6aX6SIWBY-96K?Y=_X*ry*D0Sh zc%-?+J+Xg;7Wz&@Q zn8?T2^jsS9bu5Omi!6V0vIt&z#9g7FF=Y_D6-6S0{gmb7>J-r{Uxp}QYxg4b>R2Y! zZ~lw7tt#=u)7c-t`X}$hz_8>X1fse}r&BHJEMNR!7>Zho?eOG~-w6KKD^r2Lz&b3` zVN^!x(7ZD)(5iLIXd1js8*bJ3yP!2lKd3<8V86*#1q9z3k^owx#Ls>UtuJLv#TfSB z5TvIsx1fyoHj9WXN%C^Y+w&;nfZbFJCY>3{Q?ZCVgWt#!wBOvcZX|y%JMpy8OB(iP zO5*|~qxN?6*Hq<@w)2oMv$>X+q6fSnLP|b->2SPkb{ppym%QOqRVwNXFP(E^QiM?uI~5+LXk0%mzAC=5 z8n{|F;VN6HAa6sd)pJEeuvFT=?Df83WX`VR33^ms(j$XAsdj!Nzy!G zlGBOU{1Gkq@>p^>YPOw}5%T3K9q9CG)?1E?W7wFe)6MXm0;mMv{gh|+#K|!vjxYtz zIZKsRYv`R7vN(lFtuZ$qNpO#xSR#ZROn8e|6(k?0a@<>r%fzrybHD}!9NB#cAEmv|J zs|eQ_l=?*{q`!t6LwEX~6Z6*~mR(h?nBo2XI)sG=*0=jzk^f=@Z+!U)^9_t2&~oE% z|6>u0@wU~ShD=dnXB?nXc5xDLTQ8!FcFo0GHoi}D+m?1{HGcbIXlGWodDK9bncWU0 z$Xs_ZJJ1^|?yYC9Q``G{IsGGb{}_5k8~UehWPAj^y?IkR5gVl)Vq~YFZI$TI3x=!} z;bU@_JF3x;<7(`ST|3(QrxqB~Wt1P#@)Ija(<<^n6zz<3ucd#doO#CPf9LerIMb}l z?@^?^uPwUMO!dpuw<7h-l`5N@E7s#0_1PJuDR$corHng2mr=gUxd$94p>0C-m<~+& zdm_<70wH(-=YnE3`;|?+Zz_bOl`4xVtuE!?1;Tp{7~=BES|bs�r}znWX9i{2}YP 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%0D$nlS1$+LA!cx7uGBWN%xR+8~vV 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�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

\ No newline at end of file +

DYxkb{@wCWzw6U`diuH|Ekdm- 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%0AP0cILv!^uGjpwJMWo4)+YV;P9c_JCg%e;u|+ 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�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 literal 0 HcmV?d00001 From 712d86933ab126c9eaa98a9704b03558d3e738ca Mon Sep 17 00:00:00 2001 From: bfly Date: Wed, 24 Dec 2025 13:06:44 +0800 Subject: [PATCH 060/153] fix(install): auto-configure PATH for macOS/Linux MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add ensure_path_configured() to detect shell and update rc file - Supports zsh (.zshrc), bash (.bash_profile/.bashrc), and others (.profile) - Skips if PATH already configured 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- install.sh | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/install.sh b/install.sh index 5bd05a6..f540f89 100755 --- a/install.sh +++ b/install.sh @@ -584,6 +584,44 @@ install_bin_links() { echo "Created executable links in $BIN_DIR" } +ensure_path_configured() { + # Check if BIN_DIR is already in PATH + if [[ ":$PATH:" == *":$BIN_DIR:"* ]]; then + return + fi + + local shell_rc="" + local current_shell + current_shell="$(basename "${SHELL:-/bin/bash}")" + + case "$current_shell" in + zsh) shell_rc="$HOME/.zshrc" ;; + bash) + if [[ -f "$HOME/.bash_profile" ]]; then + shell_rc="$HOME/.bash_profile" + else + shell_rc="$HOME/.bashrc" + fi + ;; + *) shell_rc="$HOME/.profile" ;; + esac + + local path_line="export PATH=\"\$HOME/.local/bin:\$PATH\"" + + # Check if already configured in shell rc + if [[ -f "$shell_rc" ]] && grep -qF '.local/bin' "$shell_rc" 2>/dev/null; then + echo "PATH already configured in $shell_rc (restart terminal to apply)" + return + fi + + # Add to shell rc + echo "" >> "$shell_rc" + echo "# Added by ccb installer" >> "$shell_rc" + echo "$path_line" >> "$shell_rc" + echo "✅ Added $BIN_DIR to PATH in $shell_rc" + echo " Run: source $shell_rc (or restart terminal)" +} + install_claude_commands() { local claude_dir claude_dir="$(detect_claude_dir)" @@ -860,6 +898,7 @@ install_all() { save_wezterm_config copy_project install_bin_links + ensure_path_configured install_claude_commands install_claude_md_config install_settings_permissions From 30653a5063d0b55c9730979cd625d9442fc898c6 Mon Sep 17 00:00:00 2001 From: bfly Date: Wed, 24 Dec 2025 15:32:44 +0800 Subject: [PATCH 061/153] chore: ignore compare_with_mcp directory --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 1bc656e..9c81ed5 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ __pycache__/ .claude/ *.mp4 tmp/ +compare_with_mcp/ From ac5de9f286b99d6338432e77bb789224c84bc988 Mon Sep 17 00:00:00 2001 From: bfly Date: Wed, 24 Dec 2025 15:36:21 +0800 Subject: [PATCH 062/153] docs: add Windows installation notes for WezTerm and environment --- README.md | 8 ++++---- README_zh.md | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index b61c59f..6f13f5f 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,8 @@ cd claude_code_bridge