Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/aliansoftwareteam_alianhub-project-management-system.json
T
OpenCode 68a9071cf1 feat: reconcile local master with origin (exa/hot-platform hunters, leaks ledger, latest results)
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.
2026-08-07 12:53:47 +08:00

1 line
104 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"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"}}}}