Skip to content

Commit 377ad55

Browse files
committed
fix
1 parent 5bb80eb commit 377ad55

4 files changed

Lines changed: 43 additions & 7 deletions

File tree

backend/launcher.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323
import webbrowser
2424
from pathlib import Path
2525

26+
# Global flag to prevent duplicate browser opens
27+
_browser_opened = False
28+
2629

2730
def get_base_path() -> Path:
2831
"""Get the base path for resources (handles both dev and bundled modes)."""
@@ -214,9 +217,21 @@ def is_tauri_sidecar() -> bool:
214217

215218

216219
def open_browser_delayed(url: str, delay: float = 1.5):
217-
"""Open browser after a delay to allow server to start."""
220+
"""Open browser after a delay to allow server to start.
221+
222+
Uses a global flag to prevent duplicate browser opens which can happen
223+
when Claude SDK or Codex subprocess triggers browser behavior on Windows.
224+
"""
225+
global _browser_opened
226+
227+
if _browser_opened:
228+
return
229+
230+
_browser_opened = True
231+
218232
def _open():
219233
time.sleep(delay)
234+
# Double-check flag in case of race condition
220235
webbrowser.open(url)
221236

222237
thread = threading.Thread(target=_open, daemon=True)
@@ -230,7 +245,7 @@ def run_mcp_server(server_type: str) -> None:
230245
allowing Codex to spawn this exe as an MCP server subprocess.
231246
232247
Args:
233-
server_type: Either "action" or "guidelines"
248+
server_type: Either "action", "guidelines", or "etc"
234249
"""
235250
import asyncio
236251

@@ -241,9 +256,11 @@ def run_mcp_server(server_type: str) -> None:
241256
from mcp_servers.action_server import main as server_main
242257
elif server_type == "guidelines":
243258
from mcp_servers.guidelines_server import main as server_main
259+
elif server_type == "etc":
260+
from mcp_servers.etc_server import main as server_main
244261
else:
245262
print(f"Unknown MCP server type: {server_type}", file=sys.stderr)
246-
print("Valid types: action, guidelines", file=sys.stderr)
263+
print("Valid types: action, guidelines, etc", file=sys.stderr)
247264
sys.exit(1)
248265

249266
# Run the MCP server (async main)

backend/providers/codex/transport.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,15 @@ async def start(self) -> None:
9898

9999
logger.info(f"[Transport {self._instance_id}] Starting: {' '.join(self._command)}")
100100

101+
# Build environment with BROWSER="" to prevent subprocess from opening browser
102+
subprocess_env = {**os.environ, "BROWSER": ""}
103+
101104
self._process = await asyncio.create_subprocess_exec(
102105
*self._command,
103106
stdin=asyncio.subprocess.PIPE,
104107
stdout=asyncio.subprocess.PIPE,
105108
stderr=asyncio.subprocess.PIPE,
106-
env={**os.environ},
109+
env=subprocess_env,
107110
)
108111

109112
self._reader_task = asyncio.create_task(self._read_stdout())

backend/providers/configs.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ class ClaudeStaticConfig:
4040
"DISABLE_TELEMETRY": "true",
4141
"DISABLE_ERROR_REPORTING": "true",
4242
"CLAUDE_CODE_DISABLE_FEEDBACK_SURVEY": "true",
43+
# Prevent subprocess from opening browser (Windows fix)
44+
"BROWSER": "",
4345
}
4446
)
4547

backend/providers/mcp_config.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,16 +82,30 @@ def build_all_servers(
8282
# Build guidelines server config
8383
guidelines_env = MCPConfigBuilder._build_guidelines_env(base_env, env_config)
8484

85+
# When running as PyInstaller bundle, use --mcp-server flag instead of -m
86+
is_frozen = getattr(sys, "frozen", False)
87+
88+
if is_frozen:
89+
# PyInstaller bundle: use --mcp-server flag that launcher.py understands
90+
action_args = ["--mcp-server", "action"]
91+
guidelines_args = ["--mcp-server", "guidelines"]
92+
etc_args = ["--mcp-server", "etc"]
93+
else:
94+
# Development: use Python module invocation
95+
action_args = ["-m", "mcp_servers.action_server"]
96+
guidelines_args = ["-m", "mcp_servers.guidelines_server"]
97+
etc_args = ["-m", "mcp_servers.etc_server"]
98+
8599
servers: Dict[str, MCPServerConfig] = {
86100
"action": {
87101
"command": python_exe,
88-
"args": ["-m", "mcp_servers.action_server"],
102+
"args": action_args,
89103
"env": action_env,
90104
"cwd": backend_dir,
91105
},
92106
"guidelines": {
93107
"command": python_exe,
94-
"args": ["-m", "mcp_servers.guidelines_server"],
108+
"args": guidelines_args,
95109
"env": guidelines_env,
96110
"cwd": backend_dir,
97111
},
@@ -101,7 +115,7 @@ def build_all_servers(
101115
if include_etc:
102116
servers["etc"] = {
103117
"command": python_exe,
104-
"args": ["-m", "mcp_servers.etc_server"],
118+
"args": etc_args,
105119
"env": base_env.copy(),
106120
"cwd": backend_dir,
107121
}

0 commit comments

Comments
 (0)