spearkit 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/dist/index.cjs +1767 -228
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1223 -361
- package/dist/index.d.ts +1223 -361
- package/dist/index.js +1726 -233
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/logger.ts","../src/env.ts","../src/cooldown.ts","../src/scheduler.ts","../src/prefix.ts","../src/usage.ts","../src/context.ts","../src/commands/options.ts","../src/commands/context.ts","../src/commands/command.ts","../src/commands/registry.ts","../src/events.ts","../src/components/customId.ts","../src/components/context.ts","../src/components/registry.ts","../src/components/builders.ts","../src/components/row.ts","../src/loader.ts","../src/client.ts","../src/plugin.ts"],"names":["path","join","readFileSync","task","timer","command","event","mkdir","dirname","appendFile","readFile","MessageFlags","ApplicationCommandOptionType","modal","resolveOptions","ApplicationCommandType","PermissionsBitField","InteractionContextType","REST","Routes","toError","ButtonStyle","ButtonBuilder","StringSelectMenuBuilder","UserSelectMenuBuilder","RoleSelectMenuBuilder","ChannelSelectMenuBuilder","MentionableSelectMenuBuilder","TextInputStyle","TextInputBuilder","ModalBuilder","ActionRowBuilder","readdir","extname","pathToFileURL","GatewayIntentBits","Client"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * A small, dependency-free structured logger used across spearkit so every\n * problem (command/component/event failures, gateway errors, your own code)\n * lands in one consistent, debuggable place.\n *\n * It is intentionally tiny: levels, scopes, structured data and a pluggable\n * sink. No `any`/`unknown` leaks into your code — log metadata is constrained\n * to primitive {@link LogValue}s and an optional {@link Error}.\n */\n\n/** Severity of a log entry, lowest to highest. */\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\n/** A minimum severity to emit, or `\"silent\"` to suppress everything. */\nexport type LogThreshold = LogLevel | \"silent\";\n\n/** A primitive metadata value attached to a log entry. */\nexport type LogValue = string | number | boolean | bigint | null | undefined;\n\n/** Extra context passed alongside a log message. */\nexport interface LogOptions {\n /** An error to attach; the default sink renders its stack. */\n error?: Error;\n /** Structured key/value metadata. */\n data?: Record<string, LogValue>;\n}\n\n/** A fully-resolved record handed to a {@link LogSink}. */\nexport interface LogEntry {\n readonly level: LogLevel;\n readonly message: string;\n readonly scope?: string;\n readonly timestamp: Date;\n readonly error?: Error;\n readonly data?: Readonly<Record<string, LogValue>>;\n}\n\n/** Receives every entry at or above the configured threshold. */\nexport type LogSink = (entry: LogEntry) => void;\n\n/** Construction options for a {@link Logger}. */\nexport interface LoggerOptions {\n /** Minimum level to emit. Default `\"info\"`. */\n level?: LogThreshold;\n /** Where entries go. Default {@link consoleSink}. */\n sink?: LogSink;\n /** A scope prefix for every entry (e.g. `\"commands\"`). */\n scope?: string;\n}\n\nconst RANK: Record<LogThreshold, number> = {\n debug: 10,\n info: 20,\n warn: 30,\n error: 40,\n silent: Number.POSITIVE_INFINITY,\n};\n\nfunction formatValue(value: LogValue): string {\n return typeof value === \"string\" ? value : String(value);\n}\n\n/** Default sink: human-readable lines to the console (stderr for warn/error). */\nexport function consoleSink(entry: LogEntry): void {\n const scope = entry.scope !== undefined ? ` [${entry.scope}]` : \"\";\n let suffix = \"\";\n if (entry.data !== undefined) {\n const parts = Object.entries(entry.data).map(([k, v]) => `${k}=${formatValue(v)}`);\n if (parts.length > 0) suffix = ` ${parts.join(\" \")}`;\n }\n const line = `${entry.timestamp.toISOString()} ${entry.level.toUpperCase()}${scope} ${entry.message}${suffix}`;\n const write = entry.level === \"warn\" || entry.level === \"error\" ? console.error : console.log;\n write(line);\n if (entry.error !== undefined) write(entry.error.stack ?? String(entry.error));\n}\n\ninterface SharedState {\n threshold: LogThreshold;\n sink: LogSink;\n}\n\n/**\n * A leveled, scoped logger. Create one directly or read `client.logger`.\n * {@link child} loggers share the parent's threshold and sink, so calling\n * {@link setLevel} on any of them affects the whole tree.\n *\n * @example\n * ```ts\n * const log = new Logger({ level: \"debug\" });\n * log.info(\"ready\", { data: { shard: 0 } });\n * log.child(\"commands\").error(\"handler failed\", { error });\n * ```\n */\nexport class Logger {\n private state: SharedState;\n /** The scope prefix applied to every entry, if any. */\n readonly scope?: string;\n\n constructor(options: LoggerOptions = {}) {\n this.state = {\n threshold: options.level ?? \"info\",\n sink: options.sink ?? consoleSink,\n };\n this.scope = options.scope;\n }\n\n /** The current minimum threshold. */\n get level(): LogThreshold {\n return this.state.threshold;\n }\n\n /** Change the threshold for this logger and every child sharing its state. */\n setLevel(level: LogThreshold): this {\n this.state.threshold = level;\n return this;\n }\n\n /** Whether an entry of `level` would currently be emitted. */\n enabled(level: LogLevel): boolean {\n return RANK[level] >= RANK[this.state.threshold];\n }\n\n /** A child logger with an extra scope segment, sharing this logger's state. */\n child(scope: string): Logger {\n const combined = this.scope !== undefined ? `${this.scope}:${scope}` : scope;\n const child = new Logger({ scope: combined });\n child.state = this.state;\n return child;\n }\n\n /** Emit an entry at an explicit level. */\n log(level: LogLevel, message: string, options?: LogOptions): void {\n if (!this.enabled(level)) return;\n this.state.sink({\n level,\n message,\n scope: this.scope,\n timestamp: new Date(),\n error: options?.error,\n data: options?.data,\n });\n }\n\n /** Verbose diagnostics, off by default. */\n debug(message: string, options?: LogOptions): void {\n this.log(\"debug\", message, options);\n }\n\n /** Normal operational messages. */\n info(message: string, options?: LogOptions): void {\n this.log(\"info\", message, options);\n }\n\n /** Recoverable problems worth attention. */\n warn(message: string, options?: LogOptions): void {\n this.log(\"warn\", message, options);\n }\n\n /** Failures. Attach the cause via `{ error }`. */\n error(message: string, options?: LogOptions): void {\n this.log(\"error\", message, options);\n }\n}\n\n/** Coerce an unknown thrown value into an {@link Error}. */\nexport function toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\n","/**\n * A tiny, dependency-free `.env` loader plus a typed reader for\n * `process.env`. Pulls your existing environment in directly — no `dotenv`\n * package required — and parses values the way `dotenv` does (quotes, `export`\n * prefixes, `#` comments, `\\n` escapes in double quotes).\n */\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n/** The flat key/value map parsed from a `.env` file. */\nexport type ParsedEnv = Record<string, string>;\n\n/** Options for {@link loadEnv}. */\nexport interface LoadEnvOptions {\n /** File to read. Default `.env` in the current working directory. */\n path?: string;\n /** Overwrite variables already present in `process.env`. Default `false`. */\n override?: boolean;\n}\n\nfunction stripInlineComment(value: string): string {\n // A `#` that starts a comment must be preceded by whitespace (or be the\n // whole value); `pass#1` is a literal, `value # note` is not.\n const match = /\\s#/.exec(value);\n return match !== null ? value.slice(0, match.index).trimEnd() : value;\n}\n\nfunction unquote(raw: string): string {\n if (raw.length >= 2) {\n const quote = raw[0];\n if ((quote === '\"' || quote === \"'\") && raw.endsWith(quote)) {\n const inner = raw.slice(1, -1);\n return quote === '\"'\n ? inner.replace(/\\\\n/g, \"\\n\").replace(/\\\\r/g, \"\\r\").replace(/\\\\t/g, \"\\t\")\n : inner;\n }\n }\n return stripInlineComment(raw);\n}\n\n/** Parse `.env`-formatted text into a flat object. Does not touch `process.env`. */\nexport function parseEnv(content: string): ParsedEnv {\n const out: ParsedEnv = {};\n for (const rawLine of content.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (line.length === 0 || line.startsWith(\"#\")) continue;\n const body = line.startsWith(\"export \") ? line.slice(7).trimStart() : line;\n const eq = body.indexOf(\"=\");\n if (eq <= 0) continue;\n const key = body.slice(0, eq).trim();\n if (key.length === 0) continue;\n out[key] = unquote(body.slice(eq + 1).trim());\n }\n return out;\n}\n\n/**\n * Read a `.env` file and merge it into `process.env`. Existing variables win\n * unless `override` is set. Missing files are ignored (returns `{}`), so it is\n * safe to call unconditionally.\n *\n * @returns the parsed key/value pairs from the file.\n */\nexport function loadEnv(options: LoadEnvOptions = {}): ParsedEnv {\n const path = options.path ?? join(process.cwd(), \".env\");\n let content: string;\n try {\n content = readFileSync(path, \"utf8\");\n } catch {\n return {};\n }\n const parsed = parseEnv(content);\n for (const [key, value] of Object.entries(parsed)) {\n if (options.override === true || process.env[key] === undefined) {\n process.env[key] = value;\n }\n }\n return parsed;\n}\n\nconst TRUTHY = new Set([\"true\", \"1\", \"yes\", \"on\"]);\nconst FALSY = new Set([\"false\", \"0\", \"no\", \"off\"]);\n\nfunction read(key: string): string | undefined {\n const value = process.env[key];\n return value !== undefined && value !== \"\" ? value : undefined;\n}\n\nfunction envString(key: string): string | undefined;\nfunction envString(key: string, fallback: string): string;\nfunction envString(key: string, fallback?: string): string | undefined {\n return read(key) ?? fallback;\n}\n\nfunction envNumber(key: string): number | undefined;\nfunction envNumber(key: string, fallback: number): number;\nfunction envNumber(key: string, fallback?: number): number | undefined {\n const value = read(key);\n if (value === undefined) return fallback;\n const parsed = Number(value);\n return Number.isNaN(parsed) ? fallback : parsed;\n}\n\nfunction envBoolean(key: string): boolean | undefined;\nfunction envBoolean(key: string, fallback: boolean): boolean;\nfunction envBoolean(key: string, fallback?: boolean): boolean | undefined {\n const value = read(key)?.toLowerCase();\n if (value === undefined) return fallback;\n if (TRUTHY.has(value)) return true;\n if (FALSY.has(value)) return false;\n return fallback;\n}\n\nfunction envRequire(key: string): string {\n const value = read(key);\n if (value === undefined) {\n throw new Error(`spearkit: required environment variable \"${key}\" is missing or empty`);\n }\n return value;\n}\n\n/** Typed, ergonomic reader over `process.env`. */\nexport interface EnvReader {\n /** A string value (empty strings count as missing), or `undefined`/`fallback`. */\n string(key: string): string | undefined;\n string(key: string, fallback: string): string;\n /** A numeric value, or `undefined`/`fallback` when missing or non-numeric. */\n number(key: string): number | undefined;\n number(key: string, fallback: number): number;\n /** A boolean (`true/1/yes/on` vs `false/0/no/off`), or `undefined`/`fallback`. */\n boolean(key: string): boolean | undefined;\n boolean(key: string, fallback: boolean): boolean;\n /** A string value, throwing if the variable is missing or empty. */\n require(key: string): string;\n}\n\n/**\n * Typed accessor over `process.env`.\n *\n * @example\n * ```ts\n * loadEnv();\n * const token = env.require(\"DISCORD_TOKEN\");\n * const port = env.number(\"PORT\", 3000);\n * const debug = env.boolean(\"DEBUG\", false);\n * ```\n */\nexport const env: EnvReader = {\n string: envString,\n number: envNumber,\n boolean: envBoolean,\n require: envRequire,\n};\n","/**\n * Rate-limit commands per user, per role, per guild, per channel or globally.\n *\n * A cooldown is described by a {@link CooldownConfig}: a base `duration`, the\n * `scope` it is keyed on, an `exempt` set (users/roles that never wait) and\n * per-user / per-role `overrides` (different durations for specific ids). Set a\n * default on the client (applies to every command) and/or per command.\n */\n\n/** What a cooldown is bucketed against. Default `\"user\"`. */\nexport type CooldownScope = \"user\" | \"guild\" | \"channel\" | \"global\";\n\n/** Users and roles that bypass a cooldown entirely. */\nexport interface CooldownExemptions {\n /** User ids that never wait. */\n users?: readonly string[];\n /** Role ids whose members never wait. */\n roles?: readonly string[];\n}\n\n/** Per-user and per-role duration overrides (milliseconds; `0` disables). */\nexport interface CooldownOverrides {\n /** `userId -> duration ms`. */\n users?: Readonly<Record<string, number>>;\n /** `roleId -> duration ms`. The most lenient matching role wins. */\n roles?: Readonly<Record<string, number>>;\n}\n\n/** Full cooldown description. */\nexport interface CooldownConfig {\n /** Base cooldown in milliseconds. */\n duration: number;\n /** What the cooldown is keyed on. Default `\"user\"`. */\n scope?: CooldownScope;\n /** Users/roles that bypass the cooldown. */\n exempt?: CooldownExemptions;\n /** Per-user / per-role duration overrides. */\n overrides?: CooldownOverrides;\n /** Message shown when blocked. A function receives the remaining ms. */\n message?: string | ((remainingMs: number) => string);\n}\n\n/** A `CooldownConfig`, or a bare duration in milliseconds. */\nexport type CooldownInput = number | CooldownConfig;\n\n/** Normalise a {@link CooldownInput} to a full {@link CooldownConfig}. */\nexport function normalizeCooldown(input: CooldownInput): CooldownConfig {\n return typeof input === \"number\" ? { duration: input } : input;\n}\n\n/** The actor a cooldown is evaluated for. */\nexport interface CooldownActor {\n userId: string;\n roleIds: readonly string[];\n guildId: string | null;\n channelId: string | null;\n}\n\n/** Whether an action is allowed now, and if not, how long remains. */\nexport type CooldownResult = { allowed: true } | { allowed: false; remaining: number };\n\nfunction scopeKey(scope: CooldownScope, actor: CooldownActor): string {\n switch (scope) {\n case \"guild\":\n return `g:${actor.guildId ?? \"dm\"}`;\n case \"channel\":\n return `c:${actor.channelId ?? \"dm\"}`;\n case \"global\":\n return \"global\";\n case \"user\":\n return `u:${actor.userId}`;\n }\n}\n\n/**\n * Resolve the cooldown an actor should serve. `null` means exempt (no\n * cooldown). Otherwise a duration in milliseconds (which may be `0`).\n */\nexport function effectiveDuration(config: CooldownConfig, actor: CooldownActor): number | null {\n if (config.exempt?.users?.includes(actor.userId) === true) return null;\n if (config.exempt?.roles?.some((roleId) => actor.roleIds.includes(roleId)) === true) return null;\n\n const userOverride = config.overrides?.users?.[actor.userId];\n if (userOverride !== undefined) return userOverride;\n\n const roleOverrides = config.overrides?.roles;\n if (roleOverrides !== undefined) {\n let best: number | undefined;\n for (const roleId of actor.roleIds) {\n const candidate = roleOverrides[roleId];\n if (candidate !== undefined) best = best === undefined ? candidate : Math.min(best, candidate);\n }\n if (best !== undefined) return best;\n }\n\n return config.duration;\n}\n\nfunction keyFor(bucket: string, config: CooldownConfig, actor: CooldownActor): string {\n return `${bucket}|${scopeKey(config.scope ?? \"user\", actor)}`;\n}\n\n/**\n * Tracks last-use timestamps and decides whether an action is allowed.\n * Stateful but dependency-free; one instance is shared on `client.cooldowns`.\n */\nexport class CooldownManager {\n private readonly hits = new Map<string, number>();\n\n /** Number of tracked buckets. */\n get size(): number {\n return this.hits.size;\n }\n\n /**\n * Check whether `actor` may use `bucket`, recording the use when allowed.\n * Exempt actors and non-positive durations are always allowed (no record).\n */\n consume(bucket: string, input: CooldownInput, actor: CooldownActor, now: number = Date.now()): CooldownResult {\n const config = normalizeCooldown(input);\n const duration = effectiveDuration(config, actor);\n if (duration === null || duration <= 0) return { allowed: true };\n const key = keyFor(bucket, config, actor);\n const last = this.hits.get(key);\n if (last !== undefined && now - last < duration) {\n return { allowed: false, remaining: duration - (now - last) };\n }\n this.hits.set(key, now);\n return { allowed: true };\n }\n\n /** Like {@link consume} but never records — a read-only check. */\n peek(bucket: string, input: CooldownInput, actor: CooldownActor, now: number = Date.now()): CooldownResult {\n const config = normalizeCooldown(input);\n const duration = effectiveDuration(config, actor);\n if (duration === null || duration <= 0) return { allowed: true };\n const last = this.hits.get(keyFor(bucket, config, actor));\n if (last !== undefined && now - last < duration) {\n return { allowed: false, remaining: duration - (now - last) };\n }\n return { allowed: true };\n }\n\n /** Clear a single actor's cooldown for a bucket. Returns whether one existed. */\n reset(bucket: string, actor: CooldownActor, scope: CooldownScope = \"user\"): boolean {\n return this.hits.delete(`${bucket}|${scopeKey(scope, actor)}`);\n }\n\n /** Drop every tracked cooldown. */\n clear(): void {\n this.hits.clear();\n }\n}\n\n/** Build the user-facing message for a blocked action. */\nexport function formatCooldownMessage(config: CooldownConfig, remainingMs: number): string {\n if (typeof config.message === \"function\") return config.message(remainingMs);\n if (typeof config.message === \"string\") return config.message;\n const seconds = Math.max(1, Math.ceil(remainingMs / 1000));\n return `You're on cooldown — try again in ${seconds}s.`;\n}\n","/**\n * Scheduled tasks: run work on a cron schedule or a fixed interval.\n *\n * Dependency-free. Includes a standard 5-field cron parser (`*`, ranges,\n * lists, steps, `@daily` style aliases) evaluated in local time, plus a\n * {@link TaskScheduler} that the client starts on ready and stops on destroy.\n */\nimport type { Awaitable } from \"discord.js\";\nimport type { SpearClient } from \"./client.js\";\nimport type { Logger } from \"./logger.js\";\nimport { toError } from \"./logger.js\";\n\nconst ALIASES: Record<string, string> = {\n \"@yearly\": \"0 0 1 1 *\",\n \"@annually\": \"0 0 1 1 *\",\n \"@monthly\": \"0 0 1 * *\",\n \"@weekly\": \"0 0 * * 0\",\n \"@daily\": \"0 0 * * *\",\n \"@midnight\": \"0 0 * * *\",\n \"@hourly\": \"0 * * * *\",\n};\n\nfunction parseField(spec: string, min: number, max: number, label: string): Set<number> {\n const set = new Set<number>();\n for (const part of spec.split(\",\")) {\n let range = part;\n let step = 1;\n const slash = part.indexOf(\"/\");\n if (slash >= 0) {\n step = Number(part.slice(slash + 1));\n range = part.slice(0, slash);\n if (!Number.isInteger(step) || step <= 0) {\n throw new Error(`spearkit: invalid step in cron ${label} field \"${part}\"`);\n }\n }\n let lo: number;\n let hi: number;\n if (range === \"*\") {\n lo = min;\n hi = max;\n } else if (range.includes(\"-\")) {\n const dash = range.indexOf(\"-\");\n lo = Number(range.slice(0, dash));\n hi = Number(range.slice(dash + 1));\n } else {\n lo = Number(range);\n hi = lo;\n }\n if (!Number.isInteger(lo) || !Number.isInteger(hi) || lo < min || hi > max || lo > hi) {\n throw new Error(`spearkit: cron ${label} field out of range ${min}-${max}: \"${part}\"`);\n }\n for (let value = lo; value <= hi; value += step) set.add(value);\n }\n return set;\n}\n\n/**\n * A parsed cron expression. Evaluates in the host's local time.\n *\n * @example\n * ```ts\n * cron(\"*\\u200b/5 * * * *\").next(); // next 5-minute boundary\n * cron(\"@daily\").next(new Date()); // next midnight\n * ```\n */\nexport class CronExpression {\n /** The original expression string. */\n readonly source: string;\n private readonly minutes: Set<number>;\n private readonly hours: Set<number>;\n private readonly daysOfMonth: Set<number>;\n private readonly months: Set<number>;\n private readonly daysOfWeek: Set<number>;\n private readonly domRestricted: boolean;\n private readonly dowRestricted: boolean;\n\n constructor(expression: string) {\n const trimmed = expression.trim();\n const normalized = ALIASES[trimmed] ?? trimmed;\n const parts = normalized.split(/\\s+/);\n if (parts.length !== 5) {\n throw new Error(`spearkit: cron expression must have 5 fields, got \"${expression}\"`);\n }\n const [minute, hour, dom, month, dow] = parts;\n if (\n minute === undefined ||\n hour === undefined ||\n dom === undefined ||\n month === undefined ||\n dow === undefined\n ) {\n throw new Error(`spearkit: invalid cron expression \"${expression}\"`);\n }\n this.source = expression;\n this.minutes = parseField(minute, 0, 59, \"minute\");\n this.hours = parseField(hour, 0, 23, \"hour\");\n this.daysOfMonth = parseField(dom, 1, 31, \"day-of-month\");\n this.months = parseField(month, 1, 12, \"month\");\n const weekdays = parseField(dow, 0, 7, \"day-of-week\");\n if (weekdays.has(7)) {\n weekdays.delete(7);\n weekdays.add(0);\n }\n this.daysOfWeek = weekdays;\n this.domRestricted = dom !== \"*\";\n this.dowRestricted = dow !== \"*\";\n }\n\n private dayMatches(date: Date): boolean {\n const dom = this.daysOfMonth.has(date.getDate());\n const dow = this.daysOfWeek.has(date.getDay());\n if (this.domRestricted && this.dowRestricted) return dom || dow;\n if (this.domRestricted) return dom;\n if (this.dowRestricted) return dow;\n return true;\n }\n\n /** The next time strictly after `from` (default now) that matches. */\n next(from: Date = new Date()): Date {\n const date = new Date(from.getTime());\n date.setSeconds(0, 0);\n date.setMinutes(date.getMinutes() + 1);\n for (let guard = 0; guard < 100_000; guard++) {\n if (!this.months.has(date.getMonth() + 1)) {\n date.setMonth(date.getMonth() + 1, 1);\n date.setHours(0, 0, 0, 0);\n continue;\n }\n if (!this.dayMatches(date)) {\n date.setDate(date.getDate() + 1);\n date.setHours(0, 0, 0, 0);\n continue;\n }\n if (!this.hours.has(date.getHours())) {\n date.setHours(date.getHours() + 1, 0, 0, 0);\n continue;\n }\n if (!this.minutes.has(date.getMinutes())) {\n date.setMinutes(date.getMinutes() + 1, 0, 0);\n continue;\n }\n return new Date(date.getTime());\n }\n throw new Error(`spearkit: cron expression \"${this.source}\" has no upcoming match`);\n }\n}\n\n/** Compile a cron expression. Throws on malformed input. */\nexport function cron(expression: string): CronExpression {\n return new CronExpression(expression);\n}\n\n/** Configuration for a scheduled task. Provide exactly one of `cron`/`interval`. */\nexport interface TaskConfig {\n /** Unique task name. */\n name: string;\n /** A cron expression (local time). */\n cron?: string;\n /** A fixed interval in milliseconds. */\n interval?: number;\n /** Also run once immediately when the scheduler starts. Default `false`. */\n runOnStart?: boolean;\n /** The work to perform. */\n run: (client: SpearClient) => Awaitable<void>;\n}\n\n/** A compiled, registrable scheduled task. Build it with {@link task}. */\nexport interface ScheduledTask {\n readonly kind: \"task\";\n readonly name: string;\n readonly interval?: number;\n readonly cron?: CronExpression;\n readonly runOnStart: boolean;\n readonly run: (client: SpearClient) => Awaitable<void>;\n}\n\n/** Define a scheduled task. Throws if neither `cron` nor `interval` is given. */\nexport function task(config: TaskConfig): ScheduledTask {\n if (config.cron === undefined && config.interval === undefined) {\n throw new Error(`spearkit: task \"${config.name}\" needs a cron expression or an interval`);\n }\n if (config.interval !== undefined && config.interval <= 0) {\n throw new Error(`spearkit: task \"${config.name}\" interval must be positive`);\n }\n return {\n kind: \"task\",\n name: config.name,\n interval: config.interval,\n cron: config.cron !== undefined ? new CronExpression(config.cron) : undefined,\n runOnStart: config.runOnStart ?? false,\n run: config.run,\n };\n}\n\nconst MAX_TIMEOUT = 2_147_483_647;\n\n/**\n * Runs {@link ScheduledTask}s. The client owns one as `client.scheduler`,\n * starts it on `clientReady` and stops it on `destroy`. Tasks added while\n * running are scheduled immediately.\n */\nexport class TaskScheduler {\n private readonly tasks = new Map<string, ScheduledTask>();\n private readonly timers = new Map<string, ReturnType<typeof setTimeout>>();\n private running = false;\n private client?: SpearClient;\n private logger?: Logger;\n\n /** Number of registered tasks. */\n get size(): number {\n return this.tasks.size;\n }\n\n /** Whether the scheduler is currently running. */\n get active(): boolean {\n return this.running;\n }\n\n /** Every registered task. */\n list(): ScheduledTask[] {\n return [...this.tasks.values()];\n }\n\n /** Attach a logger for task error reporting. */\n setLogger(logger: Logger): this {\n this.logger = logger;\n return this;\n }\n\n /** Register one or more tasks. If already running, they are scheduled now. */\n add(...tasks: ScheduledTask[]): this {\n for (const task of tasks) {\n this.tasks.set(task.name, task);\n if (this.running) this.begin(task);\n }\n return this;\n }\n\n /** Remove a task and cancel its timer. */\n remove(name: string): boolean {\n this.cancel(name);\n return this.tasks.delete(name);\n }\n\n /** Start every task. Safe to call once; later calls are ignored. */\n start(client: SpearClient): void {\n if (this.running) return;\n this.client = client;\n this.running = true;\n for (const task of this.tasks.values()) this.begin(task);\n }\n\n /** Stop the scheduler and cancel every pending timer. */\n stop(): void {\n this.running = false;\n for (const name of [...this.timers.keys()]) this.cancel(name);\n }\n\n private cancel(name: string): void {\n const timer = this.timers.get(name);\n if (timer !== undefined) {\n clearTimeout(timer);\n this.timers.delete(name);\n }\n }\n\n private begin(task: ScheduledTask): void {\n if (task.runOnStart) void this.runTask(task);\n this.scheduleNext(task);\n }\n\n private delayFor(task: ScheduledTask): number {\n if (task.interval !== undefined) return task.interval;\n if (task.cron !== undefined) return Math.max(0, task.cron.next().getTime() - Date.now());\n return MAX_TIMEOUT;\n }\n\n private scheduleNext(task: ScheduledTask): void {\n if (!this.running) return;\n this.arm(task.name, this.delayFor(task), () => {\n void this.runTask(task);\n this.scheduleNext(task);\n });\n }\n\n private arm(name: string, delay: number, fire: () => void): void {\n if (delay > MAX_TIMEOUT) {\n // setTimeout caps at ~24.8 days — chain until the remainder fits.\n const timer = setTimeout(() => this.arm(name, delay - MAX_TIMEOUT, fire), MAX_TIMEOUT);\n if (typeof timer.unref === \"function\") timer.unref();\n this.timers.set(name, timer);\n return;\n }\n const timer = setTimeout(fire, Math.max(0, delay));\n if (typeof timer.unref === \"function\") timer.unref();\n this.timers.set(name, timer);\n }\n\n private async runTask(task: ScheduledTask): Promise<void> {\n if (this.client === undefined) return;\n this.logger?.debug(\"task\", { data: { task: task.name } });\n try {\n await task.run(this.client);\n } catch (error) {\n this.logger?.error(`task \"${task.name}\" failed`, { error: toError(error) });\n }\n }\n}\n","/**\n * Classic text/prefix commands (e.g. `!ping`) alongside slash commands.\n *\n * Reading other users' message content requires the privileged\n * `MessageContent` intent (use `Intents.messages`). The client listens on\n * `messageCreate`, matches a configured prefix (or a bot mention), parses the\n * command name + arguments and dispatches. Cooldowns are shared with slash\n * commands via the same {@link CooldownManager}.\n */\nimport type {\n Awaitable,\n Message,\n MessageCreateOptions,\n MessagePayload,\n MessageReplyOptions,\n} from \"discord.js\";\nimport type { Logger } from \"./logger.js\";\nimport { toError } from \"./logger.js\";\nimport type { UsageEvent } from \"./usage.js\";\nimport {\n formatCooldownMessage,\n normalizeCooldown,\n type CooldownActor,\n type CooldownConfig,\n type CooldownInput,\n type CooldownManager,\n} from \"./cooldown.js\";\n\n/** Options controlling how prefix messages are recognised. */\nexport interface PrefixOptions {\n /** One or more command prefixes (e.g. `\"!\"` or `[\"!\", \"?\"]`). */\n prefix?: string | readonly string[];\n /** Also accept a leading bot mention as a prefix. Default `true`. */\n mention?: boolean;\n /** Ignore messages authored by bots. Default `true`. */\n ignoreBots?: boolean;\n /** Match command names case-insensitively. Default `true`. */\n caseInsensitive?: boolean;\n}\n\n/** Configuration for a prefix command. */\nexport interface PrefixCommandConfig<R = void> {\n /** Primary command name (the word after the prefix). */\n name: string;\n /** Alternative names that also trigger the command. */\n aliases?: readonly string[];\n /** Human description (for your own help command). */\n description?: string;\n /** Rate-limit this command. A number is a duration in ms. */\n cooldown?: CooldownInput;\n /** Handler invoked with a {@link PrefixContext}. */\n run: (ctx: PrefixContext) => Awaitable<R>;\n}\n\n/** A registrable prefix command. Build it with {@link prefixCommand}. */\nexport interface PrefixCommand {\n readonly kind: \"prefixCommand\";\n readonly name: string;\n readonly aliases: readonly string[];\n readonly description?: string;\n readonly cooldown?: CooldownConfig;\n readonly run: (ctx: PrefixContext) => Promise<void>;\n}\n\n/** Define a prefix command. */\nexport function prefixCommand<R = void>(config: PrefixCommandConfig<R>): PrefixCommand {\n return {\n kind: \"prefixCommand\",\n name: config.name,\n aliases: config.aliases ?? [],\n description: config.description,\n cooldown: config.cooldown !== undefined ? normalizeCooldown(config.cooldown) : undefined,\n run: async (ctx) => {\n await config.run(ctx);\n },\n };\n}\n\n/** The handler argument for a prefix command: the message plus parsed args. */\nexport class PrefixContext {\n constructor(\n /** The triggering message. */\n readonly message: Message,\n /** The matched command name (as typed). */\n readonly commandName: string,\n /** Whitespace-split arguments after the command name. */\n readonly args: string[],\n /** The raw text after the command name. */\n readonly rest: string,\n ) {}\n\n get client(): Message[\"client\"] {\n return this.message.client;\n }\n get author() {\n return this.message.author;\n }\n get member() {\n return this.message.member;\n }\n get guild() {\n return this.message.guild;\n }\n get guildId(): string | null {\n return this.message.guildId;\n }\n get channel() {\n return this.message.channel;\n }\n get channelId(): string {\n return this.message.channelId;\n }\n\n /** Reply to the triggering message. */\n reply(content: string | MessagePayload | MessageReplyOptions): Promise<Message> {\n return this.message.reply(content);\n }\n\n /** Send a message to the same channel (no reply reference). */\n async send(content: string | MessagePayload | MessageCreateOptions): Promise<Message | undefined> {\n const channel = this.message.channel;\n if (\"send\" in channel) return channel.send(content);\n return undefined;\n }\n}\n\n/** Error hook invoked when a prefix command handler throws. */\nexport type PrefixErrorHandler = (error: Error, message: Message) => Awaitable<void>;\n\ninterface ResolvedPrefixOptions {\n prefixes: string[];\n mention: boolean;\n ignoreBots: boolean;\n caseInsensitive: boolean;\n}\n\nfunction resolveOptions(input: string | readonly string[] | PrefixOptions): ResolvedPrefixOptions {\n if (typeof input === \"string\") return { prefixes: [input], mention: true, ignoreBots: true, caseInsensitive: true };\n if (Array.isArray(input)) {\n return { prefixes: [...input], mention: true, ignoreBots: true, caseInsensitive: true };\n }\n const options = input as PrefixOptions;\n const prefix = options.prefix ?? [];\n return {\n prefixes: typeof prefix === \"string\" ? [prefix] : [...prefix],\n mention: options.mention ?? true,\n ignoreBots: options.ignoreBots ?? true,\n caseInsensitive: options.caseInsensitive ?? true,\n };\n}\n\nfunction actorFromMessage(message: Message): CooldownActor {\n const member = message.member;\n const roleIds = member !== null ? [...member.roles.cache.keys()] : [];\n return {\n userId: message.author.id,\n roleIds,\n guildId: message.guildId,\n channelId: message.channelId,\n };\n}\n\n/** Holds prefix commands and dispatches matching messages to them. */\nexport class PrefixRegistry {\n private readonly commands = new Map<string, PrefixCommand>();\n private readonly lookup = new Map<string, PrefixCommand>();\n private options: ResolvedPrefixOptions = {\n prefixes: [],\n mention: true,\n ignoreBots: true,\n caseInsensitive: true,\n };\n private logger?: Logger;\n private cooldowns?: CooldownManager;\n private defaultCooldown?: CooldownConfig;\n private errorHandler?: PrefixErrorHandler;\n private onUsage?: (event: UsageEvent) => void;\n\n /** Configure prefixes and matching behaviour. */\n setOptions(input: string | readonly string[] | PrefixOptions): this {\n this.options = resolveOptions(input);\n return this;\n }\n\n /** Attach a logger for dispatch tracing and error reporting. */\n setLogger(logger: Logger): this {\n this.logger = logger;\n return this;\n }\n\n /** Attach a hook called after each successful prefix command run. */\n setUsageHook(hook: (event: UsageEvent) => void): this {\n this.onUsage = hook;\n return this;\n }\n\n /** Share a cooldown manager and an optional default cooldown. */\n setCooldowns(manager: CooldownManager, defaultCooldown?: CooldownConfig): this {\n this.cooldowns = manager;\n this.defaultCooldown = defaultCooldown;\n return this;\n }\n\n /** Set the handler used when a prefix command throws. */\n onError(handler: PrefixErrorHandler): this {\n this.errorHandler = handler;\n return this;\n }\n\n /** Register one or more prefix commands (and their aliases). */\n add(...commands: PrefixCommand[]): this {\n for (const command of commands) {\n this.commands.set(command.name, command);\n this.index(command.name, command);\n for (const alias of command.aliases) this.index(alias, command);\n }\n return this;\n }\n\n private index(key: string, command: PrefixCommand): void {\n this.lookup.set(this.options.caseInsensitive ? key.toLowerCase() : key, command);\n }\n\n /** Look up a command by name or alias. */\n get(nameOrAlias: string): PrefixCommand | undefined {\n return this.lookup.get(this.options.caseInsensitive ? nameOrAlias.toLowerCase() : nameOrAlias);\n }\n\n /** Number of registered commands (excluding aliases). */\n get size(): number {\n return this.commands.size;\n }\n\n /** Every registered command. */\n list(): PrefixCommand[] {\n return [...this.commands.values()];\n }\n\n /** Strip a matching prefix (or bot mention) from `content`, or return `null`. */\n private stripPrefix(content: string, botId: string | undefined): string | null {\n for (const prefix of this.options.prefixes) {\n if (prefix.length > 0 && content.startsWith(prefix)) return content.slice(prefix.length);\n }\n if (this.options.mention && botId !== undefined) {\n const match = /^<@!?(\\d+)>\\s*/.exec(content);\n if (match !== null && match[1] === botId) return content.slice(match[0].length);\n }\n return null;\n }\n\n /**\n * Parse and dispatch a message. Returns `true` when a command ran (or was\n * blocked by a cooldown), `false` when the message was not a prefix command.\n */\n async handle(message: Message): Promise<boolean> {\n if (this.options.prefixes.length === 0 && !this.options.mention) return false;\n if (this.options.ignoreBots && message.author.bot) return false;\n\n const stripped = this.stripPrefix(message.content, message.client.user?.id);\n if (stripped === null) return false;\n\n const trimmed = stripped.trimStart();\n const match = /^(\\S+)\\s*([\\s\\S]*)$/.exec(trimmed);\n if (match === null) return false;\n const name = match[1] ?? \"\";\n const rest = match[2] ?? \"\";\n const command = this.get(name);\n if (command === undefined) return false;\n\n this.logger?.debug(\"prefix\", { data: { command: command.name, user: message.author.id } });\n\n const cooldown = command.cooldown ?? this.defaultCooldown;\n if (cooldown !== undefined && this.cooldowns !== undefined) {\n const result = this.cooldowns.consume(`prefix:${command.name}`, cooldown, actorFromMessage(message));\n if (!result.allowed) {\n await message.reply(formatCooldownMessage(cooldown, result.remaining)).catch(() => undefined);\n return true;\n }\n }\n\n const args = rest.length > 0 ? rest.split(/\\s+/) : [];\n try {\n await command.run(new PrefixContext(message, name, args, rest));\n this.onUsage?.({\n type: \"prefix\",\n name: command.name,\n userId: message.author.id,\n userTag: message.author.tag,\n guildId: message.guildId,\n channelId: message.channelId,\n timestamp: new Date(),\n });\n } catch (error) {\n const err = toError(error);\n this.logger?.error(`prefix command \"${command.name}\" failed`, { error: err });\n if (this.errorHandler !== undefined) await this.errorHandler(err, message);\n }\n return true;\n }\n}\n\n","/**\n * Usage tracking — record *who used what*. Two independent sinks:\n *\n * - a {@link UsageStore} (a database) that persists every use, and\n * - a Discord-channel reporter that posts a human-readable line per use.\n *\n * This is deliberately separate from the {@link Logger}: the logger is for\n * problems/diagnostics, this is an audit trail of command/component usage that\n * you can keep in a store and/or mirror into a channel.\n */\nimport { appendFile, mkdir, readFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { Awaitable } from \"discord.js\";\nimport type { SpearClient } from \"./client.js\";\nimport type { Logger } from \"./logger.js\";\nimport { toError } from \"./logger.js\";\n\n/** What kind of interaction was used. */\nexport type UsageType = \"command\" | \"prefix\" | \"component\" | \"event\";\n\n/** A single recorded use. */\nexport interface UsageEvent {\n readonly type: UsageType;\n /** Command/component name (or event name). */\n readonly name: string;\n readonly userId?: string;\n readonly userTag?: string;\n readonly guildId?: string | null;\n readonly channelId?: string | null;\n /** Free-form extra detail. */\n readonly detail?: string;\n readonly timestamp: Date;\n}\n\n/** A pluggable persistence backend for {@link UsageEvent}s. */\nexport interface UsageStore {\n /** Persist one event. */\n record(event: UsageEvent): Awaitable<void>;\n /** Read every persisted event. */\n all(): Awaitable<readonly UsageEvent[]>;\n}\n\n/** In-memory store; great for tests and dashboards. Optionally capped. */\nexport class MemoryUsageStore implements UsageStore {\n private readonly events: UsageEvent[] = [];\n\n constructor(private readonly limit: number = Number.POSITIVE_INFINITY) {}\n\n record(event: UsageEvent): void {\n this.events.push(event);\n if (this.events.length > this.limit) this.events.splice(0, this.events.length - this.limit);\n }\n\n all(): readonly UsageEvent[] {\n return this.events;\n }\n\n /** Total recorded events. */\n get size(): number {\n return this.events.length;\n }\n\n /** Events recorded for a given user id. */\n byUser(userId: string): UsageEvent[] {\n return this.events.filter((event) => event.userId === userId);\n }\n\n /** Forget everything. */\n clear(): void {\n this.events.length = 0;\n }\n}\n\ninterface SerializedEvent {\n type: UsageType;\n name: string;\n userId?: string;\n userTag?: string;\n guildId?: string | null;\n channelId?: string | null;\n detail?: string;\n timestamp: string;\n}\n\n/**\n * File-backed store using newline-delimited JSON (`.jsonl`). Appends one line\n * per event — durable, human-inspectable, and dependency-free.\n */\nexport class JsonFileUsageStore implements UsageStore {\n constructor(private readonly path: string) {}\n\n async record(event: UsageEvent): Promise<void> {\n const line = `${JSON.stringify({ ...event, timestamp: event.timestamp.toISOString() })}\\n`;\n await mkdir(dirname(this.path), { recursive: true });\n await appendFile(this.path, line, \"utf8\");\n }\n\n async all(): Promise<readonly UsageEvent[]> {\n let content: string;\n try {\n content = await readFile(this.path, \"utf8\");\n } catch {\n return [];\n }\n const events: UsageEvent[] = [];\n for (const line of content.split(\"\\n\")) {\n if (line.trim().length === 0) continue;\n const parsed = JSON.parse(line) as SerializedEvent;\n events.push({ ...parsed, timestamp: new Date(parsed.timestamp) });\n }\n return events;\n }\n}\n\n/** Default one-line rendering of a usage event for a Discord channel. */\nexport function formatUsage(event: UsageEvent): string {\n const who = event.userTag ?? (event.userId !== undefined ? `<@${event.userId}>` : \"unknown\");\n const where =\n event.channelId !== undefined && event.channelId !== null ? ` in <#${event.channelId}>` : \"\";\n const detail = event.detail !== undefined ? ` — ${event.detail}` : \"\";\n return `\\`${event.type}\\` **${event.name}** by ${who}${where}${detail}`;\n}\n\n/** Client-level usage configuration (the `usage` option). */\nexport interface UsageOptions {\n /** Persist events to this store (a database). */\n store?: UsageStore;\n /** Mirror events into this Discord channel id. */\n channel?: string;\n /** Custom channel-line formatter. */\n format?: (event: UsageEvent) => string;\n}\ninterface Reporter {\n channelId: string;\n format: (event: UsageEvent) => string;\n}\n\n/**\n * Routes each {@link UsageEvent} to a store and/or a Discord channel. The\n * client owns one as `client.usage`. Tracking is fire-and-forget: a slow store\n * or channel never blocks command handling, and failures are logged.\n */\nexport class UsageTracker {\n /** The configured store, if any. Directly queryable. */\n store?: UsageStore;\n private reporter?: Reporter;\n private client?: SpearClient;\n private logger?: Logger;\n\n /** Whether anything will happen on {@link track}. */\n get enabled(): boolean {\n return this.store !== undefined || this.reporter !== undefined;\n }\n\n /** @internal Used by the client to resolve report channels. */\n setClient(client: SpearClient): this {\n this.client = client;\n return this;\n }\n\n setLogger(logger: Logger): this {\n this.logger = logger;\n return this;\n }\n\n /** Persist events to a store (a database). */\n setStore(store: UsageStore): this {\n this.store = store;\n return this;\n }\n\n /** Mirror events into a Discord channel. */\n reportTo(channelId: string, format: (event: UsageEvent) => string = formatUsage): this {\n this.reporter = { channelId, format };\n return this;\n }\n\n /** Record a use. Returns immediately; storing/reporting happen in the background. */\n track(event: UsageEvent): void {\n if (!this.enabled) return;\n void this.run(event);\n }\n\n private async run(event: UsageEvent): Promise<void> {\n if (this.store !== undefined) {\n try {\n await this.store.record(event);\n } catch (error) {\n this.logger?.error(\"usage store failed\", { error: toError(error) });\n }\n }\n if (this.reporter !== undefined && this.client !== undefined) {\n try {\n const cache = this.client.channels.cache.get(this.reporter.channelId);\n const channel = cache ?? (await this.client.channels.fetch(this.reporter.channelId));\n if (channel !== null && \"send\" in channel) {\n await channel.send(this.reporter.format(event));\n }\n } catch (error) {\n this.logger?.error(\"usage report failed\", { error: toError(error) });\n }\n }\n }\n}\n","import {\n MessageFlags,\n type InteractionEditReplyOptions,\n type InteractionReplyOptions,\n type InteractionResponse,\n type Message,\n type RepliableInteraction,\n} from \"discord.js\";\n\n/** Reply options with an ergonomic `ephemeral` shortcut (mapped to flags). */\nexport type ReplyData = InteractionReplyOptions & { ephemeral?: boolean };\n\n/** Either a plain string or full reply options. */\nexport type ReplyInput = string | ReplyData;\n\ntype Flags = InteractionReplyOptions[\"flags\"];\n\nfunction withEphemeralFlag(flags: Flags): Flags {\n if (flags == null) return MessageFlags.Ephemeral;\n if (typeof flags === \"number\" || typeof flags === \"bigint\") {\n return Number(flags) | MessageFlags.Ephemeral;\n }\n if (Array.isArray(flags)) return [...flags, MessageFlags.Ephemeral] as Flags;\n return [flags, MessageFlags.Ephemeral] as Flags;\n}\n\n/** Normalises spearkit reply input into a discord.js reply payload. */\nexport function normalizeReply(input: ReplyInput): InteractionReplyOptions {\n if (typeof input === \"string\") return { content: input };\n const { ephemeral, ...rest } = input;\n if (ephemeral) return { ...rest, flags: withEphemeralFlag(rest.flags) };\n return rest;\n}\n\nfunction normalizeEdit(input: ReplyInput): InteractionEditReplyOptions {\n if (typeof input === \"string\") return { content: input };\n const { ephemeral: _ephemeral, flags: _flags, ...rest } = input;\n return rest;\n}\n\n/** Marks an input as ephemeral, regardless of how it was passed. */\nexport function asEphemeral(input: ReplyInput): ReplyData {\n if (typeof input === \"string\") return { content: input, ephemeral: true };\n return { ...input, ephemeral: true };\n}\n\n/**\n * Ergonomic base wrapper shared by every interaction context (commands,\n * buttons, selects, modals). Exposes the common actor/location accessors plus\n * reply helpers that smooth over discord.js' state machine.\n */\nexport abstract class BaseContext<I extends RepliableInteraction = RepliableInteraction> {\n constructor(readonly interaction: I) {}\n\n get client(): I[\"client\"] {\n return this.interaction.client;\n }\n get user() {\n return this.interaction.user;\n }\n get member() {\n return this.interaction.member;\n }\n get guild() {\n return this.interaction.guild;\n }\n get guildId() {\n return this.interaction.guildId;\n }\n get channel() {\n return this.interaction.channel;\n }\n get channelId() {\n return this.interaction.channelId;\n }\n get locale() {\n return this.interaction.locale;\n }\n /** Whether the interaction is already deferred. */\n get deferred() {\n return this.interaction.deferred;\n }\n /** Whether the interaction already received an initial response. */\n get replied() {\n return this.interaction.replied;\n }\n\n /** Send the initial response to the interaction. */\n reply(input: ReplyInput): Promise<InteractionResponse<boolean>> {\n return this.interaction.reply(normalizeReply(input));\n }\n\n /** Reply, but always hidden to everyone except the invoking user. */\n replyEphemeral(input: ReplyInput): Promise<InteractionResponse<boolean>> {\n return this.reply(asEphemeral(input));\n }\n\n /** Acknowledge now and respond later via {@link editReply}. */\n defer(options: { ephemeral?: boolean } = {}): Promise<InteractionResponse<boolean>> {\n return this.interaction.deferReply(\n options.ephemeral ? { flags: MessageFlags.Ephemeral } : {},\n );\n }\n\n /** Edit the original (or deferred) response. */\n editReply(input: ReplyInput): Promise<Message> {\n return this.interaction.editReply(normalizeEdit(input));\n }\n\n /** Add an additional message after the initial response. */\n followUp(input: ReplyInput): Promise<Message> {\n return this.interaction.followUp(normalizeReply(input));\n }\n\n /**\n * State-aware send: replies, edits a deferred response, or follows up —\n * whichever is valid given the current interaction state. The single method\n * most handlers ever need.\n */\n async send(input: ReplyInput): Promise<void> {\n if (this.interaction.deferred) {\n await this.editReply(input);\n } else if (this.interaction.replied) {\n await this.followUp(input);\n } else {\n await this.reply(input);\n }\n }\n\n /** State-aware ephemeral error message. */\n error(message: string): Promise<void> {\n return this.send(asEphemeral(message));\n }\n}\n","import {\n ApplicationCommandOptionType,\n type APIApplicationCommandBasicOption,\n type APIApplicationCommandChannelOption,\n type APIApplicationCommandOptionChoice,\n type Attachment,\n type Awaitable,\n type ChatInputCommandInteraction,\n type CommandInteractionOption,\n type LocalizationMap,\n} from \"discord.js\";\nimport type { AutocompleteContext } from \"./context.js\";\n\n/**\n * Resolved runtime value types, derived directly from discord.js' option\n * resolver so spearkit stays exactly in lockstep with the underlying getters.\n */\ntype Opt = CommandInteractionOption;\ntype UserValue = NonNullable<Opt[\"user\"]>;\ntype ChannelValue = NonNullable<Opt[\"channel\"]>;\ntype RoleValue = NonNullable<Opt[\"role\"]>;\ntype MentionableValue = NonNullable<Opt[\"user\" | \"role\" | \"member\"]>;\ntype AttachmentValue = Attachment;\n\n/** The discord-allowed channel types for a channel option. */\nexport type AllowedChannelType = NonNullable<APIApplicationCommandChannelOption[\"channel_types\"]>[number];\n\n/** The reader surface spearkit needs off a chat-input interaction. */\ntype OptionReader = ChatInputCommandInteraction[\"options\"];\n\n/** The closed set of values a slash option can resolve to. */\nexport type OptionValue =\n | string\n | number\n | boolean\n | UserValue\n | ChannelValue\n | RoleValue\n | MentionableValue\n | AttachmentValue;\n\n/** A single choice for string/integer/number options. */\nexport interface OptionChoice<V extends string | number = string | number> {\n readonly name: string;\n readonly value: V;\n readonly nameLocalizations?: LocalizationMap;\n}\n\n/** Provides autocomplete suggestions for an option as the user types. */\nexport type AutocompleteHandler<V extends string | number = string | number> = (\n ctx: AutocompleteContext,\n) => Awaitable<OptionChoice<V>[]>;\n\n/**\n * A fully-described slash command option. The two type parameters are phantom\n * markers used purely for compile-time inference of the resolved value:\n * - `TValue` is the type produced for the command handler.\n * - `TRequired` controls nullability (`true` => value, `false` => `| undefined`).\n */\nexport interface OptionDef<TValue extends OptionValue, TRequired extends boolean> {\n readonly type: ApplicationCommandOptionType;\n readonly description: string;\n readonly required: TRequired;\n readonly choices?: readonly OptionChoice[];\n readonly minValue?: number;\n readonly maxValue?: number;\n readonly minLength?: number;\n readonly maxLength?: number;\n readonly channelTypes?: readonly AllowedChannelType[];\n readonly autocomplete?: AutocompleteHandler;\n readonly nameLocalizations?: LocalizationMap;\n readonly descriptionLocalizations?: LocalizationMap;\n /** Phantom-only marker. Never populated at runtime. */\n readonly __value?: TValue;\n}\n\n/** Any option definition, regardless of value/required type. */\nexport type AnyOptionDef = OptionDef<OptionValue, boolean>;\n\n/** A map of option name => definition. */\nexport type OptionMap = Record<string, AnyOptionDef>;\n\n/** Maps an {@link OptionDef} to the value passed into the command handler. */\nexport type ResolvedOption<O extends AnyOptionDef> = O extends OptionDef<infer V, infer Req>\n ? Req extends true\n ? V\n : V | undefined\n : never;\n\n/** Resolves a whole {@link OptionMap} into the handler's `options` object. */\nexport type ResolvedOptions<O extends OptionMap> = {\n [K in keyof O]: ResolvedOption<O[K]>;\n};\n\n// --- builder config shapes -------------------------------------------------\n\ninterface BaseConfig {\n readonly description: string;\n readonly required?: boolean;\n readonly nameLocalizations?: LocalizationMap;\n readonly descriptionLocalizations?: LocalizationMap;\n}\n\ntype IsRequired<C extends BaseConfig> = C[\"required\"] extends true ? true : false;\n\ninterface StringConfig extends BaseConfig {\n readonly choices?: readonly OptionChoice<string>[];\n readonly minLength?: number;\n readonly maxLength?: number;\n readonly autocomplete?: AutocompleteHandler<string>;\n}\n\ninterface NumericConfig extends BaseConfig {\n readonly choices?: readonly OptionChoice<number>[];\n readonly minValue?: number;\n readonly maxValue?: number;\n readonly autocomplete?: AutocompleteHandler<number>;\n}\n\ninterface ChannelConfig extends BaseConfig {\n readonly channelTypes?: readonly AllowedChannelType[];\n}\n\ntype ChoiceValue<C, Fallback extends string | number> = C extends {\n readonly choices: readonly { value: infer V }[];\n}\n ? [V] extends [string | number]\n ? V\n : Fallback\n : Fallback;\n\n/**\n * The single boundary assertion in the option system: the runtime `required`\n * value is a wide `boolean`, but the public type narrows it to the literal the\n * caller supplied. Centralised so every builder stays otherwise cast-free.\n */\nfunction makeOption<TValue extends OptionValue, C extends BaseConfig>(\n type: ApplicationCommandOptionType,\n config: C,\n): OptionDef<TValue, IsRequired<C>> {\n return { type, ...config, required: (config.required ?? false) as IsRequired<C> };\n}\n\n/**\n * Type-safe slash command option builders.\n *\n * @example\n * ```ts\n * options: {\n * target: option.user({ description: \"Who to greet\", required: true }),\n * loud: option.boolean({ description: \"Shout it\" }),\n * }\n * ```\n */\nexport const option = {\n string<const C extends StringConfig>(config: C): OptionDef<ChoiceValue<C, string>, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.String, config);\n },\n integer<const C extends NumericConfig>(config: C): OptionDef<ChoiceValue<C, number>, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.Integer, config);\n },\n number<const C extends NumericConfig>(config: C): OptionDef<ChoiceValue<C, number>, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.Number, config);\n },\n boolean<const C extends BaseConfig>(config: C): OptionDef<boolean, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.Boolean, config);\n },\n user<const C extends BaseConfig>(config: C): OptionDef<UserValue, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.User, config);\n },\n channel<const C extends ChannelConfig>(config: C): OptionDef<ChannelValue, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.Channel, config);\n },\n role<const C extends BaseConfig>(config: C): OptionDef<RoleValue, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.Role, config);\n },\n mentionable<const C extends BaseConfig>(config: C): OptionDef<MentionableValue, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.Mentionable, config);\n },\n attachment<const C extends BaseConfig>(config: C): OptionDef<AttachmentValue, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.Attachment, config);\n },\n} as const;\n\nfunction mapChoices<V extends string | number>(\n choices: readonly OptionChoice[] | undefined,\n): APIApplicationCommandOptionChoice<V>[] | undefined {\n return choices?.map((c) => ({\n name: c.name,\n value: c.value as V,\n name_localizations: c.nameLocalizations,\n }));\n}\n\n/** Converts a spearkit option definition into the discord REST option payload. */\nexport function toAPIOption(name: string, def: AnyOptionDef): APIApplicationCommandBasicOption {\n const shared = {\n name,\n description: def.description,\n required: def.required,\n name_localizations: def.nameLocalizations,\n description_localizations: def.descriptionLocalizations,\n };\n\n switch (def.type) {\n case ApplicationCommandOptionType.String: {\n const base = { ...shared, min_length: def.minLength, max_length: def.maxLength };\n return def.autocomplete !== undefined\n ? { ...base, type: ApplicationCommandOptionType.String, autocomplete: true }\n : { ...base, type: ApplicationCommandOptionType.String, choices: mapChoices<string>(def.choices) };\n }\n case ApplicationCommandOptionType.Integer: {\n const base = { ...shared, min_value: def.minValue, max_value: def.maxValue };\n return def.autocomplete !== undefined\n ? { ...base, type: ApplicationCommandOptionType.Integer, autocomplete: true }\n : { ...base, type: ApplicationCommandOptionType.Integer, choices: mapChoices<number>(def.choices) };\n }\n case ApplicationCommandOptionType.Number: {\n const base = { ...shared, min_value: def.minValue, max_value: def.maxValue };\n return def.autocomplete !== undefined\n ? { ...base, type: ApplicationCommandOptionType.Number, autocomplete: true }\n : { ...base, type: ApplicationCommandOptionType.Number, choices: mapChoices<number>(def.choices) };\n }\n case ApplicationCommandOptionType.Channel:\n return {\n ...shared,\n type: ApplicationCommandOptionType.Channel,\n channel_types: def.channelTypes ? [...def.channelTypes] : undefined,\n };\n case ApplicationCommandOptionType.User:\n return { ...shared, type: ApplicationCommandOptionType.User };\n case ApplicationCommandOptionType.Boolean:\n return { ...shared, type: ApplicationCommandOptionType.Boolean };\n case ApplicationCommandOptionType.Role:\n return { ...shared, type: ApplicationCommandOptionType.Role };\n case ApplicationCommandOptionType.Mentionable:\n return { ...shared, type: ApplicationCommandOptionType.Mentionable };\n case ApplicationCommandOptionType.Attachment:\n return { ...shared, type: ApplicationCommandOptionType.Attachment };\n default:\n return { ...shared, type: ApplicationCommandOptionType.String };\n }\n}\n\n/** Reads a resolved option value off a discord.js option resolver. */\nexport function readOption(\n resolver: OptionReader,\n name: string,\n def: AnyOptionDef,\n): OptionValue | undefined {\n switch (def.type) {\n case ApplicationCommandOptionType.String:\n return resolver.getString(name) ?? undefined;\n case ApplicationCommandOptionType.Integer:\n return resolver.getInteger(name) ?? undefined;\n case ApplicationCommandOptionType.Number:\n return resolver.getNumber(name) ?? undefined;\n case ApplicationCommandOptionType.Boolean:\n return resolver.getBoolean(name) ?? undefined;\n case ApplicationCommandOptionType.User:\n return resolver.getUser(name) ?? undefined;\n case ApplicationCommandOptionType.Channel:\n return resolver.getChannel(name) ?? undefined;\n case ApplicationCommandOptionType.Role:\n return resolver.getRole(name) ?? undefined;\n case ApplicationCommandOptionType.Mentionable:\n return resolver.getMentionable(name) ?? undefined;\n case ApplicationCommandOptionType.Attachment:\n return resolver.getAttachment(name) ?? undefined;\n default:\n return undefined;\n }\n}\n\n/** True if any option in the map declares an autocomplete handler. */\nexport function optionsHaveAutocomplete(options: OptionMap): boolean {\n for (const def of Object.values(options)) {\n if (def.autocomplete !== undefined) return true;\n }\n return false;\n}\n","import type {\n AutocompleteInteraction,\n ChatInputCommandInteraction,\n JSONEncodable,\n ModalComponentData,\n ModalBuilder,\n APIModalInteractionResponseCallbackData,\n} from \"discord.js\";\nimport { BaseContext } from \"../context.js\";\nimport type { OptionChoice, OptionMap, ResolvedOptions } from \"./options.js\";\n\n/**\n * The handler argument for a slash command. Wraps the discord.js interaction\n * and exposes the resolved, fully-typed {@link options}.\n */\nexport class CommandContext<O extends OptionMap = OptionMap> extends BaseContext<ChatInputCommandInteraction> {\n constructor(\n interaction: ChatInputCommandInteraction,\n /** Resolved option values, typed from the command's `options` map. */\n readonly options: ResolvedOptions<O>,\n ) {\n super(interaction);\n }\n\n get commandName(): string {\n return this.interaction.commandName;\n }\n\n /** The invoked subcommand name, if any. */\n get subcommand(): string | null {\n return this.interaction.options.getSubcommand(false);\n }\n\n /** Present a modal to the user in response to this command. */\n async showModal(\n modal: JSONEncodable<APIModalInteractionResponseCallbackData> | ModalComponentData | ModalBuilder,\n ): Promise<void> {\n await this.interaction.showModal(modal);\n }\n}\n\n/**\n * The handler argument for autocomplete requests. Provides the focused value\n * and a typed {@link respond} helper.\n */\nexport class AutocompleteContext {\n constructor(readonly interaction: AutocompleteInteraction) {}\n\n get client() {\n return this.interaction.client;\n }\n get user() {\n return this.interaction.user;\n }\n get guild() {\n return this.interaction.guild;\n }\n get guildId() {\n return this.interaction.guildId;\n }\n get commandName(): string {\n return this.interaction.commandName;\n }\n\n /** Name of the option currently being completed. */\n get focusedName(): string {\n return this.interaction.options.getFocused(true).name;\n }\n\n /** Current partial value typed by the user. */\n get value(): string {\n return this.interaction.options.getFocused();\n }\n\n /** Send autocomplete suggestions (capped at the discord limit of 25). */\n respond(choices: OptionChoice<string | number>[]): Promise<void> {\n return this.interaction.respond(\n choices.slice(0, 25).map((c) => ({\n name: c.name,\n value: c.value,\n name_localizations: c.nameLocalizations,\n })),\n );\n }\n}\n","import {\n ApplicationCommandOptionType,\n ApplicationCommandType,\n InteractionContextType,\n PermissionsBitField,\n type APIApplicationCommandSubcommandGroupOption,\n type APIApplicationCommandSubcommandOption,\n type AutocompleteInteraction,\n type Awaitable,\n type ChatInputCommandInteraction,\n type LocalizationMap,\n type PermissionResolvable,\n type RESTPostAPIChatInputApplicationCommandsJSONBody,\n} from \"discord.js\";\nimport { AutocompleteContext, CommandContext } from \"./context.js\";\nimport {\n optionsHaveAutocomplete,\n readOption,\n toAPIOption,\n type OptionMap,\n type OptionValue,\n type ResolvedOptions,\n} from \"./options.js\";\nimport { normalizeCooldown, type CooldownConfig, type CooldownInput } from \"../cooldown.js\";\n\n/** Metadata shared by every kind of command. */\ninterface CommonMeta {\n /** Permissions a member must have by default to see/use the command. */\n defaultMemberPermissions?: PermissionResolvable | null;\n /** Mark the command NSFW (age-restricted). */\n nsfw?: boolean;\n /** Restrict invocation to guilds only. */\n guildOnly?: boolean;\n nameLocalizations?: LocalizationMap;\n descriptionLocalizations?: LocalizationMap;\n /** Rate-limit this command. A number is a duration in ms; see {@link CooldownConfig}. */\n cooldown?: CooldownInput;\n}\n\n/** Configuration for a leaf (non-subcommand) slash command. */\nexport interface CommandConfig<O extends OptionMap, R> extends CommonMeta {\n name: string;\n description: string;\n options?: O;\n run: (ctx: CommandContext<O>) => Awaitable<R>;\n}\n\n/** Configuration for one subcommand. */\nexport interface SubcommandConfig<O extends OptionMap, R> {\n description: string;\n options?: O;\n nameLocalizations?: LocalizationMap;\n descriptionLocalizations?: LocalizationMap;\n run: (ctx: CommandContext<O>) => Awaitable<R>;\n}\n\n/** A type-erased, ready-to-run subcommand created with {@link subcommand}. */\nexport interface Subcommand {\n readonly kind: \"subcommand\";\n readonly description: string;\n readonly options: OptionMap;\n readonly nameLocalizations?: LocalizationMap;\n readonly descriptionLocalizations?: LocalizationMap;\n readonly hasAutocomplete: boolean;\n readonly execute: (interaction: ChatInputCommandInteraction) => Promise<void>;\n readonly autocomplete: (interaction: AutocompleteInteraction) => Promise<void>;\n}\n\n/** Configuration for a subcommand group (a folder of subcommands). */\nexport interface SubcommandGroupConfig {\n description: string;\n subcommands: Record<string, Subcommand>;\n nameLocalizations?: LocalizationMap;\n descriptionLocalizations?: LocalizationMap;\n}\n\n/** A subcommand group created with {@link subcommandGroup}. */\nexport interface SubcommandGroup extends SubcommandGroupConfig {\n readonly kind: \"group\";\n}\n\n/** Configuration for a command that contains subcommands and/or groups. */\nexport interface CommandGroupConfig extends CommonMeta {\n name: string;\n description: string;\n subcommands?: Record<string, Subcommand>;\n groups?: Record<string, SubcommandGroup>;\n}\n\n/** Everything {@link SlashCommand} needs, pre-built by the factories. */\ninterface SlashCommandSpec {\n name: string;\n json: RESTPostAPIChatInputApplicationCommandsJSONBody;\n hasAutocomplete: boolean;\n executor: (interaction: ChatInputCommandInteraction) => Promise<void>;\n autocompleter: (interaction: AutocompleteInteraction) => Promise<void>;\n cooldown?: CooldownConfig;\n}\n\n/**\n * A registered slash command. Serialises itself for the discord REST API and\n * executes its matching interactions. Construct via {@link command} or\n * {@link commandGroup} rather than directly.\n */\nexport class SlashCommand {\n /** The top-level command name (used as the registry lookup key). */\n readonly name: string;\n /** Whether any option declares an autocomplete handler. */\n readonly hasAutocomplete: boolean;\n private readonly json: RESTPostAPIChatInputApplicationCommandsJSONBody;\n private readonly executor: (interaction: ChatInputCommandInteraction) => Promise<void>;\n private readonly autocompleter: (interaction: AutocompleteInteraction) => Promise<void>;\n /** Resolved cooldown configuration for this command, if any. */\n readonly cooldown?: CooldownConfig;\n\n /** @internal */\n constructor(spec: SlashCommandSpec) {\n this.name = spec.name;\n this.hasAutocomplete = spec.hasAutocomplete;\n this.json = spec.json;\n this.executor = spec.executor;\n this.autocompleter = spec.autocompleter;\n this.cooldown = spec.cooldown;\n }\n\n /** Serialise to the discord REST chat-input command payload. */\n toJSON(): RESTPostAPIChatInputApplicationCommandsJSONBody {\n return this.json;\n }\n\n /** Execute the command for an incoming chat-input interaction. */\n execute(interaction: ChatInputCommandInteraction): Promise<void> {\n return this.executor(interaction);\n }\n\n /** Execute autocomplete for the focused option. */\n autocomplete(interaction: AutocompleteInteraction): Promise<void> {\n return this.autocompleter(interaction);\n }\n}\n\nfunction resolveOptions(\n interaction: ChatInputCommandInteraction,\n options: OptionMap,\n): Record<string, OptionValue | undefined> {\n const resolved: Record<string, OptionValue | undefined> = {};\n for (const [name, def] of Object.entries(options)) {\n resolved[name] = readOption(interaction.options, name, def);\n }\n return resolved;\n}\n\nfunction makeAutocompleter(\n options: OptionMap,\n): (interaction: AutocompleteInteraction) => Promise<void> {\n return async (interaction) => {\n const focused = interaction.options.getFocused(true);\n const def = options[focused.name];\n if (def?.autocomplete === undefined) {\n if (!interaction.responded) await interaction.respond([]);\n return;\n }\n const ctx = new AutocompleteContext(interaction);\n const choices = await def.autocomplete(ctx);\n if (!interaction.responded) await ctx.respond(choices);\n };\n}\n\nfunction baseJSON(\n meta: CommonMeta & { name: string; description: string },\n options: RESTPostAPIChatInputApplicationCommandsJSONBody[\"options\"],\n): RESTPostAPIChatInputApplicationCommandsJSONBody {\n return {\n type: ApplicationCommandType.ChatInput,\n name: meta.name,\n description: meta.description,\n name_localizations: meta.nameLocalizations,\n description_localizations: meta.descriptionLocalizations,\n nsfw: meta.nsfw,\n default_member_permissions:\n meta.defaultMemberPermissions == null\n ? meta.defaultMemberPermissions\n : new PermissionsBitField(meta.defaultMemberPermissions).bitfield.toString(),\n contexts: meta.guildOnly ? [InteractionContextType.Guild] : undefined,\n options,\n };\n}\n\nfunction leafOptionsJSON(options: OptionMap): RESTPostAPIChatInputApplicationCommandsJSONBody[\"options\"] {\n return Object.entries(options).map(([name, def]) => toAPIOption(name, def));\n}\n\nfunction subcommandJSON(name: string, sub: Subcommand): APIApplicationCommandSubcommandOption {\n return {\n type: ApplicationCommandOptionType.Subcommand,\n name,\n description: sub.description,\n name_localizations: sub.nameLocalizations,\n description_localizations: sub.descriptionLocalizations,\n options: Object.entries(sub.options).map(([n, def]) => toAPIOption(n, def)),\n };\n}\n\nfunction routeSubcommand(\n groupName: string | null,\n subName: string | null,\n subcommands: Record<string, Subcommand> | undefined,\n groups: Record<string, SubcommandGroup> | undefined,\n): Subcommand | undefined {\n if (groupName !== null) return groups?.[groupName]?.subcommands[subName ?? \"\"];\n if (subName !== null) return subcommands?.[subName];\n return undefined;\n}\n\n/**\n * Define a slash command with type-safe options and a co-located handler.\n *\n * @example\n * ```ts\n * export default command({\n * name: \"echo\",\n * description: \"Repeat a message\",\n * options: { msg: option.string({ description: \"Text\", required: true }) },\n * run: (ctx) => ctx.reply(ctx.options.msg),\n * });\n * ```\n */\nexport function command<O extends OptionMap = Record<string, never>, R = void>(\n config: CommandConfig<O, R>,\n): SlashCommand {\n const options: OptionMap = config.options ?? {};\n const { run } = config;\n const executor = async (interaction: ChatInputCommandInteraction): Promise<void> => {\n const resolved = resolveOptions(interaction, options) as ResolvedOptions<O>;\n await run(new CommandContext<O>(interaction, resolved));\n };\n return new SlashCommand({\n name: config.name,\n json: baseJSON(config, leafOptionsJSON(options)),\n hasAutocomplete: optionsHaveAutocomplete(options),\n executor,\n autocompleter: makeAutocompleter(options),\n cooldown: config.cooldown !== undefined ? normalizeCooldown(config.cooldown) : undefined,\n });\n}\n\n/** Define a single subcommand with type-safe options and a handler. */\nexport function subcommand<O extends OptionMap = Record<string, never>, R = void>(\n config: SubcommandConfig<O, R>,\n): Subcommand {\n const options: OptionMap = config.options ?? {};\n const { run } = config;\n const execute = async (interaction: ChatInputCommandInteraction): Promise<void> => {\n const resolved = resolveOptions(interaction, options) as ResolvedOptions<O>;\n await run(new CommandContext<O>(interaction, resolved));\n };\n return {\n kind: \"subcommand\",\n description: config.description,\n options,\n nameLocalizations: config.nameLocalizations,\n descriptionLocalizations: config.descriptionLocalizations,\n hasAutocomplete: optionsHaveAutocomplete(options),\n execute,\n autocomplete: makeAutocompleter(options),\n };\n}\n\n/** Group several subcommands under a shared name. */\nexport function subcommandGroup(config: SubcommandGroupConfig): SubcommandGroup {\n return { kind: \"group\", ...config };\n}\n\n/** Define a command that routes to subcommands and/or subcommand groups. */\nexport function commandGroup(config: CommandGroupConfig): SlashCommand {\n const { subcommands, groups } = config;\n\n const options: (APIApplicationCommandSubcommandOption | APIApplicationCommandSubcommandGroupOption)[] =\n [];\n for (const [name, sub] of Object.entries(subcommands ?? {})) {\n options.push(subcommandJSON(name, sub));\n }\n for (const [name, group] of Object.entries(groups ?? {})) {\n options.push({\n type: ApplicationCommandOptionType.SubcommandGroup,\n name,\n description: group.description,\n name_localizations: group.nameLocalizations,\n description_localizations: group.descriptionLocalizations,\n options: Object.entries(group.subcommands).map(([n, s]) => subcommandJSON(n, s)),\n });\n }\n\n const hasAutocomplete =\n Object.values(subcommands ?? {}).some((s) => s.hasAutocomplete) ||\n Object.values(groups ?? {}).some((g) => Object.values(g.subcommands).some((s) => s.hasAutocomplete));\n\n const executor = async (interaction: ChatInputCommandInteraction): Promise<void> => {\n const target = routeSubcommand(\n interaction.options.getSubcommandGroup(false),\n interaction.options.getSubcommand(false),\n subcommands,\n groups,\n );\n if (target === undefined) {\n throw new Error(`spearkit: no subcommand handler for /${config.name}`);\n }\n await target.execute(interaction);\n };\n\n const autocompleter = async (interaction: AutocompleteInteraction): Promise<void> => {\n const target = routeSubcommand(\n interaction.options.getSubcommandGroup(false),\n interaction.options.getSubcommand(false),\n subcommands,\n groups,\n );\n if (target === undefined) {\n if (!interaction.responded) await interaction.respond([]);\n return;\n }\n await target.autocomplete(interaction);\n };\n\n return new SlashCommand({\n name: config.name,\n json: baseJSON(config, options),\n hasAutocomplete,\n executor,\n autocompleter,\n cooldown: config.cooldown !== undefined ? normalizeCooldown(config.cooldown) : undefined,\n });\n}\n","import {\n MessageFlags,\n REST,\n Routes,\n type AutocompleteInteraction,\n type Awaitable,\n type ChatInputCommandInteraction,\n type RESTPostAPIApplicationCommandsJSONBody,\n type RESTPutAPIApplicationCommandsResult,\n type RESTPutAPIApplicationGuildCommandsResult,\n} from \"discord.js\";\nimport type { SlashCommand } from \"./command.js\";\nimport type { Logger } from \"../logger.js\";\nimport {\n CooldownManager,\n formatCooldownMessage,\n type CooldownActor,\n type CooldownConfig,\n} from \"../cooldown.js\";\nimport type { UsageEvent } from \"../usage.js\";\n\n/** Error hook invoked when a command handler throws. */\nexport type CommandErrorHandler = (\n error: Error,\n interaction: ChatInputCommandInteraction,\n) => Awaitable<void>;\n\n/** Options for pushing commands to discord. */\nexport interface DeployOptions {\n /** Bot token. Falls back to the client token when omitted. */\n token?: string;\n /** Application (client) id. */\n applicationId: string;\n /** Deploy to a single guild (updates instantly) instead of globally. */\n guildId?: string;\n /** Reuse an existing REST instance instead of creating one. */\n rest?: REST;\n}\n\n/** Result of a {@link CommandRegistry.deploy} call. */\nexport type DeployResult =\n | RESTPutAPIApplicationCommandsResult\n | RESTPutAPIApplicationGuildCommandsResult;\n\n/** Holds every slash command and routes interactions to them. */\nexport class CommandRegistry {\n private readonly commands = new Map<string, SlashCommand>();\n private errorHandler?: CommandErrorHandler;\n private logger?: Logger;\n private cooldowns?: CooldownManager;\n private defaultCooldown?: CooldownConfig;\n private onUsage?: (event: UsageEvent) => void;\n\n /** Register one or more commands. Later registrations override by name. */\n add(...commands: SlashCommand[]): this {\n for (const command of commands) this.commands.set(command.name, command);\n return this;\n }\n\n /** Remove a command by name. */\n remove(name: string): boolean {\n return this.commands.delete(name);\n }\n\n /** Look up a command by name. */\n get(name: string): SlashCommand | undefined {\n return this.commands.get(name);\n }\n\n /** All registered commands. */\n all(): SlashCommand[] {\n return [...this.commands.values()];\n }\n\n /** All registered command names. */\n get names(): string[] {\n return [...this.commands.keys()];\n }\n\n /** Number of registered commands. */\n get size(): number {\n return this.commands.size;\n }\n\n /** Set the handler used when a command throws. */\n onError(handler: CommandErrorHandler): this {\n this.errorHandler = handler;\n return this;\n }\n\n /** Attach a logger used for dispatch tracing (debug level). */\n setLogger(logger: Logger): this {\n this.logger = logger;\n return this;\n }\n\n /** Wire a shared cooldown manager and an optional default cooldown for every command. */\n setCooldowns(manager: CooldownManager, defaultCooldown?: CooldownConfig): this {\n this.cooldowns = manager;\n this.defaultCooldown = defaultCooldown;\n return this;\n }\n\n /** Attach a hook called after each successful command execution. */\n setUsageHook(hook: (event: UsageEvent) => void): this {\n this.onUsage = hook;\n return this;\n }\n\n /** Serialise every command to discord REST payloads. */\n toJSON(): RESTPostAPIApplicationCommandsJSONBody[] {\n return this.all().map((c) => c.toJSON());\n }\n\n /** Dispatch an incoming chat-input interaction to its command. */\n async handle(interaction: ChatInputCommandInteraction): Promise<void> {\n const command = this.commands.get(interaction.commandName);\n if (command === undefined) return;\n this.logger?.debug(\"command\", {\n data: { command: interaction.commandName, user: interaction.user.id },\n });\n const cooldown = command.cooldown ?? this.defaultCooldown;\n if (cooldown !== undefined && this.cooldowns !== undefined) {\n const result = this.cooldowns.consume(command.name, cooldown, actorOf(interaction));\n if (!result.allowed) {\n await this.replyCooldown(interaction, cooldown, result.remaining);\n return;\n }\n }\n try {\n await command.execute(interaction);\n this.onUsage?.({\n type: \"command\",\n name: command.name,\n userId: interaction.user.id,\n userTag: interaction.user.tag,\n guildId: interaction.guildId,\n channelId: interaction.channelId,\n timestamp: new Date(),\n });\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n if (this.errorHandler !== undefined) {\n await this.errorHandler(err, interaction);\n } else {\n await this.defaultErrorReply(err, interaction);\n }\n }\n }\n\n /** Dispatch an autocomplete interaction to its command. */\n async handleAutocomplete(interaction: AutocompleteInteraction): Promise<void> {\n const command = this.commands.get(interaction.commandName);\n if (command === undefined) return;\n try {\n await command.autocomplete(interaction);\n } catch {\n if (!interaction.responded) await interaction.respond([]).catch(() => undefined);\n }\n }\n\n /**\n * Push the registered commands to discord. Returns the API response.\n *\n * Guild deploys apply instantly and are ideal during development; global\n * deploys can take up to an hour to propagate.\n */\n async deploy(options: DeployOptions): Promise<DeployResult> {\n let rest = options.rest;\n if (rest === undefined) {\n if (options.token === undefined) {\n throw new Error(\"spearkit: deploy() requires a token or a pre-configured REST instance\");\n }\n rest = new REST().setToken(options.token);\n }\n const body = this.toJSON();\n const route =\n options.guildId !== undefined\n ? Routes.applicationGuildCommands(options.applicationId, options.guildId)\n : Routes.applicationCommands(options.applicationId);\n return (await rest.put(route, { body })) as DeployResult;\n }\n\n private async defaultErrorReply(\n error: Error,\n interaction: ChatInputCommandInteraction,\n ): Promise<void> {\n interaction.client.emit(\"error\", error);\n const content = \"Something went wrong while running that command.\";\n try {\n if (interaction.deferred) {\n await interaction.editReply({ content });\n } else if (interaction.replied) {\n await interaction.followUp({ content, flags: MessageFlags.Ephemeral });\n } else {\n await interaction.reply({ content, flags: MessageFlags.Ephemeral });\n }\n } catch {\n // Interaction likely expired; nothing actionable left to do.\n }\n }\n\n private async replyCooldown(\n interaction: ChatInputCommandInteraction,\n config: CooldownConfig,\n remaining: number,\n ): Promise<void> {\n this.logger?.debug(\"cooldown\", {\n data: { command: interaction.commandName, user: interaction.user.id, remaining },\n });\n const content = formatCooldownMessage(config, remaining);\n try {\n if (interaction.deferred) await interaction.editReply({ content });\n else if (interaction.replied) await interaction.followUp({ content, flags: MessageFlags.Ephemeral });\n else await interaction.reply({ content, flags: MessageFlags.Ephemeral });\n } catch {\n // Interaction likely expired.\n }\n }\n}\n\nfunction actorOf(interaction: ChatInputCommandInteraction): CooldownActor {\n const member = interaction.member;\n let roleIds: readonly string[] = [];\n if (member !== null) {\n const roles = member.roles;\n roleIds = Array.isArray(roles) ? roles : [...roles.cache.keys()];\n }\n return {\n userId: interaction.user.id,\n roleIds,\n guildId: interaction.guildId,\n channelId: interaction.channelId,\n };\n}\n","import type { Awaitable, Client, ClientEvents } from \"discord.js\";\n\n/** A typed handler for a discord.js client event. */\nexport type EventHandler<E extends keyof ClientEvents> = (\n ...args: ClientEvents[E]\n) => Awaitable<void>;\n\n/** Object form accepted by {@link event}. */\nexport interface EventConfig<E extends keyof ClientEvents> {\n name: E;\n /** Run the handler at most once, then auto-detach. */\n once?: boolean;\n run: EventHandler<E>;\n}\n\n/**\n * A type-erased, ready-to-attach event listener. Built by {@link event}; the\n * concrete event type is captured in the closures so binding stays type-safe.\n */\nexport interface EventDef {\n readonly name: keyof ClientEvents;\n readonly once: boolean;\n /** Attach the listener to a client. */\n attach(client: Client): void;\n /** Remove the listener from a client it was attached to. */\n detach(client: Client): void;\n}\n\nfunction toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\n\nfunction build<E extends keyof ClientEvents>(name: E, once: boolean, run: EventHandler<E>): EventDef {\n const listeners = new WeakMap<Client, (...args: ClientEvents[E]) => void>();\n return {\n name,\n once,\n attach(client) {\n const listener = (...args: ClientEvents[E]): void => {\n try {\n const result = run(...args);\n if (result instanceof Promise) {\n result.catch((error: unknown) => client.emit(\"error\", toError(error)));\n }\n } catch (error) {\n client.emit(\"error\", toError(error));\n }\n };\n listeners.set(client, listener);\n if (once) client.once(name, listener);\n else client.on(name, listener);\n },\n detach(client) {\n const listener = listeners.get(client);\n if (listener !== undefined) {\n client.off(name, listener);\n listeners.delete(client);\n }\n },\n };\n}\n\n/**\n * Define a discord.js event listener with a fully-typed handler. Thrown errors\n * and rejected promises are routed to the client's `error` event instead of\n * crashing the process.\n *\n * @example\n * ```ts\n * export default event(\"messageCreate\", (message) => {\n * if (message.author.bot) return;\n * // message is fully typed as Message\n * });\n * ```\n */\nexport function event<E extends keyof ClientEvents>(name: E, run: EventHandler<E>): EventDef;\nexport function event<E extends keyof ClientEvents>(config: EventConfig<E>): EventDef;\nexport function event<E extends keyof ClientEvents>(\n nameOrConfig: E | EventConfig<E>,\n run?: EventHandler<E>,\n): EventDef {\n if (typeof nameOrConfig === \"object\") {\n return build(nameOrConfig.name, nameOrConfig.once ?? false, nameOrConfig.run);\n }\n if (run === undefined) {\n throw new Error(\"spearkit: event(name, run) requires a handler\");\n }\n return build(nameOrConfig, false, run);\n}\n\n/** Holds event listeners and attaches them to clients in bulk. */\nexport class EventRegistry {\n private readonly events: EventDef[] = [];\n private readonly attached = new Set<Client>();\n\n /** Register one or more event definitions. */\n add(...defs: EventDef[]): this {\n this.events.push(...defs);\n for (const client of this.attached) {\n for (const def of defs) def.attach(client);\n }\n return this;\n }\n\n /** Number of registered listeners. */\n get size(): number {\n return this.events.length;\n }\n\n /** Attach every registered listener to the client. */\n attachAll(client: Client): void {\n this.attached.add(client);\n for (const def of this.events) def.attach(client);\n }\n\n /** Detach every registered listener from the client. */\n detachAll(client: Client): void {\n this.attached.delete(client);\n for (const def of this.events) def.detach(client);\n }\n}\n","/**\n * Typed custom-id codec.\n *\n * Patterns follow the grammar `namespace(:{param})*`, e.g. `\"vote\"` or\n * `\"vote:{choice}\"` or `\"page:{id}:{dir}\"`. The `namespace` is the routing key;\n * each `{param}` becomes a positional, percent-escaped value in the encoded id.\n * Param names are recovered at the type level so handlers get a typed `params`\n * object and `build()` requires exactly the right params.\n */\n\n/** Names of the `{param}` placeholders inside a pattern. */\nexport type ParamNames<S extends string> = S extends `${string}{${infer Name}}${infer Rest}`\n ? Name | ParamNames<Rest>\n : never;\n\n/** The params object a pattern resolves to (every value is a string). */\nexport type Params<S extends string> = { [K in ParamNames<S>]: string };\n\n/** Arguments `build()` accepts: none when the pattern has no params. */\nexport type BuildArgs<S extends string> = [ParamNames<S>] extends [never]\n ? []\n : [params: Params<S>];\n\n/** The discord custom-id length limit. */\nexport const MAX_CUSTOM_ID_LENGTH = 100;\n\nconst PARAM_SEGMENT = /^\\{([A-Za-z0-9_]+)\\}$/;\n\n/** A compiled pattern: its routing namespace and ordered param names. */\nexport interface CompiledPattern {\n readonly pattern: string;\n readonly namespace: string;\n readonly paramNames: readonly string[];\n}\n\n/** Compile and validate a custom-id pattern. Throws on malformed input. */\nexport function compilePattern(pattern: string): CompiledPattern {\n const segments = pattern.split(\":\");\n const namespace = segments[0] ?? \"\";\n if (namespace.length === 0 || /[{}]/.test(namespace)) {\n throw new Error(\n `spearkit: invalid custom-id pattern \"${pattern}\". Expected \"namespace\" or \"namespace:{param}\".`,\n );\n }\n const paramNames: string[] = [];\n for (let i = 1; i < segments.length; i++) {\n const match = PARAM_SEGMENT.exec(segments[i] ?? \"\");\n if (match === null) {\n throw new Error(\n `spearkit: invalid custom-id pattern \"${pattern}\". Segment \"${segments[i]}\" must be \"{param}\".`,\n );\n }\n paramNames.push(match[1] as string);\n }\n return { pattern, namespace, paramNames };\n}\n\nfunction encodeValue(value: string): string {\n return value.replace(/%/g, \"%25\").replace(/:/g, \"%3A\");\n}\n\nfunction decodeValue(value: string): string {\n return value.replace(/%3A/g, \":\").replace(/%25/g, \"%\");\n}\n\n/** Build a concrete custom-id from a compiled pattern and its params. */\nexport function buildCustomId(\n compiled: CompiledPattern,\n params: Readonly<Record<string, string>>,\n): string {\n const parts = [compiled.namespace];\n for (const name of compiled.paramNames) {\n const value = params[name];\n if (value === undefined) {\n throw new Error(`spearkit: missing param \"${name}\" for custom-id \"${compiled.pattern}\"`);\n }\n parts.push(encodeValue(value));\n }\n const id = parts.join(\":\");\n if (id.length > MAX_CUSTOM_ID_LENGTH) {\n throw new Error(\n `spearkit: custom-id \"${id}\" exceeds the ${MAX_CUSTOM_ID_LENGTH}-character discord limit`,\n );\n }\n return id;\n}\n\n/** The namespace + raw values parsed out of an incoming custom-id. */\nexport interface ParsedCustomId {\n readonly namespace: string;\n readonly values: readonly string[];\n}\n\n/** Parse an incoming custom-id into its namespace and decoded values. */\nexport function parseCustomId(customId: string): ParsedCustomId {\n const segments = customId.split(\":\");\n const namespace = segments[0] ?? \"\";\n const values = segments.slice(1).map(decodeValue);\n return { namespace, values };\n}\n\n/** Map ordered values onto their param names. */\nexport function paramsFromValues(\n paramNames: readonly string[],\n values: readonly string[],\n): Record<string, string> {\n const params: Record<string, string> = {};\n for (let i = 0; i < paramNames.length; i++) {\n params[paramNames[i] as string] = values[i] ?? \"\";\n }\n return params;\n}\n","import type {\n APIModalInteractionResponseCallbackData,\n ButtonInteraction,\n ChannelSelectMenuInteraction,\n InteractionUpdateOptions,\n JSONEncodable,\n MentionableSelectMenuInteraction,\n ModalBuilder,\n ModalComponentData,\n ModalSubmitInteraction,\n RoleSelectMenuInteraction,\n StringSelectMenuInteraction,\n UserSelectMenuInteraction,\n} from \"discord.js\";\nimport { BaseContext } from \"../context.js\";\n\ntype UpdateInput = string | InteractionUpdateOptions;\n/** The concrete message-component interaction types (button + every select). */\nexport type AnyComponentInteraction =\n | ButtonInteraction\n | StringSelectMenuInteraction\n | UserSelectMenuInteraction\n | RoleSelectMenuInteraction\n | ChannelSelectMenuInteraction\n | MentionableSelectMenuInteraction;\n\n/**\n * Base context for message-component interactions (buttons and selects).\n * Adds the component-only `update`/`deferUpdate`/`showModal` helpers and the\n * routed, typed {@link params}.\n */\nexport class MessageComponentContext<\n P,\n I extends AnyComponentInteraction = AnyComponentInteraction,\n> extends BaseContext<I> {\n constructor(\n interaction: I,\n /** Params extracted from the custom-id pattern. */\n readonly params: P,\n ) {\n super(interaction);\n }\n\n /** The raw custom-id that triggered this interaction. */\n get customId(): string {\n return this.interaction.customId;\n }\n\n /** The message the component lives on. */\n get message() {\n return this.interaction.message;\n }\n\n /** Edit the message this component belongs to. */\n async update(input: UpdateInput): Promise<void> {\n await this.interaction.update(input);\n }\n\n /** Acknowledge the interaction without editing the message yet. */\n async deferUpdate(): Promise<void> {\n await this.interaction.deferUpdate();\n }\n\n /** Open a modal in response to this component. */\n async showModal(\n modal: JSONEncodable<APIModalInteractionResponseCallbackData> | ModalComponentData | ModalBuilder,\n ): Promise<void> {\n await this.interaction.showModal(modal);\n }\n}\n\n/** Context for a button click. */\nexport class ButtonContext<P = Record<string, never>> extends MessageComponentContext<\n P,\n ButtonInteraction\n> {}\n\n/** Context for a string select; exposes the chosen {@link values}. */\nexport class StringSelectContext<P = Record<string, never>> extends MessageComponentContext<\n P,\n StringSelectMenuInteraction\n> {\n /** All selected values. */\n get values(): string[] {\n return this.interaction.values;\n }\n /** The first selected value, or `undefined` if none. */\n get value(): string | undefined {\n return this.interaction.values[0];\n }\n}\n\n/** Context for a user select; exposes selected ids, users and members. */\nexport class UserSelectContext<P = Record<string, never>> extends MessageComponentContext<\n P,\n UserSelectMenuInteraction\n> {\n get values(): string[] {\n return this.interaction.values;\n }\n get users() {\n return this.interaction.users;\n }\n get members() {\n return this.interaction.members;\n }\n}\n\n/** Context for a role select. */\nexport class RoleSelectContext<P = Record<string, never>> extends MessageComponentContext<\n P,\n RoleSelectMenuInteraction\n> {\n get values(): string[] {\n return this.interaction.values;\n }\n get roles() {\n return this.interaction.roles;\n }\n}\n\n/** Context for a channel select. */\nexport class ChannelSelectContext<P = Record<string, never>> extends MessageComponentContext<\n P,\n ChannelSelectMenuInteraction\n> {\n get values(): string[] {\n return this.interaction.values;\n }\n get channels() {\n return this.interaction.channels;\n }\n}\n\n/** Context for a mentionable (user + role) select. */\nexport class MentionableSelectContext<P = Record<string, never>> extends MessageComponentContext<\n P,\n MentionableSelectMenuInteraction\n> {\n get values(): string[] {\n return this.interaction.values;\n }\n get users() {\n return this.interaction.users;\n }\n get roles() {\n return this.interaction.roles;\n }\n get members() {\n return this.interaction.members;\n }\n}\n\n/**\n * Context for a submitted modal. Exposes the routed {@link params} plus the\n * resolved text-input {@link fields}, keyed by the field names you declared.\n */\nexport class ModalContext<P, F extends string = string> extends BaseContext<ModalSubmitInteraction> {\n constructor(\n interaction: ModalSubmitInteraction,\n readonly params: P,\n /** Submitted values, keyed by the field names from your modal definition. */\n readonly fields: Record<F, string>,\n ) {\n super(interaction);\n }\n\n /** The raw custom-id that triggered this modal submission. */\n get customId(): string {\n return this.interaction.customId;\n }\n}\n","import type {\n ButtonInteraction,\n ChannelSelectMenuInteraction,\n Interaction,\n MentionableSelectMenuInteraction,\n ModalSubmitInteraction,\n RepliableInteraction,\n RoleSelectMenuInteraction,\n StringSelectMenuInteraction,\n UserSelectMenuInteraction,\n Awaitable,\n} from \"discord.js\";\nimport { MessageFlags } from \"discord.js\";\nimport { parseCustomId, paramsFromValues } from \"./customId.js\";\nimport type { Logger } from \"../logger.js\";\nimport type { UsageEvent } from \"../usage.js\";\n\n/** Shared shape of every routed component. */\ninterface RouteBase {\n readonly namespace: string;\n readonly paramNames: readonly string[];\n}\n\n/** Routing entry for a button. */\nexport interface ButtonRoute extends RouteBase {\n readonly kind: \"button\";\n handle(interaction: ButtonInteraction, params: Record<string, string>): Promise<void>;\n}\n/** Routing entry for a string select. */\nexport interface StringSelectRoute extends RouteBase {\n readonly kind: \"stringSelect\";\n handle(interaction: StringSelectMenuInteraction, params: Record<string, string>): Promise<void>;\n}\n/** Routing entry for a user select. */\nexport interface UserSelectRoute extends RouteBase {\n readonly kind: \"userSelect\";\n handle(interaction: UserSelectMenuInteraction, params: Record<string, string>): Promise<void>;\n}\n/** Routing entry for a role select. */\nexport interface RoleSelectRoute extends RouteBase {\n readonly kind: \"roleSelect\";\n handle(interaction: RoleSelectMenuInteraction, params: Record<string, string>): Promise<void>;\n}\n/** Routing entry for a channel select. */\nexport interface ChannelSelectRoute extends RouteBase {\n readonly kind: \"channelSelect\";\n handle(interaction: ChannelSelectMenuInteraction, params: Record<string, string>): Promise<void>;\n}\n/** Routing entry for a mentionable select. */\nexport interface MentionableSelectRoute extends RouteBase {\n readonly kind: \"mentionableSelect\";\n handle(\n interaction: MentionableSelectMenuInteraction,\n params: Record<string, string>,\n ): Promise<void>;\n}\n/** Routing entry for a modal submission. */\nexport interface ModalRoute extends RouteBase {\n readonly kind: \"modal\";\n handle(interaction: ModalSubmitInteraction, params: Record<string, string>): Promise<void>;\n}\n\n/** Any registrable component routing entry. */\nexport type ComponentDef =\n | ButtonRoute\n | StringSelectRoute\n | UserSelectRoute\n | RoleSelectRoute\n | ChannelSelectRoute\n | MentionableSelectRoute\n | ModalRoute;\n\n/** Error hook invoked when a component handler throws. */\nexport type ComponentErrorHandler = (\n error: Error,\n interaction: RepliableInteraction,\n) => Awaitable<void>;\n\nfunction toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\n\n/**\n * Routes button, select and modal interactions to the handlers registered for\n * their custom-id namespace. Decodes the custom-id, extracts typed params, and\n * invokes the matching handler.\n */\nexport class ComponentRegistry {\n private readonly buttons = new Map<string, ButtonRoute>();\n private readonly stringSelects = new Map<string, StringSelectRoute>();\n private readonly userSelects = new Map<string, UserSelectRoute>();\n private readonly roleSelects = new Map<string, RoleSelectRoute>();\n private readonly channelSelects = new Map<string, ChannelSelectRoute>();\n private readonly mentionableSelects = new Map<string, MentionableSelectRoute>();\n private readonly modals = new Map<string, ModalRoute>();\n private errorHandler?: ComponentErrorHandler;\n private logger?: Logger;\n private onUsage?: (event: UsageEvent) => void;\n\n /** Register one or more components. Later registrations override by namespace. */\n add(...defs: ComponentDef[]): this {\n for (const def of defs) {\n switch (def.kind) {\n case \"button\":\n this.buttons.set(def.namespace, def);\n break;\n case \"stringSelect\":\n this.stringSelects.set(def.namespace, def);\n break;\n case \"userSelect\":\n this.userSelects.set(def.namespace, def);\n break;\n case \"roleSelect\":\n this.roleSelects.set(def.namespace, def);\n break;\n case \"channelSelect\":\n this.channelSelects.set(def.namespace, def);\n break;\n case \"mentionableSelect\":\n this.mentionableSelects.set(def.namespace, def);\n break;\n case \"modal\":\n this.modals.set(def.namespace, def);\n break;\n }\n }\n return this;\n }\n\n /** Set the handler used when a component throws. */\n onError(handler: ComponentErrorHandler): this {\n this.errorHandler = handler;\n return this;\n }\n\n /** Attach a logger used for dispatch tracing (debug level). */\n setLogger(logger: Logger): this {\n this.logger = logger;\n return this;\n }\n\n /** Attach a hook called after each successful component handler run. */\n setUsageHook(hook: (event: UsageEvent) => void): this {\n this.onUsage = hook;\n return this;\n }\n\n /** Total number of registered components. */\n get size(): number {\n return (\n this.buttons.size +\n this.stringSelects.size +\n this.userSelects.size +\n this.roleSelects.size +\n this.channelSelects.size +\n this.mentionableSelects.size +\n this.modals.size\n );\n }\n\n /**\n * Dispatch an interaction to its component handler. Returns `true` if a\n * handler matched and ran, `false` otherwise.\n */\n async handle(interaction: Interaction): Promise<boolean> {\n if (interaction.isButton()) {\n return this.exec(this.buttons.get(namespaceOf(interaction.customId)), interaction);\n }\n if (interaction.isStringSelectMenu()) {\n return this.exec(this.stringSelects.get(namespaceOf(interaction.customId)), interaction);\n }\n if (interaction.isUserSelectMenu()) {\n return this.exec(this.userSelects.get(namespaceOf(interaction.customId)), interaction);\n }\n if (interaction.isRoleSelectMenu()) {\n return this.exec(this.roleSelects.get(namespaceOf(interaction.customId)), interaction);\n }\n if (interaction.isChannelSelectMenu()) {\n return this.exec(this.channelSelects.get(namespaceOf(interaction.customId)), interaction);\n }\n if (interaction.isMentionableSelectMenu()) {\n return this.exec(this.mentionableSelects.get(namespaceOf(interaction.customId)), interaction);\n }\n if (interaction.isModalSubmit()) {\n return this.exec(this.modals.get(namespaceOf(interaction.customId)), interaction);\n }\n return false;\n }\n\n private async exec<I extends RepliableInteraction & { customId: string }>(\n route: (RouteBase & { handle(interaction: I, params: Record<string, string>): Promise<void> }) | undefined,\n interaction: I,\n ): Promise<boolean> {\n if (route === undefined) return false;\n this.logger?.debug(\"component\", { data: { customId: interaction.customId } });\n const { values } = parseCustomId(interaction.customId);\n const params = paramsFromValues(route.paramNames, values);\n try {\n await route.handle(interaction, params);\n this.onUsage?.({\n type: \"component\",\n name: route.namespace,\n userId: interaction.user.id,\n userTag: interaction.user.tag,\n guildId: interaction.guildId,\n channelId: interaction.channelId,\n timestamp: new Date(),\n });\n } catch (error) {\n const err = toError(error);\n if (this.errorHandler !== undefined) {\n await this.errorHandler(err, interaction);\n } else {\n interaction.client.emit(\"error\", err);\n if (!interaction.replied && !interaction.deferred) {\n await interaction\n .reply({ content: \"Something went wrong.\", flags: MessageFlags.Ephemeral })\n .catch(() => undefined);\n }\n }\n }\n return true;\n }\n}\n\nfunction namespaceOf(customId: string): string {\n return parseCustomId(customId).namespace;\n}\n","import {\n ActionRowBuilder,\n ButtonBuilder,\n ButtonStyle,\n ChannelSelectMenuBuilder,\n MentionableSelectMenuBuilder,\n ModalBuilder,\n RoleSelectMenuBuilder,\n StringSelectMenuBuilder,\n TextInputBuilder,\n TextInputStyle,\n UserSelectMenuBuilder,\n type Awaitable,\n type ChannelType,\n type ComponentEmojiResolvable,\n type SelectMenuComponentOptionData,\n} from \"discord.js\";\nimport {\n ButtonContext,\n ChannelSelectContext,\n MentionableSelectContext,\n ModalContext,\n RoleSelectContext,\n StringSelectContext,\n UserSelectContext,\n} from \"./context.js\";\nimport {\n buildCustomId,\n compilePattern,\n type BuildArgs,\n type Params,\n} from \"./customId.js\";\nimport type {\n ButtonRoute,\n ChannelSelectRoute,\n MentionableSelectRoute,\n ModalRoute,\n RoleSelectRoute,\n StringSelectRoute,\n UserSelectRoute,\n} from \"./registry.js\";\n\n// --- buttons ---------------------------------------------------------------\n\n/** Accepted button styles for an interactive (custom-id) button. */\nexport type ButtonStyleInput =\n | \"Primary\"\n | \"Secondary\"\n | \"Success\"\n | \"Danger\"\n | ButtonStyle.Primary\n | ButtonStyle.Secondary\n | ButtonStyle.Success\n | ButtonStyle.Danger;\n\nfunction resolveButtonStyle(input: ButtonStyleInput | undefined): ButtonStyle {\n if (input === undefined) return ButtonStyle.Secondary;\n return typeof input === \"number\" ? input : ButtonStyle[input];\n}\n\n/** Config for an interactive button created with {@link button}. */\nexport interface ButtonConfig<P extends string, R> {\n /** Custom-id pattern, e.g. `\"vote\"` or `\"vote:{choice}\"`. */\n id: P;\n label?: string;\n style?: ButtonStyleInput;\n emoji?: ComponentEmojiResolvable;\n disabled?: boolean;\n run: (ctx: ButtonContext<Params<P>>) => Awaitable<R>;\n}\n\n/** A registrable button with a typed {@link build}. */\nexport interface Button<P extends string> extends ButtonRoute {\n build(...args: BuildArgs<P>): ButtonBuilder;\n}\n\n/**\n * Define an interactive button: its appearance, its custom-id pattern and its\n * click handler, all in one place. Register it with `client.components.add`.\n *\n * @example\n * ```ts\n * const vote = button({\n * id: \"vote:{choice}\",\n * label: \"Yes\",\n * style: \"Success\",\n * run: (ctx) => ctx.reply(`You chose ${ctx.params.choice}`),\n * });\n * row(vote.build({ choice: \"yes\" }));\n * ```\n */\nexport function button<const P extends string, R = void>(config: ButtonConfig<P, R>): Button<P> {\n const compiled = compilePattern(config.id);\n const style = resolveButtonStyle(config.style);\n return {\n kind: \"button\",\n namespace: compiled.namespace,\n paramNames: compiled.paramNames,\n async handle(interaction, params) {\n await config.run(new ButtonContext(interaction, params as Params<P>));\n },\n build(...args: BuildArgs<P>): ButtonBuilder {\n const params = (args[0] ?? {}) as Record<string, string>;\n const builder = new ButtonBuilder()\n .setCustomId(buildCustomId(compiled, params))\n .setStyle(style);\n if (config.label !== undefined) builder.setLabel(config.label);\n if (config.emoji !== undefined) builder.setEmoji(config.emoji);\n if (config.disabled !== undefined) builder.setDisabled(config.disabled);\n return builder;\n },\n };\n}\n\n/** Config for a link button (no handler — just opens a URL). */\nexport interface LinkButtonConfig {\n url: string;\n label?: string;\n emoji?: ComponentEmojiResolvable;\n disabled?: boolean;\n}\n\n/** Build a link button. Link buttons have no custom-id and run no handler. */\nexport function linkButton(config: LinkButtonConfig): ButtonBuilder {\n const builder = new ButtonBuilder().setStyle(ButtonStyle.Link).setURL(config.url);\n if (config.label !== undefined) builder.setLabel(config.label);\n if (config.emoji !== undefined) builder.setEmoji(config.emoji);\n if (config.disabled !== undefined) builder.setDisabled(config.disabled);\n return builder;\n}\n\n// --- selects ---------------------------------------------------------------\n\ninterface SelectConfigBase {\n placeholder?: string;\n minValues?: number;\n maxValues?: number;\n disabled?: boolean;\n}\n\n/** Any of the select-menu builders that share the base configuration setters. */\ntype AnySelectBuilder =\n | StringSelectMenuBuilder\n | UserSelectMenuBuilder\n | RoleSelectMenuBuilder\n | ChannelSelectMenuBuilder\n | MentionableSelectMenuBuilder;\nfunction applySelectBase(builder: AnySelectBuilder, config: SelectConfigBase): void {\n if (config.placeholder !== undefined) builder.setPlaceholder(config.placeholder);\n if (config.minValues !== undefined) builder.setMinValues(config.minValues);\n if (config.maxValues !== undefined) builder.setMaxValues(config.maxValues);\n if (config.disabled !== undefined) builder.setDisabled(config.disabled);\n}\n\n/** Config for a string select created with {@link stringSelect}. */\nexport interface StringSelectConfig<P extends string, R> extends SelectConfigBase {\n id: P;\n options: readonly SelectMenuComponentOptionData[];\n run: (ctx: StringSelectContext<Params<P>>) => Awaitable<R>;\n}\n\n/** A registrable string select with a typed {@link build}. */\nexport interface StringSelect<P extends string> extends StringSelectRoute {\n build(...args: BuildArgs<P>): StringSelectMenuBuilder;\n}\n\n/** Define a string select menu, its custom-id pattern and its handler. */\nexport function stringSelect<const P extends string, R = void>(\n config: StringSelectConfig<P, R>,\n): StringSelect<P> {\n const compiled = compilePattern(config.id);\n return {\n kind: \"stringSelect\",\n namespace: compiled.namespace,\n paramNames: compiled.paramNames,\n async handle(interaction, params) {\n await config.run(new StringSelectContext(interaction, params as Params<P>));\n },\n build(...args: BuildArgs<P>): StringSelectMenuBuilder {\n const params = (args[0] ?? {}) as Record<string, string>;\n const builder = new StringSelectMenuBuilder()\n .setCustomId(buildCustomId(compiled, params))\n .addOptions(...config.options);\n applySelectBase(builder, config);\n return builder;\n },\n };\n}\n\n/** Config shared by the entity-select builders (user/role/channel/mentionable). */\nexport interface EntitySelectConfig<P extends string> extends SelectConfigBase {\n id: P;\n}\n\n/** A registrable user select. */\nexport interface UserSelect<P extends string> extends UserSelectRoute {\n build(...args: BuildArgs<P>): UserSelectMenuBuilder;\n}\n\n/** Define a user select menu. */\nexport function userSelect<const P extends string, R = void>(\n config: EntitySelectConfig<P> & { run: (ctx: UserSelectContext<Params<P>>) => Awaitable<R> },\n): UserSelect<P> {\n const compiled = compilePattern(config.id);\n return {\n kind: \"userSelect\",\n namespace: compiled.namespace,\n paramNames: compiled.paramNames,\n async handle(interaction, params) {\n await config.run(new UserSelectContext(interaction, params as Params<P>));\n },\n build(...args: BuildArgs<P>): UserSelectMenuBuilder {\n const params = (args[0] ?? {}) as Record<string, string>;\n const builder = new UserSelectMenuBuilder().setCustomId(buildCustomId(compiled, params));\n applySelectBase(builder, config);\n return builder;\n },\n };\n}\n\n/** A registrable role select. */\nexport interface RoleSelect<P extends string> extends RoleSelectRoute {\n build(...args: BuildArgs<P>): RoleSelectMenuBuilder;\n}\n\n/** Define a role select menu. */\nexport function roleSelect<const P extends string, R = void>(\n config: EntitySelectConfig<P> & { run: (ctx: RoleSelectContext<Params<P>>) => Awaitable<R> },\n): RoleSelect<P> {\n const compiled = compilePattern(config.id);\n return {\n kind: \"roleSelect\",\n namespace: compiled.namespace,\n paramNames: compiled.paramNames,\n async handle(interaction, params) {\n await config.run(new RoleSelectContext(interaction, params as Params<P>));\n },\n build(...args: BuildArgs<P>): RoleSelectMenuBuilder {\n const params = (args[0] ?? {}) as Record<string, string>;\n const builder = new RoleSelectMenuBuilder().setCustomId(buildCustomId(compiled, params));\n applySelectBase(builder, config);\n return builder;\n },\n };\n}\n\n/** A registrable channel select. */\nexport interface ChannelSelect<P extends string> extends ChannelSelectRoute {\n build(...args: BuildArgs<P>): ChannelSelectMenuBuilder;\n}\n\n/** Define a channel select menu, optionally restricted to channel types. */\nexport function channelSelect<const P extends string, R = void>(\n config: EntitySelectConfig<P> & {\n channelTypes?: readonly ChannelType[];\n run: (ctx: ChannelSelectContext<Params<P>>) => Awaitable<R>;\n },\n): ChannelSelect<P> {\n const compiled = compilePattern(config.id);\n return {\n kind: \"channelSelect\",\n namespace: compiled.namespace,\n paramNames: compiled.paramNames,\n async handle(interaction, params) {\n await config.run(new ChannelSelectContext(interaction, params as Params<P>));\n },\n build(...args: BuildArgs<P>): ChannelSelectMenuBuilder {\n const params = (args[0] ?? {}) as Record<string, string>;\n const builder = new ChannelSelectMenuBuilder().setCustomId(buildCustomId(compiled, params));\n if (config.channelTypes !== undefined) builder.setChannelTypes(...config.channelTypes);\n applySelectBase(builder, config);\n return builder;\n },\n };\n}\n\n/** A registrable mentionable select. */\nexport interface MentionableSelect<P extends string> extends MentionableSelectRoute {\n build(...args: BuildArgs<P>): MentionableSelectMenuBuilder;\n}\n\n/** Define a mentionable (user + role) select menu. */\nexport function mentionableSelect<const P extends string, R = void>(\n config: EntitySelectConfig<P> & {\n run: (ctx: MentionableSelectContext<Params<P>>) => Awaitable<R>;\n },\n): MentionableSelect<P> {\n const compiled = compilePattern(config.id);\n return {\n kind: \"mentionableSelect\",\n namespace: compiled.namespace,\n paramNames: compiled.paramNames,\n async handle(interaction, params) {\n await config.run(new MentionableSelectContext(interaction, params as Params<P>));\n },\n build(...args: BuildArgs<P>): MentionableSelectMenuBuilder {\n const params = (args[0] ?? {}) as Record<string, string>;\n const builder = new MentionableSelectMenuBuilder().setCustomId(buildCustomId(compiled, params));\n applySelectBase(builder, config);\n return builder;\n },\n };\n}\n\n// --- modals ----------------------------------------------------------------\n\n/** Accepted text-input styles. */\nexport type TextInputStyleInput = \"Short\" | \"Paragraph\" | TextInputStyle;\n\nfunction resolveTextInputStyle(input: TextInputStyleInput | undefined): TextInputStyle {\n if (input === undefined) return TextInputStyle.Short;\n return typeof input === \"number\" ? input : TextInputStyle[input];\n}\n\n/** A resolved text-input field definition. */\nexport interface TextInputDef {\n readonly label: string;\n readonly style: TextInputStyle;\n readonly placeholder?: string;\n readonly required?: boolean;\n readonly minLength?: number;\n readonly maxLength?: number;\n readonly value?: string;\n}\n\n/** Define a single modal text-input field. */\nexport function textInput(config: {\n label: string;\n style?: TextInputStyleInput;\n placeholder?: string;\n required?: boolean;\n minLength?: number;\n maxLength?: number;\n value?: string;\n}): TextInputDef {\n return {\n label: config.label,\n style: resolveTextInputStyle(config.style),\n placeholder: config.placeholder,\n required: config.required,\n minLength: config.minLength,\n maxLength: config.maxLength,\n value: config.value,\n };\n}\n\n/** Config for a modal created with {@link modal}. */\nexport interface ModalConfig<P extends string, F extends Record<string, TextInputDef>, R> {\n id: P;\n title: string;\n fields: F;\n run: (ctx: ModalContext<Params<P>, keyof F & string>) => Awaitable<R>;\n}\n\n/** A registrable modal with a typed {@link build}. */\nexport interface Modal<P extends string> extends ModalRoute {\n build(...args: BuildArgs<P>): ModalBuilder;\n}\n\nfunction buildTextInput(customId: string, def: TextInputDef): TextInputBuilder {\n const input = new TextInputBuilder()\n .setCustomId(customId)\n .setLabel(def.label)\n .setStyle(def.style);\n if (def.placeholder !== undefined) input.setPlaceholder(def.placeholder);\n if (def.required !== undefined) input.setRequired(def.required);\n if (def.minLength !== undefined) input.setMinLength(def.minLength);\n if (def.maxLength !== undefined) input.setMaxLength(def.maxLength);\n if (def.value !== undefined) input.setValue(def.value);\n return input;\n}\n\n/**\n * Define a modal: its title, its custom-id pattern, its text-input fields and\n * a submit handler. The handler receives the submitted values keyed by field\n * name in `ctx.fields`.\n *\n * @example\n * ```ts\n * const feedback = modal({\n * id: \"feedback:{ticket}\",\n * title: \"Feedback\",\n * fields: { comment: textInput({ label: \"Comment\", style: \"Paragraph\" }) },\n * run: (ctx) => ctx.reply(`Thanks! (${ctx.params.ticket}): ${ctx.fields.comment}`),\n * });\n * ```\n */\nexport function modal<const P extends string, F extends Record<string, TextInputDef>, R = void>(\n config: ModalConfig<P, F, R>,\n): Modal<P> {\n const compiled = compilePattern(config.id);\n const fieldKeys = Object.keys(config.fields);\n return {\n kind: \"modal\",\n namespace: compiled.namespace,\n paramNames: compiled.paramNames,\n async handle(interaction, params) {\n const fields: Record<string, string> = {};\n for (const key of fieldKeys) {\n try {\n fields[key] = interaction.fields.getTextInputValue(key);\n } catch {\n fields[key] = \"\";\n }\n }\n await config.run(\n new ModalContext(interaction, params as Params<P>, fields as Record<keyof F & string, string>),\n );\n },\n build(...args: BuildArgs<P>): ModalBuilder {\n const params = (args[0] ?? {}) as Record<string, string>;\n const builder = new ModalBuilder()\n .setCustomId(buildCustomId(compiled, params))\n .setTitle(config.title);\n for (const [key, def] of Object.entries(config.fields)) {\n builder.addComponents(\n new ActionRowBuilder<TextInputBuilder>().addComponents(buildTextInput(key, def)),\n );\n }\n return builder;\n },\n };\n}\n","import { ActionRowBuilder, type MessageActionRowComponentBuilder } from \"discord.js\";\n\n/**\n * Wrap one or more component builders in an action row.\n *\n * A row holds up to five buttons, or exactly one select menu.\n *\n * @example\n * ```ts\n * const components = [row(yes.build(), no.build())];\n * await channel.send({ content: \"Vote:\", components });\n * ```\n */\nexport function row<C extends MessageActionRowComponentBuilder>(\n ...components: C[]\n): ActionRowBuilder<C> {\n return new ActionRowBuilder<C>().addComponents(...components);\n}\n","import { readdir } from \"node:fs/promises\";\nimport { extname, join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { SlashCommand } from \"./commands/command.js\";\nimport type { Registerable, SpearClient } from \"./client.js\";\n\n/** Options for the directory loader. */\nexport interface LoadOptions {\n /** File extensions to import. Default: `.js`, `.mjs`, `.cjs`. */\n extensions?: readonly string[];\n /** Recurse into subdirectories. Default: `true`. */\n recursive?: boolean;\n}\n\nconst DEFAULT_EXTENSIONS = [\".js\", \".mjs\", \".cjs\"] as const;\n\n/** Structural guard: is this exported value something spearkit can register? */\nfunction isRegisterable(value: unknown): value is Registerable {\n if (value instanceof SlashCommand) return true;\n if (typeof value !== \"object\" || value === null) return false;\n const record = value as Record<string, unknown>;\n if (typeof record[\"attach\"] === \"function\" && typeof record[\"detach\"] === \"function\") {\n return true;\n }\n if (typeof record[\"kind\"] === \"string\" && typeof record[\"handle\"] === \"function\") {\n return true;\n }\n if (\n (record[\"kind\"] === \"task\" || record[\"kind\"] === \"prefixCommand\") &&\n typeof record[\"run\"] === \"function\"\n ) {\n return true;\n }\n return false;\n}\n\n/**\n * Recursively import a directory and collect every spearkit-registrable export\n * (commands, events, components) found in default or named exports.\n */\nexport async function collectModules(\n dir: string,\n options: LoadOptions = {},\n): Promise<Registerable[]> {\n const extensions = options.extensions ?? DEFAULT_EXTENSIONS;\n const recursive = options.recursive ?? true;\n const found: Registerable[] = [];\n\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (recursive) found.push(...(await collectModules(fullPath, options)));\n continue;\n }\n if (!extensions.includes(extname(entry.name))) continue;\n\n const mod: Record<string, unknown> = await import(pathToFileURL(fullPath).href);\n for (const value of Object.values(mod)) {\n if (isRegisterable(value)) found.push(value);\n }\n }\n return found;\n}\n\n/**\n * Load a directory and register everything it exports into the client.\n * Returns the number of items registered.\n */\nexport async function loadInto(\n client: SpearClient,\n dir: string,\n options?: LoadOptions,\n): Promise<number> {\n const items = await collectModules(dir, options);\n client.register(...items);\n return items.length;\n}\n","import {\n Client,\n GatewayIntentBits,\n type ClientOptions,\n type Interaction,\n} from \"discord.js\";\nimport { SlashCommand } from \"./commands/command.js\";\nimport { CommandRegistry, type DeployResult } from \"./commands/registry.js\";\nimport { EventRegistry, type EventDef } from \"./events.js\";\nimport { ComponentRegistry, type ComponentDef } from \"./components/registry.js\";\nimport type { SpearPlugin } from \"./plugin.js\";\nimport { loadInto, type LoadOptions } from \"./loader.js\";\nimport { Logger, type LoggerOptions, toError } from \"./logger.js\";\nimport { loadEnv, type LoadEnvOptions } from \"./env.js\";\nimport { CooldownManager, normalizeCooldown, type CooldownInput } from \"./cooldown.js\";\nimport { TaskScheduler, task, type ScheduledTask, type TaskConfig } from \"./scheduler.js\";\nimport { PrefixRegistry, type PrefixCommand, type PrefixOptions } from \"./prefix.js\";\nimport { UsageTracker, type UsageEvent, type UsageOptions } from \"./usage.js\";\n\n/** Anything that can be handed to {@link SpearClient.register}. */\nexport type Registerable = SlashCommand | EventDef | ComponentDef | ScheduledTask | PrefixCommand;\n\nconst allIntents = Object.values(GatewayIntentBits).filter(\n (value): value is GatewayIntentBits => typeof value === \"number\",\n);\n\n/**\n * Ready-made intent presets. Pass one to {@link SpearClient} as `intents`.\n * `all` includes privileged intents — enable them in the developer portal.\n */\nexport const Intents = {\n /** No intents. */\n none: [] as GatewayIntentBits[],\n /** Just `Guilds` — enough for slash commands and interactions. */\n default: [GatewayIntentBits.Guilds],\n /** Guild + member gateway data. */\n guilds: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers],\n /** Read message content (privileged) alongside guild messages. */\n messages: [\n GatewayIntentBits.Guilds,\n GatewayIntentBits.GuildMessages,\n GatewayIntentBits.MessageContent,\n ],\n /** Every intent, including privileged ones. */\n all: allIntents,\n} as const;\n\n/** spearkit-specific client options layered on top of discord.js {@link ClientOptions}. */\nexport interface SpearOptions {\n /** A {@link Logger} instance, or options to build one. Exposed as `client.logger`. */\n logger?: Logger | LoggerOptions;\n /**\n * Auto-load a `.env` file into `process.env` on {@link SpearClient.start}.\n * `true` (default) loads `.env` from the cwd; pass {@link LoadEnvOptions} for\n * a custom path or override behaviour, or `false` to disable.\n */\n dotenv?: boolean | LoadEnvOptions;\n /** A default cooldown applied to every command. A command's own cooldown overrides it. */\n cooldown?: CooldownInput;\n /** Enable prefix (text) commands. A string/array sets prefixes; an object configures matching. */\n prefix?: string | readonly string[] | PrefixOptions;\n /** Track command/component/prefix usage to a store and/or a Discord channel. */\n usage?: UsageOptions;\n}\n\n/** Options for {@link SpearClient}: discord.js options plus {@link SpearOptions}. `intents` may be omitted. */\nexport type SpearClientOptions = Partial<ClientOptions> & SpearOptions;\n\n/**\n * A discord.js {@link Client} with batteries included: command, event and\n * component registries plus interaction routing wired up automatically.\n *\n * @example\n * ```ts\n * const client = new SpearClient({ intents: Intents.default });\n * client.register(ping, onReady, voteButton);\n * await client.start(process.env.TOKEN);\n * await client.deployCommands({ guildId: \"123\" });\n * ```\n */\nexport class SpearClient extends Client {\n /** Slash command registry and dispatcher. */\n readonly commands = new CommandRegistry();\n /** Event listener registry. */\n readonly events = new EventRegistry();\n /** Button / select / modal registry and router. */\n readonly components = new ComponentRegistry();\n /** Structured logger shared across spearkit and available to your code. */\n readonly logger: Logger;\n /** Shared cooldown manager used by command dispatch; also usable directly. */\n readonly cooldowns = new CooldownManager();\n /** Cron/interval task scheduler; started on ready and stopped on destroy. */\n readonly scheduler = new TaskScheduler();\n /** Prefix (text) command registry, dispatched from `messageCreate`. */\n readonly prefix = new PrefixRegistry();\n /** Usage tracker: records who used what to a store and/or a Discord channel. */\n readonly usage = new UsageTracker();\n private readonly envConfig: false | LoadEnvOptions;\n\n constructor(options: SpearClientOptions = {}) {\n const { intents, logger, dotenv, cooldown, prefix, usage, ...rest } = options;\n super({ ...rest, intents: intents ?? Intents.default });\n this.envConfig = dotenv === false ? false : dotenv === undefined || dotenv === true ? {} : dotenv;\n this.logger = logger instanceof Logger ? logger : new Logger(logger);\n this.commands.setLogger(this.logger.child(\"commands\"));\n const defaultCooldown = cooldown !== undefined ? normalizeCooldown(cooldown) : undefined;\n this.commands.setCooldowns(this.cooldowns, defaultCooldown);\n this.components.setLogger(this.logger.child(\"components\"));\n this.events.attachAll(this);\n this.on(\"interactionCreate\", (interaction) => this.route(interaction));\n this.on(\"error\", (error) => this.logger.error(\"client error\", { error: toError(error) }));\n this.scheduler.setLogger(this.logger.child(\"scheduler\"));\n this.once(\"clientReady\", () => this.scheduler.start(this));\n this.prefix.setLogger(this.logger.child(\"prefix\"));\n this.prefix.setCooldowns(this.cooldowns, defaultCooldown);\n if (prefix !== undefined) this.prefix.setOptions(prefix);\n this.on(\"messageCreate\", (message) => {\n void this.prefix.handle(message);\n });\n this.usage.setClient(this).setLogger(this.logger.child(\"usage\"));\n if (usage !== undefined) {\n if (usage.store !== undefined) this.usage.setStore(usage.store);\n if (usage.channel !== undefined) this.usage.reportTo(usage.channel, usage.format);\n const onUsage = (event: UsageEvent): void => this.usage.track(event);\n this.commands.setUsageHook(onUsage);\n this.components.setUsageHook(onUsage);\n this.prefix.setUsageHook(onUsage);\n }\n }\n\n /**\n * Register commands, events and components in one call. Each item is routed\n * to the matching registry based on its kind.\n */\n register(...items: Registerable[]): this {\n for (const item of items) {\n if (item instanceof SlashCommand) {\n this.commands.add(item);\n } else if (\"attach\" in item) {\n this.events.add(item);\n } else if (item.kind === \"task\") {\n this.scheduler.add(item);\n } else if (item.kind === \"prefixCommand\") {\n this.prefix.add(item);\n } else {\n this.components.add(item);\n }\n }\n return this;\n }\n\n /** Install one or more plugins, running each plugin's `setup`. */\n async use(...plugins: SpearPlugin[]): Promise<this> {\n for (const plugin of plugins) {\n await plugin.setup(this);\n }\n return this;\n }\n\n /**\n * Recursively load a directory and register every command, event and\n * component it exports. Returns the number of items registered.\n */\n load(dir: string, options?: LoadOptions): Promise<number> {\n return loadInto(this, dir, options);\n }\n\n /**\n * Log in. Falls back to the `DISCORD_TOKEN` environment variable when no\n * token is passed.\n */\n async start(token?: string): Promise<this> {\n if (this.envConfig !== false) loadEnv(this.envConfig);\n const resolved = token ?? process.env.DISCORD_TOKEN;\n if (resolved === undefined || resolved.length === 0) {\n throw new Error(\"spearkit: start() needs a token (pass one or set DISCORD_TOKEN)\");\n }\n await this.login(resolved);\n return this;\n }\n\n /**\n * Push the registered slash commands to discord using the client's own\n * authenticated REST connection. Call after the client is ready.\n */\n async deployCommands(options: { guildId?: string } = {}): Promise<DeployResult> {\n const applicationId = this.application?.id ?? this.user?.id;\n if (applicationId == null) {\n throw new Error(\"spearkit: deployCommands() must run after the client is ready\");\n }\n return this.commands.deploy({ rest: this.rest, applicationId, guildId: options.guildId });\n }\n\n private async route(interaction: Interaction): Promise<void> {\n if (interaction.isChatInputCommand()) {\n await this.commands.handle(interaction);\n } else if (interaction.isAutocomplete()) {\n await this.commands.handleAutocomplete(interaction);\n } else {\n await this.components.handle(interaction);\n }\n }\n\n /** Define and register a scheduled task in one call. */\n schedule(config: TaskConfig): ScheduledTask {\n const scheduled = task(config);\n this.scheduler.add(scheduled);\n return scheduled;\n }\n\n /** Stop the scheduler, then tear down the discord.js client. */\n override async destroy(): Promise<void> {\n this.scheduler.stop();\n await super.destroy();\n }\n}\n","import type { Awaitable } from \"discord.js\";\nimport type { SpearClient } from \"./client.js\";\n\n/**\n * A spearkit plugin: a named, reusable bundle of commands, events and components.\n * Its {@link setup} runs once when added to a client via `client.use(plugin)`.\n */\nexport interface SpearPlugin {\n readonly name: string;\n setup(client: SpearClient): Awaitable<void>;\n}\n\n/** Identity helper that gives a plugin object its type and editor hints. */\nexport function definePlugin(plugin: SpearPlugin): SpearPlugin {\n return plugin;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/embeds.ts","../src/lock.ts","../src/safe-fetch.ts","../src/format.ts","../src/cache.ts","../src/config.ts","../src/guards.ts","../src/context.ts","../src/cooldown.ts","../src/context-menus.ts","../src/prefix-args.ts","../src/pagination.ts","../src/confirm.ts","../src/logger.ts","../src/env.ts","../src/scheduler.ts","../src/prefix.ts","../src/usage.ts","../src/commands/options.ts","../src/commands/context.ts","../src/commands/command.ts","../src/commands/registry.ts","../src/events.ts","../src/components/customId.ts","../src/components/context.ts","../src/components/registry.ts","../src/components/builders.ts","../src/components/row.ts","../src/loader.ts","../src/client.ts","../src/plugin.ts"],"names":["EmbedBuilder","resetAt","promisify","readFile","readFileSync","guard","PermissionsBitField","MessageFlags","InteractionContextType","ApplicationCommandType","command","ButtonBuilder","ButtonStyle","ActionRowBuilder","resolveLabels","ComponentType","button","clientEmbeds","row","path","mkdir","dirname","appendFile","join","task","timer","combineGuards","event","ApplicationCommandOptionType","modal","resolveOptions","baseJSON","actorOf","REST","Routes","toError","StringSelectMenuBuilder","UserSelectMenuBuilder","RoleSelectMenuBuilder","ChannelSelectMenuBuilder","MentionableSelectMenuBuilder","TextInputStyle","TextInputBuilder","ModalBuilder","readdir","extname","pathToFileURL","GatewayIntentBits","Client"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Preset embeds — `error`, `success`, `info`, `warn` — with consistent colors\n * and icons so every reply in your bot looks the same. The client owns one as\n * `client.embeds` and the context preset methods (`ctx.success(...)` etc.) use\n * it; you can also call `embeds.error(...)` directly to build an embed for\n * `channel.send({ embeds: [...] })`.\n */\nimport {\n EmbedBuilder,\n type APIEmbedAuthor,\n type APIEmbedField,\n type APIEmbedFooter,\n} from \"discord.js\";\n\n/** Color in `0xRRGGBB` form for each preset level. */\nexport interface EmbedColors {\n error: number;\n success: number;\n info: number;\n warn: number;\n}\n\n/** Icon glyph prepended to the description of each preset. Pass `\"\"` to drop. */\nexport interface EmbedIcons {\n error: string;\n success: string;\n info: string;\n warn: string;\n}\n\n/** Construction options for {@link Embeds}. Missing fields fall back to defaults. */\nexport interface EmbedsOptions {\n /** Per-level color overrides. */\n colors?: Partial<EmbedColors>;\n /** Per-level icon overrides; pass `\"\"` to drop the prefix for a level. */\n icons?: Partial<EmbedIcons>;\n}\n\n/** Shape accepted by every preset: a plain string or a structured body. */\nexport type EmbedPresetInput =\n | string\n | {\n title?: string;\n description?: string;\n fields?: readonly APIEmbedField[];\n footer?: APIEmbedFooter;\n author?: APIEmbedAuthor;\n url?: string;\n timestamp?: Date | number | string;\n thumbnail?: { url: string };\n image?: { url: string };\n };\n\n/** One of the four built-in preset levels. */\nexport type EmbedLevel = \"error\" | \"success\" | \"info\" | \"warn\";\n\n/** Discord-ish defaults: red / green / blue / yellow + ⛔ ✅ ℹ️ ⚠️. */\nexport const DEFAULT_EMBED_COLORS: EmbedColors = {\n error: 0xf04a47,\n success: 0x43b582,\n info: 0x3498db,\n warn: 0xf9a825,\n};\n\n/** Default icons: warning / check / info / triangle. */\nexport const DEFAULT_EMBED_ICONS: EmbedIcons = {\n error: \"⛔\",\n success: \"✅\",\n info: \"ℹ️\",\n warn: \"⚠️\",\n};\n\n/**\n * Builds preset embeds with consistent colors and icons.\n *\n * @example\n * ```ts\n * const embeds = new Embeds({ colors: { success: 0x00ff88 } });\n * await channel.send({ embeds: [embeds.success(\"Saved.\")] });\n * ```\n */\nexport class Embeds {\n /** The resolved colors for every preset. */\n readonly colors: EmbedColors;\n /** The resolved icons for every preset. */\n readonly icons: EmbedIcons;\n\n constructor(options: EmbedsOptions = {}) {\n this.colors = { ...DEFAULT_EMBED_COLORS, ...options.colors };\n this.icons = { ...DEFAULT_EMBED_ICONS, ...options.icons };\n }\n\n /** Red preset — something went wrong. */\n error(input: EmbedPresetInput): EmbedBuilder {\n return this.build(\"error\", input);\n }\n\n /** Green preset — something succeeded. */\n success(input: EmbedPresetInput): EmbedBuilder {\n return this.build(\"success\", input);\n }\n\n /** Blue preset — neutral information. */\n info(input: EmbedPresetInput): EmbedBuilder {\n return this.build(\"info\", input);\n }\n\n /** Yellow preset — caution. */\n warn(input: EmbedPresetInput): EmbedBuilder {\n return this.build(\"warn\", input);\n }\n\n /** Build an embed at a chosen level. */\n build(level: EmbedLevel, input: EmbedPresetInput): EmbedBuilder {\n const builder = new EmbedBuilder().setColor(this.colors[level]);\n const icon = this.icons[level];\n const prefix = icon.length > 0 ? `${icon} ` : \"\";\n if (typeof input === \"string\") {\n builder.setDescription(`${prefix}${input}`);\n return builder;\n }\n if (input.title !== undefined) builder.setTitle(input.title);\n if (input.description !== undefined) {\n builder.setDescription(`${prefix}${input.description}`);\n }\n if (input.fields !== undefined) builder.addFields(...input.fields);\n if (input.footer !== undefined) builder.setFooter(input.footer);\n if (input.author !== undefined) builder.setAuthor(input.author);\n if (input.url !== undefined) builder.setURL(input.url);\n if (input.timestamp !== undefined) {\n builder.setTimestamp(\n input.timestamp instanceof Date ? input.timestamp : new Date(input.timestamp),\n );\n }\n if (input.thumbnail !== undefined) builder.setThumbnail(input.thumbnail.url);\n if (input.image !== undefined) builder.setImage(input.image.url);\n return builder;\n }\n}\n\n/** The shared default factory — used by contexts when the client has none. */\nexport const defaultEmbeds = new Embeds();\n","/**\n * Keyed in-memory async lock (mutex) with TTL.\n *\n * Prevents two handlers from mutating the same resource concurrently — e.g.\n * the same ticket id being claimed twice, or a user opening a ticket while\n * another button click is still creating one. Hold leases are auto-expired so\n * a forgotten `release()` cannot deadlock the process forever.\n */\n\n/** Construction options for {@link KeyedLock}. */\nexport interface KeyedLockOptions {\n /** Maximum lifetime (ms) of a held lock before it auto-expires. Default `60_000`. */\n ttl?: number;\n /** Sweep interval (ms) for expired-but-not-released locks. `0` disables sweeping. */\n sweep?: number;\n}\n\ninterface LeaseEntry {\n createdAt: number;\n ttl: number;\n}\n\n/** Release a previously-acquired lease. Idempotent — safe to call multiple times. */\nexport type LockRelease = () => void;\n\n/**\n * Acquire, release and run-while-locked operations keyed on an arbitrary string.\n *\n * @example\n * ```ts\n * const locks = new KeyedLock();\n * const result = await locks.run(`ticket:${id}:claim`, async () => {\n * // …mutate ticket atomically…\n * return \"ok\";\n * }, { onBusy: () => \"busy\" });\n * ```\n */\nexport class KeyedLock {\n private readonly entries = new Map<string, LeaseEntry>();\n private readonly defaultTtl: number;\n private readonly sweepTimer?: ReturnType<typeof setInterval>;\n\n constructor(options: KeyedLockOptions = {}) {\n this.defaultTtl = options.ttl ?? 60_000;\n const sweep = options.sweep ?? 15_000;\n if (sweep > 0) {\n this.sweepTimer = setInterval(() => this.sweep(), sweep);\n if (typeof this.sweepTimer.unref === \"function\") this.sweepTimer.unref();\n }\n }\n\n /** Try to acquire `key`. Returns a release function, or `null` if already held. */\n tryAcquire(key: string, ttl: number = this.defaultTtl): LockRelease | null {\n const existing = this.entries.get(key);\n if (existing !== undefined && Date.now() - existing.createdAt < existing.ttl) {\n return null;\n }\n this.entries.set(key, { createdAt: Date.now(), ttl });\n let released = false;\n return () => {\n if (released) return;\n released = true;\n this.entries.delete(key);\n };\n }\n\n /** Whether `key` is currently held and not expired. */\n isHeld(key: string): boolean {\n const entry = this.entries.get(key);\n return entry !== undefined && Date.now() - entry.createdAt < entry.ttl;\n }\n\n /**\n * Run `fn` while holding `key`. If the key is already held, calls `onBusy`\n * (or returns `undefined`) without ever calling `fn`. Always releases on\n * return or throw.\n */\n async run<T>(\n key: string,\n fn: () => Promise<T> | T,\n options: { ttl?: number; onBusy?: () => Promise<T> | T } = {},\n ): Promise<T | undefined> {\n const release = this.tryAcquire(key, options.ttl ?? this.defaultTtl);\n if (release === null) {\n return options.onBusy !== undefined ? await options.onBusy() : undefined;\n }\n try {\n return await fn();\n } finally {\n release();\n }\n }\n\n /** Number of currently-tracked leases (including expired-but-unswept). */\n get size(): number {\n return this.entries.size;\n }\n\n /** Drop all known leases and stop the sweep timer. */\n dispose(): void {\n this.entries.clear();\n if (this.sweepTimer !== undefined) clearInterval(this.sweepTimer);\n }\n\n /** Manually remove a single key without running anything. */\n forget(key: string): boolean {\n return this.entries.delete(key);\n }\n\n private sweep(): void {\n const now = Date.now();\n for (const [key, entry] of this.entries.entries()) {\n if (now - entry.createdAt > entry.ttl) this.entries.delete(key);\n }\n }\n}\n","/**\n * Cache-first, timeout-bounded fetch helpers that resolve to `T | null` instead\n * of throwing. They replace the `.catch(() => null)` pattern repeated 30+ times\n * in production bots (member/channel/message/user/guild/role lookups that may\n * 404, rate-limit, or block startup if awaited indefinitely).\n */\nimport type {\n Channel,\n Client,\n Guild,\n GuildMember,\n Message,\n MessageManager,\n Role,\n User,\n} from \"discord.js\";\n\n/** Shared options for every safe-fetch helper. */\nexport interface SafeFetchOptions {\n /** Use the cache when present and not `force`. Default `true`. */\n cache?: boolean;\n /** Bypass the cache and force a REST hit. Default `false`. */\n force?: boolean;\n /** Resolve to `null` if Discord takes longer than this (ms). Default `5000`. */\n timeoutMs?: number;\n}\n\nconst DEFAULT_TIMEOUT_MS = 5000;\n\nasync function withTimeout<T>(promise: Promise<T>, ms: number): Promise<T | null> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n const timeout = new Promise<null>((resolve) => {\n timer = setTimeout(() => resolve(null), ms);\n });\n return await Promise.race([promise.catch(() => null), timeout]);\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n }\n}\n\n/** Resolve a guild member with a cache-hit fast path. Returns `null` on failure. */\nexport async function fetchMember(\n guild: Guild | null | undefined,\n userId: string | null | undefined,\n options: SafeFetchOptions = {},\n): Promise<GuildMember | null> {\n if (guild == null || userId == null || userId.length === 0) return null;\n if (options.cache !== false && options.force !== true) {\n const cached = guild.members.cache.get(userId);\n if (cached !== undefined) return cached;\n }\n return withTimeout(\n guild.members.fetch({ user: userId, force: options.force ?? false }),\n options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n );\n}\n\n/** Resolve a channel by id from the client. Returns `null` on failure. */\nexport async function fetchChannel(\n client: Client | null | undefined,\n channelId: string | null | undefined,\n options: SafeFetchOptions = {},\n): Promise<Channel | null> {\n if (client == null || channelId == null || channelId.length === 0) return null;\n if (options.cache !== false && options.force !== true) {\n const cached = client.channels.cache.get(channelId);\n if (cached !== undefined) return cached;\n }\n return withTimeout(\n client.channels.fetch(channelId, { force: options.force ?? false }),\n options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n );\n}\n\n/** Resolve a message id in a given channel's messages manager. */\nexport async function fetchMessage(\n messages: MessageManager | null | undefined,\n messageId: string | null | undefined,\n options: SafeFetchOptions = {},\n): Promise<Message | null> {\n if (messages == null || messageId == null || messageId.length === 0) return null;\n if (options.cache !== false && options.force !== true) {\n const cached = messages.cache.get(messageId);\n if (cached !== undefined) return cached;\n }\n return withTimeout(\n messages.fetch({ message: messageId, force: options.force ?? false }),\n options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n );\n}\n\n/** Resolve a user by id from the client. Returns `null` on failure. */\nexport async function fetchUser(\n client: Client | null | undefined,\n userId: string | null | undefined,\n options: SafeFetchOptions = {},\n): Promise<User | null> {\n if (client == null || userId == null || userId.length === 0) return null;\n if (options.cache !== false && options.force !== true) {\n const cached = client.users.cache.get(userId);\n if (cached !== undefined) return cached;\n }\n return withTimeout(\n client.users.fetch(userId, { force: options.force ?? false }),\n options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n );\n}\n\n/** Resolve a guild by id from the client. Returns `null` on failure. */\nexport async function fetchGuild(\n client: Client | null | undefined,\n guildId: string | null | undefined,\n options: SafeFetchOptions = {},\n): Promise<Guild | null> {\n if (client == null || guildId == null || guildId.length === 0) return null;\n if (options.cache !== false && options.force !== true) {\n const cached = client.guilds.cache.get(guildId);\n if (cached !== undefined) return cached;\n }\n return withTimeout(\n client.guilds.fetch({ guild: guildId, force: options.force ?? false }),\n options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n );\n}\n\n/** Resolve a role id from a guild's roles manager. Returns `null` on failure. */\nexport async function fetchRole(\n guild: Guild | null | undefined,\n roleId: string | null | undefined,\n options: SafeFetchOptions = {},\n): Promise<Role | null> {\n if (guild == null || roleId == null || roleId.length === 0) return null;\n if (options.cache !== false && options.force !== true) {\n const cached = guild.roles.cache.get(roleId);\n if (cached !== undefined) return cached;\n }\n return withTimeout(\n guild.roles.fetch(roleId, { force: options.force ?? false }),\n options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n );\n}\n\n/**\n * Wrap an arbitrary best-effort operation so a failure resolves to `null`\n * instead of throwing. Useful for sends/deletes whose outcome is non-critical.\n *\n * @example\n * ```ts\n * await safeTry(() => message.delete());\n * ```\n */\nexport async function safeTry<T>(op: () => Promise<T> | T): Promise<T | null> {\n try {\n return await op();\n } catch {\n return null;\n }\n}\n\n/** Time-bound an arbitrary promise; resolves to `null` on timeout or rejection. */\nexport async function withSafeTimeout<T>(\n promise: Promise<T>,\n timeoutMs: number,\n): Promise<T | null> {\n return withTimeout(promise, timeoutMs);\n}\n\n/** Cache-first, timeout-bounded fetch helpers grouped for ergonomic imports. */\nexport const safeFetch = {\n member: fetchMember,\n channel: fetchChannel,\n message: fetchMessage,\n user: fetchUser,\n guild: fetchGuild,\n role: fetchRole,\n try: safeTry,\n} as const;\n","/**\n * Locale-aware duration formatter, duration parser and Discord timestamp\n * helpers. Replaces the dozens of inline `Math.floor(s/86400)`/`X gün Y saat`\n * and `<t:${secs}:R>` snippets in production bots, including the duplicate\n * `formatTimeInTurkish`-style helpers duplicated across many bot command files.\n */\n\n/** Discord timestamp style: `t/T/d/D/f/F/R`. */\nexport type DiscordTimestampStyle = \"t\" | \"T\" | \"d\" | \"D\" | \"f\" | \"F\" | \"R\";\n\ntype DurationUnit = \"week\" | \"day\" | \"hour\" | \"minute\" | \"second\";\n\ninterface UnitLabels {\n week: [string, string];\n day: [string, string];\n hour: [string, string];\n minute: [string, string];\n second: [string, string];\n separator: string;\n zero: string;\n}\n\nconst EN: UnitLabels = {\n week: [\"week\", \"weeks\"],\n day: [\"day\", \"days\"],\n hour: [\"hour\", \"hours\"],\n minute: [\"minute\", \"minutes\"],\n second: [\"second\", \"seconds\"],\n separator: \" \",\n zero: \"0 seconds\",\n};\n\nconst TR: UnitLabels = {\n week: [\"hafta\", \"hafta\"],\n day: [\"gün\", \"gün\"],\n hour: [\"saat\", \"saat\"],\n minute: [\"dakika\", \"dakika\"],\n second: [\"saniye\", \"saniye\"],\n separator: \" \",\n zero: \"0 saniye\",\n};\n\nconst LABELS: Record<string, UnitLabels> = {\n en: EN,\n \"en-US\": EN,\n \"en-GB\": EN,\n tr: TR,\n \"tr-TR\": TR,\n};\n\nconst UNIT_MS: Record<DurationUnit, number> = {\n week: 7 * 86_400_000,\n day: 86_400_000,\n hour: 3_600_000,\n minute: 60_000,\n second: 1000,\n};\n\nconst UNIT_ORDER: DurationUnit[] = [\"week\", \"day\", \"hour\", \"minute\", \"second\"];\n\n/** Options for {@link formatDuration}. */\nexport interface FormatDurationOptions {\n /** Locale label set: `\"en\"`, `\"en-US\"`, `\"tr\"`, `\"tr-TR\"`, or a custom set. */\n locale?: string | UnitLabels;\n /** How many non-zero units to keep. Default `2`. Pass `Infinity` to keep all. */\n largest?: number;\n /** Subset of units to consider (in order: week → second). */\n units?: readonly DurationUnit[];\n}\n\nfunction resolveLabels(locale: FormatDurationOptions[\"locale\"]): UnitLabels {\n if (typeof locale === \"object\" && locale !== null) return locale;\n if (locale === undefined) return EN;\n return LABELS[locale] ?? LABELS[locale.split(\"-\")[0] ?? \"\"] ?? EN;\n}\n\n/**\n * Format a millisecond duration into human-readable text.\n *\n * @example\n * ```ts\n * formatDuration(3_725_000); // \"1 hour 2 minutes\"\n * formatDuration(3_725_000, { locale: \"tr\" }); // \"1 saat 2 dakika\"\n * formatDuration(86_400_000 * 9, { largest: 3 }); // \"1 week 2 days\"\n * ```\n */\nexport function formatDuration(ms: number, options: FormatDurationOptions = {}): string {\n const labels = resolveLabels(options.locale);\n if (!Number.isFinite(ms) || ms <= 0) return labels.zero;\n const limit = options.largest ?? 2;\n const units = options.units ?? UNIT_ORDER;\n const parts: string[] = [];\n let remaining = Math.floor(ms);\n for (const unit of units) {\n if (parts.length >= limit) break;\n const size = UNIT_MS[unit];\n if (remaining < size) continue;\n const value = Math.floor(remaining / size);\n remaining -= value * size;\n const word = value === 1 ? labels[unit][0] : labels[unit][1];\n parts.push(`${value} ${word}`);\n }\n return parts.length > 0 ? parts.join(labels.separator) : labels.zero;\n}\n\nconst DURATION_PATTERN = /(\\d+(?:\\.\\d+)?)\\s*(milliseconds|millisecond|seconds|minutes|saniye|dakika|minute|second|weeks|hours|hafta|saat|week|hour|days|day|gün|gun|min|sec|ms|wk|hr|dk|m|s|h|d|w)/gi;\nconst SHORT_TO_MS: Record<string, number> = {\n ms: 1,\n millisecond: 1,\n milliseconds: 1,\n s: 1000,\n sec: 1000,\n second: 1000,\n seconds: 1000,\n saniye: 1000,\n m: 60_000,\n min: 60_000,\n minute: 60_000,\n minutes: 60_000,\n dakika: 60_000,\n dk: 60_000,\n h: 3_600_000,\n hr: 3_600_000,\n hour: 3_600_000,\n hours: 3_600_000,\n saat: 3_600_000,\n d: 86_400_000,\n day: 86_400_000,\n days: 86_400_000,\n gün: 86_400_000,\n gun: 86_400_000,\n w: 604_800_000,\n wk: 604_800_000,\n week: 604_800_000,\n weeks: 604_800_000,\n hafta: 604_800_000,\n};\n\n/**\n * Parse a human duration like `\"1h30m\"`, `\"2 days\"`, `\"1 saat 30 dakika\"` or\n * `\"5000ms\"` into milliseconds. Returns `null` if nothing parseable was found.\n *\n * @example\n * ```ts\n * parseDuration(\"1h30m\"); // 5_400_000\n * parseDuration(\"1 saat\"); // 3_600_000\n * parseDuration(\"oops\"); // null\n * ```\n */\nexport function parseDuration(input: string): number | null {\n const trimmed = input.trim().toLowerCase();\n if (trimmed.length === 0) return null;\n DURATION_PATTERN.lastIndex = 0;\n let total = 0;\n let matched = false;\n for (;;) {\n const match = DURATION_PATTERN.exec(trimmed);\n if (match === null) break;\n matched = true;\n const value = Number(match[1]);\n const unit = match[2] ?? \"\";\n const ms = SHORT_TO_MS[unit];\n if (ms !== undefined && Number.isFinite(value)) total += value * ms;\n }\n return matched ? total : null;\n}\n\nfunction toEpochSeconds(date: Date | number): number {\n return Math.floor((date instanceof Date ? date.getTime() : date) / 1000);\n}\n\n/**\n * Render a Discord-flavoured timestamp tag (`<t:1234:R>`).\n *\n * Styles: `t` short time, `T` long time, `d` short date, `D` long date,\n * `f` short date/time (default), `F` long date/time, `R` relative.\n *\n * @example\n * ```ts\n * discordTimestamp(date); // <t:1234:f>\n * discordTimestamp(date, \"R\"); // <t:1234:R>\n * discordTimestamp(Date.now() + 60_000, \"R\"); // <t:..:R>\n * ```\n */\nexport function discordTimestamp(date: Date | number, style: DiscordTimestampStyle = \"f\"): string {\n return `<t:${toEpochSeconds(date)}:${style}>`;\n}\n\n/** Short-hand for the relative Discord timestamp (`R` style). */\nexport function relativeTimestamp(date: Date | number): string {\n return discordTimestamp(date, \"R\");\n}\n","/**\n * Pluggable cache abstraction with TTL, counters and rate-limit primitives.\n *\n * The {@link CacheStore} interface lets you swap a {@link MemoryCache} for any\n * external backend (Redis, Memcached, your DB) without changing call sites —\n * production bots commonly start with memory and graduate to Redis as load\n * grows. Counters and fixed-window rate limits live on the same surface so the\n * three patterns repeated in real bots (TTL cache, daily counter, per-user\n * rate limit) share one API.\n */\n\n/** Result of a fixed-window {@link CacheStore.rateLimit} hit. */\nexport interface RateLimitResult {\n /** `true` if this hit was within the window's budget. */\n allowed: boolean;\n /** Remaining hits in the current window (`0` once `allowed` is false). */\n remaining: number;\n /** Epoch ms at which the current window resets. */\n resetAt: number;\n}\n\n/** Options accepted by every write helper. */\nexport interface CacheSetOptions {\n /** Time-to-live in milliseconds. `undefined` means never expire. */\n ttl?: number;\n}\n\n/** A swappable cache backend. All operations are async to allow remote stores. */\nexport interface CacheStore {\n /** Read a previously set value, or `undefined` if missing/expired. */\n get<T = unknown>(key: string): Promise<T | undefined>;\n /** Write a value, optionally with a TTL in ms. */\n set<T>(key: string, value: T, options?: CacheSetOptions): Promise<void>;\n /** Remove a key. Resolves to `true` if it existed. */\n delete(key: string): Promise<boolean>;\n /** Whether a non-expired key is present. */\n has(key: string): Promise<boolean>;\n /** Atomically increment a numeric counter. Returns the new value. */\n increment(key: string, delta?: number, options?: CacheSetOptions): Promise<number>;\n /** Fixed-window rate limit hit. Atomic per key. */\n rateLimit(key: string, options: { limit: number; windowMs: number }): Promise<RateLimitResult>;\n /** Drop every entry. */\n clear(): Promise<void>;\n}\n\ninterface Entry<T> {\n value: T;\n expiresAt?: number;\n}\n\n/** In-memory implementation of {@link CacheStore}. Lazy TTL expiration. */\nexport class MemoryCache implements CacheStore {\n private readonly store = new Map<string, Entry<unknown>>();\n\n /** Total number of stored (possibly expired) entries — primarily for tests. */\n get size(): number {\n return this.store.size;\n }\n\n async get<T = unknown>(key: string): Promise<T | undefined> {\n const entry = this.store.get(key);\n if (entry === undefined) return undefined;\n if (entry.expiresAt !== undefined && entry.expiresAt <= Date.now()) {\n this.store.delete(key);\n return undefined;\n }\n return entry.value as T;\n }\n\n async set<T>(key: string, value: T, options?: CacheSetOptions): Promise<void> {\n const ttl = options?.ttl;\n this.store.set(key, {\n value,\n expiresAt: ttl !== undefined && ttl > 0 ? Date.now() + ttl : undefined,\n });\n }\n\n async delete(key: string): Promise<boolean> {\n return this.store.delete(key);\n }\n\n async has(key: string): Promise<boolean> {\n return (await this.get(key)) !== undefined;\n }\n\n async increment(key: string, delta: number = 1, options?: CacheSetOptions): Promise<number> {\n const current = (await this.get<number>(key)) ?? 0;\n const next = current + delta;\n const existing = this.store.get(key);\n // Preserve an existing expiry unless caller overrides it.\n const ttl = options?.ttl;\n if (ttl !== undefined && ttl > 0) {\n await this.set(key, next, { ttl });\n } else if (existing?.expiresAt !== undefined) {\n this.store.set(key, { value: next, expiresAt: existing.expiresAt });\n } else {\n await this.set(key, next);\n }\n return next;\n }\n\n async rateLimit(key: string, options: { limit: number; windowMs: number }): Promise<RateLimitResult> {\n const now = Date.now();\n const bucketKey = `__rl__:${key}`;\n const entry = this.store.get(bucketKey) as Entry<number> | undefined;\n const expired = entry === undefined || entry.expiresAt === undefined || entry.expiresAt <= now;\n if (expired) {\n const resetAt = now + options.windowMs;\n this.store.set(bucketKey, { value: 1, expiresAt: resetAt });\n return { allowed: true, remaining: Math.max(0, options.limit - 1), resetAt };\n }\n const count = entry.value;\n const resetAt = entry.expiresAt ?? now;\n if (count >= options.limit) {\n return { allowed: false, remaining: 0, resetAt };\n }\n this.store.set(bucketKey, { value: count + 1, expiresAt: resetAt });\n return { allowed: true, remaining: Math.max(0, options.limit - count - 1), resetAt };\n }\n\n async clear(): Promise<void> {\n this.store.clear();\n }\n}\n\n/** Convenience factory: returns a default in-memory {@link CacheStore}. */\nexport function createCache(): CacheStore {\n return new MemoryCache();\n}\n","/**\n * Tiny, dependency-free typed config loader for JSON files.\n *\n * Pass a `parser` to support JSON5 / YAML / TOML without dragging those\n * packages into spearkit, and a `schema` to validate (zod, valibot, custom) so\n * a typo in your config blows up at startup instead of at the first user\n * interaction. Pairs naturally with `lookup()` for typed role/channel maps.\n */\nimport { readFile, readFileSync } from \"node:fs\";\nimport { promisify } from \"node:util\";\n\nconst readFileAsync = promisify(readFile);\n\n/** Options accepted by {@link loadConfig} / {@link loadConfigAsync}. */\nexport interface LoadConfigOptions<T> {\n /** Absolute or cwd-relative path to the config file. */\n file: string;\n /** Custom parser. Default `JSON.parse`. Pass `JSON5.parse` (etc.) for other formats. */\n parser?: (text: string) => unknown;\n /** Validation function — receives the parsed value, returns the typed config. */\n schema?: (value: unknown) => T;\n /** File encoding. Default `\"utf8\"`. */\n encoding?: BufferEncoding;\n}\n\n/** Synchronously read + parse + (optionally) validate a config file. */\nexport function loadConfig<T = unknown>(options: LoadConfigOptions<T>): T {\n const text = readFileSync(options.file, options.encoding ?? \"utf8\");\n const parser = options.parser ?? JSON.parse;\n const parsed = parser(text);\n return options.schema !== undefined ? options.schema(parsed) : (parsed as T);\n}\n\n/** Asynchronous variant of {@link loadConfig}. */\nexport async function loadConfigAsync<T = unknown>(options: LoadConfigOptions<T>): Promise<T> {\n const text = await readFileAsync(options.file, options.encoding ?? \"utf8\");\n const parser = options.parser ?? JSON.parse;\n const parsed = parser(text);\n return options.schema !== undefined ? options.schema(parsed) : (parsed as T);\n}\n\n/**\n * Build a typed lookup over a `Record<key, value>` table. Throws on missing\n * keys so config typos surface at startup, not at use.\n *\n * @example\n * ```ts\n * const roles = lookup(config.roles, \"role\");\n * const modId = roles(\"moderator\"); // string; throws if \"moderator\" is absent\n * ```\n */\nexport function lookup<K extends string, V>(\n table: Readonly<Record<K, V>>,\n resourceName: string = \"key\",\n): (key: K) => V {\n return (key) => {\n const value = table[key];\n if (value === undefined) {\n throw new Error(`spearkit: ${resourceName} \"${String(key)}\" not found in config`);\n }\n return value;\n };\n}\n\n/** Build a non-throwing lookup that returns `undefined` for missing keys. */\nexport function lookupOptional<K extends string, V>(\n table: Readonly<Record<K, V>>,\n): (key: K) => V | undefined {\n return (key) => table[key];\n}\n","/**\n * Declarative preconditions (\"guards\") that run before a command, component\n * or prefix-command handler. Replaces the role/permission/guild-only/owner\n * checks repeated 127+ times across production bots — `member.roles.cache.some(...)`,\n * `member.permissions.has(...)`, `if (!message.guild) return`, ownership and\n * target-hierarchy checks — with a composable predicate pipeline.\n *\n * Attach guards on a command (`command({ guards: [...] })`), on a component\n * (`button({ guards: [...] })`), on a prefix command, or once on the client\n * for everything (`new SpearClient({ guards: [...] })`). On denial, spearkit\n * replies with an ephemeral error embed and skips the handler.\n */\nimport {\n PermissionsBitField,\n type APIInteractionGuildMember,\n type Awaitable,\n type Client,\n type Guild,\n type GuildMember,\n type PermissionResolvable,\n type User,\n} from \"discord.js\";\n\n/**\n * Minimal context a guard reads. Every spearkit handler (slash/prefix/component\n * /modal) already exposes these — guards work uniformly across all of them.\n */\nexport interface GuardContext {\n readonly client: Client;\n readonly user: User;\n readonly member: GuildMember | APIInteractionGuildMember | null;\n readonly guild: Guild | null;\n readonly guildId: string | null;\n readonly channelId: string | null;\n}\n\n/** A guard's outcome. `true` = pass; `false`/`{ allowed: false, reason? }` = deny. */\nexport type GuardResult = boolean | { allowed: false; reason?: string };\n\n/** A precondition evaluated before a handler runs. */\nexport type Guard<TCtx extends GuardContext = GuardContext> = (ctx: TCtx) => Awaitable<GuardResult>;\n\n/** Sugar: build a denial result with an explanation. */\nexport function denied(reason?: string): GuardResult {\n return { allowed: false, reason };\n}\n\n/** The resolved outcome of running a list of guards. */\nexport type RunGuardsResult = { allowed: true } | { allowed: false; reason: string | undefined };\n\n/** Run guards in order, short-circuiting on the first denial. */\nexport async function runGuards<TCtx extends GuardContext>(\n ctx: TCtx,\n guards: readonly Guard<TCtx>[] | undefined,\n): Promise<RunGuardsResult> {\n if (guards === undefined || guards.length === 0) return { allowed: true };\n for (const guard of guards) {\n const result = await guard(ctx);\n if (result === true) continue;\n if (result === false) return { allowed: false, reason: undefined };\n if (result.allowed === false) return { allowed: false, reason: result.reason };\n }\n return { allowed: true };\n}\n\n// --- built-in predicates --------------------------------------------------\n\n/** Require the interaction/message to come from inside a guild. */\nexport function guildOnly(reason: string = \"This can only be used in a server.\"): Guard {\n return (ctx) => (ctx.guildId !== null ? true : denied(reason));\n}\n\n/** Require the interaction/message to come from a DM. */\nexport function dmOnly(reason: string = \"This can only be used in DMs.\"): Guard {\n return (ctx) => (ctx.guildId === null ? true : denied(reason));\n}\n\nfunction memberRoleIds(member: GuildMember | APIInteractionGuildMember | null): string[] {\n if (member === null) return [];\n const roles = member.roles;\n if (Array.isArray(roles)) return roles;\n return [...roles.cache.keys()];\n}\n\nfunction memberPermissionsBitField(\n member: GuildMember | APIInteractionGuildMember | null,\n): PermissionsBitField | null {\n if (member === null) return null;\n const perms = member.permissions;\n if (perms instanceof PermissionsBitField) return perms;\n if (typeof perms === \"string\") return new PermissionsBitField(BigInt(perms));\n return null;\n}\n\n/** Require the invoking member to hold ANY of these role ids. */\nexport function requireAnyRole(\n roleIds: readonly string[],\n reason: string = \"You don't have permission to use this.\",\n): Guard {\n const set = new Set(roleIds);\n return (ctx) => {\n const ids = memberRoleIds(ctx.member);\n return ids.some((id) => set.has(id)) ? true : denied(reason);\n };\n}\n\n/** Require the invoking member to hold EVERY one of these role ids. */\nexport function requireAllRoles(\n roleIds: readonly string[],\n reason: string = \"You're missing one of the required roles.\",\n): Guard {\n return (ctx) => {\n const ids = new Set(memberRoleIds(ctx.member));\n return roleIds.every((id) => ids.has(id)) ? true : denied(reason);\n };\n}\n\n/** Require the invoking user to be one of `ownerIds` (\"bot owners\"). */\nexport function requireOwner(\n ownerIds: readonly string[],\n reason: string = \"This is owner-only.\",\n): Guard {\n const set = new Set(ownerIds);\n return (ctx) => (set.has(ctx.user.id) ? true : denied(reason));\n}\n\n/** Require the invoking member to hold a Discord permission flag. */\nexport function requireUserPermissions(\n permission: PermissionResolvable,\n reason: string = \"You don't have permission to use this.\",\n): Guard {\n return (ctx) => {\n const bits = memberPermissionsBitField(ctx.member);\n if (bits === null) return denied(reason);\n return bits.has(permission) ? true : denied(reason);\n };\n}\n\n/** Require the BOT's own member to hold a Discord permission flag. */\nexport function requireBotPermissions(\n permission: PermissionResolvable,\n reason: string = \"I don't have permission to do that here.\",\n): Guard {\n return async (ctx) => {\n const guild = ctx.guild;\n if (guild === null) return denied(reason);\n const me = guild.members.me ?? (await guild.members.fetchMe().catch(() => null));\n if (me === null) return denied(reason);\n return me.permissions.has(permission) ? true : denied(reason);\n };\n}\n\n/** Inline custom predicate; sugar so a one-off check still types as a Guard. */\nexport function guard<TCtx extends GuardContext = GuardContext>(predicate: Guard<TCtx>): Guard<TCtx> {\n return predicate;\n}\n","import {\n MessageFlags,\n type InteractionEditReplyOptions,\n type InteractionReplyOptions,\n type InteractionResponse,\n type Message,\n type RepliableInteraction,\n} from \"discord.js\";\nimport type { Client } from \"discord.js\";\nimport { Embeds, defaultEmbeds, type EmbedLevel, type EmbedPresetInput } from \"./embeds.js\";\n\n/** A client (or anything client-shaped) that may expose a configured {@link Embeds}. */\ntype EmbedHost = Client & { embeds?: Embeds };\n\n/** Reply options with an ergonomic `ephemeral` shortcut (mapped to flags). */\nexport type ReplyData = InteractionReplyOptions & { ephemeral?: boolean };\n\n/** Either a plain string or full reply options. */\nexport type ReplyInput = string | ReplyData;\n\ntype Flags = InteractionReplyOptions[\"flags\"];\n\nfunction withEphemeralFlag(flags: Flags): Flags {\n if (flags == null) return MessageFlags.Ephemeral;\n if (typeof flags === \"number\" || typeof flags === \"bigint\") {\n return Number(flags) | MessageFlags.Ephemeral;\n }\n if (Array.isArray(flags)) return [...flags, MessageFlags.Ephemeral] as Flags;\n return [flags, MessageFlags.Ephemeral] as Flags;\n}\n\n/** Normalises spearkit reply input into a discord.js reply payload. */\nexport function normalizeReply(input: ReplyInput): InteractionReplyOptions {\n if (typeof input === \"string\") return { content: input };\n const { ephemeral, ...rest } = input;\n if (ephemeral) return { ...rest, flags: withEphemeralFlag(rest.flags) };\n return rest;\n}\n\nfunction normalizeEdit(input: ReplyInput): InteractionEditReplyOptions {\n if (typeof input === \"string\") return { content: input };\n const { ephemeral: _ephemeral, flags: _flags, ...rest } = input;\n return rest;\n}\n\n/** Marks an input as ephemeral, regardless of how it was passed. */\nexport function asEphemeral(input: ReplyInput): ReplyData {\n if (typeof input === \"string\") return { content: input, ephemeral: true };\n return { ...input, ephemeral: true };\n}\n\n/**\n * Ergonomic base wrapper shared by every interaction context (commands,\n * buttons, selects, modals). Exposes the common actor/location accessors plus\n * reply helpers that smooth over discord.js' state machine.\n */\nexport abstract class BaseContext<I extends RepliableInteraction = RepliableInteraction> {\n constructor(readonly interaction: I) {}\n\n get client(): I[\"client\"] {\n return this.interaction.client;\n }\n get user() {\n return this.interaction.user;\n }\n get member() {\n return this.interaction.member;\n }\n get guild() {\n return this.interaction.guild;\n }\n get guildId() {\n return this.interaction.guildId;\n }\n get channel() {\n return this.interaction.channel;\n }\n get channelId() {\n return this.interaction.channelId;\n }\n get locale() {\n return this.interaction.locale;\n }\n /** Whether the interaction is already deferred. */\n get deferred() {\n return this.interaction.deferred;\n }\n /** Whether the interaction already received an initial response. */\n get replied() {\n return this.interaction.replied;\n }\n\n /** Send the initial response to the interaction. */\n reply(input: ReplyInput): Promise<InteractionResponse<boolean>> {\n return this.interaction.reply(normalizeReply(input));\n }\n\n /** Reply, but always hidden to everyone except the invoking user. */\n replyEphemeral(input: ReplyInput): Promise<InteractionResponse<boolean>> {\n return this.reply(asEphemeral(input));\n }\n\n /** Acknowledge now and respond later via {@link editReply}. */\n defer(options: { ephemeral?: boolean } = {}): Promise<InteractionResponse<boolean>> {\n return this.interaction.deferReply(\n options.ephemeral ? { flags: MessageFlags.Ephemeral } : {},\n );\n }\n\n /** Edit the original (or deferred) response. */\n editReply(input: ReplyInput): Promise<Message> {\n return this.interaction.editReply(normalizeEdit(input));\n }\n\n /** Add an additional message after the initial response. */\n followUp(input: ReplyInput): Promise<Message> {\n return this.interaction.followUp(normalizeReply(input));\n }\n\n /**\n * State-aware send: replies, edits a deferred response, or follows up —\n * whichever is valid given the current interaction state. The single method\n * most handlers ever need.\n */\n async send(input: ReplyInput): Promise<void> {\n if (this.interaction.deferred) {\n await this.editReply(input);\n } else if (this.interaction.replied) {\n await this.followUp(input);\n } else {\n await this.reply(input);\n }\n }\n\n\n /** Get the configured {@link Embeds} factory — `client.embeds` or the default. */\n protected getEmbeds(): Embeds {\n return (this.interaction.client as EmbedHost).embeds ?? defaultEmbeds;\n }\n\n /** State-aware send of a red error embed. Defaults to ephemeral. */\n error(input: EmbedPresetInput, options: { ephemeral?: boolean } = {}): Promise<void> {\n return this.sendPreset(\"error\", input, { ephemeral: options.ephemeral ?? true });\n }\n\n /** State-aware send of a green success embed. */\n success(input: EmbedPresetInput, options: { ephemeral?: boolean } = {}): Promise<void> {\n return this.sendPreset(\"success\", input, options);\n }\n\n /** State-aware send of a blue info embed. */\n info(input: EmbedPresetInput, options: { ephemeral?: boolean } = {}): Promise<void> {\n return this.sendPreset(\"info\", input, options);\n }\n\n /** State-aware send of a yellow warn embed. */\n warn(input: EmbedPresetInput, options: { ephemeral?: boolean } = {}): Promise<void> {\n return this.sendPreset(\"warn\", input, options);\n }\n\n /** Initial-reply variant of {@link error} (always `reply`, never `editReply`/`followUp`). */\n replyError(input: EmbedPresetInput, options: { ephemeral?: boolean } = {}): Promise<InteractionResponse<boolean>> {\n return this.replyPreset(\"error\", input, { ephemeral: options.ephemeral ?? true });\n }\n\n /** Initial-reply variant of {@link success}. */\n replySuccess(input: EmbedPresetInput, options: { ephemeral?: boolean } = {}): Promise<InteractionResponse<boolean>> {\n return this.replyPreset(\"success\", input, options);\n }\n\n /** Initial-reply variant of {@link info}. */\n replyInfo(input: EmbedPresetInput, options: { ephemeral?: boolean } = {}): Promise<InteractionResponse<boolean>> {\n return this.replyPreset(\"info\", input, options);\n }\n\n /** Initial-reply variant of {@link warn}. */\n replyWarn(input: EmbedPresetInput, options: { ephemeral?: boolean } = {}): Promise<InteractionResponse<boolean>> {\n return this.replyPreset(\"warn\", input, options);\n }\n\n private sendPreset(level: EmbedLevel, input: EmbedPresetInput, options: { ephemeral?: boolean }): Promise<void> {\n const embed = this.getEmbeds().build(level, input);\n return this.send({ embeds: [embed], ephemeral: options.ephemeral });\n }\n\n private replyPreset(level: EmbedLevel, input: EmbedPresetInput, options: { ephemeral?: boolean }): Promise<InteractionResponse<boolean>> {\n const embed = this.getEmbeds().build(level, input);\n return this.reply({ embeds: [embed], ephemeral: options.ephemeral });\n }\n}\n","/**\n * Rate-limit commands per user, per role, per guild, per channel or globally.\n *\n * A cooldown is described by a {@link CooldownConfig}: a base `duration`, the\n * `scope` it is keyed on, an `exempt` set (users/roles that never wait) and\n * per-user / per-role `overrides` (different durations for specific ids). Set a\n * default on the client (applies to every command) and/or per command.\n */\n\n/** What a cooldown is bucketed against. Default `\"user\"`. */\nexport type CooldownScope = \"user\" | \"guild\" | \"channel\" | \"global\";\n\n/** Users and roles that bypass a cooldown entirely. */\nexport interface CooldownExemptions {\n /** User ids that never wait. */\n users?: readonly string[];\n /** Role ids whose members never wait. */\n roles?: readonly string[];\n}\n\n/** Per-user and per-role duration overrides (milliseconds; `0` disables). */\nexport interface CooldownOverrides {\n /** `userId -> duration ms`. */\n users?: Readonly<Record<string, number>>;\n /** `roleId -> duration ms`. The most lenient matching role wins. */\n roles?: Readonly<Record<string, number>>;\n}\n\n/** Full cooldown description. */\nexport interface CooldownConfig {\n /** Base cooldown in milliseconds. */\n duration: number;\n /** What the cooldown is keyed on. Default `\"user\"`. */\n scope?: CooldownScope;\n /** Users/roles that bypass the cooldown. */\n exempt?: CooldownExemptions;\n /** Per-user / per-role duration overrides. */\n overrides?: CooldownOverrides;\n /** Message shown when blocked. A function receives the remaining ms. */\n message?: string | ((remainingMs: number) => string);\n}\n\n/** A `CooldownConfig`, or a bare duration in milliseconds. */\nexport type CooldownInput = number | CooldownConfig;\n\n/** Normalise a {@link CooldownInput} to a full {@link CooldownConfig}. */\nexport function normalizeCooldown(input: CooldownInput): CooldownConfig {\n return typeof input === \"number\" ? { duration: input } : input;\n}\n\n/** The actor a cooldown is evaluated for. */\nexport interface CooldownActor {\n userId: string;\n roleIds: readonly string[];\n guildId: string | null;\n channelId: string | null;\n}\n\n/** Whether an action is allowed now, and if not, how long remains. */\nexport type CooldownResult = { allowed: true } | { allowed: false; remaining: number };\n\nfunction scopeKey(scope: CooldownScope, actor: CooldownActor): string {\n switch (scope) {\n case \"guild\":\n return `g:${actor.guildId ?? \"dm\"}`;\n case \"channel\":\n return `c:${actor.channelId ?? \"dm\"}`;\n case \"global\":\n return \"global\";\n case \"user\":\n return `u:${actor.userId}`;\n }\n}\n\n/**\n * Resolve the cooldown an actor should serve. `null` means exempt (no\n * cooldown). Otherwise a duration in milliseconds (which may be `0`).\n */\nexport function effectiveDuration(config: CooldownConfig, actor: CooldownActor): number | null {\n if (config.exempt?.users?.includes(actor.userId) === true) return null;\n if (config.exempt?.roles?.some((roleId) => actor.roleIds.includes(roleId)) === true) return null;\n\n const userOverride = config.overrides?.users?.[actor.userId];\n if (userOverride !== undefined) return userOverride;\n\n const roleOverrides = config.overrides?.roles;\n if (roleOverrides !== undefined) {\n let best: number | undefined;\n for (const roleId of actor.roleIds) {\n const candidate = roleOverrides[roleId];\n if (candidate !== undefined) best = best === undefined ? candidate : Math.min(best, candidate);\n }\n if (best !== undefined) return best;\n }\n\n return config.duration;\n}\n\nfunction keyFor(bucket: string, config: CooldownConfig, actor: CooldownActor): string {\n return `${bucket}|${scopeKey(config.scope ?? \"user\", actor)}`;\n}\n\n/**\n * Tracks last-use timestamps and decides whether an action is allowed.\n * Stateful but dependency-free; one instance is shared on `client.cooldowns`.\n */\nexport class CooldownManager {\n private readonly hits = new Map<string, number>();\n\n /** Number of tracked buckets. */\n get size(): number {\n return this.hits.size;\n }\n\n /**\n * Check whether `actor` may use `bucket`, recording the use when allowed.\n * Exempt actors and non-positive durations are always allowed (no record).\n */\n consume(bucket: string, input: CooldownInput, actor: CooldownActor, now: number = Date.now()): CooldownResult {\n const config = normalizeCooldown(input);\n const duration = effectiveDuration(config, actor);\n if (duration === null || duration <= 0) return { allowed: true };\n const key = keyFor(bucket, config, actor);\n const last = this.hits.get(key);\n if (last !== undefined && now - last < duration) {\n return { allowed: false, remaining: duration - (now - last) };\n }\n this.hits.set(key, now);\n return { allowed: true };\n }\n\n /** Like {@link consume} but never records — a read-only check. */\n peek(bucket: string, input: CooldownInput, actor: CooldownActor, now: number = Date.now()): CooldownResult {\n const config = normalizeCooldown(input);\n const duration = effectiveDuration(config, actor);\n if (duration === null || duration <= 0) return { allowed: true };\n const last = this.hits.get(keyFor(bucket, config, actor));\n if (last !== undefined && now - last < duration) {\n return { allowed: false, remaining: duration - (now - last) };\n }\n return { allowed: true };\n }\n\n /** Clear a single actor's cooldown for a bucket. Returns whether one existed. */\n reset(bucket: string, actor: CooldownActor, scope: CooldownScope = \"user\"): boolean {\n return this.hits.delete(`${bucket}|${scopeKey(scope, actor)}`);\n }\n\n /** Drop every tracked cooldown. */\n clear(): void {\n this.hits.clear();\n }\n}\n\n/** Build the user-facing message for a blocked action. */\nexport function formatCooldownMessage(config: CooldownConfig, remainingMs: number): string {\n if (typeof config.message === \"function\") return config.message(remainingMs);\n if (typeof config.message === \"string\") return config.message;\n const seconds = Math.max(1, Math.ceil(remainingMs / 1000));\n return `You're on cooldown — try again in ${seconds}s.`;\n}\n","/**\n * User- and message-context-menu commands (\"Apps\") as first-class spearkit\n * citizens. The bot studied for spearkit hand-rolls these with raw\n * `ContextMenuCommandBuilder` + manual modal hand-offs and lives them under\n * the slash loader — context menus need their own type, target accessor, and\n * dispatch path, and the deploy payload needs to be merged with slash\n * commands.\n *\n * Use {@link userCommand} / {@link messageCommand} to define one, then\n * register with `client.register(...)`. Cooldowns, guards and usage tracking\n * compose exactly like slash commands.\n */\nimport {\n ApplicationCommandType,\n InteractionContextType,\n MessageFlags,\n PermissionsBitField,\n type Awaitable,\n type LocalizationMap,\n type MessageContextMenuCommandInteraction,\n type PermissionResolvable,\n type RESTPostAPIContextMenuApplicationCommandsJSONBody,\n type UserContextMenuCommandInteraction,\n} from \"discord.js\";\nimport { BaseContext } from \"./context.js\";\nimport {\n normalizeCooldown,\n formatCooldownMessage,\n type CooldownActor,\n type CooldownConfig,\n type CooldownInput,\n type CooldownManager,\n} from \"./cooldown.js\";\nimport { runGuards, type Guard } from \"./guards.js\";\nimport { defaultEmbeds, type Embeds } from \"./embeds.js\";\nimport type { Logger } from \"./logger.js\";\nimport type { UsageEvent } from \"./usage.js\";\n\n/** Metadata accepted by both context-menu kinds. */\ninterface ContextMenuMeta {\n defaultMemberPermissions?: PermissionResolvable | null;\n nsfw?: boolean;\n guildOnly?: boolean;\n nameLocalizations?: LocalizationMap;\n cooldown?: CooldownInput;\n guards?: readonly Guard[];\n}\n\n/** Configuration for {@link userCommand}. */\nexport interface UserCommandConfig<R = void> extends ContextMenuMeta {\n name: string;\n run: (ctx: UserContextMenuContext) => Awaitable<R>;\n}\n\n/** Configuration for {@link messageCommand}. */\nexport interface MessageCommandConfig<R = void> extends ContextMenuMeta {\n name: string;\n run: (ctx: MessageContextMenuContext) => Awaitable<R>;\n}\n/** Common shape for any context-menu command (user or message). */\nexport interface BaseContextMenuCommand {\n readonly name: string;\n readonly cooldown?: CooldownConfig;\n readonly guards?: readonly Guard[];\n toJSON(): RESTPostAPIContextMenuApplicationCommandsJSONBody;\n}\n\n/** A user-target context-menu command. */\nexport interface UserContextMenu extends BaseContextMenuCommand {\n readonly kind: \"userMenu\";\n execute(interaction: UserContextMenuCommandInteraction): Promise<void>;\n}\n\n/** A message-target context-menu command. */\nexport interface MessageContextMenu extends BaseContextMenuCommand {\n readonly kind: \"messageMenu\";\n execute(interaction: MessageContextMenuCommandInteraction): Promise<void>;\n}\n\n/** A registered context-menu command — discriminated by `kind`. */\nexport type ContextMenuCommand = UserContextMenu | MessageContextMenu;\n\n\n/** Handler context for a user-target context menu. */\nexport class UserContextMenuContext extends BaseContext<UserContextMenuCommandInteraction> {\n /** The user the menu was invoked on. */\n get targetUser() {\n return this.interaction.targetUser;\n }\n /** The member version of the target, if available. */\n get targetMember() {\n return this.interaction.targetMember;\n }\n}\n\n/** Handler context for a message-target context menu. */\nexport class MessageContextMenuContext extends BaseContext<MessageContextMenuCommandInteraction> {\n /** The message the menu was invoked on. */\n get targetMessage() {\n return this.interaction.targetMessage;\n }\n}\n\nfunction baseJSON(\n meta: ContextMenuMeta & { name: string },\n type: ApplicationCommandType.User | ApplicationCommandType.Message,\n): RESTPostAPIContextMenuApplicationCommandsJSONBody {\n return {\n type,\n name: meta.name,\n name_localizations: meta.nameLocalizations,\n nsfw: meta.nsfw,\n default_member_permissions:\n meta.defaultMemberPermissions == null\n ? meta.defaultMemberPermissions\n : new PermissionsBitField(meta.defaultMemberPermissions).bitfield.toString(),\n contexts: meta.guildOnly ? [InteractionContextType.Guild] : undefined,\n };\n}\n\n/** Define a user-target (\"Apps → user\") context-menu command. */\nexport function userCommand<R = void>(config: UserCommandConfig<R>): UserContextMenu {\n const cooldown = config.cooldown !== undefined ? normalizeCooldown(config.cooldown) : undefined;\n return {\n kind: \"userMenu\",\n name: config.name,\n cooldown,\n guards: config.guards,\n toJSON: () => baseJSON(config, ApplicationCommandType.User),\n execute: async (interaction) => {\n await config.run(new UserContextMenuContext(interaction));\n },\n };\n}\n\n/** Define a message-target (\"Apps → message\") context-menu command. */\nexport function messageCommand<R = void>(config: MessageCommandConfig<R>): MessageContextMenu {\n const cooldown = config.cooldown !== undefined ? normalizeCooldown(config.cooldown) : undefined;\n return {\n kind: \"messageMenu\",\n name: config.name,\n cooldown,\n guards: config.guards,\n toJSON: () => baseJSON(config, ApplicationCommandType.Message),\n execute: async (interaction) => {\n await config.run(new MessageContextMenuContext(interaction));\n },\n };\n}\n\n/** Holds context-menu commands and routes incoming interactions to them. */\nexport class ContextMenuRegistry {\n private readonly users = new Map<string, UserContextMenu>();\n private readonly messages = new Map<string, MessageContextMenu>();\n private logger?: Logger;\n private cooldowns?: CooldownManager;\n private defaultCooldown?: CooldownConfig;\n private defaultGuards: readonly Guard[] = [];\n private onUsage?: (event: UsageEvent) => void;\n\n /** Register one or more context-menu commands. */\n add(...commands: readonly ContextMenuCommand[]): this {\n for (const command of commands) {\n if (command.kind === \"userMenu\") this.users.set(command.name, command as UserContextMenu);\n else this.messages.set(command.name, command as MessageContextMenu);\n }\n return this;\n }\n\n /** Total number of registered context-menu commands. */\n get size(): number {\n return this.users.size + this.messages.size;\n }\n\n /** Every registered command, both kinds. */\n all(): ContextMenuCommand[] {\n return [...this.users.values(), ...this.messages.values()];\n }\n\n /** Serialise every command for the REST `applicationCommands` PUT body. */\n toJSON(): RESTPostAPIContextMenuApplicationCommandsJSONBody[] {\n return this.all().map((c) => c.toJSON());\n }\n\n setLogger(logger: Logger): this {\n this.logger = logger;\n return this;\n }\n\n setCooldowns(manager: CooldownManager, defaultCooldown?: CooldownConfig): this {\n this.cooldowns = manager;\n this.defaultCooldown = defaultCooldown;\n return this;\n }\n\n setDefaultGuards(guards: readonly Guard[]): this {\n this.defaultGuards = guards;\n return this;\n }\n\n setUsageHook(hook: (event: UsageEvent) => void): this {\n this.onUsage = hook;\n return this;\n }\n\n /** Dispatch a user-target interaction. */\n async handleUser(interaction: UserContextMenuCommandInteraction): Promise<void> {\n const command = this.users.get(interaction.commandName);\n if (command === undefined) return;\n await this.dispatch(command, interaction);\n }\n\n /** Dispatch a message-target interaction. */\n async handleMessage(interaction: MessageContextMenuCommandInteraction): Promise<void> {\n const command = this.messages.get(interaction.commandName);\n if (command === undefined) return;\n await this.dispatch(command, interaction);\n }\n\n private async dispatch(\n command: UserContextMenu | MessageContextMenu,\n interaction: UserContextMenuCommandInteraction | MessageContextMenuCommandInteraction,\n ): Promise<void> {\n this.logger?.debug(\"contextMenu\", {\n data: { kind: command.kind, name: command.name, user: interaction.user.id },\n });\n const cooldown = command.cooldown ?? this.defaultCooldown;\n if (cooldown !== undefined && this.cooldowns !== undefined) {\n const result = this.cooldowns.consume(\n `${command.kind}:${command.name}`,\n cooldown,\n actorOf(interaction),\n );\n if (!result.allowed) {\n await replyCooldown(interaction, cooldown, result.remaining);\n return;\n }\n }\n const guards = combineGuards(this.defaultGuards, command.guards);\n if (guards.length > 0) {\n const guardResult = await runGuards(interaction, guards);\n if (!guardResult.allowed) {\n this.logger?.debug(\"contextMenu denied\", {\n data: { name: command.name, user: interaction.user.id, reason: guardResult.reason ?? \"\" },\n });\n await replyDenied(interaction, guardResult.reason);\n return;\n }\n }\n const start = Date.now();\n try {\n if (command.kind === \"userMenu\") {\n await command.execute(interaction as UserContextMenuCommandInteraction);\n } else {\n await command.execute(interaction as MessageContextMenuCommandInteraction);\n }\n this.onUsage?.({\n type: \"command\",\n name: command.name,\n detail: command.kind,\n outcome: \"success\",\n durationMs: Date.now() - start,\n userId: interaction.user.id,\n userTag: interaction.user.tag,\n guildId: interaction.guildId,\n channelId: interaction.channelId,\n timestamp: new Date(),\n });\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.onUsage?.({\n type: \"command\",\n name: command.name,\n detail: command.kind,\n outcome: \"error\",\n errorMessage: err.message,\n durationMs: Date.now() - start,\n userId: interaction.user.id,\n userTag: interaction.user.tag,\n guildId: interaction.guildId,\n channelId: interaction.channelId,\n timestamp: new Date(),\n });\n interaction.client.emit(\"error\", err);\n try {\n if (!interaction.replied && !interaction.deferred) {\n await interaction.reply({\n content: \"Something went wrong.\",\n flags: MessageFlags.Ephemeral,\n });\n }\n } catch {\n // Interaction likely expired.\n }\n }\n }\n}\n\nfunction combineGuards(defaults: readonly Guard[], own: readonly Guard[] | undefined): readonly Guard[] {\n if (own === undefined || own.length === 0) return defaults;\n if (defaults.length === 0) return own;\n return [...defaults, ...own];\n}\n\nfunction actorOf(\n interaction: UserContextMenuCommandInteraction | MessageContextMenuCommandInteraction,\n): CooldownActor {\n const member = interaction.member;\n let roleIds: readonly string[] = [];\n if (member !== null) {\n const roles = member.roles;\n roleIds = Array.isArray(roles) ? roles : [...roles.cache.keys()];\n }\n return {\n userId: interaction.user.id,\n roleIds,\n guildId: interaction.guildId,\n channelId: interaction.channelId,\n };\n}\n\nfunction clientEmbeds(client: { embeds?: Embeds } | unknown): Embeds {\n return ((client as { embeds?: Embeds }).embeds) ?? defaultEmbeds;\n}\n\nasync function replyCooldown(\n interaction: UserContextMenuCommandInteraction | MessageContextMenuCommandInteraction,\n config: CooldownConfig,\n remaining: number,\n): Promise<void> {\n const content = formatCooldownMessage(config, remaining);\n try {\n if (interaction.deferred) await interaction.editReply({ content });\n else if (interaction.replied) await interaction.followUp({ content, flags: MessageFlags.Ephemeral });\n else await interaction.reply({ content, flags: MessageFlags.Ephemeral });\n } catch {\n // Interaction likely expired.\n }\n}\n\nasync function replyDenied(\n interaction: UserContextMenuCommandInteraction | MessageContextMenuCommandInteraction,\n reason: string | undefined,\n): Promise<void> {\n const embeds = clientEmbeds(interaction.client);\n const text = reason ?? \"You don't have permission to use this.\";\n try {\n const payload = { embeds: [embeds.error(text)], flags: MessageFlags.Ephemeral } as const;\n if (interaction.deferred) await interaction.editReply({ embeds: payload.embeds });\n else if (interaction.replied) await interaction.followUp(payload);\n else await interaction.reply(payload);\n } catch {\n // Interaction likely expired.\n }\n}\n","/**\n * Typed argument parsing for prefix commands.\n *\n * Real bots reimplement the same mention-or-snowflake / ms-duration /\n * \"rest is the reason\" parsing in every prefix command (44+ hand-rolled sites\n * is normal). spearkit lets you declare what you want once and receive a\n * typed `ctx.options` shaped exactly like a slash command's.\n *\n * @example\n * ```ts\n * prefixCommand({\n * name: \"mute\",\n * args: (a) => a.snowflake(\"target\").duration(\"duration\").rest(\"reason\"),\n * run: (ctx) => {\n * ctx.options.target; // string (snowflake id)\n * ctx.options.duration; // number (ms)\n * ctx.options.reason; // string\n * },\n * });\n * ```\n */\nimport { parseDuration } from \"./format.js\";\n\ntype Resolved = {\n string: string;\n integer: number;\n number: number;\n boolean: boolean;\n snowflake: string;\n duration: number;\n rest: string;\n};\n\n/** A single argument's runtime spec; recorded by {@link PrefixArgsBuilder}. */\nexport interface PrefixArgSpec {\n readonly name: string;\n readonly kind: keyof Resolved;\n readonly required: boolean;\n readonly defaultValue?: string | number | boolean;\n}\n\n/** A failed parse, returned by {@link PrefixArgsParser.parse}. */\nexport interface PrefixArgError {\n readonly ok: false;\n readonly arg: string;\n readonly reason: string;\n}\n\n/** A successful parse, returned by {@link PrefixArgsParser.parse}. */\nexport interface PrefixArgsOk<T> {\n readonly ok: true;\n readonly values: T;\n}\n\n/** The compiled parser produced by {@link PrefixArgsBuilder.compile}. */\nexport interface PrefixArgsParser<T> {\n readonly specs: readonly PrefixArgSpec[];\n parse(tokens: readonly string[], rest: string): PrefixArgsOk<T> | PrefixArgError;\n}\n\ntype AddField<TShape, K extends string, T, Req extends boolean> = Req extends true\n ? TShape & { [P in K]: T }\n : TShape & { [P in K]?: T };\n\nconst SNOWFLAKE_RE = /^\\d{15,21}$/;\nconst USER_MENTION_RE = /^<@!?(\\d{15,21})>$/;\nconst CHANNEL_MENTION_RE = /^<#(\\d{15,21})>$/;\nconst ROLE_MENTION_RE = /^<@&(\\d{15,21})>$/;\n\nfunction extractSnowflake(input: string): string | null {\n if (SNOWFLAKE_RE.test(input)) return input;\n const m = USER_MENTION_RE.exec(input) ?? CHANNEL_MENTION_RE.exec(input) ?? ROLE_MENTION_RE.exec(input);\n return m === null ? null : (m[1] ?? null);\n}\n\ninterface BaseOpts {\n /** Mark the arg required. Default `false`. */\n required?: boolean;\n}\n\ninterface StringOpts extends BaseOpts {\n minLength?: number;\n maxLength?: number;\n /** Default value when the token is missing. Makes the arg effectively optional. */\n default?: string;\n}\n\ninterface NumericOpts extends BaseOpts {\n minValue?: number;\n maxValue?: number;\n default?: number;\n}\n\ninterface BooleanOpts extends BaseOpts {\n default?: boolean;\n}\n\ninterface RestOpts extends BaseOpts {\n default?: string;\n}\n\n/**\n * Build a typed argument schema for {@link prefixCommand}. Chain calls\n * positionally — first token → first arg, second → second arg, etc.\n */\nexport class PrefixArgsBuilder<TShape extends Record<string, unknown> = {}> {\n private readonly specs: readonly PrefixArgSpec[];\n\n /** @internal */\n constructor(specs: readonly PrefixArgSpec[] = []) {\n this.specs = specs;\n }\n\n /** A raw string token. */\n string<K extends string, Req extends boolean = false>(\n name: K,\n options?: StringOpts & { required?: Req },\n ): PrefixArgsBuilder<AddField<TShape, K, string, Req>> {\n return this.push({ name, kind: \"string\", required: options?.required ?? false, defaultValue: options?.default });\n }\n\n /** A whole integer. */\n integer<K extends string, Req extends boolean = false>(\n name: K,\n options?: NumericOpts & { required?: Req },\n ): PrefixArgsBuilder<AddField<TShape, K, number, Req>> {\n return this.push({ name, kind: \"integer\", required: options?.required ?? false, defaultValue: options?.default });\n }\n\n /** A floating-point number. */\n number<K extends string, Req extends boolean = false>(\n name: K,\n options?: NumericOpts & { required?: Req },\n ): PrefixArgsBuilder<AddField<TShape, K, number, Req>> {\n return this.push({ name, kind: \"number\", required: options?.required ?? false, defaultValue: options?.default });\n }\n\n /** A boolean (`true`/`yes`/`1`/`on` vs `false`/`no`/`0`/`off`). */\n boolean<K extends string, Req extends boolean = false>(\n name: K,\n options?: BooleanOpts & { required?: Req },\n ): PrefixArgsBuilder<AddField<TShape, K, boolean, Req>> {\n return this.push({ name, kind: \"boolean\", required: options?.required ?? false, defaultValue: options?.default });\n }\n\n /** A Discord snowflake id — accepts raw ids and `<@u>` / `<#c>` / `<@&r>` mentions. */\n snowflake<K extends string, Req extends boolean = false>(\n name: K,\n options?: BaseOpts & { required?: Req; default?: string },\n ): PrefixArgsBuilder<AddField<TShape, K, string, Req>> {\n return this.push({ name, kind: \"snowflake\", required: options?.required ?? false, defaultValue: options?.default });\n }\n\n /** A duration like `\"1h30m\"` or `\"1 saat\"` parsed to milliseconds. */\n duration<K extends string, Req extends boolean = false>(\n name: K,\n options?: BaseOpts & { required?: Req; default?: number },\n ): PrefixArgsBuilder<AddField<TShape, K, number, Req>> {\n return this.push({ name, kind: \"duration\", required: options?.required ?? false, defaultValue: options?.default });\n }\n\n /** The remainder of the message (everything after previous args). */\n rest<K extends string, Req extends boolean = false>(\n name: K,\n options?: RestOpts & { required?: Req },\n ): PrefixArgsBuilder<AddField<TShape, K, string, Req>> {\n return this.push({ name, kind: \"rest\", required: options?.required ?? false, defaultValue: options?.default });\n }\n\n private push<TNew extends Record<string, unknown>>(spec: PrefixArgSpec): PrefixArgsBuilder<TNew> {\n return new PrefixArgsBuilder<TNew>([...this.specs, spec]);\n }\n\n /** Compile this builder into a parser. */\n compile(): PrefixArgsParser<TShape> {\n const specs = this.specs;\n return {\n specs,\n parse(tokens, rest) {\n const out: Record<string, string | number | boolean | undefined> = {};\n let idx = 0;\n for (let i = 0; i < specs.length; i++) {\n const spec = specs[i] as PrefixArgSpec;\n if (spec.kind === \"rest\") {\n const tail = idx === 0 ? rest : tokens.slice(idx).join(\" \");\n if (tail.length === 0) {\n if (spec.required) return { ok: false, arg: spec.name, reason: `missing required argument \"${spec.name}\"` };\n out[spec.name] = spec.defaultValue as string | undefined;\n } else {\n out[spec.name] = tail;\n }\n idx = tokens.length;\n continue;\n }\n const token = tokens[idx];\n if (token === undefined) {\n if (spec.required) {\n return { ok: false, arg: spec.name, reason: `missing required argument \"${spec.name}\"` };\n }\n out[spec.name] = spec.defaultValue;\n continue;\n }\n const parsed = coerce(spec, token);\n if (parsed.ok === false) return { ok: false, arg: spec.name, reason: parsed.reason };\n out[spec.name] = parsed.value;\n idx += 1;\n }\n return { ok: true, values: out as TShape };\n },\n };\n }\n}\n\nfunction coerce(\n spec: PrefixArgSpec,\n token: string,\n): { ok: true; value: string | number | boolean } | { ok: false; reason: string } {\n switch (spec.kind) {\n case \"string\":\n return { ok: true, value: token };\n case \"integer\": {\n const n = Number(token);\n if (!Number.isInteger(n)) return { ok: false, reason: `\"${token}\" is not an integer` };\n return { ok: true, value: n };\n }\n case \"number\": {\n const n = Number(token);\n if (!Number.isFinite(n)) return { ok: false, reason: `\"${token}\" is not a number` };\n return { ok: true, value: n };\n }\n case \"boolean\": {\n const low = token.toLowerCase();\n if ([\"true\", \"1\", \"yes\", \"on\"].includes(low)) return { ok: true, value: true };\n if ([\"false\", \"0\", \"no\", \"off\"].includes(low)) return { ok: true, value: false };\n return { ok: false, reason: `\"${token}\" is not a boolean` };\n }\n case \"snowflake\": {\n const id = extractSnowflake(token);\n if (id === null) return { ok: false, reason: `\"${token}\" is not a snowflake or mention` };\n return { ok: true, value: id };\n }\n case \"duration\": {\n const ms = parseDuration(token);\n if (ms === null) return { ok: false, reason: `\"${token}\" is not a duration` };\n return { ok: true, value: ms };\n }\n default:\n return { ok: false, reason: `unknown arg kind for \"${spec.name}\"` };\n }\n}\n\n/** Start a fresh args builder. Pass to `prefixCommand({ args })`. */\nexport function prefixArgs(): PrefixArgsBuilder<{}> {\n return new PrefixArgsBuilder();\n}\n","/**\n * Paginated embed replies driven by buttons.\n *\n * Real bots reimplement the same {page state, prev/next buttons, user-only\n * filter, disable-on-timeout} dance per command. {@link paginate} handles it:\n * pass an item list and a render function, and you get an interactive,\n * timeout-aware paginator in one call. {@link buildPaginatorPage} exposes the\n * same logic without the collector, for tests or custom flows.\n */\nimport {\n ActionRowBuilder,\n ButtonBuilder,\n ButtonStyle,\n ComponentType,\n type BaseMessageOptions,\n type ButtonInteraction,\n type EmbedBuilder,\n type RepliableInteraction,\n} from \"discord.js\";\n\n/** Result of {@link PaginateOptions.render}: a builder OR a full message payload. */\nexport type PaginateRender =\n | EmbedBuilder\n | readonly EmbedBuilder[]\n | BaseMessageOptions;\n\n/** Options for {@link paginate} / {@link buildPaginatorPage}. */\nexport interface PaginateOptions<T> {\n /** Items per page. Default `10`. */\n pageSize?: number;\n /** Build the body for one page. */\n render: (\n slice: readonly T[],\n state: { page: number; pages: number },\n ) => PaginateRender | Promise<PaginateRender>;\n /** When set, only this user id can click. Defaults to the invoker. */\n user?: string;\n /** Time (ms) before buttons are disabled. Default `5 * 60_000`. */\n timeoutMs?: number;\n /** Custom-id prefix to avoid clashes with other components. Default `\"spk-page\"`. */\n namespace?: string;\n /** Make the initial reply ephemeral. Default `false`. */\n ephemeral?: boolean;\n /** Button labels. Defaults: `‹` Prev / `›` Next / `«` First / `»` Last. */\n labels?: {\n first?: string;\n prev?: string;\n next?: string;\n last?: string;\n };\n /** Which buttons to show. Default `\"prev-next\"`. */\n controls?: \"prev-next\" | \"first-prev-next-last\";\n}\n\nfunction normalisePayload(render: PaginateRender): BaseMessageOptions {\n if (\n typeof (render as EmbedBuilder).setColor === \"function\" &&\n typeof (render as EmbedBuilder).toJSON === \"function\"\n ) {\n return { embeds: [render as EmbedBuilder] };\n }\n if (Array.isArray(render)) {\n return { embeds: render as EmbedBuilder[] };\n }\n return render as BaseMessageOptions;\n}\n\nfunction controlsRow(\n page: number,\n pages: number,\n ns: string,\n controls: \"prev-next\" | \"first-prev-next-last\",\n labels: Required<NonNullable<PaginateOptions<unknown>[\"labels\"]>>,\n): ActionRowBuilder<ButtonBuilder> {\n const buttons: ButtonBuilder[] = [];\n if (controls === \"first-prev-next-last\") {\n buttons.push(\n new ButtonBuilder()\n .setCustomId(`${ns}:first`)\n .setStyle(ButtonStyle.Secondary)\n .setLabel(labels.first)\n .setDisabled(page === 0),\n );\n }\n buttons.push(\n new ButtonBuilder()\n .setCustomId(`${ns}:prev`)\n .setStyle(ButtonStyle.Primary)\n .setLabel(labels.prev)\n .setDisabled(page === 0),\n new ButtonBuilder()\n .setCustomId(`${ns}:next`)\n .setStyle(ButtonStyle.Primary)\n .setLabel(labels.next)\n .setDisabled(page >= pages - 1),\n );\n if (controls === \"first-prev-next-last\") {\n buttons.push(\n new ButtonBuilder()\n .setCustomId(`${ns}:last`)\n .setStyle(ButtonStyle.Secondary)\n .setLabel(labels.last)\n .setDisabled(page >= pages - 1),\n );\n }\n return new ActionRowBuilder<ButtonBuilder>().addComponents(...buttons);\n}\n\nfunction resolveLabels(input: PaginateOptions<unknown>[\"labels\"]): Required<NonNullable<PaginateOptions<unknown>[\"labels\"]>> {\n return {\n first: input?.first ?? \"«\",\n prev: input?.prev ?? \"‹\",\n next: input?.next ?? \"›\",\n last: input?.last ?? \"»\",\n };\n}\n\n/**\n * Build the payload for a single paginator page (embeds + button row), without\n * any interaction or collector wiring. Useful for tests, web previews and\n * custom UIs that want spearkit's slicing/controls but their own send path.\n */\nexport async function buildPaginatorPage<T>(\n items: readonly T[],\n page: number,\n options: PaginateOptions<T>,\n): Promise<{ payload: BaseMessageOptions; pages: number }> {\n const pageSize = options.pageSize ?? 10;\n const pages = Math.max(1, Math.ceil(items.length / pageSize));\n const ns = options.namespace ?? \"spk-page\";\n const controls = options.controls ?? \"prev-next\";\n const labels = resolveLabels(options.labels);\n const slice = items.slice(page * pageSize, page * pageSize + pageSize);\n const body = await options.render(slice, { page, pages });\n const payload = normalisePayload(body);\n const components = pages > 1 ? [controlsRow(page, pages, ns, controls, labels)] : [];\n return { payload: { ...payload, components }, pages };\n}\n\n/**\n * Send an item list across paginated, button-controlled embeds.\n *\n * The first page is replied to {@link interaction} (or `editReply`d when\n * already deferred), then a button-component collector handles prev/next\n * clicks until the timeout fires — at which point the buttons are disabled.\n */\nexport async function paginate<T>(\n interaction: RepliableInteraction,\n items: readonly T[],\n options: PaginateOptions<T>,\n): Promise<void> {\n const pageSize = options.pageSize ?? 10;\n const ns = options.namespace ?? \"spk-page\";\n const controls = options.controls ?? \"prev-next\";\n const labels = resolveLabels(options.labels);\n const allowedUser = options.user ?? interaction.user.id;\n let page = 0;\n\n const buildPage = async (): Promise<{ payload: BaseMessageOptions; pages: number }> => {\n return buildPaginatorPage(items, page, { ...options, pageSize, namespace: ns, controls, labels });\n };\n\n const { payload: initial, pages } = await buildPage();\n const sent = interaction.deferred\n ? await interaction.editReply(initial)\n : (await interaction.reply({\n ...initial,\n flags: options.ephemeral === true ? 64 : undefined,\n } as never),\n await interaction.fetchReply());\n\n if (pages <= 1) return;\n\n const collector = sent.createMessageComponentCollector({\n componentType: ComponentType.Button,\n time: options.timeoutMs ?? 5 * 60_000,\n filter: (i: ButtonInteraction) => i.user.id === allowedUser && i.customId.startsWith(`${ns}:`),\n });\n\n collector.on(\"collect\", async (button) => {\n const action = button.customId.slice(ns.length + 1);\n if (action === \"first\") page = 0;\n else if (action === \"prev\") page = Math.max(0, page - 1);\n else if (action === \"next\") page = Math.min(pages - 1, page + 1);\n else if (action === \"last\") page = pages - 1;\n const next = await buildPage();\n await button.update(next.payload).catch(() => undefined);\n });\n\n collector.on(\"end\", async () => {\n const disabledRow = controlsRow(page, pages, ns, controls, labels);\n for (const c of disabledRow.components) c.setDisabled(true);\n const { payload: final } = await buildPage();\n await interaction.editReply({ ...final, components: [disabledRow] }).catch(() => undefined);\n });\n}\n","/**\n * Yes/no confirmation prompts: a one-line API for the \"are you sure?\" flow\n * Yes/no confirmation prompts: a one-line API for the \"are you sure?\" flow\n * that bots reimplement every time (reaction-based, button-based, or modal).\n *\n * @example\n * ```ts\n * const ok = await confirm(interaction, {\n * body: `Reset **${role.name}** for **${members}** members?`,\n * confirm: { label: \"Reset\", style: \"Danger\" },\n * cancel: { label: \"Cancel\" },\n * timeoutMs: 30_000,\n * });\n * if (!ok.confirmed) return ctx.error(\"Cancelled.\");\n * ```\n */\nimport {\n ActionRowBuilder,\n ButtonBuilder,\n ButtonStyle,\n ComponentType,\n type ButtonInteraction,\n type RepliableInteraction,\n} from \"discord.js\";\nimport { defaultEmbeds, type Embeds } from \"./embeds.js\";\n\n/** Visual style for a confirm/cancel button. */\nexport type ConfirmButtonStyle = \"Primary\" | \"Secondary\" | \"Success\" | \"Danger\";\n\n/** One of the two buttons. */\nexport interface ConfirmButtonOptions {\n /** Visible label. */\n label?: string;\n /** Visual style. */\n style?: ConfirmButtonStyle;\n}\n\n/** Options for {@link confirm}. */\nexport interface ConfirmOptions {\n /** Embed title. */\n title?: string;\n /** Embed body. */\n body: string;\n /** Confirm button config. Defaults: label `\"Confirm\"`, style `\"Success\"`. */\n confirm?: ConfirmButtonOptions;\n /** Cancel button config. Defaults: label `\"Cancel\"`, style `\"Secondary\"`. */\n cancel?: ConfirmButtonOptions;\n /** Only this user id can click. Defaults to the invoker. */\n user?: string;\n /** Time (ms) before the prompt times out as cancelled. Default `30_000`. */\n timeoutMs?: number;\n /** Make the prompt ephemeral. Default `true`. */\n ephemeral?: boolean;\n /** Custom-id prefix to avoid clashes. Default `\"spk-confirm\"`. */\n namespace?: string;\n}\n\n/** Result of {@link confirm}. */\nexport interface ConfirmResult {\n /** Whether the user confirmed (clicked the confirm button before timeout). */\n confirmed: boolean;\n /** How the prompt ended. */\n reason: \"confirm\" | \"cancel\" | \"timeout\";\n /** The triggering button interaction when `reason !== \"timeout\"`. */\n interaction?: ButtonInteraction;\n}\n\nconst STYLE_MAP: Record<ConfirmButtonStyle, ButtonStyle> = {\n Primary: ButtonStyle.Primary,\n Secondary: ButtonStyle.Secondary,\n Success: ButtonStyle.Success,\n Danger: ButtonStyle.Danger,\n};\n\nfunction clientEmbeds(client: { embeds?: Embeds } | unknown): Embeds {\n return ((client as { embeds?: Embeds }).embeds) ?? defaultEmbeds;\n}\n\n/**\n * Show a yes/no confirmation prompt and wait for the user's choice.\n *\n * Resolves once a button is clicked or the timeout fires. The clicked button\n * is automatically acknowledged via `deferUpdate`, and the original message's\n * buttons are disabled. Returns `{ confirmed, reason, interaction? }`.\n */\nexport async function confirm(\n interaction: RepliableInteraction,\n options: ConfirmOptions,\n): Promise<ConfirmResult> {\n const ns = options.namespace ?? \"spk-confirm\";\n const confirmLabel = options.confirm?.label ?? \"Confirm\";\n const cancelLabel = options.cancel?.label ?? \"Cancel\";\n const confirmStyle = STYLE_MAP[options.confirm?.style ?? \"Success\"];\n const cancelStyle = STYLE_MAP[options.cancel?.style ?? \"Secondary\"];\n const user = options.user ?? interaction.user.id;\n const ephemeral = options.ephemeral !== false; // default true\n\n const embeds = clientEmbeds(interaction.client);\n const promptEmbed = embeds.info(\n options.title !== undefined\n ? { title: options.title, description: options.body }\n : options.body,\n );\n\n const row = new ActionRowBuilder<ButtonBuilder>().addComponents(\n new ButtonBuilder().setCustomId(`${ns}:yes`).setLabel(confirmLabel).setStyle(confirmStyle),\n new ButtonBuilder().setCustomId(`${ns}:no`).setLabel(cancelLabel).setStyle(cancelStyle),\n );\n\n const payload = { embeds: [promptEmbed], components: [row] };\n const sent = interaction.deferred\n ? await interaction.editReply(payload)\n : (await interaction.reply({\n ...payload,\n flags: ephemeral ? 64 : undefined,\n } as never),\n await interaction.fetchReply());\n\n return new Promise<ConfirmResult>((resolve) => {\n const collector = sent.createMessageComponentCollector({\n componentType: ComponentType.Button,\n time: options.timeoutMs ?? 30_000,\n max: 1,\n filter: (i: ButtonInteraction) => i.user.id === user && i.customId.startsWith(`${ns}:`),\n });\n\n let outcome: ConfirmResult | null = null;\n\n collector.on(\"collect\", async (button) => {\n const action = button.customId.slice(ns.length + 1);\n outcome = {\n confirmed: action === \"yes\",\n reason: action === \"yes\" ? \"confirm\" : \"cancel\",\n interaction: button,\n };\n await button.deferUpdate().catch(() => undefined);\n });\n\n collector.on(\"end\", async () => {\n // Disable both buttons regardless of outcome.\n for (const c of row.components) c.setDisabled(true);\n await interaction\n .editReply({ embeds: [promptEmbed], components: [row] })\n .catch(() => undefined);\n resolve(outcome ?? { confirmed: false, reason: \"timeout\" });\n });\n });\n}\n","/**\n * A small, dependency-free structured logger used across spearkit so every\n * problem (command/component/event failures, gateway errors, your own code)\n * lands in one consistent, debuggable place.\n *\n * Pluggable transports — the default writes to the console, but you can also\n * stream to a JSONL file ({@link jsonlSink}), POST high-severity entries to a\n * Discord webhook ({@link webhookSink}), or write your own. Setting\n * `transports: [...]` replaces the default; otherwise pass a single `sink`.\n */\nimport { appendFile, mkdir } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\n/** Severity of a log entry, lowest to highest. */\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\n/** A minimum severity to emit, or `\"silent\"` to suppress everything. */\nexport type LogThreshold = LogLevel | \"silent\";\n\n/** A primitive metadata value attached to a log entry. */\nexport type LogValue = string | number | boolean | bigint | null | undefined;\n\n/** Extra context passed alongside a log message. */\nexport interface LogOptions {\n /** An error to attach; the default sink renders its stack. */\n error?: Error;\n /** Structured key/value metadata. */\n data?: Record<string, LogValue>;\n}\n\n/** A fully-resolved record handed to a {@link LogSink}. */\nexport interface LogEntry {\n readonly level: LogLevel;\n readonly message: string;\n readonly scope?: string;\n readonly timestamp: Date;\n readonly error?: Error;\n readonly data?: Readonly<Record<string, LogValue>>;\n}\n\n/** Receives every entry at or above the configured threshold. */\nexport type LogSink = (entry: LogEntry) => void;\n\n/** Construction options for a {@link Logger}. */\nexport interface LoggerOptions {\n /** Minimum level to emit. Default `\"info\"`. */\n level?: LogThreshold;\n /** Single transport — shorthand for `transports: [sink]`. */\n sink?: LogSink;\n /** Multiple transports. If set, takes precedence over `sink`. */\n transports?: readonly LogSink[];\n /** A scope prefix for every entry (e.g. `\"commands\"`). */\n scope?: string;\n}\n\nconst RANK: Record<LogThreshold, number> = {\n debug: 10,\n info: 20,\n warn: 30,\n error: 40,\n silent: Number.POSITIVE_INFINITY,\n};\n\nfunction formatValue(value: LogValue): string {\n return typeof value === \"string\" ? value : String(value);\n}\n\n/** Default sink: human-readable lines to the console (stderr for warn/error). */\nexport function consoleSink(entry: LogEntry): void {\n const scope = entry.scope !== undefined ? ` [${entry.scope}]` : \"\";\n let suffix = \"\";\n if (entry.data !== undefined) {\n const parts = Object.entries(entry.data).map(([k, v]) => `${k}=${formatValue(v)}`);\n if (parts.length > 0) suffix = ` ${parts.join(\" \")}`;\n }\n const line = `${entry.timestamp.toISOString()} ${entry.level.toUpperCase()}${scope} ${entry.message}${suffix}`;\n const write = entry.level === \"warn\" || entry.level === \"error\" ? console.error : console.log;\n write(line);\n if (entry.error !== undefined) write(entry.error.stack ?? String(entry.error));\n}\n\n/**\n * JSON-lines sink: appends one JSON object per entry to `path`. Fire-and-forget;\n * filesystem errors are swallowed so logging never crashes the bot.\n */\nexport function jsonlSink(path: string, options: { minLevel?: LogLevel } = {}): LogSink {\n const min = options.minLevel ?? \"debug\";\n let dirReady = false;\n let chain: Promise<void> = Promise.resolve();\n return (entry) => {\n if (RANK[entry.level] < RANK[min]) return;\n const record = {\n ...entry,\n timestamp: entry.timestamp.toISOString(),\n error: entry.error\n ? { name: entry.error.name, message: entry.error.message, stack: entry.error.stack }\n : undefined,\n };\n const line = `${JSON.stringify(record)}\\n`;\n chain = chain.then(async () => {\n try {\n if (!dirReady) {\n await mkdir(dirname(path), { recursive: true });\n dirReady = true;\n }\n await appendFile(path, line, \"utf8\");\n } catch {\n // Swallow — log file unwritable shouldn't kill the bot.\n }\n });\n };\n}\n\n\n/**\n * Discord-webhook sink: POSTs an embed to a webhook URL for entries at or\n * above `minLevel` (default `\"warn\"`). Useful for sending errors to a private\n * `#bot-errors` channel.\n */\nexport function webhookSink(options: { url: string; minLevel?: LogLevel; username?: string }): LogSink {\n const min = options.minLevel ?? \"warn\";\n return (entry) => {\n if (RANK[entry.level] < RANK[min]) return;\n const color = entry.level === \"error\" ? 0xf04a47 : entry.level === \"warn\" ? 0xf9a825 : 0x3498db;\n const fields: { name: string; value: string; inline?: boolean }[] = [];\n if (entry.scope !== undefined) fields.push({ name: \"Scope\", value: entry.scope, inline: true });\n if (entry.data !== undefined) {\n for (const [k, v] of Object.entries(entry.data)) {\n fields.push({ name: k, value: formatValue(v).slice(0, 1000), inline: true });\n }\n }\n const desc = entry.error?.stack !== undefined\n ? `${entry.message}\\n\\`\\`\\`\\n${entry.error.stack.slice(0, 1800)}\\n\\`\\`\\``\n : entry.message;\n const body = {\n username: options.username ?? \"spearkit\",\n embeds: [\n {\n title: `[${entry.level.toUpperCase()}] ${entry.message.slice(0, 240)}`,\n description: desc.slice(0, 4000),\n color,\n timestamp: entry.timestamp.toISOString(),\n fields: fields.slice(0, 25),\n },\n ],\n };\n void fetch(options.url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(body),\n }).catch(() => undefined);\n };\n}\n\ninterface SharedState {\n threshold: LogThreshold;\n transports: readonly LogSink[];\n}\n\nfunction resolveTransports(options: LoggerOptions): readonly LogSink[] {\n if (options.transports !== undefined && options.transports.length > 0) return options.transports;\n if (options.sink !== undefined) return [options.sink];\n return [consoleSink];\n}\n\n/**\n * A leveled, scoped logger. Create one directly or read `client.logger`.\n * {@link child} loggers share the parent's threshold and transports, so calling\n * {@link setLevel} on any of them affects the whole tree.\n *\n * @example\n * ```ts\n * const log = new Logger({ level: \"debug\", transports: [consoleSink, jsonlSink(\"./logs/bot.jsonl\")] });\n * log.info(\"ready\", { data: { shard: 0 } });\n * log.child(\"commands\").error(\"handler failed\", { error });\n * ```\n */\nexport class Logger {\n private state: SharedState;\n /** The scope prefix applied to every entry, if any. */\n readonly scope?: string;\n\n constructor(options: LoggerOptions = {}) {\n this.state = {\n threshold: options.level ?? \"info\",\n transports: resolveTransports(options),\n };\n this.scope = options.scope;\n }\n\n /** The current minimum threshold. */\n get level(): LogThreshold {\n return this.state.threshold;\n }\n\n /** Change the threshold for this logger and every child sharing its state. */\n setLevel(level: LogThreshold): this {\n this.state.threshold = level;\n return this;\n }\n\n /** Replace the transport list for this logger and every child sharing its state. */\n setTransports(transports: readonly LogSink[]): this {\n this.state.transports = transports;\n return this;\n }\n\n /** Append a transport to the existing list. */\n addTransport(sink: LogSink): this {\n this.state.transports = [...this.state.transports, sink];\n return this;\n }\n\n /** Whether an entry of `level` would currently be emitted. */\n enabled(level: LogLevel): boolean {\n return RANK[level] >= RANK[this.state.threshold];\n }\n\n /** A child logger with an extra scope segment, sharing this logger's state. */\n child(scope: string): Logger {\n const combined = this.scope !== undefined ? `${this.scope}:${scope}` : scope;\n const child = new Logger({ scope: combined });\n child.state = this.state;\n return child;\n }\n\n /** Emit an entry at an explicit level. */\n log(level: LogLevel, message: string, options?: LogOptions): void {\n if (!this.enabled(level)) return;\n const entry: LogEntry = {\n level,\n message,\n scope: this.scope,\n timestamp: new Date(),\n error: options?.error,\n data: options?.data,\n };\n for (const sink of this.state.transports) {\n try {\n sink(entry);\n } catch {\n // Never let a broken transport kill the dispatcher.\n }\n }\n }\n\n /** Verbose diagnostics, off by default. */\n debug(message: string, options?: LogOptions): void {\n this.log(\"debug\", message, options);\n }\n\n /** Normal operational messages. */\n info(message: string, options?: LogOptions): void {\n this.log(\"info\", message, options);\n }\n\n /** Recoverable problems worth attention. */\n warn(message: string, options?: LogOptions): void {\n this.log(\"warn\", message, options);\n }\n\n /** Failures. Attach the cause via `{ error }`. */\n error(message: string, options?: LogOptions): void {\n this.log(\"error\", message, options);\n }\n}\n\n/** Coerce an unknown thrown value into an {@link Error}. */\nexport function toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\n","/**\n * A tiny, dependency-free `.env` loader plus a typed reader for\n * `process.env`. Pulls your existing environment in directly — no `dotenv`\n * package required — and parses values the way `dotenv` does (quotes, `export`\n * prefixes, `#` comments, `\\n` escapes in double quotes).\n */\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n/** The flat key/value map parsed from a `.env` file. */\nexport type ParsedEnv = Record<string, string>;\n\n/** Options for {@link loadEnv}. */\nexport interface LoadEnvOptions {\n /** File to read. Default `.env` in the current working directory. */\n path?: string;\n /** Overwrite variables already present in `process.env`. Default `false`. */\n override?: boolean;\n}\n\nfunction stripInlineComment(value: string): string {\n // A `#` that starts a comment must be preceded by whitespace (or be the\n // whole value); `pass#1` is a literal, `value # note` is not.\n const match = /\\s#/.exec(value);\n return match !== null ? value.slice(0, match.index).trimEnd() : value;\n}\n\nfunction unquote(raw: string): string {\n if (raw.length >= 2) {\n const quote = raw[0];\n if ((quote === '\"' || quote === \"'\") && raw.endsWith(quote)) {\n const inner = raw.slice(1, -1);\n return quote === '\"'\n ? inner.replace(/\\\\n/g, \"\\n\").replace(/\\\\r/g, \"\\r\").replace(/\\\\t/g, \"\\t\")\n : inner;\n }\n }\n return stripInlineComment(raw);\n}\n\n/** Parse `.env`-formatted text into a flat object. Does not touch `process.env`. */\nexport function parseEnv(content: string): ParsedEnv {\n const out: ParsedEnv = {};\n for (const rawLine of content.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (line.length === 0 || line.startsWith(\"#\")) continue;\n const body = line.startsWith(\"export \") ? line.slice(7).trimStart() : line;\n const eq = body.indexOf(\"=\");\n if (eq <= 0) continue;\n const key = body.slice(0, eq).trim();\n if (key.length === 0) continue;\n out[key] = unquote(body.slice(eq + 1).trim());\n }\n return out;\n}\n\n/**\n * Read a `.env` file and merge it into `process.env`. Existing variables win\n * unless `override` is set. Missing files are ignored (returns `{}`), so it is\n * safe to call unconditionally.\n *\n * @returns the parsed key/value pairs from the file.\n */\nexport function loadEnv(options: LoadEnvOptions = {}): ParsedEnv {\n const path = options.path ?? join(process.cwd(), \".env\");\n let content: string;\n try {\n content = readFileSync(path, \"utf8\");\n } catch {\n return {};\n }\n const parsed = parseEnv(content);\n for (const [key, value] of Object.entries(parsed)) {\n if (options.override === true || process.env[key] === undefined) {\n process.env[key] = value;\n }\n }\n return parsed;\n}\n\nconst TRUTHY = new Set([\"true\", \"1\", \"yes\", \"on\"]);\nconst FALSY = new Set([\"false\", \"0\", \"no\", \"off\"]);\n\nfunction read(key: string): string | undefined {\n const value = process.env[key];\n return value !== undefined && value !== \"\" ? value : undefined;\n}\n\nfunction envString(key: string): string | undefined;\nfunction envString(key: string, fallback: string): string;\nfunction envString(key: string, fallback?: string): string | undefined {\n return read(key) ?? fallback;\n}\n\nfunction envNumber(key: string): number | undefined;\nfunction envNumber(key: string, fallback: number): number;\nfunction envNumber(key: string, fallback?: number): number | undefined {\n const value = read(key);\n if (value === undefined) return fallback;\n const parsed = Number(value);\n return Number.isNaN(parsed) ? fallback : parsed;\n}\n\nfunction envBoolean(key: string): boolean | undefined;\nfunction envBoolean(key: string, fallback: boolean): boolean;\nfunction envBoolean(key: string, fallback?: boolean): boolean | undefined {\n const value = read(key)?.toLowerCase();\n if (value === undefined) return fallback;\n if (TRUTHY.has(value)) return true;\n if (FALSY.has(value)) return false;\n return fallback;\n}\n\nfunction envRequire(key: string): string {\n const value = read(key);\n if (value === undefined) {\n throw new Error(`spearkit: required environment variable \"${key}\" is missing or empty`);\n }\n return value;\n}\n\n/** Typed, ergonomic reader over `process.env`. */\nexport interface EnvReader {\n /** A string value (empty strings count as missing), or `undefined`/`fallback`. */\n string(key: string): string | undefined;\n string(key: string, fallback: string): string;\n /** A numeric value, or `undefined`/`fallback` when missing or non-numeric. */\n number(key: string): number | undefined;\n number(key: string, fallback: number): number;\n /** A boolean (`true/1/yes/on` vs `false/0/no/off`), or `undefined`/`fallback`. */\n boolean(key: string): boolean | undefined;\n boolean(key: string, fallback: boolean): boolean;\n /** A string value, throwing if the variable is missing or empty. */\n require(key: string): string;\n}\n\n/**\n * Typed accessor over `process.env`.\n *\n * @example\n * ```ts\n * loadEnv();\n * const token = env.require(\"DISCORD_TOKEN\");\n * const port = env.number(\"PORT\", 3000);\n * const debug = env.boolean(\"DEBUG\", false);\n * ```\n */\nexport const env: EnvReader = {\n string: envString,\n number: envNumber,\n boolean: envBoolean,\n require: envRequire,\n};\n","/**\n * Scheduled tasks: run work on a cron schedule or a fixed interval.\n *\n * Dependency-free. Includes a standard 5-field cron parser (`*`, ranges,\n * lists, steps, `@daily` style aliases) evaluated in local time, plus a\n * {@link TaskScheduler} that the client starts on ready and stops on destroy.\n */\nimport type { Awaitable } from \"discord.js\";\nimport type { SpearClient } from \"./client.js\";\nimport type { Logger } from \"./logger.js\";\nimport { toError } from \"./logger.js\";\n\nconst ALIASES: Record<string, string> = {\n \"@yearly\": \"0 0 1 1 *\",\n \"@annually\": \"0 0 1 1 *\",\n \"@monthly\": \"0 0 1 * *\",\n \"@weekly\": \"0 0 * * 0\",\n \"@daily\": \"0 0 * * *\",\n \"@midnight\": \"0 0 * * *\",\n \"@hourly\": \"0 * * * *\",\n};\n\nfunction parseField(spec: string, min: number, max: number, label: string): Set<number> {\n const set = new Set<number>();\n for (const part of spec.split(\",\")) {\n let range = part;\n let step = 1;\n const slash = part.indexOf(\"/\");\n if (slash >= 0) {\n step = Number(part.slice(slash + 1));\n range = part.slice(0, slash);\n if (!Number.isInteger(step) || step <= 0) {\n throw new Error(`spearkit: invalid step in cron ${label} field \"${part}\"`);\n }\n }\n let lo: number;\n let hi: number;\n if (range === \"*\") {\n lo = min;\n hi = max;\n } else if (range.includes(\"-\")) {\n const dash = range.indexOf(\"-\");\n lo = Number(range.slice(0, dash));\n hi = Number(range.slice(dash + 1));\n } else {\n lo = Number(range);\n hi = lo;\n }\n if (!Number.isInteger(lo) || !Number.isInteger(hi) || lo < min || hi > max || lo > hi) {\n throw new Error(`spearkit: cron ${label} field out of range ${min}-${max}: \"${part}\"`);\n }\n for (let value = lo; value <= hi; value += step) set.add(value);\n }\n return set;\n}\n\n/**\n * A parsed cron expression. Evaluates in the host's local time.\n *\n * @example\n * ```ts\n * cron(\"*\\u200b/5 * * * *\").next(); // next 5-minute boundary\n * cron(\"@daily\").next(new Date()); // next midnight\n * ```\n */\nexport class CronExpression {\n /** The original expression string. */\n readonly source: string;\n private readonly minutes: Set<number>;\n private readonly hours: Set<number>;\n private readonly daysOfMonth: Set<number>;\n private readonly months: Set<number>;\n private readonly daysOfWeek: Set<number>;\n private readonly domRestricted: boolean;\n private readonly dowRestricted: boolean;\n\n constructor(expression: string) {\n const trimmed = expression.trim();\n const normalized = ALIASES[trimmed] ?? trimmed;\n const parts = normalized.split(/\\s+/);\n if (parts.length !== 5) {\n throw new Error(`spearkit: cron expression must have 5 fields, got \"${expression}\"`);\n }\n const [minute, hour, dom, month, dow] = parts;\n if (\n minute === undefined ||\n hour === undefined ||\n dom === undefined ||\n month === undefined ||\n dow === undefined\n ) {\n throw new Error(`spearkit: invalid cron expression \"${expression}\"`);\n }\n this.source = expression;\n this.minutes = parseField(minute, 0, 59, \"minute\");\n this.hours = parseField(hour, 0, 23, \"hour\");\n this.daysOfMonth = parseField(dom, 1, 31, \"day-of-month\");\n this.months = parseField(month, 1, 12, \"month\");\n const weekdays = parseField(dow, 0, 7, \"day-of-week\");\n if (weekdays.has(7)) {\n weekdays.delete(7);\n weekdays.add(0);\n }\n this.daysOfWeek = weekdays;\n this.domRestricted = dom !== \"*\";\n this.dowRestricted = dow !== \"*\";\n }\n\n private dayMatches(date: Date): boolean {\n const dom = this.daysOfMonth.has(date.getDate());\n const dow = this.daysOfWeek.has(date.getDay());\n if (this.domRestricted && this.dowRestricted) return dom || dow;\n if (this.domRestricted) return dom;\n if (this.dowRestricted) return dow;\n return true;\n }\n\n /** The next time strictly after `from` (default now) that matches. */\n next(from: Date = new Date()): Date {\n const date = new Date(from.getTime());\n date.setSeconds(0, 0);\n date.setMinutes(date.getMinutes() + 1);\n for (let guard = 0; guard < 100_000; guard++) {\n if (!this.months.has(date.getMonth() + 1)) {\n date.setMonth(date.getMonth() + 1, 1);\n date.setHours(0, 0, 0, 0);\n continue;\n }\n if (!this.dayMatches(date)) {\n date.setDate(date.getDate() + 1);\n date.setHours(0, 0, 0, 0);\n continue;\n }\n if (!this.hours.has(date.getHours())) {\n date.setHours(date.getHours() + 1, 0, 0, 0);\n continue;\n }\n if (!this.minutes.has(date.getMinutes())) {\n date.setMinutes(date.getMinutes() + 1, 0, 0);\n continue;\n }\n return new Date(date.getTime());\n }\n throw new Error(`spearkit: cron expression \"${this.source}\" has no upcoming match`);\n }\n}\n\n/** Compile a cron expression. Throws on malformed input. */\nexport function cron(expression: string): CronExpression {\n return new CronExpression(expression);\n}\n\n/** Configuration for a scheduled task. Provide exactly one of `cron`/`interval`. */\nexport interface TaskConfig {\n /** Unique task name. */\n name: string;\n /** A cron expression (local time). */\n cron?: string;\n /** A fixed interval in milliseconds. */\n interval?: number;\n /** Also run once immediately when the scheduler starts. Default `false`. */\n runOnStart?: boolean;\n /** The work to perform. */\n run: (client: SpearClient) => Awaitable<void>;\n}\n\n/** A compiled, registrable scheduled task. Build it with {@link task}. */\nexport interface ScheduledTask {\n readonly kind: \"task\";\n readonly name: string;\n readonly interval?: number;\n readonly cron?: CronExpression;\n readonly runOnStart: boolean;\n readonly run: (client: SpearClient) => Awaitable<void>;\n}\n\n/** Define a scheduled task. Throws if neither `cron` nor `interval` is given. */\nexport function task(config: TaskConfig): ScheduledTask {\n if (config.cron === undefined && config.interval === undefined) {\n throw new Error(`spearkit: task \"${config.name}\" needs a cron expression or an interval`);\n }\n if (config.interval !== undefined && config.interval <= 0) {\n throw new Error(`spearkit: task \"${config.name}\" interval must be positive`);\n }\n return {\n kind: \"task\",\n name: config.name,\n interval: config.interval,\n cron: config.cron !== undefined ? new CronExpression(config.cron) : undefined,\n runOnStart: config.runOnStart ?? false,\n run: config.run,\n };\n}\n\nconst MAX_TIMEOUT = 2_147_483_647;\n\n/**\n * Runs {@link ScheduledTask}s. The client owns one as `client.scheduler`,\n * starts it on `clientReady` and stops it on `destroy`. Tasks added while\n * running are scheduled immediately.\n */\nexport class TaskScheduler {\n private readonly tasks = new Map<string, ScheduledTask>();\n private readonly timers = new Map<string, ReturnType<typeof setTimeout>>();\n private running = false;\n private client?: SpearClient;\n private logger?: Logger;\n private readonly reconcilers: { name: string; run: (client: SpearClient) => Awaitable<void> }[] = [];\n\n /** Number of registered tasks. */\n get size(): number {\n return this.tasks.size;\n }\n\n /** Whether the scheduler is currently running. */\n get active(): boolean {\n return this.running;\n }\n\n /** Every registered task. */\n list(): ScheduledTask[] {\n return [...this.tasks.values()];\n }\n\n /** Attach a logger for task error reporting. */\n setLogger(logger: Logger): this {\n this.logger = logger;\n return this;\n }\n\n /** Register one or more tasks. If already running, they are scheduled now. */\n add(...tasks: ScheduledTask[]): this {\n for (const task of tasks) {\n this.tasks.set(task.name, task);\n if (this.running) this.begin(task);\n }\n return this;\n }\n\n /** Remove a task and cancel its timer. */\n remove(name: string): boolean {\n this.cancel(name);\n return this.tasks.delete(name);\n }\n\n /**\n * Schedule a one-shot job: run `fn` once after `ms` milliseconds, then forget.\n * Returns a cancel handle. Replaces hand-rolled `setTimeout` calls for things\n * like \"remind the moderator in 10 minutes if no claim happened\".\n */\n delay(name: string, ms: number, fn: () => Awaitable<void>): { cancel: () => boolean } {\n const key = `delay:${name}`;\n this.cancel(key);\n const timer = setTimeout(async () => {\n this.timers.delete(key);\n try {\n await fn();\n } catch (error) {\n this.logger?.error(`delay \"${name}\" failed`, { error: toError(error) });\n }\n }, Math.max(0, ms));\n if (typeof timer.unref === \"function\") timer.unref();\n this.timers.set(key, timer);\n return {\n cancel: () => {\n const had = this.timers.has(key);\n this.cancel(key);\n return had;\n },\n };\n }\n\n /**\n * Schedule a series of follow-up fires from a single start point. Each\n * delay is measured from \"now\"; the callback receives the index of the\n * fire. Generalises the 10s/30s/60s retry pattern in real bots.\n */\n followUp(\n name: string,\n delays: readonly number[],\n fn: (index: number) => Awaitable<void>,\n ): { cancel: () => boolean } {\n const keys = delays.map((_, i) => `followUp:${name}:${i}`);\n for (const key of keys) this.cancel(key);\n delays.forEach((delay, i) => {\n const key = keys[i] as string;\n const timer = setTimeout(async () => {\n this.timers.delete(key);\n try {\n await fn(i);\n } catch (error) {\n this.logger?.error(`followUp \"${name}\" fire ${i} failed`, { error: toError(error) });\n }\n }, Math.max(0, delay));\n if (typeof timer.unref === \"function\") timer.unref();\n this.timers.set(key, timer);\n });\n return {\n cancel: () => {\n let any = false;\n for (const key of keys) {\n if (this.timers.has(key)) any = true;\n this.cancel(key);\n }\n return any;\n },\n };\n }\n\n /**\n * Register a once-on-ready reconciler — runs the first time the scheduler\n * starts (typically when the client becomes ready) and never again. Use\n * for restart-recovery work like closing orphaned voice sessions or\n * reapplying cached channel state.\n */\n reconcile(name: string, fn: (client: SpearClient) => Awaitable<void>): void {\n if (this.running && this.client !== undefined) {\n void this.runReconciler(name, fn, this.client);\n } else {\n this.reconcilers.push({ name, run: fn });\n }\n }\n\n private async runReconciler(\n name: string,\n run: (client: SpearClient) => Awaitable<void>,\n client: SpearClient,\n ): Promise<void> {\n this.logger?.debug(\"reconcile\", { data: { name } });\n try {\n await run(client);\n } catch (error) {\n this.logger?.error(`reconciler \"${name}\" failed`, { error: toError(error) });\n }\n }\n\n /** Start every task. Safe to call once; later calls are ignored. */\n start(client: SpearClient): void {\n if (this.running) return;\n this.client = client;\n this.running = true;\n for (const task of this.tasks.values()) this.begin(task);\n const pending = this.reconcilers.splice(0);\n for (const { name, run } of pending) void this.runReconciler(name, run, client);\n }\n\n /** Stop the scheduler and cancel every pending timer. */\n stop(): void {\n this.running = false;\n for (const name of [...this.timers.keys()]) this.cancel(name);\n }\n\n private cancel(name: string): void {\n const timer = this.timers.get(name);\n if (timer !== undefined) {\n clearTimeout(timer);\n this.timers.delete(name);\n }\n }\n\n private begin(task: ScheduledTask): void {\n if (task.runOnStart) void this.runTask(task);\n this.scheduleNext(task);\n }\n\n private delayFor(task: ScheduledTask): number {\n if (task.interval !== undefined) return task.interval;\n if (task.cron !== undefined) return Math.max(0, task.cron.next().getTime() - Date.now());\n return MAX_TIMEOUT;\n }\n\n private scheduleNext(task: ScheduledTask): void {\n if (!this.running) return;\n this.arm(task.name, this.delayFor(task), () => {\n void this.runTask(task);\n this.scheduleNext(task);\n });\n }\n\n private arm(name: string, delay: number, fire: () => void): void {\n if (delay > MAX_TIMEOUT) {\n // setTimeout caps at ~24.8 days — chain until the remainder fits.\n const timer = setTimeout(() => this.arm(name, delay - MAX_TIMEOUT, fire), MAX_TIMEOUT);\n if (typeof timer.unref === \"function\") timer.unref();\n this.timers.set(name, timer);\n return;\n }\n const timer = setTimeout(fire, Math.max(0, delay));\n if (typeof timer.unref === \"function\") timer.unref();\n this.timers.set(name, timer);\n }\n\n private async runTask(task: ScheduledTask): Promise<void> {\n if (this.client === undefined) return;\n this.logger?.debug(\"task\", { data: { task: task.name } });\n try {\n await task.run(this.client);\n } catch (error) {\n this.logger?.error(`task \"${task.name}\" failed`, { error: toError(error) });\n }\n }\n}\n","/**\n * Classic text/prefix commands (e.g. `!ping`) alongside slash commands.\n *\n * Reading other users' message content requires the privileged\n * `MessageContent` intent (use `Intents.messages`). The client listens on\n * `messageCreate`, matches a configured prefix (or a bot mention), parses the\n * command name + arguments and dispatches. Cooldowns are shared with slash\n * commands via the same {@link CooldownManager}.\n */\nimport type {\n Awaitable,\n Message,\n MessageCreateOptions,\n MessagePayload,\n MessageReplyOptions,\n} from \"discord.js\";\nimport type { Logger } from \"./logger.js\";\nimport { toError } from \"./logger.js\";\nimport type { UsageEvent } from \"./usage.js\";\nimport { runGuards, type Guard, type GuardContext } from \"./guards.js\";\nimport { defaultEmbeds, type Embeds } from \"./embeds.js\";\nimport { PrefixArgsBuilder, prefixArgs, type PrefixArgsParser } from \"./prefix-args.js\";\nimport {\n formatCooldownMessage,\n normalizeCooldown,\n type CooldownActor,\n type CooldownConfig,\n type CooldownInput,\n type CooldownManager,\n} from \"./cooldown.js\";\n\n/** Options controlling how prefix messages are recognised. */\nexport interface PrefixOptions {\n /** One or more command prefixes (e.g. `\"!\"` or `[\"!\", \"?\"]`). */\n prefix?: string | readonly string[];\n /** Also accept a leading bot mention as a prefix. Default `true`. */\n mention?: boolean;\n /** Ignore messages authored by bots. Default `true`. */\n ignoreBots?: boolean;\n /** Match command names case-insensitively. Default `true`. */\n caseInsensitive?: boolean;\n}\n\n/** Configuration for a prefix command. */\nexport interface PrefixCommandConfig<\n TArgs extends Record<string, unknown> = Record<string, never>,\n R = void,\n> {\n /** Primary command name (the word after the prefix). */\n name: string;\n /** Alternative names that also trigger the command. */\n aliases?: readonly string[];\n /** Human description (for your own help command). */\n description?: string;\n /** Rate-limit this command. A number is a duration in ms. */\n cooldown?: CooldownInput;\n /** Preconditions evaluated before the handler runs. */\n guards?: readonly Guard[];\n /** Typed argument schema; `ctx.options` will be shaped from this. */\n args?: (builder: PrefixArgsBuilder<{}>) => PrefixArgsBuilder<TArgs>;\n /** Handler invoked with a {@link PrefixContext} typed by `args`. */\n run: (ctx: PrefixContext<TArgs>) => Awaitable<R>;\n}\n\n/** A registrable prefix command. Build it with {@link prefixCommand}. */\nexport interface PrefixCommand {\n readonly kind: \"prefixCommand\";\n readonly name: string;\n readonly aliases: readonly string[];\n readonly description?: string;\n readonly cooldown?: CooldownConfig;\n readonly guards?: readonly Guard[];\n readonly parser?: PrefixArgsParser<Record<string, unknown>>;\n readonly run: (ctx: PrefixContext) => Promise<void>;\n}\n\n/** Define a prefix command. */\nexport function prefixCommand<\n TArgs extends Record<string, unknown> = Record<string, never>,\n R = void,\n>(config: PrefixCommandConfig<TArgs, R>): PrefixCommand {\n const parser =\n config.args !== undefined\n ? (config.args(prefixArgs()).compile() as PrefixArgsParser<Record<string, unknown>>)\n : undefined;\n return {\n kind: \"prefixCommand\",\n name: config.name,\n aliases: config.aliases ?? [],\n description: config.description,\n cooldown: config.cooldown !== undefined ? normalizeCooldown(config.cooldown) : undefined,\n guards: config.guards,\n parser,\n run: async (ctx) => {\n await config.run(ctx as PrefixContext<TArgs>);\n },\n };\n}\n\n/** The handler argument for a prefix command: the message plus parsed args. */\nexport class PrefixContext<\n TArgs extends Record<string, unknown> = Record<string, never>,\n> {\n constructor(\n /** The triggering message. */\n readonly message: Message,\n /** The matched command name (as typed). */\n readonly commandName: string,\n /** Whitespace-split arguments after the command name. */\n readonly args: string[],\n /** The raw text after the command name. */\n readonly rest: string,\n /** Typed parsed arguments from `args` schema, or `{}` if none. */\n readonly options: TArgs = {} as TArgs,\n ) {}\n\n get client(): Message[\"client\"] {\n return this.message.client;\n }\n get author() {\n return this.message.author;\n }\n get member() {\n return this.message.member;\n }\n get guild() {\n return this.message.guild;\n }\n get guildId(): string | null {\n return this.message.guildId;\n }\n get channel() {\n return this.message.channel;\n }\n get channelId(): string {\n return this.message.channelId;\n }\n\n /** Reply to the triggering message. */\n reply(content: string | MessagePayload | MessageReplyOptions): Promise<Message> {\n return this.message.reply(content);\n }\n\n /** Send a message to the same channel (no reply reference). */\n async send(content: string | MessagePayload | MessageCreateOptions): Promise<Message | undefined> {\n const channel = this.message.channel;\n if (\"send\" in channel) return channel.send(content);\n return undefined;\n }\n}\n\n/** Error hook invoked when a prefix command handler throws. */\nexport type PrefixErrorHandler = (error: Error, message: Message) => Awaitable<void>;\n\ninterface ResolvedPrefixOptions {\n prefixes: string[];\n mention: boolean;\n ignoreBots: boolean;\n caseInsensitive: boolean;\n}\n\nfunction resolveOptions(input: string | readonly string[] | PrefixOptions): ResolvedPrefixOptions {\n if (typeof input === \"string\") return { prefixes: [input], mention: true, ignoreBots: true, caseInsensitive: true };\n if (Array.isArray(input)) {\n return { prefixes: [...input], mention: true, ignoreBots: true, caseInsensitive: true };\n }\n const options = input as PrefixOptions;\n const prefix = options.prefix ?? [];\n return {\n prefixes: typeof prefix === \"string\" ? [prefix] : [...prefix],\n mention: options.mention ?? true,\n ignoreBots: options.ignoreBots ?? true,\n caseInsensitive: options.caseInsensitive ?? true,\n };\n}\n\nfunction actorFromMessage(message: Message): CooldownActor {\n const member = message.member;\n const roleIds = member !== null ? [...member.roles.cache.keys()] : [];\n return {\n userId: message.author.id,\n roleIds,\n guildId: message.guildId,\n channelId: message.channelId,\n };\n}\n\n/** Holds prefix commands and dispatches matching messages to them. */\nexport class PrefixRegistry {\n private readonly commands = new Map<string, PrefixCommand>();\n private readonly lookup = new Map<string, PrefixCommand>();\n private options: ResolvedPrefixOptions = {\n prefixes: [],\n mention: true,\n ignoreBots: true,\n caseInsensitive: true,\n };\n private logger?: Logger;\n private cooldowns?: CooldownManager;\n private defaultCooldown?: CooldownConfig;\n private errorHandler?: PrefixErrorHandler;\n private defaultGuards: readonly Guard[] = [];\n private onUsage?: (event: UsageEvent) => void;\n\n /** Configure prefixes and matching behaviour. */\n setOptions(input: string | readonly string[] | PrefixOptions): this {\n this.options = resolveOptions(input);\n return this;\n }\n\n /** Attach a logger for dispatch tracing and error reporting. */\n setLogger(logger: Logger): this {\n this.logger = logger;\n return this;\n }\n\n /** Attach a hook called after each successful prefix command run. */\n setUsageHook(hook: (event: UsageEvent) => void): this {\n this.onUsage = hook;\n return this;\n }\n\n /** Share a cooldown manager and an optional default cooldown. */\n setCooldowns(manager: CooldownManager, defaultCooldown?: CooldownConfig): this {\n this.cooldowns = manager;\n this.defaultCooldown = defaultCooldown;\n return this;\n }\n\n /** Guards that run before every prefix command's own guards. */\n setDefaultGuards(guards: readonly Guard[]): this {\n this.defaultGuards = guards;\n return this;\n }\n\n /** Set the handler used when a prefix command throws. */\n onError(handler: PrefixErrorHandler): this {\n this.errorHandler = handler;\n return this;\n }\n\n /** Register one or more prefix commands (and their aliases). */\n add(...commands: PrefixCommand[]): this {\n for (const command of commands) {\n this.commands.set(command.name, command);\n this.index(command.name, command);\n for (const alias of command.aliases) this.index(alias, command);\n }\n return this;\n }\n\n private index(key: string, command: PrefixCommand): void {\n this.lookup.set(this.options.caseInsensitive ? key.toLowerCase() : key, command);\n }\n\n /** Look up a command by name or alias. */\n get(nameOrAlias: string): PrefixCommand | undefined {\n return this.lookup.get(this.options.caseInsensitive ? nameOrAlias.toLowerCase() : nameOrAlias);\n }\n\n /** Number of registered commands (excluding aliases). */\n get size(): number {\n return this.commands.size;\n }\n\n /** Every registered command. */\n list(): PrefixCommand[] {\n return [...this.commands.values()];\n }\n\n /** Strip a matching prefix (or bot mention) from `content`, or return `null`. */\n private stripPrefix(content: string, botId: string | undefined): string | null {\n for (const prefix of this.options.prefixes) {\n if (prefix.length > 0 && content.startsWith(prefix)) return content.slice(prefix.length);\n }\n if (this.options.mention && botId !== undefined) {\n const match = /^<@!?(\\d+)>\\s*/.exec(content);\n if (match !== null && match[1] === botId) return content.slice(match[0].length);\n }\n return null;\n }\n\n /**\n * Parse and dispatch a message. Returns `true` when a command ran (or was\n * blocked by a cooldown), `false` when the message was not a prefix command.\n */\n async handle(message: Message): Promise<boolean> {\n if (this.options.prefixes.length === 0 && !this.options.mention) return false;\n if (this.options.ignoreBots && message.author.bot) return false;\n\n const stripped = this.stripPrefix(message.content, message.client.user?.id);\n if (stripped === null) return false;\n\n const trimmed = stripped.trimStart();\n const match = /^(\\S+)\\s*([\\s\\S]*)$/.exec(trimmed);\n if (match === null) return false;\n const name = match[1] ?? \"\";\n const rest = match[2] ?? \"\";\n const command = this.get(name);\n if (command === undefined) return false;\n\n this.logger?.debug(\"prefix\", { data: { command: command.name, user: message.author.id } });\n\n const cooldown = command.cooldown ?? this.defaultCooldown;\n if (cooldown !== undefined && this.cooldowns !== undefined) {\n const result = this.cooldowns.consume(`prefix:${command.name}`, cooldown, actorFromMessage(message));\n if (!result.allowed) {\n await message.reply(formatCooldownMessage(cooldown, result.remaining)).catch(() => undefined);\n return true;\n }\n }\n const guards = combineGuards(this.defaultGuards, command.guards);\n if (guards.length > 0) {\n const guardCtx = guardContextFromMessage(message);\n const guardResult = await runGuards(guardCtx, guards);\n if (!guardResult.allowed) {\n this.logger?.debug(\"prefix denied\", {\n data: {\n command: command.name,\n user: message.author.id,\n reason: guardResult.reason ?? \"\",\n },\n });\n await replyDeniedMessage(message, guardResult.reason);\n return true;\n }\n }\n\n const args = rest.length > 0 ? rest.split(/\\s+/) : [];\n let options: Record<string, unknown> = {};\n if (command.parser !== undefined) {\n const parsed = command.parser.parse(args, rest);\n if (!parsed.ok) {\n this.logger?.debug(\"prefix arg error\", {\n data: { command: command.name, user: message.author.id, arg: parsed.arg, reason: parsed.reason },\n });\n const embeds = clientEmbeds(message.client);\n await message.reply({ embeds: [embeds.error(`Argument \\`${parsed.arg}\\`: ${parsed.reason}`)] }).catch(() => undefined);\n return true;\n }\n options = parsed.values as Record<string, unknown>;\n }\n const start = Date.now();\n try {\n await command.run(new PrefixContext(message, name, args, rest, options) as PrefixContext);\n this.onUsage?.({\n type: \"prefix\",\n name: command.name,\n outcome: \"success\",\n durationMs: Date.now() - start,\n userId: message.author.id,\n userTag: message.author.tag,\n guildId: message.guildId,\n channelId: message.channelId,\n timestamp: new Date(),\n });\n } catch (error) {\n const err = toError(error);\n this.logger?.error(`prefix command \"${command.name}\" failed`, { error: err });\n this.onUsage?.({\n type: \"prefix\",\n name: command.name,\n outcome: \"error\",\n errorMessage: err.message,\n durationMs: Date.now() - start,\n userId: message.author.id,\n userTag: message.author.tag,\n guildId: message.guildId,\n channelId: message.channelId,\n timestamp: new Date(),\n });\n if (this.errorHandler !== undefined) await this.errorHandler(err, message);\n }\n return true;\n }\n}\n\nfunction combineGuards(defaults: readonly Guard[], own: readonly Guard[] | undefined): readonly Guard[] {\n if (own === undefined || own.length === 0) return defaults;\n if (defaults.length === 0) return own;\n return [...defaults, ...own];\n}\n\nfunction guardContextFromMessage(message: Message): GuardContext {\n return {\n client: message.client,\n user: message.author,\n member: message.member,\n guild: message.guild,\n guildId: message.guildId,\n channelId: message.channelId,\n };\n}\n\nfunction clientEmbeds(client: { embeds?: Embeds } | unknown): Embeds {\n return ((client as { embeds?: Embeds }).embeds) ?? defaultEmbeds;\n}\n\nasync function replyDeniedMessage(message: Message, reason: string | undefined): Promise<void> {\n const embeds = clientEmbeds(message.client);\n const text = reason ?? \"You don't have permission to use this.\";\n await message.reply({ embeds: [embeds.error(text)] }).catch(() => undefined);\n}","/**\n * Usage tracking — record *who used what*. Two independent sinks:\n *\n * - a {@link UsageStore} (a database) that persists every use, and\n * - a Discord-channel reporter that posts a human-readable line per use.\n *\n * This is deliberately separate from the {@link Logger}: the logger is for\n * problems/diagnostics, this is an audit trail of command/component usage that\n * you can keep in a store and/or mirror into a channel.\n */\nimport { appendFile, mkdir, readFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { Awaitable } from \"discord.js\";\nimport type { SpearClient } from \"./client.js\";\nimport type { Logger } from \"./logger.js\";\nimport { toError } from \"./logger.js\";\n\n/** What kind of interaction was used. */\nexport type UsageType = \"command\" | \"prefix\" | \"component\" | \"event\";\n\n/** Outcome of a tracked use — `\"success\"` if the handler returned without throwing. */\nexport type UsageOutcome = \"success\" | \"error\";\n\n/** A primitive metadata value attached to a usage event. */\nexport type UsageMetaValue = string | number | boolean | null;\n\n/** A single recorded use. */\nexport interface UsageEvent {\n readonly type: UsageType;\n /** Command/component name (or event name). */\n readonly name: string;\n readonly userId?: string;\n readonly userTag?: string;\n readonly guildId?: string | null;\n readonly channelId?: string | null;\n /** Free-form extra detail. */\n readonly detail?: string;\n readonly timestamp: Date;\n /** Outcome of the handler — `\"success\"` or `\"error\"`. */\n readonly outcome?: UsageOutcome;\n /** Wall-clock duration of the handler in milliseconds. */\n readonly durationMs?: number;\n /** Snapshot of the typed options the handler ran with. */\n readonly options?: Readonly<Record<string, UsageMetaValue>>;\n /** Error message if `outcome === \"error\"`. */\n readonly errorMessage?: string;\n}\n\n/** A pluggable persistence backend for {@link UsageEvent}s. */\nexport interface UsageStore {\n /** Persist one event. */\n record(event: UsageEvent): Awaitable<void>;\n /** Read every persisted event. */\n all(): Awaitable<readonly UsageEvent[]>;\n}\n\n/** In-memory store; great for tests and dashboards. Optionally capped. */\nexport class MemoryUsageStore implements UsageStore {\n private readonly events: UsageEvent[] = [];\n\n constructor(private readonly limit: number = Number.POSITIVE_INFINITY) {}\n\n record(event: UsageEvent): void {\n this.events.push(event);\n if (this.events.length > this.limit) this.events.splice(0, this.events.length - this.limit);\n }\n\n all(): readonly UsageEvent[] {\n return this.events;\n }\n\n /** Total recorded events. */\n get size(): number {\n return this.events.length;\n }\n\n /** Events recorded for a given user id. */\n byUser(userId: string): UsageEvent[] {\n return this.events.filter((event) => event.userId === userId);\n }\n\n /** Forget everything. */\n clear(): void {\n this.events.length = 0;\n }\n}\n\ninterface SerializedEvent {\n type: UsageType;\n name: string;\n userId?: string;\n userTag?: string;\n guildId?: string | null;\n channelId?: string | null;\n detail?: string;\n timestamp: string;\n}\n\n/**\n * File-backed store using newline-delimited JSON (`.jsonl`). Appends one line\n * per event — durable, human-inspectable, and dependency-free.\n */\nexport class JsonFileUsageStore implements UsageStore {\n constructor(private readonly path: string) {}\n\n async record(event: UsageEvent): Promise<void> {\n const line = `${JSON.stringify({ ...event, timestamp: event.timestamp.toISOString() })}\\n`;\n await mkdir(dirname(this.path), { recursive: true });\n await appendFile(this.path, line, \"utf8\");\n }\n\n async all(): Promise<readonly UsageEvent[]> {\n let content: string;\n try {\n content = await readFile(this.path, \"utf8\");\n } catch {\n return [];\n }\n const events: UsageEvent[] = [];\n for (const line of content.split(\"\\n\")) {\n if (line.trim().length === 0) continue;\n const parsed = JSON.parse(line) as SerializedEvent;\n events.push({ ...parsed, timestamp: new Date(parsed.timestamp) });\n }\n return events;\n }\n}\n\n/** Default one-line rendering of a usage event for a Discord channel. */\nexport function formatUsage(event: UsageEvent): string {\n const who = event.userTag ?? (event.userId !== undefined ? `<@${event.userId}>` : \"unknown\");\n const where =\n event.channelId !== undefined && event.channelId !== null ? ` in <#${event.channelId}>` : \"\";\n const detail = event.detail !== undefined ? ` — ${event.detail}` : \"\";\n return `\\`${event.type}\\` **${event.name}** by ${who}${where}${detail}`;\n}\n\n/** Client-level usage configuration (the `usage` option). */\nexport interface UsageOptions {\n /** Persist events to this store (a database). */\n store?: UsageStore;\n /** Mirror events into this Discord channel id. */\n channel?: string;\n /** Custom channel-line formatter. */\n format?: (event: UsageEvent) => string;\n}\ninterface Reporter {\n channelId: string;\n format: (event: UsageEvent) => string;\n}\n\n/**\n * Routes each {@link UsageEvent} to a store and/or a Discord channel. The\n * client owns one as `client.usage`. Tracking is fire-and-forget: a slow store\n * or channel never blocks command handling, and failures are logged.\n */\nexport class UsageTracker {\n /** The configured store, if any. Directly queryable. */\n store?: UsageStore;\n private reporter?: Reporter;\n private client?: SpearClient;\n private logger?: Logger;\n\n /** Whether anything will happen on {@link track}. */\n get enabled(): boolean {\n return this.store !== undefined || this.reporter !== undefined;\n }\n\n /** @internal Used by the client to resolve report channels. */\n setClient(client: SpearClient): this {\n this.client = client;\n return this;\n }\n\n setLogger(logger: Logger): this {\n this.logger = logger;\n return this;\n }\n\n /** Persist events to a store (a database). */\n setStore(store: UsageStore): this {\n this.store = store;\n return this;\n }\n\n /** Mirror events into a Discord channel. */\n reportTo(channelId: string, format: (event: UsageEvent) => string = formatUsage): this {\n this.reporter = { channelId, format };\n return this;\n }\n\n /** Record a use. Returns immediately; storing/reporting happen in the background. */\n track(event: UsageEvent): void {\n if (!this.enabled) return;\n void this.run(event);\n }\n\n private async run(event: UsageEvent): Promise<void> {\n if (this.store !== undefined) {\n try {\n await this.store.record(event);\n } catch (error) {\n this.logger?.error(\"usage store failed\", { error: toError(error) });\n }\n }\n if (this.reporter !== undefined && this.client !== undefined) {\n try {\n const cache = this.client.channels.cache.get(this.reporter.channelId);\n const channel = cache ?? (await this.client.channels.fetch(this.reporter.channelId));\n if (channel !== null && \"send\" in channel) {\n await channel.send(this.reporter.format(event));\n }\n } catch (error) {\n this.logger?.error(\"usage report failed\", { error: toError(error) });\n }\n }\n }\n}\n","import {\n ApplicationCommandOptionType,\n type APIApplicationCommandBasicOption,\n type APIApplicationCommandChannelOption,\n type APIApplicationCommandOptionChoice,\n type Attachment,\n type Awaitable,\n type ChatInputCommandInteraction,\n type CommandInteractionOption,\n type LocalizationMap,\n} from \"discord.js\";\nimport type { AutocompleteContext } from \"./context.js\";\n\n/**\n * Resolved runtime value types, derived directly from discord.js' option\n * resolver so spearkit stays exactly in lockstep with the underlying getters.\n */\ntype Opt = CommandInteractionOption;\ntype UserValue = NonNullable<Opt[\"user\"]>;\ntype ChannelValue = NonNullable<Opt[\"channel\"]>;\ntype RoleValue = NonNullable<Opt[\"role\"]>;\ntype MentionableValue = NonNullable<Opt[\"user\" | \"role\" | \"member\"]>;\ntype AttachmentValue = Attachment;\n\n/** The discord-allowed channel types for a channel option. */\nexport type AllowedChannelType = NonNullable<APIApplicationCommandChannelOption[\"channel_types\"]>[number];\n\n/** The reader surface spearkit needs off a chat-input interaction. */\ntype OptionReader = ChatInputCommandInteraction[\"options\"];\n\n/** The closed set of values a slash option can resolve to. */\nexport type OptionValue =\n | string\n | number\n | boolean\n | UserValue\n | ChannelValue\n | RoleValue\n | MentionableValue\n | AttachmentValue;\n\n/** A single choice for string/integer/number options. */\nexport interface OptionChoice<V extends string | number = string | number> {\n readonly name: string;\n readonly value: V;\n readonly nameLocalizations?: LocalizationMap;\n}\n\n/** Provides autocomplete suggestions for an option as the user types. */\nexport type AutocompleteHandler<V extends string | number = string | number> = (\n ctx: AutocompleteContext,\n) => Awaitable<OptionChoice<V>[]>;\n\n/**\n * A fully-described slash command option. The two type parameters are phantom\n * markers used purely for compile-time inference of the resolved value:\n * - `TValue` is the type produced for the command handler.\n * - `TRequired` controls nullability (`true` => value, `false` => `| undefined`).\n */\nexport interface OptionDef<TValue extends OptionValue, TRequired extends boolean> {\n readonly type: ApplicationCommandOptionType;\n readonly description: string;\n readonly required: TRequired;\n readonly choices?: readonly OptionChoice[];\n readonly minValue?: number;\n readonly maxValue?: number;\n readonly minLength?: number;\n readonly maxLength?: number;\n readonly channelTypes?: readonly AllowedChannelType[];\n readonly autocomplete?: AutocompleteHandler;\n readonly nameLocalizations?: LocalizationMap;\n readonly descriptionLocalizations?: LocalizationMap;\n /** Phantom-only marker. Never populated at runtime. */\n readonly __value?: TValue;\n}\n\n/** Any option definition, regardless of value/required type. */\nexport type AnyOptionDef = OptionDef<OptionValue, boolean>;\n\n/** A map of option name => definition. */\nexport type OptionMap = Record<string, AnyOptionDef>;\n\n/** Maps an {@link OptionDef} to the value passed into the command handler. */\nexport type ResolvedOption<O extends AnyOptionDef> = O extends OptionDef<infer V, infer Req>\n ? Req extends true\n ? V\n : V | undefined\n : never;\n\n/** Resolves a whole {@link OptionMap} into the handler's `options` object. */\nexport type ResolvedOptions<O extends OptionMap> = {\n [K in keyof O]: ResolvedOption<O[K]>;\n};\n\n// --- builder config shapes -------------------------------------------------\n\ninterface BaseConfig {\n readonly description: string;\n readonly required?: boolean;\n readonly nameLocalizations?: LocalizationMap;\n readonly descriptionLocalizations?: LocalizationMap;\n}\n\ntype IsRequired<C extends BaseConfig> = C[\"required\"] extends true ? true : false;\n\ninterface StringConfig extends BaseConfig {\n readonly choices?: readonly OptionChoice<string>[];\n readonly minLength?: number;\n readonly maxLength?: number;\n readonly autocomplete?: AutocompleteHandler<string>;\n}\n\ninterface NumericConfig extends BaseConfig {\n readonly choices?: readonly OptionChoice<number>[];\n readonly minValue?: number;\n readonly maxValue?: number;\n readonly autocomplete?: AutocompleteHandler<number>;\n}\n\ninterface ChannelConfig extends BaseConfig {\n readonly channelTypes?: readonly AllowedChannelType[];\n}\n\ntype ChoiceValue<C, Fallback extends string | number> = C extends {\n readonly choices: readonly { value: infer V }[];\n}\n ? [V] extends [string | number]\n ? V\n : Fallback\n : Fallback;\n\n/**\n * The single boundary assertion in the option system: the runtime `required`\n * value is a wide `boolean`, but the public type narrows it to the literal the\n * caller supplied. Centralised so every builder stays otherwise cast-free.\n */\nfunction makeOption<TValue extends OptionValue, C extends BaseConfig>(\n type: ApplicationCommandOptionType,\n config: C,\n): OptionDef<TValue, IsRequired<C>> {\n return { type, ...config, required: (config.required ?? false) as IsRequired<C> };\n}\n\n/**\n * Type-safe slash command option builders.\n *\n * @example\n * ```ts\n * options: {\n * target: option.user({ description: \"Who to greet\", required: true }),\n * loud: option.boolean({ description: \"Shout it\" }),\n * }\n * ```\n */\nexport const option = {\n string<const C extends StringConfig>(config: C): OptionDef<ChoiceValue<C, string>, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.String, config);\n },\n integer<const C extends NumericConfig>(config: C): OptionDef<ChoiceValue<C, number>, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.Integer, config);\n },\n number<const C extends NumericConfig>(config: C): OptionDef<ChoiceValue<C, number>, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.Number, config);\n },\n boolean<const C extends BaseConfig>(config: C): OptionDef<boolean, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.Boolean, config);\n },\n user<const C extends BaseConfig>(config: C): OptionDef<UserValue, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.User, config);\n },\n channel<const C extends ChannelConfig>(config: C): OptionDef<ChannelValue, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.Channel, config);\n },\n role<const C extends BaseConfig>(config: C): OptionDef<RoleValue, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.Role, config);\n },\n mentionable<const C extends BaseConfig>(config: C): OptionDef<MentionableValue, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.Mentionable, config);\n },\n attachment<const C extends BaseConfig>(config: C): OptionDef<AttachmentValue, IsRequired<C>> {\n return makeOption(ApplicationCommandOptionType.Attachment, config);\n },\n} as const;\n\nfunction mapChoices<V extends string | number>(\n choices: readonly OptionChoice[] | undefined,\n): APIApplicationCommandOptionChoice<V>[] | undefined {\n return choices?.map((c) => ({\n name: c.name,\n value: c.value as V,\n name_localizations: c.nameLocalizations,\n }));\n}\n\n/** Converts a spearkit option definition into the discord REST option payload. */\nexport function toAPIOption(name: string, def: AnyOptionDef): APIApplicationCommandBasicOption {\n const shared = {\n name,\n description: def.description,\n required: def.required,\n name_localizations: def.nameLocalizations,\n description_localizations: def.descriptionLocalizations,\n };\n\n switch (def.type) {\n case ApplicationCommandOptionType.String: {\n const base = { ...shared, min_length: def.minLength, max_length: def.maxLength };\n return def.autocomplete !== undefined\n ? { ...base, type: ApplicationCommandOptionType.String, autocomplete: true }\n : { ...base, type: ApplicationCommandOptionType.String, choices: mapChoices<string>(def.choices) };\n }\n case ApplicationCommandOptionType.Integer: {\n const base = { ...shared, min_value: def.minValue, max_value: def.maxValue };\n return def.autocomplete !== undefined\n ? { ...base, type: ApplicationCommandOptionType.Integer, autocomplete: true }\n : { ...base, type: ApplicationCommandOptionType.Integer, choices: mapChoices<number>(def.choices) };\n }\n case ApplicationCommandOptionType.Number: {\n const base = { ...shared, min_value: def.minValue, max_value: def.maxValue };\n return def.autocomplete !== undefined\n ? { ...base, type: ApplicationCommandOptionType.Number, autocomplete: true }\n : { ...base, type: ApplicationCommandOptionType.Number, choices: mapChoices<number>(def.choices) };\n }\n case ApplicationCommandOptionType.Channel:\n return {\n ...shared,\n type: ApplicationCommandOptionType.Channel,\n channel_types: def.channelTypes ? [...def.channelTypes] : undefined,\n };\n case ApplicationCommandOptionType.User:\n return { ...shared, type: ApplicationCommandOptionType.User };\n case ApplicationCommandOptionType.Boolean:\n return { ...shared, type: ApplicationCommandOptionType.Boolean };\n case ApplicationCommandOptionType.Role:\n return { ...shared, type: ApplicationCommandOptionType.Role };\n case ApplicationCommandOptionType.Mentionable:\n return { ...shared, type: ApplicationCommandOptionType.Mentionable };\n case ApplicationCommandOptionType.Attachment:\n return { ...shared, type: ApplicationCommandOptionType.Attachment };\n default:\n return { ...shared, type: ApplicationCommandOptionType.String };\n }\n}\n\n/** Reads a resolved option value off a discord.js option resolver. */\nexport function readOption(\n resolver: OptionReader,\n name: string,\n def: AnyOptionDef,\n): OptionValue | undefined {\n switch (def.type) {\n case ApplicationCommandOptionType.String:\n return resolver.getString(name) ?? undefined;\n case ApplicationCommandOptionType.Integer:\n return resolver.getInteger(name) ?? undefined;\n case ApplicationCommandOptionType.Number:\n return resolver.getNumber(name) ?? undefined;\n case ApplicationCommandOptionType.Boolean:\n return resolver.getBoolean(name) ?? undefined;\n case ApplicationCommandOptionType.User:\n return resolver.getUser(name) ?? undefined;\n case ApplicationCommandOptionType.Channel:\n return resolver.getChannel(name) ?? undefined;\n case ApplicationCommandOptionType.Role:\n return resolver.getRole(name) ?? undefined;\n case ApplicationCommandOptionType.Mentionable:\n return resolver.getMentionable(name) ?? undefined;\n case ApplicationCommandOptionType.Attachment:\n return resolver.getAttachment(name) ?? undefined;\n default:\n return undefined;\n }\n}\n\n/** True if any option in the map declares an autocomplete handler. */\nexport function optionsHaveAutocomplete(options: OptionMap): boolean {\n for (const def of Object.values(options)) {\n if (def.autocomplete !== undefined) return true;\n }\n return false;\n}\n","import type {\n AutocompleteInteraction,\n ChatInputCommandInteraction,\n JSONEncodable,\n ModalComponentData,\n ModalBuilder,\n APIModalInteractionResponseCallbackData,\n} from \"discord.js\";\nimport { BaseContext } from \"../context.js\";\nimport type { OptionChoice, OptionMap, ResolvedOptions } from \"./options.js\";\n\n/**\n * The handler argument for a slash command. Wraps the discord.js interaction\n * and exposes the resolved, fully-typed {@link options}.\n */\nexport class CommandContext<O extends OptionMap = OptionMap> extends BaseContext<ChatInputCommandInteraction> {\n constructor(\n interaction: ChatInputCommandInteraction,\n /** Resolved option values, typed from the command's `options` map. */\n readonly options: ResolvedOptions<O>,\n ) {\n super(interaction);\n }\n\n get commandName(): string {\n return this.interaction.commandName;\n }\n\n /** The invoked subcommand name, if any. */\n get subcommand(): string | null {\n return this.interaction.options.getSubcommand(false);\n }\n\n /** Present a modal to the user in response to this command. */\n async showModal(\n modal: JSONEncodable<APIModalInteractionResponseCallbackData> | ModalComponentData | ModalBuilder,\n ): Promise<void> {\n await this.interaction.showModal(modal);\n }\n}\n\n/**\n * The handler argument for autocomplete requests. Provides the focused value\n * and a typed {@link respond} helper.\n */\nexport class AutocompleteContext {\n constructor(readonly interaction: AutocompleteInteraction) {}\n\n get client() {\n return this.interaction.client;\n }\n get user() {\n return this.interaction.user;\n }\n get guild() {\n return this.interaction.guild;\n }\n get guildId() {\n return this.interaction.guildId;\n }\n get commandName(): string {\n return this.interaction.commandName;\n }\n\n /** Name of the option currently being completed. */\n get focusedName(): string {\n return this.interaction.options.getFocused(true).name;\n }\n\n /** Current partial value typed by the user. */\n get value(): string {\n return this.interaction.options.getFocused();\n }\n\n /** Send autocomplete suggestions (capped at the discord limit of 25). */\n respond(choices: OptionChoice<string | number>[]): Promise<void> {\n return this.interaction.respond(\n choices.slice(0, 25).map((c) => ({\n name: c.name,\n value: c.value,\n name_localizations: c.nameLocalizations,\n })),\n );\n }\n}\n","import {\n ApplicationCommandOptionType,\n ApplicationCommandType,\n InteractionContextType,\n PermissionsBitField,\n type APIApplicationCommandSubcommandGroupOption,\n type APIApplicationCommandSubcommandOption,\n type AutocompleteInteraction,\n type Awaitable,\n type ChatInputCommandInteraction,\n type LocalizationMap,\n type PermissionResolvable,\n type RESTPostAPIChatInputApplicationCommandsJSONBody,\n} from \"discord.js\";\nimport { AutocompleteContext, CommandContext } from \"./context.js\";\nimport {\n optionsHaveAutocomplete,\n readOption,\n toAPIOption,\n type OptionMap,\n type OptionValue,\n type ResolvedOptions,\n} from \"./options.js\";\nimport { normalizeCooldown, type CooldownConfig, type CooldownInput } from \"../cooldown.js\";\nimport type { Guard } from \"../guards.js\";\n\n/** Metadata shared by every kind of command. */\ninterface CommonMeta {\n /** Permissions a member must have by default to see/use the command. */\n defaultMemberPermissions?: PermissionResolvable | null;\n /** Mark the command NSFW (age-restricted). */\n nsfw?: boolean;\n /** Restrict invocation to guilds only. */\n guildOnly?: boolean;\n nameLocalizations?: LocalizationMap;\n descriptionLocalizations?: LocalizationMap;\n /** Rate-limit this command. A number is a duration in ms; see {@link CooldownConfig}. */\n cooldown?: CooldownInput;\n /** Preconditions evaluated before the handler runs. */\n guards?: readonly Guard[];\n}\n\n/** Configuration for a leaf (non-subcommand) slash command. */\nexport interface CommandConfig<O extends OptionMap, R> extends CommonMeta {\n name: string;\n description: string;\n options?: O;\n run: (ctx: CommandContext<O>) => Awaitable<R>;\n}\n\n/** Configuration for one subcommand. */\nexport interface SubcommandConfig<O extends OptionMap, R> {\n description: string;\n options?: O;\n nameLocalizations?: LocalizationMap;\n descriptionLocalizations?: LocalizationMap;\n run: (ctx: CommandContext<O>) => Awaitable<R>;\n}\n\n/** A type-erased, ready-to-run subcommand created with {@link subcommand}. */\nexport interface Subcommand {\n readonly kind: \"subcommand\";\n readonly description: string;\n readonly options: OptionMap;\n readonly nameLocalizations?: LocalizationMap;\n readonly descriptionLocalizations?: LocalizationMap;\n readonly hasAutocomplete: boolean;\n readonly execute: (interaction: ChatInputCommandInteraction) => Promise<void>;\n readonly autocomplete: (interaction: AutocompleteInteraction) => Promise<void>;\n}\n\n/** Configuration for a subcommand group (a folder of subcommands). */\nexport interface SubcommandGroupConfig {\n description: string;\n subcommands: Record<string, Subcommand>;\n nameLocalizations?: LocalizationMap;\n descriptionLocalizations?: LocalizationMap;\n}\n\n/** A subcommand group created with {@link subcommandGroup}. */\nexport interface SubcommandGroup extends SubcommandGroupConfig {\n readonly kind: \"group\";\n}\n\n/** Configuration for a command that contains subcommands and/or groups. */\nexport interface CommandGroupConfig extends CommonMeta {\n name: string;\n description: string;\n subcommands?: Record<string, Subcommand>;\n groups?: Record<string, SubcommandGroup>;\n}\n\n/** Everything {@link SlashCommand} needs, pre-built by the factories. */\ninterface SlashCommandSpec {\n name: string;\n json: RESTPostAPIChatInputApplicationCommandsJSONBody;\n hasAutocomplete: boolean;\n executor: (interaction: ChatInputCommandInteraction) => Promise<void>;\n autocompleter: (interaction: AutocompleteInteraction) => Promise<void>;\n cooldown?: CooldownConfig;\n guards?: readonly Guard[];\n}\n\n/**\n * A registered slash command. Serialises itself for the discord REST API and\n * executes its matching interactions. Construct via {@link command} or\n * {@link commandGroup} rather than directly.\n */\nexport class SlashCommand {\n /** The top-level command name (used as the registry lookup key). */\n readonly name: string;\n /** Whether any option declares an autocomplete handler. */\n readonly hasAutocomplete: boolean;\n private readonly json: RESTPostAPIChatInputApplicationCommandsJSONBody;\n private readonly executor: (interaction: ChatInputCommandInteraction) => Promise<void>;\n private readonly autocompleter: (interaction: AutocompleteInteraction) => Promise<void>;\n /** Resolved cooldown configuration for this command, if any. */\n readonly cooldown?: CooldownConfig;\n /** Resolved guard list for this command, if any. */\n readonly guards?: readonly Guard[];\n\n /** @internal */\n constructor(spec: SlashCommandSpec) {\n this.name = spec.name;\n this.hasAutocomplete = spec.hasAutocomplete;\n this.json = spec.json;\n this.executor = spec.executor;\n this.autocompleter = spec.autocompleter;\n this.cooldown = spec.cooldown;\n this.guards = spec.guards;\n }\n\n /** Serialise to the discord REST chat-input command payload. */\n toJSON(): RESTPostAPIChatInputApplicationCommandsJSONBody {\n return this.json;\n }\n\n /** Execute the command for an incoming chat-input interaction. */\n execute(interaction: ChatInputCommandInteraction): Promise<void> {\n return this.executor(interaction);\n }\n\n /** Execute autocomplete for the focused option. */\n autocomplete(interaction: AutocompleteInteraction): Promise<void> {\n return this.autocompleter(interaction);\n }\n}\n\nfunction resolveOptions(\n interaction: ChatInputCommandInteraction,\n options: OptionMap,\n): Record<string, OptionValue | undefined> {\n const resolved: Record<string, OptionValue | undefined> = {};\n for (const [name, def] of Object.entries(options)) {\n resolved[name] = readOption(interaction.options, name, def);\n }\n return resolved;\n}\n\nfunction makeAutocompleter(\n options: OptionMap,\n): (interaction: AutocompleteInteraction) => Promise<void> {\n return async (interaction) => {\n const focused = interaction.options.getFocused(true);\n const def = options[focused.name];\n if (def?.autocomplete === undefined) {\n if (!interaction.responded) await interaction.respond([]);\n return;\n }\n const ctx = new AutocompleteContext(interaction);\n const choices = await def.autocomplete(ctx);\n if (!interaction.responded) await ctx.respond(choices);\n };\n}\n\nfunction baseJSON(\n meta: CommonMeta & { name: string; description: string },\n options: RESTPostAPIChatInputApplicationCommandsJSONBody[\"options\"],\n): RESTPostAPIChatInputApplicationCommandsJSONBody {\n return {\n type: ApplicationCommandType.ChatInput,\n name: meta.name,\n description: meta.description,\n name_localizations: meta.nameLocalizations,\n description_localizations: meta.descriptionLocalizations,\n nsfw: meta.nsfw,\n default_member_permissions:\n meta.defaultMemberPermissions == null\n ? meta.defaultMemberPermissions\n : new PermissionsBitField(meta.defaultMemberPermissions).bitfield.toString(),\n contexts: meta.guildOnly ? [InteractionContextType.Guild] : undefined,\n options,\n };\n}\n\nfunction leafOptionsJSON(options: OptionMap): RESTPostAPIChatInputApplicationCommandsJSONBody[\"options\"] {\n return Object.entries(options).map(([name, def]) => toAPIOption(name, def));\n}\n\nfunction subcommandJSON(name: string, sub: Subcommand): APIApplicationCommandSubcommandOption {\n return {\n type: ApplicationCommandOptionType.Subcommand,\n name,\n description: sub.description,\n name_localizations: sub.nameLocalizations,\n description_localizations: sub.descriptionLocalizations,\n options: Object.entries(sub.options).map(([n, def]) => toAPIOption(n, def)),\n };\n}\n\nfunction routeSubcommand(\n groupName: string | null,\n subName: string | null,\n subcommands: Record<string, Subcommand> | undefined,\n groups: Record<string, SubcommandGroup> | undefined,\n): Subcommand | undefined {\n if (groupName !== null) return groups?.[groupName]?.subcommands[subName ?? \"\"];\n if (subName !== null) return subcommands?.[subName];\n return undefined;\n}\n\n/**\n * Define a slash command with type-safe options and a co-located handler.\n *\n * @example\n * ```ts\n * export default command({\n * name: \"echo\",\n * description: \"Repeat a message\",\n * options: { msg: option.string({ description: \"Text\", required: true }) },\n * run: (ctx) => ctx.reply(ctx.options.msg),\n * });\n * ```\n */\nexport function command<O extends OptionMap = Record<string, never>, R = void>(\n config: CommandConfig<O, R>,\n): SlashCommand {\n const options: OptionMap = config.options ?? {};\n const { run } = config;\n const executor = async (interaction: ChatInputCommandInteraction): Promise<void> => {\n const resolved = resolveOptions(interaction, options) as ResolvedOptions<O>;\n await run(new CommandContext<O>(interaction, resolved));\n };\n return new SlashCommand({\n name: config.name,\n json: baseJSON(config, leafOptionsJSON(options)),\n hasAutocomplete: optionsHaveAutocomplete(options),\n executor,\n autocompleter: makeAutocompleter(options),\n cooldown: config.cooldown !== undefined ? normalizeCooldown(config.cooldown) : undefined,\n guards: config.guards,\n });\n}\n\n/** Define a single subcommand with type-safe options and a handler. */\nexport function subcommand<O extends OptionMap = Record<string, never>, R = void>(\n config: SubcommandConfig<O, R>,\n): Subcommand {\n const options: OptionMap = config.options ?? {};\n const { run } = config;\n const execute = async (interaction: ChatInputCommandInteraction): Promise<void> => {\n const resolved = resolveOptions(interaction, options) as ResolvedOptions<O>;\n await run(new CommandContext<O>(interaction, resolved));\n };\n return {\n kind: \"subcommand\",\n description: config.description,\n options,\n nameLocalizations: config.nameLocalizations,\n descriptionLocalizations: config.descriptionLocalizations,\n hasAutocomplete: optionsHaveAutocomplete(options),\n execute,\n autocomplete: makeAutocompleter(options),\n };\n}\n\n/** Group several subcommands under a shared name. */\nexport function subcommandGroup(config: SubcommandGroupConfig): SubcommandGroup {\n return { kind: \"group\", ...config };\n}\n\n/** Define a command that routes to subcommands and/or subcommand groups. */\nexport function commandGroup(config: CommandGroupConfig): SlashCommand {\n const { subcommands, groups } = config;\n\n const options: (APIApplicationCommandSubcommandOption | APIApplicationCommandSubcommandGroupOption)[] =\n [];\n for (const [name, sub] of Object.entries(subcommands ?? {})) {\n options.push(subcommandJSON(name, sub));\n }\n for (const [name, group] of Object.entries(groups ?? {})) {\n options.push({\n type: ApplicationCommandOptionType.SubcommandGroup,\n name,\n description: group.description,\n name_localizations: group.nameLocalizations,\n description_localizations: group.descriptionLocalizations,\n options: Object.entries(group.subcommands).map(([n, s]) => subcommandJSON(n, s)),\n });\n }\n\n const hasAutocomplete =\n Object.values(subcommands ?? {}).some((s) => s.hasAutocomplete) ||\n Object.values(groups ?? {}).some((g) => Object.values(g.subcommands).some((s) => s.hasAutocomplete));\n\n const executor = async (interaction: ChatInputCommandInteraction): Promise<void> => {\n const target = routeSubcommand(\n interaction.options.getSubcommandGroup(false),\n interaction.options.getSubcommand(false),\n subcommands,\n groups,\n );\n if (target === undefined) {\n throw new Error(`spearkit: no subcommand handler for /${config.name}`);\n }\n await target.execute(interaction);\n };\n\n const autocompleter = async (interaction: AutocompleteInteraction): Promise<void> => {\n const target = routeSubcommand(\n interaction.options.getSubcommandGroup(false),\n interaction.options.getSubcommand(false),\n subcommands,\n groups,\n );\n if (target === undefined) {\n if (!interaction.responded) await interaction.respond([]);\n return;\n }\n await target.autocomplete(interaction);\n };\n\n return new SlashCommand({\n name: config.name,\n json: baseJSON(config, options),\n hasAutocomplete,\n executor,\n autocompleter,\n cooldown: config.cooldown !== undefined ? normalizeCooldown(config.cooldown) : undefined,\n guards: config.guards,\n });\n}\n","import {\n MessageFlags,\n REST,\n Routes,\n type AutocompleteInteraction,\n type Awaitable,\n type ChatInputCommandInteraction,\n type RESTPostAPIApplicationCommandsJSONBody,\n type RESTPutAPIApplicationCommandsResult,\n type RESTPutAPIApplicationGuildCommandsResult,\n} from \"discord.js\";\nimport type { SlashCommand } from \"./command.js\";\nimport type { Logger } from \"../logger.js\";\nimport { runGuards, type Guard } from \"../guards.js\";\nimport { defaultEmbeds, type Embeds } from \"../embeds.js\";\nimport {\n CooldownManager,\n formatCooldownMessage,\n type CooldownActor,\n type CooldownConfig,\n} from \"../cooldown.js\";\nimport type { UsageEvent } from \"../usage.js\";\n\n/** Error hook invoked when a command handler throws. */\nexport type CommandErrorHandler = (\n error: Error,\n interaction: ChatInputCommandInteraction,\n) => Awaitable<void>;\n\n/** Options for pushing commands to discord. */\nexport interface DeployOptions {\n /** Bot token. Falls back to the client token when omitted. */\n token?: string;\n /** Application (client) id. */\n applicationId: string;\n /** Deploy to a single guild (updates instantly) instead of globally. */\n guildId?: string;\n /** Reuse an existing REST instance instead of creating one. */\n rest?: REST;\n}\n\n/** Result of a {@link CommandRegistry.deploy} call. */\nexport type DeployResult =\n | RESTPutAPIApplicationCommandsResult\n | RESTPutAPIApplicationGuildCommandsResult;\n\n/** Holds every slash command and routes interactions to them. */\nexport class CommandRegistry {\n private readonly commands = new Map<string, SlashCommand>();\n private errorHandler?: CommandErrorHandler;\n private logger?: Logger;\n private cooldowns?: CooldownManager;\n private defaultCooldown?: CooldownConfig;\n private defaultGuards: readonly Guard[] = [];\n private onUsage?: (event: UsageEvent) => void;\n\n /** Register one or more commands. Later registrations override by name. */\n add(...commands: SlashCommand[]): this {\n for (const command of commands) this.commands.set(command.name, command);\n return this;\n }\n\n /** Remove a command by name. */\n remove(name: string): boolean {\n return this.commands.delete(name);\n }\n\n /** Look up a command by name. */\n get(name: string): SlashCommand | undefined {\n return this.commands.get(name);\n }\n\n /** All registered commands. */\n all(): SlashCommand[] {\n return [...this.commands.values()];\n }\n\n /** All registered command names. */\n get names(): string[] {\n return [...this.commands.keys()];\n }\n\n /** Number of registered commands. */\n get size(): number {\n return this.commands.size;\n }\n\n /** Set the handler used when a command throws. */\n onError(handler: CommandErrorHandler): this {\n this.errorHandler = handler;\n return this;\n }\n\n /** Attach a logger used for dispatch tracing (debug level). */\n setLogger(logger: Logger): this {\n this.logger = logger;\n return this;\n }\n\n /** Wire a shared cooldown manager and an optional default cooldown for every command. */\n setCooldowns(manager: CooldownManager, defaultCooldown?: CooldownConfig): this {\n this.cooldowns = manager;\n this.defaultCooldown = defaultCooldown;\n return this;\n }\n\n /** Guards that run before every command's own guards. */\n setDefaultGuards(guards: readonly Guard[]): this {\n this.defaultGuards = guards;\n return this;\n }\n\n /** Attach a hook called after each successful command execution. */\n setUsageHook(hook: (event: UsageEvent) => void): this {\n this.onUsage = hook;\n return this;\n }\n\n /** Serialise every command to discord REST payloads. */\n toJSON(): RESTPostAPIApplicationCommandsJSONBody[] {\n return this.all().map((c) => c.toJSON());\n }\n\n /** Dispatch an incoming chat-input interaction to its command. */\n async handle(interaction: ChatInputCommandInteraction): Promise<void> {\n const command = this.commands.get(interaction.commandName);\n if (command === undefined) return;\n this.logger?.debug(\"command\", {\n data: { command: interaction.commandName, user: interaction.user.id },\n });\n const cooldown = command.cooldown ?? this.defaultCooldown;\n if (cooldown !== undefined && this.cooldowns !== undefined) {\n const result = this.cooldowns.consume(command.name, cooldown, actorOf(interaction));\n if (!result.allowed) {\n await this.replyCooldown(interaction, cooldown, result.remaining);\n return;\n }\n }\n const guards = combineGuards(this.defaultGuards, command.guards);\n if (guards.length > 0) {\n const guardResult = await runGuards(interaction, guards);\n if (!guardResult.allowed) {\n this.logger?.debug(\"command denied\", {\n data: {\n command: command.name,\n user: interaction.user.id,\n reason: guardResult.reason ?? \"\",\n },\n });\n await this.replyDenied(interaction, guardResult.reason);\n return;\n }\n }\n const start = Date.now();\n try {\n await command.execute(interaction);\n this.onUsage?.({\n type: \"command\",\n name: command.name,\n outcome: \"success\",\n durationMs: Date.now() - start,\n userId: interaction.user.id,\n userTag: interaction.user.tag,\n guildId: interaction.guildId,\n channelId: interaction.channelId,\n timestamp: new Date(),\n });\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.onUsage?.({\n type: \"command\",\n name: command.name,\n outcome: \"error\",\n errorMessage: err.message,\n durationMs: Date.now() - start,\n userId: interaction.user.id,\n userTag: interaction.user.tag,\n guildId: interaction.guildId,\n channelId: interaction.channelId,\n timestamp: new Date(),\n });\n if (this.errorHandler !== undefined) {\n await this.errorHandler(err, interaction);\n } else {\n await this.defaultErrorReply(err, interaction);\n }\n }\n }\n\n /** Dispatch an autocomplete interaction to its command. */\n async handleAutocomplete(interaction: AutocompleteInteraction): Promise<void> {\n const command = this.commands.get(interaction.commandName);\n if (command === undefined) return;\n try {\n await command.autocomplete(interaction);\n } catch {\n if (!interaction.responded) await interaction.respond([]).catch(() => undefined);\n }\n }\n\n /**\n * Push the registered commands to discord. Returns the API response.\n *\n * Guild deploys apply instantly and are ideal during development; global\n * deploys can take up to an hour to propagate.\n */\n async deploy(options: DeployOptions): Promise<DeployResult> {\n let rest = options.rest;\n if (rest === undefined) {\n if (options.token === undefined) {\n throw new Error(\"spearkit: deploy() requires a token or a pre-configured REST instance\");\n }\n rest = new REST().setToken(options.token);\n }\n const body = this.toJSON();\n const route =\n options.guildId !== undefined\n ? Routes.applicationGuildCommands(options.applicationId, options.guildId)\n : Routes.applicationCommands(options.applicationId);\n return (await rest.put(route, { body })) as DeployResult;\n }\n\n private async defaultErrorReply(\n error: Error,\n interaction: ChatInputCommandInteraction,\n ): Promise<void> {\n interaction.client.emit(\"error\", error);\n const content = \"Something went wrong while running that command.\";\n try {\n if (interaction.deferred) {\n await interaction.editReply({ content });\n } else if (interaction.replied) {\n await interaction.followUp({ content, flags: MessageFlags.Ephemeral });\n } else {\n await interaction.reply({ content, flags: MessageFlags.Ephemeral });\n }\n } catch {\n // Interaction likely expired; nothing actionable left to do.\n }\n }\n\n private async replyCooldown(\n interaction: ChatInputCommandInteraction,\n config: CooldownConfig,\n remaining: number,\n ): Promise<void> {\n this.logger?.debug(\"cooldown\", {\n data: { command: interaction.commandName, user: interaction.user.id, remaining },\n });\n const content = formatCooldownMessage(config, remaining);\n try {\n if (interaction.deferred) await interaction.editReply({ content });\n else if (interaction.replied) await interaction.followUp({ content, flags: MessageFlags.Ephemeral });\n else await interaction.reply({ content, flags: MessageFlags.Ephemeral });\n } catch {\n // Interaction likely expired.\n }\n }\n\n private async replyDenied(\n interaction: ChatInputCommandInteraction,\n reason: string | undefined,\n ): Promise<void> {\n const embeds = clientEmbeds(interaction.client);\n const text = reason ?? \"You don't have permission to use this.\";\n try {\n const payload = { embeds: [embeds.error(text)], flags: MessageFlags.Ephemeral } as const;\n if (interaction.deferred) await interaction.editReply({ embeds: payload.embeds });\n else if (interaction.replied) await interaction.followUp(payload);\n else await interaction.reply(payload);\n } catch {\n // Interaction likely expired.\n }\n }\n}\n\nfunction combineGuards(defaults: readonly Guard[], own: readonly Guard[] | undefined): readonly Guard[] {\n if (own === undefined || own.length === 0) return defaults;\n if (defaults.length === 0) return own;\n return [...defaults, ...own];\n}\n\nfunction clientEmbeds(client: { embeds?: Embeds } | unknown): Embeds {\n const host = client as { embeds?: Embeds };\n return host.embeds ?? defaultEmbeds;\n}\n\nfunction actorOf(interaction: ChatInputCommandInteraction): CooldownActor {\n const member = interaction.member;\n let roleIds: readonly string[] = [];\n if (member !== null) {\n const roles = member.roles;\n roleIds = Array.isArray(roles) ? roles : [...roles.cache.keys()];\n }\n return {\n userId: interaction.user.id,\n roleIds,\n guildId: interaction.guildId,\n channelId: interaction.channelId,\n };\n}\n","import type { Awaitable, Client, ClientEvents } from \"discord.js\";\n\n/** A typed handler for a discord.js client event. */\nexport type EventHandler<E extends keyof ClientEvents> = (\n ...args: ClientEvents[E]\n) => Awaitable<void>;\n\n/** Object form accepted by {@link event}. */\nexport interface EventConfig<E extends keyof ClientEvents> {\n name: E;\n /** Run the handler at most once, then auto-detach. */\n once?: boolean;\n run: EventHandler<E>;\n}\n\n/**\n * A type-erased, ready-to-attach event listener. Built by {@link event}; the\n * concrete event type is captured in the closures so binding stays type-safe.\n */\nexport interface EventDef {\n readonly name: keyof ClientEvents;\n readonly once: boolean;\n /** Attach the listener to a client. */\n attach(client: Client): void;\n /** Remove the listener from a client it was attached to. */\n detach(client: Client): void;\n}\n\nfunction toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\n\nfunction build<E extends keyof ClientEvents>(name: E, once: boolean, run: EventHandler<E>): EventDef {\n const listeners = new WeakMap<Client, (...args: ClientEvents[E]) => void>();\n return {\n name,\n once,\n attach(client) {\n const listener = (...args: ClientEvents[E]): void => {\n try {\n const result = run(...args);\n if (result instanceof Promise) {\n result.catch((error: unknown) => client.emit(\"error\", toError(error)));\n }\n } catch (error) {\n client.emit(\"error\", toError(error));\n }\n };\n listeners.set(client, listener);\n if (once) client.once(name, listener);\n else client.on(name, listener);\n },\n detach(client) {\n const listener = listeners.get(client);\n if (listener !== undefined) {\n client.off(name, listener);\n listeners.delete(client);\n }\n },\n };\n}\n\n/**\n * Define a discord.js event listener with a fully-typed handler. Thrown errors\n * and rejected promises are routed to the client's `error` event instead of\n * crashing the process.\n *\n * @example\n * ```ts\n * export default event(\"messageCreate\", (message) => {\n * if (message.author.bot) return;\n * // message is fully typed as Message\n * });\n * ```\n */\nexport function event<E extends keyof ClientEvents>(name: E, run: EventHandler<E>): EventDef;\nexport function event<E extends keyof ClientEvents>(config: EventConfig<E>): EventDef;\nexport function event<E extends keyof ClientEvents>(\n nameOrConfig: E | EventConfig<E>,\n run?: EventHandler<E>,\n): EventDef {\n if (typeof nameOrConfig === \"object\") {\n return build(nameOrConfig.name, nameOrConfig.once ?? false, nameOrConfig.run);\n }\n if (run === undefined) {\n throw new Error(\"spearkit: event(name, run) requires a handler\");\n }\n return build(nameOrConfig, false, run);\n}\n\n/** Holds event listeners and attaches them to clients in bulk. */\nexport class EventRegistry {\n private readonly events: EventDef[] = [];\n private readonly attached = new Set<Client>();\n\n /** Register one or more event definitions. */\n add(...defs: EventDef[]): this {\n this.events.push(...defs);\n for (const client of this.attached) {\n for (const def of defs) def.attach(client);\n }\n return this;\n }\n\n /** Number of registered listeners. */\n get size(): number {\n return this.events.length;\n }\n\n /** Attach every registered listener to the client. */\n attachAll(client: Client): void {\n this.attached.add(client);\n for (const def of this.events) def.attach(client);\n }\n\n /** Detach every registered listener from the client. */\n detachAll(client: Client): void {\n this.attached.delete(client);\n for (const def of this.events) def.detach(client);\n }\n}\n","/**\n * Typed custom-id codec.\n *\n * Patterns follow the grammar `namespace(:{param})*`, e.g. `\"vote\"` or\n * `\"vote:{choice}\"` or `\"page:{id}:{dir}\"`. The `namespace` is the routing key;\n * each `{param}` becomes a positional, percent-escaped value in the encoded id.\n * Param names are recovered at the type level so handlers get a typed `params`\n * object and `build()` requires exactly the right params.\n */\n\n/** Names of the `{param}` placeholders inside a pattern. */\nexport type ParamNames<S extends string> = S extends `${string}{${infer Name}}${infer Rest}`\n ? Name | ParamNames<Rest>\n : never;\n\n/** The params object a pattern resolves to (every value is a string). */\nexport type Params<S extends string> = { [K in ParamNames<S>]: string };\n\n/** Arguments `build()` accepts: none when the pattern has no params. */\nexport type BuildArgs<S extends string> = [ParamNames<S>] extends [never]\n ? []\n : [params: Params<S>];\n\n/** The discord custom-id length limit. */\nexport const MAX_CUSTOM_ID_LENGTH = 100;\n\nconst PARAM_SEGMENT = /^\\{([A-Za-z0-9_]+)\\}$/;\n\n/** A compiled pattern: its routing namespace and ordered param names. */\nexport interface CompiledPattern {\n readonly pattern: string;\n readonly namespace: string;\n readonly paramNames: readonly string[];\n}\n\n/** Compile and validate a custom-id pattern. Throws on malformed input. */\nexport function compilePattern(pattern: string): CompiledPattern {\n const segments = pattern.split(\":\");\n const namespace = segments[0] ?? \"\";\n if (namespace.length === 0 || /[{}]/.test(namespace)) {\n throw new Error(\n `spearkit: invalid custom-id pattern \"${pattern}\". Expected \"namespace\" or \"namespace:{param}\".`,\n );\n }\n const paramNames: string[] = [];\n for (let i = 1; i < segments.length; i++) {\n const match = PARAM_SEGMENT.exec(segments[i] ?? \"\");\n if (match === null) {\n throw new Error(\n `spearkit: invalid custom-id pattern \"${pattern}\". Segment \"${segments[i]}\" must be \"{param}\".`,\n );\n }\n paramNames.push(match[1] as string);\n }\n return { pattern, namespace, paramNames };\n}\n\nfunction encodeValue(value: string): string {\n return value.replace(/%/g, \"%25\").replace(/:/g, \"%3A\");\n}\n\nfunction decodeValue(value: string): string {\n return value.replace(/%3A/g, \":\").replace(/%25/g, \"%\");\n}\n\n/** Build a concrete custom-id from a compiled pattern and its params. */\nexport function buildCustomId(\n compiled: CompiledPattern,\n params: Readonly<Record<string, string>>,\n): string {\n const parts = [compiled.namespace];\n for (const name of compiled.paramNames) {\n const value = params[name];\n if (value === undefined) {\n throw new Error(`spearkit: missing param \"${name}\" for custom-id \"${compiled.pattern}\"`);\n }\n parts.push(encodeValue(value));\n }\n const id = parts.join(\":\");\n if (id.length > MAX_CUSTOM_ID_LENGTH) {\n throw new Error(\n `spearkit: custom-id \"${id}\" exceeds the ${MAX_CUSTOM_ID_LENGTH}-character discord limit`,\n );\n }\n return id;\n}\n\n/** The namespace + raw values parsed out of an incoming custom-id. */\nexport interface ParsedCustomId {\n readonly namespace: string;\n readonly values: readonly string[];\n}\n\n/** Parse an incoming custom-id into its namespace and decoded values. */\nexport function parseCustomId(customId: string): ParsedCustomId {\n const segments = customId.split(\":\");\n const namespace = segments[0] ?? \"\";\n const values = segments.slice(1).map(decodeValue);\n return { namespace, values };\n}\n\n/** Map ordered values onto their param names. */\nexport function paramsFromValues(\n paramNames: readonly string[],\n values: readonly string[],\n): Record<string, string> {\n const params: Record<string, string> = {};\n for (let i = 0; i < paramNames.length; i++) {\n params[paramNames[i] as string] = values[i] ?? \"\";\n }\n return params;\n}\n","import type {\n APIModalInteractionResponseCallbackData,\n ButtonInteraction,\n ChannelSelectMenuInteraction,\n InteractionUpdateOptions,\n JSONEncodable,\n MentionableSelectMenuInteraction,\n ModalBuilder,\n ModalComponentData,\n ModalSubmitInteraction,\n RoleSelectMenuInteraction,\n StringSelectMenuInteraction,\n UserSelectMenuInteraction,\n} from \"discord.js\";\nimport { BaseContext } from \"../context.js\";\n\ntype UpdateInput = string | InteractionUpdateOptions;\n/** The concrete message-component interaction types (button + every select). */\nexport type AnyComponentInteraction =\n | ButtonInteraction\n | StringSelectMenuInteraction\n | UserSelectMenuInteraction\n | RoleSelectMenuInteraction\n | ChannelSelectMenuInteraction\n | MentionableSelectMenuInteraction;\n\n/**\n * Base context for message-component interactions (buttons and selects).\n * Adds the component-only `update`/`deferUpdate`/`showModal` helpers and the\n * routed, typed {@link params}.\n */\nexport class MessageComponentContext<\n P,\n I extends AnyComponentInteraction = AnyComponentInteraction,\n> extends BaseContext<I> {\n constructor(\n interaction: I,\n /** Params extracted from the custom-id pattern. */\n readonly params: P,\n ) {\n super(interaction);\n }\n\n /** The raw custom-id that triggered this interaction. */\n get customId(): string {\n return this.interaction.customId;\n }\n\n /** The message the component lives on. */\n get message() {\n return this.interaction.message;\n }\n\n /** Edit the message this component belongs to. */\n async update(input: UpdateInput): Promise<void> {\n await this.interaction.update(input);\n }\n\n /** Acknowledge the interaction without editing the message yet. */\n async deferUpdate(): Promise<void> {\n await this.interaction.deferUpdate();\n }\n\n /** Open a modal in response to this component. */\n async showModal(\n modal: JSONEncodable<APIModalInteractionResponseCallbackData> | ModalComponentData | ModalBuilder,\n ): Promise<void> {\n await this.interaction.showModal(modal);\n }\n}\n\n/** Context for a button click. */\nexport class ButtonContext<P = Record<string, never>> extends MessageComponentContext<\n P,\n ButtonInteraction\n> {}\n\n/** Context for a string select; exposes the chosen {@link values}. */\nexport class StringSelectContext<P = Record<string, never>> extends MessageComponentContext<\n P,\n StringSelectMenuInteraction\n> {\n /** All selected values. */\n get values(): string[] {\n return this.interaction.values;\n }\n /** The first selected value, or `undefined` if none. */\n get value(): string | undefined {\n return this.interaction.values[0];\n }\n}\n\n/** Context for a user select; exposes selected ids, users and members. */\nexport class UserSelectContext<P = Record<string, never>> extends MessageComponentContext<\n P,\n UserSelectMenuInteraction\n> {\n get values(): string[] {\n return this.interaction.values;\n }\n get users() {\n return this.interaction.users;\n }\n get members() {\n return this.interaction.members;\n }\n}\n\n/** Context for a role select. */\nexport class RoleSelectContext<P = Record<string, never>> extends MessageComponentContext<\n P,\n RoleSelectMenuInteraction\n> {\n get values(): string[] {\n return this.interaction.values;\n }\n get roles() {\n return this.interaction.roles;\n }\n}\n\n/** Context for a channel select. */\nexport class ChannelSelectContext<P = Record<string, never>> extends MessageComponentContext<\n P,\n ChannelSelectMenuInteraction\n> {\n get values(): string[] {\n return this.interaction.values;\n }\n get channels() {\n return this.interaction.channels;\n }\n}\n\n/** Context for a mentionable (user + role) select. */\nexport class MentionableSelectContext<P = Record<string, never>> extends MessageComponentContext<\n P,\n MentionableSelectMenuInteraction\n> {\n get values(): string[] {\n return this.interaction.values;\n }\n get users() {\n return this.interaction.users;\n }\n get roles() {\n return this.interaction.roles;\n }\n get members() {\n return this.interaction.members;\n }\n}\n\n/**\n * Context for a submitted modal. Exposes the routed {@link params} plus the\n * resolved text-input {@link fields}, keyed by the field names you declared.\n */\nexport class ModalContext<P, F extends string = string> extends BaseContext<ModalSubmitInteraction> {\n constructor(\n interaction: ModalSubmitInteraction,\n readonly params: P,\n /** Submitted values, keyed by the field names from your modal definition. */\n readonly fields: Record<F, string>,\n ) {\n super(interaction);\n }\n\n /** The raw custom-id that triggered this modal submission. */\n get customId(): string {\n return this.interaction.customId;\n }\n}\n","import type {\n ButtonInteraction,\n ChannelSelectMenuInteraction,\n Interaction,\n MentionableSelectMenuInteraction,\n ModalSubmitInteraction,\n RepliableInteraction,\n RoleSelectMenuInteraction,\n StringSelectMenuInteraction,\n UserSelectMenuInteraction,\n Awaitable,\n} from \"discord.js\";\nimport { MessageFlags } from \"discord.js\";\nimport { parseCustomId, paramsFromValues } from \"./customId.js\";\nimport type { Logger } from \"../logger.js\";\nimport type { UsageEvent } from \"../usage.js\";\nimport { runGuards, type Guard } from \"../guards.js\";\nimport { defaultEmbeds, type Embeds } from \"../embeds.js\";\n\n/** Shared shape of every routed component. */\ninterface RouteBase {\n readonly namespace: string;\n readonly paramNames: readonly string[];\n readonly guards?: readonly Guard[];\n}\n\n/** Routing entry for a button. */\nexport interface ButtonRoute extends RouteBase {\n readonly kind: \"button\";\n handle(interaction: ButtonInteraction, params: Record<string, string>): Promise<void>;\n}\n/** Routing entry for a string select. */\nexport interface StringSelectRoute extends RouteBase {\n readonly kind: \"stringSelect\";\n handle(interaction: StringSelectMenuInteraction, params: Record<string, string>): Promise<void>;\n}\n/** Routing entry for a user select. */\nexport interface UserSelectRoute extends RouteBase {\n readonly kind: \"userSelect\";\n handle(interaction: UserSelectMenuInteraction, params: Record<string, string>): Promise<void>;\n}\n/** Routing entry for a role select. */\nexport interface RoleSelectRoute extends RouteBase {\n readonly kind: \"roleSelect\";\n handle(interaction: RoleSelectMenuInteraction, params: Record<string, string>): Promise<void>;\n}\n/** Routing entry for a channel select. */\nexport interface ChannelSelectRoute extends RouteBase {\n readonly kind: \"channelSelect\";\n handle(interaction: ChannelSelectMenuInteraction, params: Record<string, string>): Promise<void>;\n}\n/** Routing entry for a mentionable select. */\nexport interface MentionableSelectRoute extends RouteBase {\n readonly kind: \"mentionableSelect\";\n handle(\n interaction: MentionableSelectMenuInteraction,\n params: Record<string, string>,\n ): Promise<void>;\n}\n/** Routing entry for a modal submission. */\nexport interface ModalRoute extends RouteBase {\n readonly kind: \"modal\";\n handle(interaction: ModalSubmitInteraction, params: Record<string, string>): Promise<void>;\n}\n\n/** Any registrable component routing entry. */\nexport type ComponentDef =\n | ButtonRoute\n | StringSelectRoute\n | UserSelectRoute\n | RoleSelectRoute\n | ChannelSelectRoute\n | MentionableSelectRoute\n | ModalRoute;\n\n/** Error hook invoked when a component handler throws. */\nexport type ComponentErrorHandler = (\n error: Error,\n interaction: RepliableInteraction,\n) => Awaitable<void>;\n\nfunction toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\n\n/**\n * Routes button, select and modal interactions to the handlers registered for\n * their custom-id namespace. Decodes the custom-id, extracts typed params, and\n * invokes the matching handler.\n */\nexport class ComponentRegistry {\n private readonly buttons = new Map<string, ButtonRoute>();\n private readonly stringSelects = new Map<string, StringSelectRoute>();\n private readonly userSelects = new Map<string, UserSelectRoute>();\n private readonly roleSelects = new Map<string, RoleSelectRoute>();\n private readonly channelSelects = new Map<string, ChannelSelectRoute>();\n private readonly mentionableSelects = new Map<string, MentionableSelectRoute>();\n private readonly modals = new Map<string, ModalRoute>();\n private errorHandler?: ComponentErrorHandler;\n private logger?: Logger;\n private onUsage?: (event: UsageEvent) => void;\n private defaultGuards: readonly Guard[] = [];\n\n /** Register one or more components. Later registrations override by namespace. */\n add(...defs: ComponentDef[]): this {\n for (const def of defs) {\n switch (def.kind) {\n case \"button\":\n this.buttons.set(def.namespace, def);\n break;\n case \"stringSelect\":\n this.stringSelects.set(def.namespace, def);\n break;\n case \"userSelect\":\n this.userSelects.set(def.namespace, def);\n break;\n case \"roleSelect\":\n this.roleSelects.set(def.namespace, def);\n break;\n case \"channelSelect\":\n this.channelSelects.set(def.namespace, def);\n break;\n case \"mentionableSelect\":\n this.mentionableSelects.set(def.namespace, def);\n break;\n case \"modal\":\n this.modals.set(def.namespace, def);\n break;\n }\n }\n return this;\n }\n\n /** Set the handler used when a component throws. */\n onError(handler: ComponentErrorHandler): this {\n this.errorHandler = handler;\n return this;\n }\n\n /** Attach a logger used for dispatch tracing (debug level). */\n setLogger(logger: Logger): this {\n this.logger = logger;\n return this;\n }\n\n /** Attach a hook called after each successful component handler run. */\n setUsageHook(hook: (event: UsageEvent) => void): this {\n this.onUsage = hook;\n return this;\n }\n\n /** Guards that run before every component's own guards. */\n setDefaultGuards(guards: readonly Guard[]): this {\n this.defaultGuards = guards;\n return this;\n }\n\n /** Total number of registered components. */\n get size(): number {\n return (\n this.buttons.size +\n this.stringSelects.size +\n this.userSelects.size +\n this.roleSelects.size +\n this.channelSelects.size +\n this.mentionableSelects.size +\n this.modals.size\n );\n }\n\n /**\n * Dispatch an interaction to its component handler. Returns `true` if a\n * handler matched and ran, `false` otherwise.\n */\n async handle(interaction: Interaction): Promise<boolean> {\n if (interaction.isButton()) {\n return this.exec(this.buttons.get(namespaceOf(interaction.customId)), interaction);\n }\n if (interaction.isStringSelectMenu()) {\n return this.exec(this.stringSelects.get(namespaceOf(interaction.customId)), interaction);\n }\n if (interaction.isUserSelectMenu()) {\n return this.exec(this.userSelects.get(namespaceOf(interaction.customId)), interaction);\n }\n if (interaction.isRoleSelectMenu()) {\n return this.exec(this.roleSelects.get(namespaceOf(interaction.customId)), interaction);\n }\n if (interaction.isChannelSelectMenu()) {\n return this.exec(this.channelSelects.get(namespaceOf(interaction.customId)), interaction);\n }\n if (interaction.isMentionableSelectMenu()) {\n return this.exec(this.mentionableSelects.get(namespaceOf(interaction.customId)), interaction);\n }\n if (interaction.isModalSubmit()) {\n return this.exec(this.modals.get(namespaceOf(interaction.customId)), interaction);\n }\n return false;\n }\n\n private async exec<I extends RepliableInteraction & { customId: string }>(\n route: (RouteBase & { handle(interaction: I, params: Record<string, string>): Promise<void> }) | undefined,\n interaction: I,\n ): Promise<boolean> {\n if (route === undefined) return false;\n this.logger?.debug(\"component\", { data: { customId: interaction.customId } });\n const guards = combineGuards(this.defaultGuards, route.guards);\n if (guards.length > 0) {\n const guardResult = await runGuards(interaction, guards);\n if (!guardResult.allowed) {\n this.logger?.debug(\"component denied\", {\n data: { customId: interaction.customId, reason: guardResult.reason ?? \"\" },\n });\n await replyDeniedComponent(interaction, guardResult.reason);\n return true;\n }\n }\n const { values } = parseCustomId(interaction.customId);\n const params = paramsFromValues(route.paramNames, values);\n const start = Date.now();\n try {\n await route.handle(interaction, params);\n this.onUsage?.({\n type: \"component\",\n name: route.namespace,\n outcome: \"success\",\n durationMs: Date.now() - start,\n userId: interaction.user.id,\n userTag: interaction.user.tag,\n guildId: interaction.guildId,\n channelId: interaction.channelId,\n timestamp: new Date(),\n });\n } catch (error) {\n const err = toError(error);\n this.onUsage?.({\n type: \"component\",\n name: route.namespace,\n outcome: \"error\",\n errorMessage: err.message,\n durationMs: Date.now() - start,\n userId: interaction.user.id,\n userTag: interaction.user.tag,\n guildId: interaction.guildId,\n channelId: interaction.channelId,\n timestamp: new Date(),\n });\n if (this.errorHandler !== undefined) {\n await this.errorHandler(err, interaction);\n } else {\n interaction.client.emit(\"error\", err);\n if (!interaction.replied && !interaction.deferred) {\n await interaction\n .reply({ content: \"Something went wrong.\", flags: MessageFlags.Ephemeral })\n .catch(() => undefined);\n }\n }\n }\n return true;\n }\n}\n\nfunction namespaceOf(customId: string): string {\n return parseCustomId(customId).namespace;\n}\n\nfunction combineGuards(defaults: readonly Guard[], own: readonly Guard[] | undefined): readonly Guard[] {\n if (own === undefined || own.length === 0) return defaults;\n if (defaults.length === 0) return own;\n return [...defaults, ...own];\n}\n\nfunction clientEmbeds(client: { embeds?: Embeds } | unknown): Embeds {\n return ((client as { embeds?: Embeds }).embeds) ?? defaultEmbeds;\n}\n\nasync function replyDeniedComponent(\n interaction: RepliableInteraction,\n reason: string | undefined,\n): Promise<void> {\n const embeds = clientEmbeds(interaction.client);\n const text = reason ?? \"You don't have permission to use this.\";\n try {\n const payload = { embeds: [embeds.error(text)], flags: MessageFlags.Ephemeral } as const;\n if (interaction.deferred) await interaction.editReply({ embeds: payload.embeds });\n else if (interaction.replied) await interaction.followUp(payload);\n else await interaction.reply(payload);\n } catch {\n // Interaction likely expired.\n }\n}\n","import {\n ActionRowBuilder,\n ButtonBuilder,\n ButtonStyle,\n ChannelSelectMenuBuilder,\n MentionableSelectMenuBuilder,\n ModalBuilder,\n RoleSelectMenuBuilder,\n StringSelectMenuBuilder,\n TextInputBuilder,\n TextInputStyle,\n UserSelectMenuBuilder,\n type Awaitable,\n type ChannelType,\n type ComponentEmojiResolvable,\n type SelectMenuComponentOptionData,\n} from \"discord.js\";\nimport {\n ButtonContext,\n ChannelSelectContext,\n MentionableSelectContext,\n ModalContext,\n RoleSelectContext,\n StringSelectContext,\n UserSelectContext,\n} from \"./context.js\";\nimport {\n buildCustomId,\n compilePattern,\n type BuildArgs,\n type Params,\n} from \"./customId.js\";\nimport type {\n ButtonRoute,\n ChannelSelectRoute,\n MentionableSelectRoute,\n ModalRoute,\n RoleSelectRoute,\n StringSelectRoute,\n UserSelectRoute,\n} from \"./registry.js\";\nimport type { Guard } from \"../guards.js\";\n\n// --- buttons ---------------------------------------------------------------\n\n/** Accepted button styles for an interactive (custom-id) button. */\nexport type ButtonStyleInput =\n | \"Primary\"\n | \"Secondary\"\n | \"Success\"\n | \"Danger\"\n | ButtonStyle.Primary\n | ButtonStyle.Secondary\n | ButtonStyle.Success\n | ButtonStyle.Danger;\n\nfunction resolveButtonStyle(input: ButtonStyleInput | undefined): ButtonStyle {\n if (input === undefined) return ButtonStyle.Secondary;\n return typeof input === \"number\" ? input : ButtonStyle[input];\n}\n\n/** Config for an interactive button created with {@link button}. */\nexport interface ButtonConfig<P extends string, R> {\n /** Custom-id pattern, e.g. `\"vote\"` or `\"vote:{choice}\"`. */\n id: P;\n label?: string;\n style?: ButtonStyleInput;\n emoji?: ComponentEmojiResolvable;\n disabled?: boolean;\n /** Preconditions evaluated before the handler runs. */\n guards?: readonly Guard[];\n run: (ctx: ButtonContext<Params<P>>) => Awaitable<R>;\n}\n\n/** A registrable button with a typed {@link build}. */\nexport interface Button<P extends string> extends ButtonRoute {\n build(...args: BuildArgs<P>): ButtonBuilder;\n}\n\n/**\n * Define an interactive button: its appearance, its custom-id pattern and its\n * click handler, all in one place. Register it with `client.components.add`.\n *\n * @example\n * ```ts\n * const vote = button({\n * id: \"vote:{choice}\",\n * label: \"Yes\",\n * style: \"Success\",\n * run: (ctx) => ctx.reply(`You chose ${ctx.params.choice}`),\n * });\n * row(vote.build({ choice: \"yes\" }));\n * ```\n */\nexport function button<const P extends string, R = void>(config: ButtonConfig<P, R>): Button<P> {\n const compiled = compilePattern(config.id);\n const style = resolveButtonStyle(config.style);\n return { kind: \"button\", namespace: compiled.namespace, paramNames: compiled.paramNames, guards: config.guards, async handle(interaction, params) {\n await config.run(new ButtonContext(interaction, params as Params<P>));\n },\n build(...args: BuildArgs<P>): ButtonBuilder {\n const params = (args[0] ?? {}) as Record<string, string>;\n const builder = new ButtonBuilder()\n .setCustomId(buildCustomId(compiled, params))\n .setStyle(style);\n if (config.label !== undefined) builder.setLabel(config.label);\n if (config.emoji !== undefined) builder.setEmoji(config.emoji);\n if (config.disabled !== undefined) builder.setDisabled(config.disabled);\n return builder;\n }, };\n}\n\n/** Config for a link button (no handler — just opens a URL). */\nexport interface LinkButtonConfig {\n url: string;\n label?: string;\n emoji?: ComponentEmojiResolvable;\n disabled?: boolean;\n}\n\n/** Build a link button. Link buttons have no custom-id and run no handler. */\nexport function linkButton(config: LinkButtonConfig): ButtonBuilder {\n const builder = new ButtonBuilder().setStyle(ButtonStyle.Link).setURL(config.url);\n if (config.label !== undefined) builder.setLabel(config.label);\n if (config.emoji !== undefined) builder.setEmoji(config.emoji);\n if (config.disabled !== undefined) builder.setDisabled(config.disabled);\n return builder;\n}\n\n// --- selects ---------------------------------------------------------------\n\ninterface SelectConfigBase {\n placeholder?: string;\n minValues?: number;\n maxValues?: number;\n disabled?: boolean;\n /** Preconditions evaluated before the handler runs. */\n guards?: readonly Guard[];\n}\n\n/** Any of the select-menu builders that share the base configuration setters. */\ntype AnySelectBuilder =\n | StringSelectMenuBuilder\n | UserSelectMenuBuilder\n | RoleSelectMenuBuilder\n | ChannelSelectMenuBuilder\n | MentionableSelectMenuBuilder;\nfunction applySelectBase(builder: AnySelectBuilder, config: SelectConfigBase): void {\n if (config.placeholder !== undefined) builder.setPlaceholder(config.placeholder);\n if (config.minValues !== undefined) builder.setMinValues(config.minValues);\n if (config.maxValues !== undefined) builder.setMaxValues(config.maxValues);\n if (config.disabled !== undefined) builder.setDisabled(config.disabled);\n}\n\n/** Config for a string select created with {@link stringSelect}. */\nexport interface StringSelectConfig<P extends string, R> extends SelectConfigBase {\n id: P;\n options: readonly SelectMenuComponentOptionData[];\n run: (ctx: StringSelectContext<Params<P>>) => Awaitable<R>;\n}\n\n/** A registrable string select with a typed {@link build}. */\nexport interface StringSelect<P extends string> extends StringSelectRoute {\n build(...args: BuildArgs<P>): StringSelectMenuBuilder;\n}\n\n/** Define a string select menu, its custom-id pattern and its handler. */\nexport function stringSelect<const P extends string, R = void>(\n config: StringSelectConfig<P, R>,\n): StringSelect<P> {\n const compiled = compilePattern(config.id);\n return { kind: \"stringSelect\", namespace: compiled.namespace, paramNames: compiled.paramNames, guards: config.guards, async handle(interaction, params) {\n await config.run(new StringSelectContext(interaction, params as Params<P>));\n },\n build(...args: BuildArgs<P>): StringSelectMenuBuilder {\n const params = (args[0] ?? {}) as Record<string, string>;\n const builder = new StringSelectMenuBuilder()\n .setCustomId(buildCustomId(compiled, params))\n .addOptions(...config.options);\n applySelectBase(builder, config);\n return builder;\n }, };\n}\n\n/** Config shared by the entity-select builders (user/role/channel/mentionable). */\nexport interface EntitySelectConfig<P extends string> extends SelectConfigBase {\n id: P;\n}\n\n/** A registrable user select. */\nexport interface UserSelect<P extends string> extends UserSelectRoute {\n build(...args: BuildArgs<P>): UserSelectMenuBuilder;\n}\n\n/** Define a user select menu. */\nexport function userSelect<const P extends string, R = void>(\n config: EntitySelectConfig<P> & { run: (ctx: UserSelectContext<Params<P>>) => Awaitable<R> },\n): UserSelect<P> {\n const compiled = compilePattern(config.id);\n return { kind: \"userSelect\", namespace: compiled.namespace, paramNames: compiled.paramNames, guards: config.guards, async handle(interaction, params) {\n await config.run(new UserSelectContext(interaction, params as Params<P>));\n },\n build(...args: BuildArgs<P>): UserSelectMenuBuilder {\n const params = (args[0] ?? {}) as Record<string, string>;\n const builder = new UserSelectMenuBuilder().setCustomId(buildCustomId(compiled, params));\n applySelectBase(builder, config);\n return builder;\n }, };\n}\n\n/** A registrable role select. */\nexport interface RoleSelect<P extends string> extends RoleSelectRoute {\n build(...args: BuildArgs<P>): RoleSelectMenuBuilder;\n}\n\n/** Define a role select menu. */\nexport function roleSelect<const P extends string, R = void>(\n config: EntitySelectConfig<P> & { run: (ctx: RoleSelectContext<Params<P>>) => Awaitable<R> },\n): RoleSelect<P> {\n const compiled = compilePattern(config.id);\n return { kind: \"roleSelect\", namespace: compiled.namespace, paramNames: compiled.paramNames, guards: config.guards, async handle(interaction, params) {\n await config.run(new RoleSelectContext(interaction, params as Params<P>));\n },\n build(...args: BuildArgs<P>): RoleSelectMenuBuilder {\n const params = (args[0] ?? {}) as Record<string, string>;\n const builder = new RoleSelectMenuBuilder().setCustomId(buildCustomId(compiled, params));\n applySelectBase(builder, config);\n return builder;\n }, };\n}\n\n/** A registrable channel select. */\nexport interface ChannelSelect<P extends string> extends ChannelSelectRoute {\n build(...args: BuildArgs<P>): ChannelSelectMenuBuilder;\n}\n\n/** Define a channel select menu, optionally restricted to channel types. */\nexport function channelSelect<const P extends string, R = void>(\n config: EntitySelectConfig<P> & {\n channelTypes?: readonly ChannelType[];\n run: (ctx: ChannelSelectContext<Params<P>>) => Awaitable<R>;\n },\n): ChannelSelect<P> {\n const compiled = compilePattern(config.id);\n return { kind: \"channelSelect\", namespace: compiled.namespace, paramNames: compiled.paramNames, guards: config.guards, async handle(interaction, params) {\n await config.run(new ChannelSelectContext(interaction, params as Params<P>));\n },\n build(...args: BuildArgs<P>): ChannelSelectMenuBuilder {\n const params = (args[0] ?? {}) as Record<string, string>;\n const builder = new ChannelSelectMenuBuilder().setCustomId(buildCustomId(compiled, params));\n if (config.channelTypes !== undefined) builder.setChannelTypes(...config.channelTypes);\n applySelectBase(builder, config);\n return builder;\n }, };\n}\n\n/** A registrable mentionable select. */\nexport interface MentionableSelect<P extends string> extends MentionableSelectRoute {\n build(...args: BuildArgs<P>): MentionableSelectMenuBuilder;\n}\n\n/** Define a mentionable (user + role) select menu. */\nexport function mentionableSelect<const P extends string, R = void>(\n config: EntitySelectConfig<P> & {\n run: (ctx: MentionableSelectContext<Params<P>>) => Awaitable<R>;\n },\n): MentionableSelect<P> {\n const compiled = compilePattern(config.id);\n return { kind: \"mentionableSelect\", namespace: compiled.namespace, paramNames: compiled.paramNames, guards: config.guards, async handle(interaction, params) {\n await config.run(new MentionableSelectContext(interaction, params as Params<P>));\n },\n build(...args: BuildArgs<P>): MentionableSelectMenuBuilder {\n const params = (args[0] ?? {}) as Record<string, string>;\n const builder = new MentionableSelectMenuBuilder().setCustomId(buildCustomId(compiled, params));\n applySelectBase(builder, config);\n return builder;\n }, };\n}\n\n// --- modals ----------------------------------------------------------------\n\n/** Accepted text-input styles. */\nexport type TextInputStyleInput = \"Short\" | \"Paragraph\" | TextInputStyle;\n\nfunction resolveTextInputStyle(input: TextInputStyleInput | undefined): TextInputStyle {\n if (input === undefined) return TextInputStyle.Short;\n return typeof input === \"number\" ? input : TextInputStyle[input];\n}\n\n/** A resolved text-input field definition. */\nexport interface TextInputDef {\n readonly label: string;\n readonly style: TextInputStyle;\n readonly placeholder?: string;\n readonly required?: boolean;\n readonly minLength?: number;\n readonly maxLength?: number;\n readonly value?: string;\n}\n\n/** Define a single modal text-input field. */\nexport function textInput(config: {\n label: string;\n style?: TextInputStyleInput;\n placeholder?: string;\n required?: boolean;\n minLength?: number;\n maxLength?: number;\n value?: string;\n}): TextInputDef {\n return {\n label: config.label,\n style: resolveTextInputStyle(config.style),\n placeholder: config.placeholder,\n required: config.required,\n minLength: config.minLength,\n maxLength: config.maxLength,\n value: config.value,\n };\n}\n\n/** Config for a modal created with {@link modal}. */\nexport interface ModalConfig<P extends string, F extends Record<string, TextInputDef>, R> {\n id: P;\n title: string;\n fields: F;\n /** Preconditions evaluated before the handler runs. */\n guards?: readonly Guard[];\n run: (ctx: ModalContext<Params<P>, keyof F & string>) => Awaitable<R>;\n}\n\n/** A registrable modal with a typed {@link build}. */\nexport interface Modal<P extends string> extends ModalRoute {\n build(...args: BuildArgs<P>): ModalBuilder;\n}\n\nfunction buildTextInput(customId: string, def: TextInputDef): TextInputBuilder {\n const input = new TextInputBuilder()\n .setCustomId(customId)\n .setLabel(def.label)\n .setStyle(def.style);\n if (def.placeholder !== undefined) input.setPlaceholder(def.placeholder);\n if (def.required !== undefined) input.setRequired(def.required);\n if (def.minLength !== undefined) input.setMinLength(def.minLength);\n if (def.maxLength !== undefined) input.setMaxLength(def.maxLength);\n if (def.value !== undefined) input.setValue(def.value);\n return input;\n}\n\n/**\n * Define a modal: its title, its custom-id pattern, its text-input fields and\n * a submit handler. The handler receives the submitted values keyed by field\n * name in `ctx.fields`.\n *\n * @example\n * ```ts\n * const feedback = modal({\n * id: \"feedback:{ticket}\",\n * title: \"Feedback\",\n * fields: { comment: textInput({ label: \"Comment\", style: \"Paragraph\" }) },\n * run: (ctx) => ctx.reply(`Thanks! (${ctx.params.ticket}): ${ctx.fields.comment}`),\n * });\n * ```\n */\nexport function modal<const P extends string, F extends Record<string, TextInputDef>, R = void>(\n config: ModalConfig<P, F, R>,\n): Modal<P> {\n const compiled = compilePattern(config.id);\n const fieldKeys = Object.keys(config.fields);\n return { kind: \"modal\", namespace: compiled.namespace, paramNames: compiled.paramNames, guards: config.guards, async handle(interaction, params) {\n const fields: Record<string, string> = {};\n for (const key of fieldKeys) {\n try {\n fields[key] = interaction.fields.getTextInputValue(key);\n } catch {\n fields[key] = \"\";\n }\n }\n await config.run(\n new ModalContext(interaction, params as Params<P>, fields as Record<keyof F & string, string>),\n );\n },\n build(...args: BuildArgs<P>): ModalBuilder {\n const params = (args[0] ?? {}) as Record<string, string>;\n const builder = new ModalBuilder()\n .setCustomId(buildCustomId(compiled, params))\n .setTitle(config.title);\n for (const [key, def] of Object.entries(config.fields)) {\n builder.addComponents(\n new ActionRowBuilder<TextInputBuilder>().addComponents(buildTextInput(key, def)),\n );\n }\n return builder;\n }, };\n}\n","import { ActionRowBuilder, type MessageActionRowComponentBuilder } from \"discord.js\";\n\n/**\n * Wrap one or more component builders in an action row.\n *\n * A row holds up to five buttons, or exactly one select menu.\n *\n * @example\n * ```ts\n * const components = [row(yes.build(), no.build())];\n * await channel.send({ content: \"Vote:\", components });\n * ```\n */\nexport function row<C extends MessageActionRowComponentBuilder>(\n ...components: C[]\n): ActionRowBuilder<C> {\n return new ActionRowBuilder<C>().addComponents(...components);\n}\n","import { readdir } from \"node:fs/promises\";\nimport { extname, join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { SlashCommand } from \"./commands/command.js\";\nimport type { Registerable, SpearClient } from \"./client.js\";\n\n/** Options for the directory loader. */\nexport interface LoadOptions {\n /** File extensions to import. Default: `.js`, `.mjs`, `.cjs`. */\n extensions?: readonly string[];\n /** Recurse into subdirectories. Default: `true`. */\n recursive?: boolean;\n}\n\nconst DEFAULT_EXTENSIONS = [\".js\", \".mjs\", \".cjs\"] as const;\n\n/** Structural guard: is this exported value something spearkit can register? */\nfunction isRegisterable(value: unknown): value is Registerable {\n if (value instanceof SlashCommand) return true;\n if (typeof value !== \"object\" || value === null) return false;\n const record = value as Record<string, unknown>;\n if (typeof record[\"attach\"] === \"function\" && typeof record[\"detach\"] === \"function\") {\n return true;\n }\n if (typeof record[\"kind\"] === \"string\" && typeof record[\"handle\"] === \"function\") {\n return true;\n }\n if (\n (record[\"kind\"] === \"task\" || record[\"kind\"] === \"prefixCommand\") &&\n typeof record[\"run\"] === \"function\"\n ) {\n return true;\n }\n return false;\n}\n\n/**\n * Recursively import a directory and collect every spearkit-registrable export\n * (commands, events, components) found in default or named exports.\n */\nexport async function collectModules(\n dir: string,\n options: LoadOptions = {},\n): Promise<Registerable[]> {\n const extensions = options.extensions ?? DEFAULT_EXTENSIONS;\n const recursive = options.recursive ?? true;\n const found: Registerable[] = [];\n\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n if (recursive) found.push(...(await collectModules(fullPath, options)));\n continue;\n }\n if (!extensions.includes(extname(entry.name))) continue;\n\n const mod: Record<string, unknown> = await import(pathToFileURL(fullPath).href);\n for (const value of Object.values(mod)) {\n if (isRegisterable(value)) found.push(value);\n }\n }\n return found;\n}\n\n/**\n * Load a directory and register everything it exports into the client.\n * Returns the number of items registered.\n */\nexport async function loadInto(\n client: SpearClient,\n dir: string,\n options?: LoadOptions,\n): Promise<number> {\n const items = await collectModules(dir, options);\n client.register(...items);\n return items.length;\n}\n","import {\n Client,\n GatewayIntentBits,\n Routes,\n type ClientOptions,\n type Interaction,\n} from \"discord.js\";\nimport { SlashCommand } from \"./commands/command.js\";\nimport { CommandRegistry, type DeployResult } from \"./commands/registry.js\";\nimport { EventRegistry, type EventDef } from \"./events.js\";\nimport { ComponentRegistry, type ComponentDef } from \"./components/registry.js\";\nimport type { SpearPlugin } from \"./plugin.js\";\nimport { loadInto, type LoadOptions } from \"./loader.js\";\nimport { Logger, type LoggerOptions, toError } from \"./logger.js\";\nimport { loadEnv, type LoadEnvOptions } from \"./env.js\";\nimport { CooldownManager, normalizeCooldown, type CooldownInput } from \"./cooldown.js\";\nimport { TaskScheduler, task, type ScheduledTask, type TaskConfig } from \"./scheduler.js\";\nimport { PrefixRegistry, type PrefixCommand, type PrefixOptions } from \"./prefix.js\";\nimport { UsageTracker, type UsageEvent, type UsageOptions } from \"./usage.js\";\nimport { Embeds, type EmbedsOptions } from \"./embeds.js\";\nimport type { Guard } from \"./guards.js\";\nimport { ContextMenuRegistry, type ContextMenuCommand } from \"./context-menus.js\";\n\n/** Anything that can be handed to {@link SpearClient.register}. */\nexport type Registerable =\n | SlashCommand\n | EventDef\n | ComponentDef\n | ScheduledTask\n | PrefixCommand\n | ContextMenuCommand;\n\nconst allIntents = Object.values(GatewayIntentBits).filter(\n (value): value is GatewayIntentBits => typeof value === \"number\",\n);\n\n/**\n * Ready-made intent presets. Pass one to {@link SpearClient} as `intents`.\n * `all` includes privileged intents — enable them in the developer portal.\n */\nexport const Intents = {\n /** No intents. */\n none: [] as GatewayIntentBits[],\n /** Just `Guilds` — enough for slash commands and interactions. */\n default: [GatewayIntentBits.Guilds],\n /** Guild + member gateway data. */\n guilds: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers],\n /** Read message content (privileged) alongside guild messages. */\n messages: [\n GatewayIntentBits.Guilds,\n GatewayIntentBits.GuildMessages,\n GatewayIntentBits.MessageContent,\n ],\n /** Every intent, including privileged ones. */\n all: allIntents,\n} as const;\n\n/** spearkit-specific client options layered on top of discord.js {@link ClientOptions}. */\nexport interface SpearOptions {\n /** A {@link Logger} instance, or options to build one. Exposed as `client.logger`. */\n logger?: Logger | LoggerOptions;\n /**\n * Auto-load a `.env` file into `process.env` on {@link SpearClient.start}.\n * `true` (default) loads `.env` from the cwd; pass {@link LoadEnvOptions} for\n * a custom path or override behaviour, or `false` to disable.\n */\n dotenv?: boolean | LoadEnvOptions;\n /** A default cooldown applied to every command. A command's own cooldown overrides it. */\n cooldown?: CooldownInput;\n /** Enable prefix (text) commands. A string/array sets prefixes; an object configures matching. */\n prefix?: string | readonly string[] | PrefixOptions;\n /** Track command/component/prefix usage to a store and/or a Discord channel. */\n usage?: UsageOptions;\n /** Default {@link Embeds} factory for preset replies. Pass an instance or options. */\n embeds?: Embeds | EmbedsOptions;\n /** Default guards (preconditions) applied before every command/component/prefix handler. */\n guards?: readonly Guard[];\n}\n\n/** Options for {@link SpearClient}: discord.js options plus {@link SpearOptions}. `intents` may be omitted. */\nexport type SpearClientOptions = Partial<ClientOptions> & SpearOptions;\n\n/**\n * A discord.js {@link Client} with batteries included: command, event,\n * component, prefix-command, scheduler and context-menu registries plus\n * interaction routing wired up automatically.\n *\n * @example\n * ```ts\n * const client = new SpearClient({ intents: Intents.default });\n * client.register(ping, onReady, voteButton);\n * await client.start(process.env.TOKEN);\n * await client.deployAllCommands({ guildId: \"123\" });\n * ```\n */\nexport class SpearClient extends Client {\n /** Slash command registry and dispatcher. */\n readonly commands = new CommandRegistry();\n /** Event listener registry. */\n readonly events = new EventRegistry();\n /** Button / select / modal registry and router. */\n readonly components = new ComponentRegistry();\n /** Structured logger shared across spearkit and available to your code. */\n readonly logger: Logger;\n /** Shared cooldown manager used by command dispatch; also usable directly. */\n readonly cooldowns = new CooldownManager();\n /** Cron/interval task scheduler; started on ready and stopped on destroy. */\n readonly scheduler = new TaskScheduler();\n /** Prefix (text) command registry, dispatched from `messageCreate`. */\n readonly prefix = new PrefixRegistry();\n /** Usage tracker: records who used what to a store and/or a Discord channel. */\n readonly usage = new UsageTracker();\n /** Preset embed factory used by `ctx.error/success/info/warn` and available to your code. */\n readonly embeds: Embeds;\n /** User- and message-context-menu command registry. */\n readonly contextMenus = new ContextMenuRegistry();\n private readonly envConfig: false | LoadEnvOptions;\n\n constructor(options: SpearClientOptions = {}) {\n const { intents, logger, dotenv, cooldown, prefix, usage, embeds, guards, ...rest } = options;\n super({ ...rest, intents: intents ?? Intents.default });\n this.embeds = embeds instanceof Embeds ? embeds : new Embeds(embeds);\n this.envConfig = dotenv === false ? false : dotenv === undefined || dotenv === true ? {} : dotenv;\n this.logger = logger instanceof Logger ? logger : new Logger(logger);\n const defaultCooldown = cooldown !== undefined ? normalizeCooldown(cooldown) : undefined;\n\n this.commands.setLogger(this.logger.child(\"commands\"));\n this.commands.setCooldowns(this.cooldowns, defaultCooldown);\n this.components.setLogger(this.logger.child(\"components\"));\n this.contextMenus.setLogger(this.logger.child(\"contextMenus\"));\n this.contextMenus.setCooldowns(this.cooldowns, defaultCooldown);\n this.prefix.setLogger(this.logger.child(\"prefix\"));\n this.prefix.setCooldowns(this.cooldowns, defaultCooldown);\n if (prefix !== undefined) this.prefix.setOptions(prefix);\n this.scheduler.setLogger(this.logger.child(\"scheduler\"));\n\n if (guards !== undefined && guards.length > 0) {\n this.commands.setDefaultGuards(guards);\n this.contextMenus.setDefaultGuards(guards);\n this.components.setDefaultGuards(guards);\n this.prefix.setDefaultGuards(guards);\n }\n\n this.usage.setClient(this).setLogger(this.logger.child(\"usage\"));\n if (usage !== undefined) {\n if (usage.store !== undefined) this.usage.setStore(usage.store);\n if (usage.channel !== undefined) this.usage.reportTo(usage.channel, usage.format);\n const onUsage = (event: UsageEvent): void => this.usage.track(event);\n this.commands.setUsageHook(onUsage);\n this.contextMenus.setUsageHook(onUsage);\n this.components.setUsageHook(onUsage);\n this.prefix.setUsageHook(onUsage);\n }\n\n this.events.attachAll(this);\n this.on(\"interactionCreate\", (interaction) => this.route(interaction));\n this.on(\"error\", (error) => this.logger.error(\"client error\", { error: toError(error) }));\n this.once(\"clientReady\", () => this.scheduler.start(this));\n this.on(\"messageCreate\", (message) => {\n void this.prefix.handle(message);\n });\n }\n\n /**\n * Register commands, events, components, scheduled tasks, prefix commands\n * and context menus in one call. Each item is routed to its matching registry.\n */\n register(...items: Registerable[]): this {\n for (const item of items) {\n if (item instanceof SlashCommand) {\n this.commands.add(item);\n } else if (\"attach\" in item) {\n this.events.add(item);\n } else if (item.kind === \"task\") {\n this.scheduler.add(item);\n } else if (item.kind === \"prefixCommand\") {\n this.prefix.add(item);\n } else if (item.kind === \"userMenu\") {\n this.contextMenus.add(item);\n } else if (item.kind === \"messageMenu\") {\n this.contextMenus.add(item);\n } else {\n this.components.add(item);\n }\n }\n return this;\n }\n\n /** Install one or more plugins, running each plugin's `setup`. */\n async use(...plugins: SpearPlugin[]): Promise<this> {\n for (const plugin of plugins) {\n await plugin.setup(this);\n }\n return this;\n }\n\n /**\n * Recursively load a directory and register every command, event and\n * component it exports. Returns the number of items registered.\n */\n load(dir: string, options?: LoadOptions): Promise<number> {\n return loadInto(this, dir, options);\n }\n\n /**\n * Log in. Falls back to the `DISCORD_TOKEN` environment variable when no\n * token is passed.\n */\n async start(token?: string): Promise<this> {\n if (this.envConfig !== false) loadEnv(this.envConfig);\n const resolved = token ?? process.env.DISCORD_TOKEN;\n if (resolved === undefined || resolved.length === 0) {\n throw new Error(\"spearkit: start() needs a token (pass one or set DISCORD_TOKEN)\");\n }\n await this.login(resolved);\n return this;\n }\n\n /**\n * Push the registered slash commands to Discord using the client's REST\n * connection. Slash-only — use {@link deployAllCommands} to include context\n * menus in the same request.\n */\n async deployCommands(options: { guildId?: string } = {}): Promise<DeployResult> {\n const applicationId = this.application?.id ?? this.user?.id;\n if (applicationId == null) {\n throw new Error(\"spearkit: deployCommands() must run after the client is ready\");\n }\n return this.commands.deploy({ rest: this.rest, applicationId, guildId: options.guildId });\n }\n\n /**\n * Deploy slash commands AND context menus together to Discord in a single\n * PUT. Use this once you mix `userCommand` / `messageCommand` with `command`.\n */\n /**\n * Deploy slash commands AND context menus together. Supports a `diff`\n * strategy that fetches the remote set first and skips the PUT when\n * nothing changed, and a `dryRun` flag that returns the body without\n * touching Discord (perfect for CI deploy gates).\n *\n * @returns the API's DeployResult on PUT, or a skipped report when\n * `dryRun: true` is set OR `strategy: \"diff\"` finds no changes.\n */\n async deployAllCommands(options: {\n guildId?: string;\n dryRun?: boolean;\n strategy?: \"always\" | \"diff\";\n /** Override the application id (default reads from the ready client). */\n applicationId?: string;\n } = {}): Promise<DeployResult | { skipped: true; reason: \"dry-run\" | \"no-changes\"; body: readonly unknown[] }> {\n const applicationId = options.applicationId ?? this.application?.id ?? this.user?.id;\n if (applicationId == null) {\n throw new Error(\"spearkit: deployAllCommands() must run after the client is ready\");\n }\n const body = [...this.commands.toJSON(), ...this.contextMenus.toJSON()];\n const route =\n options.guildId !== undefined\n ? Routes.applicationGuildCommands(applicationId, options.guildId)\n : Routes.applicationCommands(applicationId);\n if (options.dryRun === true) {\n return { skipped: true, reason: \"dry-run\", body };\n }\n if (options.strategy === \"diff\") {\n const remote = (await this.rest.get(route)) as readonly unknown[];\n if (commandsEqual(body, remote)) {\n return { skipped: true, reason: \"no-changes\", body };\n }\n }\n return (await this.rest.put(route, { body })) as DeployResult;\n }\n\n /** Define and register a scheduled task in one call. */\n schedule(config: TaskConfig): ScheduledTask {\n const scheduled = task(config);\n this.scheduler.add(scheduled);\n return scheduled;\n }\n\n /** Stop the scheduler, then tear down the discord.js client. */\n override async destroy(): Promise<void> {\n this.scheduler.stop();\n await super.destroy();\n }\n\n private async route(interaction: Interaction): Promise<void> {\n if (interaction.isChatInputCommand()) {\n await this.commands.handle(interaction);\n } else if (interaction.isAutocomplete()) {\n await this.commands.handleAutocomplete(interaction);\n } else if (interaction.isUserContextMenuCommand()) {\n await this.contextMenus.handleUser(interaction);\n } else if (interaction.isMessageContextMenuCommand()) {\n await this.contextMenus.handleMessage(interaction);\n } else {\n await this.components.handle(interaction);\n }\n }\n}\n\n/** Structural equality check used by deployAllCommands' diff strategy. */\nfunction commandsEqual(local: readonly unknown[], remote: readonly unknown[]): boolean {\n if (local.length !== remote.length) return false;\n const lset = new Set(local.map(commandHash));\n for (const r of remote) {\n if (!lset.has(commandHash(r))) return false;\n }\n return true;\n}\n\nfunction commandHash(cmd: unknown): string {\n const c = cmd as Record<string, unknown>;\n return JSON.stringify({\n name: c.name,\n type: c.type ?? 1,\n description: c.description ?? \"\",\n nsfw: c.nsfw === true,\n default_member_permissions: c.default_member_permissions ?? null,\n contexts: Array.isArray(c.contexts) ? [...(c.contexts as number[])].sort((a, b) => a - b) : null,\n options: normaliseOptions(c.options),\n });\n}\n\nfunction normaliseOptions(options: unknown): readonly unknown[] {\n if (!Array.isArray(options)) return [];\n return options\n .map((o) => {\n const opt = o as Record<string, unknown>;\n return {\n name: opt.name,\n type: opt.type,\n description: opt.description ?? \"\",\n required: opt.required === true,\n choices: Array.isArray(opt.choices)\n ? [...(opt.choices as { name: string; value: unknown }[])]\n .map((ch) => ({ name: ch.name, value: ch.value }))\n .sort((a, b) => String(a.name).localeCompare(String(b.name)))\n : null,\n options: normaliseOptions(opt.options),\n channel_types: Array.isArray(opt.channel_types)\n ? [...(opt.channel_types as number[])].sort((a, b) => a - b)\n : null,\n min_value: opt.min_value ?? null,\n max_value: opt.max_value ?? null,\n min_length: opt.min_length ?? null,\n max_length: opt.max_length ?? null,\n autocomplete: opt.autocomplete === true,\n };\n })\n .sort((a, b) => String(a.name).localeCompare(String(b.name)));\n}","import type { Awaitable } from \"discord.js\";\nimport type { SpearClient } from \"./client.js\";\n\n/**\n * A spearkit plugin: a named, reusable bundle of commands, events and components.\n * Its {@link setup} runs once when added to a client via `client.use(plugin)`.\n */\nexport interface SpearPlugin {\n readonly name: string;\n setup(client: SpearClient): Awaitable<void>;\n}\n\n/** Identity helper that gives a plugin object its type and editor hints. */\nexport function definePlugin(plugin: SpearPlugin): SpearPlugin {\n return plugin;\n}\n"]}
|