Local branch had diverged from origin/master (sibling commits on the same base). Rewrote local history linearly on top of origin/master, folding in all local content: exa/hot-platform discovery hunters, leaks ledger, nightly sweep orchestrator, updated .gitignore and skill docs, plus the latest hunt output and vault state. Remote-only files (vault keys, channel scripts) were restored rather than dropped, so the resulting tree is a full union of both sides.
1 line
104 KiB
JSON
1 line
104 KiB
JSON
{"repo": "aliansoftwareteam/alianhub-project-management-system", "files": {"Config/config.js": {"6fe98054a46c5629b4eea601bff9c1efdf463e52": {"t": 1785745516.6909027, "n": 2799, "h": "c93d7609b5f4a3cb", "c": "const dotenv = require('dotenv');\nconst path = require('path');\nconst { NodeHttpHandler } = require(\"@smithy/node-http-handler\");\n\nconst appDir = path.dirname(require.main.filename);\ndotenv.config({\n path: path.resolve(appDir, `.env`)\n});\nconst NodeCache = require( \"node-cache\" );\nconst myCache = new NodeCache();\n\nmodule.exports = {\n NODE_ENV : process.env.NODE_ENV || 'development',\n PORT : process.env.PORT || 4000,\n APP_NAME: process.env.APP_NAME,\n\n SERVICE_FILE : process.env.SERVICE_FILE,\n\n FIREBASE_APIKEY : process.env.APIKEY,\n FIREBASE_AUTODOMAIN : process.env.AUTODOMAIN,\n FIREBASE_PROJECTID : process.env.PROJECTID,\n FIREBASE_STORAGEBUCKET : process.env.STORAGEBUCKET,\n FIREBASE_MESSAGINGSENDERID : process.env.MESSAGINGSENDERID,\n FIREBASE_APPID : process.env.APPID,\n FIREBASE_MEASUREMENTID : process.env.MEASUREMENTID,\n\n APIURL: process.env.APIURL,\n WEBURL: process.env.WEBURL,\n\n NODEMAILER_EMAIL: process.env.NODEMAILER_EMAIL,\n NODEMAILER_EMAIL_PASSWORD : process.env.NODEMAILER_EMAIL_PASSWORD,\n NODEMAILER_HOST: process.env.NODEMAILER_HOST,\n NODEMAILER_PORT: process.env.NODEMAILER_PORT,\n\n AWS_SES_KEY: process.env.AWS_SES_KEY,\n AWS_SES_SECRET: process.env.AWS_SES_SECRET,\n AWS_SES_REGION: process.env.AWS_SES_REGION,\n AWS_SES_FROM_DEFAULT: process.env.AWS_SES_FROM_DEFAULT,\n\n ENDPOINT_KEY: process.env.ENDPOINT_KEY,\n MONGODB_URL:process.env.MONGODB_URL,\n\n ERRORRECIVEREMAIL:process.env.ERRORRECIVEREMAIL,\n NOOFPRESETCOMPANY: process.env.NOOFPRESETCOMPANY,\n PRECOMPANYKEY: process.env.PRECOMPANYKEY,\n\n AI_API_KEY:process.env.AI_API_KEY,\n AI_MODEL:process.env.AI_MODEL,\n\n DEEPSEEK_API_KEY:process.env.DEEPSEEK_API_KEY,\n DEEPSEEK_MODEL:process.env.DEEPSEEK_MODEL,\n\n RESEND_API_KEY: process.env.RESEND_API_KEY,\n RESEND_FROM_EMAIL: process.env.RESEND_FROM_EMAIL,\n\n STORAGE_TYPE:process.env.STORAGE_TYPE,\n\n UNDER_MAINTENANCE: process.env.UNDER_MAINTENANCE,\n myCache: myCache,\n USERPROFILEBUCKET: process.env.USERPROFILEBUCKET,\n // BUG-038 / #92 — S3 request handler timeouts.\n // Previously both timeouts were 300_000ms (5 minutes). A hung Wasabi\n // call would pin the request worker for that long, so a brief\n // upstream outage saturated the pool and degraded unrelated routes.\n // Drop to 30s (covers normal multi-MB uploads on slow links but\n // gives up quickly on truly stuck connections). Env-tunable via\n // `S3_CONNECTION_TIMEOUT_MS` / `S3_SOCKET_TIMEOUT_MS` for operators\n // who need a different ceiling (e.g. very large file uploads).\n requestHandler: new NodeHttpHandler({\n connectionTimeout: Number(process.env.S3_CONNECTION_TIMEOUT_MS) || 30000,\n socketTimeout: Number(process.env.S3_SOCKET_TIMEOUT_MS) || 30000,\n })\n}"}, "7039582df48dd423df68514acb2851fb8a2adccb": {"t": 1785753774.3106232, "n": 2799, "h": "c93d7609b5f4a3cb", "c": "const dotenv = require('dotenv');\nconst path = require('path');\nconst { NodeHttpHandler } = require(\"@smithy/node-http-handler\");\n\nconst appDir = path.dirname(require.main.filename);\ndotenv.config({\n path: path.resolve(appDir, `.env`)\n});\nconst NodeCache = require( \"node-cache\" );\nconst myCache = new NodeCache();\n\nmodule.exports = {\n NODE_ENV : process.env.NODE_ENV || 'development',\n PORT : process.env.PORT || 4000,\n APP_NAME: process.env.APP_NAME,\n\n SERVICE_FILE : process.env.SERVICE_FILE,\n\n FIREBASE_APIKEY : process.env.APIKEY,\n FIREBASE_AUTODOMAIN : process.env.AUTODOMAIN,\n FIREBASE_PROJECTID : process.env.PROJECTID,\n FIREBASE_STORAGEBUCKET : process.env.STORAGEBUCKET,\n FIREBASE_MESSAGINGSENDERID : process.env.MESSAGINGSENDERID,\n FIREBASE_APPID : process.env.APPID,\n FIREBASE_MEASUREMENTID : process.env.MEASUREMENTID,\n\n APIURL: process.env.APIURL,\n WEBURL: process.env.WEBURL,\n\n NODEMAILER_EMAIL: process.env.NODEMAILER_EMAIL,\n NODEMAILER_EMAIL_PASSWORD : process.env.NODEMAILER_EMAIL_PASSWORD,\n NODEMAILER_HOST: process.env.NODEMAILER_HOST,\n NODEMAILER_PORT: process.env.NODEMAILER_PORT,\n\n AWS_SES_KEY: process.env.AWS_SES_KEY,\n AWS_SES_SECRET: process.env.AWS_SES_SECRET,\n AWS_SES_REGION: process.env.AWS_SES_REGION,\n AWS_SES_FROM_DEFAULT: process.env.AWS_SES_FROM_DEFAULT,\n\n ENDPOINT_KEY: process.env.ENDPOINT_KEY,\n MONGODB_URL:process.env.MONGODB_URL,\n\n ERRORRECIVEREMAIL:process.env.ERRORRECIVEREMAIL,\n NOOFPRESETCOMPANY: process.env.NOOFPRESETCOMPANY,\n PRECOMPANYKEY: process.env.PRECOMPANYKEY,\n\n AI_API_KEY:process.env.AI_API_KEY,\n AI_MODEL:process.env.AI_MODEL,\n\n DEEPSEEK_API_KEY:process.env.DEEPSEEK_API_KEY,\n DEEPSEEK_MODEL:process.env.DEEPSEEK_MODEL,\n\n RESEND_API_KEY: process.env.RESEND_API_KEY,\n RESEND_FROM_EMAIL: process.env.RESEND_FROM_EMAIL,\n\n STORAGE_TYPE:process.env.STORAGE_TYPE,\n\n UNDER_MAINTENANCE: process.env.UNDER_MAINTENANCE,\n myCache: myCache,\n USERPROFILEBUCKET: process.env.USERPROFILEBUCKET,\n // BUG-038 / #92 — S3 request handler timeouts.\n // Previously both timeouts were 300_000ms (5 minutes). A hung Wasabi\n // call would pin the request worker for that long, so a brief\n // upstream outage saturated the pool and degraded unrelated routes.\n // Drop to 30s (covers normal multi-MB uploads on slow links but\n // gives up quickly on truly stuck connections). Env-tunable via\n // `S3_CONNECTION_TIMEOUT_MS` / `S3_SOCKET_TIMEOUT_MS` for operators\n // who need a different ceiling (e.g. very large file uploads).\n requestHandler: new NodeHttpHandler({\n connectionTimeout: Number(process.env.S3_CONNECTION_TIMEOUT_MS) || 30000,\n socketTimeout: Number(process.env.S3_SOCKET_TIMEOUT_MS) || 30000,\n })\n}"}, "1fbfabfcb214346ec7545f9ba519029c9ba3d61d": {"t": 1785753775.6644003, "n": 2091, "h": "7d2982a74b5150e2", "c": "const dotenv = require('dotenv');\nconst path = require('path');\nconst { NodeHttpHandler } = require(\"@smithy/node-http-handler\");\n\nconst appDir = path.dirname(require.main.filename);\ndotenv.config({\n path: path.resolve(appDir, `.env`)\n});\nconst NodeCache = require( \"node-cache\" );\nconst myCache = new NodeCache();\n\nmodule.exports = {\n NODE_ENV : process.env.NODE_ENV || 'development',\n PORT : process.env.PORT || 4000,\n APP_NAME: process.env.APP_NAME,\n\n SERVICE_FILE : process.env.SERVICE_FILE,\n\n FIREBASE_APIKEY : process.env.APIKEY,\n FIREBASE_AUTODOMAIN : process.env.AUTODOMAIN,\n FIREBASE_PROJECTID : process.env.PROJECTID,\n FIREBASE_STORAGEBUCKET : process.env.STORAGEBUCKET,\n FIREBASE_MESSAGINGSENDERID : process.env.MESSAGINGSENDERID,\n FIREBASE_APPID : process.env.APPID,\n FIREBASE_MEASUREMENTID : process.env.MEASUREMENTID,\n\n APIURL: process.env.APIURL,\n WEBURL: process.env.WEBURL,\n\n NODEMAILER_EMAIL: process.env.NODEMAILER_EMAIL,\n NODEMAILER_EMAIL_PASSWORD : process.env.NODEMAILER_EMAIL_PASSWORD,\n NODEMAILER_HOST: process.env.NODEMAILER_HOST,\n NODEMAILER_PORT: process.env.NODEMAILER_PORT,\n\n AWS_SES_KEY: process.env.AWS_SES_KEY,\n AWS_SES_SECRET: process.env.AWS_SES_SECRET,\n AWS_SES_REGION: process.env.AWS_SES_REGION,\n AWS_SES_FROM_DEFAULT: process.env.AWS_SES_FROM_DEFAULT,\n\n ENDPOINT_KEY: process.env.ENDPOINT_KEY,\n MONGODB_URL:process.env.MONGODB_URL,\n\n ERRORRECIVEREMAIL:process.env.ERRORRECIVEREMAIL,\n NOOFPRESETCOMPANY: process.env.NOOFPRESETCOMPANY,\n PRECOMPANYKEY: process.env.PRECOMPANYKEY,\n\n AI_API_KEY:process.env.AI_API_KEY,\n AI_MODEL:process.env.AI_MODEL,\n\n RESEND_API_KEY: process.env.RESEND_API_KEY,\n RESEND_FROM_EMAIL: process.env.RESEND_FROM_EMAIL,\n\n STORAGE_TYPE:process.env.STORAGE_TYPE,\n\n UNDER_MAINTENANCE: process.env.UNDER_MAINTENANCE,\n myCache: myCache,\n USERPROFILEBUCKET: process.env.USERPROFILEBUCKET,\n requestHandler: new NodeHttpHandler({\n connectionTimeout: 300000, // 5 minutes\n socketTimeout: 300000, // 5 minutes\n })\n}"}, "27b645c09c0ca2911f1e82707449eeb44ff42a70": {"t": 1785753777.4587817, "n": 1988, "h": "bc7c3ede5667db17", "c": "const dotenv = require('dotenv');\nconst path = require('path');\nconst { NodeHttpHandler } = require(\"@smithy/node-http-handler\");\n\nconst appDir = path.dirname(require.main.filename);\ndotenv.config({\n path: path.resolve(appDir, `.env`)\n});\nconst NodeCache = require( \"node-cache\" );\nconst myCache = new NodeCache();\n\nmodule.exports = {\n NODE_ENV : process.env.NODE_ENV || 'development',\n PORT : process.env.PORT || 4000,\n APP_NAME: process.env.APP_NAME,\n\n SERVICE_FILE : process.env.SERVICE_FILE,\n\n FIREBASE_APIKEY : process.env.APIKEY,\n FIREBASE_AUTODOMAIN : process.env.AUTODOMAIN,\n FIREBASE_PROJECTID : process.env.PROJECTID,\n FIREBASE_STORAGEBUCKET : process.env.STORAGEBUCKET,\n FIREBASE_MESSAGINGSENDERID : process.env.MESSAGINGSENDERID,\n FIREBASE_APPID : process.env.APPID,\n FIREBASE_MEASUREMENTID : process.env.MEASUREMENTID,\n\n APIURL: process.env.APIURL,\n WEBURL: process.env.WEBURL,\n\n NODEMAILER_EMAIL: process.env.NODEMAILER_EMAIL,\n NODEMAILER_EMAIL_PASSWORD : process.env.NODEMAILER_EMAIL_PASSWORD,\n NODEMAILER_HOST: process.env.NODEMAILER_HOST,\n NODEMAILER_PORT: process.env.NODEMAILER_PORT,\n\n AWS_SES_KEY: process.env.AWS_SES_KEY,\n AWS_SES_SECRET: process.env.AWS_SES_SECRET,\n AWS_SES_REGION: process.env.AWS_SES_REGION,\n AWS_SES_FROM_DEFAULT: process.env.AWS_SES_FROM_DEFAULT,\n\n ENDPOINT_KEY: process.env.ENDPOINT_KEY,\n MONGODB_URL:process.env.MONGODB_URL,\n\n ERRORRECIVEREMAIL:process.env.ERRORRECIVEREMAIL,\n NOOFPRESETCOMPANY: process.env.NOOFPRESETCOMPANY,\n PRECOMPANYKEY: process.env.PRECOMPANYKEY,\n\n AI_API_KEY:process.env.AI_API_KEY,\n AI_MODEL:process.env.AI_MODEL,\n\n STORAGE_TYPE:process.env.STORAGE_TYPE,\n\n UNDER_MAINTENANCE: process.env.UNDER_MAINTENANCE,\n myCache: myCache,\n USERPROFILEBUCKET: process.env.USERPROFILEBUCKET,\n requestHandler: new NodeHttpHandler({\n connectionTimeout: 300000, // 5 minutes\n socketTimeout: 300000, // 5 minutes\n })\n}"}, "d50a0ce5dbb07bb4f64b6c03382da98ed8cc6ca9": {"t": 1785753778.7107823, "n": 2185, "h": "9936133c0f731f06", "c": "const dotenv = require('dotenv');\nconst path = require('path');\nconst { NodeHttpHandler } = require(\"@smithy/node-http-handler\");\n\nconst appDir = path.dirname(require.main.filename);\ndotenv.config({\n path: path.resolve(appDir, `.env`)\n});\nconst NodeCache = require( \"node-cache\" );\nconst myCache = new NodeCache();\n\nmodule.exports = {\n NODE_ENV : process.env.NODE_ENV || 'development',\n PORT : process.env.PORT || 4000,\n APP_NAME: process.env.APP_NAME,\n\n SERVICE_FILE : process.env.SERVICE_FILE,\n\n FIREBASE_APIKEY : process.env.APIKEY,\n FIREBASE_AUTODOMAIN : process.env.AUTODOMAIN,\n FIREBASE_PROJECTID : process.env.PROJECTID,\n FIREBASE_STORAGEBUCKET : process.env.STORAGEBUCKET,\n FIREBASE_MESSAGINGSENDERID : process.env.MESSAGINGSENDERID,\n FIREBASE_APPID : process.env.APPID,\n FIREBASE_MEASUREMENTID : process.env.MEASUREMENTID,\n\n APIURL: process.env.APIURL,\n WEBURL: process.env.WEBURL,\n\n NODEMAILER_EMAIL: process.env.NODEMAILER_EMAIL,\n NODEMAILER_EMAIL_PASSWORD : process.env.NODEMAILER_EMAIL_PASSWORD,\n NODEMAILER_HOST: process.env.NODEMAILER_HOST,\n NODEMAILER_PORT: process.env.NODEMAILER_PORT,\n\n AWS_SES_KEY: process.env.AWS_SES_KEY,\n AWS_SES_SECRET: process.env.AWS_SES_SECRET,\n AWS_SES_REGION: process.env.AWS_SES_REGION,\n AWS_SES_FROM_DEFAULT: process.env.AWS_SES_FROM_DEFAULT,\n\n ENDPOINT_KEY: process.env.ENDPOINT_KEY,\n\n CHARGEBEE_SITE: process.env.CHARGEBEE_SITE,\n CHARGEBEE_API_KEY: process.env.CHARGEBEE_API_KEY,\n MONGODB_URL:process.env.MONGODB_URL,\n\n ERRORRECIVEREMAIL:process.env.ERRORRECIVEREMAIL,\n NOOFPRESETCOMPANY: process.env.NOOFPRESETCOMPANY,\n PRECOMPANYKEY: process.env.PRECOMPANYKEY,\n\n PAYMENTMETHOD: process.env.PAYMENTMETHOD,\n\n AI_API_KEY:process.env.AI_API_KEY,\n AI_MODEL:process.env.AI_MODEL,\n\n STORAGE_TYPE:process.env.STORAGE_TYPE,\n\n PADDLE_API_KEY:process.env.PADDLE_API_KEY,\n UNDER_MAINTENANCE: process.env.UNDER_MAINTENANCE,\n myCache: myCache,\n USERPROFILEBUCKET: process.env.USERPROFILEBUCKET,\n requestHandler: new NodeHttpHandler({\n connectionTimeout: 300000, // 5 minutes\n socketTimeout: 300000, // 5 minutes\n })\n}"}, "4b582a725ead77f376b47ebc7e29830bc2437400": {"t": 1785753782.5226893, "n": 2275, "h": "04785c9c39604517", "c": "const dotenv = require('dotenv');\nconst path = require('path');\nconst { NodeHttpHandler } = require(\"@smithy/node-http-handler\");\n\nconst appDir = path.dirname(require.main.filename);\ndotenv.config({\n path: path.resolve(appDir, `.env`)\n});\nconst NodeCache = require( \"node-cache\" );\nconst myCache = new NodeCache();\n\nmodule.exports = {\n NODE_ENV : process.env.NODE_ENV || 'development',\n PORT : process.env.PORT || 4000,\n APP_NAME: process.env.APP_NAME,\n\n SERVICE_FILE : process.env.SERVICE_FILE,\n\n FIREBASE_APIKEY : process.env.APIKEY,\n FIREBASE_AUTODOMAIN : process.env.AUTODOMAIN,\n FIREBASE_PROJECTID : process.env.PROJECTID,\n FIREBASE_STORAGEBUCKET : process.env.STORAGEBUCKET,\n FIREBASE_MESSAGINGSENDERID : process.env.MESSAGINGSENDERID,\n FIREBASE_APPID : process.env.APPID,\n FIREBASE_MEASUREMENTID : process.env.MEASUREMENTID,\n\n APIURL: process.env.APIURL,\n WEBURL: process.env.WEBURL,\n\n NODEMAILER_EMAIL: process.env.NODEMAILER_EMAIL,\n NODEMAILER_EMAIL_PASSWORD : process.env.NODEMAILER_EMAIL_PASSWORD,\n NODEMAILER_HOST: process.env.NODEMAILER_HOST,\n NODEMAILER_PORT: process.env.NODEMAILER_PORT,\n\n AWS_SES_KEY: process.env.AWS_SES_KEY,\n AWS_SES_SECRET: process.env.AWS_SES_SECRET,\n AWS_SES_REGION: process.env.AWS_SES_REGION,\n AWS_SES_FROM_DEFAULT: process.env.AWS_SES_FROM_DEFAULT,\n\n ENDPOINT_KEY: process.env.ENDPOINT_KEY,\n\n CHARGEBEE_SITE: process.env.CHARGEBEE_SITE,\n CHARGEBEE_API_KEY: process.env.CHARGEBEE_API_KEY,\n MONGODB_URL:process.env.MONGODB_URL,\n\n ERRORRECIVEREMAIL:process.env.ERRORRECIVEREMAIL,\n NOOFPRESETCOMPANY: process.env.NOOFPRESETCOMPANY,\n PRECOMPANYKEY: process.env.PRECOMPANYKEY,\n\n CANYONAPIURL: process.env.CANYONAPIURL,\n ENTERPRISEURL: process.env.ENTERPRISEURL,\n PAYMENTMETHOD: process.env.PAYMENTMETHOD,\n\n AI_API_KEY:process.env.AI_API_KEY,\n AI_MODEL:process.env.AI_MODEL,\n\n STORAGE_TYPE:process.env.STORAGE_TYPE,\n\n PADDLE_API_KEY:process.env.PADDLE_API_KEY,\n UNDER_MAINTENANCE: process.env.UNDER_MAINTENANCE,\n myCache: myCache,\n USERPROFILEBUCKET: process.env.USERPROFILEBUCKET,\n requestHandler: new NodeHttpHandler({\n connectionTimeout: 300000, // 5 minutes\n socketTimeout: 300000, // 5 minutes\n })\n}"}, "5c285b9a044d9e416cdcd808c4739d6f65f8f01c": {"t": 1785753783.7140155, "n": 2419, "h": "03916a05acd6ad70", "c": "const dotenv = require('dotenv');\nconst path = require('path');\nconst { NodeHttpHandler } = require(\"@smithy/node-http-handler\");\n\nconst appDir = path.dirname(require.main.filename);\ndotenv.config({\n path: path.resolve(appDir, `.env`)\n});\nconst NodeCache = require( \"node-cache\" );\nconst myCache = new NodeCache();\n\nmodule.exports = {\n NODE_ENV : process.env.NODE_ENV || 'development',\n PORT : process.env.PORT || 4000,\n APP_NAME: process.env.APP_NAME,\n\n SERVICE_FILE : process.env.SERVICE_FILE,\n\n FIREBASE_APIKEY : process.env.APIKEY,\n FIREBASE_AUTODOMAIN : process.env.AUTODOMAIN,\n FIREBASE_PROJECTID : process.env.PROJECTID,\n FIREBASE_STORAGEBUCKET : process.env.STORAGEBUCKET,\n FIREBASE_MESSAGINGSENDERID : process.env.MESSAGINGSENDERID,\n FIREBASE_APPID : process.env.APPID,\n FIREBASE_MEASUREMENTID : process.env.MEASUREMENTID,\n\n APIURL: process.env.APIURL,\n WEBURL: process.env.WEBURL,\n\n NODEMAILER_EMAIL: process.env.NODEMAILER_EMAIL,\n NODEMAILER_EMAIL_PASSWORD : process.env.NODEMAILER_EMAIL_PASSWORD,\n NODEMAILER_HOST: process.env.NODEMAILER_HOST,\n NODEMAILER_PORT: process.env.NODEMAILER_PORT,\n\n AWS_SES_KEY: process.env.AWS_SES_KEY,\n AWS_SES_SECRET: process.env.AWS_SES_SECRET,\n AWS_SES_REGION: process.env.AWS_SES_REGION,\n AWS_SES_FROM_DEFAULT: process.env.AWS_SES_FROM_DEFAULT,\n\n ENDPOINT_KEY: process.env.ENDPOINT_KEY,\n\n CHARGEBEE_SITE: process.env.CHARGEBEE_SITE,\n CHARGEBEE_API_KEY: process.env.CHARGEBEE_API_KEY,\n MONGODB_URL:process.env.MONGODB_URL,\n\n ERRORRECIVEREMAIL:process.env.ERRORRECIVEREMAIL,\n NOOFPRESETCOMPANY: process.env.NOOFPRESETCOMPANY,\n PRECOMPANYKEY: process.env.PRECOMPANYKEY,\n\n CANYONAPIURL: process.env.CANYONAPIURL,\n CANYONLICENSEKEY:process.env.CANYONLICENSEKEY,\n ENTERPRISEURL: process.env.ENTERPRISEURL,\n CANYONLICENSETYPE: process.env.CANYONLICENSETYPE,\n PAYMENTMETHOD: process.env.PAYMENTMETHOD,\n\n AI_API_KEY:process.env.AI_API_KEY,\n AI_MODEL:process.env.AI_MODEL,\n\n STORAGE_TYPE:process.env.STORAGE_TYPE,\n\n PADDLE_URL:process.env.PADDLE_URL,\n PADDLE_API_KEY:process.env.PADDLE_API_KEY,\n UNDER_MAINTENANCE: process.env.UNDER_MAINTENANCE,\n myCache: myCache,\n USERPROFILEBUCKET: process.env.USERPROFILEBUCKET,\n requestHandler: new NodeHttpHandler({\n connectionTimeout: 300000, // 5 minutes\n socketTimeout: 300000, // 5 minutes\n })\n}"}, "a47b87d5eccc60549a3ccd4a83367c8797e0caf2": {"t": 1786067393.97285, "n": 2799, "h": "c93d7609b5f4a3cb", "c": "const dotenv = require('dotenv');\nconst path = require('path');\nconst { NodeHttpHandler } = require(\"@smithy/node-http-handler\");\n\nconst appDir = path.dirname(require.main.filename);\ndotenv.config({\n path: path.resolve(appDir, `.env`)\n});\nconst NodeCache = require( \"node-cache\" );\nconst myCache = new NodeCache();\n\nmodule.exports = {\n NODE_ENV : process.env.NODE_ENV || 'development',\n PORT : process.env.PORT || 4000,\n APP_NAME: process.env.APP_NAME,\n\n SERVICE_FILE : process.env.SERVICE_FILE,\n\n FIREBASE_APIKEY : process.env.APIKEY,\n FIREBASE_AUTODOMAIN : process.env.AUTODOMAIN,\n FIREBASE_PROJECTID : process.env.PROJECTID,\n FIREBASE_STORAGEBUCKET : process.env.STORAGEBUCKET,\n FIREBASE_MESSAGINGSENDERID : process.env.MESSAGINGSENDERID,\n FIREBASE_APPID : process.env.APPID,\n FIREBASE_MEASUREMENTID : process.env.MEASUREMENTID,\n\n APIURL: process.env.APIURL,\n WEBURL: process.env.WEBURL,\n\n NODEMAILER_EMAIL: process.env.NODEMAILER_EMAIL,\n NODEMAILER_EMAIL_PASSWORD : process.env.NODEMAILER_EMAIL_PASSWORD,\n NODEMAILER_HOST: process.env.NODEMAILER_HOST,\n NODEMAILER_PORT: process.env.NODEMAILER_PORT,\n\n AWS_SES_KEY: process.env.AWS_SES_KEY,\n AWS_SES_SECRET: process.env.AWS_SES_SECRET,\n AWS_SES_REGION: process.env.AWS_SES_REGION,\n AWS_SES_FROM_DEFAULT: process.env.AWS_SES_FROM_DEFAULT,\n\n ENDPOINT_KEY: process.env.ENDPOINT_KEY,\n MONGODB_URL:process.env.MONGODB_URL,\n\n ERRORRECIVEREMAIL:process.env.ERRORRECIVEREMAIL,\n NOOFPRESETCOMPANY: process.env.NOOFPRESETCOMPANY,\n PRECOMPANYKEY: process.env.PRECOMPANYKEY,\n\n AI_API_KEY:process.env.AI_API_KEY,\n AI_MODEL:process.env.AI_MODEL,\n\n DEEPSEEK_API_KEY:process.env.DEEPSEEK_API_KEY,\n DEEPSEEK_MODEL:process.env.DEEPSEEK_MODEL,\n\n RESEND_API_KEY: process.env.RESEND_API_KEY,\n RESEND_FROM_EMAIL: process.env.RESEND_FROM_EMAIL,\n\n STORAGE_TYPE:process.env.STORAGE_TYPE,\n\n UNDER_MAINTENANCE: process.env.UNDER_MAINTENANCE,\n myCache: myCache,\n USERPROFILEBUCKET: process.env.USERPROFILEBUCKET,\n // BUG-038 / #92 — S3 request handler timeouts.\n // Previously both timeouts were 300_000ms (5 minutes). A hung Wasabi\n // call would pin the request worker for that long, so a brief\n // upstream outage saturated the pool and degraded unrelated routes.\n // Drop to 30s (covers normal multi-MB uploads on slow links but\n // gives up quickly on truly stuck connections). Env-tunable via\n // `S3_CONNECTION_TIMEOUT_MS` / `S3_SOCKET_TIMEOUT_MS` for operators\n // who need a different ceiling (e.g. very large file uploads).\n requestHandler: new NodeHttpHandler({\n connectionTimeout: Number(process.env.S3_CONNECTION_TIMEOUT_MS) || 30000,\n socketTimeout: Number(process.env.S3_SOCKET_TIMEOUT_MS) || 30000,\n })\n}"}, "f3d6e9498939a9c36738b176d175be2658f64ef9": {"t": 1786068260.568973, "n": 2799, "h": "c93d7609b5f4a3cb", "c": "const dotenv = require('dotenv');\nconst path = require('path');\nconst { NodeHttpHandler } = require(\"@smithy/node-http-handler\");\n\nconst appDir = path.dirname(require.main.filename);\ndotenv.config({\n path: path.resolve(appDir, `.env`)\n});\nconst NodeCache = require( \"node-cache\" );\nconst myCache = new NodeCache();\n\nmodule.exports = {\n NODE_ENV : process.env.NODE_ENV || 'development',\n PORT : process.env.PORT || 4000,\n APP_NAME: process.env.APP_NAME,\n\n SERVICE_FILE : process.env.SERVICE_FILE,\n\n FIREBASE_APIKEY : process.env.APIKEY,\n FIREBASE_AUTODOMAIN : process.env.AUTODOMAIN,\n FIREBASE_PROJECTID : process.env.PROJECTID,\n FIREBASE_STORAGEBUCKET : process.env.STORAGEBUCKET,\n FIREBASE_MESSAGINGSENDERID : process.env.MESSAGINGSENDERID,\n FIREBASE_APPID : process.env.APPID,\n FIREBASE_MEASUREMENTID : process.env.MEASUREMENTID,\n\n APIURL: process.env.APIURL,\n WEBURL: process.env.WEBURL,\n\n NODEMAILER_EMAIL: process.env.NODEMAILER_EMAIL,\n NODEMAILER_EMAIL_PASSWORD : process.env.NODEMAILER_EMAIL_PASSWORD,\n NODEMAILER_HOST: process.env.NODEMAILER_HOST,\n NODEMAILER_PORT: process.env.NODEMAILER_PORT,\n\n AWS_SES_KEY: process.env.AWS_SES_KEY,\n AWS_SES_SECRET: process.env.AWS_SES_SECRET,\n AWS_SES_REGION: process.env.AWS_SES_REGION,\n AWS_SES_FROM_DEFAULT: process.env.AWS_SES_FROM_DEFAULT,\n\n ENDPOINT_KEY: process.env.ENDPOINT_KEY,\n MONGODB_URL:process.env.MONGODB_URL,\n\n ERRORRECIVEREMAIL:process.env.ERRORRECIVEREMAIL,\n NOOFPRESETCOMPANY: process.env.NOOFPRESETCOMPANY,\n PRECOMPANYKEY: process.env.PRECOMPANYKEY,\n\n AI_API_KEY:process.env.AI_API_KEY,\n AI_MODEL:process.env.AI_MODEL,\n\n DEEPSEEK_API_KEY:process.env.DEEPSEEK_API_KEY,\n DEEPSEEK_MODEL:process.env.DEEPSEEK_MODEL,\n\n RESEND_API_KEY: process.env.RESEND_API_KEY,\n RESEND_FROM_EMAIL: process.env.RESEND_FROM_EMAIL,\n\n STORAGE_TYPE:process.env.STORAGE_TYPE,\n\n UNDER_MAINTENANCE: process.env.UNDER_MAINTENANCE,\n myCache: myCache,\n USERPROFILEBUCKET: process.env.USERPROFILEBUCKET,\n // BUG-038 / #92 — S3 request handler timeouts.\n // Previously both timeouts were 300_000ms (5 minutes). A hung Wasabi\n // call would pin the request worker for that long, so a brief\n // upstream outage saturated the pool and degraded unrelated routes.\n // Drop to 30s (covers normal multi-MB uploads on slow links but\n // gives up quickly on truly stuck connections). Env-tunable via\n // `S3_CONNECTION_TIMEOUT_MS` / `S3_SOCKET_TIMEOUT_MS` for operators\n // who need a different ceiling (e.g. very large file uploads).\n requestHandler: new NodeHttpHandler({\n connectionTimeout: Number(process.env.S3_CONNECTION_TIMEOUT_MS) || 30000,\n socketTimeout: Number(process.env.S3_SOCKET_TIMEOUT_MS) || 30000,\n })\n}"}}, ".env.example": {"517391b2f7c41ff11ebdd1d4985be355b4cebb4a": {"t": 1785747113.9884002, "n": 9924, "h": "c06bd8d38f6e8f94", "c": "# ─────────────────────────────────────────\n# QUICK START\n# Run `npm run setup` — it copies this file to .env and auto-fills:\n# JWT_SECRET, PRECOMPANYKEY (random secure values)\n# STORAGE_TYPE (set to \"server\" — no cloud storage needed for local dev)\n# Everything else can be configured interactively via the installation wizard.\n# ─────────────────────────────────────────\n\n# ─────────────────────────────────────────\n# SERVER\n# ─────────────────────────────────────────\nPORT=4000\nNODE_ENV=\"development\" # development | production\nAPP_NAME=\"AlianHub\"\nUNDER_MAINTENANCE=\"false\" # true | false\n\n# ─────────────────────────────────────────\n# DATABASE\n# ─────────────────────────────────────────\nMONGODB_URL=\"mongodb://localhost:27017\" # REQUIRED — mongo connection string (no trailing slash)\nMONGO_CLOUD_URL=\"https://cloud.mongodb.com/api\"\n\n# ─────────────────────────────────────────\n# AUTH / JWT\n# ─────────────────────────────────────────\nJWT_SECRET=\"your_jwt_secret_here\" # REQUIRED\nJWT_EXP=\"24h\"\nJWT_ALGORITHM=\"HS256\"\n\n# Two-factor auth (TOTP) — all OPTIONAL. 2FA works without them (safe values are\n# derived from JWT_SECRET), but set dedicated secrets in production so rotating\n# JWT_SECRET doesn't break stored 2FA secrets or in-flight login second-steps.\nTWO_FACTOR_ENC_KEY=\"\" # key material for encrypting TOTP secrets at rest\nTWO_FACTOR_TEMP_SECRET=\"\" # signs the short-lived login second-step (temp) token\nTWO_FACTOR_ISSUER=\"AlianHub\" # label shown in the user's authenticator app\n\n\n# How long (in seconds) the per-(user, company) membership lookup is cached\n# after a successful authenticated request. Lower values pick up membership\n# changes (add / remove member) faster at the cost of an extra Mongo query;\n# higher values are cheaper but widen the window where a removed user can\n# still call the API. Default 60s. Set to 0 to bypass the cache entirely.\nMEMBERSHIP_CACHE_TTL_SECONDS=\"60\"\n\n# Login / forgot-password / reset-password rate-limit (per IP).\n# - MAX_ATTEMPTS: failed attempts before the IP is blocked (default 5).\n# - WINDOW_MS: rolling-window length the attempts are counted in (default 15 min).\n# - BLOCK_MS: how long the IP stays blocked once tripped (default 30 min).\nAUTH_RATE_LIMIT_MAX_ATTEMPTS=\"5\"\nAUTH_RATE_LIMIT_WINDOW_MS=\"900000\"\nAUTH_RATE_LIMIT_BLOCK_MS=\"1800000\"\n\n\n# ─────────────────────────────────────────\n# OAUTH / SOCIAL LOGIN (Google + GitHub)\n# Optional — leave blank to keep social login disabled. Buttons only appear\n# when the matching VUE_APP_IS_*_LOGIN flag (frontend/.env) is \"true\".\n#\n# The browser performs the OAuth popup/redirect, then the backend (a) exchanges\n# the code for tokens and (b) re-verifies the identity with the provider before\n# logging anyone in — so these client ids/secrets are REQUIRED for login to work.\n# ─────────────────────────────────────────\n\n# Google — create an OAuth 2.0 Client ID (type: Web application) at\n# https://console.cloud.google.com/apis/credentials\n# Authorized JavaScript origins: your WEBURL (e.g. http://localhost:8080 in dev).\n# The same client id must also be set as VUE_APP_GOOGLE_CLIENT_ID in frontend/.env.\nGOOGLE_CLIENT_ID=\"\" # used for token exchange AND id-token verification\nGOOGLE_CLIENT_SECRET=\"\"\nGOOGLE_OAUTH_URL=\"https://oauth2.googleapis.com/token\" # Google token endpoint\nGOOGLE_OAUTH_REQUIRED=\"true\" # \"true\" rejects logins that fail id-token verification (recommended)\n\n# GitHub — create an OAuth App at https://github.com/settings/developers\n# Authorization callback URL: your WEBURL (the SPA reads the ?code= on return).\n# The same client id must also be set as VUE_APP_GITHUB_CLIENT_ID in frontend/.env,\n# and VUE_APP_GITHUB_BASE_OAUTH_URL=https://github.com/login/oauth.\nGITHUB_CLIENT_ID=\"\"\nGITHUB_CLIENT_SECRET=\"\"\nGITHUB_BASE_OAUTH_URL=\"https://github.com/login/oauth\" # authorize + access_token base\nGITHUB_OAUTH_REQUIRED=\"true\" # \"true\" requires server-side verification via GitHub /user (recommended)\n\n# GitLab — create an Application at https://gitlab.com/-/profile/applications\n# Redirect URI: your WEBURL (the SPA reads ?code= on return). Scope: read_user.\n# The same client id must also be set as VUE_APP_GITLAB_CLIENT_ID in frontend/.env,\n# and VUE_APP_GITLAB_BASE_OAUTH_URL=https://gitlab.com/oauth.\n# For self-managed GitLab, point the *_BASE_OAUTH_URL / *_BASE_API_URL at your host.\nGITLAB_CLIENT_ID=\"\"\nGITLAB_CLIENT_SECRET=\"\"\nGITLAB_BASE_OAUTH_URL=\"https://gitlab.com/oauth\" # authorize + token base\nGITLAB_BASE_API_URL=\"https://gitlab.com/api/v4\" # used to verify the identity (/user)\nGITLAB_OAUTH_REQUIRED=\"true\" # \"true\" requires server-side verification via GitLab /user (recommended)\n\n# ─────────────────────────────────────────\n# APP URLs\n# ─────────────────────────────────────────\nAPIURL=\"http://localhost:4000/\"\nWEBURL=\"http://localhost:4000\"\n\n# Optional extra browser origins (comma-separated, no trailing slash) that\n# should be allowed to call the API and open Socket.io connections in\n# addition to WEBURL / APIURL. Use this for multi-domain deployments\n# (e.g. a staging frontend on a separate host). Leave blank in single-\n# domain setups.\nCORS_ORIGINS=\"http://localhost:8080\"\n\n# ─────────────────────────────────────────\n# STORAGE\n# ─────────────────────────────────────────\nSTORAGE_TYPE=\"wasabi\" # wasabi | server\n\n# Upper limits for images sent through sharp (BUG-023 fix).\n# - MAX_IMAGE_FILE_BYTES bounds the file/buffer size in bytes (default 25 MB).\n# - MAX_IMAGE_PIXELS bounds the on-disk pixel count to prevent\n# pixel-bomb DoS (e.g. a 30000x30000 PNG). Default 50 megapixels\n# (≈ 7100x7100).\nMAX_IMAGE_FILE_BYTES=\"26214400\"\nMAX_IMAGE_PIXELS=\"50000000\"\n\n# Wasabi S3-compatible storage\nWASABI_ACCESS_KEY=\"\"\nWASABI_SECRET_ACCESS_KEY=\"\"\nWASABI_USERID=\"\"\nWASABIENDPOINT=\"https://s3.wasabisys.com\"\nWASABI_REGION=\"us-east-1\"\nIAM_ENDPOINT=\"https://iam.wasabisys.com\"\nUSERPROFILEBUCKET=\"your-bucket-name\"\n\n# ─────────────────────────────────────────\n# EMAIL — Nodemailer (SMTP)\n# ─────────────────────────────────────────\nNODEMAILER_HOST=\"smtp.gmail.com\"\nNODEMAILER_PORT=\"587\" # 587 (STARTTLS) or 465 (SSL)\nNODEMAILER_EMAIL=\"your@email.com\"\nNODEMAILER_EMAIL_PASSWORD=\"\" # Use app password for Gmail\n\n# ─────────────────────────────────────────\n# EMAIL — Resend HTTP API (recommended for cloud hosting)\n# Set RESEND_API_KEY to use Resend instead of SMTP\n# ─────────────────────────────────────────\nRESEND_API_KEY=\"\" # Get from resend.com\nRESEND_FROM_EMAIL=\"onboarding@resend.dev\" # Use verified domain in production\n\n# ─────────────────────────────────────────\n# FIREBASE (push notifications)\n# Leave blank to disable push notifications\n# ─────────────────────────────────────────\nSERVICE_FILE=\"./firebase-adminsdk.json\" # Path to Firebase service account JSON (must be inside project root)\nAPIKEY=\"\"\nAUTODOMAIN=\"\"\nPROJECTID=\"\"\nSTORAGEBUCKET=\"\"\nMESSAGINGSENDERID=\"\"\nAPPID=\"\"\nMEASUREMENTID=\"\"\n\n# ─────────────────────────────────────────\n# SOCKET.IO ADMIN UI (optional)\n# Leave both blank to disable the admin UI (recommended for production\n# unless you actively need it). Both values must be set to enable.\n# Username is plain text. Password must be a bcrypt hash — generate with:\n# node -e \"console.log(require('bcrypt').hashSync(process.argv[1], 12))\" '<your-password>'\n# ─────────────────────────────────────────\nSOCKETIO_ADMIN_USERNAME=\"alian\"\nSOCKETIO_ADMIN_PASSWORD_HASH=\"$2a$12$HHemhzmTrC8Dmf2Gd9v/Teo9oiCxfYJb.St3HKMBx1L3wJmZLeX5u\"\n\n# ─────────────────────────────────────────\n# AI\n# ─────────────────────────────────────────\nLLM_PROVIDER=\"openai\" # openai | anthropic | deepseek\nAI_API_KEY=\"\"\nAI_MODEL=\"gpt-4.1\" # recommended: gpt-4o or gpt-4.1 for best instruction-following on complex plans\n # gpt-5-mini / gpt-4o-mini work but produce fewer, more bundled tasks\nANTHROPIC_API_KEY=\"\"\nANTHROPIC_MODEL=\"claude-sonnet-4-5-20250929\" # current Sonnet 4.5 model id\nDEEPSEEK_API_KEY=\"\"\nDEEPSEEK_MODEL=\"deepseek-v4-flash\" # deepseek-chat / deepseek-reasoner / deepseek-v4-flash / deepseek-v4-pro (all V4: 1M ctx, up to 384K output)\n # reasoner & pro use \"thinking\" mode — they spend extra output tokens on reasoning, so raise LLM_MAX_TOKENS_PLAN if large plans truncate\nLLM_MAX_TOKENS_PLAN=32000 # cap for the planning call (raise if you see \"ran out of output token budget\")\nLLM_MAX_TOKENS_CLARIFY=2000 # cap for follow-up Q&A\n# ANTHROPIC_TIMEOUT_MS=600000 # optional: raise Anthropic SDK timeout (default 10 min)\n# OPENAI_TIMEOUT_MS=600000 # optional: raise OpenAI axios timeout (default: 10 min for reasoning/gpt-5, 4 min for others)\n# DEEPSEEK_TIMEOUT_MS=600000 # optional: raise DeepSeek axios timeout (default: 10 min for reasoner, 4 min for chat)\n# DEEPSEEK_BASE_URL=\"https://api.deepseek.com\" # optional: override DeepSeek base URL (e.g. for a compatible proxy)\n\n# ─────────────────────────────────────────\n# DEMO MODE (public demo instances only)\n# When DEMO_MODE=true, the app shows a \"you're on the live demo\" banner with\n# the shared demo credentials and a \"deploy your own\" link. Leave false for\n# real deployments. Only set DEMO_EMAIL/DEMO_PASSWORD on a throwaway demo DB.\n# ─────────────────────────────────────────\nDEMO_MODE=\"false\"\nDEMO_EMAIL=\"\"\nDEMO_PASSWORD=\"\"\n\n# ─────────────────────────────────────────\n# MISC\n# ─────────────────────────────────────────\nNOOFPRESETCOMPANY=10\nPRECOMPANYKEY=\"your_preset_key\"\nERRORRECIVEREMAIL=\"admin@yourdomain.com\" # Email to receive error alerts\nENDPOINT_KEY=\"\"\n"}, "176acbb6af89639ab4b8558ee918f29ef7671442": {"t": 1785753776.8229287, "n": 9924, "h": "c06bd8d38f6e8f94", "c": "# ─────────────────────────────────────────\n# QUICK START\n# Run `npm run setup` — it copies this file to .env and auto-fills:\n# JWT_SECRET, PRECOMPANYKEY (random secure values)\n# STORAGE_TYPE (set to \"server\" — no cloud storage needed for local dev)\n# Everything else can be configured interactively via the installation wizard.\n# ─────────────────────────────────────────\n\n# ─────────────────────────────────────────\n# SERVER\n# ─────────────────────────────────────────\nPORT=4000\nNODE_ENV=\"development\" # development | production\nAPP_NAME=\"AlianHub\"\nUNDER_MAINTENANCE=\"false\" # true | false\n\n# ─────────────────────────────────────────\n# DATABASE\n# ─────────────────────────────────────────\nMONGODB_URL=\"mongodb://localhost:27017\" # REQUIRED — mongo connection string (no trailing slash)\nMONGO_CLOUD_URL=\"https://cloud.mongodb.com/api\"\n\n# ─────────────────────────────────────────\n# AUTH / JWT\n# ─────────────────────────────────────────\nJWT_SECRET=\"your_jwt_secret_here\" # REQUIRED\nJWT_EXP=\"24h\"\nJWT_ALGORITHM=\"HS256\"\n\n# Two-factor auth (TOTP) — all OPTIONAL. 2FA works without them (safe values are\n# derived from JWT_SECRET), but set dedicated secrets in production so rotating\n# JWT_SECRET doesn't break stored 2FA secrets or in-flight login second-steps.\nTWO_FACTOR_ENC_KEY=\"\" # key material for encrypting TOTP secrets at rest\nTWO_FACTOR_TEMP_SECRET=\"\" # signs the short-lived login second-step (temp) token\nTWO_FACTOR_ISSUER=\"AlianHub\" # label shown in the user's authenticator app\n\n\n# How long (in seconds) the per-(user, company) membership lookup is cached\n# after a successful authenticated request. Lower values pick up membership\n# changes (add / remove member) faster at the cost of an extra Mongo query;\n# higher values are cheaper but widen the window where a removed user can\n# still call the API. Default 60s. Set to 0 to bypass the cache entirely.\nMEMBERSHIP_CACHE_TTL_SECONDS=\"60\"\n\n# Login / forgot-password / reset-password rate-limit (per IP).\n# - MAX_ATTEMPTS: failed attempts before the IP is blocked (default 5).\n# - WINDOW_MS: rolling-window length the attempts are counted in (default 15 min).\n# - BLOCK_MS: how long the IP stays blocked once tripped (default 30 min).\nAUTH_RATE_LIMIT_MAX_ATTEMPTS=\"5\"\nAUTH_RATE_LIMIT_WINDOW_MS=\"900000\"\nAUTH_RATE_LIMIT_BLOCK_MS=\"1800000\"\n\n\n# ─────────────────────────────────────────\n# OAUTH / SOCIAL LOGIN (Google + GitHub)\n# Optional — leave blank to keep social login disabled. Buttons only appear\n# when the matching VUE_APP_IS_*_LOGIN flag (frontend/.env) is \"true\".\n#\n# The browser performs the OAuth popup/redirect, then the backend (a) exchanges\n# the code for tokens and (b) re-verifies the identity with the provider before\n# logging anyone in — so these client ids/secrets are REQUIRED for login to work.\n# ─────────────────────────────────────────\n\n# Google — create an OAuth 2.0 Client ID (type: Web application) at\n# https://console.cloud.google.com/apis/credentials\n# Authorized JavaScript origins: your WEBURL (e.g. http://localhost:8080 in dev).\n# The same client id must also be set as VUE_APP_GOOGLE_CLIENT_ID in frontend/.env.\nGOOGLE_CLIENT_ID=\"\" # used for token exchange AND id-token verification\nGOOGLE_CLIENT_SECRET=\"\"\nGOOGLE_OAUTH_URL=\"https://oauth2.googleapis.com/token\" # Google token endpoint\nGOOGLE_OAUTH_REQUIRED=\"true\" # \"true\" rejects logins that fail id-token verification (recommended)\n\n# GitHub — create an OAuth App at https://github.com/settings/developers\n# Authorization callback URL: your WEBURL (the SPA reads the ?code= on return).\n# The same client id must also be set as VUE_APP_GITHUB_CLIENT_ID in frontend/.env,\n# and VUE_APP_GITHUB_BASE_OAUTH_URL=https://github.com/login/oauth.\nGITHUB_CLIENT_ID=\"\"\nGITHUB_CLIENT_SECRET=\"\"\nGITHUB_BASE_OAUTH_URL=\"https://github.com/login/oauth\" # authorize + access_token base\nGITHUB_OAUTH_REQUIRED=\"true\" # \"true\" requires server-side verification via GitHub /user (recommended)\n\n# GitLab — create an Application at https://gitlab.com/-/profile/applications\n# Redirect URI: your WEBURL (the SPA reads ?code= on return). Scope: read_user.\n# The same client id must also be set as VUE_APP_GITLAB_CLIENT_ID in frontend/.env,\n# and VUE_APP_GITLAB_BASE_OAUTH_URL=https://gitlab.com/oauth.\n# For self-managed GitLab, point the *_BASE_OAUTH_URL / *_BASE_API_URL at your host.\nGITLAB_CLIENT_ID=\"\"\nGITLAB_CLIENT_SECRET=\"\"\nGITLAB_BASE_OAUTH_URL=\"https://gitlab.com/oauth\" # authorize + token base\nGITLAB_BASE_API_URL=\"https://gitlab.com/api/v4\" # used to verify the identity (/user)\nGITLAB_OAUTH_REQUIRED=\"true\" # \"true\" requires server-side verification via GitLab /user (recommended)\n\n# ─────────────────────────────────────────\n# APP URLs\n# ─────────────────────────────────────────\nAPIURL=\"http://localhost:4000/\"\nWEBURL=\"http://localhost:4000\"\n\n# Optional extra browser origins (comma-separated, no trailing slash) that\n# should be allowed to call the API and open Socket.io connections in\n# addition to WEBURL / APIURL. Use this for multi-domain deployments\n# (e.g. a staging frontend on a separate host). Leave blank in single-\n# domain setups.\nCORS_ORIGINS=\"http://localhost:8080\"\n\n# ─────────────────────────────────────────\n# STORAGE\n# ─────────────────────────────────────────\nSTORAGE_TYPE=\"wasabi\" # wasabi | server\n\n# Upper limits for images sent through sharp (BUG-023 fix).\n# - MAX_IMAGE_FILE_BYTES bounds the file/buffer size in bytes (default 25 MB).\n# - MAX_IMAGE_PIXELS bounds the on-disk pixel count to prevent\n# pixel-bomb DoS (e.g. a 30000x30000 PNG). Default 50 megapixels\n# (≈ 7100x7100).\nMAX_IMAGE_FILE_BYTES=\"26214400\"\nMAX_IMAGE_PIXELS=\"50000000\"\n\n# Wasabi S3-compatible storage\nWASABI_ACCESS_KEY=\"\"\nWASABI_SECRET_ACCESS_KEY=\"\"\nWASABI_USERID=\"\"\nWASABIENDPOINT=\"https://s3.wasabisys.com\"\nWASABI_REGION=\"us-east-1\"\nIAM_ENDPOINT=\"https://iam.wasabisys.com\"\nUSERPROFILEBUCKET=\"your-bucket-name\"\n\n# ─────────────────────────────────────────\n# EMAIL — Nodemailer (SMTP)\n# ─────────────────────────────────────────\nNODEMAILER_HOST=\"smtp.gmail.com\"\nNODEMAILER_PORT=\"587\" # 587 (STARTTLS) or 465 (SSL)\nNODEMAILER_EMAIL=\"your@email.com\"\nNODEMAILER_EMAIL_PASSWORD=\"\" # Use app password for Gmail\n\n# ─────────────────────────────────────────\n# EMAIL — Resend HTTP API (recommended for cloud hosting)\n# Set RESEND_API_KEY to use Resend instead of SMTP\n# ─────────────────────────────────────────\nRESEND_API_KEY=\"\" # Get from resend.com\nRESEND_FROM_EMAIL=\"onboarding@resend.dev\" # Use verified domain in production\n\n# ─────────────────────────────────────────\n# FIREBASE (push notifications)\n# Leave blank to disable push notifications\n# ─────────────────────────────────────────\nSERVICE_FILE=\"./firebase-adminsdk.json\" # Path to Firebase service account JSON (must be inside project root)\nAPIKEY=\"\"\nAUTODOMAIN=\"\"\nPROJECTID=\"\"\nSTORAGEBUCKET=\"\"\nMESSAGINGSENDERID=\"\"\nAPPID=\"\"\nMEASUREMENTID=\"\"\n\n# ─────────────────────────────────────────\n# SOCKET.IO ADMIN UI (optional)\n# Leave both blank to disable the admin UI (recommended for production\n# unless you actively need it). Both values must be set to enable.\n# Username is plain text. Password must be a bcrypt hash — generate with:\n# node -e \"console.log(require('bcrypt').hashSync(process.argv[1], 12))\" '<your-password>'\n# ─────────────────────────────────────────\nSOCKETIO_ADMIN_USERNAME=\"alian\"\nSOCKETIO_ADMIN_PASSWORD_HASH=\"$2a$12$HHemhzmTrC8Dmf2Gd9v/Teo9oiCxfYJb.St3HKMBx1L3wJmZLeX5u\"\n\n# ─────────────────────────────────────────\n# AI\n# ─────────────────────────────────────────\nLLM_PROVIDER=\"openai\" # openai | anthropic | deepseek\nAI_API_KEY=\"\"\nAI_MODEL=\"gpt-4.1\" # recommended: gpt-4o or gpt-4.1 for best instruction-following on complex plans\n # gpt-5-mini / gpt-4o-mini work but produce fewer, more bundled tasks\nANTHROPIC_API_KEY=\"\"\nANTHROPIC_MODEL=\"claude-sonnet-4-5-20250929\" # current Sonnet 4.5 model id\nDEEPSEEK_API_KEY=\"\"\nDEEPSEEK_MODEL=\"deepseek-v4-flash\" # deepseek-chat / deepseek-reasoner / deepseek-v4-flash / deepseek-v4-pro (all V4: 1M ctx, up to 384K output)\n # reasoner & pro use \"thinking\" mode — they spend extra output tokens on reasoning, so raise LLM_MAX_TOKENS_PLAN if large plans truncate\nLLM_MAX_TOKENS_PLAN=32000 # cap for the planning call (raise if you see \"ran out of output token budget\")\nLLM_MAX_TOKENS_CLARIFY=2000 # cap for follow-up Q&A\n# ANTHROPIC_TIMEOUT_MS=600000 # optional: raise Anthropic SDK timeout (default 10 min)\n# OPENAI_TIMEOUT_MS=600000 # optional: raise OpenAI axios timeout (default: 10 min for reasoning/gpt-5, 4 min for others)\n# DEEPSEEK_TIMEOUT_MS=600000 # optional: raise DeepSeek axios timeout (default: 10 min for reasoner, 4 min for chat)\n# DEEPSEEK_BASE_URL=\"https://api.deepseek.com\" # optional: override DeepSeek base URL (e.g. for a compatible proxy)\n\n# ─────────────────────────────────────────\n# DEMO MODE (public demo instances only)\n# When DEMO_MODE=true, the app shows a \"you're on the live demo\" banner with\n# the shared demo credentials and a \"deploy your own\" link. Leave false for\n# real deployments. Only set DEMO_EMAIL/DEMO_PASSWORD on a throwaway demo DB.\n# ─────────────────────────────────────────\nDEMO_MODE=\"false\"\nDEMO_EMAIL=\"\"\nDEMO_PASSWORD=\"\"\n\n# ─────────────────────────────────────────\n# MISC\n# ─────────────────────────────────────────\nNOOFPRESETCOMPANY=10\nPRECOMPANYKEY=\"your_preset_key\"\nERRORRECIVEREMAIL=\"admin@yourdomain.com\" # Email to receive error alerts\nENDPOINT_KEY=\"\"\n"}, "6c3b419e46a54eb75d78306a49c9d0e24b8396f9": {"t": 1785753778.3439562, "n": 9402, "h": "6d3e158c999049e2", "c": "# ─────────────────────────────────────────\n# QUICK START\n# Run `npm run setup` — it copies this file to .env and auto-fills:\n# JWT_SECRET, PRECOMPANYKEY (random secure values)\n# STORAGE_TYPE (set to \"server\" — no cloud storage needed for local dev)\n# Everything else can be configured interactively via the installation wizard.\n# ─────────────────────────────────────────\n\n# ─────────────────────────────────────────\n# SERVER\n# ─────────────────────────────────────────\nPORT=4000\nNODE_ENV=\"development\" # development | production\nAPP_NAME=\"AlianHub\"\nUNDER_MAINTENANCE=\"false\" # true | false\n\n# ─────────────────────────────────────────\n# DATABASE\n# ─────────────────────────────────────────\nMONGODB_URL=\"mongodb://localhost:27017\" # REQUIRED — mongo connection string (no trailing slash)\nMONGO_CLOUD_URL=\"https://cloud.mongodb.com/api\"\n\n# ─────────────────────────────────────────\n# AUTH / JWT\n# ─────────────────────────────────────────\nJWT_SECRET=\"your_jwt_secret_here\" # REQUIRED\nJWT_EXP=\"24h\"\nJWT_ALGORITHM=\"HS256\"\n\n\n# How long (in seconds) the per-(user, company) membership lookup is cached\n# after a successful authenticated request. Lower values pick up membership\n# changes (add / remove member) faster at the cost of an extra Mongo query;\n# higher values are cheaper but widen the window where a removed user can\n# still call the API. Default 60s. Set to 0 to bypass the cache entirely.\nMEMBERSHIP_CACHE_TTL_SECONDS=\"60\"\n\n# Login / forgot-password / reset-password rate-limit (per IP).\n# - MAX_ATTEMPTS: failed attempts before the IP is blocked (default 5).\n# - WINDOW_MS: rolling-window length the attempts are counted in (default 15 min).\n# - BLOCK_MS: how long the IP stays blocked once tripped (default 30 min).\nAUTH_RATE_LIMIT_MAX_ATTEMPTS=\"5\"\nAUTH_RATE_LIMIT_WINDOW_MS=\"900000\"\nAUTH_RATE_LIMIT_BLOCK_MS=\"1800000\"\n\n\n# ─────────────────────────────────────────\n# OAUTH / SOCIAL LOGIN (Google + GitHub)\n# Optional — leave blank to keep social login disabled. Buttons only appear\n# when the matching VUE_APP_IS_*_LOGIN flag (frontend/.env) is \"true\".\n#\n# The browser performs the OAuth popup/redirect, then the backend (a) exchanges\n# the code for tokens and (b) re-verifies the identity with the provider before\n# logging anyone in — so these client ids/secrets are REQUIRED for login to work.\n# ─────────────────────────────────────────\n\n# Google — create an OAuth 2.0 Client ID (type: Web application) at\n# https://console.cloud.google.com/apis/credentials\n# Authorized JavaScript origins: your WEBURL (e.g. http://localhost:8080 in dev).\n# The same client id must also be set as VUE_APP_GOOGLE_CLIENT_ID in frontend/.env.\nGOOGLE_CLIENT_ID=\"\" # used for token exchange AND id-token verification\nGOOGLE_CLIENT_SECRET=\"\"\nGOOGLE_OAUTH_URL=\"https://oauth2.googleapis.com/token\" # Google token endpoint\nGOOGLE_OAUTH_REQUIRED=\"true\" # \"true\" rejects logins that fail id-token verification (recommended)\n\n# GitHub — create an OAuth App at https://github.com/settings/developers\n# Authorization callback URL: your WEBURL (the SPA reads the ?code= on return).\n# The same client id must also be set as VUE_APP_GITHUB_CLIENT_ID in frontend/.env,\n# and VUE_APP_GITHUB_BASE_OAUTH_URL=https://github.com/login/oauth.\nGITHUB_CLIENT_ID=\"\"\nGITHUB_CLIENT_SECRET=\"\"\nGITHUB_BASE_OAUTH_URL=\"https://github.com/login/oauth\" # authorize + access_token base\nGITHUB_OAUTH_REQUIRED=\"true\" # \"true\" requires server-side verification via GitHub /user (recommended)\n\n# GitLab — create an Application at https://gitlab.com/-/profile/applications\n# Redirect URI: your WEBURL (the SPA reads ?code= on return). Scope: read_user.\n# The same client id must also be set as VUE_APP_GITLAB_CLIENT_ID in frontend/.env,\n# and VUE_APP_GITLAB_BASE_OAUTH_URL=https://gitlab.com/oauth.\n# For self-managed GitLab, point the *_BASE_OAUTH_URL / *_BASE_API_URL at your host.\nGITLAB_CLIENT_ID=\"\"\nGITLAB_CLIENT_SECRET=\"\"\nGITLAB_BASE_OAUTH_URL=\"https://gitlab.com/oauth\" # authorize + token base\nGITLAB_BASE_API_URL=\"https://gitlab.com/api/v4\" # used to verify the identity (/user)\nGITLAB_OAUTH_REQUIRED=\"true\" # \"true\" requires server-side verification via GitLab /user (recommended)\n\n# ─────────────────────────────────────────\n# APP URLs\n# ─────────────────────────────────────────\nAPIURL=\"http://localhost:4000/\"\nWEBURL=\"http://localhost:4000\"\n\n# Optional extra browser origins (comma-separated, no trailing slash) that\n# should be allowed to call the API and open Socket.io connections in\n# addition to WEBURL / APIURL. Use this for multi-domain deployments\n# (e.g. a staging frontend on a separate host). Leave blank in single-\n# domain setups.\nCORS_ORIGINS=\"http://localhost:8080\"\n\n# ─────────────────────────────────────────\n# STORAGE\n# ─────────────────────────────────────────\nSTORAGE_TYPE=\"wasabi\" # wasabi | server\n\n# Upper limits for images sent through sharp (BUG-023 fix).\n# - MAX_IMAGE_FILE_BYTES bounds the file/buffer size in bytes (default 25 MB).\n# - MAX_IMAGE_PIXELS bounds the on-disk pixel count to prevent\n# pixel-bomb DoS (e.g. a 30000x30000 PNG). Default 50 megapixels\n# (≈ 7100x7100).\nMAX_IMAGE_FILE_BYTES=\"26214400\"\nMAX_IMAGE_PIXELS=\"50000000\"\n\n# Wasabi S3-compatible storage\nWASABI_ACCESS_KEY=\"\"\nWASABI_SECRET_ACCESS_KEY=\"\"\nWASABI_USERID=\"\"\nWASABIENDPOINT=\"https://s3.wasabisys.com\"\nWASABI_REGION=\"us-east-1\"\nIAM_ENDPOINT=\"https://iam.wasabisys.com\"\nUSERPROFILEBUCKET=\"your-bucket-name\"\n\n# ─────────────────────────────────────────\n# EMAIL — Nodemailer (SMTP)\n# ─────────────────────────────────────────\nNODEMAILER_HOST=\"smtp.gmail.com\"\nNODEMAILER_PORT=\"587\" # 587 (STARTTLS) or 465 (SSL)\nNODEMAILER_EMAIL=\"your@email.com\"\nNODEMAILER_EMAIL_PASSWORD=\"\" # Use app password for Gmail\n\n# ─────────────────────────────────────────\n# EMAIL — Resend HTTP API (recommended for cloud hosting)\n# Set RESEND_API_KEY to use Resend instead of SMTP\n# ─────────────────────────────────────────\nRESEND_API_KEY=\"\" # Get from resend.com\nRESEND_FROM_EMAIL=\"onboarding@resend.dev\" # Use verified domain in production\n\n# ─────────────────────────────────────────\n# FIREBASE (push notifications)\n# Leave blank to disable push notifications\n# ─────────────────────────────────────────\nSERVICE_FILE=\"./firebase-adminsdk.json\" # Path to Firebase service account JSON (must be inside project root)\nAPIKEY=\"\"\nAUTODOMAIN=\"\"\nPROJECTID=\"\"\nSTORAGEBUCKET=\"\"\nMESSAGINGSENDERID=\"\"\nAPPID=\"\"\nMEASUREMENTID=\"\"\n\n# ─────────────────────────────────────────\n# SOCKET.IO ADMIN UI (optional)\n# Leave both blank to disable the admin UI (recommended for production\n# unless you actively need it). Both values must be set to enable.\n# Username is plain text. Password must be a bcrypt hash — generate with:\n# node -e \"console.log(require('bcrypt').hashSync(process.argv[1], 12))\" '<your-password>'\n# ─────────────────────────────────────────\nSOCKETIO_ADMIN_USERNAME=\"alian\"\nSOCKETIO_ADMIN_PASSWORD_HASH=\"$2a$12$HHemhzmTrC8Dmf2Gd9v/Teo9oiCxfYJb.St3HKMBx1L3wJmZLeX5u\"\n\n# ─────────────────────────────────────────\n# AI\n# ─────────────────────────────────────────\nLLM_PROVIDER=\"openai\" # openai | anthropic | deepseek\nAI_API_KEY=\"\"\nAI_MODEL=\"gpt-4.1\" # recommended: gpt-4o or gpt-4.1 for best instruction-following on complex plans\n # gpt-5-mini / gpt-4o-mini work but produce fewer, more bundled tasks\nANTHROPIC_API_KEY=\"\"\nANTHROPIC_MODEL=\"claude-sonnet-4-5-20250929\" # current Sonnet 4.5 model id\nDEEPSEEK_API_KEY=\"\"\nDEEPSEEK_MODEL=\"deepseek-v4-flash\" # deepseek-chat / deepseek-reasoner / deepseek-v4-flash / deepseek-v4-pro (all V4: 1M ctx, up to 384K output)\n # reasoner & pro use \"thinking\" mode — they spend extra output tokens on reasoning, so raise LLM_MAX_TOKENS_PLAN if large plans truncate\nLLM_MAX_TOKENS_PLAN=32000 # cap for the planning call (raise if you see \"ran out of output token budget\")\nLLM_MAX_TOKENS_CLARIFY=2000 # cap for follow-up Q&A\n# ANTHROPIC_TIMEOUT_MS=600000 # optional: raise Anthropic SDK timeout (default 10 min)\n# OPENAI_TIMEOUT_MS=600000 # optional: raise OpenAI axios timeout (default: 10 min for reasoning/gpt-5, 4 min for others)\n# DEEPSEEK_TIMEOUT_MS=600000 # optional: raise DeepSeek axios timeout (default: 10 min for reasoner, 4 min for chat)\n# DEEPSEEK_BASE_URL=\"https://api.deepseek.com\" # optional: override DeepSeek base URL (e.g. for a compatible proxy)\n\n# ─────────────────────────────────────────\n# DEMO MODE (public demo instances only)\n# When DEMO_MODE=true, the app shows a \"you're on the live demo\" banner with\n# the shared demo credentials and a \"deploy your own\" link. Leave false for\n# real deployments. Only set DEMO_EMAIL/DEMO_PASSWORD on a throwaway demo DB.\n# ─────────────────────────────────────────\nDEMO_MODE=\"false\"\nDEMO_EMAIL=\"\"\nDEMO_PASSWORD=\"\"\n\n# ─────────────────────────────────────────\n# MISC\n# ─────────────────────────────────────────\nNOOFPRESETCOMPANY=10\nPRECOMPANYKEY=\"your_preset_key\"\nERRORRECIVEREMAIL=\"admin@yourdomain.com\" # Email to receive error alerts\nENDPOINT_KEY=\"\"\n"}, "7039582df48dd423df68514acb2851fb8a2adccb": {"t": 1785753779.7014008, "n": 6585, "h": "32bc357dce582c5e", "c": "# ─────────────────────────────────────────\n# QUICK START\n# Run `npm run setup` — it copies this file to .env and auto-fills:\n# JWT_SECRET, PRECOMPANYKEY (random secure values)\n# STORAGE_TYPE (set to \"server\" — no cloud storage needed for local dev)\n# Everything else can be configured interactively via the installation wizard.\n# ─────────────────────────────────────────\n\n# ─────────────────────────────────────────\n# SERVER\n# ─────────────────────────────────────────\nPORT=4000\nNODE_ENV=\"development\" # development | production\nAPP_NAME=\"AlianHub\"\nUNDER_MAINTENANCE=\"false\" # true | false\n\n# ─────────────────────────────────────────\n# DATABASE\n# ─────────────────────────────────────────\nMONGODB_URL=\"mongodb://localhost:27017\" # REQUIRED — mongo connection string (no trailing slash)\nMONGO_CLOUD_URL=\"https://cloud.mongodb.com/api\"\n\n# ─────────────────────────────────────────\n# AUTH / JWT\n# ─────────────────────────────────────────\nJWT_SECRET=\"your_jwt_secret_here\" # REQUIRED\nJWT_EXP=\"24h\"\nJWT_ALGORITHM=\"HS256\"\n\n\n# How long (in seconds) the per-(user, company) membership lookup is cached\n# after a successful authenticated request. Lower values pick up membership\n# changes (add / remove member) faster at the cost of an extra Mongo query;\n# higher values are cheaper but widen the window where a removed user can\n# still call the API. Default 60s. Set to 0 to bypass the cache entirely.\nMEMBERSHIP_CACHE_TTL_SECONDS=\"60\"\n\n# Login / forgot-password / reset-password rate-limit (per IP).\n# - MAX_ATTEMPTS: failed attempts before the IP is blocked (default 5).\n# - WINDOW_MS: rolling-window length the attempts are counted in (default 15 min).\n# - BLOCK_MS: how long the IP stays blocked once tripped (default 30 min).\nAUTH_RATE_LIMIT_MAX_ATTEMPTS=\"5\"\nAUTH_RATE_LIMIT_WINDOW_MS=\"900000\"\nAUTH_RATE_LIMIT_BLOCK_MS=\"1800000\"\n\n\n# ─────────────────────────────────────────\n# APP URLs\n# ─────────────────────────────────────────\nAPIURL=\"http://localhost:4000/\"\nWEBURL=\"http://localhost:4000\"\n\n# Optional extra browser origins (comma-separated, no trailing slash) that\n# should be allowed to call the API and open Socket.io connections in\n# addition to WEBURL / APIURL. Use this for multi-domain deployments\n# (e.g. a staging frontend on a separate host). Leave blank in single-\n# domain setups.\nCORS_ORIGINS=\"http://localhost:8080\"\n\n# ─────────────────────────────────────────\n# STORAGE\n# ─────────────────────────────────────────\nSTORAGE_TYPE=\"wasabi\" # wasabi | server\n\n# Upper limits for images sent through sharp (BUG-023 fix).\n# - MAX_IMAGE_FILE_BYTES bounds the file/buffer size in bytes (default 25 MB).\n# - MAX_IMAGE_PIXELS bounds the on-disk pixel count to prevent\n# pixel-bomb DoS (e.g. a 30000x30000 PNG). Default 50 megapixels\n# (≈ 7100x7100).\nMAX_IMAGE_FILE_BYTES=\"26214400\"\nMAX_IMAGE_PIXELS=\"50000000\"\n\n# Wasabi S3-compatible storage\nWASABI_ACCESS_KEY=\"\"\nWASABI_SECRET_ACCESS_KEY=\"\"\nWASABI_USERID=\"\"\nWASABIENDPOINT=\"https://s3.wasabisys.com\"\nWASABI_REGION=\"us-east-1\"\nIAM_ENDPOINT=\"https://iam.wasabisys.com\"\nUSERPROFILEBUCKET=\"your-bucket-name\"\n\n# ─────────────────────────────────────────\n# EMAIL — Nodemailer (SMTP)\n# ─────────────────────────────────────────\nNODEMAILER_HOST=\"smtp.gmail.com\"\nNODEMAILER_PORT=\"587\" # 587 (STARTTLS) or 465 (SSL)\nNODEMAILER_EMAIL=\"your@email.com\"\nNODEMAILER_EMAIL_PASSWORD=\"\" # Use app password for Gmail\n\n# ─────────────────────────────────────────\n# EMAIL — Resend HTTP API (recommended for cloud hosting)\n# Set RESEND_API_KEY to use Resend instead of SMTP\n# ─────────────────────────────────────────\nRESEND_API_KEY=\"\" # Get from resend.com\nRESEND_FROM_EMAIL=\"onboarding@resend.dev\" # Use verified domain in production\n\n# ─────────────────────────────────────────\n# FIREBASE (push notifications)\n# Leave blank to disable push notifications\n# ─────────────────────────────────────────\nSERVICE_FILE=\"./firebase-adminsdk.json\" # Path to Firebase service account JSON (must be inside project root)\nAPIKEY=\"\"\nAUTODOMAIN=\"\"\nPROJECTID=\"\"\nSTORAGEBUCKET=\"\"\nMESSAGINGSENDERID=\"\"\nAPPID=\"\"\nMEASUREMENTID=\"\"\n\n# ─────────────────────────────────────────\n# SOCKET.IO ADMIN UI (optional)\n# Leave both blank to disable the admin UI (recommended for production\n# unless you actively need it). Both values must be set to enable.\n# Username is plain text. Password must be a bcrypt hash — generate with:\n# node -e \"console.log(require('bcrypt').hashSync(process.argv[1], 12))\" '<your-password>'\n# ─────────────────────────────────────────\nSOCKETIO_ADMIN_USERNAME=\"alian\"\nSOCKETIO_ADMIN_PASSWORD_HASH=\"$2a$12$HHemhzmTrC8Dmf2Gd9v/Teo9oiCxfYJb.St3HKMBx1L3wJmZLeX5u\"\n\n# ─────────────────────────────────────────\n# AI\n# ─────────────────────────────────────────\nLLM_PROVIDER=\"openai\" # openai | anthropic | deepseek\nAI_API_KEY=\"\"\nAI_MODEL=\"gpt-4.1\" # recommended: gpt-4o or gpt-4.1 for best instruction-following on complex plans\n # gpt-5-mini / gpt-4o-mini work but produce fewer, more bundled tasks\nANTHROPIC_API_KEY=\"\"\nANTHROPIC_MODEL=\"claude-sonnet-4-5-20250929\" # current Sonnet 4.5 model id\nDEEPSEEK_API_KEY=\"\"\nDEEPSEEK_MODEL=\"deepseek-v4-flash\" # deepseek-chat / deepseek-reasoner / deepseek-v4-flash / deepseek-v4-pro (all V4: 1M ctx, up to 384K output)\n # reasoner & pro use \"thinking\" mode — they spend extra output tokens on reasoning, so raise LLM_MAX_TOKENS_PLAN if large plans truncate\nLLM_MAX_TOKENS_PLAN=32000 # cap for the planning call (raise if you see \"ran out of output token budget\")\nLLM_MAX_TOKENS_CLARIFY=2000 # cap for follow-up Q&A\n# ANTHROPIC_TIMEOUT_MS=600000 # optional: raise Anthropic SDK timeout (default 10 min)\n# OPENAI_TIMEOUT_MS=600000 # optional: raise OpenAI axios timeout (default: 10 min for reasoning/gpt-5, 4 min for others)\n# DEEPSEEK_TIMEOUT_MS=600000 # optional: raise DeepSeek axios timeout (default: 10 min for reasoner, 4 min for chat)\n# DEEPSEEK_BASE_URL=\"https://api.deepseek.com\" # optional: override DeepSeek base URL (e.g. for a compatible proxy)\n\n# ─────────────────────────────────────────\n# MISC\n# ─────────────────────────────────────────\nNOOFPRESETCOMPANY=10\nPRECOMPANYKEY=\"your_preset_key\"\nERRORRECIVEREMAIL=\"admin@yourdomain.com\" # Email to receive error alerts\nENDPOINT_KEY=\"\"\n"}, "69712b46136bba6821b7154a32a78c6c25b8c55d": {"t": 1785753782.3193421, "n": 2586, "h": "86b3b582926f907a", "c": "# ─────────────────────────────────────────\n# SERVER\n# ─────────────────────────────────────────\nPORT=4000\nNODE_ENV=\"development\" # development | production\nAPP_NAME=\"AlianHub\"\nUNDER_MAINTENANCE=\"false\" # true | false\n\n# ─────────────────────────────────────────\n# DATABASE\n# ─────────────────────────────────────────\nMONGODB_URL=\"mongodb://localhost:27017\" # REQUIRED — mongo connection string (no trailing slash)\n\n# ─────────────────────────────────────────\n# AUTH / JWT\n# ─────────────────────────────────────────\nJWT_SECRET=\"your_jwt_secret_here\" # REQUIRED\nJWT_EXP=\"24h\"\nJWT_ALGORITHM=\"HS256\"\n\n# ─────────────────────────────────────────\n# APP URLs\n# ─────────────────────────────────────────\nAPIURL=\"http://localhost:4000/\"\nWEBURL=\"http://localhost:4000\"\n\n# ─────────────────────────────────────────\n# STORAGE\n# ─────────────────────────────────────────\nSTORAGE_TYPE=\"wasabi\" # wasabi | server\n\n# Wasabi S3-compatible storage\nWASABI_ACCESS_KEY=\"\"\nWASABI_SECRET_ACCESS_KEY=\"\"\nWASABI_USERID=\"\"\nWASABIENDPOINT=\"https://s3.wasabisys.com\"\nWASABI_REGION=\"us-east-1\"\nIAM_ENDPOINT=\"https://iam.wasabisys.com\"\nUSERPROFILEBUCKET=\"your-bucket-name\"\n\n# ─────────────────────────────────────────\n# EMAIL — Nodemailer (SMTP)\n# ─────────────────────────────────────────\nNODEMAILER_HOST=\"smtp.gmail.com\"\nNODEMAILER_PORT=\"587\" # 587 (STARTTLS) or 465 (SSL)\nNODEMAILER_EMAIL=\"your@email.com\"\nNODEMAILER_EMAIL_PASSWORD=\"\" # Use app password for Gmail\n\n# ─────────────────────────────────────────\n# EMAIL — Resend HTTP API (recommended for cloud hosting)\n# Set RESEND_API_KEY to use Resend instead of SMTP\n# ─────────────────────────────────────────\nRESEND_API_KEY=\"\" # Get from resend.com\nRESEND_FROM_EMAIL=\"onboarding@resend.dev\" # Use verified domain in production\n\n# ─────────────────────────────────────────\n# FIREBASE (push notifications)\n# Leave blank to disable push notifications\n# ─────────────────────────────────────────\nSERVICE_FILE=\"../firebase-adminsdk.json\" # Path to Firebase service account JSON\nAPIKEY=\"\"\nAUTODOMAIN=\"\"\nPROJECTID=\"\"\nSTORAGEBUCKET=\"\"\nMESSAGINGSENDERID=\"\"\nAPPID=\"\"\nMEASUREMENTID=\"\"\n\n# ─────────────────────────────────────────\n# AI\n# ─────────────────────────────────────────\nAI_API_KEY=\"\"\nAI_MODEL=\"\"\n\n# ─────────────────────────────────────────\n# MISC\n# ─────────────────────────────────────────\nNOOFPRESETCOMPANY=10\nPRECOMPANYKEY=\"your_preset_key\"\nERRORRECIVEREMAIL=\"admin@yourdomain.com\" # Email to receive error alerts\nENDPOINT_KEY=\"\"\n"}, "eaa7ca0cf629eafabaaf5651ad6dfe2340375c20": {"t": 1785753783.9231117, "n": 445, "h": "e49594d2909d7030", "c": "PORT=4000\nNODE_ENV=\"production\"\nAPP_NAME=\"Your App Name\"\nSERVICE_FILE=\"../firebase-adminsdk.json\"\nWASABIENDPOINT=\"https://s3.wasabisys.com\"\nWASABI_REGION=\"us-east-1\"\nIAM_ENDPOINT=\"https://iam.wasabisys.com\"\nJWT_EXP=\"24h\"\nJWT_ALGORITHM=\"HS256\"\nNOOFPRESETCOMPANY=10\nAPIURL=\"http://localhost:4000/\"\nMONGO_CLOUD_URL=\"https://cloud.mongodb.com/api\"\nJWT_SECRET=\"e4298c901e6498d77881df577295aaf4\"\nPRECOMPANYKEY=\"d478ged1\"\nWEBURL=\"http://localhost:4000\""}, "38b047283bec8312ed10fff6976f43506e34bd6a": {"t": 1785753785.0735307, "n": 477, "h": "4345cb9ae38acc26", "c": "PORT=4000\nNODE_ENV=\"production\"\nAPP_NAME=\"Your App Name\"\nSERVICE_FILE=\"../firebase-adminsdk.json\"\nWASABIENDPOINT=\"https://s3.wasabisys.com\"\nWASABI_REGION=\"us-east-1\"\nIAM_ENDPOINT=\"https://iam.wasabisys.com\"\nUSERPROFILEBUCKET=\"user_images\"\nJWT_EXP=\"24h\"\nJWT_ALGORITHM=\"HS256\"\nNOOFPRESETCOMPANY=10\nAPIURL=\"http://localhost:4000/\"\nMONGO_CLOUD_URL=\"https://cloud.mongodb.com/api\"\nJWT_SECRET=\"e4298c901e6498d77881df577295aaf4\"\nPRECOMPANYKEY=\"d478ged1\"\nWEBURL=\"http://localhost:4000\""}, "27b645c09c0ca2911f1e82707449eeb44ff42a70": {"t": 1785753786.2714977, "n": 476, "h": "447166b785a84262", "c": "PORT=4000\nNODE_ENV=\"production\"\nAPP_NAME=\"Your App Name\"\nSERVICE_FILE=\"../firebase-adminsdk.json\"\nWASABIENDPOINT=\"https://s3.wasabisys.com\"\nWASABI_REGION=\"us-east-1\"\nIAM_ENDPOINT=\"https://iam.wasabisys.com\"\nUSERPROFILEBUCKET=\"userimages\"\nJWT_EXP=\"24h\"\nJWT_ALGORITHM=\"HS256\"\nNOOFPRESETCOMPANY=10\nAPIURL=\"http://localhost:4000/\"\nMONGO_CLOUD_URL=\"https://cloud.mongodb.com/api\"\nJWT_SECRET=\"e4298c901e6498d77881df577295aaf4\"\nPRECOMPANYKEY=\"d478ged1\"\nWEBURL=\"http://localhost:4000\""}, "5c285b9a044d9e416cdcd808c4739d6f65f8f01c": {"t": 1785753789.739456, "n": 4358, "h": "468cefaad09d6492", "c": "#################### PLEASE DON'T ADD ANYTHING IN `\"` OR `\"\" ` ADD VALUE DIRECTLY AFTER `=`. ####################\n\n################################################################################################################################################\n\n########################################################################\nMONGODB VARIABLES\nREFER 2.1 IN DOCUMENT FOR SETUP BELOW MONGODB VARIABLES\n########################################################################\n\nMONGODB_URL=\n\n################################################################################################################################################\n\n########################################################################\nWASABI VARIABLES\nREFER 2.4 IN DOCUMENT FOR SETUP BELOW WASABI VARIABLES\n########################################################################\n\nWASABI_SECRET_ACCESS_KEY=\nWASABI_ACCESS_KEY=\nWASABI_USERID=\n\n################################################################################################################################################\n\n########################################################################\nFIREBASE VARIABLES\nREFER 2.5 IN DOCUMENT FOR SETUP BELOW FIREBASE VARIABLES\n########################################################################\n\nAPIKEY=\nAUTODOMAIN=\nPROJECTID=\nSTORAGEBUCKET=\nMESSAGINGSENDERID=\nAPPID=\nMEASUREMENTID=\n\n################################################################################################################################################\n\n########################################################################\nNODEMAILER VARIABLES\nREFER 2.6 IN DOCUMENT FOR SETUP BELOW NODEMAILER VARIABLES\n########################################################################\n\nNODEMAILER_EMAIL=\nNODEMAILER_EMAIL_PASSWORD=\nNODEMAILER_HOST=\nNODEMAILER_PORT=\n\n################################################################################################################################################\n\n########################################################################\nFor JWT_SECRET go to ‘https://acte.ltd/utils/randomkeygen’ website and then copy ‘Encryption key 256’ and add in JWT_SECRET varaible\n########################################################################\n\nJWT_SECRET=\n\n################################################################################################################################################\n\n########################################################################\nFor PRECOMPANYKEY go to ‘https://acte.ltd/utils/randomkeygen’ website and then copy ‘Basic 8’ and add in PRECOMPANYKEY varaible\n########################################################################\n\nPRECOMPANYKEY=\n\n################################################################################################################################################\n\n########################################################################\nADD VALUE AS PER YOUR NEED FOR BELOW VARIABLE\n########################################################################\n\n# Server Environment eg. Production\nNODE_ENV=\n\n# App Name is used in Email and Notification\nAPP_NAME=\n\n# Your api url\nAPIURL=\n\n# Your web url\nWEBURL=\n\n# Your Code canyon licensekey\nCANYONLICENSEKEY=\n\n# Add receiver email for receive any error email of backend process. Add multiple email by “,” .\nERRORRECIVEREMAIL=\n\n\n################################################################################################################################################\n\n########################################################################\nDO NOT CHANGE BELOW KEPT BELOW VALUE AS IT IS.\n########################################################################\n\nPORT=4000\nSERVICE_FILE=../firebase-adminsdk.json\nWASABIENDPOINT=https://s3.wasabisys.com\nWASABI_REGION=us-east-1\nIAM_ENDPOINT=https://iam.wasabisys.com\nCANYONAPIURL=https://console.alianhub.com\nUSERPROFILEBUCKET=userimageproduction\nJWT_EXP=24h\nJWT_ALGORITHM=HS256\nNOOFPRESETCOMPANY=10\nFREE_COMPANY_COUNT= -1(Unlimited) || 0(Unlimited) || Number\nTRACKSHOT_RETENTION_DAYS=180\n\n# If a user has been inactive for 5 days, no notifications will be sent to them during this period.\nNOTIFICATIONACTIVETIME=5(Number)\n\n################################################################################################################################################"}, "a47b87d5eccc60549a3ccd4a83367c8797e0caf2": {"t": 1786068068.9962375, "n": 9924, "h": "c06bd8d38f6e8f94", "c": "# ─────────────────────────────────────────\n# QUICK START\n# Run `npm run setup` — it copies this file to .env and auto-fills:\n# JWT_SECRET, PRECOMPANYKEY (random secure values)\n# STORAGE_TYPE (set to \"server\" — no cloud storage needed for local dev)\n# Everything else can be configured interactively via the installation wizard.\n# ─────────────────────────────────────────\n\n# ─────────────────────────────────────────\n# SERVER\n# ─────────────────────────────────────────\nPORT=4000\nNODE_ENV=\"development\" # development | production\nAPP_NAME=\"AlianHub\"\nUNDER_MAINTENANCE=\"false\" # true | false\n\n# ─────────────────────────────────────────\n# DATABASE\n# ─────────────────────────────────────────\nMONGODB_URL=\"mongodb://localhost:27017\" # REQUIRED — mongo connection string (no trailing slash)\nMONGO_CLOUD_URL=\"https://cloud.mongodb.com/api\"\n\n# ─────────────────────────────────────────\n# AUTH / JWT\n# ─────────────────────────────────────────\nJWT_SECRET=\"your_jwt_secret_here\" # REQUIRED\nJWT_EXP=\"24h\"\nJWT_ALGORITHM=\"HS256\"\n\n# Two-factor auth (TOTP) — all OPTIONAL. 2FA works without them (safe values are\n# derived from JWT_SECRET), but set dedicated secrets in production so rotating\n# JWT_SECRET doesn't break stored 2FA secrets or in-flight login second-steps.\nTWO_FACTOR_ENC_KEY=\"\" # key material for encrypting TOTP secrets at rest\nTWO_FACTOR_TEMP_SECRET=\"\" # signs the short-lived login second-step (temp) token\nTWO_FACTOR_ISSUER=\"AlianHub\" # label shown in the user's authenticator app\n\n\n# How long (in seconds) the per-(user, company) membership lookup is cached\n# after a successful authenticated request. Lower values pick up membership\n# changes (add / remove member) faster at the cost of an extra Mongo query;\n# higher values are cheaper but widen the window where a removed user can\n# still call the API. Default 60s. Set to 0 to bypass the cache entirely.\nMEMBERSHIP_CACHE_TTL_SECONDS=\"60\"\n\n# Login / forgot-password / reset-password rate-limit (per IP).\n# - MAX_ATTEMPTS: failed attempts before the IP is blocked (default 5).\n# - WINDOW_MS: rolling-window length the attempts are counted in (default 15 min).\n# - BLOCK_MS: how long the IP stays blocked once tripped (default 30 min).\nAUTH_RATE_LIMIT_MAX_ATTEMPTS=\"5\"\nAUTH_RATE_LIMIT_WINDOW_MS=\"900000\"\nAUTH_RATE_LIMIT_BLOCK_MS=\"1800000\"\n\n\n# ─────────────────────────────────────────\n# OAUTH / SOCIAL LOGIN (Google + GitHub)\n# Optional — leave blank to keep social login disabled. Buttons only appear\n# when the matching VUE_APP_IS_*_LOGIN flag (frontend/.env) is \"true\".\n#\n# The browser performs the OAuth popup/redirect, then the backend (a) exchanges\n# the code for tokens and (b) re-verifies the identity with the provider before\n# logging anyone in — so these client ids/secrets are REQUIRED for login to work.\n# ─────────────────────────────────────────\n\n# Google — create an OAuth 2.0 Client ID (type: Web application) at\n# https://console.cloud.google.com/apis/credentials\n# Authorized JavaScript origins: your WEBURL (e.g. http://localhost:8080 in dev).\n# The same client id must also be set as VUE_APP_GOOGLE_CLIENT_ID in frontend/.env.\nGOOGLE_CLIENT_ID=\"\" # used for token exchange AND id-token verification\nGOOGLE_CLIENT_SECRET=\"\"\nGOOGLE_OAUTH_URL=\"https://oauth2.googleapis.com/token\" # Google token endpoint\nGOOGLE_OAUTH_REQUIRED=\"true\" # \"true\" rejects logins that fail id-token verification (recommended)\n\n# GitHub — create an OAuth App at https://github.com/settings/developers\n# Authorization callback URL: your WEBURL (the SPA reads the ?code= on return).\n# The same client id must also be set as VUE_APP_GITHUB_CLIENT_ID in frontend/.env,\n# and VUE_APP_GITHUB_BASE_OAUTH_URL=https://github.com/login/oauth.\nGITHUB_CLIENT_ID=\"\"\nGITHUB_CLIENT_SECRET=\"\"\nGITHUB_BASE_OAUTH_URL=\"https://github.com/login/oauth\" # authorize + access_token base\nGITHUB_OAUTH_REQUIRED=\"true\" # \"true\" requires server-side verification via GitHub /user (recommended)\n\n# GitLab — create an Application at https://gitlab.com/-/profile/applications\n# Redirect URI: your WEBURL (the SPA reads ?code= on return). Scope: read_user.\n# The same client id must also be set as VUE_APP_GITLAB_CLIENT_ID in frontend/.env,\n# and VUE_APP_GITLAB_BASE_OAUTH_URL=https://gitlab.com/oauth.\n# For self-managed GitLab, point the *_BASE_OAUTH_URL / *_BASE_API_URL at your host.\nGITLAB_CLIENT_ID=\"\"\nGITLAB_CLIENT_SECRET=\"\"\nGITLAB_BASE_OAUTH_URL=\"https://gitlab.com/oauth\" # authorize + token base\nGITLAB_BASE_API_URL=\"https://gitlab.com/api/v4\" # used to verify the identity (/user)\nGITLAB_OAUTH_REQUIRED=\"true\" # \"true\" requires server-side verification via GitLab /user (recommended)\n\n# ─────────────────────────────────────────\n# APP URLs\n# ─────────────────────────────────────────\nAPIURL=\"http://localhost:4000/\"\nWEBURL=\"http://localhost:4000\"\n\n# Optional extra browser origins (comma-separated, no trailing slash) that\n# should be allowed to call the API and open Socket.io connections in\n# addition to WEBURL / APIURL. Use this for multi-domain deployments\n# (e.g. a staging frontend on a separate host). Leave blank in single-\n# domain setups.\nCORS_ORIGINS=\"http://localhost:8080\"\n\n# ─────────────────────────────────────────\n# STORAGE\n# ─────────────────────────────────────────\nSTORAGE_TYPE=\"wasabi\" # wasabi | server\n\n# Upper limits for images sent through sharp (BUG-023 fix).\n# - MAX_IMAGE_FILE_BYTES bounds the file/buffer size in bytes (default 25 MB).\n# - MAX_IMAGE_PIXELS bounds the on-disk pixel count to prevent\n# pixel-bomb DoS (e.g. a 30000x30000 PNG). Default 50 megapixels\n# (≈ 7100x7100).\nMAX_IMAGE_FILE_BYTES=\"26214400\"\nMAX_IMAGE_PIXELS=\"50000000\"\n\n# Wasabi S3-compatible storage\nWASABI_ACCESS_KEY=\"\"\nWASABI_SECRET_ACCESS_KEY=\"\"\nWASABI_USERID=\"\"\nWASABIENDPOINT=\"https://s3.wasabisys.com\"\nWASABI_REGION=\"us-east-1\"\nIAM_ENDPOINT=\"https://iam.wasabisys.com\"\nUSERPROFILEBUCKET=\"your-bucket-name\"\n\n# ─────────────────────────────────────────\n# EMAIL — Nodemailer (SMTP)\n# ─────────────────────────────────────────\nNODEMAILER_HOST=\"smtp.gmail.com\"\nNODEMAILER_PORT=\"587\" # 587 (STARTTLS) or 465 (SSL)\nNODEMAILER_EMAIL=\"your@email.com\"\nNODEMAILER_EMAIL_PASSWORD=\"\" # Use app password for Gmail\n\n# ─────────────────────────────────────────\n# EMAIL — Resend HTTP API (recommended for cloud hosting)\n# Set RESEND_API_KEY to use Resend instead of SMTP\n# ─────────────────────────────────────────\nRESEND_API_KEY=\"\" # Get from resend.com\nRESEND_FROM_EMAIL=\"onboarding@resend.dev\" # Use verified domain in production\n\n# ─────────────────────────────────────────\n# FIREBASE (push notifications)\n# Leave blank to disable push notifications\n# ─────────────────────────────────────────\nSERVICE_FILE=\"./firebase-adminsdk.json\" # Path to Firebase service account JSON (must be inside project root)\nAPIKEY=\"\"\nAUTODOMAIN=\"\"\nPROJECTID=\"\"\nSTORAGEBUCKET=\"\"\nMESSAGINGSENDERID=\"\"\nAPPID=\"\"\nMEASUREMENTID=\"\"\n\n# ─────────────────────────────────────────\n# SOCKET.IO ADMIN UI (optional)\n# Leave both blank to disable the admin UI (recommended for production\n# unless you actively need it). Both values must be set to enable.\n# Username is plain text. Password must be a bcrypt hash — generate with:\n# node -e \"console.log(require('bcrypt').hashSync(process.argv[1], 12))\" '<your-password>'\n# ─────────────────────────────────────────\nSOCKETIO_ADMIN_USERNAME=\"alian\"\nSOCKETIO_ADMIN_PASSWORD_HASH=\"$2a$12$HHemhzmTrC8Dmf2Gd9v/Teo9oiCxfYJb.St3HKMBx1L3wJmZLeX5u\"\n\n# ─────────────────────────────────────────\n# AI\n# ─────────────────────────────────────────\nLLM_PROVIDER=\"openai\" # openai | anthropic | deepseek\nAI_API_KEY=\"\"\nAI_MODEL=\"gpt-4.1\" # recommended: gpt-4o or gpt-4.1 for best instruction-following on complex plans\n # gpt-5-mini / gpt-4o-mini work but produce fewer, more bundled tasks\nANTHROPIC_API_KEY=\"\"\nANTHROPIC_MODEL=\"claude-sonnet-4-5-20250929\" # current Sonnet 4.5 model id\nDEEPSEEK_API_KEY=\"\"\nDEEPSEEK_MODEL=\"deepseek-v4-flash\" # deepseek-chat / deepseek-reasoner / deepseek-v4-flash / deepseek-v4-pro (all V4: 1M ctx, up to 384K output)\n # reasoner & pro use \"thinking\" mode — they spend extra output tokens on reasoning, so raise LLM_MAX_TOKENS_PLAN if large plans truncate\nLLM_MAX_TOKENS_PLAN=32000 # cap for the planning call (raise if you see \"ran out of output token budget\")\nLLM_MAX_TOKENS_CLARIFY=2000 # cap for follow-up Q&A\n# ANTHROPIC_TIMEOUT_MS=600000 # optional: raise Anthropic SDK timeout (default 10 min)\n# OPENAI_TIMEOUT_MS=600000 # optional: raise OpenAI axios timeout (default: 10 min for reasoning/gpt-5, 4 min for others)\n# DEEPSEEK_TIMEOUT_MS=600000 # optional: raise DeepSeek axios timeout (default: 10 min for reasoner, 4 min for chat)\n# DEEPSEEK_BASE_URL=\"https://api.deepseek.com\" # optional: override DeepSeek base URL (e.g. for a compatible proxy)\n\n# ─────────────────────────────────────────\n# DEMO MODE (public demo instances only)\n# When DEMO_MODE=true, the app shows a \"you're on the live demo\" banner with\n# the shared demo credentials and a \"deploy your own\" link. Leave false for\n# real deployments. Only set DEMO_EMAIL/DEMO_PASSWORD on a throwaway demo DB.\n# ─────────────────────────────────────────\nDEMO_MODE=\"false\"\nDEMO_EMAIL=\"\"\nDEMO_PASSWORD=\"\"\n\n# ─────────────────────────────────────────\n# MISC\n# ─────────────────────────────────────────\nNOOFPRESETCOMPANY=10\nPRECOMPANYKEY=\"your_preset_key\"\nERRORRECIVEREMAIL=\"admin@yourdomain.com\" # Email to receive error alerts\nENDPOINT_KEY=\"\"\n"}, "f3d6e9498939a9c36738b176d175be2658f64ef9": {"t": 1786068548.7534652, "n": 9924, "h": "c06bd8d38f6e8f94", "c": "# ─────────────────────────────────────────\n# QUICK START\n# Run `npm run setup` — it copies this file to .env and auto-fills:\n# JWT_SECRET, PRECOMPANYKEY (random secure values)\n# STORAGE_TYPE (set to \"server\" — no cloud storage needed for local dev)\n# Everything else can be configured interactively via the installation wizard.\n# ─────────────────────────────────────────\n\n# ─────────────────────────────────────────\n# SERVER\n# ─────────────────────────────────────────\nPORT=4000\nNODE_ENV=\"development\" # development | production\nAPP_NAME=\"AlianHub\"\nUNDER_MAINTENANCE=\"false\" # true | false\n\n# ─────────────────────────────────────────\n# DATABASE\n# ─────────────────────────────────────────\nMONGODB_URL=\"mongodb://localhost:27017\" # REQUIRED — mongo connection string (no trailing slash)\nMONGO_CLOUD_URL=\"https://cloud.mongodb.com/api\"\n\n# ─────────────────────────────────────────\n# AUTH / JWT\n# ─────────────────────────────────────────\nJWT_SECRET=\"your_jwt_secret_here\" # REQUIRED\nJWT_EXP=\"24h\"\nJWT_ALGORITHM=\"HS256\"\n\n# Two-factor auth (TOTP) — all OPTIONAL. 2FA works without them (safe values are\n# derived from JWT_SECRET), but set dedicated secrets in production so rotating\n# JWT_SECRET doesn't break stored 2FA secrets or in-flight login second-steps.\nTWO_FACTOR_ENC_KEY=\"\" # key material for encrypting TOTP secrets at rest\nTWO_FACTOR_TEMP_SECRET=\"\" # signs the short-lived login second-step (temp) token\nTWO_FACTOR_ISSUER=\"AlianHub\" # label shown in the user's authenticator app\n\n\n# How long (in seconds) the per-(user, company) membership lookup is cached\n# after a successful authenticated request. Lower values pick up membership\n# changes (add / remove member) faster at the cost of an extra Mongo query;\n# higher values are cheaper but widen the window where a removed user can\n# still call the API. Default 60s. Set to 0 to bypass the cache entirely.\nMEMBERSHIP_CACHE_TTL_SECONDS=\"60\"\n\n# Login / forgot-password / reset-password rate-limit (per IP).\n# - MAX_ATTEMPTS: failed attempts before the IP is blocked (default 5).\n# - WINDOW_MS: rolling-window length the attempts are counted in (default 15 min).\n# - BLOCK_MS: how long the IP stays blocked once tripped (default 30 min).\nAUTH_RATE_LIMIT_MAX_ATTEMPTS=\"5\"\nAUTH_RATE_LIMIT_WINDOW_MS=\"900000\"\nAUTH_RATE_LIMIT_BLOCK_MS=\"1800000\"\n\n\n# ─────────────────────────────────────────\n# OAUTH / SOCIAL LOGIN (Google + GitHub)\n# Optional — leave blank to keep social login disabled. Buttons only appear\n# when the matching VUE_APP_IS_*_LOGIN flag (frontend/.env) is \"true\".\n#\n# The browser performs the OAuth popup/redirect, then the backend (a) exchanges\n# the code for tokens and (b) re-verifies the identity with the provider before\n# logging anyone in — so these client ids/secrets are REQUIRED for login to work.\n# ─────────────────────────────────────────\n\n# Google — create an OAuth 2.0 Client ID (type: Web application) at\n# https://console.cloud.google.com/apis/credentials\n# Authorized JavaScript origins: your WEBURL (e.g. http://localhost:8080 in dev).\n# The same client id must also be set as VUE_APP_GOOGLE_CLIENT_ID in frontend/.env.\nGOOGLE_CLIENT_ID=\"\" # used for token exchange AND id-token verification\nGOOGLE_CLIENT_SECRET=\"\"\nGOOGLE_OAUTH_URL=\"https://oauth2.googleapis.com/token\" # Google token endpoint\nGOOGLE_OAUTH_REQUIRED=\"true\" # \"true\" rejects logins that fail id-token verification (recommended)\n\n# GitHub — create an OAuth App at https://github.com/settings/developers\n# Authorization callback URL: your WEBURL (the SPA reads the ?code= on return).\n# The same client id must also be set as VUE_APP_GITHUB_CLIENT_ID in frontend/.env,\n# and VUE_APP_GITHUB_BASE_OAUTH_URL=https://github.com/login/oauth.\nGITHUB_CLIENT_ID=\"\"\nGITHUB_CLIENT_SECRET=\"\"\nGITHUB_BASE_OAUTH_URL=\"https://github.com/login/oauth\" # authorize + access_token base\nGITHUB_OAUTH_REQUIRED=\"true\" # \"true\" requires server-side verification via GitHub /user (recommended)\n\n# GitLab — create an Application at https://gitlab.com/-/profile/applications\n# Redirect URI: your WEBURL (the SPA reads ?code= on return). Scope: read_user.\n# The same client id must also be set as VUE_APP_GITLAB_CLIENT_ID in frontend/.env,\n# and VUE_APP_GITLAB_BASE_OAUTH_URL=https://gitlab.com/oauth.\n# For self-managed GitLab, point the *_BASE_OAUTH_URL / *_BASE_API_URL at your host.\nGITLAB_CLIENT_ID=\"\"\nGITLAB_CLIENT_SECRET=\"\"\nGITLAB_BASE_OAUTH_URL=\"https://gitlab.com/oauth\" # authorize + token base\nGITLAB_BASE_API_URL=\"https://gitlab.com/api/v4\" # used to verify the identity (/user)\nGITLAB_OAUTH_REQUIRED=\"true\" # \"true\" requires server-side verification via GitLab /user (recommended)\n\n# ─────────────────────────────────────────\n# APP URLs\n# ─────────────────────────────────────────\nAPIURL=\"http://localhost:4000/\"\nWEBURL=\"http://localhost:4000\"\n\n# Optional extra browser origins (comma-separated, no trailing slash) that\n# should be allowed to call the API and open Socket.io connections in\n# addition to WEBURL / APIURL. Use this for multi-domain deployments\n# (e.g. a staging frontend on a separate host). Leave blank in single-\n# domain setups.\nCORS_ORIGINS=\"http://localhost:8080\"\n\n# ─────────────────────────────────────────\n# STORAGE\n# ─────────────────────────────────────────\nSTORAGE_TYPE=\"wasabi\" # wasabi | server\n\n# Upper limits for images sent through sharp (BUG-023 fix).\n# - MAX_IMAGE_FILE_BYTES bounds the file/buffer size in bytes (default 25 MB).\n# - MAX_IMAGE_PIXELS bounds the on-disk pixel count to prevent\n# pixel-bomb DoS (e.g. a 30000x30000 PNG). Default 50 megapixels\n# (≈ 7100x7100).\nMAX_IMAGE_FILE_BYTES=\"26214400\"\nMAX_IMAGE_PIXELS=\"50000000\"\n\n# Wasabi S3-compatible storage\nWASABI_ACCESS_KEY=\"\"\nWASABI_SECRET_ACCESS_KEY=\"\"\nWASABI_USERID=\"\"\nWASABIENDPOINT=\"https://s3.wasabisys.com\"\nWASABI_REGION=\"us-east-1\"\nIAM_ENDPOINT=\"https://iam.wasabisys.com\"\nUSERPROFILEBUCKET=\"your-bucket-name\"\n\n# ─────────────────────────────────────────\n# EMAIL — Nodemailer (SMTP)\n# ─────────────────────────────────────────\nNODEMAILER_HOST=\"smtp.gmail.com\"\nNODEMAILER_PORT=\"587\" # 587 (STARTTLS) or 465 (SSL)\nNODEMAILER_EMAIL=\"your@email.com\"\nNODEMAILER_EMAIL_PASSWORD=\"\" # Use app password for Gmail\n\n# ─────────────────────────────────────────\n# EMAIL — Resend HTTP API (recommended for cloud hosting)\n# Set RESEND_API_KEY to use Resend instead of SMTP\n# ─────────────────────────────────────────\nRESEND_API_KEY=\"\" # Get from resend.com\nRESEND_FROM_EMAIL=\"onboarding@resend.dev\" # Use verified domain in production\n\n# ─────────────────────────────────────────\n# FIREBASE (push notifications)\n# Leave blank to disable push notifications\n# ─────────────────────────────────────────\nSERVICE_FILE=\"./firebase-adminsdk.json\" # Path to Firebase service account JSON (must be inside project root)\nAPIKEY=\"\"\nAUTODOMAIN=\"\"\nPROJECTID=\"\"\nSTORAGEBUCKET=\"\"\nMESSAGINGSENDERID=\"\"\nAPPID=\"\"\nMEASUREMENTID=\"\"\n\n# ─────────────────────────────────────────\n# SOCKET.IO ADMIN UI (optional)\n# Leave both blank to disable the admin UI (recommended for production\n# unless you actively need it). Both values must be set to enable.\n# Username is plain text. Password must be a bcrypt hash — generate with:\n# node -e \"console.log(require('bcrypt').hashSync(process.argv[1], 12))\" '<your-password>'\n# ─────────────────────────────────────────\nSOCKETIO_ADMIN_USERNAME=\"alian\"\nSOCKETIO_ADMIN_PASSWORD_HASH=\"$2a$12$HHemhzmTrC8Dmf2Gd9v/Teo9oiCxfYJb.St3HKMBx1L3wJmZLeX5u\"\n\n# ─────────────────────────────────────────\n# AI\n# ─────────────────────────────────────────\nLLM_PROVIDER=\"openai\" # openai | anthropic | deepseek\nAI_API_KEY=\"\"\nAI_MODEL=\"gpt-4.1\" # recommended: gpt-4o or gpt-4.1 for best instruction-following on complex plans\n # gpt-5-mini / gpt-4o-mini work but produce fewer, more bundled tasks\nANTHROPIC_API_KEY=\"\"\nANTHROPIC_MODEL=\"claude-sonnet-4-5-20250929\" # current Sonnet 4.5 model id\nDEEPSEEK_API_KEY=\"\"\nDEEPSEEK_MODEL=\"deepseek-v4-flash\" # deepseek-chat / deepseek-reasoner / deepseek-v4-flash / deepseek-v4-pro (all V4: 1M ctx, up to 384K output)\n # reasoner & pro use \"thinking\" mode — they spend extra output tokens on reasoning, so raise LLM_MAX_TOKENS_PLAN if large plans truncate\nLLM_MAX_TOKENS_PLAN=32000 # cap for the planning call (raise if you see \"ran out of output token budget\")\nLLM_MAX_TOKENS_CLARIFY=2000 # cap for follow-up Q&A\n# ANTHROPIC_TIMEOUT_MS=600000 # optional: raise Anthropic SDK timeout (default 10 min)\n# OPENAI_TIMEOUT_MS=600000 # optional: raise OpenAI axios timeout (default: 10 min for reasoning/gpt-5, 4 min for others)\n# DEEPSEEK_TIMEOUT_MS=600000 # optional: raise DeepSeek axios timeout (default: 10 min for reasoner, 4 min for chat)\n# DEEPSEEK_BASE_URL=\"https://api.deepseek.com\" # optional: override DeepSeek base URL (e.g. for a compatible proxy)\n\n# ─────────────────────────────────────────\n# DEMO MODE (public demo instances only)\n# When DEMO_MODE=true, the app shows a \"you're on the live demo\" banner with\n# the shared demo credentials and a \"deploy your own\" link. Leave false for\n# real deployments. Only set DEMO_EMAIL/DEMO_PASSWORD on a throwaway demo DB.\n# ─────────────────────────────────────────\nDEMO_MODE=\"false\"\nDEMO_EMAIL=\"\"\nDEMO_PASSWORD=\"\"\n\n# ─────────────────────────────────────────\n# MISC\n# ─────────────────────────────────────────\nNOOFPRESETCOMPANY=10\nPRECOMPANYKEY=\"your_preset_key\"\nERRORRECIVEREMAIL=\"admin@yourdomain.com\" # Email to receive error alerts\nENDPOINT_KEY=\"\"\n"}}}} |