cff52b4b9e
- Travel dates: TopBar chip + popover (outbound/return/travellers); sent to Grok prompt; itinerary.needsTravelDates drives a nudge banner; cache and prefetch ledger invalidate when dates change - Sea crossings: CrossingOption schema (Eurotunnel, DFDS, P&O, Brittany, Stena Line); CrossingSwapBlock under tunnel/ferry/crossing stops with trip-impact deltas and Book links; prompt requires 3-5 real options for every UK ↔ mainland route; picking a crossing triggers silent re-plan - Tesla in-car polish: UA + heuristic detection sets <html class="incar">; CSS overrides kill backdrop-filter, scale fonts, enforce 44px tap targets, disable hover flicker; geolocation + reverse geocode + crosshair button inside the From input; up/down arrow reorder buttons replace touch-broken HTML5 drag-and-drop - Tesla Fleet API stub: /.well-known/appspecific/com.tesla.3p.public-key.pem served from TESLA_FLEET_PUBLIC_KEY for partner domain verification; OAuth callback + vehicle_data stub return 503 until partner approval - Dockerfile + .dockerignore for Dokku deployment; server now serves client/dist in production
43 lines
1.8 KiB
TypeScript
43 lines
1.8 KiB
TypeScript
import 'dotenv/config';
|
|
|
|
const home = process.env.HOME || process.env.USERPROFILE || '';
|
|
const defaultGrokBin = process.env.GROK_BIN
|
|
|| (home ? `${home}/.grok/bin/grok` : '')
|
|
|| '/usr/local/bin/grok';
|
|
|
|
export const env = {
|
|
port: parseInt(process.env.PORT || '3000', 10),
|
|
nodeEnv: process.env.NODE_ENV || 'development',
|
|
appUrl: process.env.APP_URL || 'https://tesla-roadtrip.test',
|
|
apiUrl: process.env.API_URL || 'https://api.tony.codes',
|
|
|
|
// Auth
|
|
authSecret: process.env.AUTH_SECRET || '',
|
|
authUrl: process.env.AUTH_URL || 'https://auth.tony.codes',
|
|
authClientId: process.env.AUTH_CLIENT_ID || 'tesla-roadtrip',
|
|
|
|
// Database (optional — trips persist to memory if unset)
|
|
databaseUrl: process.env.DATABASE_URL || '',
|
|
|
|
// Grok / xAI — local personal CLI (your authenticated Heavy account) is preferred for development
|
|
grokBin: defaultGrokBin,
|
|
xaiApiKey: process.env.XAI_API_KEY || '',
|
|
grokEnabled: process.env.GROK_ENABLED !== 'false',
|
|
forceXaiApi: process.env.FORCE_XAI_API === 'true',
|
|
|
|
// Tesla Fleet API
|
|
tesla: {
|
|
// Public key served at /.well-known/appspecific/com.tesla.3p.public-key.pem
|
|
// for domain verification. Set TESLA_FLEET_PUBLIC_KEY to the PEM contents
|
|
// (multi-line; can include literal newlines).
|
|
publicKey: process.env.TESLA_FLEET_PUBLIC_KEY || '',
|
|
// OAuth client credentials Tesla gives you after partner approval.
|
|
clientId: process.env.TESLA_FLEET_CLIENT_ID || '',
|
|
clientSecret: process.env.TESLA_FLEET_CLIENT_SECRET || '',
|
|
// Where Tesla redirects after the user authorises.
|
|
redirectUri: process.env.TESLA_FLEET_REDIRECT_URI || 'https://roadtrip.tony.codes/api/auth/tesla/callback',
|
|
// Region: 'eu' or 'na'.
|
|
region: (process.env.TESLA_FLEET_REGION || 'eu') as 'eu' | 'na',
|
|
},
|
|
} as const;
|