runs locaux: injecter tout ~/.claude/.env (APIFY_TOKEN, etc.)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
4 changed files +20 −7
modified
data/backend.log
+1 −0
@@ -7,3 +7,4 @@ admin-ka backend sur port 3300 (dual-stack) | ||
| 7 | 7 | admin-ka v2 sur port 3300 (dual-stack) |
| 8 | 8 | admin-ka v2 sur port 3300 (dual-stack) |
| 9 | 9 | admin-ka v2 sur port 3300 (dual-stack) |
| 10 | +admin-ka v2 sur port 3300 (dual-stack) | |
modified
data/eco.sqlite
+0 −0
Binary file not shown.
modified
data/ngrok.log
+6 −0
@@ -323,3 +323,9 @@ t=2026-08-20T00:38:11-0400 lvl=info msg="join connections" obj=join id=83adadecc | ||
| 323 | 323 | t=2026-08-20T00:38:39-0400 lvl=info msg="join connections" obj=join id=f7755b441375 l=[::1]:3300 r=[2605:b100:121:7aaf:a44c:a261:eb80:fba]:54373 |
| 324 | 324 | t=2026-08-20T00:38:39-0400 lvl=info msg="join connections" obj=join id=274ae66881de l=[::1]:3300 r=[2605:b100:121:7aaf:a44c:a261:eb80:fba]:54376 |
| 325 | 325 | t=2026-08-20T01:02:03-0400 lvl=info msg="join connections" obj=join id=504deb98fb4c l=[::1]:3300 r=70.25.239.68:61599 |
| 326 | +t=2026-08-20T01:02:04-0400 lvl=info msg="join connections" obj=join id=21d3b27089b3 l=[::1]:3300 r=70.25.239.68:50559 | |
| 327 | +t=2026-08-20T01:05:35-0400 lvl=info msg="join connections" obj=join id=e796ab5e83a3 l=[::1]:3300 r=70.25.239.68:61603 | |
| 328 | +t=2026-08-20T01:05:35-0400 lvl=info msg="join connections" obj=join id=67f44373f352 l=[::1]:3300 r=70.25.239.68:61603 | |
| 329 | +t=2026-08-20T01:05:35-0400 lvl=info msg="join connections" obj=join id=4b8ab47d4ea5 l=[::1]:3300 r=70.25.239.68:61603 | |
| 330 | +t=2026-08-20T01:05:36-0400 lvl=info msg="join connections" obj=join id=c5fc9e96ae20 l=[::1]:3300 r=70.25.239.68:61607 | |
| 331 | +t=2026-08-20T01:05:42-0400 lvl=info msg="join connections" obj=join id=4c93058d9170 l=[::1]:3300 r=70.25.239.68:61603 | |
modified
server/server.js
+13 −7
@@ -31,15 +31,21 @@ const PORT = config.port || 3300; | ||
| 31 | 31 | const CLAUDE_BIN = config.claudeBin || '/opt/homebrew/bin/claude'; |
| 32 | 32 | const NODE_BIN = config.nodeBin || '/opt/homebrew/bin/node'; |
| 33 | 33 | |
| 34 | −function loadAnthropicKey() { | |
| 34 | +// toutes les variables de ~/.claude/.env (ANTHROPIC_API_KEY, APIFY_TOKEN, …) | |
| 35 | +// sont injectées dans les runs claude locaux (les runs distants font | |
| 36 | +// `export $(cat ~/.claude/.env | xargs)` côté nœud) | |
| 37 | +function loadClaudeEnv() { | |
| 38 | + const out = {}; | |
| 35 | 39 | try { |
| 36 | − const envFile = fs.readFileSync(path.join(HOME, '.claude', '.env'), 'utf8'); | |
| 37 | − const m = envFile.match(/ANTHROPIC_API_KEY=(\S+)/); | |
| 38 | − if (m) return m[1]; | |
| 40 | + for (const line of fs.readFileSync(path.join(HOME, '.claude', '.env'), 'utf8').split('\n')) { | |
| 41 | + const m = line.match(/^([A-Z0-9_]+)=(\S+)/); | |
| 42 | + if (m) out[m[1]] = m[2]; | |
| 43 | + } | |
| 39 | 44 | } catch {} |
| 40 | − return process.env.ANTHROPIC_API_KEY || ''; | |
| 45 | + return out; | |
| 41 | 46 | } |
| 42 | −const ANTHROPIC_API_KEY = loadAnthropicKey(); | |
| 47 | +const CLAUDE_ENV = loadClaudeEnv(); | |
| 48 | +const ANTHROPIC_API_KEY = CLAUDE_ENV.ANTHROPIC_API_KEY || process.env.ANTHROPIC_API_KEY || ''; | |
| 43 | 49 | |
| 44 | 50 | // ---------- audit ---------- |
| 45 | 51 | const AUDIT_PATH = path.join(DATA_DIR, 'audit.jsonl'); |
@@ -241,7 +247,7 @@ function startClaude(chat, prompt) { | ||
| 241 | 247 | proc = spawn(CLAUDE_BIN, args, { |
| 242 | 248 | cwd: chat.dir, |
| 243 | 249 | env: { |
| 244 | − ...process.env, ANTHROPIC_API_KEY, | |
| 250 | + ...process.env, ...CLAUDE_ENV, | |
| 245 | 251 | PATH: '/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin', HOME, |
| 246 | 252 | }, |
| 247 | 253 | stdio: ['pipe', 'pipe', 'pipe'], |
| 248 | 254 | |