| 413 | } |
| 414 | |
| 415 | function buildMoatEntryScript() { |
| 416 | return [ |
| 417 | 'if [ -n "${AGENTS_CLAUDE_CODE_OAUTH_TOKEN:-}" ]; then', |
| 418 | ' export CLAUDE_CODE_OAUTH_TOKEN="$AGENTS_CLAUDE_CODE_OAUTH_TOKEN"', |
| 419 | " unset ANTHROPIC_API_KEY ANTHROPIC_BASE_URL CLAUDE_API_KEY", |
| 420 | "fi", |
| 421 | 'if [ -n "${AGENTS_ANTHROPIC_API_KEY:-}" ]; then export ANTHROPIC_API_KEY="$AGENTS_ANTHROPIC_API_KEY"; fi', |
| 422 | 'if [ -n "${AGENTS_CLAUDE_API_KEY:-}" ]; then export CLAUDE_API_KEY="$AGENTS_CLAUDE_API_KEY"; fi', |
| 423 | 'if [ -n "${AGENTS_ANTHROPIC_BASE_URL:-}" ]; then export ANTHROPIC_BASE_URL="$AGENTS_ANTHROPIC_BASE_URL"; fi', |
| 424 | 'rewrite_proxy_var() {', |
| 425 | ' value=$(printenv "$1" 2>/dev/null || true)', |
| 426 | ' if [ -n "$value" ]; then', |
| 427 | ' export "$1=$(printf %s "$value" | sed "s#127\\.0\\.0\\.1#host.docker.internal#g")"', |
| 428 | " fi", |
| 429 | "}", |
| 430 | "rewrite_proxy_var HTTP_PROXY", |
| 431 | "rewrite_proxy_var HTTPS_PROXY", |
| 432 | "rewrite_proxy_var http_proxy", |
| 433 | "rewrite_proxy_var https_proxy", |
| 434 | 'if [ -n "${NO_PROXY:-}" ]; then export NO_PROXY="${NO_PROXY},host.docker.internal"; else export NO_PROXY="host.docker.internal"; fi', |
| 435 | 'if [ -n "${no_proxy:-}" ]; then export no_proxy="${no_proxy},host.docker.internal"; else export no_proxy="host.docker.internal"; fi', |
| 436 | 'if [ -n "${AGENTS_MCP_SERVERS_JSON:-}" ]; then', |
| 437 | " node - <<'EOF'", |
| 438 | 'const fs = require("node:fs")', |
| 439 | 'const path = "/home/moatuser/.claude.json"', |
| 440 | "let config = {}", |
| 441 | "try { config = JSON.parse(fs.readFileSync(path, 'utf8')) } catch {}", |
| 442 | "if (!config || typeof config !== 'object' || Array.isArray(config)) config = {}", |
| 443 | "config.mcpServers = JSON.parse(process.env.AGENTS_MCP_SERVERS_JSON)", |
| 444 | "if (!config.projects || typeof config.projects !== 'object' || Array.isArray(config.projects)) config.projects = {}", |
| 445 | "const project = config.projects['/workspace']", |
| 446 | "if (!project || typeof project !== 'object' || Array.isArray(project)) {", |
| 447 | " config.projects['/workspace'] = { hasTrustDialogAccepted: true }", |
| 448 | "} else {", |
| 449 | " config.projects['/workspace'].hasTrustDialogAccepted = true", |
| 450 | "}", |
| 451 | "fs.writeFileSync(path, JSON.stringify(config, null, 2) + '\\n')", |
| 452 | "EOF", |
| 453 | "fi", |
| 454 | 'exec "$0" "$@"', |
| 455 | ].join("\n") |
| 456 | } |
| 457 | |
| 458 | function loadPersistentMoatState(): PersistentMoatState { |
| 459 | return JSON.parse(readFileSync(PERSISTENT_MOAT_STATE_PATH, "utf8")) as PersistentMoatState |