tools_v2/
├── src/ ← Toàn bộ mã nguồn TypeScript
├── scripts/ ← Utility scripts chạy độc lập
├── storage/ ← Dữ liệu runtime (log, screenshots, sessions)
├── tmp/ ← Thư mục tạm (Chrome user profiles)
├── working-proxies/ ← Danh sách free proxies
├── dist/ ← Build output (không commit)
├── .docker/ ← Dockerfiles
├── .env ← Biến môi trường (không commit)
├── .env.example ← Template biến môi trường
├── .env.backup ← Backup cấu hình
├── .gitlab-ci.yml ← CI/CD pipeline
├── docker-compose.yml ← Khởi động MongoDB local
├── package.json ← Dependencies và scripts
├── tsconfig.json ← TypeScript configuration
├── swagger.json ← Exported Swagger spec
└── README.mdsrc/src/
├── index.ts ← Entry point duy nhất
├── api/ ← REST endpoints và cron jobs
│ ├── index.ts ← Tổng hợp routes dưới /api
│ ├── task-group/ ← Traffic task management
│ ├── report-tasks/ ← Security report management
│ ├── proxy/ ← Proxy pool management
│ ├── search/ ← Keyword ranking search
│ ├── task/ ← Legacy task module
│ ├── screenshot/ ← Screenshot API
│ ├── monitor/ ← Server monitoring
│ └── test/ ← Development test endpoints
├── services/ ← Business logic layer
│ ├── ai/ ← OpenAI integration
│ ├── api/ ← Go API communication
│ ├── behavior/ ← Human behavior simulation
│ ├── browser/ ← Browser session management
│ ├── captcha/ ← CAPTCHA solving
│ ├── check-proxy/ ← Proxy health check
│ ├── domain/ ← Domain lookup
│ ├── email/ ← SMTP email
│ ├── evidence/ ← Evidence collection
│ ├── free-proxy/ ← Free proxy sources
│ ├── google-accounts/ ← Google account management
│ ├── profiles/ ← Browser profile management
│ ├── proxy/ ← Proxy rotation
│ ├── report-tasks/ ← Report platform services
│ ├── screenshot/ ← Screenshot capture & upload
│ ├── search/ ← Search callback
│ ├── webhook/ ← Webhook utilities
│ └── zing-proxy/ ← ZingProxy API
├── config/ ← Application configuration
│ ├── database/ ← MongoDB connection
│ ├── anticaptcha.config.ts
│ ├── email.config.ts
│ ├── security-vendor-emails.config.ts
│ └── vietnamese-cyber-law.ts
├── types/ ← TypeScript type definitions
│ ├── global/ ← Global type declarations
│ ├── platforms/ ← Per-platform prompt types
│ └── browser-session.types.ts
└── utils/ ← Shared utilities
├── browser_manager/ ← Chrome automation core
├── logger/ ← Logging system
├── createElysia.ts ← Elysia factory
├── env.ts ← Environment config
├── error.middleware.ts ← Error handling
├── ip-validation.middleware.ts
├── logger.ts ← Logger export
├── index.ts ← Utils barrel export
├── oauth2-token-refresh.ts
├── report-type.utils.ts
├── server-identifier.ts
├── smtp-config.utils.ts
├── country-form-mapper.ts
└── email-name-extractor.tssrc/index.tssrc/index.ts là file duy nhất được Bun thực thi trực tiếp. Nó chịu trách nhiệm:src/index.ts:GET /.src/api/task-group/
├── task-group.controller.ts
├── task-group.cron.ts
├── task-group.service.ts
├── task-group.model.ts
├── task-group.dto.ts
├── api-examples/
│ ├── index.ts
│ └── create-multiple.json
├── cron/
│ ├── resource-allocator.ts
│ ├── link-tracker.ts
│ ├── cleanup-service.ts
│ ├── domain/
│ ├── memory/
│ │ └── memory-manager.ts
│ ├── process/
│ │ └── process-orchestrator.ts
│ ├── proxy/
│ ├── report/
│ ├── screenshot/
│ ├── session/
│ └── utils/
└── task-action/
├── task-action-executor.ts
├── captcha/
├── flows/
│ ├── ads-flow/
│ ├── coccoc-flow/
│ ├── home-traffic-flow/
│ └── kill-flow/
└── search/task-group.model.ts — Data ModelTaskGroup được định nghĩa bằng Typegoose decorators:TaskGroupStatus:PENDING = 0: Task mới, chờ thực thi.PROCESSING = 1: Đang thực thi.COMPLETED = 2: Đã hoàn thành.isHomeTraffic(taskGroup): Kiểm tra task group có phải home traffic không dựa trên traffic_type.method === 1 && !only_ads && !is_kill.task-group.dto.ts — Request TypesCreateTaskSchema. Mỗi element là một task group, mỗi task group là một array của tasks.task-group.controller.ts — REST Endpoints/api/task-traffics:POST /multiple: Tạo nhiều task groups cùng lúc. Body là array of arrays.GET /: Lấy danh sách task groups.DELETE /:id: Xóa một task group.POST /proxy: Test proxy parsing.onStart hook của controller gọi taskGroupService.setAllPending() để reset tất cả PROCESSING tasks về PENDING khi server khởi động.resource-allocator.ts — Phân Bổ Tài NguyênResourceAllocator tính toán số slots cho mỗi loại task:HOME_TRAFFIC_LIMIT.CRON_TASK_LIMIT.cleanup-service.ts — Dọn Dẹp Hàng NgàyTaskGroupCleanupService cung cấp:cleanupPreviousDayTasks(): Xóa tất cả task groups tạo trước 00:00 hôm nay.cleanupCompletedTasks(daysToKeep): Xóa completed tasks cũ hơn N ngày.getTaskGroupStats(): Thống kê: total, pending, processing, completed, today, yesterday, older.task-group-cleanup-cron lúc 00:30 hàng ngày.link-tracker.ts — Theo Dõi LinksLinkTracker ngăn chặn nhiều home traffic tasks cùng truy cập một URL:markLinkAsProcessing(link, taskId, type): Đánh dấu link đang được xử lý.unmarkLinkAsProcessing(link, type, taskId): Bỏ đánh dấu khi task hoàn thành.getProcessingLinksForType(type, limit): Lấy danh sách links đang xử lý đã đạt giới hạn.HOME_TRAFFIC_PER_TARGET_LIMIT = 3, một URL chỉ có tối đa 3 home traffic tasks chạy đồng thời.src/api/report-tasks/
├── report-task.controller.ts
├── report-task.cron.ts
├── report-task.model.ts
└── cron/
├── report-task-request.service.ts
├── memory-manager.ts
├── callback/
│ └── callback-sender.ts
├── local/
│ └── local-report-cascade.service.ts
├── platform/
│ └── platform-executor.ts
├── proxy/
│ └── proxy-manager.ts
├── session/
│ └── session-creator.ts
└── task-executor/
└── task-executor.tsreport-task.model.ts — Data ModelReportTask với ReportPlatform enum chứa hơn 100 giá trị:ReportTaskStatus enum:PENDING: Chờ thực thi.IN_PROGRESS: Đang thực thi.COMPLETED: Hoàn thành thành công.FAILED: Thất bại.CANCELLED: Đã hủy.ReportType enum:EMAIL_BASED: Báo cáo qua email.BROWSER_BASED: Báo cáo qua form trên website.report-task.cron.ts — ReportTaskCronReportTaskCron là class phức tạp nhất trong module này. Các thành phần:maxConcurrentTasks = 1: Chỉ chạy một task tại một thời điểm.MIN_INTERVAL_MS = 30 phút: Bắt buộc chờ 30 phút giữa các lần thực thi._lastTaskExecutionTime: Timestamp của lần thực thi cuối._isRunning: Flag tránh concurrent execution._memoryManager: Kiểm tra memory trước khi thực thi._proxyManager: Lấy proxy cho task._sessionCreator: Tạo browser session._platformExecutor: Thực thi report trên platform._callbackSender: Gửi callback về Go API._localCascadeService: Chạy local cascade sau khi thành công.report-task-request.service.tscanRequestTasks(): Trả về true nếu có thể request.src/api/proxy/
├── proxy.controller.ts
├── proxy.cron.ts
├── proxy.service.ts
├── proxy.model.ts
├── proxy.dto.ts
└── cron/
└── index.tsproxy.model.ts — Data ModelProxy với Status enum:PENDING = 0: Proxy mới nhận, cần rotate.PROCESSING = 1: Đang rotate (không dùng trong code hiện tại).COMPLETED = 2: Đã rotate xong, sẵn sàng dùng.rotate_url: URL để gọi khi cần rotate proxy (lấy IP mới).webhook_url: URL để callback khi proxy sẵn sàng.auth_token: Bearer token cho rotate_url.ip_public: IP public sau khi rotate.disable_auto_rotate: Nếu true, bỏ qua bước rotate.call_webhook_count: Số lần đã gọi webhook (tối đa 3).retry_count: Số lần rotation thất bại.domain_blocks: Danh sách domains proxy không thể truy cập.proxy.cron.ts — CronProxyCronProxy quản lý hai luồng song song:start()):disable_auto_rotate = false: Gọi rotate_url để lấy IP mới._performIPCheck() để verify IP public.runWebhook()):webhook_url với thông tin proxy.call_webhook_count, retry tối đa 3 lần.src/api/search/
├── search.controller.ts
├── search.cron.ts
├── search.service.ts
├── search.model.ts
├── search.dto.ts
├── cron/
│ ├── search-executor.ts
│ └── webhook-search.cron.ts
└── flows/
├── index.ts
├── search-flow-executor.ts
├── search-navigator.ts
├── search-paginator.ts
├── search-results-extractor.ts
└── search-searcher.tssearch.model.ts — Data ModelSearch lưu trữ tác vụ quét thứ hạng:keyword: Từ khóa cần tìm kiếm.device: Loại thiết bị (Desktop/Mobile).device_os: Hệ điều hành.result_num: Số kết quả cần lấy.web_hook_url: URL để gửi kết quả về.proxy_url: URL để lấy proxy.engine: Search engine (Google=1, CocCoc=2).status: PENDING=0, RUNNING=1, COMPLETED=2.search_data: Kết quả tìm kiếm { ads: [], search: [] }.proxy: Proxy đang dùng.geolocation: Vị trí địa lý.search-flow-executor.ts điều phối toàn bộ quá trình:search-navigator.ts: Điều hướng đến search engine.search-searcher.ts: Gõ từ khóa và thực hiện tìm kiếm.search-paginator.ts: Phân trang qua nhiều trang kết quả.search-results-extractor.ts: Extract URL và ranking từ SERP.search_data với hai mảng:ads: Danh sách quảng cáo với URL và rank.search: Danh sách kết quả tự nhiên với URL và rank.src/services/ai/ — AI Servicesservices/ai/
├── chatgpt.service.ts ← Singleton, gọi OpenAI API
├── platform-prompt.service.ts ← Lấy prompt từ API hoặc fallback
├── platform-prompt-factory.service.ts ← Factory tạo generators
├── indexer.service.ts ← Index platform services
├── api/
│ └── openai-client.ts ← OpenAI SDK wrapper
├── cost/
│ └── cost-calculator.ts ← Tính chi phí per call
├── generic/
│ └── generic-report-generator.ts ← Fallback generator
├── parsers/
│ └── response-parser.ts ← Parse và validate AI response
├── platform-prompt/
│ ├── json-fixer.ts ← Sửa malformed JSON
│ ├── fallback-generators/ ← Hardcoded fallback prompts
│ ├── prompt-builders/ ← Build prompts per platform
│ └── report-generators/ ← Generate report content
├── platform-prompt-factory/
│ ├── method-forwarder.ts ← Forward calls to generators
│ └── generators/ ← Per-platform generators
├── platforms/
│ ├── platform-methods-handler.ts ← Handle platform-specific methods
│ └── platform-report-generator.ts ← Generate reports
├── prompts/
│ └── report-prompt-builder.ts ← Build report prompts
├── unified-prompt/
│ ├── builders/ ← Unified prompt builders
│ ├── generators/ ← Unified generators
│ ├── mappers/ ← Map platform data
│ ├── storage/ ← Cache prompt configs
│ ├── templates/ ← Prompt templates
│ ├── transformers/ ← Transform AI responses
│ └── utils/ ← Utilities
└── utils/
├── json-fixer.ts ← JSON repair utility
└── openai-debug-formatter.ts ← Debug output formatterchatgpt.service.ts:generateContent(prompt, config): Gọi OpenAI API với prompt và config.displayCostSummary(): Log tổng chi phí API calls.resetCostTracking(): Reset cost counter.cost-calculator.ts:src/services/api/ — Go API Communicationtask-request.service.ts:requestAndCreateTaskGroups(count): Gọi POST [API_HOST]/api/task/request với số lượng cần.report-site-prompt.service.ts:getConfig(platform): Lấy cấu hình prompt từ GET [API_HOST]/api/reports/sites/{platform}/config.report-sites.service.ts:getSites(): Lấy danh sách tất cả report sites từ API.src/services/behavior/ — Human BehaviorHumanBehaviorService cung cấp các methods mô phỏng hành vi người dùng:randomDelay(options):minDelay đến maxDelay (mặc định 2-8 giây).simulateMouseMovement(session, targetX, targetY):simulateScrolling(session):simulateReadingPause(session):fillFormHumanLike(session, actions):src/services/browser/ — Browser Sessionservices/browser/
├── enhanced-browser-session.service.ts
└── enhanced-session/
├── incognito-session-handler.ts
├── profile-session-handler.ts
├── human-behavior-integration.ts
├── session-cleanup.ts
├── session-data-capture.ts
├── session-statistics.ts
└── types.tsenhanced-browser-session.service.ts:incognito-session-handler.ts tạo session không lưu state.profile-session-handler.ts tạo session với Google account và session persistence.session-data-capture.ts:human-behavior-integration.ts:HumanBehaviorService vào browser session để tự động apply human behavior.src/services/captcha/ — CAPTCHA Solvingservices/captcha/
├── browser-captcha.service.ts ← Service chính
├── anti-captcha.service.ts ← Anti-Captcha API v1
├── anticaptcha.service.ts ← Anti-Captcha API v2
├── anticaptcha-plugin.service.ts ← Plugin-based approach
├── audio-captcha.service.ts ← Audio CAPTCHA solving
├── captcha-rate-limiter.service.ts ← Rate limiting
├── fingerprint-consistency.service.ts ← Fingerprint consistency
├── google-sorry-bypass.service.ts ← Google "Sorry" bypass
├── google-trust-builder.service.ts ← Build Google trust
├── detection/
│ ├── captcha-detector.ts ← Detect CAPTCHA presence
│ ├── confidence-detector.ts ← Calculate confidence score
│ └── type-detector.ts ← Identify CAPTCHA type
├── solvers/
│ └── captcha-solver.ts ← Orchestrate solving
├── recaptcha/
│ └── recaptcha.service.ts ← reCAPTCHA specific
├── injection/
│ ├── token-injector.ts ← Inject token into form
│ └── form-type-detector.ts ← Detect form type
└── stealth/
└── stealth-applier.ts ← Apply stealth before solvingcaptcha-detector.ts:recaptcha, hcaptcha, turnstile.captcha, challenge.captcha-solver.ts:CAPTCHA_FALLBACK_TO_MANUAL = true: Thử OpenAI Vision.token-injector.ts:src/services/profiles/ — Profile Managementservices/profiles/
├── profile-manager.service.ts
├── profile.service.ts
├── session-capture.service.ts
├── smart-session-restore.service.ts
└── profile-manager/
├── browser-session-creator.ts
├── profile-selector.ts
├── session-cleanup.ts
├── session-manager.ts
├── session-restorer.ts
├── session-validator.ts
└── types.tsprofile-selector.ts:is_active = true.last_used_at ascending (ưu tiên ít dùng nhất).session-restorer.ts:storage/google-sessions/profiles/{id}/cookies.json.session-validator.ts:true nếu session hợp lệ.src/services/report-tasks/platforms/ — Platform Servicesbase-report.service.ts — Base cho browser-based:base-email-report.service.ts — Base cho email-based:src/utils/browser_manager/ — Browser Managerutils/browser_manager/
├── index.ts ← BrowserManager singleton export
├── browserSession.ts ← BrowserSession class
├── advanced-stealth.ts ← Advanced stealth techniques
├── captcha-detector.ts ← CAPTCHA detection
├── crossSiteBehavior.ts ← Cross-site navigation
├── device.ts ← Device type definitions
├── dom-stability.ts ← Wait for DOM stability
├── geolocation.ts ← Geolocation utilities
├── geolocation-handler.ts ← Handle geolocation requests
├── ghost-cursor-wrapper.ts ← ghost-cursor library wrapper
├── google-consent-detector.ts ← Google consent popup detection
├── keywords.ts ← Keyword utilities
├── mobile-pre-search.ts ← Mobile pre-search behavior
├── navigation-retry.ts ← Retry navigation on failure
├── safe-executor.ts ← Safe execution wrapper
├── turnstile-detector.ts ← Cloudflare Turnstile detection
├── types.ts ← Type definitions
├── config/
│ ├── browser-flags.ts ← Chrome launch flags builder
│ ├── browser-launcher.ts ← Chrome launcher
│ └── resource-manager.ts ← Resource optimization
├── keywords/
│ ├── download-app-keywords.ts
│ ├── general-keywords.ts
│ └── categories/
├── logger/
│ └── session-logger.ts ← Log browser session events
├── page/
│ ├── click-handler.ts ← Click operations
│ ├── navigation-handler.ts ← Navigation operations
│ ├── page-controller.ts ← Page lifecycle
│ └── search-handler.ts ← Search operations
├── session/
│ └── session-manager.ts ← Active session tracking
└── stealth/
├── stealth-applier.ts ← Apply all stealth
├── navigator-stealth.ts ← navigator patches
├── webrtc-stealth.ts ← WebRTC disable
├── webgl-audio-stealth.ts ← WebGL/Audio spoof
├── timezone-stealth.ts ← Timezone spoof
├── permissions-stealth.ts ← Permissions override
├── device-stealth.ts ← Device properties
├── connection-stealth.ts ← Network connection
├── fetch-stealth.ts ← Fetch API patch
├── mouse-event-stealth.ts ← Mouse events
├── service-worker-stealth.ts ← Service worker
├── light-stealth.ts ← Lightweight stealth
├── stealth-config/ ← Stealth configurations
└── stealth-injections/ ← JavaScript injectionsBrowserManager — SingletonBrowserManager (exported as browserManager) quản lý tất cả browser sessions:sessions: Map<string, BrowserSession>: Map từ session ID đến session object._profileStorage: Map<string, string>: Map từ session ID đến profile path._sessionCreationTimes: Map<string, number>: Map từ session ID đến creation timestamp.newSession(options): Tạo browser session mới.endSession(session): Đóng session và cleanup.clearAllSessions(): Đóng tất cả sessions.cleanupOldSessions(maxAgeMs): Đóng sessions idle quá maxAgeMs.killAllBrowsers(): Kill tất cả Chrome processes.sessionsCount (getter): Số sessions đang active.newSession() Flow:sessions.size >= BROWSER_LIMIT.BrowserLauncher.launch(config).LightStealth.BrowserSession object.sessions map.BrowserLauncher — Chrome LauncherBrowserLauncher.launch(config) khởi động Chrome:PuppeteerExtra instance với StealthPlugin và UserPreferencesPlugin.UserPreferencesPlugin cấu hình:vi,en.BrowserFlagsBuilder.headless: "new" trong production.Browser instance.browser-flags.ts:--no-sandbox: Bắt buộc trong Docker/Linux.--disable-setuid-sandbox: Bắt buộc trong Docker.--disable-dev-shm-usage: Tránh shared memory errors.--disable-gpu: Tắt GPU trên server.--disable-blink-features=AutomationControlled: Ẩn automation.--disable-extensions: Giảm memory.--no-first-run: Bỏ qua first-run setup.--disable-background-networking: Giảm network overhead.--disable-sync: Tắt Chrome sync.--metrics-recording-only: Tắt metrics upload.ResourceManager — Tối Ưu Tài NguyênResourceManager cung cấp:applyCPULimits(browser): Giới hạn CPU usage của browser process.optimizePage(page, isHeavyFlow): Cấu hình page cho performance.disableUnnecessaryFeatures(page): Tắt các features không cần thiết.optimizePage() block các resource types không cần thiết:LightStealth — Lightweight StealthLightStealth.apply(page) inject JavaScript vào page để:navigator.webdriver.navigator.plugins.window.chrome.navigator.languages.stealth-applier.ts khi cần.src/utils/logger/ — Logging Systemutils/logger/
├── index.ts ← Export logger singleton
├── core-logger.ts ← Output streams
├── error-categorizer.ts ← Error classification
├── formatter.ts ← Message formatting
├── structured-logger.ts ← Structured logging
└── types.ts ← Log typescore-logger.ts:storage/log/{service}/{YYYY-MM-DD}/.error.log (errors only), combined.log (all levels).structured-logger.ts:service: Tên service (từ logger.child("name")).timestamp: ISO timestamp.level: Log level.message: Log message.context: Additional context object.error: Error object nếu có.error-categorizer.ts:NETWORK_TIMEOUT: Chứa "timeout", "ETIMEDOUT".PROXY_ERROR: Chứa "ECONNREFUSED", "proxy".CAPTCHA_DETECTED: Chứa "captcha", "challenge".BOT_DETECTED: Chứa "cloudflare", "bot".API_ERROR: Chứa "API", HTTP status codes.BROWSER_CRASH: Chứa "crash", "killed".UNKNOWN: Không khớp với category nào.src/utils/env.ts — Environment Configenv.ts export object env với tất cả configuration:CRON_TASK_LIMIT = 25 và CRON_REPORT_LIMIT = 2 được hardcode trong env.ts, không đọc từ .env file. Đây là quyết định thiết kế để đảm bảo production luôn dùng giá trị đúng.src/utils/createElysia.tsaot: true (Ahead-of-Time compilation) được bật khi RUNTIME=bun để tối ưu performance. Tất cả controllers và routes dùng createElysia() thay vì new Elysia() trực tiếp.src/config/database/mongodb.config.tsMONGODB_URI từ env.serverSelectionTimeoutMS: 5000.socketTimeoutMS: 45000.connectDatabase() function.src/config/anticaptcha.config.tsapiKey: Từ ANTICAPTCHA_API_KEY.baseUrl: Từ ANTICAPTCHA_BASE_URL (mặc định https://api.anti-captcha.com).timeout: Từ ANTICAPTCHA_TIMEOUT (mặc định 300000ms = 5 phút).retryAttempts: Từ ANTICAPTCHA_RETRY_ATTEMPTS (mặc định 3).cooldownMs: Thời gian cooldown giữa các lần giải.src/config/email.config.tshost: Từ SMTP_HOST (mặc định smtp.gmail.com).port: Từ SMTP_PORT (mặc định 587).secure: Từ SMTP_SECURE (mặc định false).user: Từ SMTP_USER.pass: Từ SMTP_PASS.src/config/security-vendor-emails.config.tssrc/types/global/types/global/
├── bun.d.ts ← Bun-specific type declarations
├── global.d.ts ← Global type augmentations
└── puppeteer-extra-plugins.d.ts ← Type declarations cho puppeteer-extra pluginspuppeteer-extra-plugins.d.ts cần thiết vì puppeteer-extra không có đầy đủ TypeScript types.src/types/platforms/types/platforms/
├── base-prompt.types.ts ← Base interface cho tất cả prompts
├── google-safe-browsing-prompt.types.ts
├── microsoft-smartscreen-prompt.types.ts
├── cloudflare-prompt.types.ts
├── spamhaus-prompt.types.ts
├── netcraft-prompt.types.ts
├── ... (30+ platform types)
├── google/
│ ├── abuse-prompt.types.ts
│ ├── phishing-prompt.types.ts
│ └── security-prompt.types.ts
├── kaspersky/
│ ├── virus-prompt.types.ts
│ ├── spam-prompt.types.ts
│ └── samples-prompt.types.ts
└── ... (nhiều platform folders)src/types/browser-session.types.tsscripts/ — Utility Scriptsscripts/
├── test-email-accounts.ts ← Test SMTP connections
├── test-domain-lookup.ts ← Test DNS lookup
├── test-fallback-proxy.ts ← Test free proxy sources
├── test-fallback-proxy-production.ts ← Test production proxies
├── test-prompt-email.ts ← Test AI email generation
├── test-prompt-retrieval.ts ← Test prompt API
├── test-email-with-custom-prompt.ts ← Test custom prompts
├── test-fallback-trigger.ts ← Test fallback mechanisms
├── remove-all-collections-batch.ts ← Clear MongoDB
├── list-all-sites.ts ← List all platforms
├── get-full-prompt.ts ← Get platform prompt
├── check-task-ai-content.ts ← Check AI content quality
├── cleanup-old-pending-tasks.js ← Cleanup old tasks
└── cleanup-old-pending-tasks-batch.jssrc/scripts/ — Application Scriptssrc/scripts/
├── create-report-tasks.ts ← Tạo report tasks hàng loạt
├── create-apple-report.ts ← Tạo Apple-specific report
├── generate-gmail-report.ts ← Tạo Gmail report
└── generate-netcraft-report.ts ← Tạo Netcraft reportstorage/ — Runtime Datastorage/
├── log/ ← Log files
│ ├── app/
│ │ └── YYYY-MM-DD/
│ │ ├── error.log
│ │ └── combined.log
│ ├── browser_manager/
│ │ └── YYYY-MM-DD/
│ │ ├── crash.log
│ │ └── web_error.log
│ ├── task/
│ │ └── YYYY-MM-DD/
│ │ └── combined.log
│ ├── report/
│ │ └── YYYY-MM-DD/
│ │ └── combined.log
│ ├── proxy/
│ │ └── YYYY-MM-DD/
│ │ └── combined.log
│ └── [service-name]/
│ └── YYYY-MM-DD/
│ └── combined.log
├── google-sessions/ ← Google account session data
│ └── profiles/
│ └── [profile-id]/
│ ├── cookies.json
│ ├── localStorage.json
│ └── sessionStorage.json
└── screenshots/ ← Local screenshot fallback
└── [task-id]/
├── before-click.png
└── after-click.pngtmp/ — Temporary Datatmp/
└── user-data/ ← Chrome user profiles (tạm thời)
└── [session-id]/ ← Mỗi session có folder riêng
├── Default/
│ ├── Cookies
│ ├── Local Storage/
│ └── ...
└── ...tmp/user-data/ bị xóa khi server khởi động. Mỗi session tạo folder riêng trong đây. Khi session kết thúc, folder được xóa (trừ khi googleLoginSuccess = true thì giữ lại để tái sử dụng).working-proxies/ — Free Proxy Listsworking-proxies/
├── http-proxy-list.json ← HTTP proxies
├── socks4-proxy-list.json ← SOCKS4 proxies
└── socks5-proxy-list.json ← SOCKS5 proxiesfree-proxy.service.ts khi không có proxy từ nguồn chính.tsconfig.json — Cấu Hình Quan Trọng{
"compilerOptions": {
"target": "ES2021",
"module": "ES2022",
"moduleResolution": "node",
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
"strict": true,
"esModuleInterop": true,
"resolveJsonModule": true,
"skipLibCheck": true,
"paths": {
"@/*": ["./src/*"],
"@api/*": ["./src/api/*"],
"@config/*": ["./src/config/*"],
"@utils/*": ["./src/utils/*"],
"@services/*": ["./src/services/*"],
"@typesDef/*": ["./src/types/*"]
},
"types": ["bun-types", "jest"]
}
}experimentalDecorators: true và emitDecoratorMetadata: true: Bắt buộc cho Typegoose decorators.strict: true: Bật toàn bộ strict type checking.@/ → ./src/, @api/ → ./src/api/, v.v.types: ["bun-types"]: Bun-specific type declarations.tsconfig.json mà không cần plugin hay build step.{
"scripts": {
"dev": "bun run --inspect=localhost:4000/debugger --watch src/index.ts",
"build": "bun --target bun build ./src/index.ts --outdir ./dist",
"compile": "bun build --compile --minify --sourcemap --target=bun ./src/index.ts --outfile=./dist/main",
"format": "prettier --write src/",
"lint": "oxlint --fix -D correctness --ignore-path .gitignore",
"typecheck": "tsc --noEmit --pretty --strictNullChecks --strict",
"prepare": "husky",
"script:netcraft": "bun run src/scripts/generate-netcraft-report.ts",
"script:gmail": "bun run src/scripts/generate-gmail-report.ts",
"create:report-tasks": "bun run src/scripts/create-report-tasks.ts",
"remove:all-collections": "bun run scripts/remove-all-collections-batch.ts"
}
}dev: Chạy với hot-reload (--watch) và debugger (--inspect).build: Build thành JavaScript bundle trong dist/.compile: Build thành standalone binary dist/main (không cần Bun runtime).format: Format code với Prettier.lint: Lint với oxlint (nhanh hơn ESLint, viết bằng Rust).typecheck: Kiểm tra TypeScript types mà không emit files.{
"dependencies": {
"elysia": "^1.2.25",
"@elysiajs/cron": "^1.2.0",
"@elysiajs/swagger": "^1.2.2",
"puppeteer": "^23.11.1",
"puppeteer-extra": "^3.3.6",
"puppeteer-extra-plugin-stealth": "^2.11.2",
"rebrowser-puppeteer-core": "^23.10.3",
"ghost-cursor": "^1.4.0",
"mongoose": "^8.12.1",
"@typegoose/typegoose": "^12.13.0",
"openai": "^4.67.0",
"nodemailer": "^7.0.9",
"axios": "^1.8.3",
"async-mutex": "^0.5.0",
"https-proxy-agent": "^7.0.6",
"socks-proxy-agent": "^8.0.5",
"tree-kill": "^1.2.2",
"zod": "^3.23.8",
"uuid": "^11.1.0",
"chalk": "^5.4.1"
},
"devDependencies": {
"bun-types": "latest",
"oxlint": "^0.16.0",
"prettier": "^3.5.3",
"husky": "^9.1.7",
"lint-staged": "^16.1.0",
"playwright": "^1.56.1",
"typescript": "^5.8.2"
},
"engines": {
"bun": ">=1.2.5"
}
}engines:"bun": ">=1.2.5" đảm bảo project chỉ chạy với Bun, không phải Node.js. Nếu cố chạy với npm hoặc node, sẽ có warning hoặc error.| Loại | Quy tắc | Ví dụ |
|---|---|---|
| Controller | kebab-case.controller.ts | task-group.controller.ts |
| Service | kebab-case.service.ts | profile-manager.service.ts |
| Cron | kebab-case.cron.ts | task-group.cron.ts |
| Model | kebab-case.model.ts | task-group.model.ts |
| DTO | kebab-case.dto.ts | task-group.dto.ts |
| Types | kebab-case.types.ts | browser-session.types.ts |
| Config | kebab-case.config.ts | anticaptcha.config.ts |
| Utils | kebab-case.ts | env.ts, logger.ts |
protect: true:allowMixed: Severity.ALLOW cho phép mixed types trong schema, cần thiết vì một số fields có type động.