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 | admin-ka v2 sur port 3300 (dual-stack) | 7 | admin-ka v2 sur port 3300 (dual-stack) | ||
| 8 | admin-ka v2 sur port 3300 (dual-stack) | 8 | admin-ka v2 sur port 3300 (dual-stack) | ||
| 9 | admin-ka v2 sur port 3300 (dual-stack) | 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 | 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 | 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 | 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 | 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 | 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 | 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 | const CLAUDE_BIN = config.claudeBin || '/opt/homebrew/bin/claude'; | 31 | const CLAUDE_BIN = config.claudeBin || '/opt/homebrew/bin/claude'; | ||
| 32 | const NODE_BIN = config.nodeBin || '/opt/homebrew/bin/node'; | 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 | try { | 39 | try { | ||
| 36 | − const envFile = fs.readFileSync(path.join(HOME, '.claude', '.env'), 'utf8'); | 40 | + for (const line of fs.readFileSync(path.join(HOME, '.claude', '.env'), 'utf8').split('\n')) { | ||
| 37 | − const m = envFile.match(/ANTHROPIC_API_KEY=(\S+)/); | 41 | + const m = line.match(/^([A-Z0-9_]+)=(\S+)/); | ||
| 38 | − if (m) return m[1]; | 42 | + if (m) out[m[1]] = m[2]; | ||
| 43 | + } | ||||
| 39 | } catch {} | 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 | // ---------- audit ---------- | 50 | // ---------- audit ---------- | ||
| 45 | const AUDIT_PATH = path.join(DATA_DIR, 'audit.jsonl'); | 51 | const AUDIT_PATH = path.join(DATA_DIR, 'audit.jsonl'); | ||
@@ -241,7 +247,7 @@ function startClaude(chat, prompt) { | |||||
| 241 | proc = spawn(CLAUDE_BIN, args, { | 247 | proc = spawn(CLAUDE_BIN, args, { | ||
| 242 | cwd: chat.dir, | 248 | cwd: chat.dir, | ||
| 243 | env: { | 249 | env: { | ||
| 244 | − ...process.env, ANTHROPIC_API_KEY, | 250 | + ...process.env, ...CLAUDE_ENV, | ||
| 245 | PATH: '/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin', HOME, | 251 | PATH: '/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin', HOME, | ||
| 246 | }, | 252 | }, | ||
| 247 | stdio: ['pipe', 'pipe', 'pipe'], | 253 | stdio: ['pipe', 'pipe', 'pipe'], | ||
| 248 | 254 | ||||