# LLM provider. Any OpenAI-compatible chat-completions endpoint works. # A funded key is required for live agent runs; the eval harness runs offline # from recorded fixtures and needs none. # # These three are the boot configuration. Anything set on the Settings screen # overrides them without a restart, and clearing a field there falls back here. LLM_API_KEY= LLM_BASE_URL=https://openrouter.ai/api/v1 LLM_MODEL=anthropic/claude-sonnet-4.5 # Where the API listens, and the origin used to build tracked resume links. # PUBLIC_BASE_URL must be reachable by whoever opens the resume, so a tunnel # host goes here when demoing tracked links to a real recipient. # # Everything in this file is validated once at boot. A bad value — a PORT that # is not a number, a PUBLIC_BASE_URL with no scheme — exits 1 naming the # variable and the reason, instead of failing later one route at a time. PORT=8787 PUBLIC_BASE_URL=http://localhost:8787 # Optional: production posture. NODE_ENV=production binds 0.0.0.0, defaults # logs to JSON, and keeps stack traces out of API error bodies. HOST overrides # the binding either way; the default off production is 127.0.0.1. # NODE_ENV=production # HOST=0.0.0.0 # Optional: where SQLite lives. Defaults to ./data/command-center.db. # DATA_DIR moves the directory, DATABASE_PATH names the file outright. # DATA_DIR= # DATABASE_PATH= # Optional: `json` emits one structured log object per line. # LOG_FORMAT=json # LOG_LEVEL=info # Optional: how long SIGTERM has to drain in-flight requests before the # remaining sockets are cut. Default 10000ms, accepted range 100-120000. # SHUTDOWN_TIMEOUT_MS=10000 # Google Sheets + Gmail credentials are NOT read from this file. # Run `npm run connect google` — the OAuth refresh token is written straight # into the connectors table so it never sits in a dotfile. # # Likewise `npm run connect notion` for the Notion integration token. # --- Composio (optional) --------------------------------------------------- # # Composio brokers the OAuth for Gmail, Notion and Sheets: each app connects on # a hosted consent link, with no Google Cloud project and no Notion integration # secret. Direct credentials always win when both exist, and an app with # neither is skipped with a reason rather than failing a run. # # Composio issues two credential classes and either one is enough: # # project key, `ck_`/`ak_` platform.composio.dev > Settings > API Keys. # Set COMPOSIO_API_KEY below. Copy the WHOLE # value: the dashboard shows keys masked, and a # truncated paste is rejected with # APIKey_InvalidAPIKey. # # user key, `uak_` Run `composio login`. The CLI writes the key to # ~/.composio/user_data.json and the server reads # it from there, so no secret is copied into this # file. A consumer project — what a personal # login gives you — issues only this class. # # COMPOSIO_API_KEY wins when both are present. `npm run connect composio` # diagnoses the variable below; leave it empty if you used the CLI. COMPOSIO_API_KEY= # Optional: the entity id, on the project-key path only. The user-key path # derives its own entity from the login and ignores this. COMPOSIO_USER_ID=primary # Optional: sent as x-org-id on the user-key path, when your login needs one. # The CLI credential file usually carries it already. # COMPOSIO_ORG_ID= # Optional: where the CLI credential lives, if you pointed the CLI elsewhere. # No tilde expansion — give an absolute path. # COMPOSIO_CACHE_DIR=