@stephendolan/chartmogul-cli 1.2.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -18,7 +18,7 @@ A command-line interface for ChartMogul analytics, designed for developers and L
18
18
  npm install -g @stephendolan/chartmogul-cli
19
19
  ```
20
20
 
21
- On Linux, install libsecret for keychain support: `sudo apt-get install libsecret-1-dev`
21
+ **Linux**: Install libsecret for keychain support: `sudo apt-get install libsecret-1-dev`
22
22
 
23
23
  ## Authentication
24
24
 
@@ -30,7 +30,7 @@ chartmogul auth logout
30
30
 
31
31
  Or use the environment variable: `export CHARTMOGUL_API_KEY=your_api_key`
32
32
 
33
- Get your API key from ChartMogul: Profile -> API Keys
33
+ Get your API key from ChartMogul under Profile -> API Keys.
34
34
 
35
35
  ## Commands
36
36
 
@@ -58,6 +58,7 @@ chartmogul metrics mrr --start-date 2024-01-01 --end-date 2024-12-31 --interval
58
58
  ```bash
59
59
  chartmogul customers list # List all customers
60
60
  chartmogul customers list --status Active # Filter by status
61
+ chartmogul customers list --data-source <uuid> # Filter by data source
61
62
  chartmogul customers view <uuid> # View customer details
62
63
  chartmogul customers search --email user@example.com
63
64
  chartmogul customers activities <uuid> # Customer activities
@@ -83,10 +84,20 @@ chartmogul invoices view <uuid>
83
84
  chartmogul data-sources list
84
85
  chartmogul data-sources view <uuid>
85
86
  chartmogul data-sources set-default <uuid>
87
+ chartmogul data-sources get-default
86
88
 
87
89
  # Activities
88
90
  chartmogul activities list
89
91
  chartmogul activities list --type new_biz --start-date 2024-01-01
92
+ # Activity types: new_biz, expansion, contraction, churn, reactivation
93
+ ```
94
+
95
+ ### MCP Server
96
+
97
+ Run as an MCP server for AI agent integration:
98
+
99
+ ```bash
100
+ chartmogul mcp
90
101
  ```
91
102
 
92
103
  ## Output
package/dist/cli.js CHANGED
@@ -19,6 +19,9 @@ var CENTS_FIELDS = /* @__PURE__ */ new Set([
19
19
  "activity_mrr",
20
20
  "activity_arr",
21
21
  "activity_mrr_movement",
22
+ "activity-mrr",
23
+ "activity-arr",
24
+ "activity-mrr-movement",
22
25
  "new-biz",
23
26
  "expansion",
24
27
  "contraction",
@@ -28,6 +31,9 @@ var CENTS_FIELDS = /* @__PURE__ */ new Set([
28
31
  function isCentsField(fieldName) {
29
32
  return CENTS_FIELDS.has(fieldName) || fieldName.endsWith("_in_cents");
30
33
  }
34
+ function normalizeFieldName(fieldName) {
35
+ return fieldName.replace(/_in_cents$/, "");
36
+ }
31
37
  function convertCentsToDollars(data) {
32
38
  if (data === null || data === void 0) return data;
33
39
  if (Array.isArray(data)) return data.map(convertCentsToDollars);
@@ -35,7 +41,7 @@ function convertCentsToDollars(data) {
35
41
  const converted = {};
36
42
  for (const [key, value] of Object.entries(data)) {
37
43
  if (isCentsField(key) && typeof value === "number") {
38
- converted[key] = centsToDollars(value);
44
+ converted[normalizeFieldName(key)] = centsToDollars(value);
39
45
  } else {
40
46
  converted[key] = convertCentsToDollars(value);
41
47
  }
@@ -214,6 +220,12 @@ function handleChartMogulError(error) {
214
220
 
215
221
  // src/lib/api-client.ts
216
222
  var API_BASE = "https://api.chartmogul.com/v1";
223
+ var MS_PER_MONTH = 1e3 * 60 * 60 * 24 * 30.44;
224
+ function calculateTenureMonths(activityDate, customerSince) {
225
+ return Math.round(
226
+ (new Date(activityDate).getTime() - new Date(customerSince).getTime()) / MS_PER_MONTH
227
+ );
228
+ }
217
229
  var ChartMogulClient = class {
218
230
  getAuthHeader() {
219
231
  const apiKey = auth.getApiKey();
@@ -289,6 +301,12 @@ var ChartMogulClient = class {
289
301
  params: { email }
290
302
  });
291
303
  }
304
+ async getCustomersBatch(uuids) {
305
+ const results = await Promise.all(
306
+ uuids.map((uuid) => this.getCustomer(uuid).catch(() => null))
307
+ );
308
+ return results.filter((c) => c !== null);
309
+ }
292
310
  async getCustomerActivities(uuid, params = {}) {
293
311
  return this.request("GET", `/customers/${uuid}/activities`, {
294
312
  params
@@ -343,6 +361,28 @@ var ChartMogulClient = class {
343
361
  async listActivities(params = {}) {
344
362
  return this.request("GET", "/activities", { params });
345
363
  }
364
+ async listActivitiesEnriched(params = {}) {
365
+ const activities = await this.listActivities(params);
366
+ const uniqueCustomerUuids = [
367
+ ...new Set(activities.entries.map((a) => a["customer-uuid"]).filter(Boolean))
368
+ ];
369
+ const customers = await this.getCustomersBatch(uniqueCustomerUuids);
370
+ const customerMap = new Map(customers.map((c) => [c.uuid, c]));
371
+ const enrichedEntries = activities.entries.map((activity) => {
372
+ const customer = customerMap.get(activity["customer-uuid"]);
373
+ const customerSince = customer?.["customer-since"] ?? customer?.customer_since;
374
+ const tenureMonths = customerSince ? calculateTenureMonths(activity.date, customerSince) : void 0;
375
+ return {
376
+ ...activity,
377
+ "customer-since": customerSince,
378
+ "customer-tenure-months": tenureMonths
379
+ };
380
+ });
381
+ return {
382
+ ...activities,
383
+ entries: enrichedEntries
384
+ };
385
+ }
346
386
  };
347
387
  var client = new ChartMogulClient();
348
388
 
@@ -616,16 +656,17 @@ function createMetricsCommand() {
616
656
  import { Command as Command8 } from "commander";
617
657
  function createActivitiesCommand() {
618
658
  const cmd = new Command8("activities").description("Activity operations");
619
- cmd.command("list").description("List activities").option("--start-date <date>", "Start date (YYYY-MM-DD)").option("--end-date <date>", "End date (YYYY-MM-DD)").option("--type <type>", "Activity type (new_biz, expansion, contraction, churn, reactivation)").option("--page <number>", "Page number").option("--per-page <number>", "Results per page").action(
659
+ cmd.command("list").description("List activities").option("--start-date <date>", "Start date (YYYY-MM-DD)").option("--end-date <date>", "End date (YYYY-MM-DD)").option("--type <type>", "Activity type (new_biz, expansion, contraction, churn, reactivation)").option("--page <number>", "Page number").option("--per-page <number>", "Results per page").option("--enrich", "Include customer tenure data (customer-since, customer-tenure-months)").action(
620
660
  withErrorHandling(
621
661
  async (options) => {
622
- const result = await client.listActivities({
662
+ const params = {
623
663
  "start-date": options.startDate,
624
664
  "end-date": options.endDate,
625
665
  type: options.type,
626
666
  page: options.page ? parseInt(options.page, 10) : void 0,
627
667
  per_page: options.perPage ? parseInt(options.perPage, 10) : void 0
628
- });
668
+ };
669
+ const result = options.enrich ? await client.listActivitiesEnriched(params) : await client.listActivities(params);
629
670
  outputJson(result);
630
671
  }
631
672
  )
@@ -711,9 +752,14 @@ server.tool(
711
752
  endDate: z.string().optional().describe("End date (YYYY-MM-DD)"),
712
753
  type: z.enum(["new-biz", "expansion", "contraction", "churn", "reactivation"]).optional().describe("Activity type filter"),
713
754
  page: z.number().optional().describe("Page number"),
714
- perPage: z.number().optional().describe("Results per page")
755
+ perPage: z.number().optional().describe("Results per page"),
756
+ enrich: z.boolean().optional().describe("Include customer tenure data (customer-since, customer-tenure-months)")
715
757
  },
716
- async ({ startDate, endDate, type, page, perPage }) => jsonResponse(await client.listActivities({ "start-date": startDate, "end-date": endDate, type, page, per_page: perPage }))
758
+ async ({ startDate, endDate, type, page, perPage, enrich }) => {
759
+ const params = { "start-date": startDate, "end-date": endDate, type, page, per_page: perPage };
760
+ const result = enrich ? await client.listActivitiesEnriched(params) : await client.listActivities(params);
761
+ return jsonResponse(result);
762
+ }
717
763
  );
718
764
  server.tool(
719
765
  "search_customers",
@@ -727,6 +773,12 @@ server.tool(
727
773
  { uuid: z.string().describe("Customer UUID") },
728
774
  async ({ uuid }) => jsonResponse(await client.getCustomer(uuid))
729
775
  );
776
+ server.tool(
777
+ "get_customers_batch",
778
+ "Get detailed information about multiple customers in one call",
779
+ { uuids: z.array(z.string()).describe("Array of customer UUIDs") },
780
+ async ({ uuids }) => jsonResponse(await client.getCustomersBatch(uuids))
781
+ );
730
782
  server.tool(
731
783
  "get_customer_activities",
732
784
  "Get subscription activities for a specific customer",
@@ -780,7 +832,7 @@ function createMcpCommand() {
780
832
  }
781
833
 
782
834
  // src/cli.ts
783
- var version = true ? "1.2.0" : "0.0.0-dev";
835
+ var version = true ? "1.4.0" : "0.0.0-dev";
784
836
  var program = new Command10();
785
837
  program.name("chartmogul").description("A command-line interface for ChartMogul analytics").version(version).option("-c, --compact", "Minified JSON output (single line)").hook("preAction", (thisCommand) => {
786
838
  const options = thisCommand.opts();
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/lib/utils.ts","../src/lib/output.ts","../src/commands/auth.ts","../src/lib/auth.ts","../src/lib/config.ts","../src/lib/errors.ts","../src/lib/api-client.ts","../src/lib/command-utils.ts","../src/commands/account.ts","../src/commands/data-sources.ts","../src/commands/customers.ts","../src/commands/plans.ts","../src/commands/invoices.ts","../src/commands/metrics.ts","../src/lib/dates.ts","../src/commands/activities.ts","../src/commands/mcp.ts","../src/mcp/server.ts"],"sourcesContent":["#!/usr/bin/env bun\n\nimport { Command } from 'commander';\nimport { setOutputOptions } from './lib/output.js';\nimport { createAuthCommand } from './commands/auth.js';\nimport { createAccountCommand } from './commands/account.js';\nimport { createDataSourcesCommand } from './commands/data-sources.js';\nimport { createCustomersCommand } from './commands/customers.js';\nimport { createPlansCommand } from './commands/plans.js';\nimport { createInvoicesCommand } from './commands/invoices.js';\nimport { createMetricsCommand } from './commands/metrics.js';\nimport { createActivitiesCommand } from './commands/activities.js';\nimport { createMcpCommand } from './commands/mcp.js';\n\ndeclare const __VERSION__: string | undefined;\n\nconst version = typeof __VERSION__ !== 'undefined' ? __VERSION__ : '0.0.0-dev';\n\nconst program = new Command();\n\nprogram\n .name('chartmogul')\n .description('A command-line interface for ChartMogul analytics')\n .version(version)\n .option('-c, --compact', 'Minified JSON output (single line)')\n .hook('preAction', (thisCommand) => {\n const options = thisCommand.opts();\n setOutputOptions({\n compact: options.compact,\n });\n });\n\nprogram.addCommand(createAuthCommand());\nprogram.addCommand(createAccountCommand());\nprogram.addCommand(createDataSourcesCommand());\nprogram.addCommand(createCustomersCommand());\nprogram.addCommand(createPlansCommand());\nprogram.addCommand(createInvoicesCommand());\nprogram.addCommand(createMetricsCommand());\nprogram.addCommand(createActivitiesCommand());\nprogram.addCommand(createMcpCommand());\n\nprogram.parseAsync().catch(() => {\n process.exit(1);\n});\n","function centsToDollars(cents: number): number {\n return cents / 100;\n}\n\nconst CENTS_FIELDS = new Set([\n 'amount_in_cents',\n 'discount_amount_in_cents',\n 'tax_amount_in_cents',\n 'mrr',\n 'arr',\n 'arpa',\n 'asp',\n 'ltv',\n 'activity_mrr',\n 'activity_arr',\n 'activity_mrr_movement',\n 'new-biz',\n 'expansion',\n 'contraction',\n 'churn',\n 'reactivation',\n]);\n\nfunction isCentsField(fieldName: string): boolean {\n return CENTS_FIELDS.has(fieldName) || fieldName.endsWith('_in_cents');\n}\n\nexport function convertCentsToDollars(data: unknown): unknown {\n if (data === null || data === undefined) return data;\n if (Array.isArray(data)) return data.map(convertCentsToDollars);\n if (typeof data !== 'object') return data;\n\n const converted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n if (isCentsField(key) && typeof value === 'number') {\n converted[key] = centsToDollars(value);\n } else {\n converted[key] = convertCentsToDollars(value);\n }\n }\n return converted;\n}\n","import type { OutputOptions } from '../types/index.js';\nimport { convertCentsToDollars } from './utils.js';\n\nlet globalOutputOptions: OutputOptions = {};\n\nexport function setOutputOptions(options: OutputOptions): void {\n globalOutputOptions = options;\n}\n\nexport function outputJson(data: unknown, options: OutputOptions = {}): void {\n const convertedData = convertCentsToDollars(data);\n const mergedOptions = { ...globalOutputOptions, ...options };\n\n const jsonString = mergedOptions.compact\n ? JSON.stringify(convertedData)\n : JSON.stringify(convertedData, null, 2);\n\n console.log(jsonString);\n}\n","import { Command } from 'commander';\nimport { auth } from '../lib/auth.js';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createAuthCommand(): Command {\n const cmd = new Command('auth').description('Authentication operations');\n\n cmd\n .command('login')\n .description('Configure ChartMogul API credentials')\n .requiredOption('--api-key <key>', 'ChartMogul API Key')\n .action(\n withErrorHandling(async (options: { apiKey: string }) => {\n auth.setApiKey(options.apiKey);\n await client.ping();\n outputJson({ message: 'Successfully authenticated with ChartMogul' });\n })\n );\n\n cmd\n .command('logout')\n .description('Remove stored credentials')\n .action(\n withErrorHandling(async () => {\n auth.logout();\n outputJson({ message: 'Logged out successfully' });\n })\n );\n\n cmd\n .command('status')\n .description('Check authentication status')\n .action(\n withErrorHandling(async () => {\n outputJson({ authenticated: auth.isAuthenticated() });\n })\n );\n\n return cmd;\n}\n","import { Entry } from '@napi-rs/keyring';\nimport { config } from './config.js';\n\nconst SERVICE_NAME = 'chartmogul-cli';\nconst API_KEY_ACCOUNT = 'api-key';\n\nconst KEYRING_UNAVAILABLE_ERROR =\n 'Keychain storage unavailable. Cannot store credentials securely.\\n' +\n 'On Linux, install libsecret: sudo apt-get install libsecret-1-dev\\n' +\n 'Then reinstall: bun install -g @stephendolan/chartmogul-cli\\n' +\n 'Alternatively, use CHARTMOGUL_API_KEY environment variable.';\n\nfunction getKeyring(account: string): Entry | null {\n try {\n return new Entry(SERVICE_NAME, account);\n } catch {\n return null;\n }\n}\n\nfunction getPassword(account: string): string | null {\n const entry = getKeyring(account);\n if (entry) {\n try {\n return entry.getPassword();\n } catch {\n return null;\n }\n }\n return null;\n}\n\nfunction setPassword(account: string, value: string): void {\n const entry = getKeyring(account);\n if (!entry) {\n throw new Error(KEYRING_UNAVAILABLE_ERROR);\n }\n entry.setPassword(value);\n}\n\nfunction deletePassword(account: string): boolean {\n const entry = getKeyring(account);\n if (entry) {\n return entry.deletePassword();\n }\n return false;\n}\n\nexport class AuthManager {\n getApiKey(): string | null {\n return getPassword(API_KEY_ACCOUNT) || process.env.CHARTMOGUL_API_KEY || null;\n }\n\n setApiKey(apiKey: string): void {\n setPassword(API_KEY_ACCOUNT, apiKey);\n }\n\n isAuthenticated(): boolean {\n return this.getApiKey() !== null;\n }\n\n logout(): void {\n deletePassword(API_KEY_ACCOUNT);\n config.clearDefaultDataSource();\n }\n}\n\nexport const auth = new AuthManager();\n","import Conf from 'conf';\n\ninterface ConfigSchema {\n defaultDataSource?: string;\n}\n\nconst store = new Conf<ConfigSchema>({\n projectName: 'chartmogul-cli',\n});\n\nexport const config = {\n getDefaultDataSource(): string | undefined {\n return store.get('defaultDataSource') || process.env.CHARTMOGUL_DATA_SOURCE;\n },\n\n setDefaultDataSource(dataSourceUuid: string): void {\n store.set('defaultDataSource', dataSourceUuid);\n },\n\n clearDefaultDataSource(): void {\n store.delete('defaultDataSource');\n },\n\n clear(): void {\n store.clear();\n },\n};\n","import type { ChartMogulError } from '../types/index.js';\nimport { outputJson } from './output.js';\n\nexport class ChartMogulCliError extends Error {\n constructor(\n message: string,\n public statusCode?: number\n ) {\n super(message);\n this.name = 'ChartMogulCliError';\n }\n}\n\nexport class ChartMogulApiError extends Error {\n constructor(\n message: string,\n public apiError: unknown,\n public statusCode: number\n ) {\n super(message);\n this.name = 'ChartMogulApiError';\n }\n}\n\nexport function sanitizeErrorMessage(message: string): string {\n const sensitivePatterns = [\n /Bearer\\s+[\\w\\-._~+/]+=*/gi,\n /token[=:]\\s*[\\w\\-._~+/]+=*/gi,\n /api[_-]?key[=:]\\s*[\\w\\-._~+/]+=*/gi,\n /authorization:\\s*basic\\s+[\\w\\-._~+/]+=*/gi,\n ];\n\n let sanitized = message;\n for (const pattern of sensitivePatterns) {\n sanitized = sanitized.replace(pattern, '[REDACTED]');\n }\n\n return sanitized.length > 500 ? sanitized.substring(0, 500) + '...' : sanitized;\n}\n\ninterface ApiErrorResponse {\n error?: string;\n message?: string;\n errors?: Array<{\n key?: string;\n message?: string;\n }>;\n}\n\nfunction isErrorObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nexport function sanitizeApiError(error: unknown): ChartMogulError {\n if (!isErrorObject(error)) {\n return {\n name: 'api_error',\n detail: 'An error occurred',\n };\n }\n\n const apiError = error as ApiErrorResponse;\n\n let detail = 'An error occurred';\n if (apiError.message) {\n detail = apiError.message;\n } else if (apiError.errors?.length) {\n detail = apiError.errors\n .map((e) => e.message || e.key)\n .filter(Boolean)\n .join('; ');\n }\n\n return {\n name: apiError.error || 'api_error',\n detail: sanitizeErrorMessage(detail),\n };\n}\n\nfunction formatErrorResponse(name: string, detail: string, statusCode: number): never {\n const hint =\n name === 'too_many_requests'\n ? 'ChartMogul API rate limit exceeded. Wait a moment and retry.'\n : undefined;\n\n const response: { error: { name: string; detail: string; statusCode: number }; hint?: string } = {\n error: { name, detail, statusCode },\n };\n\n if (hint) {\n response.hint = hint;\n }\n\n outputJson(response);\n process.exit(1);\n}\n\nexport function handleChartMogulError(error: unknown): never {\n if (error instanceof ChartMogulCliError) {\n const sanitized = sanitizeErrorMessage(error.message);\n formatErrorResponse('cli_error', sanitized, error.statusCode || 1);\n }\n\n if (error instanceof ChartMogulApiError) {\n const cmError = sanitizeApiError(error.apiError);\n formatErrorResponse(cmError.name, cmError.detail, error.statusCode);\n }\n\n if (error instanceof Error) {\n const sanitized = sanitizeErrorMessage(error.message);\n formatErrorResponse('unknown_error', sanitized, 1);\n }\n\n formatErrorResponse('unknown_error', 'An unexpected error occurred', 1);\n}\n","import { auth } from './auth.js';\nimport { ChartMogulCliError, ChartMogulApiError } from './errors.js';\nimport type {\n Account,\n DataSource,\n Customer,\n Plan,\n Subscription,\n Invoice,\n MetricsResponse,\n Activity,\n CustomerListResponse,\n PaginatedResponse,\n} from '../types/index.js';\n\nconst API_BASE = 'https://api.chartmogul.com/v1';\n\nexport class ChartMogulClient {\n private getAuthHeader(): string {\n const apiKey = auth.getApiKey();\n if (!apiKey) {\n throw new ChartMogulCliError('Not authenticated. Please run: chartmogul auth login', 401);\n }\n return `Basic ${Buffer.from(`${apiKey}:`).toString('base64')}`;\n }\n\n private async request<T>(\n method: string,\n path: string,\n options: {\n params?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n } = {}\n ): Promise<T> {\n const { params, body } = options;\n\n const url = new URL(`${API_BASE}${path}`);\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n });\n }\n\n const authHeader = this.getAuthHeader();\n const fetchOptions: RequestInit = {\n method,\n headers: {\n Authorization: authHeader,\n 'Content-Type': 'application/json',\n },\n };\n if (body) {\n fetchOptions.body = JSON.stringify(body);\n }\n\n let response: Response;\n try {\n response = await fetch(url.toString(), fetchOptions);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown network error';\n throw new ChartMogulCliError(`Network request failed: ${message}`, 0);\n }\n\n if (response.status === 429) {\n const retryAfter = response.headers.get('Retry-After') || '60';\n throw new ChartMogulCliError(\n `Rate limited by ChartMogul API. Retry after ${retryAfter} seconds.`,\n 429\n );\n }\n\n if (response.status === 204) {\n return {} as T;\n }\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new ChartMogulApiError('API request failed', error, response.status);\n }\n\n return response.json() as Promise<T>;\n }\n\n async getAccount() {\n return this.request<Account>('GET', '/account');\n }\n\n async ping() {\n return this.request<{ data: string }>('GET', '/ping');\n }\n\n async listDataSources() {\n return this.request<{ data_sources: DataSource[] }>('GET', '/data_sources');\n }\n\n async getDataSource(uuid: string) {\n return this.request<DataSource>('GET', `/data_sources/${uuid}`);\n }\n\n async listCustomers(\n params: {\n data_source_uuid?: string;\n status?: string;\n system?: string;\n external_id?: string;\n page?: number;\n per_page?: number;\n } = {}\n ) {\n return this.request<CustomerListResponse>('GET', '/customers', { params });\n }\n\n async getCustomer(uuid: string) {\n return this.request<Customer>('GET', `/customers/${uuid}`);\n }\n\n async searchCustomers(email: string) {\n return this.request<{ entries: Customer[] }>('GET', '/customers/search', {\n params: { email },\n });\n }\n\n async getCustomerActivities(uuid: string, params: { page?: number; per_page?: number } = {}) {\n return this.request<PaginatedResponse<Activity>>('GET', `/customers/${uuid}/activities`, {\n params,\n });\n }\n\n async getCustomerSubscriptions(uuid: string) {\n return this.request<{ entries: Subscription[] }>('GET', `/customers/${uuid}/subscriptions`);\n }\n\n async listPlans(params: { data_source_uuid?: string; page?: number; per_page?: number } = {}) {\n return this.request<{ plans: Plan[]; has_more: boolean; per_page: number; page: number }>(\n 'GET',\n '/plans',\n { params }\n );\n }\n\n async getPlan(uuid: string) {\n return this.request<Plan>('GET', `/plans/${uuid}`);\n }\n\n async listInvoices(\n params: {\n customer_uuid?: string;\n data_source_uuid?: string;\n external_id?: string;\n page?: number;\n per_page?: number;\n } = {}\n ) {\n return this.request<{ invoices: Invoice[]; has_more: boolean }>('GET', '/invoices', { params });\n }\n\n async getInvoice(uuid: string) {\n return this.request<Invoice>('GET', `/invoices/${uuid}`);\n }\n\n async getMrr(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/mrr', { params });\n }\n\n async getArr(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/arr', { params });\n }\n\n async getArpa(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/arpa', { params });\n }\n\n async getAsp(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/asp', { params });\n }\n\n async getCustomerCount(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/customer-count', { params });\n }\n\n async getCustomerChurnRate(params: {\n 'start-date': string;\n 'end-date': string;\n interval?: string;\n }) {\n return this.request<MetricsResponse>('GET', '/metrics/customer-churn-rate', { params });\n }\n\n async getMrrChurnRate(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/mrr-churn-rate', { params });\n }\n\n async getLtv(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/ltv', { params });\n }\n\n async getAllMetrics(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/all', { params });\n }\n\n async listActivities(\n params: {\n 'start-date'?: string;\n 'end-date'?: string;\n type?: string;\n page?: number;\n per_page?: number;\n } = {}\n ) {\n return this.request<PaginatedResponse<Activity>>('GET', '/activities', { params });\n }\n}\n\nexport const client = new ChartMogulClient();\n","import { handleChartMogulError } from './errors.js';\n\nexport function withErrorHandling<T extends unknown[], R>(\n fn: (...args: T) => Promise<R>\n): (...args: T) => Promise<void> {\n return async (...args: T) => {\n try {\n await fn(...args);\n } catch (error) {\n handleChartMogulError(error);\n }\n };\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createAccountCommand(): Command {\n const cmd = new Command('account').description('Account operations');\n\n cmd\n .command('view')\n .description('View account details')\n .action(\n withErrorHandling(async () => {\n const account = await client.getAccount();\n outputJson(account);\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { config } from '../lib/config.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createDataSourcesCommand(): Command {\n const cmd = new Command('data-sources').description('Data source operations');\n\n cmd\n .command('list')\n .description('List all data sources')\n .action(\n withErrorHandling(async () => {\n const result = await client.listDataSources();\n outputJson(result.data_sources);\n })\n );\n\n cmd\n .command('view')\n .description('View a data source')\n .argument('<uuid>', 'Data source UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const dataSource = await client.getDataSource(uuid);\n outputJson(dataSource);\n })\n );\n\n cmd\n .command('set-default')\n .description('Set default data source for filtering')\n .argument('<uuid>', 'Data source UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n config.setDefaultDataSource(uuid);\n outputJson({ message: `Default data source set to ${uuid}` });\n })\n );\n\n cmd\n .command('get-default')\n .description('Get default data source')\n .action(\n withErrorHandling(async () => {\n const defaultDs = config.getDefaultDataSource();\n outputJson({ default_data_source: defaultDs || null });\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { config } from '../lib/config.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createCustomersCommand(): Command {\n const cmd = new Command('customers').description('Customer queries');\n\n cmd\n .command('list')\n .description('List customers')\n .option('--data-source <uuid>', 'Filter by data source UUID')\n .option('--status <status>', 'Filter by status (Lead, Active, Cancelled)')\n .option('--external-id <id>', 'Filter by external ID')\n .option('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page (max 200)')\n .action(\n withErrorHandling(\n async (options: {\n dataSource?: string;\n status?: string;\n externalId?: string;\n page?: string;\n perPage?: string;\n }) => {\n const result = await client.listCustomers({\n data_source_uuid: options.dataSource || config.getDefaultDataSource(),\n status: options.status,\n external_id: options.externalId,\n page: options.page ? parseInt(options.page, 10) : undefined,\n per_page: options.perPage ? parseInt(options.perPage, 10) : undefined,\n });\n outputJson(result);\n }\n )\n );\n\n cmd\n .command('view')\n .description('View a customer')\n .argument('<uuid>', 'Customer UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const customer = await client.getCustomer(uuid);\n outputJson(customer);\n })\n );\n\n cmd\n .command('search')\n .description('Search customers by email')\n .requiredOption('--email <email>', 'Email address to search')\n .action(\n withErrorHandling(async (options: { email: string }) => {\n const result = await client.searchCustomers(options.email);\n outputJson(result.entries);\n })\n );\n\n cmd\n .command('activities')\n .description('List customer activities')\n .argument('<uuid>', 'Customer UUID')\n .option('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page')\n .action(\n withErrorHandling(async (uuid: string, options: { page?: string; perPage?: string }) => {\n const result = await client.getCustomerActivities(uuid, {\n page: options.page ? parseInt(options.page, 10) : undefined,\n per_page: options.perPage ? parseInt(options.perPage, 10) : undefined,\n });\n outputJson(result);\n })\n );\n\n cmd\n .command('subscriptions')\n .description('List customer subscriptions')\n .argument('<uuid>', 'Customer UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const result = await client.getCustomerSubscriptions(uuid);\n outputJson(result.entries);\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { config } from '../lib/config.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createPlansCommand(): Command {\n const cmd = new Command('plans').description('Plan queries');\n\n cmd\n .command('list')\n .description('List plans')\n .option('--data-source <uuid>', 'Filter by data source UUID')\n .option('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page')\n .action(\n withErrorHandling(\n async (options: { dataSource?: string; page?: string; perPage?: string }) => {\n const result = await client.listPlans({\n data_source_uuid: options.dataSource || config.getDefaultDataSource(),\n page: options.page ? parseInt(options.page, 10) : undefined,\n per_page: options.perPage ? parseInt(options.perPage, 10) : undefined,\n });\n outputJson(result);\n }\n )\n );\n\n cmd\n .command('view')\n .description('View a plan')\n .argument('<uuid>', 'Plan UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const plan = await client.getPlan(uuid);\n outputJson(plan);\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { config } from '../lib/config.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createInvoicesCommand(): Command {\n const cmd = new Command('invoices').description('Invoice queries');\n\n cmd\n .command('list')\n .description('List invoices')\n .option('--customer <uuid>', 'Filter by customer UUID')\n .option('--data-source <uuid>', 'Filter by data source UUID')\n .option('--external-id <id>', 'Filter by external ID')\n .option('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page')\n .action(\n withErrorHandling(\n async (options: {\n customer?: string;\n dataSource?: string;\n externalId?: string;\n page?: string;\n perPage?: string;\n }) => {\n const result = await client.listInvoices({\n customer_uuid: options.customer,\n data_source_uuid: options.dataSource || config.getDefaultDataSource(),\n external_id: options.externalId,\n page: options.page ? parseInt(options.page, 10) : undefined,\n per_page: options.perPage ? parseInt(options.perPage, 10) : undefined,\n });\n outputJson(result);\n }\n )\n );\n\n cmd\n .command('view')\n .description('View an invoice')\n .argument('<uuid>', 'Invoice UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const invoice = await client.getInvoice(uuid);\n outputJson(invoice);\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\nimport { getDefaultDateRange, parseDate } from '../lib/dates.js';\n\ninterface MetricOptions {\n startDate?: string;\n endDate?: string;\n interval?: string;\n}\n\nfunction buildMetricParams(options: MetricOptions) {\n const defaults = getDefaultDateRange();\n return {\n 'start-date': options.startDate ? parseDate(options.startDate) : defaults.startDate,\n 'end-date': options.endDate ? parseDate(options.endDate) : defaults.endDate,\n interval: options.interval,\n };\n}\n\nexport function createMetricsCommand(): Command {\n const cmd = new Command('metrics').description('Metrics and analytics');\n\n cmd\n .command('all')\n .description('Get all key metrics')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getAllMetrics(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('mrr')\n .description('Get Monthly Recurring Revenue')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getMrr(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('arr')\n .description('Get Annual Recurring Revenue')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getArr(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('arpa')\n .description('Get Average Revenue Per Account')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getArpa(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('asp')\n .description('Get Average Sale Price')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getAsp(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('customer-count')\n .description('Get customer count over time')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getCustomerCount(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('customer-churn')\n .description('Get customer churn rate')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getCustomerChurnRate(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('mrr-churn')\n .description('Get MRR churn rate')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getMrrChurnRate(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('ltv')\n .description('Get Customer Lifetime Value')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getLtv(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n return cmd;\n}\n","import dayjs from 'dayjs';\nimport { ChartMogulCliError } from './errors.js';\n\nexport function parseDate(input: string): string {\n const d = dayjs(input);\n if (!d.isValid()) {\n throw new ChartMogulCliError(`Invalid date: ${input}`, 400);\n }\n return d.format('YYYY-MM-DD');\n}\n\nexport function getDefaultDateRange(): { startDate: string; endDate: string } {\n return {\n startDate: dayjs().subtract(30, 'day').format('YYYY-MM-DD'),\n endDate: dayjs().format('YYYY-MM-DD'),\n };\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createActivitiesCommand(): Command {\n const cmd = new Command('activities').description('Activity operations');\n\n cmd\n .command('list')\n .description('List activities')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--type <type>', 'Activity type (new_biz, expansion, contraction, churn, reactivation)')\n .option('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page')\n .action(\n withErrorHandling(\n async (options: {\n startDate?: string;\n endDate?: string;\n type?: string;\n page?: string;\n perPage?: string;\n }) => {\n const result = await client.listActivities({\n 'start-date': options.startDate,\n 'end-date': options.endDate,\n type: options.type,\n page: options.page ? parseInt(options.page, 10) : undefined,\n per_page: options.perPage ? parseInt(options.perPage, 10) : undefined,\n });\n outputJson(result);\n }\n )\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { runMcpServer } from '../mcp/server.js';\n\nexport function createMcpCommand(): Command {\n const cmd = new Command('mcp').description('Run ChartMogul MCP server');\n\n cmd.action(async () => {\n await runMcpServer();\n });\n\n return cmd;\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport { client } from '../lib/api-client.js';\nimport { auth } from '../lib/auth.js';\nimport { convertCentsToDollars } from '../lib/utils.js';\n\nconst server = new McpServer({\n name: 'chartmogul',\n version: '1.0.0',\n});\n\nfunction jsonResponse(data: unknown) {\n const converted = convertCentsToDollars(data);\n return { content: [{ type: 'text' as const, text: JSON.stringify(converted, null, 2) }] };\n}\n\nconst dateRangeSchema = {\n startDate: z.string().describe('Start date (YYYY-MM-DD)'),\n endDate: z.string().describe('End date (YYYY-MM-DD)'),\n interval: z\n .enum(['day', 'week', 'month', 'quarter'])\n .optional()\n .describe('Aggregation interval'),\n};\n\nserver.tool(\n 'get_all_metrics',\n 'Get all revenue metrics (MRR, ARR, ARPA, churn rates, LTV, customer count) for a date range',\n {\n startDate: dateRangeSchema.startDate,\n endDate: dateRangeSchema.endDate,\n interval: dateRangeSchema.interval,\n },\n async ({ startDate, endDate, interval }) =>\n jsonResponse(await client.getAllMetrics({ 'start-date': startDate, 'end-date': endDate, interval }))\n);\n\nserver.tool(\n 'get_mrr',\n 'Get Monthly Recurring Revenue (MRR) for a date range',\n {\n startDate: dateRangeSchema.startDate,\n endDate: dateRangeSchema.endDate,\n interval: dateRangeSchema.interval,\n },\n async ({ startDate, endDate, interval }) =>\n jsonResponse(await client.getMrr({ 'start-date': startDate, 'end-date': endDate, interval }))\n);\n\nserver.tool(\n 'get_arr',\n 'Get Annual Recurring Revenue (ARR) for a date range',\n {\n startDate: dateRangeSchema.startDate,\n endDate: dateRangeSchema.endDate,\n interval: dateRangeSchema.interval,\n },\n async ({ startDate, endDate, interval }) =>\n jsonResponse(await client.getArr({ 'start-date': startDate, 'end-date': endDate, interval }))\n);\n\nserver.tool(\n 'get_customer_churn_rate',\n 'Get customer churn rate for a date range',\n {\n startDate: dateRangeSchema.startDate,\n endDate: dateRangeSchema.endDate,\n interval: dateRangeSchema.interval,\n },\n async ({ startDate, endDate, interval }) =>\n jsonResponse(await client.getCustomerChurnRate({ 'start-date': startDate, 'end-date': endDate, interval }))\n);\n\nserver.tool(\n 'get_mrr_churn_rate',\n 'Get MRR churn rate for a date range',\n {\n startDate: dateRangeSchema.startDate,\n endDate: dateRangeSchema.endDate,\n interval: dateRangeSchema.interval,\n },\n async ({ startDate, endDate, interval }) =>\n jsonResponse(await client.getMrrChurnRate({ 'start-date': startDate, 'end-date': endDate, interval }))\n);\n\nserver.tool(\n 'list_activities',\n 'List subscription activities (new business, expansion, contraction, churn)',\n {\n startDate: z.string().optional().describe('Start date (YYYY-MM-DD)'),\n endDate: z.string().optional().describe('End date (YYYY-MM-DD)'),\n type: z\n .enum(['new-biz', 'expansion', 'contraction', 'churn', 'reactivation'])\n .optional()\n .describe('Activity type filter'),\n page: z.number().optional().describe('Page number'),\n perPage: z.number().optional().describe('Results per page'),\n },\n async ({ startDate, endDate, type, page, perPage }) =>\n jsonResponse(await client.listActivities({ 'start-date': startDate, 'end-date': endDate, type, page, per_page: perPage }))\n);\n\nserver.tool(\n 'search_customers',\n 'Search for customers by email address',\n { email: z.string().describe('Email address to search for') },\n async ({ email }) => jsonResponse(await client.searchCustomers(email))\n);\n\nserver.tool(\n 'get_customer',\n 'Get detailed information about a specific customer',\n { uuid: z.string().describe('Customer UUID') },\n async ({ uuid }) => jsonResponse(await client.getCustomer(uuid))\n);\n\nserver.tool(\n 'get_customer_activities',\n 'Get subscription activities for a specific customer',\n {\n uuid: z.string().describe('Customer UUID'),\n page: z.number().optional().describe('Page number'),\n perPage: z.number().optional().describe('Results per page'),\n },\n async ({ uuid, page, perPage }) =>\n jsonResponse(await client.getCustomerActivities(uuid, { page, per_page: perPage }))\n);\n\nserver.tool(\n 'get_customer_subscriptions',\n 'Get active subscriptions for a specific customer',\n { uuid: z.string().describe('Customer UUID') },\n async ({ uuid }) => jsonResponse(await client.getCustomerSubscriptions(uuid))\n);\n\nserver.tool(\n 'list_customers',\n 'List all customers with optional filtering',\n {\n status: z.enum(['Lead', 'Active', 'Past Due', 'Cancelled']).optional().describe('Customer status'),\n page: z.number().optional().describe('Page number'),\n perPage: z.number().optional().describe('Results per page'),\n },\n async ({ status, page, perPage }) =>\n jsonResponse(await client.listCustomers({ status, page, per_page: perPage }))\n);\n\nserver.tool(\n 'get_account',\n 'Get ChartMogul account information',\n {},\n async () => jsonResponse(await client.getAccount())\n);\n\nserver.tool(\n 'check_auth',\n 'Check if ChartMogul authentication is configured',\n {},\n async () => jsonResponse({ authenticated: auth.isAuthenticated() })\n);\n\nexport async function runMcpServer() {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n"],"mappings":"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","names":["Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/lib/utils.ts","../src/lib/output.ts","../src/commands/auth.ts","../src/lib/auth.ts","../src/lib/config.ts","../src/lib/errors.ts","../src/lib/api-client.ts","../src/lib/command-utils.ts","../src/commands/account.ts","../src/commands/data-sources.ts","../src/commands/customers.ts","../src/commands/plans.ts","../src/commands/invoices.ts","../src/commands/metrics.ts","../src/lib/dates.ts","../src/commands/activities.ts","../src/commands/mcp.ts","../src/mcp/server.ts"],"sourcesContent":["#!/usr/bin/env bun\n\nimport { Command } from 'commander';\nimport { setOutputOptions } from './lib/output.js';\nimport { createAuthCommand } from './commands/auth.js';\nimport { createAccountCommand } from './commands/account.js';\nimport { createDataSourcesCommand } from './commands/data-sources.js';\nimport { createCustomersCommand } from './commands/customers.js';\nimport { createPlansCommand } from './commands/plans.js';\nimport { createInvoicesCommand } from './commands/invoices.js';\nimport { createMetricsCommand } from './commands/metrics.js';\nimport { createActivitiesCommand } from './commands/activities.js';\nimport { createMcpCommand } from './commands/mcp.js';\n\ndeclare const __VERSION__: string | undefined;\n\nconst version = typeof __VERSION__ !== 'undefined' ? __VERSION__ : '0.0.0-dev';\n\nconst program = new Command();\n\nprogram\n .name('chartmogul')\n .description('A command-line interface for ChartMogul analytics')\n .version(version)\n .option('-c, --compact', 'Minified JSON output (single line)')\n .hook('preAction', (thisCommand) => {\n const options = thisCommand.opts();\n setOutputOptions({\n compact: options.compact,\n });\n });\n\nprogram.addCommand(createAuthCommand());\nprogram.addCommand(createAccountCommand());\nprogram.addCommand(createDataSourcesCommand());\nprogram.addCommand(createCustomersCommand());\nprogram.addCommand(createPlansCommand());\nprogram.addCommand(createInvoicesCommand());\nprogram.addCommand(createMetricsCommand());\nprogram.addCommand(createActivitiesCommand());\nprogram.addCommand(createMcpCommand());\n\nprogram.parseAsync().catch(() => {\n process.exit(1);\n});\n","function centsToDollars(cents: number): number {\n return cents / 100;\n}\n\nconst CENTS_FIELDS = new Set([\n 'amount_in_cents',\n 'discount_amount_in_cents',\n 'tax_amount_in_cents',\n 'mrr',\n 'arr',\n 'arpa',\n 'asp',\n 'ltv',\n 'activity_mrr',\n 'activity_arr',\n 'activity_mrr_movement',\n 'activity-mrr',\n 'activity-arr',\n 'activity-mrr-movement',\n 'new-biz',\n 'expansion',\n 'contraction',\n 'churn',\n 'reactivation',\n]);\n\nfunction isCentsField(fieldName: string): boolean {\n return CENTS_FIELDS.has(fieldName) || fieldName.endsWith('_in_cents');\n}\n\nfunction normalizeFieldName(fieldName: string): string {\n return fieldName.replace(/_in_cents$/, '');\n}\n\nexport function convertCentsToDollars(data: unknown): unknown {\n if (data === null || data === undefined) return data;\n if (Array.isArray(data)) return data.map(convertCentsToDollars);\n if (typeof data !== 'object') return data;\n\n const converted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n if (isCentsField(key) && typeof value === 'number') {\n converted[normalizeFieldName(key)] = centsToDollars(value);\n } else {\n converted[key] = convertCentsToDollars(value);\n }\n }\n return converted;\n}\n","import type { OutputOptions } from '../types/index.js';\nimport { convertCentsToDollars } from './utils.js';\n\nlet globalOutputOptions: OutputOptions = {};\n\nexport function setOutputOptions(options: OutputOptions): void {\n globalOutputOptions = options;\n}\n\nexport function outputJson(data: unknown, options: OutputOptions = {}): void {\n const convertedData = convertCentsToDollars(data);\n const mergedOptions = { ...globalOutputOptions, ...options };\n\n const jsonString = mergedOptions.compact\n ? JSON.stringify(convertedData)\n : JSON.stringify(convertedData, null, 2);\n\n console.log(jsonString);\n}\n","import { Command } from 'commander';\nimport { auth } from '../lib/auth.js';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createAuthCommand(): Command {\n const cmd = new Command('auth').description('Authentication operations');\n\n cmd\n .command('login')\n .description('Configure ChartMogul API credentials')\n .requiredOption('--api-key <key>', 'ChartMogul API Key')\n .action(\n withErrorHandling(async (options: { apiKey: string }) => {\n auth.setApiKey(options.apiKey);\n await client.ping();\n outputJson({ message: 'Successfully authenticated with ChartMogul' });\n })\n );\n\n cmd\n .command('logout')\n .description('Remove stored credentials')\n .action(\n withErrorHandling(async () => {\n auth.logout();\n outputJson({ message: 'Logged out successfully' });\n })\n );\n\n cmd\n .command('status')\n .description('Check authentication status')\n .action(\n withErrorHandling(async () => {\n outputJson({ authenticated: auth.isAuthenticated() });\n })\n );\n\n return cmd;\n}\n","import { Entry } from '@napi-rs/keyring';\nimport { config } from './config.js';\n\nconst SERVICE_NAME = 'chartmogul-cli';\nconst API_KEY_ACCOUNT = 'api-key';\n\nconst KEYRING_UNAVAILABLE_ERROR =\n 'Keychain storage unavailable. Cannot store credentials securely.\\n' +\n 'On Linux, install libsecret: sudo apt-get install libsecret-1-dev\\n' +\n 'Then reinstall: bun install -g @stephendolan/chartmogul-cli\\n' +\n 'Alternatively, use CHARTMOGUL_API_KEY environment variable.';\n\nfunction getKeyring(account: string): Entry | null {\n try {\n return new Entry(SERVICE_NAME, account);\n } catch {\n return null;\n }\n}\n\nfunction getPassword(account: string): string | null {\n const entry = getKeyring(account);\n if (entry) {\n try {\n return entry.getPassword();\n } catch {\n return null;\n }\n }\n return null;\n}\n\nfunction setPassword(account: string, value: string): void {\n const entry = getKeyring(account);\n if (!entry) {\n throw new Error(KEYRING_UNAVAILABLE_ERROR);\n }\n entry.setPassword(value);\n}\n\nfunction deletePassword(account: string): boolean {\n const entry = getKeyring(account);\n if (entry) {\n return entry.deletePassword();\n }\n return false;\n}\n\nexport class AuthManager {\n getApiKey(): string | null {\n return getPassword(API_KEY_ACCOUNT) || process.env.CHARTMOGUL_API_KEY || null;\n }\n\n setApiKey(apiKey: string): void {\n setPassword(API_KEY_ACCOUNT, apiKey);\n }\n\n isAuthenticated(): boolean {\n return this.getApiKey() !== null;\n }\n\n logout(): void {\n deletePassword(API_KEY_ACCOUNT);\n config.clearDefaultDataSource();\n }\n}\n\nexport const auth = new AuthManager();\n","import Conf from 'conf';\n\ninterface ConfigSchema {\n defaultDataSource?: string;\n}\n\nconst store = new Conf<ConfigSchema>({\n projectName: 'chartmogul-cli',\n});\n\nexport const config = {\n getDefaultDataSource(): string | undefined {\n return store.get('defaultDataSource') || process.env.CHARTMOGUL_DATA_SOURCE;\n },\n\n setDefaultDataSource(dataSourceUuid: string): void {\n store.set('defaultDataSource', dataSourceUuid);\n },\n\n clearDefaultDataSource(): void {\n store.delete('defaultDataSource');\n },\n\n clear(): void {\n store.clear();\n },\n};\n","import type { ChartMogulError } from '../types/index.js';\nimport { outputJson } from './output.js';\n\nexport class ChartMogulCliError extends Error {\n constructor(\n message: string,\n public statusCode?: number\n ) {\n super(message);\n this.name = 'ChartMogulCliError';\n }\n}\n\nexport class ChartMogulApiError extends Error {\n constructor(\n message: string,\n public apiError: unknown,\n public statusCode: number\n ) {\n super(message);\n this.name = 'ChartMogulApiError';\n }\n}\n\nexport function sanitizeErrorMessage(message: string): string {\n const sensitivePatterns = [\n /Bearer\\s+[\\w\\-._~+/]+=*/gi,\n /token[=:]\\s*[\\w\\-._~+/]+=*/gi,\n /api[_-]?key[=:]\\s*[\\w\\-._~+/]+=*/gi,\n /authorization:\\s*basic\\s+[\\w\\-._~+/]+=*/gi,\n ];\n\n let sanitized = message;\n for (const pattern of sensitivePatterns) {\n sanitized = sanitized.replace(pattern, '[REDACTED]');\n }\n\n return sanitized.length > 500 ? sanitized.substring(0, 500) + '...' : sanitized;\n}\n\ninterface ApiErrorResponse {\n error?: string;\n message?: string;\n errors?: Array<{\n key?: string;\n message?: string;\n }>;\n}\n\nfunction isErrorObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nexport function sanitizeApiError(error: unknown): ChartMogulError {\n if (!isErrorObject(error)) {\n return {\n name: 'api_error',\n detail: 'An error occurred',\n };\n }\n\n const apiError = error as ApiErrorResponse;\n\n let detail = 'An error occurred';\n if (apiError.message) {\n detail = apiError.message;\n } else if (apiError.errors?.length) {\n detail = apiError.errors\n .map((e) => e.message || e.key)\n .filter(Boolean)\n .join('; ');\n }\n\n return {\n name: apiError.error || 'api_error',\n detail: sanitizeErrorMessage(detail),\n };\n}\n\nfunction formatErrorResponse(name: string, detail: string, statusCode: number): never {\n const hint =\n name === 'too_many_requests'\n ? 'ChartMogul API rate limit exceeded. Wait a moment and retry.'\n : undefined;\n\n const response: { error: { name: string; detail: string; statusCode: number }; hint?: string } = {\n error: { name, detail, statusCode },\n };\n\n if (hint) {\n response.hint = hint;\n }\n\n outputJson(response);\n process.exit(1);\n}\n\nexport function handleChartMogulError(error: unknown): never {\n if (error instanceof ChartMogulCliError) {\n const sanitized = sanitizeErrorMessage(error.message);\n formatErrorResponse('cli_error', sanitized, error.statusCode || 1);\n }\n\n if (error instanceof ChartMogulApiError) {\n const cmError = sanitizeApiError(error.apiError);\n formatErrorResponse(cmError.name, cmError.detail, error.statusCode);\n }\n\n if (error instanceof Error) {\n const sanitized = sanitizeErrorMessage(error.message);\n formatErrorResponse('unknown_error', sanitized, 1);\n }\n\n formatErrorResponse('unknown_error', 'An unexpected error occurred', 1);\n}\n","import { auth } from './auth.js';\nimport { ChartMogulCliError, ChartMogulApiError } from './errors.js';\nimport type {\n Account,\n DataSource,\n Customer,\n Plan,\n Subscription,\n Invoice,\n MetricsResponse,\n Activity,\n EnrichedActivity,\n CustomerListResponse,\n PaginatedResponse,\n} from '../types/index.js';\n\nconst API_BASE = 'https://api.chartmogul.com/v1';\nconst MS_PER_MONTH = 1000 * 60 * 60 * 24 * 30.44;\n\nfunction calculateTenureMonths(activityDate: string, customerSince: string): number {\n return Math.round(\n (new Date(activityDate).getTime() - new Date(customerSince).getTime()) / MS_PER_MONTH\n );\n}\n\nexport class ChartMogulClient {\n private getAuthHeader(): string {\n const apiKey = auth.getApiKey();\n if (!apiKey) {\n throw new ChartMogulCliError('Not authenticated. Please run: chartmogul auth login', 401);\n }\n return `Basic ${Buffer.from(`${apiKey}:`).toString('base64')}`;\n }\n\n private async request<T>(\n method: string,\n path: string,\n options: {\n params?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n } = {}\n ): Promise<T> {\n const { params, body } = options;\n\n const url = new URL(`${API_BASE}${path}`);\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n });\n }\n\n const authHeader = this.getAuthHeader();\n const fetchOptions: RequestInit = {\n method,\n headers: {\n Authorization: authHeader,\n 'Content-Type': 'application/json',\n },\n };\n if (body) {\n fetchOptions.body = JSON.stringify(body);\n }\n\n let response: Response;\n try {\n response = await fetch(url.toString(), fetchOptions);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown network error';\n throw new ChartMogulCliError(`Network request failed: ${message}`, 0);\n }\n\n if (response.status === 429) {\n const retryAfter = response.headers.get('Retry-After') || '60';\n throw new ChartMogulCliError(\n `Rate limited by ChartMogul API. Retry after ${retryAfter} seconds.`,\n 429\n );\n }\n\n if (response.status === 204) {\n return {} as T;\n }\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new ChartMogulApiError('API request failed', error, response.status);\n }\n\n return response.json() as Promise<T>;\n }\n\n async getAccount() {\n return this.request<Account>('GET', '/account');\n }\n\n async ping() {\n return this.request<{ data: string }>('GET', '/ping');\n }\n\n async listDataSources() {\n return this.request<{ data_sources: DataSource[] }>('GET', '/data_sources');\n }\n\n async getDataSource(uuid: string) {\n return this.request<DataSource>('GET', `/data_sources/${uuid}`);\n }\n\n async listCustomers(\n params: {\n data_source_uuid?: string;\n status?: string;\n system?: string;\n external_id?: string;\n page?: number;\n per_page?: number;\n } = {}\n ) {\n return this.request<CustomerListResponse>('GET', '/customers', { params });\n }\n\n async getCustomer(uuid: string) {\n return this.request<Customer>('GET', `/customers/${uuid}`);\n }\n\n async searchCustomers(email: string) {\n return this.request<{ entries: Customer[] }>('GET', '/customers/search', {\n params: { email },\n });\n }\n\n async getCustomersBatch(uuids: string[]): Promise<Customer[]> {\n const results = await Promise.all(\n uuids.map((uuid) => this.getCustomer(uuid).catch(() => null))\n );\n return results.filter((c): c is Customer => c !== null);\n }\n\n async getCustomerActivities(uuid: string, params: { page?: number; per_page?: number } = {}) {\n return this.request<PaginatedResponse<Activity>>('GET', `/customers/${uuid}/activities`, {\n params,\n });\n }\n\n async getCustomerSubscriptions(uuid: string) {\n return this.request<{ entries: Subscription[] }>('GET', `/customers/${uuid}/subscriptions`);\n }\n\n async listPlans(params: { data_source_uuid?: string; page?: number; per_page?: number } = {}) {\n return this.request<{ plans: Plan[]; has_more: boolean; per_page: number; page: number }>(\n 'GET',\n '/plans',\n { params }\n );\n }\n\n async getPlan(uuid: string) {\n return this.request<Plan>('GET', `/plans/${uuid}`);\n }\n\n async listInvoices(\n params: {\n customer_uuid?: string;\n data_source_uuid?: string;\n external_id?: string;\n page?: number;\n per_page?: number;\n } = {}\n ) {\n return this.request<{ invoices: Invoice[]; has_more: boolean }>('GET', '/invoices', { params });\n }\n\n async getInvoice(uuid: string) {\n return this.request<Invoice>('GET', `/invoices/${uuid}`);\n }\n\n async getMrr(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/mrr', { params });\n }\n\n async getArr(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/arr', { params });\n }\n\n async getArpa(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/arpa', { params });\n }\n\n async getAsp(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/asp', { params });\n }\n\n async getCustomerCount(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/customer-count', { params });\n }\n\n async getCustomerChurnRate(params: {\n 'start-date': string;\n 'end-date': string;\n interval?: string;\n }) {\n return this.request<MetricsResponse>('GET', '/metrics/customer-churn-rate', { params });\n }\n\n async getMrrChurnRate(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/mrr-churn-rate', { params });\n }\n\n async getLtv(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/ltv', { params });\n }\n\n async getAllMetrics(params: { 'start-date': string; 'end-date': string; interval?: string }) {\n return this.request<MetricsResponse>('GET', '/metrics/all', { params });\n }\n\n async listActivities(\n params: {\n 'start-date'?: string;\n 'end-date'?: string;\n type?: string;\n page?: number;\n per_page?: number;\n } = {}\n ) {\n return this.request<PaginatedResponse<Activity>>('GET', '/activities', { params });\n }\n\n async listActivitiesEnriched(\n params: {\n 'start-date'?: string;\n 'end-date'?: string;\n type?: string;\n page?: number;\n per_page?: number;\n } = {}\n ): Promise<PaginatedResponse<EnrichedActivity>> {\n const activities = await this.listActivities(params);\n\n const uniqueCustomerUuids = [\n ...new Set(activities.entries.map((a) => a['customer-uuid']).filter(Boolean)),\n ];\n\n const customers = await this.getCustomersBatch(uniqueCustomerUuids);\n const customerMap = new Map(customers.map((c) => [c.uuid, c]));\n\n const enrichedEntries: EnrichedActivity[] = activities.entries.map((activity) => {\n const customer = customerMap.get(activity['customer-uuid']);\n const customerSince = customer?.['customer-since'] ?? customer?.customer_since;\n const tenureMonths = customerSince\n ? calculateTenureMonths(activity.date, customerSince)\n : undefined;\n\n return {\n ...activity,\n 'customer-since': customerSince,\n 'customer-tenure-months': tenureMonths,\n };\n });\n\n return {\n ...activities,\n entries: enrichedEntries,\n };\n }\n}\n\nexport const client = new ChartMogulClient();\n","import { handleChartMogulError } from './errors.js';\n\nexport function withErrorHandling<T extends unknown[], R>(\n fn: (...args: T) => Promise<R>\n): (...args: T) => Promise<void> {\n return async (...args: T) => {\n try {\n await fn(...args);\n } catch (error) {\n handleChartMogulError(error);\n }\n };\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createAccountCommand(): Command {\n const cmd = new Command('account').description('Account operations');\n\n cmd\n .command('view')\n .description('View account details')\n .action(\n withErrorHandling(async () => {\n const account = await client.getAccount();\n outputJson(account);\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { config } from '../lib/config.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createDataSourcesCommand(): Command {\n const cmd = new Command('data-sources').description('Data source operations');\n\n cmd\n .command('list')\n .description('List all data sources')\n .action(\n withErrorHandling(async () => {\n const result = await client.listDataSources();\n outputJson(result.data_sources);\n })\n );\n\n cmd\n .command('view')\n .description('View a data source')\n .argument('<uuid>', 'Data source UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const dataSource = await client.getDataSource(uuid);\n outputJson(dataSource);\n })\n );\n\n cmd\n .command('set-default')\n .description('Set default data source for filtering')\n .argument('<uuid>', 'Data source UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n config.setDefaultDataSource(uuid);\n outputJson({ message: `Default data source set to ${uuid}` });\n })\n );\n\n cmd\n .command('get-default')\n .description('Get default data source')\n .action(\n withErrorHandling(async () => {\n const defaultDs = config.getDefaultDataSource();\n outputJson({ default_data_source: defaultDs || null });\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { config } from '../lib/config.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createCustomersCommand(): Command {\n const cmd = new Command('customers').description('Customer queries');\n\n cmd\n .command('list')\n .description('List customers')\n .option('--data-source <uuid>', 'Filter by data source UUID')\n .option('--status <status>', 'Filter by status (Lead, Active, Cancelled)')\n .option('--external-id <id>', 'Filter by external ID')\n .option('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page (max 200)')\n .action(\n withErrorHandling(\n async (options: {\n dataSource?: string;\n status?: string;\n externalId?: string;\n page?: string;\n perPage?: string;\n }) => {\n const result = await client.listCustomers({\n data_source_uuid: options.dataSource || config.getDefaultDataSource(),\n status: options.status,\n external_id: options.externalId,\n page: options.page ? parseInt(options.page, 10) : undefined,\n per_page: options.perPage ? parseInt(options.perPage, 10) : undefined,\n });\n outputJson(result);\n }\n )\n );\n\n cmd\n .command('view')\n .description('View a customer')\n .argument('<uuid>', 'Customer UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const customer = await client.getCustomer(uuid);\n outputJson(customer);\n })\n );\n\n cmd\n .command('search')\n .description('Search customers by email')\n .requiredOption('--email <email>', 'Email address to search')\n .action(\n withErrorHandling(async (options: { email: string }) => {\n const result = await client.searchCustomers(options.email);\n outputJson(result.entries);\n })\n );\n\n cmd\n .command('activities')\n .description('List customer activities')\n .argument('<uuid>', 'Customer UUID')\n .option('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page')\n .action(\n withErrorHandling(async (uuid: string, options: { page?: string; perPage?: string }) => {\n const result = await client.getCustomerActivities(uuid, {\n page: options.page ? parseInt(options.page, 10) : undefined,\n per_page: options.perPage ? parseInt(options.perPage, 10) : undefined,\n });\n outputJson(result);\n })\n );\n\n cmd\n .command('subscriptions')\n .description('List customer subscriptions')\n .argument('<uuid>', 'Customer UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const result = await client.getCustomerSubscriptions(uuid);\n outputJson(result.entries);\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { config } from '../lib/config.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createPlansCommand(): Command {\n const cmd = new Command('plans').description('Plan queries');\n\n cmd\n .command('list')\n .description('List plans')\n .option('--data-source <uuid>', 'Filter by data source UUID')\n .option('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page')\n .action(\n withErrorHandling(\n async (options: { dataSource?: string; page?: string; perPage?: string }) => {\n const result = await client.listPlans({\n data_source_uuid: options.dataSource || config.getDefaultDataSource(),\n page: options.page ? parseInt(options.page, 10) : undefined,\n per_page: options.perPage ? parseInt(options.perPage, 10) : undefined,\n });\n outputJson(result);\n }\n )\n );\n\n cmd\n .command('view')\n .description('View a plan')\n .argument('<uuid>', 'Plan UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const plan = await client.getPlan(uuid);\n outputJson(plan);\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { config } from '../lib/config.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createInvoicesCommand(): Command {\n const cmd = new Command('invoices').description('Invoice queries');\n\n cmd\n .command('list')\n .description('List invoices')\n .option('--customer <uuid>', 'Filter by customer UUID')\n .option('--data-source <uuid>', 'Filter by data source UUID')\n .option('--external-id <id>', 'Filter by external ID')\n .option('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page')\n .action(\n withErrorHandling(\n async (options: {\n customer?: string;\n dataSource?: string;\n externalId?: string;\n page?: string;\n perPage?: string;\n }) => {\n const result = await client.listInvoices({\n customer_uuid: options.customer,\n data_source_uuid: options.dataSource || config.getDefaultDataSource(),\n external_id: options.externalId,\n page: options.page ? parseInt(options.page, 10) : undefined,\n per_page: options.perPage ? parseInt(options.perPage, 10) : undefined,\n });\n outputJson(result);\n }\n )\n );\n\n cmd\n .command('view')\n .description('View an invoice')\n .argument('<uuid>', 'Invoice UUID')\n .action(\n withErrorHandling(async (uuid: string) => {\n const invoice = await client.getInvoice(uuid);\n outputJson(invoice);\n })\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\nimport { getDefaultDateRange, parseDate } from '../lib/dates.js';\n\ninterface MetricOptions {\n startDate?: string;\n endDate?: string;\n interval?: string;\n}\n\nfunction buildMetricParams(options: MetricOptions) {\n const defaults = getDefaultDateRange();\n return {\n 'start-date': options.startDate ? parseDate(options.startDate) : defaults.startDate,\n 'end-date': options.endDate ? parseDate(options.endDate) : defaults.endDate,\n interval: options.interval,\n };\n}\n\nexport function createMetricsCommand(): Command {\n const cmd = new Command('metrics').description('Metrics and analytics');\n\n cmd\n .command('all')\n .description('Get all key metrics')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getAllMetrics(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('mrr')\n .description('Get Monthly Recurring Revenue')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getMrr(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('arr')\n .description('Get Annual Recurring Revenue')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getArr(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('arpa')\n .description('Get Average Revenue Per Account')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getArpa(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('asp')\n .description('Get Average Sale Price')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getAsp(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('customer-count')\n .description('Get customer count over time')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getCustomerCount(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('customer-churn')\n .description('Get customer churn rate')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getCustomerChurnRate(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('mrr-churn')\n .description('Get MRR churn rate')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getMrrChurnRate(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n cmd\n .command('ltv')\n .description('Get Customer Lifetime Value')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--interval <interval>', 'Interval (day, week, month, quarter)')\n .action(\n withErrorHandling(async (options: MetricOptions) => {\n const result = await client.getLtv(buildMetricParams(options));\n outputJson(result);\n })\n );\n\n return cmd;\n}\n","import dayjs from 'dayjs';\nimport { ChartMogulCliError } from './errors.js';\n\nexport function parseDate(input: string): string {\n const d = dayjs(input);\n if (!d.isValid()) {\n throw new ChartMogulCliError(`Invalid date: ${input}`, 400);\n }\n return d.format('YYYY-MM-DD');\n}\n\nexport function getDefaultDateRange(): { startDate: string; endDate: string } {\n return {\n startDate: dayjs().subtract(30, 'day').format('YYYY-MM-DD'),\n endDate: dayjs().format('YYYY-MM-DD'),\n };\n}\n","import { Command } from 'commander';\nimport { client } from '../lib/api-client.js';\nimport { outputJson } from '../lib/output.js';\nimport { withErrorHandling } from '../lib/command-utils.js';\n\nexport function createActivitiesCommand(): Command {\n const cmd = new Command('activities').description('Activity operations');\n\n cmd\n .command('list')\n .description('List activities')\n .option('--start-date <date>', 'Start date (YYYY-MM-DD)')\n .option('--end-date <date>', 'End date (YYYY-MM-DD)')\n .option('--type <type>', 'Activity type (new_biz, expansion, contraction, churn, reactivation)')\n .option('--page <number>', 'Page number')\n .option('--per-page <number>', 'Results per page')\n .option('--enrich', 'Include customer tenure data (customer-since, customer-tenure-months)')\n .action(\n withErrorHandling(\n async (options: {\n startDate?: string;\n endDate?: string;\n type?: string;\n page?: string;\n perPage?: string;\n enrich?: boolean;\n }) => {\n const params = {\n 'start-date': options.startDate,\n 'end-date': options.endDate,\n type: options.type,\n page: options.page ? parseInt(options.page, 10) : undefined,\n per_page: options.perPage ? parseInt(options.perPage, 10) : undefined,\n };\n const result = options.enrich\n ? await client.listActivitiesEnriched(params)\n : await client.listActivities(params);\n outputJson(result);\n }\n )\n );\n\n return cmd;\n}\n","import { Command } from 'commander';\nimport { runMcpServer } from '../mcp/server.js';\n\nexport function createMcpCommand(): Command {\n const cmd = new Command('mcp').description('Run ChartMogul MCP server');\n\n cmd.action(async () => {\n await runMcpServer();\n });\n\n return cmd;\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { z } from 'zod';\nimport { client } from '../lib/api-client.js';\nimport { auth } from '../lib/auth.js';\nimport { convertCentsToDollars } from '../lib/utils.js';\n\nconst server = new McpServer({\n name: 'chartmogul',\n version: '1.0.0',\n});\n\nfunction jsonResponse(data: unknown) {\n const converted = convertCentsToDollars(data);\n return { content: [{ type: 'text' as const, text: JSON.stringify(converted, null, 2) }] };\n}\n\nconst dateRangeSchema = {\n startDate: z.string().describe('Start date (YYYY-MM-DD)'),\n endDate: z.string().describe('End date (YYYY-MM-DD)'),\n interval: z\n .enum(['day', 'week', 'month', 'quarter'])\n .optional()\n .describe('Aggregation interval'),\n};\n\nserver.tool(\n 'get_all_metrics',\n 'Get all revenue metrics (MRR, ARR, ARPA, churn rates, LTV, customer count) for a date range',\n {\n startDate: dateRangeSchema.startDate,\n endDate: dateRangeSchema.endDate,\n interval: dateRangeSchema.interval,\n },\n async ({ startDate, endDate, interval }) =>\n jsonResponse(await client.getAllMetrics({ 'start-date': startDate, 'end-date': endDate, interval }))\n);\n\nserver.tool(\n 'get_mrr',\n 'Get Monthly Recurring Revenue (MRR) for a date range',\n {\n startDate: dateRangeSchema.startDate,\n endDate: dateRangeSchema.endDate,\n interval: dateRangeSchema.interval,\n },\n async ({ startDate, endDate, interval }) =>\n jsonResponse(await client.getMrr({ 'start-date': startDate, 'end-date': endDate, interval }))\n);\n\nserver.tool(\n 'get_arr',\n 'Get Annual Recurring Revenue (ARR) for a date range',\n {\n startDate: dateRangeSchema.startDate,\n endDate: dateRangeSchema.endDate,\n interval: dateRangeSchema.interval,\n },\n async ({ startDate, endDate, interval }) =>\n jsonResponse(await client.getArr({ 'start-date': startDate, 'end-date': endDate, interval }))\n);\n\nserver.tool(\n 'get_customer_churn_rate',\n 'Get customer churn rate for a date range',\n {\n startDate: dateRangeSchema.startDate,\n endDate: dateRangeSchema.endDate,\n interval: dateRangeSchema.interval,\n },\n async ({ startDate, endDate, interval }) =>\n jsonResponse(await client.getCustomerChurnRate({ 'start-date': startDate, 'end-date': endDate, interval }))\n);\n\nserver.tool(\n 'get_mrr_churn_rate',\n 'Get MRR churn rate for a date range',\n {\n startDate: dateRangeSchema.startDate,\n endDate: dateRangeSchema.endDate,\n interval: dateRangeSchema.interval,\n },\n async ({ startDate, endDate, interval }) =>\n jsonResponse(await client.getMrrChurnRate({ 'start-date': startDate, 'end-date': endDate, interval }))\n);\n\nserver.tool(\n 'list_activities',\n 'List subscription activities (new business, expansion, contraction, churn)',\n {\n startDate: z.string().optional().describe('Start date (YYYY-MM-DD)'),\n endDate: z.string().optional().describe('End date (YYYY-MM-DD)'),\n type: z\n .enum(['new-biz', 'expansion', 'contraction', 'churn', 'reactivation'])\n .optional()\n .describe('Activity type filter'),\n page: z.number().optional().describe('Page number'),\n perPage: z.number().optional().describe('Results per page'),\n enrich: z.boolean().optional().describe('Include customer tenure data (customer-since, customer-tenure-months)'),\n },\n async ({ startDate, endDate, type, page, perPage, enrich }) => {\n const params = { 'start-date': startDate, 'end-date': endDate, type, page, per_page: perPage };\n const result = enrich\n ? await client.listActivitiesEnriched(params)\n : await client.listActivities(params);\n return jsonResponse(result);\n }\n);\n\nserver.tool(\n 'search_customers',\n 'Search for customers by email address',\n { email: z.string().describe('Email address to search for') },\n async ({ email }) => jsonResponse(await client.searchCustomers(email))\n);\n\nserver.tool(\n 'get_customer',\n 'Get detailed information about a specific customer',\n { uuid: z.string().describe('Customer UUID') },\n async ({ uuid }) => jsonResponse(await client.getCustomer(uuid))\n);\n\nserver.tool(\n 'get_customers_batch',\n 'Get detailed information about multiple customers in one call',\n { uuids: z.array(z.string()).describe('Array of customer UUIDs') },\n async ({ uuids }) => jsonResponse(await client.getCustomersBatch(uuids))\n);\n\nserver.tool(\n 'get_customer_activities',\n 'Get subscription activities for a specific customer',\n {\n uuid: z.string().describe('Customer UUID'),\n page: z.number().optional().describe('Page number'),\n perPage: z.number().optional().describe('Results per page'),\n },\n async ({ uuid, page, perPage }) =>\n jsonResponse(await client.getCustomerActivities(uuid, { page, per_page: perPage }))\n);\n\nserver.tool(\n 'get_customer_subscriptions',\n 'Get active subscriptions for a specific customer',\n { uuid: z.string().describe('Customer UUID') },\n async ({ uuid }) => jsonResponse(await client.getCustomerSubscriptions(uuid))\n);\n\nserver.tool(\n 'list_customers',\n 'List all customers with optional filtering',\n {\n status: z.enum(['Lead', 'Active', 'Past Due', 'Cancelled']).optional().describe('Customer status'),\n page: z.number().optional().describe('Page number'),\n perPage: z.number().optional().describe('Results per page'),\n },\n async ({ status, page, perPage }) =>\n jsonResponse(await client.listCustomers({ status, page, per_page: perPage }))\n);\n\nserver.tool(\n 'get_account',\n 'Get ChartMogul account information',\n {},\n async () => jsonResponse(await client.getAccount())\n);\n\nserver.tool(\n 'check_auth',\n 'Check if ChartMogul authentication is configured',\n {},\n async () => jsonResponse({ authenticated: auth.isAuthenticated() })\n);\n\nexport async function runMcpServer() {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n"],"mappings":";;;AAEA,SAAS,WAAAA,iBAAe;;;ACFxB,SAAS,eAAe,OAAuB;AAC7C,SAAO,QAAQ;AACjB;AAEA,IAAM,eAAe,oBAAI,IAAI;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,aAAa,WAA4B;AAChD,SAAO,aAAa,IAAI,SAAS,KAAK,UAAU,SAAS,WAAW;AACtE;AAEA,SAAS,mBAAmB,WAA2B;AACrD,SAAO,UAAU,QAAQ,cAAc,EAAE;AAC3C;AAEO,SAAS,sBAAsB,MAAwB;AAC5D,MAAI,SAAS,QAAQ,SAAS,OAAW,QAAO;AAChD,MAAI,MAAM,QAAQ,IAAI,EAAG,QAAO,KAAK,IAAI,qBAAqB;AAC9D,MAAI,OAAO,SAAS,SAAU,QAAO;AAErC,QAAM,YAAqC,CAAC;AAC5C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,QAAI,aAAa,GAAG,KAAK,OAAO,UAAU,UAAU;AAClD,gBAAU,mBAAmB,GAAG,CAAC,IAAI,eAAe,KAAK;AAAA,IAC3D,OAAO;AACL,gBAAU,GAAG,IAAI,sBAAsB,KAAK;AAAA,IAC9C;AAAA,EACF;AACA,SAAO;AACT;;;AC7CA,IAAI,sBAAqC,CAAC;AAEnC,SAAS,iBAAiB,SAA8B;AAC7D,wBAAsB;AACxB;AAEO,SAAS,WAAW,MAAe,UAAyB,CAAC,GAAS;AAC3E,QAAM,gBAAgB,sBAAsB,IAAI;AAChD,QAAM,gBAAgB,EAAE,GAAG,qBAAqB,GAAG,QAAQ;AAE3D,QAAM,aAAa,cAAc,UAC7B,KAAK,UAAU,aAAa,IAC5B,KAAK,UAAU,eAAe,MAAM,CAAC;AAEzC,UAAQ,IAAI,UAAU;AACxB;;;AClBA,SAAS,eAAe;;;ACAxB,SAAS,aAAa;;;ACAtB,OAAO,UAAU;AAMjB,IAAM,QAAQ,IAAI,KAAmB;AAAA,EACnC,aAAa;AACf,CAAC;AAEM,IAAM,SAAS;AAAA,EACpB,uBAA2C;AACzC,WAAO,MAAM,IAAI,mBAAmB,KAAK,QAAQ,IAAI;AAAA,EACvD;AAAA,EAEA,qBAAqB,gBAA8B;AACjD,UAAM,IAAI,qBAAqB,cAAc;AAAA,EAC/C;AAAA,EAEA,yBAA+B;AAC7B,UAAM,OAAO,mBAAmB;AAAA,EAClC;AAAA,EAEA,QAAc;AACZ,UAAM,MAAM;AAAA,EACd;AACF;;;ADvBA,IAAM,eAAe;AACrB,IAAM,kBAAkB;AAExB,IAAM,4BACJ;AAKF,SAAS,WAAW,SAA+B;AACjD,MAAI;AACF,WAAO,IAAI,MAAM,cAAc,OAAO;AAAA,EACxC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,YAAY,SAAgC;AACnD,QAAM,QAAQ,WAAW,OAAO;AAChC,MAAI,OAAO;AACT,QAAI;AACF,aAAO,MAAM,YAAY;AAAA,IAC3B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,YAAY,SAAiB,OAAqB;AACzD,QAAM,QAAQ,WAAW,OAAO;AAChC,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AACA,QAAM,YAAY,KAAK;AACzB;AAEA,SAAS,eAAe,SAA0B;AAChD,QAAM,QAAQ,WAAW,OAAO;AAChC,MAAI,OAAO;AACT,WAAO,MAAM,eAAe;AAAA,EAC9B;AACA,SAAO;AACT;AAEO,IAAM,cAAN,MAAkB;AAAA,EACvB,YAA2B;AACzB,WAAO,YAAY,eAAe,KAAK,QAAQ,IAAI,sBAAsB;AAAA,EAC3E;AAAA,EAEA,UAAU,QAAsB;AAC9B,gBAAY,iBAAiB,MAAM;AAAA,EACrC;AAAA,EAEA,kBAA2B;AACzB,WAAO,KAAK,UAAU,MAAM;AAAA,EAC9B;AAAA,EAEA,SAAe;AACb,mBAAe,eAAe;AAC9B,WAAO,uBAAuB;AAAA,EAChC;AACF;AAEO,IAAM,OAAO,IAAI,YAAY;;;AEhE7B,IAAM,qBAAN,cAAiC,MAAM;AAAA,EAC5C,YACE,SACO,YACP;AACA,UAAM,OAAO;AAFN;AAGP,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,qBAAN,cAAiC,MAAM;AAAA,EAC5C,YACE,SACO,UACA,YACP;AACA,UAAM,OAAO;AAHN;AACA;AAGP,SAAK,OAAO;AAAA,EACd;AACF;AAEO,SAAS,qBAAqB,SAAyB;AAC5D,QAAM,oBAAoB;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,YAAY;AAChB,aAAW,WAAW,mBAAmB;AACvC,gBAAY,UAAU,QAAQ,SAAS,YAAY;AAAA,EACrD;AAEA,SAAO,UAAU,SAAS,MAAM,UAAU,UAAU,GAAG,GAAG,IAAI,QAAQ;AACxE;AAWA,SAAS,cAAc,OAAkD;AACvE,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEO,SAAS,iBAAiB,OAAiC;AAChE,MAAI,CAAC,cAAc,KAAK,GAAG;AACzB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,WAAW;AAEjB,MAAI,SAAS;AACb,MAAI,SAAS,SAAS;AACpB,aAAS,SAAS;AAAA,EACpB,WAAW,SAAS,QAAQ,QAAQ;AAClC,aAAS,SAAS,OACf,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,EAC7B,OAAO,OAAO,EACd,KAAK,IAAI;AAAA,EACd;AAEA,SAAO;AAAA,IACL,MAAM,SAAS,SAAS;AAAA,IACxB,QAAQ,qBAAqB,MAAM;AAAA,EACrC;AACF;AAEA,SAAS,oBAAoB,MAAc,QAAgB,YAA2B;AACpF,QAAM,OACJ,SAAS,sBACL,iEACA;AAEN,QAAM,WAA2F;AAAA,IAC/F,OAAO,EAAE,MAAM,QAAQ,WAAW;AAAA,EACpC;AAEA,MAAI,MAAM;AACR,aAAS,OAAO;AAAA,EAClB;AAEA,aAAW,QAAQ;AACnB,UAAQ,KAAK,CAAC;AAChB;AAEO,SAAS,sBAAsB,OAAuB;AAC3D,MAAI,iBAAiB,oBAAoB;AACvC,UAAM,YAAY,qBAAqB,MAAM,OAAO;AACpD,wBAAoB,aAAa,WAAW,MAAM,cAAc,CAAC;AAAA,EACnE;AAEA,MAAI,iBAAiB,oBAAoB;AACvC,UAAM,UAAU,iBAAiB,MAAM,QAAQ;AAC/C,wBAAoB,QAAQ,MAAM,QAAQ,QAAQ,MAAM,UAAU;AAAA,EACpE;AAEA,MAAI,iBAAiB,OAAO;AAC1B,UAAM,YAAY,qBAAqB,MAAM,OAAO;AACpD,wBAAoB,iBAAiB,WAAW,CAAC;AAAA,EACnD;AAEA,sBAAoB,iBAAiB,gCAAgC,CAAC;AACxE;;;AClGA,IAAM,WAAW;AACjB,IAAM,eAAe,MAAO,KAAK,KAAK,KAAK;AAE3C,SAAS,sBAAsB,cAAsB,eAA+B;AAClF,SAAO,KAAK;AAAA,KACT,IAAI,KAAK,YAAY,EAAE,QAAQ,IAAI,IAAI,KAAK,aAAa,EAAE,QAAQ,KAAK;AAAA,EAC3E;AACF;AAEO,IAAM,mBAAN,MAAuB;AAAA,EACpB,gBAAwB;AAC9B,UAAM,SAAS,KAAK,UAAU;AAC9B,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,mBAAmB,wDAAwD,GAAG;AAAA,IAC1F;AACA,WAAO,SAAS,OAAO,KAAK,GAAG,MAAM,GAAG,EAAE,SAAS,QAAQ,CAAC;AAAA,EAC9D;AAAA,EAEA,MAAc,QACZ,QACA,MACA,UAGI,CAAC,GACO;AACZ,UAAM,EAAE,QAAQ,KAAK,IAAI;AAEzB,UAAM,MAAM,IAAI,IAAI,GAAG,QAAQ,GAAG,IAAI,EAAE;AACxC,QAAI,QAAQ;AACV,aAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC/C,YAAI,UAAU,QAAW;AACvB,cAAI,aAAa,IAAI,KAAK,OAAO,KAAK,CAAC;AAAA,QACzC;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,aAAa,KAAK,cAAc;AACtC,UAAM,eAA4B;AAAA,MAChC;AAAA,MACA,SAAS;AAAA,QACP,eAAe;AAAA,QACf,gBAAgB;AAAA,MAClB;AAAA,IACF;AACA,QAAI,MAAM;AACR,mBAAa,OAAO,KAAK,UAAU,IAAI;AAAA,IACzC;AAEA,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,MAAM,IAAI,SAAS,GAAG,YAAY;AAAA,IACrD,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,YAAM,IAAI,mBAAmB,2BAA2B,OAAO,IAAI,CAAC;AAAA,IACtE;AAEA,QAAI,SAAS,WAAW,KAAK;AAC3B,YAAM,aAAa,SAAS,QAAQ,IAAI,aAAa,KAAK;AAC1D,YAAM,IAAI;AAAA,QACR,+CAA+C,UAAU;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,KAAK;AAC3B,aAAO,CAAC;AAAA,IACV;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,QAAQ,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACpD,YAAM,IAAI,mBAAmB,sBAAsB,OAAO,SAAS,MAAM;AAAA,IAC3E;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA,EAEA,MAAM,aAAa;AACjB,WAAO,KAAK,QAAiB,OAAO,UAAU;AAAA,EAChD;AAAA,EAEA,MAAM,OAAO;AACX,WAAO,KAAK,QAA0B,OAAO,OAAO;AAAA,EACtD;AAAA,EAEA,MAAM,kBAAkB;AACtB,WAAO,KAAK,QAAwC,OAAO,eAAe;AAAA,EAC5E;AAAA,EAEA,MAAM,cAAc,MAAc;AAChC,WAAO,KAAK,QAAoB,OAAO,iBAAiB,IAAI,EAAE;AAAA,EAChE;AAAA,EAEA,MAAM,cACJ,SAOI,CAAC,GACL;AACA,WAAO,KAAK,QAA8B,OAAO,cAAc,EAAE,OAAO,CAAC;AAAA,EAC3E;AAAA,EAEA,MAAM,YAAY,MAAc;AAC9B,WAAO,KAAK,QAAkB,OAAO,cAAc,IAAI,EAAE;AAAA,EAC3D;AAAA,EAEA,MAAM,gBAAgB,OAAe;AACnC,WAAO,KAAK,QAAiC,OAAO,qBAAqB;AAAA,MACvE,QAAQ,EAAE,MAAM;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,kBAAkB,OAAsC;AAC5D,UAAM,UAAU,MAAM,QAAQ;AAAA,MAC5B,MAAM,IAAI,CAAC,SAAS,KAAK,YAAY,IAAI,EAAE,MAAM,MAAM,IAAI,CAAC;AAAA,IAC9D;AACA,WAAO,QAAQ,OAAO,CAAC,MAAqB,MAAM,IAAI;AAAA,EACxD;AAAA,EAEA,MAAM,sBAAsB,MAAc,SAA+C,CAAC,GAAG;AAC3F,WAAO,KAAK,QAAqC,OAAO,cAAc,IAAI,eAAe;AAAA,MACvF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,yBAAyB,MAAc;AAC3C,WAAO,KAAK,QAAqC,OAAO,cAAc,IAAI,gBAAgB;AAAA,EAC5F;AAAA,EAEA,MAAM,UAAU,SAA0E,CAAC,GAAG;AAC5F,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,MACA,EAAE,OAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,MAAc;AAC1B,WAAO,KAAK,QAAc,OAAO,UAAU,IAAI,EAAE;AAAA,EACnD;AAAA,EAEA,MAAM,aACJ,SAMI,CAAC,GACL;AACA,WAAO,KAAK,QAAoD,OAAO,aAAa,EAAE,OAAO,CAAC;AAAA,EAChG;AAAA,EAEA,MAAM,WAAW,MAAc;AAC7B,WAAO,KAAK,QAAiB,OAAO,aAAa,IAAI,EAAE;AAAA,EACzD;AAAA,EAEA,MAAM,OAAO,QAAyE;AACpF,WAAO,KAAK,QAAyB,OAAO,gBAAgB,EAAE,OAAO,CAAC;AAAA,EACxE;AAAA,EAEA,MAAM,OAAO,QAAyE;AACpF,WAAO,KAAK,QAAyB,OAAO,gBAAgB,EAAE,OAAO,CAAC;AAAA,EACxE;AAAA,EAEA,MAAM,QAAQ,QAAyE;AACrF,WAAO,KAAK,QAAyB,OAAO,iBAAiB,EAAE,OAAO,CAAC;AAAA,EACzE;AAAA,EAEA,MAAM,OAAO,QAAyE;AACpF,WAAO,KAAK,QAAyB,OAAO,gBAAgB,EAAE,OAAO,CAAC;AAAA,EACxE;AAAA,EAEA,MAAM,iBAAiB,QAAyE;AAC9F,WAAO,KAAK,QAAyB,OAAO,2BAA2B,EAAE,OAAO,CAAC;AAAA,EACnF;AAAA,EAEA,MAAM,qBAAqB,QAIxB;AACD,WAAO,KAAK,QAAyB,OAAO,gCAAgC,EAAE,OAAO,CAAC;AAAA,EACxF;AAAA,EAEA,MAAM,gBAAgB,QAAyE;AAC7F,WAAO,KAAK,QAAyB,OAAO,2BAA2B,EAAE,OAAO,CAAC;AAAA,EACnF;AAAA,EAEA,MAAM,OAAO,QAAyE;AACpF,WAAO,KAAK,QAAyB,OAAO,gBAAgB,EAAE,OAAO,CAAC;AAAA,EACxE;AAAA,EAEA,MAAM,cAAc,QAAyE;AAC3F,WAAO,KAAK,QAAyB,OAAO,gBAAgB,EAAE,OAAO,CAAC;AAAA,EACxE;AAAA,EAEA,MAAM,eACJ,SAMI,CAAC,GACL;AACA,WAAO,KAAK,QAAqC,OAAO,eAAe,EAAE,OAAO,CAAC;AAAA,EACnF;AAAA,EAEA,MAAM,uBACJ,SAMI,CAAC,GACyC;AAC9C,UAAM,aAAa,MAAM,KAAK,eAAe,MAAM;AAEnD,UAAM,sBAAsB;AAAA,MAC1B,GAAG,IAAI,IAAI,WAAW,QAAQ,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,OAAO,OAAO,CAAC;AAAA,IAC9E;AAEA,UAAM,YAAY,MAAM,KAAK,kBAAkB,mBAAmB;AAClE,UAAM,cAAc,IAAI,IAAI,UAAU,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAE7D,UAAM,kBAAsC,WAAW,QAAQ,IAAI,CAAC,aAAa;AAC/E,YAAM,WAAW,YAAY,IAAI,SAAS,eAAe,CAAC;AAC1D,YAAM,gBAAgB,WAAW,gBAAgB,KAAK,UAAU;AAChE,YAAM,eAAe,gBACjB,sBAAsB,SAAS,MAAM,aAAa,IAClD;AAEJ,aAAO;AAAA,QACL,GAAG;AAAA,QACH,kBAAkB;AAAA,QAClB,0BAA0B;AAAA,MAC5B;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEO,IAAM,SAAS,IAAI,iBAAiB;;;AC1QpC,SAAS,kBACd,IAC+B;AAC/B,SAAO,UAAU,SAAY;AAC3B,QAAI;AACF,YAAM,GAAG,GAAG,IAAI;AAAA,IAClB,SAAS,OAAO;AACd,4BAAsB,KAAK;AAAA,IAC7B;AAAA,EACF;AACF;;;ALNO,SAAS,oBAA6B;AAC3C,QAAM,MAAM,IAAI,QAAQ,MAAM,EAAE,YAAY,2BAA2B;AAEvE,MACG,QAAQ,OAAO,EACf,YAAY,sCAAsC,EAClD,eAAe,mBAAmB,oBAAoB,EACtD;AAAA,IACC,kBAAkB,OAAO,YAAgC;AACvD,WAAK,UAAU,QAAQ,MAAM;AAC7B,YAAM,OAAO,KAAK;AAClB,iBAAW,EAAE,SAAS,6CAA6C,CAAC;AAAA,IACtE,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,QAAQ,EAChB,YAAY,2BAA2B,EACvC;AAAA,IACC,kBAAkB,YAAY;AAC5B,WAAK,OAAO;AACZ,iBAAW,EAAE,SAAS,0BAA0B,CAAC;AAAA,IACnD,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,QAAQ,EAChB,YAAY,6BAA6B,EACzC;AAAA,IACC,kBAAkB,YAAY;AAC5B,iBAAW,EAAE,eAAe,KAAK,gBAAgB,EAAE,CAAC;AAAA,IACtD,CAAC;AAAA,EACH;AAEF,SAAO;AACT;;;AMzCA,SAAS,WAAAC,gBAAe;AAKjB,SAAS,uBAAgC;AAC9C,QAAM,MAAM,IAAIC,SAAQ,SAAS,EAAE,YAAY,oBAAoB;AAEnE,MACG,QAAQ,MAAM,EACd,YAAY,sBAAsB,EAClC;AAAA,IACC,kBAAkB,YAAY;AAC5B,YAAM,UAAU,MAAM,OAAO,WAAW;AACxC,iBAAW,OAAO;AAAA,IACpB,CAAC;AAAA,EACH;AAEF,SAAO;AACT;;;ACnBA,SAAS,WAAAC,gBAAe;AAMjB,SAAS,2BAAoC;AAClD,QAAM,MAAM,IAAIC,SAAQ,cAAc,EAAE,YAAY,wBAAwB;AAE5E,MACG,QAAQ,MAAM,EACd,YAAY,uBAAuB,EACnC;AAAA,IACC,kBAAkB,YAAY;AAC5B,YAAM,SAAS,MAAM,OAAO,gBAAgB;AAC5C,iBAAW,OAAO,YAAY;AAAA,IAChC,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,MAAM,EACd,YAAY,oBAAoB,EAChC,SAAS,UAAU,kBAAkB,EACrC;AAAA,IACC,kBAAkB,OAAO,SAAiB;AACxC,YAAM,aAAa,MAAM,OAAO,cAAc,IAAI;AAClD,iBAAW,UAAU;AAAA,IACvB,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,aAAa,EACrB,YAAY,uCAAuC,EACnD,SAAS,UAAU,kBAAkB,EACrC;AAAA,IACC,kBAAkB,OAAO,SAAiB;AACxC,aAAO,qBAAqB,IAAI;AAChC,iBAAW,EAAE,SAAS,8BAA8B,IAAI,GAAG,CAAC;AAAA,IAC9D,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,aAAa,EACrB,YAAY,yBAAyB,EACrC;AAAA,IACC,kBAAkB,YAAY;AAC5B,YAAM,YAAY,OAAO,qBAAqB;AAC9C,iBAAW,EAAE,qBAAqB,aAAa,KAAK,CAAC;AAAA,IACvD,CAAC;AAAA,EACH;AAEF,SAAO;AACT;;;ACpDA,SAAS,WAAAC,gBAAe;AAMjB,SAAS,yBAAkC;AAChD,QAAM,MAAM,IAAIC,SAAQ,WAAW,EAAE,YAAY,kBAAkB;AAEnE,MACG,QAAQ,MAAM,EACd,YAAY,gBAAgB,EAC5B,OAAO,wBAAwB,4BAA4B,EAC3D,OAAO,qBAAqB,4CAA4C,EACxE,OAAO,sBAAsB,uBAAuB,EACpD,OAAO,mBAAmB,aAAa,EACvC,OAAO,uBAAuB,4BAA4B,EAC1D;AAAA,IACC;AAAA,MACE,OAAO,YAMD;AACJ,cAAM,SAAS,MAAM,OAAO,cAAc;AAAA,UACxC,kBAAkB,QAAQ,cAAc,OAAO,qBAAqB;AAAA,UACpE,QAAQ,QAAQ;AAAA,UAChB,aAAa,QAAQ;AAAA,UACrB,MAAM,QAAQ,OAAO,SAAS,QAAQ,MAAM,EAAE,IAAI;AAAA,UAClD,UAAU,QAAQ,UAAU,SAAS,QAAQ,SAAS,EAAE,IAAI;AAAA,QAC9D,CAAC;AACD,mBAAW,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEF,MACG,QAAQ,MAAM,EACd,YAAY,iBAAiB,EAC7B,SAAS,UAAU,eAAe,EAClC;AAAA,IACC,kBAAkB,OAAO,SAAiB;AACxC,YAAM,WAAW,MAAM,OAAO,YAAY,IAAI;AAC9C,iBAAW,QAAQ;AAAA,IACrB,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,QAAQ,EAChB,YAAY,2BAA2B,EACvC,eAAe,mBAAmB,yBAAyB,EAC3D;AAAA,IACC,kBAAkB,OAAO,YAA+B;AACtD,YAAM,SAAS,MAAM,OAAO,gBAAgB,QAAQ,KAAK;AACzD,iBAAW,OAAO,OAAO;AAAA,IAC3B,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,YAAY,EACpB,YAAY,0BAA0B,EACtC,SAAS,UAAU,eAAe,EAClC,OAAO,mBAAmB,aAAa,EACvC,OAAO,uBAAuB,kBAAkB,EAChD;AAAA,IACC,kBAAkB,OAAO,MAAc,YAAiD;AACtF,YAAM,SAAS,MAAM,OAAO,sBAAsB,MAAM;AAAA,QACtD,MAAM,QAAQ,OAAO,SAAS,QAAQ,MAAM,EAAE,IAAI;AAAA,QAClD,UAAU,QAAQ,UAAU,SAAS,QAAQ,SAAS,EAAE,IAAI;AAAA,MAC9D,CAAC;AACD,iBAAW,MAAM;AAAA,IACnB,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,eAAe,EACvB,YAAY,6BAA6B,EACzC,SAAS,UAAU,eAAe,EAClC;AAAA,IACC,kBAAkB,OAAO,SAAiB;AACxC,YAAM,SAAS,MAAM,OAAO,yBAAyB,IAAI;AACzD,iBAAW,OAAO,OAAO;AAAA,IAC3B,CAAC;AAAA,EACH;AAEF,SAAO;AACT;;;ACxFA,SAAS,WAAAC,gBAAe;AAMjB,SAAS,qBAA8B;AAC5C,QAAM,MAAM,IAAIC,SAAQ,OAAO,EAAE,YAAY,cAAc;AAE3D,MACG,QAAQ,MAAM,EACd,YAAY,YAAY,EACxB,OAAO,wBAAwB,4BAA4B,EAC3D,OAAO,mBAAmB,aAAa,EACvC,OAAO,uBAAuB,kBAAkB,EAChD;AAAA,IACC;AAAA,MACE,OAAO,YAAsE;AAC3E,cAAM,SAAS,MAAM,OAAO,UAAU;AAAA,UACpC,kBAAkB,QAAQ,cAAc,OAAO,qBAAqB;AAAA,UACpE,MAAM,QAAQ,OAAO,SAAS,QAAQ,MAAM,EAAE,IAAI;AAAA,UAClD,UAAU,QAAQ,UAAU,SAAS,QAAQ,SAAS,EAAE,IAAI;AAAA,QAC9D,CAAC;AACD,mBAAW,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEF,MACG,QAAQ,MAAM,EACd,YAAY,aAAa,EACzB,SAAS,UAAU,WAAW,EAC9B;AAAA,IACC,kBAAkB,OAAO,SAAiB;AACxC,YAAM,OAAO,MAAM,OAAO,QAAQ,IAAI;AACtC,iBAAW,IAAI;AAAA,IACjB,CAAC;AAAA,EACH;AAEF,SAAO;AACT;;;ACxCA,SAAS,WAAAC,gBAAe;AAMjB,SAAS,wBAAiC;AAC/C,QAAM,MAAM,IAAIC,SAAQ,UAAU,EAAE,YAAY,iBAAiB;AAEjE,MACG,QAAQ,MAAM,EACd,YAAY,eAAe,EAC3B,OAAO,qBAAqB,yBAAyB,EACrD,OAAO,wBAAwB,4BAA4B,EAC3D,OAAO,sBAAsB,uBAAuB,EACpD,OAAO,mBAAmB,aAAa,EACvC,OAAO,uBAAuB,kBAAkB,EAChD;AAAA,IACC;AAAA,MACE,OAAO,YAMD;AACJ,cAAM,SAAS,MAAM,OAAO,aAAa;AAAA,UACvC,eAAe,QAAQ;AAAA,UACvB,kBAAkB,QAAQ,cAAc,OAAO,qBAAqB;AAAA,UACpE,aAAa,QAAQ;AAAA,UACrB,MAAM,QAAQ,OAAO,SAAS,QAAQ,MAAM,EAAE,IAAI;AAAA,UAClD,UAAU,QAAQ,UAAU,SAAS,QAAQ,SAAS,EAAE,IAAI;AAAA,QAC9D,CAAC;AACD,mBAAW,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEF,MACG,QAAQ,MAAM,EACd,YAAY,iBAAiB,EAC7B,SAAS,UAAU,cAAc,EACjC;AAAA,IACC,kBAAkB,OAAO,SAAiB;AACxC,YAAM,UAAU,MAAM,OAAO,WAAW,IAAI;AAC5C,iBAAW,OAAO;AAAA,IACpB,CAAC;AAAA,EACH;AAEF,SAAO;AACT;;;AClDA,SAAS,WAAAC,gBAAe;;;ACAxB,OAAO,WAAW;AAGX,SAAS,UAAU,OAAuB;AAC/C,QAAM,IAAI,MAAM,KAAK;AACrB,MAAI,CAAC,EAAE,QAAQ,GAAG;AAChB,UAAM,IAAI,mBAAmB,iBAAiB,KAAK,IAAI,GAAG;AAAA,EAC5D;AACA,SAAO,EAAE,OAAO,YAAY;AAC9B;AAEO,SAAS,sBAA8D;AAC5E,SAAO;AAAA,IACL,WAAW,MAAM,EAAE,SAAS,IAAI,KAAK,EAAE,OAAO,YAAY;AAAA,IAC1D,SAAS,MAAM,EAAE,OAAO,YAAY;AAAA,EACtC;AACF;;;ADJA,SAAS,kBAAkB,SAAwB;AACjD,QAAM,WAAW,oBAAoB;AACrC,SAAO;AAAA,IACL,cAAc,QAAQ,YAAY,UAAU,QAAQ,SAAS,IAAI,SAAS;AAAA,IAC1E,YAAY,QAAQ,UAAU,UAAU,QAAQ,OAAO,IAAI,SAAS;AAAA,IACpE,UAAU,QAAQ;AAAA,EACpB;AACF;AAEO,SAAS,uBAAgC;AAC9C,QAAM,MAAM,IAAIC,SAAQ,SAAS,EAAE,YAAY,uBAAuB;AAEtE,MACG,QAAQ,KAAK,EACb,YAAY,qBAAqB,EACjC,OAAO,uBAAuB,yBAAyB,EACvD,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,yBAAyB,sCAAsC,EACtE;AAAA,IACC,kBAAkB,OAAO,YAA2B;AAClD,YAAM,SAAS,MAAM,OAAO,cAAc,kBAAkB,OAAO,CAAC;AACpE,iBAAW,MAAM;AAAA,IACnB,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,KAAK,EACb,YAAY,+BAA+B,EAC3C,OAAO,uBAAuB,yBAAyB,EACvD,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,yBAAyB,sCAAsC,EACtE;AAAA,IACC,kBAAkB,OAAO,YAA2B;AAClD,YAAM,SAAS,MAAM,OAAO,OAAO,kBAAkB,OAAO,CAAC;AAC7D,iBAAW,MAAM;AAAA,IACnB,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,KAAK,EACb,YAAY,8BAA8B,EAC1C,OAAO,uBAAuB,yBAAyB,EACvD,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,yBAAyB,sCAAsC,EACtE;AAAA,IACC,kBAAkB,OAAO,YAA2B;AAClD,YAAM,SAAS,MAAM,OAAO,OAAO,kBAAkB,OAAO,CAAC;AAC7D,iBAAW,MAAM;AAAA,IACnB,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,MAAM,EACd,YAAY,iCAAiC,EAC7C,OAAO,uBAAuB,yBAAyB,EACvD,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,yBAAyB,sCAAsC,EACtE;AAAA,IACC,kBAAkB,OAAO,YAA2B;AAClD,YAAM,SAAS,MAAM,OAAO,QAAQ,kBAAkB,OAAO,CAAC;AAC9D,iBAAW,MAAM;AAAA,IACnB,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,KAAK,EACb,YAAY,wBAAwB,EACpC,OAAO,uBAAuB,yBAAyB,EACvD,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,yBAAyB,sCAAsC,EACtE;AAAA,IACC,kBAAkB,OAAO,YAA2B;AAClD,YAAM,SAAS,MAAM,OAAO,OAAO,kBAAkB,OAAO,CAAC;AAC7D,iBAAW,MAAM;AAAA,IACnB,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,gBAAgB,EACxB,YAAY,8BAA8B,EAC1C,OAAO,uBAAuB,yBAAyB,EACvD,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,yBAAyB,sCAAsC,EACtE;AAAA,IACC,kBAAkB,OAAO,YAA2B;AAClD,YAAM,SAAS,MAAM,OAAO,iBAAiB,kBAAkB,OAAO,CAAC;AACvE,iBAAW,MAAM;AAAA,IACnB,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,gBAAgB,EACxB,YAAY,yBAAyB,EACrC,OAAO,uBAAuB,yBAAyB,EACvD,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,yBAAyB,sCAAsC,EACtE;AAAA,IACC,kBAAkB,OAAO,YAA2B;AAClD,YAAM,SAAS,MAAM,OAAO,qBAAqB,kBAAkB,OAAO,CAAC;AAC3E,iBAAW,MAAM;AAAA,IACnB,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,WAAW,EACnB,YAAY,oBAAoB,EAChC,OAAO,uBAAuB,yBAAyB,EACvD,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,yBAAyB,sCAAsC,EACtE;AAAA,IACC,kBAAkB,OAAO,YAA2B;AAClD,YAAM,SAAS,MAAM,OAAO,gBAAgB,kBAAkB,OAAO,CAAC;AACtE,iBAAW,MAAM;AAAA,IACnB,CAAC;AAAA,EACH;AAEF,MACG,QAAQ,KAAK,EACb,YAAY,6BAA6B,EACzC,OAAO,uBAAuB,yBAAyB,EACvD,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,yBAAyB,sCAAsC,EACtE;AAAA,IACC,kBAAkB,OAAO,YAA2B;AAClD,YAAM,SAAS,MAAM,OAAO,OAAO,kBAAkB,OAAO,CAAC;AAC7D,iBAAW,MAAM;AAAA,IACnB,CAAC;AAAA,EACH;AAEF,SAAO;AACT;;;AE9IA,SAAS,WAAAC,gBAAe;AAKjB,SAAS,0BAAmC;AACjD,QAAM,MAAM,IAAIC,SAAQ,YAAY,EAAE,YAAY,qBAAqB;AAEvE,MACG,QAAQ,MAAM,EACd,YAAY,iBAAiB,EAC7B,OAAO,uBAAuB,yBAAyB,EACvD,OAAO,qBAAqB,uBAAuB,EACnD,OAAO,iBAAiB,sEAAsE,EAC9F,OAAO,mBAAmB,aAAa,EACvC,OAAO,uBAAuB,kBAAkB,EAChD,OAAO,YAAY,uEAAuE,EAC1F;AAAA,IACC;AAAA,MACE,OAAO,YAOD;AACJ,cAAM,SAAS;AAAA,UACb,cAAc,QAAQ;AAAA,UACtB,YAAY,QAAQ;AAAA,UACpB,MAAM,QAAQ;AAAA,UACd,MAAM,QAAQ,OAAO,SAAS,QAAQ,MAAM,EAAE,IAAI;AAAA,UAClD,UAAU,QAAQ,UAAU,SAAS,QAAQ,SAAS,EAAE,IAAI;AAAA,QAC9D;AACA,cAAM,SAAS,QAAQ,SACnB,MAAM,OAAO,uBAAuB,MAAM,IAC1C,MAAM,OAAO,eAAe,MAAM;AACtC,mBAAW,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEF,SAAO;AACT;;;AC3CA,SAAS,WAAAC,gBAAe;;;ACAxB,SAAS,iBAAiB;AAC1B,SAAS,4BAA4B;AACrC,SAAS,SAAS;AAKlB,IAAM,SAAS,IAAI,UAAU;AAAA,EAC3B,MAAM;AAAA,EACN,SAAS;AACX,CAAC;AAED,SAAS,aAAa,MAAe;AACnC,QAAM,YAAY,sBAAsB,IAAI;AAC5C,SAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,WAAW,MAAM,CAAC,EAAE,CAAC,EAAE;AAC1F;AAEA,IAAM,kBAAkB;AAAA,EACtB,WAAW,EAAE,OAAO,EAAE,SAAS,yBAAyB;AAAA,EACxD,SAAS,EAAE,OAAO,EAAE,SAAS,uBAAuB;AAAA,EACpD,UAAU,EACP,KAAK,CAAC,OAAO,QAAQ,SAAS,SAAS,CAAC,EACxC,SAAS,EACT,SAAS,sBAAsB;AACpC;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,WAAW,gBAAgB;AAAA,IAC3B,SAAS,gBAAgB;AAAA,IACzB,UAAU,gBAAgB;AAAA,EAC5B;AAAA,EACA,OAAO,EAAE,WAAW,SAAS,SAAS,MACpC,aAAa,MAAM,OAAO,cAAc,EAAE,cAAc,WAAW,YAAY,SAAS,SAAS,CAAC,CAAC;AACvG;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,WAAW,gBAAgB;AAAA,IAC3B,SAAS,gBAAgB;AAAA,IACzB,UAAU,gBAAgB;AAAA,EAC5B;AAAA,EACA,OAAO,EAAE,WAAW,SAAS,SAAS,MACpC,aAAa,MAAM,OAAO,OAAO,EAAE,cAAc,WAAW,YAAY,SAAS,SAAS,CAAC,CAAC;AAChG;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,WAAW,gBAAgB;AAAA,IAC3B,SAAS,gBAAgB;AAAA,IACzB,UAAU,gBAAgB;AAAA,EAC5B;AAAA,EACA,OAAO,EAAE,WAAW,SAAS,SAAS,MACpC,aAAa,MAAM,OAAO,OAAO,EAAE,cAAc,WAAW,YAAY,SAAS,SAAS,CAAC,CAAC;AAChG;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,WAAW,gBAAgB;AAAA,IAC3B,SAAS,gBAAgB;AAAA,IACzB,UAAU,gBAAgB;AAAA,EAC5B;AAAA,EACA,OAAO,EAAE,WAAW,SAAS,SAAS,MACpC,aAAa,MAAM,OAAO,qBAAqB,EAAE,cAAc,WAAW,YAAY,SAAS,SAAS,CAAC,CAAC;AAC9G;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,WAAW,gBAAgB;AAAA,IAC3B,SAAS,gBAAgB;AAAA,IACzB,UAAU,gBAAgB;AAAA,EAC5B;AAAA,EACA,OAAO,EAAE,WAAW,SAAS,SAAS,MACpC,aAAa,MAAM,OAAO,gBAAgB,EAAE,cAAc,WAAW,YAAY,SAAS,SAAS,CAAC,CAAC;AACzG;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,yBAAyB;AAAA,IACnE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,IAC/D,MAAM,EACH,KAAK,CAAC,WAAW,aAAa,eAAe,SAAS,cAAc,CAAC,EACrE,SAAS,EACT,SAAS,sBAAsB;AAAA,IAClC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,aAAa;AAAA,IAClD,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kBAAkB;AAAA,IAC1D,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,uEAAuE;AAAA,EACjH;AAAA,EACA,OAAO,EAAE,WAAW,SAAS,MAAM,MAAM,SAAS,OAAO,MAAM;AAC7D,UAAM,SAAS,EAAE,cAAc,WAAW,YAAY,SAAS,MAAM,MAAM,UAAU,QAAQ;AAC7F,UAAM,SAAS,SACX,MAAM,OAAO,uBAAuB,MAAM,IAC1C,MAAM,OAAO,eAAe,MAAM;AACtC,WAAO,aAAa,MAAM;AAAA,EAC5B;AACF;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,6BAA6B,EAAE;AAAA,EAC5D,OAAO,EAAE,MAAM,MAAM,aAAa,MAAM,OAAO,gBAAgB,KAAK,CAAC;AACvE;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,eAAe,EAAE;AAAA,EAC7C,OAAO,EAAE,KAAK,MAAM,aAAa,MAAM,OAAO,YAAY,IAAI,CAAC;AACjE;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,yBAAyB,EAAE;AAAA,EACjE,OAAO,EAAE,MAAM,MAAM,aAAa,MAAM,OAAO,kBAAkB,KAAK,CAAC;AACzE;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,MAAM,EAAE,OAAO,EAAE,SAAS,eAAe;AAAA,IACzC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,aAAa;AAAA,IAClD,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kBAAkB;AAAA,EAC5D;AAAA,EACA,OAAO,EAAE,MAAM,MAAM,QAAQ,MAC3B,aAAa,MAAM,OAAO,sBAAsB,MAAM,EAAE,MAAM,UAAU,QAAQ,CAAC,CAAC;AACtF;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,eAAe,EAAE;AAAA,EAC7C,OAAO,EAAE,KAAK,MAAM,aAAa,MAAM,OAAO,yBAAyB,IAAI,CAAC;AAC9E;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA;AAAA,IACE,QAAQ,EAAE,KAAK,CAAC,QAAQ,UAAU,YAAY,WAAW,CAAC,EAAE,SAAS,EAAE,SAAS,iBAAiB;AAAA,IACjG,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,aAAa;AAAA,IAClD,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kBAAkB;AAAA,EAC5D;AAAA,EACA,OAAO,EAAE,QAAQ,MAAM,QAAQ,MAC7B,aAAa,MAAM,OAAO,cAAc,EAAE,QAAQ,MAAM,UAAU,QAAQ,CAAC,CAAC;AAChF;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,YAAY,aAAa,MAAM,OAAO,WAAW,CAAC;AACpD;AAEA,OAAO;AAAA,EACL;AAAA,EACA;AAAA,EACA,CAAC;AAAA,EACD,YAAY,aAAa,EAAE,eAAe,KAAK,gBAAgB,EAAE,CAAC;AACpE;AAEA,eAAsB,eAAe;AACnC,QAAM,YAAY,IAAI,qBAAqB;AAC3C,QAAM,OAAO,QAAQ,SAAS;AAChC;;;AD/KO,SAAS,mBAA4B;AAC1C,QAAM,MAAM,IAAIC,SAAQ,KAAK,EAAE,YAAY,2BAA2B;AAEtE,MAAI,OAAO,YAAY;AACrB,UAAM,aAAa;AAAA,EACrB,CAAC;AAED,SAAO;AACT;;;AjBKA,IAAM,UAAU,OAAqC,UAAc;AAEnE,IAAM,UAAU,IAAIC,UAAQ;AAE5B,QACG,KAAK,YAAY,EACjB,YAAY,mDAAmD,EAC/D,QAAQ,OAAO,EACf,OAAO,iBAAiB,oCAAoC,EAC5D,KAAK,aAAa,CAAC,gBAAgB;AAClC,QAAM,UAAU,YAAY,KAAK;AACjC,mBAAiB;AAAA,IACf,SAAS,QAAQ;AAAA,EACnB,CAAC;AACH,CAAC;AAEH,QAAQ,WAAW,kBAAkB,CAAC;AACtC,QAAQ,WAAW,qBAAqB,CAAC;AACzC,QAAQ,WAAW,yBAAyB,CAAC;AAC7C,QAAQ,WAAW,uBAAuB,CAAC;AAC3C,QAAQ,WAAW,mBAAmB,CAAC;AACvC,QAAQ,WAAW,sBAAsB,CAAC;AAC1C,QAAQ,WAAW,qBAAqB,CAAC;AACzC,QAAQ,WAAW,wBAAwB,CAAC;AAC5C,QAAQ,WAAW,iBAAiB,CAAC;AAErC,QAAQ,WAAW,EAAE,MAAM,MAAM;AAC/B,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command","Command"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stephendolan/chartmogul-cli",
3
- "version": "1.2.0",
3
+ "version": "1.4.0",
4
4
  "description": "A command-line interface for ChartMogul analytics",
5
5
  "type": "module",
6
6
  "main": "./dist/cli.js",
@@ -58,7 +58,7 @@
58
58
  },
59
59
  "devDependencies": {
60
60
  "@biomejs/biome": "^1.9.4",
61
- "@types/node": "^20.0.0",
61
+ "@types/bun": "latest",
62
62
  "oxlint": "^0.16.0",
63
63
  "tsup": "^8.0.0",
64
64
  "tsx": "^4.7.0",