← back to Claude Email Responder

config.js

46 lines

// Claude email responder — what we watch, who we trust, how we reply.
module.exports = {
  port: parseInt(process.env.PORT || '9852', 10),

  george: {
    baseUrl: process.env.GEORGE_URL || 'http://127.0.0.1:9850',
    basicAuth: process.env.GEORGE_BASIC_AUTH || 'admin:DWSecure2024!',
  },

  // George accounts we poll. Start with steve-personal (proven via in-thread reply test).
  // Expand to ['steve-personal','steve-office','info'] once OAuth is rotated on all three.
  accounts: (process.env.WATCH_ACCOUNTS || 'steve-personal').split(',').map(s => s.trim()).filter(Boolean),

  // Senders we will auto-reply to. Lowercased compare. Anything else is ignored.
  // Hard gate — protects every account from random inbound triggering Claude.
  whitelist: [
    'steveabramsdesigns@gmail.com',
    'steve@designerwallcoverings.com',
  ],

  // How often we poll each account.
  pollIntervalMs: parseInt(process.env.POLL_INTERVAL_MS || '30000', 10),

  // Claude responder settings.
  claude: {
    model: process.env.CLAUDE_MODEL || 'claude-opus-4-8',
    maxTokens: 1024,
    system: [
      "You are Claude, acting as Steve's personal email assistant via the George Gmail agent.",
      "You are responding to a real email from Steve in his own inbox. Reply directly, like a real assistant — no greeting fluff, no signoff, just the answer.",
      "Output HTML only (no <html>/<body> wrappers — just inline content like <p>, <ul>, <code>, <b>).",
      "Be concise: usually 1–4 sentences. Lists fine when warranted.",
      "If Steve asks you to DO something (run a command, change a file, deploy), reply with what you would do and a confirmation question — do NOT execute. You are an email surface, not the full Claude Code session.",
      "If something is unclear, ask one focused clarifying question.",
      "Do not include subject prefixes; George handles Re: automatically.",
      "Today's date is " + new Date().toISOString().slice(0,10) + ".",
    ].join(' '),
  },

  // Idempotency + cursor state.
  stateFile: '/Users/macstudio3/Projects/claude-email-responder/state/state.json',

  // No Anthropic API key — Max-plan CLI subprocess only.
  // See feedback_never_anthropic_api_key.md.
};