SYMBOL INDEX (139 symbols across 40 files) FILE: banners/build.js constant WIDTH (line 23) | const WIDTH = 960 constant HEIGHT (line 24) | const HEIGHT = 360 constant SCALE (line 25) | const SCALE = 2 // retina output → 1920×720, looks crisp on high-DPI dev... constant SRC (line 27) | const SRC = path.join(__dirname, 'src') constant DIST (line 28) | const DIST = path.join(__dirname, 'dist') constant BANNERS (line 34) | const BANNERS = [ function main (line 51) | async function main () { FILE: banners/index.js constant DIST (line 24) | const DIST = path.join(__dirname, 'dist') function resolveBanner (line 28) | function resolveBanner (name) { function photoInput (line 35) | function photoInput (banner) { function rememberFileId (line 39) | function rememberFileId (banner, message) { function assertBanner (line 46) | function assertBanner (name) { function sendBanner (line 53) | async function sendBanner (ctx, name, caption = '', extra = {}) { function editBanner (line 79) | async function editBanner (ctx, name, caption = '', extra = {}) { function editMenu (line 121) | async function editMenu (ctx, text, extra = {}) { function replyOrEditBanner (line 137) | async function replyOrEditBanner (ctx, name, caption = '', extra = {}) { FILE: bot.js constant HANDLER_TIMEOUT_MS (line 36) | const HANDLER_TIMEOUT_MS = 60_000 constant MONITOR_INTERVAL_MS (line 37) | const MONITOR_INTERVAL_MS = 25 * 1000 FILE: bot/launch.js constant ALLOWED_UPDATES (line 7) | const ALLOWED_UPDATES = [ FILE: bot/locale-sync.js constant LOCALES_DIR (line 11) | const LOCALES_DIR = path.resolve(__dirname, '..', 'locales') constant CACHE_FILE (line 12) | const CACHE_FILE = path.resolve(__dirname, '..', '.locale-sync-mtime') function computeMaxMtime (line 14) | function computeMaxMtime () { function readCachedMtime (line 23) | function readCachedMtime () { function writeCachedMtime (line 32) | function writeCachedMtime (mtime) { function syncOneLocale (line 40) | async function syncOneLocale (bot, i18n, localeName, enDescriptionLong, ... FILE: bot/middleware.js constant MAX_CHAIN_ACTIONS (line 11) | const MAX_CHAIN_ACTIONS = 15 constant POLLING_DETACH (line 18) | const POLLING_DETACH = process.env.POLLING_DETACH !== '0' FILE: bot/session-store.js constant SESSION_TTL_SECONDS (line 12) | const SESSION_TTL_SECONDS = 60 * 60 // 1 hour — telegraf checks expires ... function getSessionKey (line 14) | function getSessionKey (ctx) { constant MEM_MAX (line 27) | const MEM_MAX = 50000 constant MEM_SWEEP_MS (line 28) | const MEM_SWEEP_MS = 5 * 60 * 1000 function createMemoryStore (line 30) | function createMemoryStore () { function sessionMiddleware (line 53) | function sessionMiddleware () { FILE: handlers/admin/_helpers.js constant ADMIN_RIGHTS (line 11) | const ADMIN_RIGHTS = ['messaging', 'pack', 'finance', 'users'] FILE: handlers/admin/index.js constant AWAITING (line 33) | const AWAITING = { FILE: handlers/catch.js constant PROJECT_ROOT (line 12) | const PROJECT_ROOT = path.resolve(__dirname, '..') constant HAS_GIT_DIR (line 13) | const HAS_GIT_DIR = (() => { function pickBlameFrame (line 26) | function pickBlameFrame (errorInfo) { function errorLog (line 38) | async function errorLog (error, ctx) { function isExpectedNoise (line 88) | function isExpectedNoise (error) { FILE: handlers/group-settings.js function onlyGroupAdmin (line 5) | async function onlyGroupAdmin (ctx, next) { FILE: handlers/inline-query.js constant INLINE_QUERY_LIMIT (line 7) | const INLINE_QUERY_LIMIT = 50 function getStickerFileId (line 17) | function getStickerFileId (sticker) { function getStickerType (line 35) | function getStickerType (sticker) { function getStickerCaption (line 45) | function getStickerCaption (sticker) { function detectStickerTypes (line 61) | function detectStickerTypes (stickers) { function buildInlineResult (line 74) | function buildInlineResult (sticker, stickerType) { FILE: scenes/donate.js constant PRICING_TIERS (line 7) | const PRICING_TIERS = { constant TIER_MULTIPLIERS (line 16) | const TIER_MULTIPLIERS = { constant CREDIT_PACKAGES (line 23) | const CREDIT_PACKAGES = { FILE: scenes/messaging.js constant MESSAGING_TTL_SECONDS (line 10) | const MESSAGING_TTL_SECONDS = 7 * 24 * 60 * 60 FILE: scenes/mosaic.js constant FALLBACK_EMOJI (line 33) | const FALLBACK_EMOJI = ['🟥', '🟧', '🟨', '🟩', '🟦', '🟪', '🟫', '⬛', '⬜', '🔲'] constant IMAGE_DOCUMENT_MIMES (line 105) | const IMAGE_DOCUMENT_MIMES = new Set(['image/jpeg', 'image/png', 'image/... FILE: scenes/pack-about.js constant DC_REGIONS (line 16) | const DC_REGIONS = { FILE: scenes/pack-catalog.js function stickerSetIdToOwnerId (line 11) | function stickerSetIdToOwnerId (u64) { FILE: scenes/video-round.js function getQueuePosition (line 23) | async function getQueuePosition (jobId) { function processVideo (line 32) | async function processVideo (ctx, fileUrl) { FILE: scripts/inspect-db.js function pct (line 8) | function pct (a, b) { function run (line 13) | async function run () { FILE: scripts/test-perf-timing.js function run (line 20) | async function run () { FILE: scripts/test-retry-api.js function touch (line 40) | function touch (chatId) { function resetCache (line 44) | function resetCache () { function test (line 49) | async function test (name, fn) { FILE: scripts/top-sets.js function getPopularStickerPacks (line 10) | async function getPopularStickerPacks () { function postPopularStickerPacksToChannel (line 32) | async function postPopularStickerPacksToChannel () { FILE: scripts/update-packs.js function processStickerSets (line 16) | async function processStickerSets (stickerSets) { FILE: utils/add-sticker-text.js constant SEND_MESSAGE_DESCRIPTION_MAX (line 10) | const SEND_MESSAGE_DESCRIPTION_MAX = 1000 constant TELEGRAM_ERROR_MAP (line 21) | const TELEGRAM_ERROR_MAP = [ FILE: utils/add-sticker.js constant VIDEO_PROCESSING_TTL (line 14) | const VIDEO_PROCESSING_TTL = 1000 * 60 * 2 // 2 minutes auto-unlock function updateConvertQueueMessages (line 44) | async function updateConvertQueueMessages () { constant STICKER_COOLDOWN (line 267) | const STICKER_COOLDOWN = 1000 * 30 // 30 seconds FILE: utils/decode-sticker-set-id.js function decodeStickerSetId (line 14) | function decodeStickerSetId (u64) { FILE: utils/escape-regex.js function escapeRegex (line 1) | function escapeRegex (str) { FILE: utils/last-seen.js constant THROTTLE_MS (line 17) | const THROTTLE_MS = parseInt(process.env.LAST_SEEN_THROTTLE_MS, 10) || 6... constant MAX_ENTRIES (line 18) | const MAX_ENTRIES = parseInt(process.env.LAST_SEEN_MAX, 10) || 20000 function evictIfFull (line 22) | function evictIfFull () { function touchLastSeen (line 34) | function touchLastSeen (User, userId) { FILE: utils/logger.js constant LEVELS (line 13) | const LEVELS = ['error', 'warn', 'info', 'debug'] FILE: utils/messaging.js constant MESSAGING_TTL_SECONDS (line 13) | const MESSAGING_TTL_SECONDS = 7 * 24 * 60 * 60 function getConfig (line 19) | function getConfig () { function processMessagingQueue (line 229) | async function processMessagingQueue () { function processEditQueue (line 249) | async function processEditQueue () { FILE: utils/moderate-pack.js constant RELEVANT_CATEGORIES (line 10) | const RELEVANT_CATEGORIES = [ constant SCORE_THRESHOLDS (line 19) | const SCORE_THRESHOLDS = { function combineImages (line 28) | async function combineImages (imageBuffers) { function moderateImage (line 69) | async function moderateImage (fileLink, packTitle = '', packName = '') { function moderatePack (line 91) | async function moderatePack (packName) { function moderatePacks (line 139) | async function moderatePacks (skip = 0, maxDepth = 100) { FILE: utils/perf-timing.js constant WINDOW (line 13) | const WINDOW = 200 constant DEFAULT_INTERVAL (line 14) | const DEFAULT_INTERVAL = 50 constant ENABLED (line 16) | const ENABLED = process.env.PERF_TIMING !== '0' constant LOG_INTERVAL (line 17) | const LOG_INTERVAL = Math.max(1, parseInt(process.env.PERF_TIMING_INTERV... function getStage (line 31) | function getStage (name) { function perfRecord (line 40) | function perfRecord (name, ms) { function median (line 51) | function median (arr) { function fmt (line 60) | function fmt (ms) { function perfSnapshot (line 65) | function perfSnapshot () { function logSummary (line 78) | function logSummary (n) { function perfTick (line 89) | function perfTick () { function perfStage (line 100) | function perfStage (name, fn, opts) { FILE: utils/queues.js constant REDIS_ENABLED (line 10) | const REDIS_ENABLED = !!process.env.REDIS_HOST function makeStubQueue (line 31) | function makeStubQueue (name) { function makeRealQueue (line 49) | function makeRealQueue (name) { FILE: utils/retry-api.js constant RETRY_MAX_WAIT_S (line 29) | const RETRY_MAX_WAIT_S = parseInt(process.env.RETRY_MAX_WAIT_S, 10) || 5 constant RETRY_MAX_ATTEMPTS (line 30) | const RETRY_MAX_ATTEMPTS = parseInt(process.env.RETRY_MAX_ATTEMPTS, 10) ... constant BLOCKED_CACHE_TTL_MS (line 31) | const BLOCKED_CACHE_TTL_MS = parseInt(process.env.BLOCKED_CACHE_TTL_MS, ... constant BLOCKED_CACHE_MAX (line 32) | const BLOCKED_CACHE_MAX = parseInt(process.env.BLOCKED_CACHE_MAX, 10) ||... constant RETRY_JITTER_MAX_MS (line 33) | const RETRY_JITTER_MAX_MS = parseInt(process.env.RETRY_JITTER_MAX_MS, 10... constant RATE_LIMIT_CACHE_MAX (line 34) | const RATE_LIMIT_CACHE_MAX = parseInt(process.env.RATE_LIMIT_CACHE_MAX, ... function cacheBlocked (line 47) | function cacheBlocked (chatId) { function isBlockedCached (line 63) | function isBlockedCached (chatId) { function clearBlockedChat (line 74) | function clearBlockedChat (chatId) { function buildBlockedError (line 79) | function buildBlockedError (chatId, method) { function rateLimitKey (line 105) | function rateLimitKey (method, scopeId) { function cacheRateLimit (line 109) | function cacheRateLimit (method, scopeId, retryAfterS) { function isRateLimitCached (line 129) | function isRateLimitCached (method, scopeId) { function getRateLimitRemaining (line 152) | function getRateLimitRemaining (method, scopeId) { function buildRateLimitError (line 165) | function buildRateLimitError (method, scopeId) { function targetScopeId (line 189) | function targetScopeId (data) { function withRetry (line 215) | async function withRetry (fn, options = {}) { function isRateLimitError (line 256) | function isRateLimitError (error) { function getRetryAfter (line 263) | function getRetryAfter (error) { function patchTelegramPrototype (line 274) | function patchTelegramPrototype () { function retryMiddleware (line 338) | function retryMiddleware () { FILE: utils/send-sticker-as-document.js function sendStickerAsDocument (line 15) | async function sendStickerAsDocument (ctx, fileId, fileUniqueId, extra =... function sniffStickerFormat (line 80) | function sniffStickerFormat (buffer) { FILE: utils/sticker-inflight.js constant MAX_PER_USER (line 15) | const MAX_PER_USER = parseInt(process.env.STICKER_INFLIGHT_PER_USER, 10)... function acquire (line 19) | function acquire (userId) { function release (line 27) | function release (userId) { FILE: utils/telegram-api.js constant SESSION_FILE (line 6) | const SESSION_FILE = path.join(__dirname, '../.mtproto-session') function connect (line 12) | async function connect () { method client (line 65) | get client () { method isConnected (line 70) | get isConnected () { FILE: utils/telegram-error.js constant ERROR_PATTERNS (line 5) | const ERROR_PATTERNS = [ constant RATE_LIMIT_CODE (line 18) | const RATE_LIMIT_CODE = 429 constant DEFAULT_MAX_DESCRIPTION_LEN (line 30) | const DEFAULT_MAX_DESCRIPTION_LEN = 150 FILE: utils/telegram.js function getTelegram (line 14) | function getTelegram (token = process.env.BOT_TOKEN) { FILE: utils/update-monitor.js constant WARN_THRESHOLD (line 26) | const WARN_THRESHOLD = 40 constant ALERT_THRESHOLD (line 27) | const ALERT_THRESHOLD = 250