@nuno1026/bithumb-cli 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../core/src/utils/signature.ts","../../core/src/utils/errors.ts","../../core/src/utils/rate-limiter.ts","../../core/src/client/rest-client.ts","../../core/src/tools/helpers.ts","../../core/src/tools/common.ts","../../core/src/tools/market.ts","../../core/src/tools/account.ts","../../core/src/tools/trade.ts","../../core/src/tools/audit.ts","../../core/src/tools/diagnose.ts","../../core/src/constants.ts","../../core/src/tools/twap.ts","../../core/src/tools/withdraw.ts","../../core/src/tools/deposit.ts","../../core/src/tools/index.ts","../../core/src/tools/types.ts","../../core/src/config/toml.ts","../../core/src/config.ts","../../core/src/utils/logger.ts","../../core/src/utils/update-check.ts","../../core/src/setup.ts","../../../node_modules/.pnpm/smol-toml@1.6.1/node_modules/smol-toml/dist/error.js","../../../node_modules/.pnpm/smol-toml@1.6.1/node_modules/smol-toml/dist/util.js","../../../node_modules/.pnpm/smol-toml@1.6.1/node_modules/smol-toml/dist/date.js","../../../node_modules/.pnpm/smol-toml@1.6.1/node_modules/smol-toml/dist/primitive.js","../../../node_modules/.pnpm/smol-toml@1.6.1/node_modules/smol-toml/dist/extract.js","../../../node_modules/.pnpm/smol-toml@1.6.1/node_modules/smol-toml/dist/struct.js","../../../node_modules/.pnpm/smol-toml@1.6.1/node_modules/smol-toml/dist/parse.js","../../../node_modules/.pnpm/smol-toml@1.6.1/node_modules/smol-toml/dist/stringify.js"],"sourcesContent":["// ─── Bithumb JWT HS256 Authentication ──────────────────────────────\n\nimport { createHash, createHmac, randomUUID } from \"node:crypto\";\n\nfunction base64url(input: string | Buffer): string {\n const buf = typeof input === \"string\" ? Buffer.from(input) : input;\n return buf.toString(\"base64url\");\n}\n\n/**\n * SHA-512 hash of query string for JWT payload.\n */\nexport function hashQuery(queryString: string): string {\n return createHash(\"sha512\").update(queryString, \"utf8\").digest(\"hex\");\n}\n\nexport interface JwtPayload {\n access_key: string;\n nonce: string;\n timestamp: number;\n query_hash?: string;\n query_hash_alg?: string;\n}\n\n/**\n * Create a JWT token with HS256 signing (manual implementation, no deps).\n */\nexport function createJwt(payload: JwtPayload, secretKey: string): string {\n const header = { alg: \"HS256\", typ: \"JWT\" };\n const headerB64 = base64url(JSON.stringify(header));\n const payloadB64 = base64url(JSON.stringify(payload));\n const signature = createHmac(\"sha256\", secretKey)\n .update(`${headerB64}.${payloadB64}`)\n .digest(\"base64url\");\n return `${headerB64}.${payloadB64}.${signature}`;\n}\n\n/**\n * Build a signed JWT Bearer token for Bithumb API v2.1.5.\n *\n * @param accessKey - BITHUMB_ACCESS_KEY\n * @param secretKey - BITHUMB_SECRET_KEY\n * @param queryString - Optional query/body string to hash (key=value&key=value)\n */\nexport function signRequest(\n accessKey: string,\n secretKey: string,\n queryString?: string,\n): string {\n const payload: JwtPayload = {\n access_key: accessKey,\n nonce: randomUUID(),\n timestamp: Date.now(),\n };\n\n if (queryString && queryString.length > 0) {\n payload.query_hash = hashQuery(queryString);\n payload.query_hash_alg = \"SHA512\";\n }\n\n return createJwt(payload, secretKey);\n}\n","// ─── Bithumb MCP Error Hierarchy ───────────────────────────────────\n\nexport type ErrorType =\n | \"ConfigError\"\n | \"AuthenticationError\"\n | \"RateLimitError\"\n | \"ValidationError\"\n | \"BithumbApiError\"\n | \"NetworkError\"\n | \"InternalError\";\n\nexport interface ToolErrorPayload {\n error: true;\n type: ErrorType;\n code?: string;\n message: string;\n suggestion?: string;\n endpoint?: string;\n timestamp: string;\n}\n\nexport class BithumbMcpError extends Error {\n public readonly type: ErrorType;\n public readonly code?: string;\n public readonly suggestion?: string;\n public readonly endpoint?: string;\n\n constructor(\n type: ErrorType,\n message: string,\n options?: {\n code?: string;\n suggestion?: string;\n endpoint?: string;\n cause?: unknown;\n },\n ) {\n super(message, options?.cause ? { cause: options.cause } : undefined);\n this.name = type;\n this.type = type;\n this.code = options?.code;\n this.suggestion = options?.suggestion;\n this.endpoint = options?.endpoint;\n }\n}\n\nexport class ConfigError extends BithumbMcpError {\n constructor(message: string, suggestion?: string) {\n super(\"ConfigError\", message, { suggestion });\n }\n}\n\nexport class ValidationError extends BithumbMcpError {\n constructor(message: string, suggestion?: string) {\n super(\"ValidationError\", message, { suggestion });\n }\n}\n\nexport class RateLimitError extends BithumbMcpError {\n constructor(message: string, suggestion?: string, endpoint?: string) {\n super(\"RateLimitError\", message, { suggestion, endpoint });\n }\n}\n\nexport class AuthenticationError extends BithumbMcpError {\n constructor(message: string, suggestion?: string, endpoint?: string) {\n super(\"AuthenticationError\", message, { suggestion, endpoint });\n }\n}\n\nexport class BithumbApiError extends BithumbMcpError {\n constructor(\n message: string,\n options?: { code?: string; endpoint?: string; cause?: unknown },\n ) {\n super(\"BithumbApiError\", message, options);\n }\n}\n\nexport class NetworkError extends BithumbMcpError {\n constructor(message: string, endpoint?: string, cause?: unknown) {\n super(\"NetworkError\", message, {\n endpoint,\n cause,\n suggestion: \"Check network connectivity and try again.\",\n });\n }\n}\n\nexport class InternalError extends BithumbMcpError {\n constructor(message: string, cause?: unknown) {\n super(\"InternalError\", message, { cause });\n }\n}\n\n// ─── Error → MCP payload ───────────────────────────────────────────\n\nexport function toToolErrorPayload(error: unknown): ToolErrorPayload {\n if (error instanceof BithumbMcpError) {\n return {\n error: true,\n type: error.type,\n code: error.code,\n message: error.message,\n suggestion: error.suggestion,\n endpoint: error.endpoint,\n timestamp: new Date().toISOString(),\n };\n }\n\n const message =\n error instanceof Error ? error.message : \"An unexpected error occurred.\";\n return {\n error: true,\n type: \"InternalError\",\n message,\n timestamp: new Date().toISOString(),\n };\n}\n","// ─── Token-Bucket Rate Limiter ─────────────────────────────────────\n\nimport { RateLimitError } from \"./errors.js\";\n\nexport interface RateLimitConfig {\n /** Unique key for this bucket (e.g. \"public:markets\") */\n key: string;\n /** Maximum burst capacity */\n capacity: number;\n /** Tokens restored per second */\n refillPerSecond: number;\n}\n\ninterface Bucket {\n tokens: number;\n capacity: number;\n refillPerSecond: number;\n lastRefill: number;\n}\n\nexport class RateLimiter {\n private readonly buckets = new Map<string, Bucket>();\n private readonly cleanupMs: number;\n private readonly verbose: boolean;\n private lastCleanup: number;\n\n constructor(cleanupMs = 30_000, verbose = false) {\n this.cleanupMs = cleanupMs;\n this.verbose = verbose;\n this.lastCleanup = Date.now();\n }\n\n async consume(config: RateLimitConfig, amount = 1): Promise<void> {\n this.maybeCleanup();\n const bucket = this.getBucket(config);\n this.refill(bucket);\n\n if (bucket.tokens >= amount) {\n bucket.tokens -= amount;\n return;\n }\n\n // Wait for tokens to refill\n const deficit = amount - bucket.tokens;\n const waitMs = Math.ceil((deficit / bucket.refillPerSecond) * 1_000);\n\n if (waitMs > 10_000) {\n throw new RateLimitError(\n `Rate limit exceeded for \"${config.key}\". Need ${deficit.toFixed(1)} tokens, wait ~${waitMs}ms.`,\n \"Reduce request frequency or wait.\",\n );\n }\n\n if (this.verbose) {\n process.stderr.write(\n `[rate-limiter] ${config.key}: waiting ${waitMs}ms for ${deficit.toFixed(1)} tokens\\n`,\n );\n }\n\n await new Promise((resolve) => setTimeout(resolve, waitMs));\n this.refill(bucket);\n\n if (bucket.tokens >= amount) {\n bucket.tokens -= amount;\n return;\n }\n\n throw new RateLimitError(\n `Rate limit exceeded for \"${config.key}\" after waiting.`,\n \"Reduce request frequency.\",\n );\n }\n\n private getBucket(config: RateLimitConfig): Bucket {\n let bucket = this.buckets.get(config.key);\n if (!bucket) {\n bucket = {\n tokens: config.capacity,\n capacity: config.capacity,\n refillPerSecond: config.refillPerSecond,\n lastRefill: Date.now(),\n };\n this.buckets.set(config.key, bucket);\n }\n return bucket;\n }\n\n private refill(bucket: Bucket): void {\n const now = Date.now();\n const elapsed = (now - bucket.lastRefill) / 1_000;\n if (elapsed <= 0) return;\n bucket.tokens = Math.min(\n bucket.capacity,\n bucket.tokens + elapsed * bucket.refillPerSecond,\n );\n bucket.lastRefill = now;\n }\n\n private maybeCleanup(): void {\n const now = Date.now();\n if (now - this.lastCleanup < this.cleanupMs) return;\n this.lastCleanup = now;\n\n for (const [key, bucket] of this.buckets) {\n const idle = (now - bucket.lastRefill) / 1_000;\n if (idle > 60 && bucket.tokens >= bucket.capacity) {\n this.buckets.delete(key);\n }\n }\n }\n}\n","// ─── Bithumb REST Client ───────────────────────────────────────────\n\nimport { signRequest } from \"../utils/signature.js\";\nimport {\n AuthenticationError,\n BithumbApiError,\n ConfigError,\n NetworkError,\n RateLimitError,\n} from \"../utils/errors.js\";\nimport { RateLimiter } from \"../utils/rate-limiter.js\";\nimport type { BithumbConfig } from \"../config.js\";\nimport type {\n BithumbErrorResponse,\n QueryParams,\n RequestConfig,\n RequestResult,\n} from \"./types.js\";\n\n// ─── Helpers ───────────────────────────────────────────────────────\n\nfunction isDefined(value: unknown): boolean {\n return value !== undefined && value !== null;\n}\n\n/** Build URL-encoded query string for GET params. */\nexport function buildQueryString(query?: QueryParams): string {\n if (!query) return \"\";\n const entries = Object.entries(query).filter(([, v]) => isDefined(v));\n if (entries.length === 0) return \"\";\n\n const parts: string[] = [];\n for (const [key, value] of entries) {\n if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n if (item && typeof item === \"object\" && !Array.isArray(item)) {\n for (const [subKey, subVal] of Object.entries(item as Record<string, unknown>)) {\n parts.push(\n `${encodeURIComponent(key)}[${i}][${encodeURIComponent(subKey)}]=${encodeURIComponent(String(subVal))}`,\n );\n }\n } else {\n parts.push(\n `${encodeURIComponent(key)}[]=${encodeURIComponent(String(item))}`,\n );\n }\n }\n } else {\n parts.push(\n `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`,\n );\n }\n }\n return parts.join(\"&\");\n}\n\n/** Build unencoded query string for JWT hash computation. */\nexport function buildHashString(\n query?: QueryParams,\n body?: Record<string, unknown>,\n): string {\n const source = body ?? query;\n if (!source) return \"\";\n const entries = Object.entries(source).filter(([, v]) => isDefined(v));\n if (entries.length === 0) return \"\";\n\n const parts: string[] = [];\n for (const [key, value] of entries) {\n if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n if (item && typeof item === \"object\" && !Array.isArray(item)) {\n for (const [subKey, subVal] of Object.entries(item as Record<string, unknown>)) {\n parts.push(`${key}[${i}][${subKey}]=${String(subVal)}`);\n }\n } else {\n parts.push(`${key}[]=${String(item)}`);\n }\n }\n } else {\n parts.push(`${key}=${String(value)}`);\n }\n }\n return parts.join(\"&\");\n}\n\nfunction vlog(message: string): void {\n process.stderr.write(`[verbose] ${message}\\n`);\n}\n\n// ─── Client ────────────────────────────────────────────────────────\n\nexport class BithumbRestClient {\n private readonly config: BithumbConfig;\n private readonly rateLimiter: RateLimiter;\n\n constructor(config: BithumbConfig) {\n this.config = config;\n this.rateLimiter = new RateLimiter(30_000, config.verbose);\n }\n\n async publicGet<TData = unknown>(\n path: string,\n query?: QueryParams,\n rateLimit?: RequestConfig[\"rateLimit\"],\n ): Promise<RequestResult<TData>> {\n return this.request<TData>({\n method: \"GET\",\n path,\n auth: \"public\",\n query,\n rateLimit,\n });\n }\n\n async privateGet<TData = unknown>(\n path: string,\n query?: QueryParams,\n rateLimit?: RequestConfig[\"rateLimit\"],\n ): Promise<RequestResult<TData>> {\n return this.request<TData>({\n method: \"GET\",\n path,\n auth: \"private\",\n query,\n rateLimit,\n });\n }\n\n async privatePost<TData = unknown>(\n path: string,\n body?: RequestConfig[\"body\"],\n rateLimit?: RequestConfig[\"rateLimit\"],\n ): Promise<RequestResult<TData>> {\n return this.request<TData>({\n method: \"POST\",\n path,\n auth: \"private\",\n body,\n rateLimit,\n });\n }\n\n async privateDelete<TData = unknown>(\n path: string,\n query?: QueryParams,\n rateLimit?: RequestConfig[\"rateLimit\"],\n ): Promise<RequestResult<TData>> {\n return this.request<TData>({\n method: \"DELETE\",\n path,\n auth: \"private\",\n query,\n rateLimit,\n });\n }\n\n // ─── Core request ────────────────────────────────────────────────\n\n private async request<TData = unknown>(\n reqConfig: RequestConfig,\n ): Promise<RequestResult<TData>> {\n const queryString = buildQueryString(reqConfig.query);\n const requestPath =\n queryString.length > 0\n ? `${reqConfig.path}?${queryString}`\n : reqConfig.path;\n const url = `${this.config.baseUrl}${requestPath}`;\n\n if (this.config.verbose) vlog(`→ ${reqConfig.method} ${url}`);\n\n // Rate limiting\n if (reqConfig.rateLimit) await this.rateLimiter.consume(reqConfig.rateLimit);\n\n // Headers\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n };\n\n // Auth: JWT Bearer token\n if (reqConfig.auth === \"private\") {\n if (\n !this.config.hasAuth ||\n !this.config.accessKey ||\n !this.config.secretKey\n ) {\n throw new ConfigError(\n \"Private endpoint requires API credentials.\",\n \"Set BITHUMB_ACCESS_KEY and BITHUMB_SECRET_KEY.\",\n );\n }\n const hashStr = buildHashString(reqConfig.query, reqConfig.body);\n const token = signRequest(\n this.config.accessKey,\n this.config.secretKey,\n hashStr,\n );\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n\n // Fetch\n const t0 = Date.now();\n let response: Response;\n try {\n const fetchOptions: RequestInit = {\n method: reqConfig.method,\n headers,\n signal: AbortSignal.timeout(this.config.timeoutMs),\n };\n if (reqConfig.body && reqConfig.method === \"POST\") {\n fetchOptions.body = JSON.stringify(reqConfig.body);\n }\n response = await fetch(url, fetchOptions);\n } catch (error) {\n if (this.config.verbose) {\n vlog(`✗ NetworkError after ${Date.now() - t0}ms`);\n }\n throw new NetworkError(\n `Failed to call ${reqConfig.method} ${reqConfig.path}.`,\n `${reqConfig.method} ${reqConfig.path}`,\n error,\n );\n }\n\n // Parse response\n const rawText = await response.text();\n const elapsed = Date.now() - t0;\n if (this.config.verbose) {\n vlog(`← ${response.status} | ${rawText.length}B | ${elapsed}ms`);\n }\n\n let parsed: unknown;\n try {\n parsed = rawText ? JSON.parse(rawText) : null;\n } catch {\n throw new NetworkError(\n `Non-JSON response from ${reqConfig.method} ${reqConfig.path}.`,\n `${reqConfig.method} ${reqConfig.path}`,\n );\n }\n\n // Error handling: Bithumb returns { error: { name, message } }\n if (parsed && typeof parsed === \"object\" && \"error\" in parsed) {\n const errResp = parsed as BithumbErrorResponse;\n const errName = errResp.error?.name ?? \"unknown\";\n const errMsg = errResp.error?.message ?? \"Unknown error\";\n const endpoint = `${reqConfig.method} ${reqConfig.path}`;\n\n if (response.status === 401 || errName === \"unauthorized\") {\n throw new AuthenticationError(\n errMsg,\n \"Check BITHUMB_ACCESS_KEY and BITHUMB_SECRET_KEY.\",\n endpoint,\n );\n }\n if (response.status === 429) {\n throw new RateLimitError(\n errMsg,\n \"Reduce request frequency.\",\n endpoint,\n );\n }\n throw new BithumbApiError(errMsg, { code: errName, endpoint });\n }\n\n if (!response.ok) {\n throw new BithumbApiError(`HTTP ${response.status}`, {\n code: String(response.status),\n endpoint: `${reqConfig.method} ${reqConfig.path}`,\n });\n }\n\n return {\n endpoint: `${reqConfig.method} ${reqConfig.path}`,\n requestTime: new Date().toISOString(),\n data: parsed as TData,\n };\n }\n}\n","// ─── Tool Argument Helpers ─────────────────────────────────────────\n\nimport { ValidationError } from \"../utils/errors.js\";\n\nexport type ArgsRecord = Record<string, unknown>;\n\n/** Safely cast args to Record. */\nexport function asRecord(args: unknown): ArgsRecord {\n if (args && typeof args === \"object\" && !Array.isArray(args)) {\n return args as ArgsRecord;\n }\n return {};\n}\n\n// ─── Read helpers (return undefined if missing) ────────────────────\n\nexport function readString(\n args: ArgsRecord,\n key: string,\n): string | undefined {\n const v = args[key];\n if (v === undefined || v === null || v === \"\") return undefined;\n return String(v);\n}\n\nexport function readNumber(\n args: ArgsRecord,\n key: string,\n): number | undefined {\n const v = args[key];\n if (v === undefined || v === null || v === \"\") return undefined;\n const n = Number(v);\n if (!Number.isFinite(n)) return undefined;\n return n;\n}\n\nexport function readBoolean(\n args: ArgsRecord,\n key: string,\n): boolean | undefined {\n const v = args[key];\n if (v === undefined || v === null) return undefined;\n if (typeof v === \"boolean\") return v;\n if (v === \"true\" || v === \"1\") return true;\n if (v === \"false\" || v === \"0\") return false;\n return undefined;\n}\n\nexport function readStringArray(\n args: ArgsRecord,\n key: string,\n): string[] | undefined {\n const v = args[key];\n if (v === undefined || v === null) return undefined;\n if (Array.isArray(v)) return v.map(String);\n if (typeof v === \"string\") {\n return v\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n }\n return undefined;\n}\n\n// ─── Require helpers (throw on missing) ────────────────────────────\n\nexport function requireString(\n args: ArgsRecord,\n key: string,\n): string {\n const v = readString(args, key);\n if (!v) {\n throw new ValidationError(\n `Missing required parameter \"${key}\".`,\n `Provide a non-empty \"${key}\" string.`,\n );\n }\n return v;\n}\n\nexport function assertEnum<T extends string>(\n value: string,\n allowed: readonly T[],\n paramName: string,\n): T {\n if (!allowed.includes(value as T)) {\n throw new ValidationError(\n `Invalid value \"${value}\" for \"${paramName}\".`,\n `Allowed: ${allowed.join(\", \")}.`,\n );\n }\n return value as T;\n}\n\n// ─── Misc utilities ────────────────────────────────────────────────\n\n/** Remove undefined/null entries from an object. */\nexport function compactObject<T extends Record<string, unknown>>(\n obj: T,\n): Partial<T> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value !== undefined && value !== null) {\n result[key] = value;\n }\n }\n return result as Partial<T>;\n}\n\n/** Normalize tool response into a consistent shape. */\nexport function normalizeResponse(data: unknown): unknown {\n if (data === null || data === undefined) return {};\n return data;\n}\n","// ─── Common Rate Limit Presets ─────────────────────────────────────\n\nimport type { RateLimitConfig } from \"../utils/rate-limiter.js\";\n\n/** Public endpoint: 150 requests/sec default. */\nexport function publicRateLimit(key: string, rps = 150): RateLimitConfig {\n return { key: `public:${key}`, capacity: rps, refillPerSecond: rps };\n}\n\n/** Private endpoint: 140 requests/sec default. */\nexport function privateRateLimit(key: string, rps = 140): RateLimitConfig {\n return { key: `private:${key}`, capacity: rps, refillPerSecond: rps };\n}\n\n/** Order endpoint: 10 requests/sec default. */\nexport function orderRateLimit(key: string, rps = 10): RateLimitConfig {\n return { key: `order:${key}`, capacity: rps, refillPerSecond: rps };\n}\n","// ─── Market Tools (Public) ─────────────────────────────────────────\n\nimport type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n compactObject,\n normalizeResponse,\n readBoolean,\n readNumber,\n readString,\n requireString,\n} from \"./helpers.js\";\nimport { publicRateLimit } from \"./common.js\";\n\nexport function registerMarketTools(): ToolSpec[] {\n return [\n // ── 1. market_get_markets ──────────────────────────────────────\n {\n name: \"market_get_markets\",\n module: \"market\",\n description:\n \"빗썸 거래 가능한 마켓(거래 페어) 목록을 조회합니다. Get all available trading pairs on Bithumb.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n isDetails: {\n type: \"boolean\",\n description: \"Include detailed market info\",\n },\n },\n required: [],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/v1/market/all\",\n compactObject({ isDetails: readBoolean(args, \"isDetails\") }),\n publicRateLimit(\"market_get_markets\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 2. market_get_ticker ───────────────────────────────────────\n {\n name: \"market_get_ticker\",\n module: \"market\",\n description:\n \"현재가(Ticker) 정보를 조회합니다. Get current price ticker for specified markets.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n markets: {\n type: \"string\",\n description:\n \"Comma-separated market codes, e.g. KRW-BTC,KRW-ETH\",\n },\n },\n required: [\"markets\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/v1/ticker\",\n compactObject({ markets: requireString(args, \"markets\") }),\n publicRateLimit(\"market_get_ticker\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 3. market_get_orderbook ────────────────────────────────────\n {\n name: \"market_get_orderbook\",\n module: \"market\",\n description:\n \"호가(Orderbook) 정보를 조회합니다. Get orderbook (bids/asks) for specified markets.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n markets: {\n type: \"string\",\n description:\n \"Comma-separated market codes, e.g. KRW-BTC,KRW-ETH\",\n },\n },\n required: [\"markets\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/v1/orderbook\",\n compactObject({ markets: requireString(args, \"markets\") }),\n publicRateLimit(\"market_get_orderbook\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 4. market_get_trades ───────────────────────────────────────\n {\n name: \"market_get_trades\",\n module: \"market\",\n description:\n \"최근 체결 내역을 조회합니다. Get recent trades for a market.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n market: {\n type: \"string\",\n description: \"Market code, e.g. KRW-BTC\",\n },\n to: {\n type: \"string\",\n description: \"Return trades before this timestamp (exclusive)\",\n },\n count: {\n type: \"number\",\n description: \"Number of trades to return (1-500)\",\n },\n cursor: {\n type: \"string\",\n description: \"Pagination cursor from previous response\",\n },\n daysAgo: {\n type: \"number\",\n description: \"Filter trades from N days ago (1-7)\",\n },\n },\n required: [\"market\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/v1/trades/ticks\",\n compactObject({\n market: requireString(args, \"market\"),\n to: readString(args, \"to\"),\n count: readNumber(args, \"count\"),\n cursor: readString(args, \"cursor\"),\n daysAgo: readNumber(args, \"daysAgo\"),\n }),\n publicRateLimit(\"market_get_trades\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 5. market_get_candles_minutes ──────────────────────────────\n {\n name: \"market_get_candles_minutes\",\n module: \"market\",\n description:\n \"분(minute) 캔들을 조회합니다. Get minute candles (OHLCV).\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n unit: {\n type: \"number\",\n enum: [1, 3, 5, 10, 15, 30, 60, 240],\n description: \"Candle unit in minutes\",\n },\n market: {\n type: \"string\",\n description: \"Market code, e.g. KRW-BTC\",\n },\n to: {\n type: \"string\",\n description: \"Return candles before this timestamp\",\n },\n count: {\n type: \"number\",\n description: \"Number of candles to return (max 200)\",\n },\n },\n required: [\"unit\", \"market\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const unit = readNumber(args, \"unit\");\n if (!unit) throw new Error('Missing required parameter \"unit\".');\n const response = await context.client.publicGet(\n `/v1/candles/minutes/${unit}`,\n compactObject({\n market: requireString(args, \"market\"),\n to: readString(args, \"to\"),\n count: readNumber(args, \"count\"),\n }),\n publicRateLimit(\"market_get_candles_minutes\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 6. market_get_candles_days ─────────────────────────────────\n {\n name: \"market_get_candles_days\",\n module: \"market\",\n description:\n \"일(day) 캔들을 조회합니다. Get daily candles.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n market: {\n type: \"string\",\n description: \"Market code, e.g. KRW-BTC\",\n },\n to: {\n type: \"string\",\n description: \"Return candles before this timestamp\",\n },\n count: {\n type: \"number\",\n description: \"Number of candles to return (max 200)\",\n },\n convertingPriceUnit: {\n type: \"string\",\n description: \"Price unit for conversion\",\n },\n },\n required: [\"market\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/v1/candles/days\",\n compactObject({\n market: requireString(args, \"market\"),\n to: readString(args, \"to\"),\n count: readNumber(args, \"count\"),\n convertingPriceUnit: readString(args, \"convertingPriceUnit\"),\n }),\n publicRateLimit(\"market_get_candles_days\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 7. market_get_candles_weeks ────────────────────────────────\n {\n name: \"market_get_candles_weeks\",\n module: \"market\",\n description:\n \"주(week) 캔들을 조회합니다. Get weekly candles.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n market: {\n type: \"string\",\n description: \"Market code, e.g. KRW-BTC\",\n },\n to: {\n type: \"string\",\n description: \"Return candles before this timestamp\",\n },\n count: {\n type: \"number\",\n description: \"Number of candles to return (max 200)\",\n },\n },\n required: [\"market\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/v1/candles/weeks\",\n compactObject({\n market: requireString(args, \"market\"),\n to: readString(args, \"to\"),\n count: readNumber(args, \"count\"),\n }),\n publicRateLimit(\"market_get_candles_weeks\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 8. market_get_candles_months ───────────────────────────────\n {\n name: \"market_get_candles_months\",\n module: \"market\",\n description:\n \"월(month) 캔들을 조회합니다. Get monthly candles.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n market: {\n type: \"string\",\n description: \"Market code, e.g. KRW-BTC\",\n },\n to: {\n type: \"string\",\n description: \"Return candles before this timestamp\",\n },\n count: {\n type: \"number\",\n description: \"Number of candles to return (max 200)\",\n },\n },\n required: [\"market\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.publicGet(\n \"/v1/candles/months\",\n compactObject({\n market: requireString(args, \"market\"),\n to: readString(args, \"to\"),\n count: readNumber(args, \"count\"),\n }),\n publicRateLimit(\"market_get_candles_months\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 9. market_get_warnings ─────────────────────────────────────\n {\n name: \"market_get_warnings\",\n module: \"market\",\n description:\n \"투자경보 마켓 목록을 조회합니다. Get virtual asset warning market list.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {},\n required: [],\n },\n handler: async (_rawArgs, context) => {\n const response = await context.client.publicGet(\n \"/v1/market/virtual_asset_warning\",\n {},\n publicRateLimit(\"market_get_warnings\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 10. market_get_notices ─────────────────────────────────────\n {\n name: \"market_get_notices\",\n module: \"market\",\n description:\n \"공지사항 목록을 조회합니다. Get notice list.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n count: {\n type: \"number\",\n description: \"Number of notices to return (min 1, max 20, default 5)\",\n },\n },\n required: [],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const count = readNumber(args, \"count\");\n const response = await context.client.publicGet(\n \"/v1/notices\",\n compactObject({ count }),\n publicRateLimit(\"market_get_notices\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 11. market_get_fee_inout ───────────────────────────────────\n {\n name: \"market_get_fee_inout\",\n module: \"market\",\n description:\n \"입출금 수수료를 조회합니다. Get deposit/withdrawal fee info for a currency.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n currency: {\n type: \"string\",\n description:\n 'Currency symbol (use \"ALL\" to retrieve all currencies), e.g. BTC, ETH',\n },\n },\n required: [\"currency\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const currency = requireString(args, \"currency\");\n const response = await context.client.publicGet(\n `/v2/fee/inout/${currency}`,\n {},\n publicRateLimit(\"market_get_fee_inout\"),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","// ─── Account Tools (Private) ───────────────────────────────────────\n\nimport type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n compactObject,\n normalizeResponse,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nexport function registerAccountTools(): ToolSpec[] {\n return [\n // ── 1. account_get_balance ─────────────────────────────────────\n {\n name: \"account_get_balance\",\n module: \"account\",\n description:\n \"전체 계좌 잔고를 조회합니다. Get all account balances.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {},\n required: [],\n },\n handler: async (_rawArgs, context) => {\n const response = await context.client.privateGet(\n \"/v1/accounts\",\n undefined,\n privateRateLimit(\"account_get_balance\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 2. account_get_order_chance ────────────────────────────────\n {\n name: \"account_get_order_chance\",\n module: \"account\",\n description:\n \"주문 가능 정보를 조회합니다. Get order chance info (available balance, fees, limits) for a market.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n market: {\n type: \"string\",\n description: \"Market code, e.g. KRW-BTC\",\n },\n },\n required: [\"market\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/v1/orders/chance\",\n compactObject({ market: requireString(args, \"market\") }),\n privateRateLimit(\"account_get_order_chance\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 3. account_get_wallet_status ───────────────────────────────\n {\n name: \"account_get_wallet_status\",\n module: \"account\",\n description:\n \"입출금 현황을 조회합니다. Get wallet status (block status, deposit/withdrawal availability).\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {},\n required: [],\n },\n handler: async (_rawArgs, context) => {\n const response = await context.client.privateGet(\n \"/v1/status/wallet\",\n {},\n privateRateLimit(\"account_get_wallet_status\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 4. account_get_api_keys ────────────────────────────────────\n {\n name: \"account_get_api_keys\",\n module: \"account\",\n description:\n \"API 키 목록을 조회합니다. Get list of API keys and expiration dates.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {},\n required: [],\n },\n handler: async (_rawArgs, context) => {\n const response = await context.client.privateGet(\n \"/v1/api_keys\",\n {},\n privateRateLimit(\"account_get_api_keys\"),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","// ─── Trade Tools (Private) ─────────────────────────────────────────\n\nimport type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n compactObject,\n normalizeResponse,\n readNumber,\n readString,\n readStringArray,\n requireString,\n} from \"./helpers.js\";\nimport { orderRateLimit, privateRateLimit } from \"./common.js\";\nimport { ValidationError } from \"../utils/errors.js\";\n\nexport function registerTradeTools(): ToolSpec[] {\n return [\n // ── 1. trade_get_order ─────────────────────────────────────────\n {\n name: \"trade_get_order\",\n module: \"trade\",\n description:\n \"개별 주문을 조회합니다. Get a specific order by uuid or client_order_id.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n uuid: {\n type: \"string\",\n description: \"Order UUID\",\n },\n client_order_id: {\n type: \"string\",\n description: \"Client-assigned order ID\",\n },\n },\n required: [],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/v1/order\",\n compactObject({\n uuid: readString(args, \"uuid\"),\n client_order_id: readString(args, \"client_order_id\"),\n }),\n privateRateLimit(\"trade_get_order\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 2. trade_get_orders ────────────────────────────────────────\n {\n name: \"trade_get_orders\",\n module: \"trade\",\n description:\n \"주문 리스트를 조회합니다. Get list of orders with filters.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n market: {\n type: \"string\",\n description: \"Market code, e.g. KRW-BTC\",\n },\n state: {\n type: \"string\",\n enum: [\"wait\", \"watch\", \"done\", \"cancel\"],\n description: \"Order state filter\",\n },\n states: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Multiple order state filters\",\n },\n uuids: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Filter by order UUIDs\",\n },\n client_order_ids: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Filter by client order IDs\",\n },\n page: {\n type: \"number\",\n description: \"Page number\",\n },\n limit: {\n type: \"number\",\n description: \"Number of results per page\",\n },\n order_by: {\n type: \"string\",\n description: \"Sort order\",\n },\n },\n required: [],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/v1/orders\",\n compactObject({\n market: readString(args, \"market\"),\n state: readString(args, \"state\"),\n states: readStringArray(args, \"states\"),\n uuids: readStringArray(args, \"uuids\"),\n client_order_ids: readStringArray(args, \"client_order_ids\"),\n page: readNumber(args, \"page\"),\n limit: readNumber(args, \"limit\"),\n order_by: readString(args, \"order_by\"),\n }),\n privateRateLimit(\"trade_get_orders\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 3. trade_place_order ───────────────────────────────────────\n {\n name: \"trade_place_order\",\n module: \"trade\",\n description:\n \"주문을 생성합니다. Place a new spot order on Bithumb. \" +\n \"Use when: user asks to buy/sell a single market at a specific price or quantity. \" +\n \"Do NOT use: for multiple orders at once (use trade_batch_place); for time-weighted execution (use twap_place). \" +\n \"Field: order_type ∈ {limit, price, market}. limit: price+volume required. price(시장가 매수): only price (total KRW). market(시장가 매도): only volume (coin qty). \" +\n \"CLI flag: --order-type (alias: --ord-type, deprecated). Response field `ord_type` is preserved as Bithumb upstream. \" +\n 'Example call: {\"market\":\"KRW-BTC\",\"side\":\"bid\",\"order_type\":\"limit\",\"price\":\"50000000\",\"volume\":\"0.0001\"}',\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n market: {\n type: \"string\",\n description: \"Market code, e.g. KRW-BTC\",\n },\n side: {\n type: \"string\",\n enum: [\"bid\", \"ask\"],\n description: \"Order side: bid (buy) or ask (sell)\",\n },\n order_type: {\n type: \"string\",\n enum: [\"limit\", \"price\", \"market\"],\n description:\n \"Order type: limit, price (market buy), market (market sell). \" +\n \"CLI flag: --order-type (alias: --ord-type, deprecated). \" +\n \"Response field is `ord_type` (upstream Bithumb), preserved as-is.\",\n },\n price: {\n type: \"string\",\n description: \"Order price (required for limit and price orders)\",\n },\n volume: {\n type: \"string\",\n description:\n \"Order volume (required for limit and market orders)\",\n },\n client_order_id: {\n type: \"string\",\n description: \"Client-assigned order ID for idempotency\",\n },\n },\n required: [\"market\", \"side\", \"order_type\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/v2/orders\",\n compactObject({\n market: requireString(args, \"market\"),\n side: requireString(args, \"side\"),\n order_type: requireString(args, \"order_type\"),\n price: readString(args, \"price\"),\n volume: readString(args, \"volume\"),\n client_order_id: readString(args, \"client_order_id\"),\n }),\n orderRateLimit(\"trade_place_order\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 4. trade_cancel_order ──────────────────────────────────────\n {\n name: \"trade_cancel_order\",\n module: \"trade\",\n description:\n \"주문을 취소합니다. Cancel an order by order_id or client_order_id.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n order_id: {\n type: \"string\",\n description: \"Order UUID to cancel\",\n },\n client_order_id: {\n type: \"string\",\n description: \"Client-assigned order ID to cancel\",\n },\n },\n required: [],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateDelete(\n \"/v2/order\",\n compactObject({\n order_id: readString(args, \"order_id\"),\n client_order_id: readString(args, \"client_order_id\"),\n }),\n orderRateLimit(\"trade_cancel_order\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 5. trade_batch_place ───────────────────────────────────────\n {\n name: \"trade_batch_place\",\n module: \"trade\",\n description:\n \"다건 주문을 요청합니다. Place multiple orders in a single batch (max 20). \" +\n \"Use when: user asks for multiple orders at once (e.g., grid orders, simultaneous BTC+ETH limit buys). \" +\n \"Do NOT use: for a single order (use trade_place_order); for time-sliced execution (use twap_place). \" +\n \"Each order item field: `order_type` (canonical). Legacy `ord_type` is auto-normalized to `order_type` by the CLI; MCP callers should always send `order_type`. \" +\n \"Partial-failure semantics: each item may succeed or fail independently. Do NOT auto-retry failed items; surface them to the user. \" +\n 'Example call: {\"batch_orders\":[{\"market\":\"KRW-BTC\",\"side\":\"bid\",\"order_type\":\"limit\",\"price\":\"50000000\",\"volume\":\"0.0001\"},{\"market\":\"KRW-ETH\",\"side\":\"bid\",\"order_type\":\"limit\",\"price\":\"4500000\",\"volume\":\"0.001\"}]}',\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n batch_orders: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n market: { type: \"string\", description: \"Market code, e.g. KRW-BTC\" },\n side: { type: \"string\", enum: [\"bid\", \"ask\"], description: \"Order side\" },\n order_type: { type: \"string\", enum: [\"limit\", \"price\", \"market\"], description: \"Order type\" },\n price: { type: \"string\", description: \"Order price\" },\n volume: { type: \"string\", description: \"Order volume\" },\n client_order_id: { type: \"string\", description: \"Client-assigned order ID\" },\n },\n required: [\"market\", \"side\", \"order_type\"],\n },\n description: \"Array of order objects (max 20)\",\n },\n },\n required: [\"batch_orders\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const batchOrders = args.batch_orders;\n if (!Array.isArray(batchOrders) || batchOrders.length === 0) {\n throw new ValidationError(\n \"Missing required parameter \\\"batch_orders\\\".\",\n \"Provide an array of order objects.\",\n );\n }\n const response = await context.client.privatePost(\n \"/v2/orders/batch\",\n { batch_orders: batchOrders },\n orderRateLimit(\"trade_batch_place\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 6. trade_batch_cancel ──────────────────────────────────────\n {\n name: \"trade_batch_cancel\",\n module: \"trade\",\n description:\n \"다건 주문을 취소합니다. Cancel multiple orders (max 30). Provide order_ids or client_order_ids.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n order_ids: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"List of order UUIDs to cancel (max 30)\",\n },\n client_order_ids: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"List of client-assigned order IDs to cancel (max 30)\",\n },\n },\n required: [],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/v2/orders/cancel\",\n compactObject({\n order_ids: readStringArray(args, \"order_ids\"),\n client_order_ids: readStringArray(args, \"client_order_ids\"),\n }),\n orderRateLimit(\"trade_batch_cancel\"),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","// ─── Audit / Log History Tools ─────────────────────────────────────\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport type { ToolSpec } from \"./types.js\";\nimport { asRecord, readNumber, readString } from \"./helpers.js\";\nimport type { LogEntry } from \"../utils/logger.js\";\n\nconst DEFAULT_LOG_DIR = path.join(os.homedir(), \".bithumb\", \"logs\");\n\n/** Generate file paths for the last N days (default 7). */\nfunction getLogPaths(logDir: string, days = 7): string[] {\n const paths: string[] = [];\n const now = new Date();\n for (let i = 0; i < days; i++) {\n const d = new Date(now);\n d.setDate(d.getDate() - i);\n const yyyy = d.getFullYear();\n const mm = String(d.getMonth() + 1).padStart(2, \"0\");\n const dd = String(d.getDate()).padStart(2, \"0\");\n paths.push(path.join(logDir, `trade-${yyyy}-${mm}-${dd}.log`));\n }\n return paths;\n}\n\n/** Read and parse all log entries from files in the log directory. */\nfunction readEntries(logDir: string): LogEntry[] {\n const filePaths = getLogPaths(logDir);\n const entries: LogEntry[] = [];\n\n for (const filePath of filePaths) {\n if (!fs.existsSync(filePath)) continue;\n let content: string;\n try {\n content = fs.readFileSync(filePath, \"utf8\");\n } catch {\n continue;\n }\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n const entry = JSON.parse(trimmed) as LogEntry;\n entries.push(entry);\n } catch {\n // skip malformed lines\n }\n }\n }\n\n return entries;\n}\n\n/** Extract tool name from a LogEntry. */\nfunction extractTool(entry: LogEntry): string | undefined {\n if (entry.tool) return entry.tool;\n if (typeof entry.message === \"string\" && entry.message.startsWith(\"tool:\")) {\n return entry.message.slice(\"tool:\".length);\n }\n return undefined;\n}\n\nexport function registerAuditTools(logDir?: string): ToolSpec[] {\n const resolvedLogDir = logDir ?? DEFAULT_LOG_DIR;\n return [\n // ── trade_get_history ──────────────────────────────────────────\n {\n name: \"trade_get_history\",\n module: \"account\",\n description:\n \"로컬 로그에서 거래 이력을 조회합니다. Read local audit logs filtered by tool, level, and time.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n limit: {\n type: \"number\",\n description: \"Maximum number of entries to return (default 20).\",\n },\n tool: {\n type: \"string\",\n description: \"Filter by tool name.\",\n },\n level: {\n type: \"string\",\n enum: [\"INFO\", \"WARN\", \"ERROR\", \"DEBUG\"],\n description: \"Filter by log level (case-insensitive).\",\n },\n since: {\n type: \"string\",\n description: \"ISO 8601 timestamp; return entries at or after this time.\",\n },\n },\n required: [],\n },\n handler: async (rawArgs, _context) => {\n const args = asRecord(rawArgs);\n const limit = readNumber(args, \"limit\") ?? 20;\n const toolFilter = readString(args, \"tool\");\n const levelFilter = readString(args, \"level\")?.toLowerCase();\n const sinceStr = readString(args, \"since\");\n const sinceMs = sinceStr ? new Date(sinceStr).getTime() : undefined;\n\n const entries = readEntries(resolvedLogDir);\n\n const filtered = entries.filter((entry) => {\n if (toolFilter) {\n const t = extractTool(entry);\n if (!t || !t.includes(toolFilter)) return false;\n }\n if (levelFilter && entry.level !== levelFilter) return false;\n if (sinceMs !== undefined) {\n const entryMs = new Date(entry.ts).getTime();\n if (Number.isNaN(entryMs) || entryMs < sinceMs) return false;\n }\n return true;\n });\n\n // Sort descending by ts\n filtered.sort((a, b) => {\n const ta = new Date(a.ts).getTime();\n const tb = new Date(b.ts).getTime();\n return tb - ta;\n });\n\n return {\n endpoint: \"local:audit-log\",\n requestTime: new Date().toISOString(),\n data: filtered.slice(0, limit),\n };\n },\n },\n ];\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { ToolSpec } from \"./types.js\";\nimport { BITHUMB_API_BASE_URL } from \"../constants.js\";\n\ninterface DiagCheck {\n name: string;\n status: \"pass\" | \"fail\";\n message: string;\n}\n\nasync function checkApiReachability(baseUrl: string): Promise<DiagCheck> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 5000);\n const res = await fetch(`${baseUrl}/v1/market/all`, {\n signal: controller.signal,\n });\n clearTimeout(timeout);\n return {\n name: \"API Reachability\",\n status: res.ok ? \"pass\" : \"fail\",\n message: res.ok\n ? `${baseUrl} reachable (HTTP ${res.status})`\n : `${baseUrl} returned HTTP ${res.status}`,\n };\n } catch (err) {\n return {\n name: \"API Reachability\",\n status: \"fail\",\n message: `Cannot reach ${baseUrl}: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n}\n\nfunction checkAuthentication(): DiagCheck {\n const accessKey = process.env.BITHUMB_ACCESS_KEY?.trim();\n const secretKey = process.env.BITHUMB_SECRET_KEY?.trim();\n if (accessKey && secretKey) {\n return { name: \"Authentication\", status: \"pass\", message: \"API keys configured via environment variables\" };\n }\n // Check TOML config\n const tomlPath = join(homedir(), \".bithumb\", \"config.toml\");\n if (existsSync(tomlPath)) {\n return { name: \"Authentication\", status: \"pass\", message: \"config.toml found (credentials may be in profile)\" };\n }\n if (accessKey || secretKey) {\n return { name: \"Authentication\", status: \"fail\", message: \"Partial credentials: set both BITHUMB_ACCESS_KEY and BITHUMB_SECRET_KEY\" };\n }\n return { name: \"Authentication\", status: \"fail\", message: \"No credentials found (set env vars or create ~/.bithumb/config.toml)\" };\n}\n\nfunction checkTomlConfig(): DiagCheck {\n const tomlPath = join(homedir(), \".bithumb\", \"config.toml\");\n if (existsSync(tomlPath)) {\n return { name: \"TOML Config\", status: \"pass\", message: `Found ${tomlPath}` };\n }\n return { name: \"TOML Config\", status: \"fail\", message: `Not found: ${tomlPath} (optional — use 'setup' command to create)` };\n}\n\nfunction checkModules(enabledModules: string[]): DiagCheck {\n return {\n name: \"Enabled Modules\",\n status: \"pass\",\n message: `Active: ${enabledModules.join(\", \")}`,\n };\n}\n\nconst ALL_MODULES = [\"market\", \"account\", \"trade\", \"twap\", \"withdraw\", \"deposit\"];\n\nexport function registerDiagnoseTools(): ToolSpec[] {\n return [\n {\n name: \"system_get_capabilities\",\n module: \"account\",\n description:\n \"Return server capabilities and module availability for agent planning.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {},\n additionalProperties: false,\n },\n handler: async (_args, context) => {\n const enabledModules = new Set(context.config.modules);\n const moduleAvailability: Record<string, { status: string; reasonCode?: string }> = {};\n for (const mod of ALL_MODULES) {\n if (!enabledModules.has(mod)) {\n moduleAvailability[mod] = { status: \"disabled\", reasonCode: \"MODULE_FILTERED\" };\n } else if (mod !== \"market\" && !context.config.hasAuth) {\n moduleAvailability[mod] = { status: \"requires_auth\", reasonCode: \"AUTH_MISSING\" };\n } else {\n moduleAvailability[mod] = { status: \"enabled\" };\n }\n }\n return {\n endpoint: \"local:capabilities\",\n requestTime: new Date().toISOString(),\n data: {\n readOnly: context.config.readOnly,\n hasAuth: context.config.hasAuth,\n moduleAvailability,\n },\n };\n },\n },\n {\n name: \"system_diagnose\",\n module: \"account\",\n description:\n \"Run diagnostic checks on the Bithumb Trade Kit configuration. \" +\n \"Checks API reachability, authentication, TOML config, and module status.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {},\n },\n handler: async (_args, context) => {\n const baseUrl = context?.config?.baseUrl ?? BITHUMB_API_BASE_URL;\n const modules = context?.config?.modules ?? [];\n\n const checks: DiagCheck[] = [];\n checks.push(await checkApiReachability(baseUrl));\n checks.push(checkAuthentication());\n checks.push(checkTomlConfig());\n checks.push(checkModules(modules as string[]));\n\n const passed = checks.filter((c) => c.status === \"pass\").length;\n const total = checks.length;\n\n return {\n endpoint: \"local:diagnose\",\n requestTime: new Date().toISOString(),\n data: {\n summary: `${passed}/${total} checks passed`,\n checks,\n },\n };\n },\n },\n ];\n}\n","// ─── Bithumb Constants ─────────────────────────────────────────────\n\nexport const BITHUMB_API_BASE_URL = \"https://api.bithumb.com\";\n\nexport const MODULES = [\"market\", \"account\", \"trade\", \"twap\", \"withdraw\", \"deposit\"] as const;\nexport type ModuleId = (typeof MODULES)[number];\nexport const DEFAULT_MODULES: ModuleId[] = [\"market\", \"account\", \"trade\", \"twap\", \"withdraw\", \"deposit\"];\n","// ─── TWAP Tools (Private) ─────────────────────────────────────────\n\nimport type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n compactObject,\n normalizeResponse,\n readNumber,\n readString,\n readStringArray,\n requireString,\n} from \"./helpers.js\";\nimport { orderRateLimit, privateRateLimit } from \"./common.js\";\n\nexport function registerTwapTools(): ToolSpec[] {\n return [\n // ── 6. twap_place_order ────────────────────────────────────────\n {\n name: \"twap_place_order\",\n module: \"twap\",\n description:\n \"TWAP 주문을 요청합니다. Place a TWAP (Time-Weighted Average Price) order.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n market: {\n type: \"string\",\n description: \"거래 대상 페어의 고유 심볼 (예시: KRW-BTC)\",\n },\n side: {\n type: \"string\",\n enum: [\"bid\", \"ask\"],\n description: \"주문 종류: bid (매수), ask (매도)\",\n },\n duration: {\n type: \"string\",\n description:\n \"주문 시간 - TWAP 주문이 진행되는 시간(초). min 300, max 43200\",\n },\n frequency: {\n type: \"string\",\n enum: [\"5\", \"15\", \"20\", \"30\", \"60\", \"120\"],\n description: \"주문 간격(초)\",\n },\n volume: {\n type: \"string\",\n description: \"주문 수량 (매도 시 필수)\",\n },\n price: {\n type: \"string\",\n description: \"주문 가격 (매수 시 필수)\",\n },\n },\n required: [\"market\", \"side\", \"duration\", \"frequency\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/v1/twap\",\n compactObject({\n market: requireString(args, \"market\"),\n side: requireString(args, \"side\"),\n duration: requireString(args, \"duration\"),\n frequency: requireString(args, \"frequency\"),\n volume: readString(args, \"volume\"),\n price: readString(args, \"price\"),\n }),\n orderRateLimit(\"twap_place_order\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 7. twap_get_orders ─────────────────────────────────────────\n {\n name: \"twap_get_orders\",\n module: \"twap\",\n description:\n \"TWAP 주문 내역을 조회합니다. Get TWAP order history.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n market: {\n type: \"string\",\n description: \"거래 대상 페어의 고유 심볼 (예시: KRW-BTC)\",\n },\n uuids: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"TWAP 주문 ID 목록\",\n },\n state: {\n type: \"string\",\n enum: [\"progress\", \"done\", \"cancel\"],\n description:\n \"주문 상태: progress (진행중, default), done (완료), cancel (취소)\",\n },\n next_key: {\n type: \"string\",\n description: \"다음 페이지 조회를 위한 커서 값\",\n },\n limit: {\n type: \"number\",\n description: \"개수 제한 (max 100)\",\n },\n order_by: {\n type: \"string\",\n enum: [\"asc\", \"desc\"],\n description: \"조회 결과 정렬 방식: asc (오름차순), desc (내림차순, default)\",\n },\n },\n required: [],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/v1/twap\",\n compactObject({\n market: readString(args, \"market\"),\n uuids: readStringArray(args, \"uuids\"),\n state: readString(args, \"state\"),\n next_key: readString(args, \"next_key\"),\n limit: readNumber(args, \"limit\"),\n order_by: readString(args, \"order_by\"),\n }),\n privateRateLimit(\"twap_get_orders\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 8. twap_cancel_order ───────────────────────────────────────\n {\n name: \"twap_cancel_order\",\n module: \"twap\",\n description:\n \"TWAP 주문을 취소합니다. Cancel a TWAP order.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n algo_order_id: {\n type: \"string\",\n description: \"취소할 TWAP 주문 ID\",\n },\n },\n required: [\"algo_order_id\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const algo_order_id = requireString(args, \"algo_order_id\");\n const response = await context.client.privateDelete(\n \"/v1/twap\",\n { algo_order_id },\n orderRateLimit(\"twap_cancel_order\"),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","// ─── Withdraw Tools (Private) ─────────────────────────────────────\n\nimport type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n compactObject,\n normalizeResponse,\n readNumber,\n readString,\n readStringArray,\n requireString,\n} from \"./helpers.js\";\nimport { orderRateLimit, privateRateLimit } from \"./common.js\";\n\nexport function registerWithdrawTools(): ToolSpec[] {\n return [\n // ── 9. withdraw_get_chance ───────────────────────────────────────\n {\n name: \"withdraw_get_chance\",\n module: \"withdraw\",\n description:\n \"출금 가능 정보를 조회합니다. Get withdrawal chance info (available balance, fees).\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n currency: {\n type: \"string\",\n description: \"Currency symbol, e.g. BTC\",\n },\n net_type: {\n type: \"string\",\n description: \"Withdrawal network, e.g. BTC, DASH\",\n },\n },\n required: [\"currency\", \"net_type\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/v1/withdraws/chance\",\n {\n currency: requireString(args, \"currency\"),\n net_type: requireString(args, \"net_type\"),\n },\n privateRateLimit(\"withdraw_get_chance\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 10. withdraw_get ─────────────────────────────────────────────\n {\n name: \"withdraw_get\",\n module: \"withdraw\",\n description:\n \"개별 출금을 조회합니다. Get a specific withdrawal by currency.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n currency: {\n type: \"string\",\n description: \"Currency symbol, e.g. BTC\",\n },\n uuid: {\n type: \"string\",\n description: \"Withdrawal unique ID\",\n },\n txid: {\n type: \"string\",\n description: \"Withdrawal transaction ID\",\n },\n },\n required: [\"currency\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/v1/withdraw\",\n compactObject({\n currency: requireString(args, \"currency\"),\n uuid: readString(args, \"uuid\"),\n txid: readString(args, \"txid\"),\n }),\n privateRateLimit(\"withdraw_get\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 11. withdraw_get_list ────────────────────────────────────────\n {\n name: \"withdraw_get_list\",\n module: \"withdraw\",\n description:\n \"출금 리스트를 조회합니다. Get list of coin withdrawals.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n currency: {\n type: \"string\",\n description: \"Currency symbol, e.g. BTC\",\n },\n state: {\n type: \"string\",\n enum: [\"PROCESSING\", \"DONE\", \"CANCELED\"],\n description: \"Withdrawal state filter\",\n },\n uuids: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Filter by withdrawal UUIDs\",\n },\n txids: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Filter by transaction IDs\",\n },\n limit: {\n type: \"number\",\n description: \"Number of results per page (max 100)\",\n },\n page: {\n type: \"number\",\n description: \"Page number\",\n },\n order_by: {\n type: \"string\",\n enum: [\"asc\", \"desc\"],\n description: \"Sort order (default: desc)\",\n },\n },\n required: [],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/v1/withdraws\",\n compactObject({\n currency: readString(args, \"currency\"),\n state: readString(args, \"state\"),\n uuids: readStringArray(args, \"uuids\"),\n txids: readStringArray(args, \"txids\"),\n limit: readNumber(args, \"limit\"),\n page: readNumber(args, \"page\"),\n order_by: readString(args, \"order_by\"),\n }),\n privateRateLimit(\"withdraw_get_list\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 12. withdraw_get_list_krw ────────────────────────────────────\n {\n name: \"withdraw_get_list_krw\",\n module: \"withdraw\",\n description:\n \"원화 출금 리스트를 조회합니다. Get list of KRW withdrawals.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n state: {\n type: \"string\",\n enum: [\"PROCESSING\", \"DONE\", \"CANCELED\"],\n description: \"Withdrawal state filter\",\n },\n uuids: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Filter by withdrawal UUIDs\",\n },\n txids: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Filter by transaction IDs\",\n },\n limit: {\n type: \"number\",\n description: \"Number of results per page (max 100)\",\n },\n page: {\n type: \"number\",\n description: \"Page number\",\n },\n order_by: {\n type: \"string\",\n enum: [\"asc\", \"desc\"],\n description: \"Sort order (default: desc)\",\n },\n },\n required: [],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/v1/withdraws/krw\",\n compactObject({\n state: readString(args, \"state\"),\n uuids: readStringArray(args, \"uuids\"),\n txids: readStringArray(args, \"txids\"),\n limit: readNumber(args, \"limit\"),\n page: readNumber(args, \"page\"),\n order_by: readString(args, \"order_by\"),\n }),\n privateRateLimit(\"withdraw_get_list_krw\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 13. withdraw_coin ────────────────────────────────────────────\n {\n name: \"withdraw_coin\",\n module: \"withdraw\",\n description:\n \"실제 가상 자산을 출금합니다. 이 작업은 되돌릴 수 없습니다. Withdraw cryptocurrency. This action is IRREVERSIBLE. \" +\n \"Use when: user has explicitly approved a withdrawal AND the full pre-flight checklist has run (account_get_balance, account_get_wallet_status, withdraw_get_chance, withdraw_get_addresses, market_get_fee_inout). \" +\n \"Do NOT use: without prior `withdraw_get_chance` to confirm net_type/min/fee; without `withdraw_get_addresses` to confirm destination is in the allow-list; without explicit user confirmation of the full destination string. \" +\n \"Multi-network coins (USDT/USDC/XRP): always run `withdraw_get_chance` first to discover supported `net_type`. Wrong net_type = permanent loss. \" +\n \"secondary_address (memo/tag): mandatory for XRP/EOS/ATOM-class coins. Missing it = lost funds.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n currency: {\n type: \"string\",\n description: \"Currency symbol, e.g. BTC\",\n },\n net_type: {\n type: \"string\",\n description: \"Withdrawal network, e.g. BTC, DASH\",\n },\n amount: {\n type: \"string\",\n description: \"Withdrawal amount\",\n },\n address: {\n type: \"string\",\n description: \"Registered withdrawal address\",\n },\n secondary_address: {\n type: \"string\",\n description: \"Secondary address (for certain assets)\",\n },\n exchange_name: {\n type: \"string\",\n description: \"Exchange name (English)\",\n },\n receiver_type: {\n type: \"string\",\n enum: [\"personal\", \"corporation\"],\n description: \"Receiver type: personal or corporation\",\n },\n receiver_ko_name: {\n type: \"string\",\n description: \"Receiver Korean name\",\n },\n receiver_en_name: {\n type: \"string\",\n description: \"Receiver English name\",\n },\n receiver_corp_ko_name: {\n type: \"string\",\n description: \"Corporation Korean name (required if corporation)\",\n },\n receiver_corp_en_name: {\n type: \"string\",\n description: \"Corporation English name (required if corporation)\",\n },\n },\n required: [\"currency\", \"net_type\", \"amount\", \"address\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/v1/withdraws/coin\",\n compactObject({\n currency: requireString(args, \"currency\"),\n net_type: requireString(args, \"net_type\"),\n amount: requireString(args, \"amount\"),\n address: requireString(args, \"address\"),\n secondary_address: readString(args, \"secondary_address\"),\n exchange_name: readString(args, \"exchange_name\"),\n receiver_type: readString(args, \"receiver_type\"),\n receiver_ko_name: readString(args, \"receiver_ko_name\"),\n receiver_en_name: readString(args, \"receiver_en_name\"),\n receiver_corp_ko_name: readString(args, \"receiver_corp_ko_name\"),\n receiver_corp_en_name: readString(args, \"receiver_corp_en_name\"),\n }),\n orderRateLimit(\"withdraw_coin\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 14. withdraw_krw ─────────────────────────────────────────────\n {\n name: \"withdraw_krw\",\n module: \"withdraw\",\n description:\n \"등록된 계좌로 원화를 출금합니다. 2차 인증(카카오)이 필요합니다. Withdraw KRW to registered bank account. Requires 2FA (Kakao).\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n amount: {\n type: \"string\",\n description: \"Withdrawal amount in KRW\",\n },\n two_factor_type: {\n type: \"string\",\n description: \"2FA method (e.g. kakao)\",\n },\n },\n required: [\"amount\", \"two_factor_type\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/v1/withdraws/krw\",\n {\n amount: requireString(args, \"amount\"),\n two_factor_type: requireString(args, \"two_factor_type\"),\n },\n orderRateLimit(\"withdraw_krw\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 15. withdraw_cancel_coin ─────────────────────────────────────\n {\n name: \"withdraw_cancel_coin\",\n module: \"withdraw\",\n description:\n \"가상 자산 출금을 취소합니다. Cancel a cryptocurrency withdrawal.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n withdrawal_id: {\n type: \"string\",\n description: \"Withdrawal unique ID to cancel\",\n },\n },\n required: [\"withdrawal_id\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateDelete(\n \"/v1/withdraws/coin\",\n {\n withdrawal_id: requireString(args, \"withdrawal_id\"),\n },\n orderRateLimit(\"withdraw_cancel_coin\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 16. withdraw_get_addresses ───────────────────────────────────\n {\n name: \"withdraw_get_addresses\",\n module: \"withdraw\",\n description:\n \"출금 허용 주소 리스트를 조회합니다. Get list of allowed withdrawal addresses.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {},\n required: [],\n },\n handler: async (_rawArgs, context) => {\n const response = await context.client.privateGet(\n \"/v1/withdraws/coin_addresses\",\n {},\n privateRateLimit(\"withdraw_get_addresses\"),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","// ─── Deposit Tools (Private) ──────────────────────────────────────\n\nimport type { ToolSpec } from \"./types.js\";\nimport {\n asRecord,\n compactObject,\n normalizeResponse,\n readNumber,\n readString,\n readStringArray,\n requireString,\n} from \"./helpers.js\";\nimport { privateRateLimit } from \"./common.js\";\n\nexport function registerDepositTools(): ToolSpec[] {\n return [\n // ── 17. deposit_get ───────────────────────────────────────────\n {\n name: \"deposit_get\",\n module: \"deposit\",\n description:\n \"개별 입금을 조회합니다. Get a single deposit by currency + uuid (or single txid). \" +\n \"Use when: user has a specific deposit UUID and wants the full record. \" +\n \"Do NOT use: to search by transaction id list — use `deposit_get_list` with `txids` (array). The CLI blocks `deposit get --txids` and redirects to `deposit list --txids`. \" +\n 'Example call: {\"currency\":\"BTC\",\"uuid\":\"12345678-....\"}',\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n currency: {\n type: \"string\",\n description: \"Currency symbol, e.g. BTC\",\n },\n uuid: {\n type: \"string\",\n description: \"Deposit UUID\",\n },\n txid: {\n type: \"string\",\n description: \"Deposit TXID\",\n },\n },\n required: [\"currency\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/v1/deposit\",\n compactObject({\n currency: requireString(args, \"currency\"),\n uuid: readString(args, \"uuid\"),\n txid: readString(args, \"txid\"),\n }),\n privateRateLimit(\"deposit_get\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 18. deposit_get_list ──────────────────────────────────────\n {\n name: \"deposit_get_list\",\n module: \"deposit\",\n description:\n \"입금 리스트를 조회합니다. Get list of coin deposits with optional filters. \" +\n \"Use when: user asks 'find this txid' / 'recent deposits' / 'list deposits in PROCESSING state'. \" +\n \"Do NOT use: when you already have a deposit UUID and want a single record (use `deposit_get`). \" +\n 'Example call (txid lookup): {\"txids\":[\"0xabc123...\"]}',\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n currency: {\n type: \"string\",\n description: \"Currency symbol, e.g. BTC\",\n },\n state: {\n type: \"string\",\n description: \"Deposit state filter\",\n },\n uuids: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Filter by deposit UUIDs\",\n },\n txids: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Filter by deposit TXIDs\",\n },\n limit: {\n type: \"number\",\n description: \"Number of results (max 100)\",\n },\n page: {\n type: \"number\",\n description: \"Page number (default 1)\",\n },\n order_by: {\n type: \"string\",\n description: \"Sort order: asc or desc (default desc)\",\n },\n },\n required: [],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/v1/deposits\",\n compactObject({\n currency: readString(args, \"currency\"),\n state: readString(args, \"state\"),\n uuids: readStringArray(args, \"uuids\"),\n txids: readStringArray(args, \"txids\"),\n limit: readNumber(args, \"limit\"),\n page: readNumber(args, \"page\"),\n order_by: readString(args, \"order_by\"),\n }),\n privateRateLimit(\"deposit_get_list\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 19. deposit_get_list_krw ──────────────────────────────────\n {\n name: \"deposit_get_list_krw\",\n module: \"deposit\",\n description:\n \"원화 입금 리스트를 조회합니다. Get list of KRW deposits.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n state: {\n type: \"string\",\n description: \"Deposit state: PROCESSING, ACCEPTED, CANCELED\",\n },\n uuids: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Filter by deposit UUIDs\",\n },\n txids: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Filter by deposit TXIDs\",\n },\n limit: {\n type: \"number\",\n description: \"Number of results (max 100)\",\n },\n page: {\n type: \"number\",\n description: \"Page number (default 1)\",\n },\n order_by: {\n type: \"string\",\n description: \"Sort order: asc or desc (default desc)\",\n },\n },\n required: [],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/v1/deposits/krw\",\n compactObject({\n state: readString(args, \"state\"),\n uuids: readStringArray(args, \"uuids\"),\n txids: readStringArray(args, \"txids\"),\n limit: readNumber(args, \"limit\"),\n page: readNumber(args, \"page\"),\n order_by: readString(args, \"order_by\"),\n }),\n privateRateLimit(\"deposit_get_list_krw\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 20. deposit_krw ──────────────────────────────────────────\n {\n name: \"deposit_krw\",\n module: \"deposit\",\n description:\n \"원화 입금을 요청합니다. 2차 인증(카카오)이 필요합니다. Request KRW deposit. Requires 2FA (Kakao).\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n amount: {\n type: \"string\",\n description: \"Deposit amount in KRW\",\n },\n two_factor_type: {\n type: \"string\",\n description: \"2FA method, e.g. kakao\",\n },\n },\n required: [\"amount\", \"two_factor_type\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/v1/deposits/krw\",\n {\n amount: requireString(args, \"amount\"),\n two_factor_type: requireString(args, \"two_factor_type\"),\n },\n privateRateLimit(\"deposit_krw\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 21. deposit_generate_address ─────────────────────────────\n {\n name: \"deposit_generate_address\",\n module: \"deposit\",\n description:\n \"입금 주소를 생성합니다. Generate a new deposit address.\",\n isWrite: true,\n inputSchema: {\n type: \"object\",\n properties: {\n currency: {\n type: \"string\",\n description: \"Currency symbol, e.g. BTC\",\n },\n net_type: {\n type: \"string\",\n description: \"Network type, e.g. BTC, ETH\",\n },\n },\n required: [\"currency\", \"net_type\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privatePost(\n \"/v1/deposits/generate_coin_address\",\n {\n currency: requireString(args, \"currency\"),\n net_type: requireString(args, \"net_type\"),\n },\n privateRateLimit(\"deposit_generate_address\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 22. deposit_get_addresses ────────────────────────────────\n {\n name: \"deposit_get_addresses\",\n module: \"deposit\",\n description:\n \"전체 입금 주소를 조회합니다. Get all deposit addresses.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {},\n required: [],\n },\n handler: async (_rawArgs, context) => {\n const response = await context.client.privateGet(\n \"/v1/deposits/coin_addresses\",\n {},\n privateRateLimit(\"deposit_get_addresses\"),\n );\n return normalizeResponse(response);\n },\n },\n\n // ── 23. deposit_get_address ──────────────────────────────────\n {\n name: \"deposit_get_address\",\n module: \"deposit\",\n description:\n \"개별 입금 주소를 조회합니다. Get deposit address for a specific currency and network.\",\n isWrite: false,\n inputSchema: {\n type: \"object\",\n properties: {\n currency: {\n type: \"string\",\n description: \"Currency symbol, e.g. BTC\",\n },\n net_type: {\n type: \"string\",\n description: \"Network type, e.g. BTC, ETH\",\n },\n },\n required: [\"currency\", \"net_type\"],\n },\n handler: async (rawArgs, context) => {\n const args = asRecord(rawArgs);\n const response = await context.client.privateGet(\n \"/v1/deposits/coin_address\",\n {\n currency: requireString(args, \"currency\"),\n net_type: requireString(args, \"net_type\"),\n },\n privateRateLimit(\"deposit_get_address\"),\n );\n return normalizeResponse(response);\n },\n },\n ];\n}\n","// ─── Tool Registry ─────────────────────────────────────────────────\n\nimport type { BithumbConfig } from \"../config.js\";\nimport type { BithumbRestClient } from \"../client/rest-client.js\";\nimport type { ToolSpec, ToolArgs } from \"./types.js\";\nimport { registerMarketTools } from \"./market.js\";\nimport { registerAccountTools } from \"./account.js\";\nimport { registerTradeTools } from \"./trade.js\";\nimport { registerAuditTools } from \"./audit.js\";\nimport { registerDiagnoseTools } from \"./diagnose.js\";\nimport { registerTwapTools } from \"./twap.js\";\nimport { registerWithdrawTools } from \"./withdraw.js\";\nimport { registerDepositTools } from \"./deposit.js\";\n\n/** Return all registered tool specs. */\nexport function allToolSpecs(): ToolSpec[] {\n return [\n ...registerMarketTools(),\n ...registerAccountTools(),\n ...registerTradeTools(),\n ...registerAuditTools(),\n ...registerDiagnoseTools(),\n ...registerTwapTools(),\n ...registerWithdrawTools(),\n ...registerDepositTools(),\n ];\n}\n\n/** Filter tools by enabled modules and readOnly mode. */\nexport function buildTools(config: BithumbConfig): ToolSpec[] {\n const enabledModules = new Set(config.modules);\n const tools = allToolSpecs().filter((t) => enabledModules.has(t.module));\n return config.readOnly ? tools.filter((t) => !t.isWrite) : tools;\n}\n\nexport interface ToolResult {\n endpoint: string;\n requestTime: string;\n data: unknown;\n}\n\nexport type ToolRunner = (\n toolName: string,\n args: ToolArgs,\n) => Promise<ToolResult>;\n\n/** Create a function that dispatches tool calls by name. */\nexport function createToolRunner(\n client: BithumbRestClient,\n config: BithumbConfig,\n): ToolRunner {\n const tools = allToolSpecs();\n const toolMap = new Map<string, ToolSpec>(\n tools.map((t) => [t.name, t]),\n );\n\n return async (toolName, args) => {\n const tool = toolMap.get(toolName);\n if (!tool) throw new Error(`Unknown tool: ${toolName}`);\n return (await tool.handler(args, { config, client })) as ToolResult;\n };\n}\n","// ─── Tool Types ────────────────────────────────────────────────────\n\nimport type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\nimport type { BithumbRestClient } from \"../client/rest-client.js\";\nimport type { BithumbConfig } from \"../config.js\";\nimport type { ModuleId } from \"../constants.js\";\n\nexport type ToolArgs = Record<string, unknown>;\nexport type JsonSchema = Tool[\"inputSchema\"];\n\nexport interface ToolContext {\n config: BithumbConfig;\n client: BithumbRestClient;\n}\n\nexport interface ToolSpec {\n name: string;\n module: ModuleId;\n description: string;\n inputSchema: JsonSchema;\n isWrite: boolean;\n handler: (args: ToolArgs, context: ToolContext) => Promise<unknown>;\n}\n\nexport function toMcpTool(tool: ToolSpec): Tool {\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n annotations: {\n readOnlyHint: !tool.isWrite,\n destructiveHint: tool.isWrite,\n idempotentHint: !tool.isWrite,\n openWorldHint: true,\n },\n };\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { parse, stringify } from \"smol-toml\";\nimport { ConfigError } from \"../utils/errors.js\";\n\nexport { stringify as tomlStringify };\n\nexport interface BithumbProfile {\n access_key?: string;\n secret_key?: string;\n base_url?: string;\n timeout_ms?: number;\n}\n\nexport interface BithumbTomlConfig {\n default_profile?: string;\n profiles: Record<string, BithumbProfile>;\n}\n\nexport function configFilePath(): string {\n return join(homedir(), \".bithumb\", \"config.toml\");\n}\n\nexport function readFullConfig(): BithumbTomlConfig {\n const path = configFilePath();\n if (!existsSync(path)) return { profiles: {} };\n const raw = readFileSync(path, \"utf-8\");\n try {\n return parse(raw) as unknown as BithumbTomlConfig;\n } catch (err) {\n throw new ConfigError(\n `Failed to parse ${path}: ${err instanceof Error ? err.message : String(err)}`,\n \"Check TOML syntax in your config file, or delete and re-create it.\",\n );\n }\n}\n\nexport function readTomlProfile(profileName?: string): BithumbProfile {\n const config = readFullConfig();\n const name = profileName ?? config.default_profile ?? \"default\";\n return config.profiles?.[name] ?? {};\n}\n\nconst CONFIG_HEADER =\n \"# Bithumb Trade Kit Configuration\\n\" +\n \"# Wrap values containing special chars in quotes\\n\\n\";\n\nexport function writeFullConfig(config: BithumbTomlConfig): void {\n const path = configFilePath();\n const dir = dirname(path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(path, CONFIG_HEADER + stringify(config as unknown as Record<string, unknown>), \"utf-8\");\n}\n","// ─── Configuration ─────────────────────────────────────────────────\n\nimport {\n BITHUMB_API_BASE_URL,\n DEFAULT_MODULES,\n MODULES,\n type ModuleId,\n} from \"./constants.js\";\nimport { ConfigError } from \"./utils/errors.js\";\nimport { readTomlProfile } from \"./config/toml.js\";\nimport type { BithumbProfile } from \"./config/toml.js\";\n\nexport interface BithumbConfig {\n accessKey?: string;\n secretKey?: string;\n hasAuth: boolean;\n baseUrl: string;\n timeoutMs: number;\n modules: ModuleId[];\n readOnly: boolean;\n verbose: boolean;\n}\n\nexport function loadConfig(options?: {\n modules?: string;\n readOnly?: boolean;\n verbose?: boolean;\n profile?: string;\n}): BithumbConfig {\n const toml = readTomlProfile(options?.profile);\n\n // Priority: env > toml > none\n const accessKey = process.env.BITHUMB_ACCESS_KEY?.trim() ?? toml.access_key;\n const secretKey = process.env.BITHUMB_SECRET_KEY?.trim() ?? toml.secret_key;\n const hasAuth = Boolean(accessKey && secretKey);\n const partialAuth = Boolean(accessKey) || Boolean(secretKey);\n\n if (partialAuth && !hasAuth) {\n throw new ConfigError(\n \"Partial API credentials.\",\n \"Set both BITHUMB_ACCESS_KEY and BITHUMB_SECRET_KEY (env vars or config.toml profile).\",\n );\n }\n\n const baseUrl = (\n process.env.BITHUMB_API_BASE_URL?.trim() ?? toml.base_url ?? BITHUMB_API_BASE_URL\n ).replace(/\\/+$/, \"\");\n\n const rawTimeout = process.env.BITHUMB_TIMEOUT_MS\n ? Number(process.env.BITHUMB_TIMEOUT_MS)\n : (toml.timeout_ms ?? 15_000);\n\n if (!Number.isFinite(rawTimeout) || rawTimeout <= 0) {\n throw new ConfigError(\n \"Invalid timeout.\",\n \"BITHUMB_TIMEOUT_MS must be a positive integer.\",\n );\n }\n\n // Parse modules\n let modules: ModuleId[] = [...DEFAULT_MODULES];\n if (options?.modules) {\n const requested = options.modules\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n if (requested.length > 0) {\n let isAll = false;\n for (const m of requested) {\n if (m === \"all\") {\n modules = [...MODULES];\n isAll = true;\n break;\n }\n if (!MODULES.includes(m as ModuleId)) {\n throw new ConfigError(\n `Unknown module \"${m}\".`,\n `Use: ${MODULES.join(\", \")} or \"all\".`,\n );\n }\n }\n if (!isAll) modules = requested as ModuleId[];\n }\n }\n\n return {\n accessKey,\n secretKey,\n hasAuth,\n baseUrl,\n timeoutMs: Math.floor(rawTimeout),\n modules,\n readOnly: options?.readOnly ?? false,\n verbose: options?.verbose ?? false,\n };\n}\n","// ─── Trade Logger ──────────────────────────────────────────────────\n\nimport { mkdirSync, appendFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport interface LogEntry {\n ts: string;\n level: LogLevel;\n tool?: string;\n endpoint?: string;\n elapsed?: number;\n message: string;\n [key: string]: unknown;\n}\n\nconst LEVEL_ORDER: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\nconst SENSITIVE_KEY_PATTERN =\n /accessKey|secretKey|password|secret|token|jwt/i;\n\nfunction redactSensitive(obj: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (SENSITIVE_KEY_PATTERN.test(key)) {\n result[key] = \"***REDACTED***\";\n } else if (value && typeof value === \"object\" && !Array.isArray(value)) {\n result[key] = redactSensitive(value as Record<string, unknown>);\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction todayDateString(): string {\n const d = new Date();\n const yyyy = d.getFullYear();\n const mm = String(d.getMonth() + 1).padStart(2, \"0\");\n const dd = String(d.getDate()).padStart(2, \"0\");\n return `${yyyy}-${mm}-${dd}`;\n}\n\nexport class TradeLogger {\n private readonly logDir: string;\n private readonly minLevel: LogLevel;\n private readonly verbose: boolean;\n\n constructor(minLevelOrOptions?: LogLevel | { logDir?: string; minLevel?: LogLevel; verbose?: boolean }) {\n if (typeof minLevelOrOptions === \"string\") {\n this.logDir = join(homedir(), \".bithumb\", \"logs\");\n this.minLevel = minLevelOrOptions;\n this.verbose = false;\n } else {\n this.logDir = minLevelOrOptions?.logDir ?? join(homedir(), \".bithumb\", \"logs\");\n this.minLevel = minLevelOrOptions?.minLevel ?? \"info\";\n this.verbose = minLevelOrOptions?.verbose ?? false;\n }\n\n try {\n mkdirSync(this.logDir, { recursive: true });\n } catch {\n // Silently ignore if directory cannot be created\n }\n }\n\n debug(message: string, meta?: Record<string, unknown>): void {\n this.log(\"debug\", message, meta);\n }\n\n info(message: string, meta?: Record<string, unknown>): void {\n this.log(\"info\", message, meta);\n }\n\n warn(message: string, meta?: Record<string, unknown>): void {\n this.log(\"warn\", message, meta);\n }\n\n error(message: string, meta?: Record<string, unknown>): void {\n this.log(\"error\", message, meta);\n }\n\n /** Log a tool invocation result (used by MCP server). */\n logTool(\n level: LogLevel,\n toolName: string,\n args: unknown,\n result: unknown,\n elapsedMs: number,\n ): void {\n this.log(level, `tool:${toolName}`, {\n args: args as Record<string, unknown>,\n result: result as Record<string, unknown>,\n elapsedMs,\n });\n }\n\n private log(level: LogLevel, message: string, meta?: Record<string, unknown>): void {\n if (LEVEL_ORDER[level] < LEVEL_ORDER[this.minLevel]) return;\n\n const entry: LogEntry = {\n ts: new Date().toISOString(),\n level,\n message,\n ...(meta ? redactSensitive(meta) : {}),\n };\n\n const line = JSON.stringify(entry);\n\n if (this.verbose || level === \"error\") {\n process.stderr.write(`[${level}] ${message}\\n`);\n }\n\n try {\n const filePath = join(this.logDir, `trade-${todayDateString()}.log`);\n appendFileSync(filePath, line + \"\\n\", \"utf8\");\n } catch {\n // Silently ignore file write errors\n }\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nconst CACHE_DIR = join(homedir(), \".bithumb\");\nconst CACHE_FILE = join(CACHE_DIR, \"update-check.json\");\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours\n\ninterface UpdateCache {\n latestVersion: string;\n checkedAt: number;\n}\n\nexport function isNewerVersion(current: string, latest: string): boolean {\n const parse = (v: string): number[] =>\n v\n .replace(/^v/, \"\")\n .split(\".\")\n .map((n) => parseInt(n, 10) || 0);\n\n const cur = parse(current);\n const lat = parse(latest);\n\n for (let i = 0; i < Math.max(cur.length, lat.length); i++) {\n const c = cur[i] ?? 0;\n const l = lat[i] ?? 0;\n if (l > c) return true;\n if (l < c) return false;\n }\n return false;\n}\n\nexport async function fetchDistTags(\n packageName: string\n): Promise<Record<string, string> | null> {\n try {\n const url = `https://registry.npmjs.org/-/package/${encodeURIComponent(packageName)}/dist-tags`;\n const res = await fetch(url, { signal: AbortSignal.timeout(5000) });\n if (!res.ok) return null;\n return (await res.json()) as Record<string, string>;\n } catch {\n return null;\n }\n}\n\nexport async function fetchLatestVersion(\n packageName: string\n): Promise<string | null> {\n const tags = await fetchDistTags(packageName);\n return tags?.latest ?? null;\n}\n\nfunction readCache(): UpdateCache | null {\n try {\n if (!existsSync(CACHE_FILE)) return null;\n const raw = readFileSync(CACHE_FILE, \"utf8\");\n return JSON.parse(raw) as UpdateCache;\n } catch {\n return null;\n }\n}\n\nfunction writeCache(data: UpdateCache): void {\n try {\n if (!existsSync(CACHE_DIR)) {\n mkdirSync(CACHE_DIR, { recursive: true });\n }\n writeFileSync(CACHE_FILE, JSON.stringify(data), \"utf8\");\n } catch {\n // ignore write errors\n }\n}\n\nfunction isCacheStale(cache: UpdateCache): boolean {\n return Date.now() - cache.checkedAt > CACHE_TTL_MS;\n}\n\nexport function checkForUpdates(\n packageName: string,\n currentVersion: string\n): void {\n try {\n const cache = readCache();\n\n if (cache && !isCacheStale(cache)) {\n if (isNewerVersion(currentVersion, cache.latestVersion)) {\n process.stderr.write(\n `\\nUpdate available: ${currentVersion} → ${cache.latestVersion}\\n` +\n `Run: npm install -g ${packageName}\\n\\n`\n );\n }\n return;\n }\n\n // Cache is stale or missing — refresh in background\n // Use setImmediate so it doesn't block the current tick\n setImmediate(() => {\n fetchLatestVersion(packageName)\n .then((latest) => {\n if (latest) {\n writeCache({ latestVersion: latest, checkedAt: Date.now() });\n if (isNewerVersion(currentVersion, latest)) {\n process.stderr.write(\n `\\nUpdate available: ${currentVersion} → ${latest}\\n` +\n `Run: npm install -g ${packageName}\\n\\n`\n );\n }\n }\n })\n .catch(() => {\n // ignore network errors\n });\n });\n } catch {\n // update check must never crash the main process\n }\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\nimport { execFileSync } from \"node:child_process\";\nimport { configFilePath } from \"./config/toml.js\";\n\nexport type ClientId = \"claude-desktop\" | \"cursor\" | \"windsurf\" | \"vscode\" | \"claude-code\";\n\nexport interface SetupOptions {\n client: ClientId;\n profile?: string;\n modules?: string;\n}\n\nexport const CLIENT_NAMES: Record<ClientId, string> = {\n \"claude-desktop\": \"Claude Desktop\",\n cursor: \"Cursor\",\n windsurf: \"Windsurf\",\n vscode: \"VS Code\",\n \"claude-code\": \"Claude Code CLI\",\n};\n\nexport const SUPPORTED_CLIENTS = Object.keys(CLIENT_NAMES) as ClientId[];\n\nfunction appData(): string {\n return process.env.APPDATA ?? path.join(os.homedir(), \"AppData\", \"Roaming\");\n}\n\nconst CLAUDE_CONFIG_FILE = \"claude_desktop_config.json\";\n\n/**\n * Detect Microsoft Store installation of Claude Desktop on Windows.\n * MS Store apps use a sandboxed path:\n * %LOCALAPPDATA%\\Packages\\Claude_<hash>\\LocalCache\\Roaming\\Claude\\\n * Returns the config file path if found, null otherwise.\n */\nfunction findMsStoreClaudePath(): string | null {\n const localAppData = process.env.LOCALAPPDATA ?? path.join(os.homedir(), \"AppData\", \"Local\");\n const packagesDir = path.join(localAppData, \"Packages\");\n try {\n const entries = fs.readdirSync(packagesDir);\n const claudePkg = entries.find((e) => e.startsWith(\"Claude_\"));\n if (claudePkg) {\n const configPath = path.join(\n packagesDir, claudePkg, \"LocalCache\", \"Roaming\", \"Claude\", CLAUDE_CONFIG_FILE,\n );\n // Return if the config file or its parent directory already exists\n if (fs.existsSync(configPath) || fs.existsSync(path.dirname(configPath))) {\n return configPath;\n }\n }\n } catch {\n // Packages dir may not exist or may not be readable\n }\n return null;\n}\n\nexport function getConfigPath(client: ClientId): string | null {\n const home = os.homedir();\n const platform = process.platform;\n switch (client) {\n case \"claude-desktop\":\n if (platform === \"win32\") {\n // Prefer MS Store path if detected, otherwise standard %APPDATA%\n return findMsStoreClaudePath() ?? path.join(appData(), \"Claude\", CLAUDE_CONFIG_FILE);\n }\n if (platform === \"darwin\") {\n return path.join(home, \"Library\", \"Application Support\", \"Claude\", CLAUDE_CONFIG_FILE);\n }\n // Linux / other\n return path.join(process.env.XDG_CONFIG_HOME ?? path.join(home, \".config\"), \"Claude\", CLAUDE_CONFIG_FILE);\n case \"cursor\":\n return path.join(home, \".cursor\", \"mcp.json\");\n case \"windsurf\":\n return path.join(home, \".codeium\", \"windsurf\", \"mcp_config.json\");\n case \"vscode\":\n return path.join(process.cwd(), \".mcp.json\");\n case \"claude-code\":\n return null;\n }\n}\n\nconst NPX_PACKAGE = \"@bithumb-tradekit/mcp\";\n\nfunction buildEntry(\n client: ClientId,\n args: string[]\n): Record<string, unknown> {\n if (client === \"vscode\") {\n // VS Code inherits the terminal PATH — bare command is fine\n return { type: \"stdio\", command: \"bithumb-trade-mcp\", args };\n }\n // Standalone apps (Claude Desktop, Cursor, Windsurf) have a limited PATH\n // that often can't find globally-installed npm bins. Use npx to ensure\n // the binary is always resolved.\n return { command: \"npx\", args: [\"-y\", NPX_PACKAGE, ...args] };\n}\n\nfunction buildArgs(options: SetupOptions): string[] {\n const args: string[] = [];\n if (options.profile) args.push(\"--profile\", options.profile);\n args.push(\"--modules\", options.modules ?? \"all\");\n return args;\n}\n\nfunction mergeJsonConfig(\n configPath: string,\n serverName: string,\n entry: Record<string, unknown>\n): void {\n const dir = path.dirname(configPath);\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n\n let data: Record<string, unknown> = {};\n if (fs.existsSync(configPath)) {\n const raw = fs.readFileSync(configPath, \"utf-8\");\n try {\n data = JSON.parse(raw) as Record<string, unknown>;\n } catch {\n throw new Error(`Failed to parse existing config at ${configPath}`);\n }\n // Backup before modifying\n const backupPath = configPath + \".bak\";\n fs.copyFileSync(configPath, backupPath);\n process.stdout.write(` Backup → ${backupPath}\\n`);\n }\n\n if (typeof data.mcpServers !== \"object\" || data.mcpServers === null) {\n data.mcpServers = {};\n }\n (data.mcpServers as Record<string, unknown>)[serverName] = entry;\n\n fs.writeFileSync(configPath, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport function printSetupUsage(): void {\n process.stdout.write(\n `Usage: bithumb-trade-mcp setup --client <client> [--profile <name>] [--modules <list>]\\n\\n` +\n `Clients:\\n` +\n SUPPORTED_CLIENTS.map((id) => ` ${id.padEnd(16)} ${CLIENT_NAMES[id]}`).join(\"\\n\") +\n `\\n\\nOptions:\\n` +\n ` --profile <name> Profile from ${configFilePath()} (default: uses default_profile)\\n` +\n ` --modules <list> Comma-separated modules or \"all\" (default: all)\\n`\n );\n}\n\nexport function runSetup(options: SetupOptions): void {\n const { client } = options;\n const name = CLIENT_NAMES[client];\n const args = buildArgs(options);\n const serverName = options.profile ? `bithumb-trade-mcp-${options.profile}` : \"bithumb-trade-mcp\";\n\n if (client === \"claude-code\") {\n const claudeArgs = [\n \"mcp\",\n \"add\",\n \"--transport\",\n \"stdio\",\n serverName,\n \"--\",\n \"bithumb-trade-mcp\",\n ...args,\n ];\n process.stdout.write(`Running: claude ${claudeArgs.join(\" \")}\\n`);\n execFileSync(\"claude\", claudeArgs, { stdio: \"inherit\" }); // NOSONAR\n process.stdout.write(`✓ Configured ${name}\\n`);\n return;\n }\n\n const configPath = getConfigPath(client);\n if (!configPath) {\n throw new Error(`${name} is not supported on this platform`);\n }\n\n const entry = buildEntry(client, args);\n mergeJsonConfig(configPath, serverName, entry);\n process.stdout.write(\n `✓ Configured ${name}\\n` +\n ` ${configPath}\\n` +\n ` Server args: ${args.join(\" \")}\\n`\n );\n if (client !== \"vscode\") {\n process.stdout.write(` Restart ${name} to apply changes.\\n`);\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nfunction getLineColFromPtr(string, ptr) {\n let lines = string.slice(0, ptr).split(/\\r\\n|\\n|\\r/g);\n return [lines.length, lines.pop().length + 1];\n}\nfunction makeCodeBlock(string, line, column) {\n let lines = string.split(/\\r\\n|\\n|\\r/g);\n let codeblock = '';\n let numberLen = (Math.log10(line + 1) | 0) + 1;\n for (let i = line - 1; i <= line + 1; i++) {\n let l = lines[i - 1];\n if (!l)\n continue;\n codeblock += i.toString().padEnd(numberLen, ' ');\n codeblock += ': ';\n codeblock += l;\n codeblock += '\\n';\n if (i === line) {\n codeblock += ' '.repeat(numberLen + column + 2);\n codeblock += '^\\n';\n }\n }\n return codeblock;\n}\nexport class TomlError extends Error {\n line;\n column;\n codeblock;\n constructor(message, options) {\n const [line, column] = getLineColFromPtr(options.toml, options.ptr);\n const codeblock = makeCodeBlock(options.toml, line, column);\n super(`Invalid TOML document: ${message}\\n\\n${codeblock}`, options);\n this.line = line;\n this.column = column;\n this.codeblock = codeblock;\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { TomlError } from './error.js';\nfunction isEscaped(str, ptr) {\n let i = 0;\n while (str[ptr - ++i] === '\\\\')\n ;\n return --i && (i % 2);\n}\nexport function indexOfNewline(str, start = 0, end = str.length) {\n let idx = str.indexOf('\\n', start);\n if (str[idx - 1] === '\\r')\n idx--;\n return idx <= end ? idx : -1;\n}\nexport function skipComment(str, ptr) {\n for (let i = ptr; i < str.length; i++) {\n let c = str[i];\n if (c === '\\n')\n return i;\n if (c === '\\r' && str[i + 1] === '\\n')\n return i + 1;\n if ((c < '\\x20' && c !== '\\t') || c === '\\x7f') {\n throw new TomlError('control characters are not allowed in comments', {\n toml: str,\n ptr: ptr,\n });\n }\n }\n return str.length;\n}\nexport function skipVoid(str, ptr, banNewLines, banComments) {\n let c;\n while (1) {\n while ((c = str[ptr]) === ' ' || c === '\\t' || (!banNewLines && (c === '\\n' || c === '\\r' && str[ptr + 1] === '\\n')))\n ptr++;\n // Tucking the return statement here would save 5 characters >:)\n // But TypeScript fails to detect there is no way to exit the loop so it complains about the lack of final return\n if (banComments || c !== '#')\n break;\n ptr = skipComment(str, ptr);\n }\n return ptr;\n}\nexport function skipUntil(str, ptr, sep, end, banNewLines = false) {\n if (!end) {\n ptr = indexOfNewline(str, ptr);\n return ptr < 0 ? str.length : ptr;\n }\n for (let i = ptr; i < str.length; i++) {\n let c = str[i];\n if (c === '#') {\n i = indexOfNewline(str, i);\n }\n else if (c === sep) {\n return i + 1;\n }\n else if (c === end || (banNewLines && (c === '\\n' || (c === '\\r' && str[i + 1] === '\\n')))) {\n return i;\n }\n }\n throw new TomlError('cannot find end of structure', {\n toml: str,\n ptr: ptr\n });\n}\nexport function getStringEnd(str, seek) {\n let first = str[seek];\n let target = first === str[seek + 1] && str[seek + 1] === str[seek + 2]\n ? str.slice(seek, seek + 3)\n : first;\n seek += target.length - 1;\n do\n seek = str.indexOf(target, ++seek);\n while (seek > -1 && first !== \"'\" && isEscaped(str, seek));\n if (seek > -1) {\n seek += target.length;\n if (target.length > 1) {\n if (str[seek] === first)\n seek++;\n if (str[seek] === first)\n seek++;\n }\n }\n return seek;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nlet DATE_TIME_RE = /^(\\d{4}-\\d{2}-\\d{2})?[T ]?(?:(\\d{2}):\\d{2}(?::\\d{2}(?:\\.\\d+)?)?)?(Z|[-+]\\d{2}:\\d{2})?$/i;\nexport class TomlDate extends Date {\n #hasDate = false;\n #hasTime = false;\n #offset = null;\n constructor(date) {\n let hasDate = true;\n let hasTime = true;\n let offset = 'Z';\n if (typeof date === 'string') {\n let match = date.match(DATE_TIME_RE);\n if (match) {\n if (!match[1]) {\n hasDate = false;\n date = `0000-01-01T${date}`;\n }\n hasTime = !!match[2];\n // Make sure to use T instead of a space. Breaks in case of extreme values otherwise.\n hasTime && date[10] === ' ' && (date = date.replace(' ', 'T'));\n // Do not allow rollover hours.\n if (match[2] && +match[2] > 23) {\n date = '';\n }\n else {\n offset = match[3] || null;\n date = date.toUpperCase();\n if (!offset && hasTime)\n date += 'Z';\n }\n }\n else {\n date = '';\n }\n }\n super(date);\n if (!isNaN(this.getTime())) {\n this.#hasDate = hasDate;\n this.#hasTime = hasTime;\n this.#offset = offset;\n }\n }\n isDateTime() {\n return this.#hasDate && this.#hasTime;\n }\n isLocal() {\n return !this.#hasDate || !this.#hasTime || !this.#offset;\n }\n isDate() {\n return this.#hasDate && !this.#hasTime;\n }\n isTime() {\n return this.#hasTime && !this.#hasDate;\n }\n isValid() {\n return this.#hasDate || this.#hasTime;\n }\n toISOString() {\n let iso = super.toISOString();\n // Local Date\n if (this.isDate())\n return iso.slice(0, 10);\n // Local Time\n if (this.isTime())\n return iso.slice(11, 23);\n // Local DateTime\n if (this.#offset === null)\n return iso.slice(0, -1);\n // Offset DateTime\n if (this.#offset === 'Z')\n return iso;\n // This part is quite annoying: JS strips the original timezone from the ISO string representation\n // Instead of using a \"modified\" date and \"Z\", we restore the representation \"as authored\"\n let offset = (+(this.#offset.slice(1, 3)) * 60) + +(this.#offset.slice(4, 6));\n offset = this.#offset[0] === '-' ? offset : -offset;\n let offsetDate = new Date(this.getTime() - (offset * 60e3));\n return offsetDate.toISOString().slice(0, -1) + this.#offset;\n }\n static wrapAsOffsetDateTime(jsDate, offset = 'Z') {\n let date = new TomlDate(jsDate);\n date.#offset = offset;\n return date;\n }\n static wrapAsLocalDateTime(jsDate) {\n let date = new TomlDate(jsDate);\n date.#offset = null;\n return date;\n }\n static wrapAsLocalDate(jsDate) {\n let date = new TomlDate(jsDate);\n date.#hasTime = false;\n date.#offset = null;\n return date;\n }\n static wrapAsLocalTime(jsDate) {\n let date = new TomlDate(jsDate);\n date.#hasDate = false;\n date.#offset = null;\n return date;\n }\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { skipVoid } from './util.js';\nimport { TomlDate } from './date.js';\nimport { TomlError } from './error.js';\nlet INT_REGEX = /^((0x[0-9a-fA-F](_?[0-9a-fA-F])*)|(([+-]|0[ob])?\\d(_?\\d)*))$/;\nlet FLOAT_REGEX = /^[+-]?\\d(_?\\d)*(\\.\\d(_?\\d)*)?([eE][+-]?\\d(_?\\d)*)?$/;\nlet LEADING_ZERO = /^[+-]?0[0-9_]/;\nlet ESCAPE_REGEX = /^[0-9a-f]{2,8}$/i;\nlet ESC_MAP = {\n b: '\\b',\n t: '\\t',\n n: '\\n',\n f: '\\f',\n r: '\\r',\n e: '\\x1b',\n '\"': '\"',\n '\\\\': '\\\\',\n};\nexport function parseString(str, ptr = 0, endPtr = str.length) {\n let isLiteral = str[ptr] === '\\'';\n let isMultiline = str[ptr++] === str[ptr] && str[ptr] === str[ptr + 1];\n if (isMultiline) {\n endPtr -= 2;\n if (str[ptr += 2] === '\\r')\n ptr++;\n if (str[ptr] === '\\n')\n ptr++;\n }\n let tmp = 0;\n let isEscape;\n let parsed = '';\n let sliceStart = ptr;\n while (ptr < endPtr - 1) {\n let c = str[ptr++];\n if (c === '\\n' || (c === '\\r' && str[ptr] === '\\n')) {\n if (!isMultiline) {\n throw new TomlError('newlines are not allowed in strings', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n }\n else if ((c < '\\x20' && c !== '\\t') || c === '\\x7f') {\n throw new TomlError('control characters are not allowed in strings', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n if (isEscape) {\n isEscape = false;\n if (c === 'x' || c === 'u' || c === 'U') {\n // Unicode escape\n let code = str.slice(ptr, (ptr += (c === 'x' ? 2 : c === 'u' ? 4 : 8)));\n if (!ESCAPE_REGEX.test(code)) {\n throw new TomlError('invalid unicode escape', {\n toml: str,\n ptr: tmp,\n });\n }\n try {\n parsed += String.fromCodePoint(parseInt(code, 16));\n }\n catch {\n throw new TomlError('invalid unicode escape', {\n toml: str,\n ptr: tmp,\n });\n }\n }\n else if (isMultiline && (c === '\\n' || c === ' ' || c === '\\t' || c === '\\r')) {\n // Multiline escape\n ptr = skipVoid(str, ptr - 1, true);\n if (str[ptr] !== '\\n' && str[ptr] !== '\\r') {\n throw new TomlError('invalid escape: only line-ending whitespace may be escaped', {\n toml: str,\n ptr: tmp,\n });\n }\n ptr = skipVoid(str, ptr);\n }\n else if (c in ESC_MAP) {\n // Classic escape\n parsed += ESC_MAP[c];\n }\n else {\n throw new TomlError('unrecognized escape sequence', {\n toml: str,\n ptr: tmp,\n });\n }\n sliceStart = ptr;\n }\n else if (!isLiteral && c === '\\\\') {\n tmp = ptr - 1;\n isEscape = true;\n parsed += str.slice(sliceStart, tmp);\n }\n }\n return parsed + str.slice(sliceStart, endPtr - 1);\n}\nexport function parseValue(value, toml, ptr, integersAsBigInt) {\n // Constant values\n if (value === 'true')\n return true;\n if (value === 'false')\n return false;\n if (value === '-inf')\n return -Infinity;\n if (value === 'inf' || value === '+inf')\n return Infinity;\n if (value === 'nan' || value === '+nan' || value === '-nan')\n return NaN;\n // Avoid FP representation of -0\n if (value === '-0')\n return integersAsBigInt ? 0n : 0;\n // Numbers\n let isInt = INT_REGEX.test(value);\n if (isInt || FLOAT_REGEX.test(value)) {\n if (LEADING_ZERO.test(value)) {\n throw new TomlError('leading zeroes are not allowed', {\n toml: toml,\n ptr: ptr,\n });\n }\n value = value.replace(/_/g, '');\n let numeric = +value;\n if (isNaN(numeric)) {\n throw new TomlError('invalid number', {\n toml: toml,\n ptr: ptr,\n });\n }\n if (isInt) {\n if ((isInt = !Number.isSafeInteger(numeric)) && !integersAsBigInt) {\n throw new TomlError('integer value cannot be represented losslessly', {\n toml: toml,\n ptr: ptr,\n });\n }\n if (isInt || integersAsBigInt === true)\n numeric = BigInt(value);\n }\n return numeric;\n }\n const date = new TomlDate(value);\n if (!date.isValid()) {\n throw new TomlError('invalid value', {\n toml: toml,\n ptr: ptr,\n });\n }\n return date;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseString, parseValue } from './primitive.js';\nimport { parseArray, parseInlineTable } from './struct.js';\nimport { skipVoid, skipUntil, skipComment, getStringEnd } from './util.js';\nimport { TomlError } from './error.js';\nfunction sliceAndTrimEndOf(str, startPtr, endPtr) {\n let value = str.slice(startPtr, endPtr);\n let commentIdx = value.indexOf('#');\n if (commentIdx > -1) {\n // The call to skipComment allows to \"validate\" the comment\n // (absence of control characters)\n skipComment(str, commentIdx);\n value = value.slice(0, commentIdx);\n }\n return [value.trimEnd(), commentIdx];\n}\nexport function extractValue(str, ptr, end, depth, integersAsBigInt) {\n if (depth === 0) {\n throw new TomlError('document contains excessively nested structures. aborting.', {\n toml: str,\n ptr: ptr\n });\n }\n let c = str[ptr];\n if (c === '[' || c === '{') {\n let [value, endPtr] = c === '['\n ? parseArray(str, ptr, depth, integersAsBigInt)\n : parseInlineTable(str, ptr, depth, integersAsBigInt);\n if (end) {\n endPtr = skipVoid(str, endPtr);\n if (str[endPtr] === ',')\n endPtr++;\n else if (str[endPtr] !== end) {\n throw new TomlError('expected comma or end of structure', {\n toml: str,\n ptr: endPtr,\n });\n }\n }\n return [value, endPtr];\n }\n let endPtr;\n if (c === '\"' || c === \"'\") {\n endPtr = getStringEnd(str, ptr);\n let parsed = parseString(str, ptr, endPtr);\n if (end) {\n endPtr = skipVoid(str, endPtr);\n if (str[endPtr] && str[endPtr] !== ',' && str[endPtr] !== end && str[endPtr] !== '\\n' && str[endPtr] !== '\\r') {\n throw new TomlError('unexpected character encountered', {\n toml: str,\n ptr: endPtr,\n });\n }\n endPtr += (+(str[endPtr] === ','));\n }\n return [parsed, endPtr];\n }\n endPtr = skipUntil(str, ptr, ',', end);\n let slice = sliceAndTrimEndOf(str, ptr, endPtr - (+(str[endPtr - 1] === ',')));\n if (!slice[0]) {\n throw new TomlError('incomplete key-value declaration: no value specified', {\n toml: str,\n ptr: ptr\n });\n }\n if (end && slice[1] > -1) {\n endPtr = skipVoid(str, ptr + slice[1]);\n endPtr += +(str[endPtr] === ',');\n }\n return [\n parseValue(slice[0], str, ptr, integersAsBigInt),\n endPtr,\n ];\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseString } from './primitive.js';\nimport { extractValue } from './extract.js';\nimport { getStringEnd, indexOfNewline, skipComment, skipVoid } from './util.js';\nimport { TomlError } from './error.js';\nlet KEY_PART_RE = /^[a-zA-Z0-9-_]+[ \\t]*$/;\nexport function parseKey(str, ptr, end = '=') {\n let dot = ptr - 1;\n let parsed = [];\n let endPtr = str.indexOf(end, ptr);\n if (endPtr < 0) {\n throw new TomlError('incomplete key-value: cannot find end of key', {\n toml: str,\n ptr: ptr,\n });\n }\n do {\n let c = str[ptr = ++dot];\n // If it's whitespace, ignore\n if (c !== ' ' && c !== '\\t') {\n // If it's a string\n if (c === '\"' || c === '\\'') {\n if (c === str[ptr + 1] && c === str[ptr + 2]) {\n throw new TomlError('multiline strings are not allowed in keys', {\n toml: str,\n ptr: ptr,\n });\n }\n let eos = getStringEnd(str, ptr);\n if (eos < 0) {\n throw new TomlError('unfinished string encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n dot = str.indexOf('.', eos);\n let strEnd = str.slice(eos, dot < 0 || dot > endPtr ? endPtr : dot);\n let newLine = indexOfNewline(strEnd);\n if (newLine > -1) {\n throw new TomlError('newlines are not allowed in keys', {\n toml: str,\n ptr: ptr + dot + newLine,\n });\n }\n if (strEnd.trimStart()) {\n throw new TomlError('found extra tokens after the string part', {\n toml: str,\n ptr: eos,\n });\n }\n if (endPtr < eos) {\n endPtr = str.indexOf(end, eos);\n if (endPtr < 0) {\n throw new TomlError('incomplete key-value: cannot find end of key', {\n toml: str,\n ptr: ptr,\n });\n }\n }\n parsed.push(parseString(str, ptr, eos));\n }\n else {\n // Normal raw key part consumption and validation\n dot = str.indexOf('.', ptr);\n let part = str.slice(ptr, dot < 0 || dot > endPtr ? endPtr : dot);\n if (!KEY_PART_RE.test(part)) {\n throw new TomlError('only letter, numbers, dashes and underscores are allowed in keys', {\n toml: str,\n ptr: ptr,\n });\n }\n parsed.push(part.trimEnd());\n }\n }\n // Until there's no more dot\n } while (dot + 1 && dot < endPtr);\n return [parsed, skipVoid(str, endPtr + 1, true, true)];\n}\nexport function parseInlineTable(str, ptr, depth, integersAsBigInt) {\n let res = {};\n let seen = new Set();\n let c;\n ptr++;\n while ((c = str[ptr++]) !== '}' && c) {\n if (c === ',') {\n throw new TomlError('expected value, found comma', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n else if (c === '#')\n ptr = skipComment(str, ptr);\n else if (c !== ' ' && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n let k;\n let t = res;\n let hasOwn = false;\n let [key, keyEndPtr] = parseKey(str, ptr - 1);\n for (let i = 0; i < key.length; i++) {\n if (i)\n t = hasOwn ? t[k] : (t[k] = {});\n k = key[i];\n if ((hasOwn = Object.hasOwn(t, k)) && (typeof t[k] !== 'object' || seen.has(t[k]))) {\n throw new TomlError('trying to redefine an already defined value', {\n toml: str,\n ptr: ptr,\n });\n }\n if (!hasOwn && k === '__proto__') {\n Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true });\n }\n }\n if (hasOwn) {\n throw new TomlError('trying to redefine an already defined value', {\n toml: str,\n ptr: ptr,\n });\n }\n let [value, valueEndPtr] = extractValue(str, keyEndPtr, '}', depth - 1, integersAsBigInt);\n seen.add(value);\n t[k] = value;\n ptr = valueEndPtr;\n }\n }\n if (!c) {\n throw new TomlError('unfinished table encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n return [res, ptr];\n}\nexport function parseArray(str, ptr, depth, integersAsBigInt) {\n let res = [];\n let c;\n ptr++;\n while ((c = str[ptr++]) !== ']' && c) {\n if (c === ',') {\n throw new TomlError('expected value, found comma', {\n toml: str,\n ptr: ptr - 1,\n });\n }\n else if (c === '#')\n ptr = skipComment(str, ptr);\n else if (c !== ' ' && c !== '\\t' && c !== '\\n' && c !== '\\r') {\n let e = extractValue(str, ptr - 1, ']', depth - 1, integersAsBigInt);\n res.push(e[0]);\n ptr = e[1];\n }\n }\n if (!c) {\n throw new TomlError('unfinished array encountered', {\n toml: str,\n ptr: ptr,\n });\n }\n return [res, ptr];\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nimport { parseKey } from './struct.js';\nimport { extractValue } from './extract.js';\nimport { skipVoid } from './util.js';\nimport { TomlError } from './error.js';\nfunction peekTable(key, table, meta, type) {\n let t = table;\n let m = meta;\n let k;\n let hasOwn = false;\n let state;\n for (let i = 0; i < key.length; i++) {\n if (i) {\n t = hasOwn ? t[k] : (t[k] = {});\n m = (state = m[k]).c;\n if (type === 0 /* Type.DOTTED */ && (state.t === 1 /* Type.EXPLICIT */ || state.t === 2 /* Type.ARRAY */)) {\n return null;\n }\n if (state.t === 2 /* Type.ARRAY */) {\n let l = t.length - 1;\n t = t[l];\n m = m[l].c;\n }\n }\n k = key[i];\n if ((hasOwn = Object.hasOwn(t, k)) && m[k]?.t === 0 /* Type.DOTTED */ && m[k]?.d) {\n return null;\n }\n if (!hasOwn) {\n if (k === '__proto__') {\n Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true });\n Object.defineProperty(m, k, { enumerable: true, configurable: true, writable: true });\n }\n m[k] = {\n t: i < key.length - 1 && type === 2 /* Type.ARRAY */\n ? 3 /* Type.ARRAY_DOTTED */\n : type,\n d: false,\n i: 0,\n c: {},\n };\n }\n }\n state = m[k];\n if (state.t !== type && !(type === 1 /* Type.EXPLICIT */ && state.t === 3 /* Type.ARRAY_DOTTED */)) {\n // Bad key type!\n return null;\n }\n if (type === 2 /* Type.ARRAY */) {\n if (!state.d) {\n state.d = true;\n t[k] = [];\n }\n t[k].push(t = {});\n state.c[state.i++] = (state = { t: 1 /* Type.EXPLICIT */, d: false, i: 0, c: {} });\n }\n if (state.d) {\n // Redefining a table!\n return null;\n }\n state.d = true;\n if (type === 1 /* Type.EXPLICIT */) {\n t = hasOwn ? t[k] : (t[k] = {});\n }\n else if (type === 0 /* Type.DOTTED */ && hasOwn) {\n return null;\n }\n return [k, t, state.c];\n}\nexport function parse(toml, { maxDepth = 1000, integersAsBigInt } = {}) {\n let res = {};\n let meta = {};\n let tbl = res;\n let m = meta;\n for (let ptr = skipVoid(toml, 0); ptr < toml.length;) {\n if (toml[ptr] === '[') {\n let isTableArray = toml[++ptr] === '[';\n let k = parseKey(toml, ptr += +isTableArray, ']');\n if (isTableArray) {\n if (toml[k[1] - 1] !== ']') {\n throw new TomlError('expected end of table declaration', {\n toml: toml,\n ptr: k[1] - 1,\n });\n }\n k[1]++;\n }\n let p = peekTable(k[0], res, meta, isTableArray ? 2 /* Type.ARRAY */ : 1 /* Type.EXPLICIT */);\n if (!p) {\n throw new TomlError('trying to redefine an already defined table or value', {\n toml: toml,\n ptr: ptr,\n });\n }\n m = p[2];\n tbl = p[1];\n ptr = k[1];\n }\n else {\n let k = parseKey(toml, ptr);\n let p = peekTable(k[0], tbl, m, 0 /* Type.DOTTED */);\n if (!p) {\n throw new TomlError('trying to redefine an already defined table or value', {\n toml: toml,\n ptr: ptr,\n });\n }\n let v = extractValue(toml, k[1], void 0, maxDepth, integersAsBigInt);\n p[1][p[0]] = v[0];\n ptr = v[1];\n }\n ptr = skipVoid(toml, ptr, true);\n if (toml[ptr] && toml[ptr] !== '\\n' && toml[ptr] !== '\\r') {\n throw new TomlError('each key-value declaration must be followed by an end-of-line', {\n toml: toml,\n ptr: ptr\n });\n }\n ptr = skipVoid(toml, ptr);\n }\n return res;\n}\n","/*!\n * Copyright (c) Squirrel Chat et al., All rights reserved.\n * SPDX-License-Identifier: BSD-3-Clause\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n * list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors\n * may be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\nlet BARE_KEY = /^[a-z0-9-_]+$/i;\nfunction extendedTypeOf(obj) {\n let type = typeof obj;\n if (type === 'object') {\n if (Array.isArray(obj))\n return 'array';\n if (obj instanceof Date)\n return 'date';\n }\n return type;\n}\nfunction isArrayOfTables(obj) {\n for (let i = 0; i < obj.length; i++) {\n if (extendedTypeOf(obj[i]) !== 'object')\n return false;\n }\n return obj.length != 0;\n}\nfunction formatString(s) {\n return JSON.stringify(s).replace(/\\x7f/g, '\\\\u007f');\n}\nfunction stringifyValue(val, type, depth, numberAsFloat) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n if (type === 'number') {\n if (isNaN(val))\n return 'nan';\n if (val === Infinity)\n return 'inf';\n if (val === -Infinity)\n return '-inf';\n if (numberAsFloat && Number.isInteger(val))\n return val.toFixed(1);\n return val.toString();\n }\n if (type === 'bigint' || type === 'boolean') {\n return val.toString();\n }\n if (type === 'string') {\n return formatString(val);\n }\n if (type === 'date') {\n if (isNaN(val.getTime())) {\n throw new TypeError('cannot serialize invalid date');\n }\n return val.toISOString();\n }\n if (type === 'object') {\n return stringifyInlineTable(val, depth, numberAsFloat);\n }\n if (type === 'array') {\n return stringifyArray(val, depth, numberAsFloat);\n }\n}\nfunction stringifyInlineTable(obj, depth, numberAsFloat) {\n let keys = Object.keys(obj);\n if (keys.length === 0)\n return '{}';\n let res = '{ ';\n for (let i = 0; i < keys.length; i++) {\n let k = keys[i];\n if (i)\n res += ', ';\n res += BARE_KEY.test(k) ? k : formatString(k);\n res += ' = ';\n res += stringifyValue(obj[k], extendedTypeOf(obj[k]), depth - 1, numberAsFloat);\n }\n return res + ' }';\n}\nfunction stringifyArray(array, depth, numberAsFloat) {\n if (array.length === 0)\n return '[]';\n let res = '[ ';\n for (let i = 0; i < array.length; i++) {\n if (i)\n res += ', ';\n if (array[i] === null || array[i] === void 0) {\n throw new TypeError('arrays cannot contain null or undefined values');\n }\n res += stringifyValue(array[i], extendedTypeOf(array[i]), depth - 1, numberAsFloat);\n }\n return res + ' ]';\n}\nfunction stringifyArrayTable(array, key, depth, numberAsFloat) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n let res = '';\n for (let i = 0; i < array.length; i++) {\n res += `${res && '\\n'}[[${key}]]\\n`;\n res += stringifyTable(0, array[i], key, depth, numberAsFloat);\n }\n return res;\n}\nfunction stringifyTable(tableKey, obj, prefix, depth, numberAsFloat) {\n if (depth === 0) {\n throw new Error('Could not stringify the object: maximum object depth exceeded');\n }\n let preamble = '';\n let tables = '';\n let keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n let k = keys[i];\n if (obj[k] !== null && obj[k] !== void 0) {\n let type = extendedTypeOf(obj[k]);\n if (type === 'symbol' || type === 'function') {\n throw new TypeError(`cannot serialize values of type '${type}'`);\n }\n let key = BARE_KEY.test(k) ? k : formatString(k);\n if (type === 'array' && isArrayOfTables(obj[k])) {\n tables += (tables && '\\n') + stringifyArrayTable(obj[k], prefix ? `${prefix}.${key}` : key, depth - 1, numberAsFloat);\n }\n else if (type === 'object') {\n let tblKey = prefix ? `${prefix}.${key}` : key;\n tables += (tables && '\\n') + stringifyTable(tblKey, obj[k], tblKey, depth - 1, numberAsFloat);\n }\n else {\n preamble += key;\n preamble += ' = ';\n preamble += stringifyValue(obj[k], type, depth, numberAsFloat);\n preamble += '\\n';\n }\n }\n }\n if (tableKey && (preamble || !tables)) // Create table only if necessary\n preamble = preamble ? `[${tableKey}]\\n${preamble}` : `[${tableKey}]`;\n return preamble && tables\n ? `${preamble}\\n${tables}`\n : preamble || tables;\n}\nexport function stringify(obj, { maxDepth = 1000, numbersAsFloat = false } = {}) {\n if (extendedTypeOf(obj) !== 'object') {\n throw new TypeError('stringify can only be called with an object');\n }\n let str = stringifyTable(0, obj, '', maxDepth, numbersAsFloat);\n if (str[str.length - 1] !== '\\n')\n return str + '\\n';\n return str;\n}\n"],"mappings":"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","names":["existsSync","join","homedir","endPtr","mkdirSync","homedir","join","existsSync","readFileSync","writeFileSync","fs","path","os","path","join","homedir","path","existsSync","mkdirSync","parse","readFileSync","writeFileSync"]}