fix(discord-bridge): director de lucru dedicat + log nedublat

- DEFAULT_CWD trece de la /workspace la /workspace/claude-agent, un spatiu cu git
  propriu, ca fisierele facute din Discord sa aiba istoric separat de proiectele
  reale. `!cd <cale>` ramane disponibil oriunde in /workspace, deci decizia din
  plan (fara allowlist de proiecte) nu se schimba.
- setup_logging: sub systemd unitul redirecteaza deja stdout in bot.log
  (StandardOutput=append:), iar FileHandler-ul scria fiecare linie a doua oara
  in acelasi fisier. FileHandler ramane doar la rulare manuala.

Verificat in productie: bot conectat, un tur real incheiat curat (inflight null,
cost $0.0742 contabilizat), restart fara orfani. Suita: 275 passed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B29CApsP1JkSdjYaGaHpE7
This commit is contained in:
Claude Agent
2026-08-30 11:30:31 +00:00
parent f86e9c1171
commit ddbe9de4bc
3 changed files with 14 additions and 6 deletions

View File

@@ -480,7 +480,7 @@ class Bridge:
"```", "```",
f"fir : {thread_id}", f"fir : {thread_id}",
f"sesiune : {(proc.sid if proc is not None else None) or rec.get('sid') or '(noua)'}", f"sesiune : {(proc.sid if proc is not None else None) or rec.get('sid') or '(noua)'}",
f"director : {rec.get('cwd') or config.get('DEFAULT_CWD', '/workspace')}", f"director : {rec.get('cwd') or config.get('DEFAULT_CWD', '/workspace/claude-agent')}",
f"model : {model}", f"model : {model}",
f"proces : {'viu' if alive else 'oprit'}" f"proces : {'viu' if alive else 'oprit'}"
+ (f" pid={pid} rss={rss_mb(pid)} MB" if alive and pid else ""), + (f" pid={pid} rss={rss_mb(pid)} MB" if alive and pid else ""),
@@ -528,7 +528,7 @@ class Bridge:
channel = message.channel channel = message.channel
rec = self.store.thread(tid) rec = self.store.thread(tid)
model = rec.get("model") or default_model() model = rec.get("model") or default_model()
cwd = rec.get("cwd") or config.get("DEFAULT_CWD", "/workspace") cwd = rec.get("cwd") or config.get("DEFAULT_CWD", "/workspace/claude-agent")
turn_id = runner_mod.new_turn_id() turn_id = runner_mod.new_turn_id()
try: try:
@@ -676,6 +676,11 @@ def make_client(bridge: Bridge | None = None): # pragma: no cover - are nevoie
def setup_logging() -> None: # pragma: no cover def setup_logging() -> None: # pragma: no cover
config.ensure_dirs() config.ensure_dirs()
handlers: list[logging.Handler] = [logging.StreamHandler()] handlers: list[logging.Handler] = [logging.StreamHandler()]
# Sub systemd, unitul redirecteaza deja stdout/stderr in bot.log
# (`StandardOutput=append:`). Un FileHandler peste asta ar scrie fiecare
# linie de doua ori in acelasi fisier. La rulare manuala nu exista
# redirectare, deci acolo tinem FileHandler-ul.
if not os.environ.get("INVOCATION_ID"):
with contextlib.suppress(OSError): with contextlib.suppress(OSError):
handlers.append(logging.FileHandler(pathlib.Path(config.LOG_DIR) / "bot.log")) handlers.append(logging.FileHandler(pathlib.Path(config.LOG_DIR) / "bot.log"))
logging.basicConfig( logging.basicConfig(

View File

@@ -30,7 +30,7 @@ DEFAULTS: dict[str, str] = {
"IDLE_REAP_S": "1200", "IDLE_REAP_S": "1200",
"RATE_PER_USER_PER_MIN": "10", "RATE_PER_USER_PER_MIN": "10",
"CLAUDE_BIN": "claude", "CLAUDE_BIN": "claude",
"DEFAULT_CWD": "/workspace", "DEFAULT_CWD": "/workspace/claude-agent",
} }

View File

@@ -48,4 +48,7 @@ CLAUDE_DISCORD_APPROVAL_TIMEOUT=300
ALERT_RECIPIENT=root ALERT_RECIPIENT=root
# --- Directorul de lucru implicit ----------------------------------------- # --- Directorul de lucru implicit -----------------------------------------
DEFAULT_CWD=/workspace # Directorul in care porneste un fir nou. Spatiu dedicat, cu git propriu, ca ce se
# face din Discord sa aiba istoric separat de proiectele reale. `!cd <cale>` il
# schimba per fir, oriunde in /workspace.
DEFAULT_CWD=/workspace/claude-agent