@tokenomist-ai/tokenomist-cli 0.1.1 → 0.2.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/LICENSE +1 -1
- package/README.md +28 -14
- package/dist/chunk-DCGA3ANT.js +84 -0
- package/dist/chunk-DCGA3ANT.js.map +1 -0
- package/dist/index.js +454 -60
- package/dist/index.js.map +1 -1
- package/dist/update-check.js +3 -80
- package/dist/update-check.js.map +1 -1
- package/package.json +2 -2
- package/skills/tokenomist-allocation-breakdown/SKILL.md +2 -1
- package/skills/tokenomist-burn-buyback/SKILL.md +6 -2
- package/skills/tokenomist-emission-report/SKILL.md +4 -0
- package/skills/tokenomist-fundraising-lookup/SKILL.md +4 -0
- package/skills/tokenomist-point-in-time/SKILL.md +95 -0
- package/skills/tokenomist-unlock-analysis/SKILL.md +4 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/token.ts","../src/api/errors.ts","../src/api/retry.ts","../src/api/cache.ts","../src/api/client.ts","../src/api/token.ts","../src/output/table.ts","../src/output/csv.ts","../src/output/formatter.ts","../src/config/config.ts","../src/config/store.ts","../src/commands/unlock.ts","../src/api/unlock.ts","../src/commands/investor.ts","../src/api/investor.ts","../src/commands/fundraising.ts","../src/api/fundraising.ts","../src/commands/burn.ts","../src/api/burn.ts","../src/commands/buyback.ts","../src/api/buyback.ts","../src/commands/emission.ts","../src/api/emission.ts","../src/commands/allocation.ts","../src/api/allocation.ts","../src/commands/auth.ts","../src/commands/schema.ts","../src/schema.json","../src/banner.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { tokenCommand } from \"./commands/token.js\";\nimport { unlockCommand } from \"./commands/unlock.js\";\nimport { investorCommand } from \"./commands/investor.js\";\nimport { fundraisingCommand } from \"./commands/fundraising.js\";\nimport { burnCommand } from \"./commands/burn.js\";\nimport { buybackCommand } from \"./commands/buyback.js\";\nimport { emissionCommand } from \"./commands/emission.js\";\nimport { allocationCommand } from \"./commands/allocation.js\";\nimport { authCommand } from \"./commands/auth.js\";\nimport { schemaCommand } from \"./commands/schema.js\";\nimport { ApiError } from \"./api/errors.js\";\nimport { printWelcome } from \"./banner.js\";\nimport { spawn } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { fileURLToPath } from \"node:url\";\n\nconst ONE_DAY = 24 * 60 * 60 * 1000;\n\nfunction showUpdateNotification() {\n if (process.env.NO_UPDATE_NOTIFIER === \"1\" || process.env.CI === \"1\") return;\n try {\n const raw = readFileSync(join(homedir(), \".tokenomist\", \"update-check.json\"), \"utf-8\");\n const data = JSON.parse(raw);\n if (data.latest !== data.current && Date.now() - data.checkedAt < ONE_DAY) {\n process.stderr.write(\n `\\nUpdate available: ${data.current} → ${data.latest} (npm i -g @tokenomist-ai/tokenomist-cli)\\n\\n`,\n );\n }\n } catch {\n // No cache file or invalid — skip silently\n }\n}\n\nfunction showWelcomeBanner(): boolean {\n if (process.env.TOKENOMIST_NO_BANNER === \"1\") return false;\n if (process.env.CI === \"1\") return false;\n if (!process.stderr.isTTY) return false;\n if (process.argv.length > 2) return false;\n printWelcome(process.stderr);\n return true;\n}\n\nfunction spawnUpdateCheck() {\n if (process.env.NO_UPDATE_NOTIFIER === \"1\" || process.env.CI === \"1\") return;\n try {\n const script = fileURLToPath(new URL(\"./update-check.js\", import.meta.url));\n spawn(\"node\", [script], { detached: true, stdio: \"ignore\" }).unref();\n } catch {\n // Spawn failure — skip silently\n }\n}\n\nconst program = new Command();\n\nprogram\n .name(\"tok\")\n .description(\n \"CLI tool for the Tokenomist API — query token unlocks, emissions, fundraising, burns, and buybacks\",\n )\n .version(\"0.1.0\")\n .option(\"-k, --api-key <key>\", \"API key (overrides env/config)\")\n .option(\"-o, --output <format>\", \"Output format: table, json, csv\", \"table\")\n .option(\"--base-url <url>\", \"API base URL\")\n .option(\"--no-cache\", \"Bypass response cache\");\n\nprogram.addCommand(tokenCommand);\nprogram.addCommand(unlockCommand);\nprogram.addCommand(investorCommand);\nprogram.addCommand(fundraisingCommand);\nprogram.addCommand(burnCommand);\nprogram.addCommand(buybackCommand);\nprogram.addCommand(emissionCommand);\nprogram.addCommand(allocationCommand);\nprogram.addCommand(authCommand);\nprogram.addCommand(schemaCommand);\n\nif (showWelcomeBanner()) {\n spawnUpdateCheck();\n process.exit(0);\n}\n\nshowUpdateNotification();\n\nprogram\n .parseAsync(process.argv)\n .then(() => {\n spawnUpdateCheck();\n })\n .catch((err) => {\n if (err instanceof ApiError) {\n if (err.retriesExhausted) {\n // Retry log lines already printed to stderr; just show detail if present\n if (err.detail) console.error(`Detail: ${err.detail}`);\n } else {\n console.error(`${err.code}: ${err.message}`);\n if (err.detail) console.error(`Detail: ${err.detail}`);\n }\n } else {\n console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);\n }\n spawnUpdateCheck();\n process.exit(1);\n });\n","import { Command } from \"commander\";\nimport { TokenomistClient } from \"../api/client.js\";\nimport { listTokens, searchTokens } from \"../api/token.js\";\nimport { output } from \"../output/formatter.js\";\nimport type { Column } from \"../output/table.js\";\nimport { resolveConfig } from \"../config/config.js\";\n\nconst columns: Column[] = [\n { key: \"id\", header: \"ID\" },\n { key: \"name\", header: \"Name\" },\n { key: \"symbol\", header: \"Symbol\" },\n { key: \"marketCap\", header: \"Market Cap\", align: \"right\" },\n { key: \"circulatingSupply\", header: \"Circ. Supply\", align: \"right\" },\n { key: \"totalLockedAmount\", header: \"Locked\", align: \"right\" },\n { key: \"unlockedAmount\", header: \"Unlocked\", align: \"right\" },\n { key: \"lastUpdatedDate\", header: \"Updated\" },\n];\n\nconst searchColumns: Column[] = [\n { key: \"tokenId\", header: \"ID\" },\n { key: \"tokenName\", header: \"Name\" },\n { key: \"tokenSymbol\", header: \"Symbol\" },\n];\n\nexport const tokenCommand = new Command(\"token\").description(\"Token commands\");\n\ntokenCommand\n .command(\"list\")\n .description(\"List all tokens with summary data\")\n .option(\"--token-id <ids>\", \"Filter by token IDs (comma-separated)\")\n .action(async (opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n const data = await listTokens(client, {\n tokenId: opts.tokenId,\n });\n output(data as unknown as Record<string, unknown>[], columns, globalOpts.output || \"table\");\n });\n\ntokenCommand\n .command(\"search <query>\")\n .description(\"Search for tokens by name, symbol, or ID\")\n .action(async (query: string, _opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n const data = await searchTokens(client, query);\n output(\n data as unknown as Record<string, unknown>[],\n searchColumns,\n globalOpts.output || \"table\",\n );\n });\n","export enum ErrorCode {\n UNAUTHORIZED = \"UNAUTHORIZED\",\n FORBIDDEN = \"FORBIDDEN\",\n NOT_FOUND = \"NOT_FOUND\",\n RATE_LIMITED = \"RATE_LIMITED\",\n SERVER_ERROR = \"SERVER_ERROR\",\n NETWORK_ERROR = \"NETWORK_ERROR\",\n UNKNOWN = \"UNKNOWN\",\n}\n\nfunction classifyStatus(status: number): ErrorCode {\n if (status === 401) return ErrorCode.UNAUTHORIZED;\n if (status === 403) return ErrorCode.FORBIDDEN;\n if (status === 404) return ErrorCode.NOT_FOUND;\n if (status === 429) return ErrorCode.RATE_LIMITED;\n if (status >= 500 && status < 600) return ErrorCode.SERVER_ERROR;\n return ErrorCode.UNKNOWN;\n}\n\nfunction parseRetryAfter(value?: string): number | undefined {\n if (!value) return undefined;\n const seconds = Number(value);\n return Number.isFinite(seconds) && seconds > 0 ? seconds : undefined;\n}\n\nexport class ApiError extends Error {\n public retriesExhausted = false;\n\n constructor(\n message: string,\n public code: ErrorCode,\n public detail?: string,\n public statusCode?: number,\n public retryAfter?: number,\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n\n get retryable(): boolean {\n return (\n this.code === ErrorCode.RATE_LIMITED ||\n this.code === ErrorCode.SERVER_ERROR ||\n this.code === ErrorCode.NETWORK_ERROR\n );\n }\n\n static fromResponse(status: number, body: unknown, retryAfterHeader?: string): ApiError {\n const b = body && typeof body === \"object\" ? (body as Record<string, unknown>) : {};\n const errorMessage = typeof b.errorMessage === \"string\" ? b.errorMessage : undefined;\n const errorDetail = typeof b.errorDetail === \"string\" ? b.errorDetail : undefined;\n\n // API-level error: HTTP 200 but body.status === false\n if (status === 200 && b.status === false) {\n const bodyStatus = typeof b.statusCode === \"number\" ? b.statusCode : 0;\n const code = bodyStatus > 0 ? classifyStatus(bodyStatus) : ErrorCode.UNKNOWN;\n return new ApiError(\n errorMessage || \"API request failed\",\n code,\n errorDetail,\n bodyStatus || undefined,\n );\n }\n\n // HTTP-level error\n const code = classifyStatus(status);\n return new ApiError(\n errorMessage || `HTTP ${status}`,\n code,\n errorDetail,\n status,\n parseRetryAfter(retryAfterHeader),\n );\n }\n\n static fromNetworkError(error: unknown): ApiError {\n const message = error instanceof Error ? error.message : String(error);\n return new ApiError(message, ErrorCode.NETWORK_ERROR);\n }\n}\n","import { ApiError } from \"./errors.js\";\n\ninterface RetryOptions {\n maxAttempts?: number;\n baseDelay?: number;\n maxDelay?: number;\n}\n\nconst DEFAULTS = {\n maxAttempts: 3,\n baseDelay: 1000,\n maxDelay: 30_000,\n} as const;\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function withRetry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T> {\n const maxAttempts = options?.maxAttempts ?? DEFAULTS.maxAttempts;\n const baseDelay = options?.baseDelay ?? DEFAULTS.baseDelay;\n const maxDelay = options?.maxDelay ?? DEFAULTS.maxDelay;\n\n let lastError: ApiError | undefined;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (err) {\n if (!(err instanceof ApiError) || !err.retryable) {\n throw err;\n }\n\n lastError = err;\n\n if (attempt === maxAttempts) {\n break;\n }\n\n const jitter = Math.random() * 500;\n const calculated = baseDelay * Math.pow(2, attempt - 1) + jitter;\n const delay = err.retryAfter\n ? Math.min(err.retryAfter * 1000, maxDelay)\n : Math.min(calculated, maxDelay);\n\n process.stderr.write(\n `${err.code}: ${err.message}. Retrying in ${Math.round(delay / 1000)}s... (attempt ${attempt + 1}/${maxAttempts})\\n`,\n );\n\n await sleep(delay);\n }\n }\n\n lastError!.retriesExhausted = true;\n throw lastError;\n}\n","import { createHash } from \"node:crypto\";\nimport { readFileSync, writeFileSync, mkdirSync, unlinkSync, readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\ninterface CacheEntry {\n url: string;\n timestamp: number;\n ttl: number;\n data: unknown;\n}\n\nconst DEFAULT_CACHE_DIR = join(homedir(), \".tokenomist\", \"cache\");\nconst MAX_CACHE_FILES = 500;\n\nexport class ResponseCache {\n private writeCount = 0;\n\n constructor(\n private ttl: number = 600_000,\n private cacheDir: string = DEFAULT_CACHE_DIR,\n ) {}\n\n buildKey(url: string, apiKey?: string): string {\n const parsed = new URL(url);\n parsed.searchParams.sort();\n const prefix = apiKey ? createHash(\"md5\").update(apiKey).digest(\"hex\").slice(0, 8) : \"\";\n const normalized = `${prefix}:GET:${parsed.toString()}`;\n return createHash(\"md5\").update(normalized).digest(\"hex\");\n }\n\n get<T>(key: string): T | null {\n try {\n const filePath = join(this.cacheDir, `${key}.json`);\n const raw = readFileSync(filePath, \"utf-8\");\n const entry = JSON.parse(raw) as CacheEntry;\n\n if (Date.now() - entry.timestamp > entry.ttl) {\n try {\n unlinkSync(filePath);\n } catch {\n /* ignore */\n }\n return null;\n }\n\n return entry.data as T;\n } catch {\n return null;\n }\n }\n\n set(key: string, url: string, data: unknown): void {\n try {\n mkdirSync(this.cacheDir, { recursive: true, mode: 0o700 });\n const entry: CacheEntry = {\n url,\n timestamp: Date.now(),\n ttl: this.ttl,\n data,\n };\n const filePath = join(this.cacheDir, `${key}.json`);\n writeFileSync(filePath, JSON.stringify(entry), { encoding: \"utf-8\", mode: 0o600 });\n\n this.writeCount++;\n if (this.writeCount % 20 === 0) this.sweep();\n } catch {\n // Cache is best-effort — silently ignore write failures\n }\n }\n\n private sweep(): void {\n try {\n const files = readdirSync(this.cacheDir).filter((f) => f.endsWith(\".json\"));\n\n // Remove expired entries\n const now = Date.now();\n for (const file of files) {\n try {\n const filePath = join(this.cacheDir, file);\n const raw = readFileSync(filePath, \"utf-8\");\n const entry = JSON.parse(raw) as CacheEntry;\n if (now - entry.timestamp > entry.ttl) {\n unlinkSync(filePath);\n }\n } catch {\n /* ignore individual file errors */\n }\n }\n\n // If still over limit, remove oldest entries\n const remaining = readdirSync(this.cacheDir).filter((f) => f.endsWith(\".json\"));\n if (remaining.length > MAX_CACHE_FILES) {\n const entries = remaining.map((file) => {\n try {\n const filePath = join(this.cacheDir, file);\n const raw = readFileSync(filePath, \"utf-8\");\n const entry = JSON.parse(raw) as CacheEntry;\n return { file, timestamp: entry.timestamp };\n } catch {\n return { file, timestamp: 0 };\n }\n });\n entries.sort((a, b) => a.timestamp - b.timestamp);\n const toRemove = entries.slice(0, entries.length - MAX_CACHE_FILES);\n for (const { file } of toRemove) {\n try {\n unlinkSync(join(this.cacheDir, file));\n } catch {\n /* ignore */\n }\n }\n }\n } catch {\n /* sweep is best-effort */\n }\n }\n}\n","import type { ApiResponse } from \"../types/response.js\";\nimport { ApiError } from \"./errors.js\";\nimport { withRetry } from \"./retry.js\";\nimport { ResponseCache } from \"./cache.js\";\n\nexport { ApiError } from \"./errors.js\";\n\nconst HEADER_API_KEY = \"x-api-key\";\nconst HEADER_CLIENT_SOURCE = \"x-client-source\";\nconst CLIENT_SOURCE_CLI = \"cli\";\n\nexport class TokenomistClient {\n private cache: ResponseCache;\n\n constructor(\n private apiKey: string,\n private baseUrl: string,\n private options?: { noCache?: boolean },\n ) {\n this.cache = new ResponseCache();\n }\n\n async get<T>(path: string, params?: Record<string, string>): Promise<T> {\n const url = this.buildUrl(path, params);\n const urlStr = url.toString();\n const cacheKey = this.cache.buildKey(urlStr, this.apiKey);\n const useCache = this.options?.noCache !== true;\n\n if (useCache) {\n const cached = this.cache.get<T>(cacheKey);\n if (cached) return cached;\n }\n\n const data = await withRetry(() => this.fetchFromApi<T>(url));\n\n if (useCache) {\n this.cache.set(cacheKey, urlStr, data);\n }\n\n return data;\n }\n\n private buildUrl(path: string, params?: Record<string, string>): URL {\n const url = new URL(path, this.baseUrl);\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== \"\") {\n url.searchParams.set(key, value);\n }\n }\n }\n return url;\n }\n\n private async fetchFromApi<T>(url: URL): Promise<T> {\n let res: Response;\n try {\n res = await fetch(url.toString(), {\n headers: {\n [HEADER_API_KEY]: this.apiKey,\n [HEADER_CLIENT_SOURCE]: CLIENT_SOURCE_CLI,\n },\n });\n } catch (err) {\n throw ApiError.fromNetworkError(err);\n }\n\n if (!res.ok) {\n let body: unknown = {};\n try {\n body = await res.json();\n } catch {\n // Response may not be JSON\n }\n const retryAfter = res.headers.get(\"retry-after\") ?? undefined;\n throw ApiError.fromResponse(res.status, body, retryAfter);\n }\n\n const body = (await res.json()) as ApiResponse<T>;\n\n if (!body.status) {\n throw ApiError.fromResponse(200, body);\n }\n\n return body.data as T;\n }\n}\n","import type { TokenomistClient } from \"./client.js\";\nimport type { TokenV4, SearchTokenV5 } from \"../types/token.js\";\n\nexport async function listTokens(\n client: TokenomistClient,\n params?: { tokenId?: string },\n): Promise<TokenV4[]> {\n return client.get<TokenV4[]>(\"/v5/token/list\", params as Record<string, string>);\n}\n\nexport async function searchTokens(\n client: TokenomistClient,\n query: string,\n): Promise<SearchTokenV5[]> {\n return client.get<SearchTokenV5[]>(\"/v5/search-token\", { query });\n}\n","import Table from \"cli-table3\";\n\nexport interface Column {\n key: string;\n header: string;\n align?: \"left\" | \"right\" | \"center\";\n}\n\nexport function renderTable(data: Record<string, unknown>[], columns: Column[]): string {\n const table = new Table({\n head: columns.map((c) => c.header),\n style: { head: [\"cyan\"] },\n colAligns: columns.map((c) => c.align || \"left\"),\n });\n\n for (const row of data) {\n table.push(columns.map((c) => formatValue(row[c.key])));\n }\n\n return table.toString();\n}\n\nfunction formatValue(value: unknown): string {\n if (value === null || value === undefined) return \"\\u2014\";\n if (typeof value === \"number\") {\n if (Number.isInteger(value)) return value.toLocaleString();\n return value.toLocaleString(undefined, { maximumFractionDigits: 4 });\n }\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n if (Array.isArray(value)) return value.join(\", \");\n return String(value);\n}\n","import type { Column } from \"./table.js\";\n\nexport function renderCsv(data: Record<string, unknown>[], columns: Column[]): string {\n const header = columns.map((c) => escapeCsv(c.header)).join(\",\");\n const rows = data.map((row) =>\n columns.map((c) => escapeCsv(formatCsvValue(row[c.key]))).join(\",\"),\n );\n return [header, ...rows].join(\"\\n\");\n}\n\nfunction escapeCsv(value: string): string {\n if (value.includes(\",\") || value.includes('\"') || value.includes(\"\\n\")) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n}\n\nfunction formatCsvValue(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (Array.isArray(value)) return value.join(\"; \");\n return String(value);\n}\n","import type { Column } from \"./table.js\";\nimport { renderTable } from \"./table.js\";\nimport { renderCsv } from \"./csv.js\";\n\nexport type OutputMode = \"table\" | \"json\" | \"csv\";\n\nexport function format(\n data: Record<string, unknown>[],\n columns: Column[],\n mode: OutputMode,\n): string {\n switch (mode) {\n case \"json\":\n return JSON.stringify(data, null, 2);\n case \"csv\":\n return renderCsv(data, columns);\n case \"table\":\n default:\n return renderTable(data, columns);\n }\n}\n\nexport function output(data: Record<string, unknown>[], columns: Column[], mode: OutputMode): void {\n console.log(format(data, columns, mode));\n}\n","import { config as loadDotenv } from \"dotenv\";\nimport { loadConfigFile } from \"./store.js\";\n\nloadDotenv();\n\nexport interface Config {\n apiKey: string;\n baseUrl: string;\n noCache: boolean;\n}\n\nexport function resolveConfig(opts: {\n apiKey?: string;\n baseUrl?: string;\n cache?: boolean;\n}): Config {\n const file = loadConfigFile();\n\n const apiKey = opts.apiKey || process.env.TOKENOMIST_API_KEY || file.apiKey || \"\";\n const baseUrl =\n opts.baseUrl || process.env.TOKENOMIST_BASE_URL || file.baseUrl || \"https://api.tokenomist.ai\";\n\n if (!apiKey) {\n console.error(\n 'Error: API key is required. Run \"tok auth login\" or provide via --api-key / TOKENOMIST_API_KEY env var.',\n );\n process.exit(1);\n }\n\n return { apiKey, baseUrl, noCache: opts.cache === false };\n}\n","import { readFileSync, writeFileSync, mkdirSync, unlinkSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nconst CONFIG_DIR = join(homedir(), \".tokenomist\");\nconst CONFIG_PATH = join(CONFIG_DIR, \"config.json\");\n\nexport interface ConfigFile {\n apiKey?: string;\n baseUrl?: string;\n}\n\nexport function getConfigPath(): string {\n return CONFIG_PATH;\n}\n\nexport function loadConfigFile(): ConfigFile {\n try {\n const raw = readFileSync(CONFIG_PATH, \"utf-8\");\n return JSON.parse(raw) as ConfigFile;\n } catch {\n return {};\n }\n}\n\nexport function saveConfigFile(config: ConfigFile): void {\n mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + \"\\n\", {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n}\n\nexport function deleteConfigFile(): void {\n try {\n unlinkSync(CONFIG_PATH);\n } catch {\n // file doesn't exist, that's fine\n }\n}\n\nexport function maskApiKey(key: string): string {\n if (key.length <= 8) return \"****\";\n return key.slice(0, 4) + \"****\" + key.slice(-4);\n}\n","import { Command } from \"commander\";\nimport { TokenomistClient } from \"../api/client.js\";\nimport { listUnlockEvents, listUpcomingUnlockEvents, getUnlockEvents } from \"../api/unlock.js\";\nimport { output } from \"../output/formatter.js\";\nimport type { Column } from \"../output/table.js\";\nimport { resolveConfig } from \"../config/config.js\";\n\nconst listColumns: Column[] = [\n { key: \"tokenName\", header: \"Token\" },\n { key: \"tokenSymbol\", header: \"Symbol\" },\n { key: \"marketCap\", header: \"Market Cap\", align: \"right\" },\n { key: \"releasedPercentage\", header: \"Released %\", align: \"right\" },\n { key: \"eventCount\", header: \"Events\", align: \"right\" },\n];\n\nconst upcomingColumns: Column[] = [\n { key: \"tokenName\", header: \"Token\" },\n { key: \"tokenSymbol\", header: \"Symbol\" },\n { key: \"marketCap\", header: \"Market Cap\", align: \"right\" },\n { key: \"unlockDate\", header: \"Unlock Date\" },\n { key: \"totalCliffAmount\", header: \"Cliff Amount\", align: \"right\" },\n { key: \"totalCliffValue\", header: \"Cliff Value\", align: \"right\" },\n];\n\nconst eventsColumns: Column[] = [\n { key: \"unlockDate\", header: \"Date\" },\n { key: \"tokenName\", header: \"Token\" },\n { key: \"tokenSymbol\", header: \"Symbol\" },\n { key: \"cliffAmount\", header: \"Amount\", align: \"right\" },\n { key: \"cliffValue\", header: \"Value\", align: \"right\" },\n { key: \"valueToMarketCap\", header: \"Val/MCap\", align: \"right\" },\n];\n\nfunction addPaginationOptions(cmd: Command): Command {\n return cmd\n .option(\"--page <number>\", \"Page number\")\n .option(\"--page-size <number>\", \"Items per page\");\n}\n\nfunction addListFilterOptions(cmd: Command): Command {\n return addPaginationOptions(\n cmd\n .option(\"--min-market-cap <value>\", \"Minimum market cap\")\n .option(\"--min-released-percentage <value>\", \"Minimum released percentage\")\n .option(\"--min-unlock-date <date>\", \"Min unlock date (YYYY-MM-DD)\")\n .option(\"--max-unlock-date <date>\", \"Max unlock date (YYYY-MM-DD)\")\n .option(\"--min-total-unlock-amount <value>\", \"Minimum total unlock amount\")\n .option(\"--min-value-to-market-cap <value>\", \"Min value-to-market-cap ratio\")\n .option(\"--standard-allocation <names>\", \"Filter by allocation (comma-separated)\"),\n );\n}\n\nfunction addUpcomingFilterOptions(cmd: Command): Command {\n return addPaginationOptions(\n cmd\n .option(\"--start <date>\", \"Start date (YYYY-MM-DD)\")\n .option(\"--end <date>\", \"End date (YYYY-MM-DD)\")\n .option(\"--standard-allocation <names>\", \"Filter by allocation (comma-separated)\")\n .option(\"--min-market-cap <value>\", \"Minimum market cap\")\n .option(\"--min-released-percentage <value>\", \"Minimum released percentage\")\n .option(\"--min-total-unlock-amount <value>\", \"Minimum total unlock amount\")\n .option(\"--min-value-to-market-cap <value>\", \"Min value-to-market-cap ratio\"),\n );\n}\n\nexport const unlockCommand = new Command(\"unlock\").description(\"Token unlock event commands\");\n\naddListFilterOptions(\n unlockCommand.command(\"list\").description(\"List unlock events grouped by token\"),\n).action(async (opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n const data = await listUnlockEvents(client, {\n minMarketCap: opts.minMarketCap,\n minReleasedPercentage: opts.minReleasedPercentage,\n minUnlockDate: opts.minUnlockDate,\n maxUnlockDate: opts.maxUnlockDate,\n minTotalUnlockAmount: opts.minTotalUnlockAmount,\n minValueToMarketCap: opts.minValueToMarketCap,\n standardAllocation: opts.standardAllocation,\n page: opts.page,\n pageSize: opts.pageSize,\n });\n const rows = data.map((d) => ({\n ...d,\n eventCount: d.events.length,\n }));\n output(rows as unknown as Record<string, unknown>[], listColumns, globalOpts.output || \"table\");\n});\n\naddUpcomingFilterOptions(\n unlockCommand.command(\"upcoming\").description(\"List next upcoming unlock event per token\"),\n).action(async (opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n const data = await listUpcomingUnlockEvents(client, {\n start: opts.start,\n end: opts.end,\n standardAllocation: opts.standardAllocation,\n minMarketCap: opts.minMarketCap,\n minReleasedPercentage: opts.minReleasedPercentage,\n minTotalUnlockAmount: opts.minTotalUnlockAmount,\n minValueToMarketCap: opts.minValueToMarketCap,\n page: opts.page,\n pageSize: opts.pageSize,\n });\n const rows = data.map((d) => ({\n ...d,\n unlockDate: d.upcomingEvent.unlockDate,\n totalCliffAmount: d.upcomingEvent.cliffUnlocks.totalCliffAmount,\n totalCliffValue: d.upcomingEvent.cliffUnlocks.totalCliffValue,\n }));\n output(\n rows as unknown as Record<string, unknown>[],\n upcomingColumns,\n globalOpts.output || \"table\",\n );\n});\n\naddPaginationOptions(\n unlockCommand\n .command(\"events <tokenId>\")\n .description(\"Get unlock events for a specific token\")\n .option(\"--start <date>\", \"Start date (YYYY-MM-DD)\")\n .option(\"--end <date>\", \"End date (YYYY-MM-DD)\")\n .option(\"--standard-allocation <names>\", \"Filter by allocation (comma-separated)\"),\n).action(async (tokenId: string, opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n const data = await getUnlockEvents(client, tokenId, {\n start: opts.start,\n end: opts.end,\n standardAllocation: opts.standardAllocation,\n page: opts.page,\n pageSize: opts.pageSize,\n });\n const rows = data.map((d) => ({\n ...d,\n cliffAmount: d.cliffUnlocks.cliffAmount,\n cliffValue: d.cliffUnlocks.cliffValue,\n valueToMarketCap: d.cliffUnlocks.valueToMarketCap,\n }));\n output(rows as unknown as Record<string, unknown>[], eventsColumns, globalOpts.output || \"table\");\n});\n","import type { TokenomistClient } from \"./client.js\";\nimport type { UnlockEventList, UnlockEventListUpcoming, UnlockEventV4 } from \"../types/unlock.js\";\n\nexport interface UnlockListParams {\n minMarketCap?: string;\n minReleasedPercentage?: string;\n minUnlockDate?: string;\n maxUnlockDate?: string;\n minTotalUnlockAmount?: string;\n minValueToMarketCap?: string;\n standardAllocation?: string;\n page?: string;\n pageSize?: string;\n}\n\nexport interface UnlockUpcomingParams {\n start?: string;\n end?: string;\n standardAllocation?: string;\n minMarketCap?: string;\n minReleasedPercentage?: string;\n minTotalUnlockAmount?: string;\n minValueToMarketCap?: string;\n page?: string;\n pageSize?: string;\n}\n\nexport interface UnlockEventsParams {\n standardAllocation?: string;\n start?: string;\n end?: string;\n page?: string;\n pageSize?: string;\n}\n\nexport async function listUnlockEvents(\n client: TokenomistClient,\n params?: UnlockListParams,\n): Promise<UnlockEventList[]> {\n return client.get<UnlockEventList[]>(\"/v5/unlock/events/list\", params as Record<string, string>);\n}\n\nexport async function listUpcomingUnlockEvents(\n client: TokenomistClient,\n params?: UnlockUpcomingParams,\n): Promise<UnlockEventListUpcoming[]> {\n return client.get<UnlockEventListUpcoming[]>(\n \"/v5/unlock/events/upcoming\",\n params as Record<string, string>,\n );\n}\n\nexport async function getUnlockEvents(\n client: TokenomistClient,\n tokenId: string,\n params?: UnlockEventsParams,\n): Promise<UnlockEventV4[]> {\n return client.get<UnlockEventV4[]>(\n `/v5/unlock/events/${encodeURIComponent(tokenId)}`,\n params as Record<string, string>,\n );\n}\n","import { Command } from \"commander\";\nimport { TokenomistClient } from \"../api/client.js\";\nimport { listInvestors, getInvestorDetail } from \"../api/investor.js\";\nimport { output } from \"../output/formatter.js\";\nimport type { Column } from \"../output/table.js\";\nimport { resolveConfig } from \"../config/config.js\";\n\nconst listColumns: Column[] = [\n { key: \"investorId\", header: \"ID\" },\n { key: \"investorName\", header: \"Name\" },\n { key: \"website\", header: \"Website\" },\n { key: \"latestFundingDate\", header: \"Latest Funding\" },\n { key: \"latestFundingRound\", header: \"Latest Round\" },\n { key: \"roundCount\", header: \"Rounds\", align: \"right\" },\n];\n\nconst detailColumns: Column[] = [\n { key: \"tokenId\", header: \"Token ID\" },\n { key: \"roundName\", header: \"Round\" },\n { key: \"isLeadInvestor\", header: \"Lead?\" },\n { key: \"fundingDate\", header: \"Date\" },\n { key: \"totalAmountRaisedinThatRound\", header: \"Raised\", align: \"right\" },\n { key: \"valuation\", header: \"Valuation\", align: \"right\" },\n { key: \"pricePerToken\", header: \"Price/Token\", align: \"right\" },\n];\n\nexport const investorCommand = new Command(\"investor\").description(\"Investor commands\");\n\ninvestorCommand\n .command(\"list\")\n .description(\"List all investors with their funding rounds\")\n .option(\"--start-latest-funding-date <date>\", \"Start date filter for latest funding (YYYY-MM-DD)\")\n .option(\"--end-latest-funding-date <date>\", \"End date filter for latest funding (YYYY-MM-DD)\")\n .option(\"--page <number>\", \"Page number\")\n .option(\"--page-size <number>\", \"Items per page\")\n .action(async (opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n const data = await listInvestors(client, {\n startLatestFundingDate: opts.startLatestFundingDate,\n endLatestFundingDate: opts.endLatestFundingDate,\n page: opts.page,\n pageSize: opts.pageSize,\n });\n const rows = data.map((d) => ({\n ...d,\n roundCount: d.fundingRounds?.length || 0,\n }));\n output(rows as unknown as Record<string, unknown>[], listColumns, globalOpts.output || \"table\");\n });\n\ninvestorCommand\n .command(\"detail <investorId>\")\n .description(\"Get investor detail with funding rounds\")\n .option(\"--is-lead-investor\", \"Filter by lead investor status\")\n .option(\"--funding-date-min <date>\", \"Min funding date (YYYY-MM-DD)\")\n .option(\"--funding-date-max <date>\", \"Max funding date (YYYY-MM-DD)\")\n .option(\"--raised-amount-min <value>\", \"Min raised amount\")\n .option(\"--raised-amount-max <value>\", \"Max raised amount\")\n .action(async (investorId: string, opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n const data = await getInvestorDetail(client, investorId, {\n isLeadInvestor: opts.isLeadInvestor ? \"true\" : undefined,\n fundingDateMin: opts.fundingDateMin,\n fundingDateMax: opts.fundingDateMax,\n raisedAmountMin: opts.raisedAmountMin,\n raisedAmountMax: opts.raisedAmountMax,\n });\n const outputMode = globalOpts.output || \"table\";\n if (outputMode === \"json\") {\n console.log(JSON.stringify(data, null, 2));\n } else {\n console.log(`Investor: ${data.investorName}`);\n console.log(`Website: ${data.website}`);\n console.log(`Latest Funding: ${data.latestFundingDate}`);\n console.log();\n output(data.fundingRounds as unknown as Record<string, unknown>[], detailColumns, outputMode);\n }\n });\n","import type { TokenomistClient } from \"./client.js\";\nimport type { FundraisingInvestors, FundraisingInvestorsAggregated } from \"../types/investor.js\";\n\nexport interface InvestorListParams {\n startLatestFundingDate?: string;\n endLatestFundingDate?: string;\n page?: string;\n pageSize?: string;\n}\n\nexport async function listInvestors(\n client: TokenomistClient,\n params?: InvestorListParams,\n): Promise<FundraisingInvestors[]> {\n return client.get<FundraisingInvestors[]>(\n \"/v5/fundraising/investors/list\",\n params as Record<string, string>,\n );\n}\n\nexport interface InvestorDetailParams {\n isLeadInvestor?: string;\n fundingDateMin?: string;\n fundingDateMax?: string;\n raisedAmountMin?: string;\n raisedAmountMax?: string;\n}\n\nexport async function getInvestorDetail(\n client: TokenomistClient,\n investorId: string,\n params?: InvestorDetailParams,\n): Promise<FundraisingInvestorsAggregated> {\n return client.get<FundraisingInvestorsAggregated>(\n `/v5/fundraising/investors/${encodeURIComponent(investorId)}`,\n params as Record<string, string>,\n );\n}\n","import { Command } from \"commander\";\nimport { TokenomistClient } from \"../api/client.js\";\nimport { getFundraising } from \"../api/fundraising.js\";\nimport { output } from \"../output/formatter.js\";\nimport type { Column } from \"../output/table.js\";\nimport { resolveConfig } from \"../config/config.js\";\n\nconst columns: Column[] = [\n { key: \"fundingRound\", header: \"Round\" },\n { key: \"fundingDate\", header: \"Date\" },\n { key: \"raiseType\", header: \"Type\" },\n { key: \"amountRaised\", header: \"Raised\", align: \"right\" },\n { key: \"valuation\", header: \"Valuation\", align: \"right\" },\n { key: \"pricePerToken\", header: \"Price/Token\", align: \"right\" },\n { key: \"numberOfInvestors\", header: \"Investors\", align: \"right\" },\n];\n\nexport const fundraisingCommand = new Command(\"fundraising\").description(\n \"Token fundraising commands\",\n);\n\nfundraisingCommand\n .command(\"detail <tokenId>\")\n .description(\"Get fundraising data for a specific token\")\n .option(\"--funding-date-min <date>\", \"Min funding date (YYYY-MM-DD)\")\n .option(\"--funding-date-max <date>\", \"Max funding date (YYYY-MM-DD)\")\n .option(\"--raised-amount-min <value>\", \"Min raised amount\")\n .option(\"--raised-amount-max <value>\", \"Max raised amount\")\n .action(async (tokenId: string, opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n const data = await getFundraising(client, tokenId, {\n fundingDateMin: opts.fundingDateMin,\n fundingDateMax: opts.fundingDateMax,\n raisedAmountMin: opts.raisedAmountMin,\n raisedAmountMax: opts.raisedAmountMax,\n });\n const outputMode = globalOpts.output || \"table\";\n if (outputMode === \"json\") {\n console.log(JSON.stringify(data, null, 2));\n } else {\n console.log(`Token: ${data.tokenName} (${data.tokenSymbol})`);\n console.log(`Total Raised: ${data.totalAmountRaised ?? \"\\u2014\"}`);\n console.log(`Investor Released: ${data.investorReleasedPercentage ?? \"\\u2014\"}%`);\n console.log();\n output(data.fundingRounds as unknown as Record<string, unknown>[], columns, outputMode);\n }\n });\n","import type { TokenomistClient } from \"./client.js\";\nimport type { FundraisingToken } from \"../types/fundraising.js\";\n\nexport interface FundraisingParams {\n fundingDateMin?: string;\n fundingDateMax?: string;\n raisedAmountMin?: string;\n raisedAmountMax?: string;\n}\n\nexport async function getFundraising(\n client: TokenomistClient,\n tokenId: string,\n params?: FundraisingParams,\n): Promise<FundraisingToken> {\n return client.get<FundraisingToken>(\n `/v5/fundraising/token/${encodeURIComponent(tokenId)}`,\n params as Record<string, string>,\n );\n}\n","import { Command } from \"commander\";\nimport { TokenomistClient } from \"../api/client.js\";\nimport { listBurns, getBurnDetail } from \"../api/burn.js\";\nimport { output } from \"../output/formatter.js\";\nimport type { Column } from \"../output/table.js\";\nimport { resolveConfig } from \"../config/config.js\";\n\nconst listColumns: Column[] = [\n { key: \"tokenId\", header: \"ID\" },\n { key: \"tokenName\", header: \"Name\" },\n { key: \"tokenSymbol\", header: \"Symbol\" },\n { key: \"totalBurnAmount\", header: \"Total Burned\", align: \"right\" },\n];\n\nconst detailColumns: Column[] = [\n { key: \"burnEventLabel\", header: \"Label\" },\n { key: \"burnType\", header: \"Type\" },\n { key: \"burnDate\", header: \"Date\" },\n { key: \"amount\", header: \"Amount\", align: \"right\" },\n];\n\nexport const burnCommand = new Command(\"burn\").description(\"Token burn commands\");\n\nburnCommand\n .command(\"list\")\n .description(\"List all tokens with burn events\")\n .option(\"--token-id <ids>\", \"Filter by token IDs (comma-separated)\")\n .option(\"--page <number>\", \"Page number\")\n .option(\"--page-size <number>\", \"Items per page\")\n .action(async (opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n const data = await listBurns(client, {\n tokenId: opts.tokenId,\n page: opts.page,\n pageSize: opts.pageSize,\n });\n output(data as unknown as Record<string, unknown>[], listColumns, globalOpts.output || \"table\");\n });\n\nburnCommand\n .command(\"detail <tokenId>\")\n .description(\"Get burn events for a specific token\")\n .option(\"--start <date>\", \"Start date (YYYY-MM-DD)\")\n .option(\"--end <date>\", \"End date (YYYY-MM-DD)\")\n .action(async (tokenId: string, opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n const data = await getBurnDetail(client, tokenId, {\n start: opts.start,\n end: opts.end,\n });\n const outputMode = globalOpts.output || \"table\";\n if (outputMode === \"json\") {\n console.log(JSON.stringify(data, null, 2));\n } else {\n console.log(`Token: ${data.tokenName} (${data.tokenSymbol})`);\n console.log(`Total Burned: ${data.totalBurnAmount.toLocaleString()}`);\n console.log();\n output(data.burns as unknown as Record<string, unknown>[], detailColumns, outputMode);\n }\n });\n","import type { TokenomistClient } from \"./client.js\";\nimport type { BurnTokenList, BurnToken } from \"../types/burn.js\";\n\nexport interface BurnListParams {\n tokenId?: string;\n page?: string;\n pageSize?: string;\n}\n\nexport async function listBurns(\n client: TokenomistClient,\n params?: BurnListParams,\n): Promise<BurnTokenList[]> {\n return client.get<BurnTokenList[]>(\"/v5/burn/list\", params as Record<string, string>);\n}\n\nexport async function getBurnDetail(\n client: TokenomistClient,\n tokenId: string,\n params?: { start?: string; end?: string },\n): Promise<BurnToken> {\n return client.get<BurnToken>(\n `/v5/burn/${encodeURIComponent(tokenId)}`,\n params as Record<string, string>,\n );\n}\n","import { Command } from \"commander\";\nimport { TokenomistClient } from \"../api/client.js\";\nimport { listBuybacks, getBuybackDetail } from \"../api/buyback.js\";\nimport { output } from \"../output/formatter.js\";\nimport type { Column } from \"../output/table.js\";\nimport { resolveConfig } from \"../config/config.js\";\n\nconst listColumns: Column[] = [\n { key: \"tokenId\", header: \"ID\" },\n { key: \"tokenName\", header: \"Name\" },\n { key: \"tokenSymbol\", header: \"Symbol\" },\n { key: \"totalBuybackAmount\", header: \"Total Buyback\", align: \"right\" },\n];\n\nconst detailColumns: Column[] = [\n { key: \"buybackEventLabel\", header: \"Label\" },\n { key: \"buybackType\", header: \"Type\" },\n { key: \"buybackDate\", header: \"Date\" },\n { key: \"tokenAmount\", header: \"Amount\", align: \"right\" },\n { key: \"value\", header: \"Value\", align: \"right\" },\n { key: \"spentAmount\", header: \"Spent\", align: \"right\" },\n { key: \"spentUnit\", header: \"Unit\" },\n];\n\nexport const buybackCommand = new Command(\"buyback\").description(\"Token buyback commands\");\n\nbuybackCommand\n .command(\"list\")\n .description(\"List all tokens with buyback events\")\n .option(\"--token-id <ids>\", \"Filter by token IDs (comma-separated)\")\n .option(\"--page <number>\", \"Page number\")\n .option(\"--page-size <number>\", \"Items per page\")\n .action(async (opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n const data = await listBuybacks(client, {\n tokenId: opts.tokenId,\n page: opts.page,\n pageSize: opts.pageSize,\n });\n output(data as unknown as Record<string, unknown>[], listColumns, globalOpts.output || \"table\");\n });\n\nbuybackCommand\n .command(\"detail <tokenId>\")\n .description(\"Get buyback events for a specific token\")\n .option(\"--start <date>\", \"Start date (YYYY-MM-DD)\")\n .option(\"--end <date>\", \"End date (YYYY-MM-DD)\")\n .action(async (tokenId: string, opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n const data = await getBuybackDetail(client, tokenId, {\n start: opts.start,\n end: opts.end,\n });\n const outputMode = globalOpts.output || \"table\";\n if (outputMode === \"json\") {\n console.log(JSON.stringify(data, null, 2));\n } else {\n console.log(`Token: ${data.tokenName} (${data.tokenSymbol})`);\n console.log(`Total Buyback: ${data.totalBuybackAmount.toLocaleString()}`);\n console.log();\n output(data.buybacks as unknown as Record<string, unknown>[], detailColumns, outputMode);\n }\n });\n","import type { TokenomistClient } from \"./client.js\";\nimport type { BuybackTokenList, BuybackToken } from \"../types/buyback.js\";\n\nexport interface BuybackListParams {\n tokenId?: string;\n page?: string;\n pageSize?: string;\n}\n\nexport async function listBuybacks(\n client: TokenomistClient,\n params?: BuybackListParams,\n): Promise<BuybackTokenList[]> {\n return client.get<BuybackTokenList[]>(\"/v5/buyback/list\", params as Record<string, string>);\n}\n\nexport async function getBuybackDetail(\n client: TokenomistClient,\n tokenId: string,\n params?: { start?: string; end?: string },\n): Promise<BuybackToken> {\n return client.get<BuybackToken>(\n `/v5/buyback/${encodeURIComponent(tokenId)}`,\n params as Record<string, string>,\n );\n}\n","import { Command } from \"commander\";\nimport { TokenomistClient } from \"../api/client.js\";\nimport { getDailyEmission, getWeeklyEmission } from \"../api/emission.js\";\nimport { output } from \"../output/formatter.js\";\nimport type { Column } from \"../output/table.js\";\nimport { resolveConfig } from \"../config/config.js\";\n\nconst columns: Column[] = [\n { key: \"startDate\", header: \"Start\" },\n { key: \"endDate\", header: \"End\" },\n { key: \"tokenName\", header: \"Token\" },\n { key: \"tokenSymbol\", header: \"Symbol\" },\n { key: \"unlockAmount\", header: \"Unlock Amt\", align: \"right\" },\n { key: \"unlockValue\", header: \"Unlock Val\", align: \"right\" },\n { key: \"referencePrice\", header: \"Ref Price\", align: \"right\" },\n { key: \"totalCumulativeUnlockedAmount\", header: \"Cumulative\", align: \"right\" },\n];\n\nexport const emissionCommand = new Command(\"emission\").description(\"Token emission commands\");\n\nemissionCommand\n .command(\"daily <tokenId>\")\n .description(\"Get daily emission breakdown for a token\")\n .option(\"--start <date>\", \"Start date (YYYY-MM-DD)\")\n .option(\"--end <date>\", \"End date (YYYY-MM-DD)\")\n .option(\"--standard-allocation <names>\", \"Filter by allocation (comma-separated)\")\n .option(\"--page <number>\", \"Page number\")\n .option(\"--page-size <number>\", \"Items per page\")\n .action(async (tokenId: string, opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n const data = await getDailyEmission(client, tokenId, {\n start: opts.start,\n end: opts.end,\n standardAllocation: opts.standardAllocation,\n page: opts.page,\n pageSize: opts.pageSize,\n });\n output(data as unknown as Record<string, unknown>[], columns, globalOpts.output || \"table\");\n });\n\nemissionCommand\n .command(\"weekly <tokenId>\")\n .description(\"Get weekly emission breakdown for a token\")\n .option(\"--start <date>\", \"Start date (YYYY-MM-DD)\")\n .option(\"--end <date>\", \"End date (YYYY-MM-DD)\")\n .option(\"--standard-allocation <names>\", \"Filter by allocation (comma-separated)\")\n .option(\"--page <number>\", \"Page number\")\n .option(\"--page-size <number>\", \"Items per page\")\n .action(async (tokenId: string, opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n const data = await getWeeklyEmission(client, tokenId, {\n start: opts.start,\n end: opts.end,\n standardAllocation: opts.standardAllocation,\n page: opts.page,\n pageSize: opts.pageSize,\n });\n output(data as unknown as Record<string, unknown>[], columns, globalOpts.output || \"table\");\n });\n","import type { TokenomistClient } from \"./client.js\";\nimport type { EmissionBreakdown } from \"../types/emission.js\";\n\nexport interface EmissionParams {\n standardAllocation?: string;\n start?: string;\n end?: string;\n page?: string;\n pageSize?: string;\n}\n\nexport async function getDailyEmission(\n client: TokenomistClient,\n tokenId: string,\n params?: EmissionParams,\n): Promise<EmissionBreakdown[]> {\n return client.get<EmissionBreakdown[]>(\n `/v5/daily-emission/${encodeURIComponent(tokenId)}`,\n params as Record<string, string>,\n );\n}\n\nexport async function getWeeklyEmission(\n client: TokenomistClient,\n tokenId: string,\n params?: EmissionParams,\n): Promise<EmissionBreakdown[]> {\n return client.get<EmissionBreakdown[]>(\n `/v5/emission/${encodeURIComponent(tokenId)}`,\n params as Record<string, string>,\n );\n}\n","import { Command } from \"commander\";\nimport { TokenomistClient } from \"../api/client.js\";\nimport { getAllocation } from \"../api/allocation.js\";\nimport { output } from \"../output/formatter.js\";\nimport type { Column } from \"../output/table.js\";\nimport { resolveConfig } from \"../config/config.js\";\n\nconst columns: Column[] = [\n { key: \"allocationName\", header: \"Allocation\" },\n { key: \"allocationType\", header: \"Type\" },\n { key: \"standardAllocationName\", header: \"Std. Allocation\" },\n { key: \"allocationAmount\", header: \"Amount\", align: \"right\" },\n { key: \"allocationUnlockedAmount\", header: \"Unlocked\", align: \"right\" },\n { key: \"allocationLockedAmount\", header: \"Locked\", align: \"right\" },\n { key: \"trackedAllocationPercentage\", header: \"Tracked %\", align: \"right\" },\n];\n\nexport const allocationCommand = new Command(\"allocation\").description(\"Token allocation commands\");\n\nallocationCommand\n .command(\"detail <tokenId>\")\n .description(\"Get standard allocation data for a specific token\")\n .action(async (tokenId: string, _opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n const data = await getAllocation(client, tokenId);\n const outputMode = globalOpts.output || \"table\";\n if (outputMode === \"json\") {\n console.log(JSON.stringify(data, null, 2));\n } else {\n console.log(`Token: ${data.name} (${data.symbol})`);\n console.log(`Max Supply: ${data.maxSupply?.toLocaleString() ?? \"\\u2014\"}`);\n console.log(`Total Unlocked: ${data.totalUnlockedAmount.toLocaleString()}`);\n console.log(`Total Locked: ${data.totalLockedAmount.toLocaleString()}`);\n console.log(`Last Updated: ${data.lastUpdatedDate}`);\n console.log();\n output(data.allocations as unknown as Record<string, unknown>[], columns, outputMode);\n }\n });\n","import type { TokenomistClient } from \"./client.js\";\nimport type { StandardAllocation } from \"../types/allocation.js\";\n\nexport async function getAllocation(\n client: TokenomistClient,\n tokenId: string,\n): Promise<StandardAllocation> {\n return client.get<StandardAllocation>(`/v5/allocations/${encodeURIComponent(tokenId)}`);\n}\n","import { Command } from \"commander\";\nimport { createInterface } from \"node:readline\";\nimport {\n loadConfigFile,\n saveConfigFile,\n deleteConfigFile,\n maskApiKey,\n getConfigPath,\n} from \"../config/store.js\";\n\nfunction readInput(prompt: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n return new Promise((resolve) => {\n rl.question(prompt, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nexport const authCommand = new Command(\"auth\").description(\"Manage API key authentication\");\n\nauthCommand\n .command(\"login\")\n .description(\"Store your API key securely in ~/.tokenomist/config.json\")\n .option(\"--api-key <key>\", \"API key (will prompt if not provided)\")\n .action(async (opts) => {\n let apiKey = opts.apiKey;\n\n if (!apiKey) {\n apiKey = await readInput(\"Enter your Tokenomist API key: \");\n }\n\n if (!apiKey) {\n console.error(\"Error: API key cannot be empty.\");\n process.exit(1);\n }\n\n const config = loadConfigFile();\n config.apiKey = apiKey;\n saveConfigFile(config);\n\n console.log(`API key saved to ${getConfigPath()}`);\n console.log(`Key: ${maskApiKey(apiKey)}`);\n });\n\nauthCommand\n .command(\"logout\")\n .description(\"Remove stored API key\")\n .action(() => {\n const config = loadConfigFile();\n if (!config.apiKey) {\n console.log(\"No API key stored.\");\n return;\n }\n\n delete config.apiKey;\n\n if (Object.keys(config).length === 0) {\n deleteConfigFile();\n console.log(`Removed ${getConfigPath()}`);\n } else {\n saveConfigFile(config);\n console.log(\"API key removed from config.\");\n }\n });\n\nauthCommand\n .command(\"status\")\n .description(\"Show current authentication status\")\n .action(() => {\n const envKey = process.env.TOKENOMIST_API_KEY;\n const config = loadConfigFile();\n const fileKey = config.apiKey;\n\n if (envKey) {\n console.log(`Source: TOKENOMIST_API_KEY env var`);\n console.log(`Key: ${maskApiKey(envKey)}`);\n } else if (fileKey) {\n console.log(`Source: ${getConfigPath()}`);\n console.log(`Key: ${maskApiKey(fileKey)}`);\n } else {\n console.log(\"Not authenticated.\");\n console.log(`Run \"tok auth login\" to store your API key.`);\n }\n });\n","import { Command } from \"commander\";\nimport schema from \"../schema.json\" with { type: \"json\" };\n\nexport const schemaCommand = new Command(\"schema\")\n .description(\"Print full command schema as JSON\")\n .option(\"--pretty\", \"Pretty-print with 2-space indent\")\n .action((opts) => {\n const indent = opts.pretty ? 2 : undefined;\n console.log(JSON.stringify(schema, null, indent));\n });\n","{\n \"name\": \"tok\",\n \"version\": \"0.1.0\",\n \"description\": \"CLI tool for the Tokenomist API\",\n \"globalOptions\": {\n \"api-key\": { \"flags\": \"-k, --api-key <key>\", \"description\": \"API key (overrides env/config)\" },\n \"output\": { \"flags\": \"-o, --output <format>\", \"description\": \"Output format: table, json, csv\", \"default\": \"table\" },\n \"base-url\": { \"flags\": \"--base-url <url>\", \"description\": \"API base URL\" },\n \"no-cache\": { \"flags\": \"--no-cache\", \"description\": \"Bypass response cache\" }\n },\n \"commands\": {\n \"token list\": {\n \"description\": \"List all tracked tokens with market data\",\n \"options\": {\n \"token-id\": { \"flags\": \"--token-id <ids>\", \"description\": \"Filter by token IDs (comma-separated)\" }\n },\n \"example\": \"tok token list --output json\"\n },\n \"token search <query>\": {\n \"description\": \"Search for tokens by name, symbol, or ID\",\n \"arguments\": { \"query\": { \"required\": true, \"description\": \"Search query string\" } },\n \"example\": \"tok token search bitcoin --output json\"\n },\n \"unlock list\": {\n \"description\": \"List unlock events grouped by token\",\n \"options\": {\n \"min-market-cap\": { \"flags\": \"--min-market-cap <value>\", \"description\": \"Minimum market cap\" },\n \"min-released-percentage\": { \"flags\": \"--min-released-percentage <value>\", \"description\": \"Minimum released percentage\" },\n \"min-unlock-date\": { \"flags\": \"--min-unlock-date <date>\", \"description\": \"Min unlock date (YYYY-MM-DD)\" },\n \"max-unlock-date\": { \"flags\": \"--max-unlock-date <date>\", \"description\": \"Max unlock date (YYYY-MM-DD)\" },\n \"min-total-unlock-amount\": { \"flags\": \"--min-total-unlock-amount <value>\", \"description\": \"Minimum total unlock amount\" },\n \"min-value-to-market-cap\": { \"flags\": \"--min-value-to-market-cap <value>\", \"description\": \"Min value-to-market-cap ratio\" },\n \"standard-allocation\": { \"flags\": \"--standard-allocation <names>\", \"description\": \"Filter by allocation (comma-separated)\" },\n \"page\": { \"flags\": \"--page <number>\", \"description\": \"Page number\" },\n \"page-size\": { \"flags\": \"--page-size <number>\", \"description\": \"Items per page\" }\n },\n \"example\": \"tok unlock list --min-market-cap 1000000\"\n },\n \"unlock upcoming\": {\n \"description\": \"List next upcoming unlock event per token\",\n \"options\": {\n \"start\": { \"flags\": \"--start <date>\", \"description\": \"Start date (YYYY-MM-DD)\" },\n \"end\": { \"flags\": \"--end <date>\", \"description\": \"End date (YYYY-MM-DD)\" },\n \"standard-allocation\": { \"flags\": \"--standard-allocation <names>\", \"description\": \"Filter by allocation (comma-separated)\" },\n \"min-market-cap\": { \"flags\": \"--min-market-cap <value>\", \"description\": \"Minimum market cap\" },\n \"min-released-percentage\": { \"flags\": \"--min-released-percentage <value>\", \"description\": \"Minimum released percentage\" },\n \"min-total-unlock-amount\": { \"flags\": \"--min-total-unlock-amount <value>\", \"description\": \"Minimum total unlock amount\" },\n \"min-value-to-market-cap\": { \"flags\": \"--min-value-to-market-cap <value>\", \"description\": \"Min value-to-market-cap ratio\" },\n \"page\": { \"flags\": \"--page <number>\", \"description\": \"Page number\" },\n \"page-size\": { \"flags\": \"--page-size <number>\", \"description\": \"Items per page\" }\n },\n \"example\": \"tok unlock upcoming --output json\"\n },\n \"unlock events <tokenId>\": {\n \"description\": \"Get unlock events for a specific token\",\n \"arguments\": { \"tokenId\": { \"required\": true, \"description\": \"Token ID (e.g. solana)\" } },\n \"options\": {\n \"start\": { \"flags\": \"--start <date>\", \"description\": \"Start date (YYYY-MM-DD)\" },\n \"end\": { \"flags\": \"--end <date>\", \"description\": \"End date (YYYY-MM-DD)\" },\n \"standard-allocation\": { \"flags\": \"--standard-allocation <names>\", \"description\": \"Filter by allocation (comma-separated)\" },\n \"page\": { \"flags\": \"--page <number>\", \"description\": \"Page number\" },\n \"page-size\": { \"flags\": \"--page-size <number>\", \"description\": \"Items per page\" }\n },\n \"example\": \"tok unlock events solana --start 2024-01-01 --end 2024-12-31\"\n },\n \"investor list\": {\n \"description\": \"List all investors\",\n \"options\": {\n \"start-latest-funding-date\": { \"flags\": \"--start-latest-funding-date <date>\", \"description\": \"Start date filter for latest funding (YYYY-MM-DD)\" },\n \"end-latest-funding-date\": { \"flags\": \"--end-latest-funding-date <date>\", \"description\": \"End date filter for latest funding (YYYY-MM-DD)\" },\n \"page\": { \"flags\": \"--page <number>\", \"description\": \"Page number\" },\n \"page-size\": { \"flags\": \"--page-size <number>\", \"description\": \"Items per page\" }\n },\n \"example\": \"tok investor list --output json\"\n },\n \"investor detail <investorId>\": {\n \"description\": \"Get investor portfolio and funding rounds\",\n \"arguments\": { \"investorId\": { \"required\": true, \"description\": \"Investor ID\" } },\n \"options\": {\n \"is-lead-investor\": { \"flags\": \"--is-lead-investor\", \"description\": \"Filter to rounds where investor was lead\" },\n \"funding-date-min\": { \"flags\": \"--funding-date-min <date>\", \"description\": \"Minimum funding date\" },\n \"funding-date-max\": { \"flags\": \"--funding-date-max <date>\", \"description\": \"Maximum funding date\" },\n \"raised-amount-min\": { \"flags\": \"--raised-amount-min <amount>\", \"description\": \"Minimum raised amount\" },\n \"raised-amount-max\": { \"flags\": \"--raised-amount-max <amount>\", \"description\": \"Maximum raised amount\" }\n },\n \"example\": \"tok investor detail 123 --is-lead-investor\"\n },\n \"fundraising detail <tokenId>\": {\n \"description\": \"Get fundraising data for a specific token\",\n \"arguments\": { \"tokenId\": { \"required\": true, \"description\": \"Token ID\" } },\n \"options\": {\n \"funding-date-min\": { \"flags\": \"--funding-date-min <date>\", \"description\": \"Minimum funding date\" },\n \"funding-date-max\": { \"flags\": \"--funding-date-max <date>\", \"description\": \"Maximum funding date\" },\n \"raised-amount-min\": { \"flags\": \"--raised-amount-min <amount>\", \"description\": \"Minimum raised amount\" },\n \"raised-amount-max\": { \"flags\": \"--raised-amount-max <amount>\", \"description\": \"Maximum raised amount\" }\n },\n \"example\": \"tok fundraising detail uniswap --output json\"\n },\n \"burn list\": {\n \"description\": \"List all tokens with burn data\",\n \"options\": {\n \"token-id\": { \"flags\": \"--token-id <ids>\", \"description\": \"Filter by token IDs (comma-separated)\" },\n \"page\": { \"flags\": \"--page <number>\", \"description\": \"Page number\" },\n \"page-size\": { \"flags\": \"--page-size <number>\", \"description\": \"Items per page\" }\n },\n \"example\": \"tok burn list --output json\"\n },\n \"burn detail <tokenId>\": {\n \"description\": \"Get burn events for a specific token\",\n \"arguments\": { \"tokenId\": { \"required\": true, \"description\": \"Token ID\" } },\n \"options\": {\n \"start\": { \"flags\": \"--start <date>\", \"description\": \"Start date\" },\n \"end\": { \"flags\": \"--end <date>\", \"description\": \"End date\" }\n },\n \"example\": \"tok burn detail solana --start 2024-01-01\"\n },\n \"buyback list\": {\n \"description\": \"List all tokens with buyback data\",\n \"options\": {\n \"token-id\": { \"flags\": \"--token-id <ids>\", \"description\": \"Filter by token IDs (comma-separated)\" },\n \"page\": { \"flags\": \"--page <number>\", \"description\": \"Page number\" },\n \"page-size\": { \"flags\": \"--page-size <number>\", \"description\": \"Items per page\" }\n },\n \"example\": \"tok buyback list --output json\"\n },\n \"buyback detail <tokenId>\": {\n \"description\": \"Get buyback events for a specific token\",\n \"arguments\": { \"tokenId\": { \"required\": true, \"description\": \"Token ID\" } },\n \"options\": {\n \"start\": { \"flags\": \"--start <date>\", \"description\": \"Start date\" },\n \"end\": { \"flags\": \"--end <date>\", \"description\": \"End date\" }\n },\n \"example\": \"tok buyback detail solana --output json\"\n },\n \"emission daily <tokenId>\": {\n \"description\": \"Get daily emission data for a token\",\n \"arguments\": { \"tokenId\": { \"required\": true, \"description\": \"Token ID\" } },\n \"options\": {\n \"start\": { \"flags\": \"--start <date>\", \"description\": \"Start date\" },\n \"end\": { \"flags\": \"--end <date>\", \"description\": \"End date\" },\n \"standard-allocation\": { \"flags\": \"--standard-allocation <names>\", \"description\": \"Filter by allocation (comma-separated)\" },\n \"page\": { \"flags\": \"--page <number>\", \"description\": \"Page number\" },\n \"page-size\": { \"flags\": \"--page-size <number>\", \"description\": \"Items per page\" }\n },\n \"example\": \"tok emission daily arbitrum --start 2024-08-01 --end 2024-08-31\"\n },\n \"emission weekly <tokenId>\": {\n \"description\": \"Get weekly emission data for a token\",\n \"arguments\": { \"tokenId\": { \"required\": true, \"description\": \"Token ID\" } },\n \"options\": {\n \"start\": { \"flags\": \"--start <date>\", \"description\": \"Start date\" },\n \"end\": { \"flags\": \"--end <date>\", \"description\": \"End date\" },\n \"standard-allocation\": { \"flags\": \"--standard-allocation <names>\", \"description\": \"Filter by allocation (comma-separated)\" },\n \"page\": { \"flags\": \"--page <number>\", \"description\": \"Page number\" },\n \"page-size\": { \"flags\": \"--page-size <number>\", \"description\": \"Items per page\" }\n },\n \"example\": \"tok emission weekly arbitrum --start 2024-01-01 --end 2024-06-30\"\n },\n \"allocation detail <tokenId>\": {\n \"description\": \"Get standard allocation data for a specific token\",\n \"arguments\": { \"tokenId\": { \"required\": true, \"description\": \"Token ID\" } },\n \"example\": \"tok allocation detail solana --output json\"\n },\n \"auth login\": {\n \"description\": \"Store API key\",\n \"options\": {\n \"api-key\": { \"flags\": \"--api-key <key>\", \"description\": \"API key (prompts if not provided)\" }\n },\n \"example\": \"tok auth login\"\n },\n \"auth logout\": {\n \"description\": \"Remove stored API key\",\n \"example\": \"tok auth logout\"\n },\n \"auth status\": {\n \"description\": \"Show current auth status\",\n \"example\": \"tok auth status\"\n },\n \"schema\": {\n \"description\": \"Print full command schema as JSON\",\n \"options\": {\n \"pretty\": { \"flags\": \"--pretty\", \"description\": \"Pretty-print with 2-space indent\" }\n },\n \"example\": \"tok schema --pretty\"\n }\n }\n}\n","const BANNER_COLOR_OPEN = \"\\x1b[38;2;197;16;82m\";\nconst COLOR_RESET = \"\\x1b[0m\";\n\nexport const BANNER = `████████╗ ██████╗ ██╗ ██╗███████╗███╗ ██╗ ██████╗ ███╗ ███╗██╗███████╗████████╗\n╚══██╔══╝██╔═══██╗██║ ██╔╝██╔════╝████╗ ██║██╔═══██╗████╗ ████║██║██╔════╝╚══██╔══╝\n ██║ ██║ ██║█████╔╝ █████╗ ██╔██╗ ██║██║ ██║██╔████╔██║██║███████╗ ██║\n ██║ ██║ ██║██╔═██╗ ██╔══╝ ██║╚██╗██║██║ ██║██║╚██╔╝██║██║╚════██║ ██║\n ██║ ╚██████╔╝██║ ██╗███████╗██║ ╚████║╚██████╔╝██║ ╚═╝ ██║██║███████║ ██║\n ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝╚═╝╚══════╝ ╚═╝ `;\n\nconst WELCOME_LINES = [\n \"Welcome to tokenomist-cli v0.1.0\",\n \"Query token unlocks, emissions, fundraising, burns, and buybacks from the terminal.\",\n \"\",\n \" Getting started:\",\n \"\",\n \" $ tok auth login # store your API key\",\n \" $ tok token list # list all tracked tokens\",\n \" $ tok token search bitcoin # query tokens by name / symbol\",\n \" $ npx skills add tokenomist-ai/tokenomist-cli # install AI coding skills\",\n \" $ tok --help # for view more commands\",\n \"\",\n \"Docs: https://docs.tokenomist.ai/\",\n \"Site: https://tokenomist.ai\",\n \"Issues: https://github.com/tokenomist-ai/tokenomist-cli/issues\",\n];\n\nfunction shouldUseColor(stream: NodeJS.WriteStream): boolean {\n if (process.env.NO_COLOR !== undefined && process.env.NO_COLOR !== \"\") return false;\n if (process.env.FORCE_COLOR === \"0\") return false;\n return Boolean(stream.isTTY);\n}\n\nfunction frame(lines: string[], colored: boolean): string {\n const innerWidth = Math.max(...lines.map((l) => l.length));\n const horizontal = \"─\".repeat(innerWidth + 2);\n const open = colored ? BANNER_COLOR_OPEN : \"\";\n const close = colored ? COLOR_RESET : \"\";\n const top = `${open}╭${horizontal}╮${close}`;\n const bottom = `${open}╰${horizontal}╯${close}`;\n const side = `${open}│${close}`;\n const middle = lines.map((l) => `${side} ${l.padEnd(innerWidth)} ${side}`);\n return [top, ...middle, bottom].join(\"\\n\");\n}\n\nexport function printWelcome(stream: NodeJS.WriteStream): void {\n const colored = shouldUseColor(stream);\n const banner = colored ? `${BANNER_COLOR_OPEN}${BANNER}${COLOR_RESET}` : BANNER;\n stream.write(`${banner}\\n\\n`);\n stream.write(`${frame(WELCOME_LINES, colored)}\\n\\n`);\n}\n"],"mappings":"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","names":["Command","code","body","columns","columns","columns","readFileSync","writeFileSync","mkdirSync","unlinkSync","join","homedir","Command","Command","Command","listColumns","Command","Command","columns","Command","Command","listColumns","detailColumns","Command","Command","listColumns","detailColumns","Command","Command","columns","Command","Command","columns","Command","Command","Command","Command","Command","readFileSync","join","homedir","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/token.ts","../src/api/errors.ts","../src/api/retry.ts","../src/api/cache.ts","../src/api/client.ts","../src/api/token.ts","../src/output/table.ts","../src/output/csv.ts","../src/output/formatter.ts","../src/config/config.ts","../src/config/store.ts","../src/commands/unlock.ts","../src/api/unlock.ts","../src/output/pagination.ts","../src/commands/validate.ts","../src/commands/investor.ts","../src/api/investor.ts","../src/commands/fundraising.ts","../src/api/fundraising.ts","../src/commands/burn.ts","../src/api/burn.ts","../src/commands/buyback.ts","../src/api/buyback.ts","../src/commands/emission.ts","../src/api/emission.ts","../src/commands/allocation.ts","../src/api/allocation.ts","../src/commands/auth.ts","../src/commands/schema.ts","../src/schema.json","../src/commands/pit.ts","../src/api/point-in-time.ts","../src/banner.ts","../src/update-notice.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { tokenCommand } from \"./commands/token.js\";\nimport { unlockCommand } from \"./commands/unlock.js\";\nimport { investorCommand } from \"./commands/investor.js\";\nimport { fundraisingCommand } from \"./commands/fundraising.js\";\nimport { burnCommand } from \"./commands/burn.js\";\nimport { buybackCommand } from \"./commands/buyback.js\";\nimport { emissionCommand } from \"./commands/emission.js\";\nimport { allocationCommand } from \"./commands/allocation.js\";\nimport { authCommand } from \"./commands/auth.js\";\nimport { schemaCommand } from \"./commands/schema.js\";\nimport { pitCommand } from \"./commands/pit.js\";\nimport { ApiError, formatApiError } from \"./api/errors.js\";\nimport { printWelcome } from \"./banner.js\";\nimport { updateNotice } from \"./update-notice.js\";\nimport { spawn } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { fileURLToPath } from \"node:url\";\nimport pkg from \"../package.json\" with { type: \"json\" };\n\nconst ONE_DAY = 24 * 60 * 60 * 1000;\n\nfunction showUpdateNotification() {\n if (process.env.NO_UPDATE_NOTIFIER === \"1\" || process.env.CI === \"1\") return;\n try {\n const raw = readFileSync(join(homedir(), \".tokenomist\", \"update-check.json\"), \"utf-8\");\n const notice = updateNotice(JSON.parse(raw), pkg.version, Date.now(), ONE_DAY);\n if (notice) process.stderr.write(notice);\n } catch {\n // No cache file or invalid — skip silently\n }\n}\n\nfunction showWelcomeBanner(): boolean {\n if (process.env.TOKENOMIST_NO_BANNER === \"1\") return false;\n if (process.env.CI === \"1\") return false;\n if (!process.stderr.isTTY) return false;\n if (process.argv.length > 2) return false;\n printWelcome(process.stderr);\n return true;\n}\n\nfunction spawnUpdateCheck() {\n if (process.env.NO_UPDATE_NOTIFIER === \"1\" || process.env.CI === \"1\") return;\n try {\n const script = fileURLToPath(new URL(\"./update-check.js\", import.meta.url));\n spawn(\"node\", [script], { detached: true, stdio: \"ignore\" }).unref();\n } catch {\n // Spawn failure — skip silently\n }\n}\n\nconst program = new Command();\n\nprogram\n .name(\"tok\")\n .description(\n \"CLI tool for the Tokenomist API — query token unlocks, emissions, fundraising, burns, buybacks, and point-in-time history\",\n )\n .version(pkg.version)\n .option(\"-k, --api-key <key>\", \"API key (overrides env/config)\")\n .option(\"-o, --output <format>\", \"Output format: table, json, csv\", \"table\")\n .option(\"--base-url <url>\", \"API base URL\")\n .option(\"--no-cache\", \"Bypass response cache\");\n\nprogram.addCommand(tokenCommand);\nprogram.addCommand(unlockCommand);\nprogram.addCommand(investorCommand);\nprogram.addCommand(fundraisingCommand);\nprogram.addCommand(burnCommand);\nprogram.addCommand(buybackCommand);\nprogram.addCommand(emissionCommand);\nprogram.addCommand(allocationCommand);\nprogram.addCommand(pitCommand);\nprogram.addCommand(authCommand);\nprogram.addCommand(schemaCommand);\n\nif (showWelcomeBanner()) {\n spawnUpdateCheck();\n process.exit(0);\n}\n\nshowUpdateNotification();\n\nprogram\n .parseAsync(process.argv)\n .then(() => {\n spawnUpdateCheck();\n })\n .catch((err) => {\n if (err instanceof ApiError) {\n for (const line of formatApiError(err)) console.error(line);\n } else {\n console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);\n }\n spawnUpdateCheck();\n process.exit(1);\n });\n","import { Command } from \"commander\";\nimport { TokenomistClient } from \"../api/client.js\";\nimport { listTokens, searchTokens } from \"../api/token.js\";\nimport { output } from \"../output/formatter.js\";\nimport type { Column } from \"../output/table.js\";\nimport { resolveConfig } from \"../config/config.js\";\n\nconst columns: Column[] = [\n { key: \"id\", header: \"ID\" },\n { key: \"name\", header: \"Name\" },\n { key: \"symbol\", header: \"Symbol\" },\n { key: \"marketCap\", header: \"Market Cap\", align: \"right\" },\n { key: \"circulatingSupply\", header: \"Circ. Supply\", align: \"right\" },\n { key: \"totalLockedAmount\", header: \"Locked\", align: \"right\" },\n { key: \"unlockedAmount\", header: \"Unlocked\", align: \"right\" },\n { key: \"lastUpdatedDate\", header: \"Updated\" },\n];\n\nconst searchColumns: Column[] = [\n { key: \"tokenId\", header: \"ID\" },\n { key: \"tokenName\", header: \"Name\" },\n { key: \"tokenSymbol\", header: \"Symbol\" },\n];\n\nexport const tokenCommand = new Command(\"token\").description(\"Token commands\");\n\ntokenCommand\n .command(\"list\")\n .description(\"List all tokens with summary data\")\n .option(\"--token-id <ids>\", \"Filter by token IDs (comma-separated)\")\n .action(async (opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n const data = await listTokens(client, {\n tokenId: opts.tokenId,\n });\n output(data as unknown as Record<string, unknown>[], columns, globalOpts.output || \"table\");\n });\n\ntokenCommand\n .command(\"search <query>\")\n .description(\"Search for tokens by name, symbol, or ID\")\n .action(async (query: string, _opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n const data = await searchTokens(client, query);\n output(\n data as unknown as Record<string, unknown>[],\n searchColumns,\n globalOpts.output || \"table\",\n );\n });\n","export enum ErrorCode {\n BAD_REQUEST = \"BAD_REQUEST\",\n UNAUTHORIZED = \"UNAUTHORIZED\",\n FORBIDDEN = \"FORBIDDEN\",\n NOT_FOUND = \"NOT_FOUND\",\n VALIDATION_ERROR = \"VALIDATION_ERROR\",\n RATE_LIMITED = \"RATE_LIMITED\",\n SERVER_ERROR = \"SERVER_ERROR\",\n NETWORK_ERROR = \"NETWORK_ERROR\",\n UNKNOWN = \"UNKNOWN\",\n}\n\nfunction classifyStatus(status: number): ErrorCode {\n if (status === 400) return ErrorCode.BAD_REQUEST;\n if (status === 401) return ErrorCode.UNAUTHORIZED;\n if (status === 403) return ErrorCode.FORBIDDEN;\n if (status === 404) return ErrorCode.NOT_FOUND;\n if (status === 422) return ErrorCode.VALIDATION_ERROR;\n if (status === 429) return ErrorCode.RATE_LIMITED;\n if (status >= 500 && status < 600) return ErrorCode.SERVER_ERROR;\n return ErrorCode.UNKNOWN;\n}\n\nfunction parseRetryAfter(value?: string): number | undefined {\n if (!value) return undefined;\n const seconds = Number(value);\n return Number.isFinite(seconds) && seconds > 0 ? seconds : undefined;\n}\n\nexport class ApiError extends Error {\n public retriesExhausted = false;\n /** How many attempts were made before giving up (set with retriesExhausted). */\n public attempts?: number;\n /** Point-in-time routes: machine-readable cause, e.g. NO_VERSION_AT_AS_OF. */\n public errorCode?: string;\n /** Point-in-time routes: the next/first `asOf` that has a version (on NO_VERSION_AT_AS_OF, or inside the plan's range on PLAN_NOT_ELIGIBLE). */\n public earliestValidDate?: string;\n /** 422 validation errors: one entry per failing field. */\n public fieldErrors?: { key: string; value: unknown; message: string }[];\n\n constructor(\n message: string,\n public code: ErrorCode,\n public detail?: string,\n public statusCode?: number,\n public retryAfter?: number,\n ) {\n super(message);\n this.name = \"ApiError\";\n }\n\n get retryable(): boolean {\n return (\n this.code === ErrorCode.RATE_LIMITED ||\n this.code === ErrorCode.SERVER_ERROR ||\n this.code === ErrorCode.NETWORK_ERROR\n );\n }\n\n static fromResponse(status: number, body: unknown, retryAfterHeader?: string): ApiError {\n const b = body && typeof body === \"object\" ? (body as Record<string, unknown>) : {};\n const errorMessage = typeof b.errorMessage === \"string\" ? b.errorMessage : undefined;\n const errorDetail = typeof b.errorDetail === \"string\" ? b.errorDetail : undefined;\n\n let err: ApiError;\n if (status === 200 && b.status === false) {\n // API-level error: HTTP 200 but body.status === false\n const bodyStatus = typeof b.statusCode === \"number\" ? b.statusCode : 0;\n const code = bodyStatus > 0 ? classifyStatus(bodyStatus) : ErrorCode.UNKNOWN;\n err = new ApiError(\n errorMessage || \"API request failed\",\n code,\n errorDetail,\n bodyStatus || undefined,\n );\n } else {\n // HTTP-level error\n err = new ApiError(\n errorMessage || `HTTP ${status}`,\n classifyStatus(status),\n errorDetail,\n status,\n parseRetryAfter(retryAfterHeader),\n );\n }\n\n if (typeof b.errorCode === \"string\" && b.errorCode) err.errorCode = b.errorCode;\n if (typeof b.earliestValidDate === \"string\" && b.earliestValidDate) {\n err.earliestValidDate = b.earliestValidDate;\n }\n if (Array.isArray(b.data)) {\n const fields = b.data.filter(\n (f): f is { key: string; value: unknown; message: string } =>\n !!f && typeof f === \"object\" && typeof (f as { message?: unknown }).message === \"string\",\n );\n if (fields.length > 0) err.fieldErrors = fields;\n }\n return err;\n }\n\n static fromNetworkError(error: unknown): ApiError {\n const message = error instanceof Error ? error.message : String(error);\n return new ApiError(message, ErrorCode.NETWORK_ERROR);\n }\n}\n\n/** \"CODE (errorCode): message\", the first line of an error and of each retry log line. */\nexport function errorHeadline(err: ApiError): string {\n const code = err.errorCode ? `${err.code} (${err.errorCode})` : err.code;\n return `${code}: ${err.message}`;\n}\n\n/** The lines the CLI prints for an API error. */\nexport function formatApiError(err: ApiError): string[] {\n // After exhausted retries the last log line reads \"Retrying…\", so the\n // headline says the CLI gave up.\n const gaveUp = err.retriesExhausted\n ? ` (gave up after ${err.attempts ?? \"repeated\"} attempts)`\n : \"\";\n const lines = [`${errorHeadline(err)}${gaveUp}`];\n // V5 details usually restate the message; skip an exact repeat.\n if (err.detail && err.detail !== err.message) lines.push(`Detail: ${err.detail}`);\n for (const f of err.fieldErrors ?? []) {\n lines.push(` - ${f.key}: ${f.message}`);\n }\n if (err.earliestValidDate) lines.push(`Earliest valid date: ${err.earliestValidDate}`);\n return lines;\n}\n","import { ApiError, errorHeadline } from \"./errors.js\";\n\ninterface RetryOptions {\n maxAttempts?: number;\n baseDelay?: number;\n maxDelay?: number;\n}\n\nconst DEFAULTS = {\n maxAttempts: 3,\n baseDelay: 1000,\n maxDelay: 30_000,\n} as const;\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport async function withRetry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T> {\n const maxAttempts = options?.maxAttempts ?? DEFAULTS.maxAttempts;\n const baseDelay = options?.baseDelay ?? DEFAULTS.baseDelay;\n const maxDelay = options?.maxDelay ?? DEFAULTS.maxDelay;\n\n let lastError: ApiError | undefined;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (err) {\n if (!(err instanceof ApiError) || !err.retryable) {\n throw err;\n }\n\n lastError = err;\n\n if (attempt === maxAttempts) {\n break;\n }\n\n const jitter = Math.random() * 500;\n const calculated = baseDelay * Math.pow(2, attempt - 1) + jitter;\n const delay = err.retryAfter\n ? Math.min(err.retryAfter * 1000, maxDelay)\n : Math.min(calculated, maxDelay);\n\n process.stderr.write(\n `${errorHeadline(err)}. Retrying in ${Math.round(delay / 1000)}s... (attempt ${attempt + 1}/${maxAttempts})\\n`,\n );\n\n await sleep(delay);\n }\n }\n\n lastError!.retriesExhausted = true;\n lastError!.attempts = maxAttempts;\n throw lastError;\n}\n","import { createHash } from \"node:crypto\";\nimport { readFileSync, writeFileSync, mkdirSync, unlinkSync, readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\ninterface CacheEntry {\n url: string;\n timestamp: number;\n ttl: number;\n data: unknown;\n}\n\nconst DEFAULT_CACHE_DIR = join(homedir(), \".tokenomist\", \"cache\");\nconst MAX_CACHE_FILES = 500;\n\nexport class ResponseCache {\n private writeCount = 0;\n\n constructor(\n private ttl: number = 600_000,\n private cacheDir: string = DEFAULT_CACHE_DIR,\n ) {}\n\n buildKey(url: string, apiKey?: string): string {\n const parsed = new URL(url);\n parsed.searchParams.sort();\n const prefix = apiKey ? createHash(\"md5\").update(apiKey).digest(\"hex\").slice(0, 8) : \"\";\n const normalized = `${prefix}:GET:${parsed.toString()}`;\n return createHash(\"md5\").update(normalized).digest(\"hex\");\n }\n\n get<T>(key: string): T | null {\n try {\n const filePath = join(this.cacheDir, `${key}.json`);\n const raw = readFileSync(filePath, \"utf-8\");\n const entry = JSON.parse(raw) as CacheEntry;\n\n if (Date.now() - entry.timestamp > entry.ttl) {\n try {\n unlinkSync(filePath);\n } catch {\n /* ignore */\n }\n return null;\n }\n\n return entry.data as T;\n } catch {\n return null;\n }\n }\n\n set(key: string, url: string, data: unknown): void {\n try {\n mkdirSync(this.cacheDir, { recursive: true, mode: 0o700 });\n const entry: CacheEntry = {\n url,\n timestamp: Date.now(),\n ttl: this.ttl,\n data,\n };\n const filePath = join(this.cacheDir, `${key}.json`);\n writeFileSync(filePath, JSON.stringify(entry), { encoding: \"utf-8\", mode: 0o600 });\n\n this.writeCount++;\n if (this.writeCount % 20 === 0) this.sweep();\n } catch {\n // Cache is best-effort — silently ignore write failures\n }\n }\n\n private sweep(): void {\n try {\n const files = readdirSync(this.cacheDir).filter((f) => f.endsWith(\".json\"));\n\n // Remove expired entries\n const now = Date.now();\n for (const file of files) {\n try {\n const filePath = join(this.cacheDir, file);\n const raw = readFileSync(filePath, \"utf-8\");\n const entry = JSON.parse(raw) as CacheEntry;\n if (now - entry.timestamp > entry.ttl) {\n unlinkSync(filePath);\n }\n } catch {\n /* ignore individual file errors */\n }\n }\n\n // If still over limit, remove oldest entries\n const remaining = readdirSync(this.cacheDir).filter((f) => f.endsWith(\".json\"));\n if (remaining.length > MAX_CACHE_FILES) {\n const entries = remaining.map((file) => {\n try {\n const filePath = join(this.cacheDir, file);\n const raw = readFileSync(filePath, \"utf-8\");\n const entry = JSON.parse(raw) as CacheEntry;\n return { file, timestamp: entry.timestamp };\n } catch {\n return { file, timestamp: 0 };\n }\n });\n entries.sort((a, b) => a.timestamp - b.timestamp);\n const toRemove = entries.slice(0, entries.length - MAX_CACHE_FILES);\n for (const { file } of toRemove) {\n try {\n unlinkSync(join(this.cacheDir, file));\n } catch {\n /* ignore */\n }\n }\n }\n } catch {\n /* sweep is best-effort */\n }\n }\n}\n","import type { ApiResponse, ApiResult, MetaData } from \"../types/response.js\";\nimport { ApiError } from \"./errors.js\";\nimport { withRetry } from \"./retry.js\";\nimport { ResponseCache } from \"./cache.js\";\n\nexport { ApiError } from \"./errors.js\";\n\nconst HEADER_API_KEY = \"x-api-key\";\nconst HEADER_CLIENT_SOURCE = \"x-client-source\";\nconst CLIENT_SOURCE_CLI = \"cli\";\n\nexport class TokenomistClient {\n private cache: ResponseCache;\n\n constructor(\n private apiKey: string,\n private baseUrl: string,\n private options?: { noCache?: boolean },\n ) {\n this.cache = new ResponseCache();\n }\n\n /** GET a V5 route and return its `data` only. */\n async get<T>(path: string, params?: Record<string, string | undefined>): Promise<T> {\n return (await this.getWithMeta<T>(path, params)).data;\n }\n\n /** GET a V5 route and return `data` together with the envelope's `metadata`. */\n async getWithMeta<T>(\n path: string,\n params?: Record<string, string | undefined>,\n ): Promise<ApiResult<T>> {\n const url = this.buildUrl(path, params);\n const urlStr = url.toString();\n const cacheKey = this.cache.buildKey(urlStr, this.apiKey);\n const useCache = this.options?.noCache !== true;\n\n if (useCache) {\n const cached = this.cache.get<ApiResult<T>>(cacheKey);\n if (cached && typeof cached === \"object\" && \"metadata\" in cached) return cached;\n }\n\n const result = await withRetry(() => this.fetchFromApi<T>(url));\n\n if (useCache) {\n this.cache.set(cacheKey, urlStr, result);\n }\n\n return result;\n }\n\n private buildUrl(path: string, params?: Record<string, string | undefined>): URL {\n const url = new URL(path, this.baseUrl);\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== \"\") {\n url.searchParams.set(key, value);\n }\n }\n }\n // Every V5 handler returns an actionable `errorDetail` when asked.\n url.searchParams.set(\"showError\", \"true\");\n return url;\n }\n\n private async fetchFromApi<T>(url: URL): Promise<ApiResult<T>> {\n let res: Response;\n try {\n res = await fetch(url.toString(), {\n headers: {\n [HEADER_API_KEY]: this.apiKey,\n [HEADER_CLIENT_SOURCE]: CLIENT_SOURCE_CLI,\n },\n });\n } catch (err) {\n throw ApiError.fromNetworkError(err);\n }\n\n if (!res.ok) {\n let body: unknown = {};\n try {\n body = await res.json();\n } catch {\n // Response may not be JSON\n }\n const retryAfter = res.headers.get(\"retry-after\") ?? undefined;\n throw ApiError.fromResponse(res.status, body, retryAfter);\n }\n\n const body = (await res.json()) as ApiResponse<T>;\n\n if (!body.status) {\n throw ApiError.fromResponse(200, body);\n }\n\n const metadata: MetaData = body.metadata ?? {};\n // Upstream can send `\"data\": null` for an empty page.\n const data = (body.data ?? (metadata.page !== undefined ? [] : null)) as T;\n return { data, metadata };\n }\n}\n","import type { TokenomistClient } from \"./client.js\";\nimport type { TokenV4, SearchTokenV5 } from \"../types/token.js\";\n\nexport async function listTokens(\n client: TokenomistClient,\n params?: { tokenId?: string },\n): Promise<TokenV4[]> {\n return client.get<TokenV4[]>(\"/v5/token/list\", params as Record<string, string>);\n}\n\nexport async function searchTokens(\n client: TokenomistClient,\n query: string,\n): Promise<SearchTokenV5[]> {\n return client.get<SearchTokenV5[]>(\"/v5/search-token\", { query });\n}\n","import Table from \"cli-table3\";\n\nexport interface Column {\n key: string;\n header: string;\n align?: \"left\" | \"right\" | \"center\";\n}\n\nexport function renderTable(data: Record<string, unknown>[], columns: Column[]): string {\n const table = new Table({\n head: columns.map((c) => c.header),\n style: { head: [\"cyan\"] },\n colAligns: columns.map((c) => c.align || \"left\"),\n });\n\n for (const row of data) {\n table.push(columns.map((c) => formatValue(row[c.key])));\n }\n\n return table.toString();\n}\n\nfunction formatValue(value: unknown): string {\n if (value === null || value === undefined) return \"\\u2014\";\n if (typeof value === \"number\") {\n if (Number.isInteger(value)) return value.toLocaleString();\n return value.toLocaleString(undefined, { maximumFractionDigits: 4 });\n }\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n if (Array.isArray(value)) return value.join(\", \");\n return String(value);\n}\n","import type { Column } from \"./table.js\";\n\nexport function renderCsv(data: Record<string, unknown>[], columns: Column[]): string {\n const header = columns.map((c) => escapeCsv(c.header)).join(\",\");\n const rows = data.map((row) =>\n columns.map((c) => escapeCsv(formatCsvValue(row[c.key]))).join(\",\"),\n );\n return [header, ...rows].join(\"\\n\");\n}\n\nfunction escapeCsv(value: string): string {\n if (value.includes(\",\") || value.includes('\"') || value.includes(\"\\n\")) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n}\n\nfunction formatCsvValue(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (Array.isArray(value)) return value.join(\"; \");\n return String(value);\n}\n","import type { Column } from \"./table.js\";\nimport { renderTable } from \"./table.js\";\nimport { renderCsv } from \"./csv.js\";\n\nexport type OutputMode = \"table\" | \"json\" | \"csv\";\n\nexport function format(\n data: Record<string, unknown>[],\n columns: Column[],\n mode: OutputMode,\n): string {\n switch (mode) {\n case \"json\":\n return JSON.stringify(data, null, 2);\n case \"csv\":\n return renderCsv(data, columns);\n case \"table\":\n default:\n return renderTable(data, columns);\n }\n}\n\nexport function output(data: Record<string, unknown>[], columns: Column[], mode: OutputMode): void {\n console.log(format(data, columns, mode));\n}\n","import { config as loadDotenv } from \"dotenv\";\nimport { loadConfigFile } from \"./store.js\";\n\nloadDotenv();\n\nexport interface Config {\n apiKey: string;\n baseUrl: string;\n noCache: boolean;\n}\n\nexport function resolveConfig(opts: {\n apiKey?: string;\n baseUrl?: string;\n cache?: boolean;\n}): Config {\n const file = loadConfigFile();\n\n const apiKey = opts.apiKey || process.env.TOKENOMIST_API_KEY || file.apiKey || \"\";\n const baseUrl =\n opts.baseUrl || process.env.TOKENOMIST_BASE_URL || file.baseUrl || \"https://api.tokenomist.ai\";\n\n if (!apiKey) {\n console.error(\n 'Error: API key is required. Run \"tok auth login\" or provide via --api-key / TOKENOMIST_API_KEY env var.',\n );\n process.exit(1);\n }\n\n return { apiKey, baseUrl, noCache: opts.cache === false };\n}\n","import { readFileSync, writeFileSync, mkdirSync, unlinkSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nconst CONFIG_DIR = join(homedir(), \".tokenomist\");\nconst CONFIG_PATH = join(CONFIG_DIR, \"config.json\");\n\nexport interface ConfigFile {\n apiKey?: string;\n baseUrl?: string;\n}\n\nexport function getConfigPath(): string {\n return CONFIG_PATH;\n}\n\nexport function loadConfigFile(): ConfigFile {\n try {\n const raw = readFileSync(CONFIG_PATH, \"utf-8\");\n return JSON.parse(raw) as ConfigFile;\n } catch {\n return {};\n }\n}\n\nexport function saveConfigFile(config: ConfigFile): void {\n mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + \"\\n\", {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n}\n\nexport function deleteConfigFile(): void {\n try {\n unlinkSync(CONFIG_PATH);\n } catch {\n // file doesn't exist, that's fine\n }\n}\n\nexport function maskApiKey(key: string): string {\n if (key.length <= 8) return \"****\";\n return key.slice(0, 4) + \"****\" + key.slice(-4);\n}\n","import { Command } from \"commander\";\nimport { TokenomistClient } from \"../api/client.js\";\nimport { listUnlockEvents, listUpcomingUnlockEvents, getUnlockEvents } from \"../api/unlock.js\";\nimport { output } from \"../output/formatter.js\";\nimport type { Column } from \"../output/table.js\";\nimport { resolveConfig } from \"../config/config.js\";\nimport { printPaginationHint } from \"../output/pagination.js\";\nimport { validateDateRange } from \"./validate.js\";\n\nconst listColumns: Column[] = [\n { key: \"tokenName\", header: \"Token\" },\n { key: \"tokenSymbol\", header: \"Symbol\" },\n { key: \"marketCap\", header: \"Market Cap\", align: \"right\" },\n { key: \"releasedPercentage\", header: \"Released %\", align: \"right\" },\n { key: \"eventCount\", header: \"Events\", align: \"right\" },\n];\n\nconst upcomingColumns: Column[] = [\n { key: \"tokenName\", header: \"Token\" },\n { key: \"tokenSymbol\", header: \"Symbol\" },\n { key: \"marketCap\", header: \"Market Cap\", align: \"right\" },\n { key: \"unlockDate\", header: \"Unlock Date\" },\n { key: \"totalCliffAmount\", header: \"Cliff Amount\", align: \"right\" },\n { key: \"totalCliffValue\", header: \"Cliff Value\", align: \"right\" },\n];\n\nconst eventsColumns: Column[] = [\n { key: \"unlockDate\", header: \"Date\" },\n { key: \"tokenName\", header: \"Token\" },\n { key: \"tokenSymbol\", header: \"Symbol\" },\n { key: \"cliffAmount\", header: \"Amount\", align: \"right\" },\n { key: \"cliffValue\", header: \"Value\", align: \"right\" },\n { key: \"valueToMarketCap\", header: \"Val/MCap\", align: \"right\" },\n];\n\nfunction addPaginationOptions(cmd: Command): Command {\n return cmd\n .option(\"--page <number>\", \"Page number\")\n .option(\"--page-size <number>\", \"Items per page\");\n}\n\nfunction addListFilterOptions(cmd: Command): Command {\n return addPaginationOptions(\n cmd\n .option(\"--min-market-cap <value>\", \"Minimum market cap\")\n .option(\"--min-released-percentage <value>\", \"Minimum released percentage\")\n .option(\"--min-unlock-date <date>\", \"Min unlock date (YYYY-MM-DD)\")\n .option(\"--max-unlock-date <date>\", \"Max unlock date (YYYY-MM-DD)\")\n .option(\"--min-total-unlock-amount <value>\", \"Minimum total unlock amount\")\n .option(\"--min-value-to-market-cap <value>\", \"Min value-to-market-cap ratio\")\n .option(\"--standard-allocation <names>\", \"Filter by allocation (comma-separated)\"),\n );\n}\n\nfunction addUpcomingFilterOptions(cmd: Command): Command {\n return addPaginationOptions(\n cmd\n .option(\"--start <date>\", \"Start date (YYYY-MM-DD)\")\n .option(\"--end <date>\", \"End date (YYYY-MM-DD)\")\n .option(\"--standard-allocation <names>\", \"Filter by allocation (comma-separated)\")\n .option(\"--min-market-cap <value>\", \"Minimum market cap\")\n .option(\"--min-released-percentage <value>\", \"Minimum released percentage\")\n .option(\"--min-total-unlock-amount <value>\", \"Minimum total unlock amount\")\n .option(\"--min-value-to-market-cap <value>\", \"Min value-to-market-cap ratio\"),\n );\n}\n\nexport const unlockCommand = new Command(\"unlock\").description(\"Token unlock event commands\");\n\naddListFilterOptions(\n unlockCommand.command(\"list\").description(\"List unlock events grouped by token\"),\n).action(async (opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n validateDateRange(opts.minUnlockDate, opts.maxUnlockDate, [\n \"--min-unlock-date\",\n \"--max-unlock-date\",\n ]);\n const { data, metadata } = await listUnlockEvents(client, {\n minMarketCap: opts.minMarketCap,\n minReleasedPercentage: opts.minReleasedPercentage,\n minUnlockDate: opts.minUnlockDate,\n maxUnlockDate: opts.maxUnlockDate,\n minTotalUnlockAmount: opts.minTotalUnlockAmount,\n minValueToMarketCap: opts.minValueToMarketCap,\n standardAllocation: opts.standardAllocation,\n page: opts.page,\n pageSize: opts.pageSize,\n });\n const rows = data.map((d) => ({\n ...d,\n eventCount: d.events.length,\n }));\n output(rows as unknown as Record<string, unknown>[], listColumns, globalOpts.output || \"table\");\n printPaginationHint(metadata);\n});\n\naddUpcomingFilterOptions(\n unlockCommand.command(\"upcoming\").description(\"List next upcoming unlock event per token\"),\n).action(async (opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n validateDateRange(opts.start, opts.end);\n const { data, metadata } = await listUpcomingUnlockEvents(client, {\n start: opts.start,\n end: opts.end,\n standardAllocation: opts.standardAllocation,\n minMarketCap: opts.minMarketCap,\n minReleasedPercentage: opts.minReleasedPercentage,\n minTotalUnlockAmount: opts.minTotalUnlockAmount,\n minValueToMarketCap: opts.minValueToMarketCap,\n page: opts.page,\n pageSize: opts.pageSize,\n });\n const rows = data.map((d) => ({\n ...d,\n unlockDate: d.upcomingEvent.unlockDate,\n totalCliffAmount: d.upcomingEvent.cliffUnlocks.totalCliffAmount,\n totalCliffValue: d.upcomingEvent.cliffUnlocks.totalCliffValue,\n }));\n output(\n rows as unknown as Record<string, unknown>[],\n upcomingColumns,\n globalOpts.output || \"table\",\n );\n printPaginationHint(metadata);\n});\n\naddPaginationOptions(\n unlockCommand\n .command(\"events <tokenId>\")\n .description(\"Get unlock events for a specific token\")\n .option(\"--start <date>\", \"Start date (YYYY-MM-DD)\")\n .option(\"--end <date>\", \"End date (YYYY-MM-DD)\")\n .option(\"--standard-allocation <names>\", \"Filter by allocation (comma-separated)\"),\n).action(async (tokenId: string, opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n validateDateRange(opts.start, opts.end);\n const { data, metadata } = await getUnlockEvents(client, tokenId, {\n start: opts.start,\n end: opts.end,\n standardAllocation: opts.standardAllocation,\n page: opts.page,\n pageSize: opts.pageSize,\n });\n const rows = data.map((d) => ({\n ...d,\n cliffAmount: d.cliffUnlocks.cliffAmount,\n cliffValue: d.cliffUnlocks.cliffValue,\n valueToMarketCap: d.cliffUnlocks.valueToMarketCap,\n }));\n output(rows as unknown as Record<string, unknown>[], eventsColumns, globalOpts.output || \"table\");\n printPaginationHint(metadata);\n});\n","import type { TokenomistClient } from \"./client.js\";\nimport type { ApiResult } from \"../types/response.js\";\nimport type { UnlockEventList, UnlockEventListUpcoming, UnlockEventV4 } from \"../types/unlock.js\";\n\nexport interface UnlockListParams {\n minMarketCap?: string;\n minReleasedPercentage?: string;\n minUnlockDate?: string;\n maxUnlockDate?: string;\n minTotalUnlockAmount?: string;\n minValueToMarketCap?: string;\n standardAllocation?: string;\n page?: string;\n pageSize?: string;\n}\n\nexport interface UnlockUpcomingParams {\n start?: string;\n end?: string;\n standardAllocation?: string;\n minMarketCap?: string;\n minReleasedPercentage?: string;\n minTotalUnlockAmount?: string;\n minValueToMarketCap?: string;\n page?: string;\n pageSize?: string;\n}\n\nexport interface UnlockEventsParams {\n standardAllocation?: string;\n start?: string;\n end?: string;\n page?: string;\n pageSize?: string;\n}\n\nexport async function listUnlockEvents(\n client: TokenomistClient,\n params?: UnlockListParams,\n): Promise<ApiResult<UnlockEventList[]>> {\n return client.getWithMeta<UnlockEventList[]>(\n \"/v5/unlock/events/list\",\n params as Record<string, string>,\n );\n}\n\nexport async function listUpcomingUnlockEvents(\n client: TokenomistClient,\n params?: UnlockUpcomingParams,\n): Promise<ApiResult<UnlockEventListUpcoming[]>> {\n return client.getWithMeta<UnlockEventListUpcoming[]>(\n \"/v5/unlock/events/upcoming\",\n params as Record<string, string>,\n );\n}\n\nexport async function getUnlockEvents(\n client: TokenomistClient,\n tokenId: string,\n params?: UnlockEventsParams,\n): Promise<ApiResult<UnlockEventV4[]>> {\n return client.getWithMeta<UnlockEventV4[]>(\n `/v5/unlock/events/${encodeURIComponent(tokenId)}`,\n params as Record<string, string>,\n );\n}\n","import type { MetaData, Pagination } from \"../types/response.js\";\n\n/** The page position of a paginated V5 answer, or undefined when it is not paginated. */\nexport function paginationOf(metadata: MetaData): Pagination | undefined {\n if (metadata.page === undefined || metadata.totalPages === undefined) return undefined;\n return {\n page: metadata.page,\n totalPages: metadata.totalPages,\n pageSize: metadata.pageSize ?? 0,\n // Upstream omits `total` when it is 0.\n total: metadata.total ?? 0,\n };\n}\n\n/** One-line page summary, e.g. \"Page 1/14 · 28 total · next: --page 2\". */\nexport function formatPaginationHint(p: Pagination): string {\n const parts = [`Page ${p.page}/${p.totalPages}`, `${p.total.toLocaleString()} total`];\n if (p.page < p.totalPages) {\n parts.push(`next: --page ${p.page + 1} (or raise --page-size)`);\n }\n return parts.join(\" · \");\n}\n\n/**\n * Print the page position to stderr, so stdout (table/json/csv) stays\n * exactly the data and pipes keep working. Silent on non-paginated answers.\n */\nexport function printPaginationHint(metadata: MetaData, stream = process.stderr): void {\n const p = paginationOf(metadata);\n if (!p) return;\n stream.write(`${formatPaginationHint(p)}\\n`);\n}\n","/**\n * Client-side checks for inputs the API accepts silently. Emission, the\n * investor list and the point-in-time routes answer a reversed range with an\n * empty list instead of an error, which reads as \"no data\".\n */\n\n/** Throw when both bounds are set and `start` is after `end` (YYYY-MM-DD compares lexically). */\nexport function validateDateRange(\n start: string | undefined,\n end: string | undefined,\n names: [string, string] = [\"--start\", \"--end\"],\n): void {\n if (start && end && start > end) {\n throw new Error(`${names[0]} ${start} is after ${names[1]} ${end}`);\n }\n}\n\n/** Throw when both a point-in-time `--as-of` and `--version-id` are given. */\nexport function validateVersionSelector(asOf: string | undefined, versionId: string | undefined) {\n if (asOf && versionId) {\n throw new Error(\"Use either --as-of or --version-id, not both\");\n }\n}\n","import { Command } from \"commander\";\nimport { TokenomistClient } from \"../api/client.js\";\nimport { listInvestors, getInvestorDetail } from \"../api/investor.js\";\nimport { output } from \"../output/formatter.js\";\nimport type { Column } from \"../output/table.js\";\nimport { resolveConfig } from \"../config/config.js\";\nimport { printPaginationHint } from \"../output/pagination.js\";\nimport { validateDateRange } from \"./validate.js\";\n\nconst listColumns: Column[] = [\n { key: \"investorId\", header: \"ID\" },\n { key: \"investorName\", header: \"Name\" },\n { key: \"website\", header: \"Website\" },\n { key: \"latestFundingDate\", header: \"Latest Funding\" },\n { key: \"latestFundingRound\", header: \"Latest Round\" },\n { key: \"roundCount\", header: \"Rounds\", align: \"right\" },\n];\n\nconst detailColumns: Column[] = [\n { key: \"tokenId\", header: \"Token ID\" },\n { key: \"roundName\", header: \"Round\" },\n { key: \"isLeadInvestor\", header: \"Lead?\" },\n { key: \"fundingDate\", header: \"Date\" },\n { key: \"totalAmountRaisedinThatRound\", header: \"Raised\", align: \"right\" },\n { key: \"valuation\", header: \"Valuation\", align: \"right\" },\n { key: \"pricePerToken\", header: \"Price/Token\", align: \"right\" },\n];\n\nexport const investorCommand = new Command(\"investor\").description(\"Investor commands\");\n\ninvestorCommand\n .command(\"list\")\n .description(\"List all investors with their funding rounds\")\n .option(\"--start-latest-funding-date <date>\", \"Start date filter for latest funding (YYYY-MM-DD)\")\n .option(\"--end-latest-funding-date <date>\", \"End date filter for latest funding (YYYY-MM-DD)\")\n .option(\"--page <number>\", \"Page number\")\n .option(\"--page-size <number>\", \"Items per page\")\n .action(async (opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n validateDateRange(opts.startLatestFundingDate, opts.endLatestFundingDate, [\n \"--start-latest-funding-date\",\n \"--end-latest-funding-date\",\n ]);\n const { data, metadata } = await listInvestors(client, {\n startLatestFundingDate: opts.startLatestFundingDate,\n endLatestFundingDate: opts.endLatestFundingDate,\n page: opts.page,\n pageSize: opts.pageSize,\n });\n const rows = data.map((d) => ({\n ...d,\n // The list omits fundingRounds in production; null renders as \"—\", not a misleading 0.\n roundCount: d.fundingRounds ? d.fundingRounds.length : null,\n }));\n output(rows as unknown as Record<string, unknown>[], listColumns, globalOpts.output || \"table\");\n printPaginationHint(metadata);\n });\n\ninvestorCommand\n .command(\"detail <investorId>\")\n .description(\"Get investor detail with funding rounds\")\n .option(\"--is-lead-investor\", \"Filter by lead investor status\")\n .option(\"--funding-date-min <date>\", \"Min funding date (YYYY-MM-DD)\")\n .option(\"--funding-date-max <date>\", \"Max funding date (YYYY-MM-DD)\")\n .option(\"--raised-amount-min <value>\", \"Min raised amount\")\n .option(\"--raised-amount-max <value>\", \"Max raised amount\")\n .action(async (investorId: string, opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n const data = await getInvestorDetail(client, investorId, {\n isLeadInvestor: opts.isLeadInvestor ? \"true\" : undefined,\n fundingDateMin: opts.fundingDateMin,\n fundingDateMax: opts.fundingDateMax,\n raisedAmountMin: opts.raisedAmountMin,\n raisedAmountMax: opts.raisedAmountMax,\n });\n const outputMode = globalOpts.output || \"table\";\n if (outputMode === \"json\") {\n console.log(JSON.stringify(data, null, 2));\n } else {\n console.log(`Investor: ${data.investorName}`);\n console.log(`Website: ${data.website}`);\n console.log(`Latest Funding: ${data.latestFundingDate}`);\n console.log();\n output(data.fundingRounds as unknown as Record<string, unknown>[], detailColumns, outputMode);\n }\n });\n","import type { TokenomistClient } from \"./client.js\";\nimport type { ApiResult } from \"../types/response.js\";\nimport type { FundraisingInvestors, FundraisingInvestorsAggregated } from \"../types/investor.js\";\n\nexport interface InvestorListParams {\n startLatestFundingDate?: string;\n endLatestFundingDate?: string;\n page?: string;\n pageSize?: string;\n}\n\nexport async function listInvestors(\n client: TokenomistClient,\n params?: InvestorListParams,\n): Promise<ApiResult<FundraisingInvestors[]>> {\n return client.getWithMeta<FundraisingInvestors[]>(\n \"/v5/fundraising/investors/list\",\n params as Record<string, string>,\n );\n}\n\nexport interface InvestorDetailParams {\n isLeadInvestor?: string;\n fundingDateMin?: string;\n fundingDateMax?: string;\n raisedAmountMin?: string;\n raisedAmountMax?: string;\n}\n\nexport async function getInvestorDetail(\n client: TokenomistClient,\n investorId: string,\n params?: InvestorDetailParams,\n): Promise<FundraisingInvestorsAggregated> {\n return client.get<FundraisingInvestorsAggregated>(\n `/v5/fundraising/investors/${encodeURIComponent(investorId)}`,\n params as Record<string, string>,\n );\n}\n","import { Command } from \"commander\";\nimport { TokenomistClient } from \"../api/client.js\";\nimport { getFundraising } from \"../api/fundraising.js\";\nimport { output } from \"../output/formatter.js\";\nimport type { Column } from \"../output/table.js\";\nimport { resolveConfig } from \"../config/config.js\";\n\nconst columns: Column[] = [\n { key: \"fundingRound\", header: \"Round\" },\n { key: \"fundingDate\", header: \"Date\" },\n { key: \"raiseType\", header: \"Type\" },\n { key: \"amountRaised\", header: \"Raised\", align: \"right\" },\n { key: \"valuation\", header: \"Valuation\", align: \"right\" },\n { key: \"pricePerToken\", header: \"Price/Token\", align: \"right\" },\n { key: \"numberOfInvestors\", header: \"Investors\", align: \"right\" },\n];\n\nexport const fundraisingCommand = new Command(\"fundraising\").description(\n \"Token fundraising commands\",\n);\n\nfundraisingCommand\n .command(\"detail <tokenId>\")\n .description(\"Get fundraising data for a specific token\")\n .option(\"--funding-date-min <date>\", \"Min funding date (YYYY-MM-DD)\")\n .option(\"--funding-date-max <date>\", \"Max funding date (YYYY-MM-DD)\")\n .option(\"--raised-amount-min <value>\", \"Min raised amount\")\n .option(\"--raised-amount-max <value>\", \"Max raised amount\")\n .action(async (tokenId: string, opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n const data = await getFundraising(client, tokenId, {\n fundingDateMin: opts.fundingDateMin,\n fundingDateMax: opts.fundingDateMax,\n raisedAmountMin: opts.raisedAmountMin,\n raisedAmountMax: opts.raisedAmountMax,\n });\n const outputMode = globalOpts.output || \"table\";\n if (outputMode === \"json\") {\n console.log(JSON.stringify(data, null, 2));\n } else {\n console.log(`Token: ${data.tokenName} (${data.tokenSymbol})`);\n console.log(`Total Raised: ${data.totalAmountRaised ?? \"\\u2014\"}`);\n console.log(`Investor Released: ${data.investorReleasedPercentage ?? \"\\u2014\"}%`);\n console.log();\n output(data.fundingRounds as unknown as Record<string, unknown>[], columns, outputMode);\n }\n });\n","import type { TokenomistClient } from \"./client.js\";\nimport type { FundraisingToken } from \"../types/fundraising.js\";\n\nexport interface FundraisingParams {\n fundingDateMin?: string;\n fundingDateMax?: string;\n raisedAmountMin?: string;\n raisedAmountMax?: string;\n}\n\nexport async function getFundraising(\n client: TokenomistClient,\n tokenId: string,\n params?: FundraisingParams,\n): Promise<FundraisingToken> {\n return client.get<FundraisingToken>(\n `/v5/fundraising/token/${encodeURIComponent(tokenId)}`,\n params as Record<string, string>,\n );\n}\n","import { Command } from \"commander\";\nimport { TokenomistClient } from \"../api/client.js\";\nimport { listBurns, getBurnDetail } from \"../api/burn.js\";\nimport { output } from \"../output/formatter.js\";\nimport type { Column } from \"../output/table.js\";\nimport { resolveConfig } from \"../config/config.js\";\nimport { printPaginationHint } from \"../output/pagination.js\";\nimport { validateDateRange } from \"./validate.js\";\n\nconst listColumns: Column[] = [\n { key: \"tokenId\", header: \"ID\" },\n { key: \"tokenName\", header: \"Name\" },\n { key: \"tokenSymbol\", header: \"Symbol\" },\n { key: \"totalBurnAmount\", header: \"Total Burned\", align: \"right\" },\n { key: \"totalBurnValue\", header: \"Total Value (USD)\", align: \"right\" },\n];\n\nconst detailColumns: Column[] = [\n { key: \"burnEventLabel\", header: \"Label\" },\n { key: \"burnType\", header: \"Type\" },\n { key: \"burnDate\", header: \"Date\" },\n { key: \"amount\", header: \"Amount\", align: \"right\" },\n // Added in 0.2.0 — appended so 0.1.x CSV columns keep their positions.\n { key: \"pricePerToken\", header: \"Price\", align: \"right\" },\n { key: \"value\", header: \"Value (USD)\", align: \"right\" },\n];\n\nexport const burnCommand = new Command(\"burn\").description(\"Token burn commands\");\n\nburnCommand\n .command(\"list\")\n .description(\"List all tokens with burn events\")\n .option(\"--token-id <ids>\", \"Filter by token IDs (comma-separated)\")\n .option(\"--page <number>\", \"Page number\")\n .option(\"--page-size <number>\", \"Items per page\")\n .action(async (opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n const { data, metadata } = await listBurns(client, {\n tokenId: opts.tokenId,\n page: opts.page,\n pageSize: opts.pageSize,\n });\n output(data as unknown as Record<string, unknown>[], listColumns, globalOpts.output || \"table\");\n printPaginationHint(metadata);\n });\n\nburnCommand\n .command(\"detail <tokenId>\")\n .description(\"Get burn events for a specific token\")\n .option(\"--start <date>\", \"Start date (YYYY-MM-DD)\")\n .option(\"--end <date>\", \"End date (YYYY-MM-DD)\")\n .action(async (tokenId: string, opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n validateDateRange(opts.start, opts.end);\n const data = await getBurnDetail(client, tokenId, {\n start: opts.start,\n end: opts.end,\n });\n const outputMode = globalOpts.output || \"table\";\n if (outputMode === \"json\") {\n console.log(JSON.stringify(data, null, 2));\n } else {\n console.log(`Token: ${data.tokenName} (${data.tokenSymbol})`);\n console.log(`Total Burned: ${data.totalBurnAmount.toLocaleString()}`);\n // Table only: CSV stdout keeps its 0.1.x preamble.\n if (outputMode === \"table\") {\n console.log(`Total Value (USD): ${data.totalBurnValue?.toLocaleString() ?? \"\\u2014\"}`);\n }\n console.log();\n output(data.burns as unknown as Record<string, unknown>[], detailColumns, outputMode);\n }\n });\n","import type { TokenomistClient } from \"./client.js\";\nimport type { ApiResult } from \"../types/response.js\";\nimport type { BurnTokenList, BurnToken } from \"../types/burn.js\";\n\nexport interface BurnListParams {\n tokenId?: string;\n page?: string;\n pageSize?: string;\n}\n\nexport async function listBurns(\n client: TokenomistClient,\n params?: BurnListParams,\n): Promise<ApiResult<BurnTokenList[]>> {\n return client.getWithMeta<BurnTokenList[]>(\"/v5/burn/list\", { ...params });\n}\n\nexport async function getBurnDetail(\n client: TokenomistClient,\n tokenId: string,\n params?: { start?: string; end?: string },\n): Promise<BurnToken> {\n const data = await client.get<BurnToken>(\n `/v5/burn/${encodeURIComponent(tokenId)}`,\n params as Record<string, string>,\n );\n // The API sends a null value when no event matched the range; zero events\n // are worth zero (as the MCP server reports it).\n if (!data.burns?.length && data.totalBurnValue == null) data.totalBurnValue = 0;\n return data;\n}\n","import { Command } from \"commander\";\nimport { TokenomistClient } from \"../api/client.js\";\nimport { listBuybacks, getBuybackDetail } from \"../api/buyback.js\";\nimport { output } from \"../output/formatter.js\";\nimport type { Column } from \"../output/table.js\";\nimport { resolveConfig } from \"../config/config.js\";\nimport { printPaginationHint } from \"../output/pagination.js\";\nimport { validateDateRange } from \"./validate.js\";\n\nconst listColumns: Column[] = [\n { key: \"tokenId\", header: \"ID\" },\n { key: \"tokenName\", header: \"Name\" },\n { key: \"tokenSymbol\", header: \"Symbol\" },\n { key: \"totalBuybackAmount\", header: \"Total Buyback\", align: \"right\" },\n { key: \"totalBuybackValue\", header: \"Total Value (USD)\", align: \"right\" },\n];\n\nconst detailColumns: Column[] = [\n { key: \"buybackEventLabel\", header: \"Label\" },\n { key: \"buybackType\", header: \"Type\" },\n { key: \"buybackDate\", header: \"Date\" },\n { key: \"tokenAmount\", header: \"Amount\", align: \"right\" },\n { key: \"value\", header: \"Value\", align: \"right\" },\n { key: \"spentAmount\", header: \"Spent\", align: \"right\" },\n { key: \"spentUnit\", header: \"Unit\" },\n // Added in 0.2.0 — appended so 0.1.x CSV columns keep their positions.\n { key: \"pricePerToken\", header: \"Price\", align: \"right\" },\n];\n\nexport const buybackCommand = new Command(\"buyback\").description(\"Token buyback commands\");\n\nbuybackCommand\n .command(\"list\")\n .description(\"List all tokens with buyback events\")\n .option(\"--token-id <ids>\", \"Filter by token IDs (comma-separated)\")\n .option(\"--page <number>\", \"Page number\")\n .option(\"--page-size <number>\", \"Items per page\")\n .action(async (opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n const { data, metadata } = await listBuybacks(client, {\n tokenId: opts.tokenId,\n page: opts.page,\n pageSize: opts.pageSize,\n });\n output(data as unknown as Record<string, unknown>[], listColumns, globalOpts.output || \"table\");\n printPaginationHint(metadata);\n });\n\nbuybackCommand\n .command(\"detail <tokenId>\")\n .description(\"Get buyback events for a specific token\")\n .option(\"--start <date>\", \"Start date (YYYY-MM-DD)\")\n .option(\"--end <date>\", \"End date (YYYY-MM-DD)\")\n .action(async (tokenId: string, opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n validateDateRange(opts.start, opts.end);\n const data = await getBuybackDetail(client, tokenId, {\n start: opts.start,\n end: opts.end,\n });\n const outputMode = globalOpts.output || \"table\";\n if (outputMode === \"json\") {\n console.log(JSON.stringify(data, null, 2));\n } else {\n console.log(`Token: ${data.tokenName} (${data.tokenSymbol})`);\n console.log(`Total Buyback: ${data.totalBuybackAmount.toLocaleString()}`);\n // Table only: CSV stdout keeps its 0.1.x preamble.\n if (outputMode === \"table\") {\n console.log(`Total Value (USD): ${data.totalBuybackValue?.toLocaleString() ?? \"\\u2014\"}`);\n }\n console.log();\n output(data.buybacks as unknown as Record<string, unknown>[], detailColumns, outputMode);\n }\n });\n","import type { TokenomistClient } from \"./client.js\";\nimport type { ApiResult } from \"../types/response.js\";\nimport type { BuybackTokenList, BuybackToken } from \"../types/buyback.js\";\n\nexport interface BuybackListParams {\n tokenId?: string;\n page?: string;\n pageSize?: string;\n}\n\nexport async function listBuybacks(\n client: TokenomistClient,\n params?: BuybackListParams,\n): Promise<ApiResult<BuybackTokenList[]>> {\n return client.getWithMeta<BuybackTokenList[]>(\"/v5/buyback/list\", { ...params });\n}\n\nexport async function getBuybackDetail(\n client: TokenomistClient,\n tokenId: string,\n params?: { start?: string; end?: string },\n): Promise<BuybackToken> {\n const data = await client.get<BuybackToken>(\n `/v5/buyback/${encodeURIComponent(tokenId)}`,\n params as Record<string, string>,\n );\n // The API sends a null value when no event matched the range; zero events\n // are worth zero (as the MCP server reports it).\n if (!data.buybacks?.length && data.totalBuybackValue == null) data.totalBuybackValue = 0;\n return data;\n}\n","import { Command } from \"commander\";\nimport { TokenomistClient } from \"../api/client.js\";\nimport { getDailyEmission, getWeeklyEmission } from \"../api/emission.js\";\nimport { output } from \"../output/formatter.js\";\nimport type { Column } from \"../output/table.js\";\nimport { resolveConfig } from \"../config/config.js\";\nimport { printPaginationHint } from \"../output/pagination.js\";\nimport { validateDateRange } from \"./validate.js\";\n\nconst columns: Column[] = [\n { key: \"startDate\", header: \"Start\" },\n { key: \"endDate\", header: \"End\" },\n { key: \"tokenName\", header: \"Token\" },\n { key: \"tokenSymbol\", header: \"Symbol\" },\n { key: \"unlockAmount\", header: \"Unlock Amt\", align: \"right\" },\n { key: \"unlockValue\", header: \"Unlock Val\", align: \"right\" },\n { key: \"referencePrice\", header: \"Ref Price\", align: \"right\" },\n { key: \"totalCumulativeUnlockedAmount\", header: \"Cumulative\", align: \"right\" },\n];\n\nexport const emissionCommand = new Command(\"emission\").description(\"Token emission commands\");\n\nemissionCommand\n .command(\"daily <tokenId>\")\n .description(\"Get daily emission breakdown for a token\")\n .option(\"--start <date>\", \"Start date (YYYY-MM-DD)\")\n .option(\"--end <date>\", \"End date (YYYY-MM-DD)\")\n .option(\"--standard-allocation <names>\", \"Filter by allocation (comma-separated)\")\n .option(\"--page <number>\", \"Page number\")\n .option(\"--page-size <number>\", \"Items per page\")\n .action(async (tokenId: string, opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n validateDateRange(opts.start, opts.end);\n const { data, metadata } = await getDailyEmission(client, tokenId, {\n start: opts.start,\n end: opts.end,\n standardAllocation: opts.standardAllocation,\n page: opts.page,\n pageSize: opts.pageSize,\n });\n output(data as unknown as Record<string, unknown>[], columns, globalOpts.output || \"table\");\n printPaginationHint(metadata);\n });\n\nemissionCommand\n .command(\"weekly <tokenId>\")\n .description(\"Get weekly emission breakdown for a token\")\n .option(\"--start <date>\", \"Start date (YYYY-MM-DD)\")\n .option(\"--end <date>\", \"End date (YYYY-MM-DD)\")\n .option(\"--standard-allocation <names>\", \"Filter by allocation (comma-separated)\")\n .option(\"--page <number>\", \"Page number\")\n .option(\"--page-size <number>\", \"Items per page\")\n .action(async (tokenId: string, opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n validateDateRange(opts.start, opts.end);\n const { data, metadata } = await getWeeklyEmission(client, tokenId, {\n start: opts.start,\n end: opts.end,\n standardAllocation: opts.standardAllocation,\n page: opts.page,\n pageSize: opts.pageSize,\n });\n output(data as unknown as Record<string, unknown>[], columns, globalOpts.output || \"table\");\n printPaginationHint(metadata);\n });\n","import type { TokenomistClient } from \"./client.js\";\nimport type { ApiResult } from \"../types/response.js\";\nimport type { EmissionBreakdown } from \"../types/emission.js\";\n\nexport interface EmissionParams {\n standardAllocation?: string;\n start?: string;\n end?: string;\n page?: string;\n pageSize?: string;\n}\n\nexport async function getDailyEmission(\n client: TokenomistClient,\n tokenId: string,\n params?: EmissionParams,\n): Promise<ApiResult<EmissionBreakdown[]>> {\n return client.getWithMeta<EmissionBreakdown[]>(\n `/v5/daily-emission/${encodeURIComponent(tokenId)}`,\n params as Record<string, string>,\n );\n}\n\nexport async function getWeeklyEmission(\n client: TokenomistClient,\n tokenId: string,\n params?: EmissionParams,\n): Promise<ApiResult<EmissionBreakdown[]>> {\n return client.getWithMeta<EmissionBreakdown[]>(\n `/v5/emission/${encodeURIComponent(tokenId)}`,\n params as Record<string, string>,\n );\n}\n","import { Command } from \"commander\";\nimport { TokenomistClient } from \"../api/client.js\";\nimport { getAllocation } from \"../api/allocation.js\";\nimport { output } from \"../output/formatter.js\";\nimport type { Column } from \"../output/table.js\";\nimport { resolveConfig } from \"../config/config.js\";\n\nconst columns: Column[] = [\n { key: \"allocationName\", header: \"Allocation\" },\n { key: \"allocationType\", header: \"Type\" },\n { key: \"standardAllocationName\", header: \"Std. Allocation\" },\n { key: \"allocationAmount\", header: \"Amount\", align: \"right\" },\n { key: \"allocationUnlockedAmount\", header: \"Unlocked\", align: \"right\" },\n { key: \"allocationLockedAmount\", header: \"Locked\", align: \"right\" },\n { key: \"trackedAllocationPercentage\", header: \"Tracked %\", align: \"right\" },\n];\n\nexport const allocationCommand = new Command(\"allocation\").description(\"Token allocation commands\");\n\nallocationCommand\n .command(\"detail <tokenId>\")\n .description(\"Get standard allocation data for a specific token\")\n .action(async (tokenId: string, _opts, cmd) => {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n const data = await getAllocation(client, tokenId);\n const outputMode = globalOpts.output || \"table\";\n if (outputMode === \"json\") {\n console.log(JSON.stringify(data, null, 2));\n } else {\n console.log(`Token: ${data.name} (${data.symbol})`);\n console.log(`Max Supply: ${data.maxSupply?.toLocaleString() ?? \"\\u2014\"}`);\n console.log(`Total Unlocked: ${data.totalUnlockedAmount.toLocaleString()}`);\n console.log(`Total Locked: ${data.totalLockedAmount.toLocaleString()}`);\n console.log(`Last Updated: ${data.lastUpdatedDate}`);\n console.log();\n output(data.allocations as unknown as Record<string, unknown>[], columns, outputMode);\n }\n });\n","import type { TokenomistClient } from \"./client.js\";\nimport type { StandardAllocation } from \"../types/allocation.js\";\n\nexport async function getAllocation(\n client: TokenomistClient,\n tokenId: string,\n): Promise<StandardAllocation> {\n return client.get<StandardAllocation>(`/v5/allocations/${encodeURIComponent(tokenId)}`);\n}\n","import { Command } from \"commander\";\nimport { createInterface } from \"node:readline\";\nimport {\n loadConfigFile,\n saveConfigFile,\n deleteConfigFile,\n maskApiKey,\n getConfigPath,\n} from \"../config/store.js\";\n\nfunction readInput(prompt: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stderr });\n return new Promise((resolve) => {\n rl.question(prompt, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nexport const authCommand = new Command(\"auth\").description(\"Manage API key authentication\");\n\nauthCommand\n .command(\"login\")\n .description(\"Store your API key securely in ~/.tokenomist/config.json\")\n .option(\"--api-key <key>\", \"API key (will prompt if not provided)\")\n .action(async (opts) => {\n let apiKey = opts.apiKey;\n\n if (!apiKey) {\n apiKey = await readInput(\"Enter your Tokenomist API key: \");\n }\n\n if (!apiKey) {\n console.error(\"Error: API key cannot be empty.\");\n process.exit(1);\n }\n\n const config = loadConfigFile();\n config.apiKey = apiKey;\n saveConfigFile(config);\n\n console.log(`API key saved to ${getConfigPath()}`);\n console.log(`Key: ${maskApiKey(apiKey)}`);\n });\n\nauthCommand\n .command(\"logout\")\n .description(\"Remove stored API key\")\n .action(() => {\n const config = loadConfigFile();\n if (!config.apiKey) {\n console.log(\"No API key stored.\");\n return;\n }\n\n delete config.apiKey;\n\n if (Object.keys(config).length === 0) {\n deleteConfigFile();\n console.log(`Removed ${getConfigPath()}`);\n } else {\n saveConfigFile(config);\n console.log(\"API key removed from config.\");\n }\n });\n\nauthCommand\n .command(\"status\")\n .description(\"Show current authentication status\")\n .action(() => {\n const envKey = process.env.TOKENOMIST_API_KEY;\n const config = loadConfigFile();\n const fileKey = config.apiKey;\n\n if (envKey) {\n console.log(`Source: TOKENOMIST_API_KEY env var`);\n console.log(`Key: ${maskApiKey(envKey)}`);\n } else if (fileKey) {\n console.log(`Source: ${getConfigPath()}`);\n console.log(`Key: ${maskApiKey(fileKey)}`);\n } else {\n console.log(\"Not authenticated.\");\n console.log(`Run \"tok auth login\" to store your API key.`);\n }\n });\n","import { Command } from \"commander\";\nimport schema from \"../schema.json\" with { type: \"json\" };\n\nexport const schemaCommand = new Command(\"schema\")\n .description(\"Print full command schema as JSON\")\n .option(\"--pretty\", \"Pretty-print with 2-space indent\")\n .action((opts) => {\n const indent = opts.pretty ? 2 : undefined;\n console.log(JSON.stringify(schema, null, indent));\n });\n","{\n \"name\": \"tok\",\n \"version\": \"0.2.0\",\n \"description\": \"CLI tool for the Tokenomist API\",\n \"notes\": {\n \"pagination\": \"Paginated commands (unlock list/upcoming/events, emission daily/weekly, investor list, burn list, buyback list, pit versions/daily-emission/unlock-events) return one page (default 20 rows). The page position is printed to stderr as 'Page <page>/<totalPages> · <total> total'; stdout stays the data only. A page past the last returns the last page again. pit commands with --output json include it as a 'pagination' object.\",\n \"pointInTime\": \"pit commands answer from one tokenomics version: --as-of <instant> (YYYY-MM-DD or RFC 3339) or --version-id <id> from 'pit versions', never both; neither means the current version. Their --output json is {asOf, version, data, pagination?}; pit versions returns {data, pagination}. They need a plan with point-in-time access (API, ELITE or TEAM); others get FORBIDDEN (PLAN_NOT_ELIGIBLE or Forbidden).\"\n },\n \"globalOptions\": {\n \"api-key\": { \"flags\": \"-k, --api-key <key>\", \"description\": \"API key (overrides env/config)\" },\n \"output\": { \"flags\": \"-o, --output <format>\", \"description\": \"Output format: table, json, csv\", \"default\": \"table\" },\n \"base-url\": { \"flags\": \"--base-url <url>\", \"description\": \"API base URL\" },\n \"no-cache\": { \"flags\": \"--no-cache\", \"description\": \"Bypass response cache\" }\n },\n \"commands\": {\n \"token list\": {\n \"description\": \"List all tracked tokens with market data\",\n \"options\": {\n \"token-id\": { \"flags\": \"--token-id <ids>\", \"description\": \"Filter by token IDs (comma-separated)\" }\n },\n \"example\": \"tok token list --output json\"\n },\n \"token search <query>\": {\n \"description\": \"Search for tokens by name, symbol, or ID\",\n \"arguments\": { \"query\": { \"required\": true, \"description\": \"Search query string\" } },\n \"example\": \"tok token search bitcoin --output json\"\n },\n \"unlock list\": {\n \"description\": \"List unlock events grouped by token\",\n \"options\": {\n \"min-market-cap\": { \"flags\": \"--min-market-cap <value>\", \"description\": \"Minimum market cap\" },\n \"min-released-percentage\": { \"flags\": \"--min-released-percentage <value>\", \"description\": \"Minimum released percentage\" },\n \"min-unlock-date\": { \"flags\": \"--min-unlock-date <date>\", \"description\": \"Min unlock date (YYYY-MM-DD)\" },\n \"max-unlock-date\": { \"flags\": \"--max-unlock-date <date>\", \"description\": \"Max unlock date (YYYY-MM-DD)\" },\n \"min-total-unlock-amount\": { \"flags\": \"--min-total-unlock-amount <value>\", \"description\": \"Minimum total unlock amount\" },\n \"min-value-to-market-cap\": { \"flags\": \"--min-value-to-market-cap <value>\", \"description\": \"Min value-to-market-cap ratio\" },\n \"standard-allocation\": { \"flags\": \"--standard-allocation <names>\", \"description\": \"Filter by allocation (comma-separated)\" },\n \"page\": { \"flags\": \"--page <number>\", \"description\": \"Page number\" },\n \"page-size\": { \"flags\": \"--page-size <number>\", \"description\": \"Items per page\" }\n },\n \"example\": \"tok unlock list --min-market-cap 1000000\"\n },\n \"unlock upcoming\": {\n \"description\": \"List next upcoming unlock event per token\",\n \"options\": {\n \"start\": { \"flags\": \"--start <date>\", \"description\": \"Start date (YYYY-MM-DD)\" },\n \"end\": { \"flags\": \"--end <date>\", \"description\": \"End date (YYYY-MM-DD)\" },\n \"standard-allocation\": { \"flags\": \"--standard-allocation <names>\", \"description\": \"Filter by allocation (comma-separated)\" },\n \"min-market-cap\": { \"flags\": \"--min-market-cap <value>\", \"description\": \"Minimum market cap\" },\n \"min-released-percentage\": { \"flags\": \"--min-released-percentage <value>\", \"description\": \"Minimum released percentage\" },\n \"min-total-unlock-amount\": { \"flags\": \"--min-total-unlock-amount <value>\", \"description\": \"Minimum total unlock amount\" },\n \"min-value-to-market-cap\": { \"flags\": \"--min-value-to-market-cap <value>\", \"description\": \"Min value-to-market-cap ratio\" },\n \"page\": { \"flags\": \"--page <number>\", \"description\": \"Page number\" },\n \"page-size\": { \"flags\": \"--page-size <number>\", \"description\": \"Items per page\" }\n },\n \"example\": \"tok unlock upcoming --output json\"\n },\n \"unlock events <tokenId>\": {\n \"description\": \"Get unlock events for a specific token\",\n \"arguments\": { \"tokenId\": { \"required\": true, \"description\": \"Token ID (e.g. solana)\" } },\n \"options\": {\n \"start\": { \"flags\": \"--start <date>\", \"description\": \"Start date (YYYY-MM-DD)\" },\n \"end\": { \"flags\": \"--end <date>\", \"description\": \"End date (YYYY-MM-DD)\" },\n \"standard-allocation\": { \"flags\": \"--standard-allocation <names>\", \"description\": \"Filter by allocation (comma-separated)\" },\n \"page\": { \"flags\": \"--page <number>\", \"description\": \"Page number\" },\n \"page-size\": { \"flags\": \"--page-size <number>\", \"description\": \"Items per page\" }\n },\n \"example\": \"tok unlock events solana --start 2024-01-01 --end 2024-12-31\"\n },\n \"investor list\": {\n \"description\": \"List all investors\",\n \"options\": {\n \"start-latest-funding-date\": { \"flags\": \"--start-latest-funding-date <date>\", \"description\": \"Start date filter for latest funding (YYYY-MM-DD)\" },\n \"end-latest-funding-date\": { \"flags\": \"--end-latest-funding-date <date>\", \"description\": \"End date filter for latest funding (YYYY-MM-DD)\" },\n \"page\": { \"flags\": \"--page <number>\", \"description\": \"Page number\" },\n \"page-size\": { \"flags\": \"--page-size <number>\", \"description\": \"Items per page\" }\n },\n \"example\": \"tok investor list --output json\"\n },\n \"investor detail <investorId>\": {\n \"description\": \"Get investor portfolio and funding rounds\",\n \"arguments\": { \"investorId\": { \"required\": true, \"description\": \"Investor ID\" } },\n \"options\": {\n \"is-lead-investor\": { \"flags\": \"--is-lead-investor\", \"description\": \"Filter to rounds where investor was lead\" },\n \"funding-date-min\": { \"flags\": \"--funding-date-min <date>\", \"description\": \"Minimum funding date\" },\n \"funding-date-max\": { \"flags\": \"--funding-date-max <date>\", \"description\": \"Maximum funding date\" },\n \"raised-amount-min\": { \"flags\": \"--raised-amount-min <amount>\", \"description\": \"Minimum raised amount\" },\n \"raised-amount-max\": { \"flags\": \"--raised-amount-max <amount>\", \"description\": \"Maximum raised amount\" }\n },\n \"example\": \"tok investor detail 123 --is-lead-investor\"\n },\n \"fundraising detail <tokenId>\": {\n \"description\": \"Get fundraising data for a specific token\",\n \"arguments\": { \"tokenId\": { \"required\": true, \"description\": \"Token ID\" } },\n \"options\": {\n \"funding-date-min\": { \"flags\": \"--funding-date-min <date>\", \"description\": \"Minimum funding date\" },\n \"funding-date-max\": { \"flags\": \"--funding-date-max <date>\", \"description\": \"Maximum funding date\" },\n \"raised-amount-min\": { \"flags\": \"--raised-amount-min <amount>\", \"description\": \"Minimum raised amount\" },\n \"raised-amount-max\": { \"flags\": \"--raised-amount-max <amount>\", \"description\": \"Maximum raised amount\" }\n },\n \"example\": \"tok fundraising detail uniswap --output json\"\n },\n \"burn list\": {\n \"description\": \"List all tokens with burn data\",\n \"options\": {\n \"token-id\": { \"flags\": \"--token-id <ids>\", \"description\": \"Filter by token IDs (comma-separated)\" },\n \"page\": { \"flags\": \"--page <number>\", \"description\": \"Page number\" },\n \"page-size\": { \"flags\": \"--page-size <number>\", \"description\": \"Items per page\" }\n },\n \"example\": \"tok burn list --output json\"\n },\n \"burn detail <tokenId>\": {\n \"description\": \"Get burn events for a specific token\",\n \"arguments\": { \"tokenId\": { \"required\": true, \"description\": \"Token ID\" } },\n \"options\": {\n \"start\": { \"flags\": \"--start <date>\", \"description\": \"Start date\" },\n \"end\": { \"flags\": \"--end <date>\", \"description\": \"End date\" }\n },\n \"example\": \"tok burn detail solana --start 2024-01-01\"\n },\n \"buyback list\": {\n \"description\": \"List all tokens with buyback data\",\n \"options\": {\n \"token-id\": { \"flags\": \"--token-id <ids>\", \"description\": \"Filter by token IDs (comma-separated)\" },\n \"page\": { \"flags\": \"--page <number>\", \"description\": \"Page number\" },\n \"page-size\": { \"flags\": \"--page-size <number>\", \"description\": \"Items per page\" }\n },\n \"example\": \"tok buyback list --output json\"\n },\n \"buyback detail <tokenId>\": {\n \"description\": \"Get buyback events for a specific token\",\n \"arguments\": { \"tokenId\": { \"required\": true, \"description\": \"Token ID\" } },\n \"options\": {\n \"start\": { \"flags\": \"--start <date>\", \"description\": \"Start date\" },\n \"end\": { \"flags\": \"--end <date>\", \"description\": \"End date\" }\n },\n \"example\": \"tok buyback detail solana --output json\"\n },\n \"emission daily <tokenId>\": {\n \"description\": \"Get daily emission data for a token\",\n \"arguments\": { \"tokenId\": { \"required\": true, \"description\": \"Token ID\" } },\n \"options\": {\n \"start\": { \"flags\": \"--start <date>\", \"description\": \"Start date\" },\n \"end\": { \"flags\": \"--end <date>\", \"description\": \"End date\" },\n \"standard-allocation\": { \"flags\": \"--standard-allocation <names>\", \"description\": \"Filter by allocation (comma-separated)\" },\n \"page\": { \"flags\": \"--page <number>\", \"description\": \"Page number\" },\n \"page-size\": { \"flags\": \"--page-size <number>\", \"description\": \"Items per page\" }\n },\n \"example\": \"tok emission daily arbitrum --start 2024-08-01 --end 2024-08-31\"\n },\n \"emission weekly <tokenId>\": {\n \"description\": \"Get weekly emission data for a token\",\n \"arguments\": { \"tokenId\": { \"required\": true, \"description\": \"Token ID\" } },\n \"options\": {\n \"start\": { \"flags\": \"--start <date>\", \"description\": \"Start date\" },\n \"end\": { \"flags\": \"--end <date>\", \"description\": \"End date\" },\n \"standard-allocation\": { \"flags\": \"--standard-allocation <names>\", \"description\": \"Filter by allocation (comma-separated)\" },\n \"page\": { \"flags\": \"--page <number>\", \"description\": \"Page number\" },\n \"page-size\": { \"flags\": \"--page-size <number>\", \"description\": \"Items per page\" }\n },\n \"example\": \"tok emission weekly arbitrum --start 2024-01-01 --end 2024-06-30\"\n },\n \"allocation detail <tokenId>\": {\n \"description\": \"Get standard allocation data for a specific token\",\n \"arguments\": { \"tokenId\": { \"required\": true, \"description\": \"Token ID\" } },\n \"example\": \"tok allocation detail solana --output json\"\n },\n \"pit versions <tokenId>\": {\n \"description\": \"List a token's tokenomics versions on its project timeline (point-in-time)\",\n \"arguments\": { \"tokenId\": { \"required\": true, \"description\": \"Token ID (e.g. arbitrum)\" } },\n \"options\": {\n \"start\": { \"flags\": \"--start <date>\", \"description\": \"Keep versions valid from this day (YYYY-MM-DD)\" },\n \"end\": { \"flags\": \"--end <date>\", \"description\": \"Keep versions valid from up to this day (YYYY-MM-DD)\" },\n \"page\": { \"flags\": \"--page <number>\", \"description\": \"Page number\" },\n \"page-size\": { \"flags\": \"--page-size <number>\", \"description\": \"Items per page\" }\n },\n \"example\": \"tok pit versions arbitrum --output json\"\n },\n \"pit allocation <tokenId>\": {\n \"description\": \"Get a token's allocations as published at a version (point-in-time, no USD fields)\",\n \"arguments\": { \"tokenId\": { \"required\": true, \"description\": \"Token ID\" } },\n \"options\": {\n \"as-of\": { \"flags\": \"--as-of <instant>\", \"description\": \"Answer as known at this instant (YYYY-MM-DD or RFC 3339)\" },\n \"version-id\": { \"flags\": \"--version-id <id>\", \"description\": \"Answer from this version (from pit versions)\" }\n },\n \"example\": \"tok pit allocation arbitrum --as-of 2024-01-01 --output json\"\n },\n \"pit daily-emission <tokenId>\": {\n \"description\": \"Get a token's daily emission (cliff + linear) as published at a version (point-in-time, no USD fields)\",\n \"arguments\": { \"tokenId\": { \"required\": true, \"description\": \"Token ID\" } },\n \"options\": {\n \"as-of\": { \"flags\": \"--as-of <instant>\", \"description\": \"Answer as known at this instant (YYYY-MM-DD or RFC 3339)\" },\n \"version-id\": { \"flags\": \"--version-id <id>\", \"description\": \"Answer from this version (from pit versions)\" },\n \"start\": { \"flags\": \"--start <date>\", \"description\": \"Start date (YYYY-MM-DD)\" },\n \"end\": { \"flags\": \"--end <date>\", \"description\": \"End date (YYYY-MM-DD)\" },\n \"standard-allocation\": { \"flags\": \"--standard-allocation <names>\", \"description\": \"Filter by allocation (comma-separated: community, founderTeam, privateInvestors, publicInvestors, others, reserve)\" },\n \"page\": { \"flags\": \"--page <number>\", \"description\": \"Page number\" },\n \"page-size\": { \"flags\": \"--page-size <number>\", \"description\": \"Items per page\" }\n },\n \"example\": \"tok pit daily-emission arbitrum --as-of 2024-01-01 --start 2024-03-01 --end 2024-03-31\"\n },\n \"pit unlock-events <tokenId>\": {\n \"description\": \"Get a token's cliff unlock events as published at a version (point-in-time, no USD fields)\",\n \"arguments\": { \"tokenId\": { \"required\": true, \"description\": \"Token ID\" } },\n \"options\": {\n \"as-of\": { \"flags\": \"--as-of <instant>\", \"description\": \"Answer as known at this instant (YYYY-MM-DD or RFC 3339)\" },\n \"version-id\": { \"flags\": \"--version-id <id>\", \"description\": \"Answer from this version (from pit versions)\" },\n \"start\": { \"flags\": \"--start <date>\", \"description\": \"Start date (YYYY-MM-DD)\" },\n \"end\": { \"flags\": \"--end <date>\", \"description\": \"End date (YYYY-MM-DD)\" },\n \"standard-allocation\": { \"flags\": \"--standard-allocation <names>\", \"description\": \"Filter by allocation (comma-separated: community, founderTeam, privateInvestors, publicInvestors, others, reserve)\" },\n \"page\": { \"flags\": \"--page <number>\", \"description\": \"Page number\" },\n \"page-size\": { \"flags\": \"--page-size <number>\", \"description\": \"Items per page\" }\n },\n \"example\": \"tok pit unlock-events arbitrum --version-id arbitrum-p-6502a0ab2e1d22b626158232 --output json\"\n },\n \"auth login\": {\n \"description\": \"Store API key\",\n \"options\": {\n \"api-key\": { \"flags\": \"--api-key <key>\", \"description\": \"API key (prompts if not provided)\" }\n },\n \"example\": \"tok auth login\"\n },\n \"auth logout\": {\n \"description\": \"Remove stored API key\",\n \"example\": \"tok auth logout\"\n },\n \"auth status\": {\n \"description\": \"Show current auth status\",\n \"example\": \"tok auth status\"\n },\n \"schema\": {\n \"description\": \"Print full command schema as JSON\",\n \"options\": {\n \"pretty\": { \"flags\": \"--pretty\", \"description\": \"Pretty-print with 2-space indent\" }\n },\n \"example\": \"tok schema --pretty\"\n }\n }\n}\n","import { Command } from \"commander\";\nimport { TokenomistClient } from \"../api/client.js\";\nimport {\n getTokenVersions,\n getPointInTimeAllocation,\n getPointInTimeDailyEmission,\n getPointInTimeUnlockEvents,\n} from \"../api/point-in-time.js\";\nimport { output, type OutputMode } from \"../output/formatter.js\";\nimport type { Column } from \"../output/table.js\";\nimport { paginationOf, printPaginationHint } from \"../output/pagination.js\";\nimport { resolveConfig } from \"../config/config.js\";\nimport { validateDateRange, validateVersionSelector } from \"./validate.js\";\nimport type { ApiResult } from \"../types/response.js\";\n\nconst versionColumns: Column[] = [\n { key: \"historyOrder\", header: \"#\", align: \"right\" },\n { key: \"id\", header: \"Version ID\" },\n { key: \"status\", header: \"Status\" },\n { key: \"validFrom\", header: \"Valid From\" },\n { key: \"validUntil\", header: \"Valid Until\" },\n { key: \"changeCategory\", header: \"Change\" },\n { key: \"changeTitle\", header: \"Title\" },\n];\n\nconst allocationColumns: Column[] = [\n { key: \"allocationName\", header: \"Allocation\" },\n { key: \"allocationType\", header: \"Type\" },\n { key: \"standardAllocationName\", header: \"Std. Allocation\" },\n { key: \"allocationAmount\", header: \"Amount\", align: \"right\" },\n { key: \"allocationUnlockedAmount\", header: \"Unlocked\", align: \"right\" },\n { key: \"allocationLockedAmount\", header: \"Locked\", align: \"right\" },\n { key: \"trackedAllocationPercentage\", header: \"Tracked %\", align: \"right\" },\n];\n\nconst emissionColumns: Column[] = [\n { key: \"startDate\", header: \"Start\" },\n { key: \"endDate\", header: \"End\" },\n { key: \"tokenSymbol\", header: \"Symbol\" },\n { key: \"unlockAmount\", header: \"Unlock Amt\", align: \"right\" },\n { key: \"totalCumulativeUnlockedAmount\", header: \"Cumulative\", align: \"right\" },\n { key: \"committedClaimAmount\", header: \"Committed Claim\", align: \"right\" },\n];\n\nconst unlockColumns: Column[] = [\n { key: \"unlockDate\", header: \"Date\" },\n { key: \"tokenSymbol\", header: \"Symbol\" },\n { key: \"cliffAmount\", header: \"Cliff Amount\", align: \"right\" },\n { key: \"allocationNames\", header: \"Allocations\" },\n];\n\nconst STANDARD_ALLOCATION_HELP =\n \"Filter by allocation (comma-separated: community, founderTeam, privateInvestors, publicInvestors, others, reserve)\";\n\nfunction addSelectorOptions(cmd: Command): Command {\n return cmd\n .option(\n \"--as-of <instant>\",\n \"Answer as known at this instant (YYYY-MM-DD or RFC 3339, e.g. 2024-07-01T12:00:00Z)\",\n )\n .option(\"--version-id <id>\", \"Answer from this version (from `tok pit versions`)\");\n}\n\nfunction addSeriesOptions(cmd: Command): Command {\n return addSelectorOptions(cmd)\n .option(\"--start <date>\", \"Start date (YYYY-MM-DD)\")\n .option(\"--end <date>\", \"End date (YYYY-MM-DD)\")\n .option(\"--standard-allocation <names>\", STANDARD_ALLOCATION_HELP)\n .option(\"--page <number>\", \"Page number\")\n .option(\"--page-size <number>\", \"Items per page\");\n}\n\nfunction clientFor(cmd: Command): { client: TokenomistClient; mode: OutputMode } {\n const globalOpts = cmd.optsWithGlobals();\n const config = resolveConfig(globalOpts);\n const client = new TokenomistClient(config.apiKey, config.baseUrl, {\n noCache: config.noCache,\n });\n return { client, mode: (globalOpts.output || \"table\") as OutputMode };\n}\n\n/** JSON output of a point-in-time answer: the data with the version that answered it. */\nfunction printJson<T>(result: ApiResult<T>): void {\n const { metadata, data } = result;\n const pagination = paginationOf(metadata);\n const out: Record<string, unknown> = {};\n if (metadata.asOf !== undefined) out.asOf = metadata.asOf;\n if (metadata.version !== undefined) out.version = metadata.version;\n out.data = data;\n if (pagination) out.pagination = pagination;\n console.log(JSON.stringify(out, null, 2));\n}\n\n/**\n * Print which version answered. Table mode writes it to stdout with the\n * table; csv mode to stderr so stdout stays parseable.\n */\nfunction printVersionContext(result: ApiResult<unknown>, mode: OutputMode): void {\n const { asOf, version } = result.metadata;\n if (asOf === undefined && version === undefined) return;\n const lines: string[] = [];\n if (asOf) lines.push(`As of: ${asOf}`);\n if (version) {\n const id = typeof version.id === \"string\" ? version.id : \"—\";\n const status = typeof version.status === \"string\" ? ` (${version.status})` : \"\";\n lines.push(`Version: ${id}${status}`);\n }\n writeContext(lines, mode);\n}\n\nfunction writeContext(lines: string[], mode: OutputMode): void {\n if (lines.length === 0) return;\n const text = lines.join(\"\\n\") + \"\\n\";\n if (mode === \"csv\") process.stderr.write(text);\n else process.stdout.write(text + \"\\n\");\n}\n\nexport const pitCommand = new Command(\"pit\")\n .alias(\"point-in-time\")\n .description(\n \"Point-in-time history: a token's data as published at a past version (no USD fields)\",\n );\n\npitCommand\n .command(\"versions <tokenId>\")\n .description(\"List a token's tokenomics versions (project timeline)\")\n .option(\"--start <date>\", \"Keep versions valid from this day (YYYY-MM-DD)\")\n .option(\"--end <date>\", \"Keep versions valid from up to this day (YYYY-MM-DD)\")\n .option(\"--page <number>\", \"Page number\")\n .option(\"--page-size <number>\", \"Items per page\")\n .action(async (tokenId: string, opts, cmd) => {\n validateDateRange(opts.start, opts.end);\n const { client, mode } = clientFor(cmd);\n const result = await getTokenVersions(client, tokenId, {\n start: opts.start,\n end: opts.end,\n page: opts.page,\n pageSize: opts.pageSize,\n });\n if (mode === \"json\") return printJson(result);\n const rows = result.data.map((v) => ({\n ...v,\n changeCategory: v.change?.category,\n changeTitle: v.change?.title,\n }));\n output(rows as unknown as Record<string, unknown>[], versionColumns, mode);\n printPaginationHint(result.metadata);\n });\n\naddSelectorOptions(\n pitCommand\n .command(\"allocation <tokenId>\")\n .description(\"Get a token's allocations as published at a version\"),\n).action(async (tokenId: string, opts, cmd) => {\n validateVersionSelector(opts.asOf, opts.versionId);\n const { client, mode } = clientFor(cmd);\n const result = await getPointInTimeAllocation(client, tokenId, {\n asOf: opts.asOf,\n versionId: opts.versionId,\n });\n if (mode === \"json\") return printJson(result);\n const d = result.data;\n printVersionContext(result, mode);\n writeContext(\n [\n `Token: ${d.name} (${d.symbol})`,\n `Max Supply: ${d.maxSupply?.toLocaleString() ?? \"—\"}`,\n `Total Unlocked: ${d.totalUnlockedAmount.toLocaleString()}`,\n `Total Locked: ${d.totalLockedAmount.toLocaleString()}`,\n `Total TBD Locked: ${d.totalTBDLockedAmount.toLocaleString()}`,\n `Total Untracked: ${d.totalUntrackedAmount.toLocaleString()}`,\n ],\n mode,\n );\n output(d.allocations as unknown as Record<string, unknown>[], allocationColumns, mode);\n});\n\naddSeriesOptions(\n pitCommand\n .command(\"daily-emission <tokenId>\")\n .description(\"Get a token's daily emission (cliff + linear) as published at a version\"),\n).action(async (tokenId: string, opts, cmd) => {\n validateVersionSelector(opts.asOf, opts.versionId);\n validateDateRange(opts.start, opts.end);\n const { client, mode } = clientFor(cmd);\n const result = await getPointInTimeDailyEmission(client, tokenId, {\n asOf: opts.asOf,\n versionId: opts.versionId,\n start: opts.start,\n end: opts.end,\n standardAllocation: opts.standardAllocation,\n page: opts.page,\n pageSize: opts.pageSize,\n });\n if (mode === \"json\") return printJson(result);\n printVersionContext(result, mode);\n const rows = result.data.map((d) => ({\n ...d,\n committedClaimAmount: d.committedClaim?.amount ?? null,\n }));\n output(rows as unknown as Record<string, unknown>[], emissionColumns, mode);\n printPaginationHint(result.metadata);\n});\n\naddSeriesOptions(\n pitCommand\n .command(\"unlock-events <tokenId>\")\n .description(\"Get a token's cliff unlock events as published at a version\"),\n).action(async (tokenId: string, opts, cmd) => {\n validateVersionSelector(opts.asOf, opts.versionId);\n validateDateRange(opts.start, opts.end);\n const { client, mode } = clientFor(cmd);\n const result = await getPointInTimeUnlockEvents(client, tokenId, {\n asOf: opts.asOf,\n versionId: opts.versionId,\n start: opts.start,\n end: opts.end,\n standardAllocation: opts.standardAllocation,\n page: opts.page,\n pageSize: opts.pageSize,\n });\n if (mode === \"json\") return printJson(result);\n printVersionContext(result, mode);\n const rows = result.data.map((e) => ({\n ...e,\n cliffAmount: e.cliffUnlocks.cliffAmount,\n allocationNames: e.cliffUnlocks.allocationBreakdown.map((a) => a.allocationName),\n }));\n output(rows as unknown as Record<string, unknown>[], unlockColumns, mode);\n printPaginationHint(result.metadata);\n});\n","import type { TokenomistClient } from \"./client.js\";\nimport type { ApiResult } from \"../types/response.js\";\nimport type {\n PointInTimeVersion,\n PointInTimeAllocation,\n PointInTimeEmissionDay,\n PointInTimeUnlockEvent,\n} from \"../types/point-in-time.js\";\n\n/** Picks the version a data route answers from: one or the other, or neither for the current one. */\nexport interface VersionSelector {\n asOf?: string;\n versionId?: string;\n}\n\nexport interface PointInTimeVersionsParams {\n start?: string;\n end?: string;\n page?: string;\n pageSize?: string;\n}\n\nexport interface PointInTimeSeriesParams extends VersionSelector {\n start?: string;\n end?: string;\n standardAllocation?: string;\n page?: string;\n pageSize?: string;\n}\n\nconst BASE = \"/v5/point-in-time\";\n\nexport async function getTokenVersions(\n client: TokenomistClient,\n tokenId: string,\n params?: PointInTimeVersionsParams,\n): Promise<ApiResult<PointInTimeVersion[]>> {\n return client.getWithMeta<PointInTimeVersion[]>(\n `${BASE}/token-versions/${encodeURIComponent(tokenId)}`,\n { ...params },\n );\n}\n\nexport async function getPointInTimeAllocation(\n client: TokenomistClient,\n tokenId: string,\n params?: VersionSelector,\n): Promise<ApiResult<PointInTimeAllocation>> {\n return client.getWithMeta<PointInTimeAllocation>(\n `${BASE}/allocations/${encodeURIComponent(tokenId)}`,\n { ...params },\n );\n}\n\nexport async function getPointInTimeDailyEmission(\n client: TokenomistClient,\n tokenId: string,\n params?: PointInTimeSeriesParams,\n): Promise<ApiResult<PointInTimeEmissionDay[]>> {\n return client.getWithMeta<PointInTimeEmissionDay[]>(\n `${BASE}/daily-emission/${encodeURIComponent(tokenId)}`,\n { ...params },\n );\n}\n\nexport async function getPointInTimeUnlockEvents(\n client: TokenomistClient,\n tokenId: string,\n params?: PointInTimeSeriesParams,\n): Promise<ApiResult<PointInTimeUnlockEvent[]>> {\n return client.getWithMeta<PointInTimeUnlockEvent[]>(\n `${BASE}/unlock/events/${encodeURIComponent(tokenId)}`,\n { ...params },\n );\n}\n","const BANNER_COLOR_OPEN = \"\\x1b[38;2;197;16;82m\";\nconst COLOR_RESET = \"\\x1b[0m\";\n\nexport const BANNER = `████████╗ ██████╗ ██╗ ██╗███████╗███╗ ██╗ ██████╗ ███╗ ███╗██╗███████╗████████╗\n╚══██╔══╝██╔═══██╗██║ ██╔╝██╔════╝████╗ ██║██╔═══██╗████╗ ████║██║██╔════╝╚══██╔══╝\n ██║ ██║ ██║█████╔╝ █████╗ ██╔██╗ ██║██║ ██║██╔████╔██║██║███████╗ ██║\n ██║ ██║ ██║██╔═██╗ ██╔══╝ ██║╚██╗██║██║ ██║██║╚██╔╝██║██║╚════██║ ██║\n ██║ ╚██████╔╝██║ ██╗███████╗██║ ╚████║╚██████╔╝██║ ╚═╝ ██║██║███████║ ██║\n ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝╚═╝╚══════╝ ╚═╝ `;\n\nconst WELCOME_LINES = [\n \"Welcome to tokenomist-cli v0.1.0\",\n \"Query token unlocks, emissions, fundraising, burns, and buybacks from the terminal.\",\n \"\",\n \" Getting started:\",\n \"\",\n \" $ tok auth login # store your API key\",\n \" $ tok token list # list all tracked tokens\",\n \" $ tok token search bitcoin # query tokens by name / symbol\",\n \" $ npx skills add tokenomist-ai/tokenomist-cli # install AI coding skills\",\n \" $ tok --help # for view more commands\",\n \"\",\n \"Docs: https://docs.tokenomist.ai/\",\n \"Site: https://tokenomist.ai\",\n \"Issues: https://github.com/tokenomist-ai/tokenomist-cli/issues\",\n];\n\nfunction shouldUseColor(stream: NodeJS.WriteStream): boolean {\n if (process.env.NO_COLOR !== undefined && process.env.NO_COLOR !== \"\") return false;\n if (process.env.FORCE_COLOR === \"0\") return false;\n return Boolean(stream.isTTY);\n}\n\nfunction frame(lines: string[], colored: boolean): string {\n const innerWidth = Math.max(...lines.map((l) => l.length));\n const horizontal = \"─\".repeat(innerWidth + 2);\n const open = colored ? BANNER_COLOR_OPEN : \"\";\n const close = colored ? COLOR_RESET : \"\";\n const top = `${open}╭${horizontal}╮${close}`;\n const bottom = `${open}╰${horizontal}╯${close}`;\n const side = `${open}│${close}`;\n const middle = lines.map((l) => `${side} ${l.padEnd(innerWidth)} ${side}`);\n return [top, ...middle, bottom].join(\"\\n\");\n}\n\nexport function printWelcome(stream: NodeJS.WriteStream): void {\n const colored = shouldUseColor(stream);\n const banner = colored ? `${BANNER_COLOR_OPEN}${BANNER}${COLOR_RESET}` : BANNER;\n stream.write(`${banner}\\n\\n`);\n stream.write(`${frame(WELCOME_LINES, colored)}\\n\\n`);\n}\n","/** True when `latest` is a higher x.y.z than `current` (pre-release tags are ignored). */\nexport function isNewerVersion(latest: string, current: string): boolean {\n const parse = (v: string) =>\n v\n .replace(/^v/, \"\")\n .split(\"-\")[0]\n .split(\".\")\n .map((n) => Number.parseInt(n, 10) || 0);\n const a = parse(latest);\n const b = parse(current);\n for (let i = 0; i < 3; i++) {\n if ((a[i] ?? 0) !== (b[i] ?? 0)) return (a[i] ?? 0) > (b[i] ?? 0);\n }\n return false;\n}\n\n/**\n * The update notice for a cached registry check, or null. Compares against\n * the running version, not the one cached at check time, so an upgrade\n * since the last check (or a build newer than npm) shows no notice.\n */\nexport function updateNotice(\n cache: { latest?: unknown; checkedAt?: unknown },\n running: string,\n now: number,\n maxAgeMs: number,\n): string | null {\n if (typeof cache.latest !== \"string\" || typeof cache.checkedAt !== \"number\") return null;\n if (now - cache.checkedAt >= maxAgeMs) return null;\n if (!isNewerVersion(cache.latest, running)) return null;\n return `\\nUpdate available: ${running} → ${cache.latest} (npm i -g @tokenomist-ai/tokenomist-cli)\\n\\n`;\n}\n"],"mappings":"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","names":["Command","body","columns","columns","columns","readFileSync","writeFileSync","mkdirSync","unlinkSync","join","homedir","Command","Command","Command","listColumns","Command","Command","columns","Command","Command","listColumns","detailColumns","Command","Command","listColumns","detailColumns","Command","Command","columns","Command","Command","columns","Command","Command","Command","Command","Command","Command","Command","readFileSync","join","homedir","readFileSync","join","homedir","Command"]}
|