@analyticscli/growth-engineer 0.1.1-preview.6 → 0.1.1-preview.7

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.
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env node
2
+ import { promises as fs } from 'node:fs';
2
3
  import process from 'node:process';
3
4
  import { buildPaddleSummary, writeJsonOutput } from './openclaw-exporters-lib.mjs';
4
5
  import { loadOpenClawGrowthSecrets } from './openclaw-growth-env.mjs';
@@ -19,6 +20,7 @@ Options:
19
20
  --from <date> Start date YYYY-MM-DD (default: 30 days before --to)
20
21
  --to <date> End date YYYY-MM-DD, exclusive in Paddle metrics (default: today UTC)
21
22
  --last <duration> Relative window like 30d (used when --from is omitted)
23
+ --config <file> Growth config path for sources.paddle.accounts[]
22
24
  --out <file> Write JSON to file instead of stdout
23
25
  --max-signals <n> Maximum signals to emit (default: 6)
24
26
  --help, -h Show help
@@ -50,6 +52,7 @@ function parseArgs(argv) {
50
52
  from: '',
51
53
  to: defaultTo,
52
54
  last: '30d',
55
+ config: String(process.env.OPENCLAW_GROWTH_CONFIG_PATH || '').trim(),
53
56
  out: '',
54
57
  maxSignals: 6,
55
58
  };
@@ -75,6 +78,10 @@ function parseArgs(argv) {
75
78
  args.last = String(next || '').trim() || args.last;
76
79
  index += 1;
77
80
  }
81
+ else if (token === '--config') {
82
+ args.config = String(next || '').trim();
83
+ index += 1;
84
+ }
78
85
  else if (token === '--out') {
79
86
  args.out = String(next || '').trim();
80
87
  index += 1;
@@ -111,10 +118,48 @@ function buildUrl(baseUrl, pathname, args) {
111
118
  url.searchParams.set('to', args.to);
112
119
  return url.toString();
113
120
  }
114
- async function fetchPaddleMetric(baseUrl, pathname, args) {
115
- const token = String(process.env.PADDLE_API_KEY || '').trim();
121
+ async function readJsonIfPresent(filePath) {
122
+ if (!filePath)
123
+ return null;
124
+ try {
125
+ return JSON.parse(await fs.readFile(filePath, 'utf8'));
126
+ }
127
+ catch {
128
+ return null;
129
+ }
130
+ }
131
+ function normalizePaddleAccount(account, index, source, args) {
132
+ const id = String(account?.id || account?.key || account?.label || `paddle_${index + 1}`)
133
+ .trim()
134
+ .replace(/[^a-zA-Z0-9._-]+/g, '_');
135
+ return {
136
+ id,
137
+ label: String(account?.label || account?.name || account?.id || `Paddle ${index + 1}`).trim(),
138
+ tokenEnv: String(account?.tokenEnv || account?.token_env || account?.secretEnv || (index === 0 ? source?.tokenEnv || 'PADDLE_API_KEY' : `PADDLE_API_KEY_${index + 1}`)).trim(),
139
+ environment: String(account?.environment || source?.environment || args.environment || 'live').trim().toLowerCase() || 'live',
140
+ };
141
+ }
142
+ async function resolvePaddleAccounts(args) {
143
+ const config = await readJsonIfPresent(args.config);
144
+ const source = config?.sources?.paddle || {};
145
+ const accounts = Array.isArray(source.accounts) ? source.accounts : [];
146
+ if (accounts.length > 0) {
147
+ return accounts.map((account, index) => normalizePaddleAccount(account, index, source, args));
148
+ }
149
+ const tokenEnv = String(source.tokenEnv || config?.secrets?.paddleTokenEnv || 'PADDLE_API_KEY').trim();
150
+ return [
151
+ {
152
+ id: 'paddle',
153
+ label: 'Paddle',
154
+ tokenEnv,
155
+ environment: String(source.environment || args.environment || 'live').trim().toLowerCase() || 'live',
156
+ },
157
+ ];
158
+ }
159
+ async function fetchPaddleMetric(baseUrl, pathname, args, tokenEnv) {
160
+ const token = String(process.env[tokenEnv] || '').trim();
116
161
  if (!token) {
117
- throw new Error('Missing PADDLE_API_KEY. Rerun the connector wizard and paste a Paddle API key from Developer Tools > Authentication.');
162
+ throw new Error(`Missing ${tokenEnv}. Rerun the connector wizard and paste a Paddle API key from Developer Tools > Authentication v2.`);
118
163
  }
119
164
  const response = await fetch(buildUrl(baseUrl, pathname, args), {
120
165
  method: 'GET',
@@ -131,36 +176,45 @@ async function fetchPaddleMetric(baseUrl, pathname, args) {
131
176
  }
132
177
  return body.trim() ? JSON.parse(body) : {};
133
178
  }
134
- async function fetchOptionalMetric(baseUrl, pathname, key, args, warnings) {
179
+ async function fetchOptionalMetric(baseUrl, pathname, key, args, warnings, tokenEnv) {
135
180
  try {
136
- return [key, await fetchPaddleMetric(baseUrl, pathname, args)];
181
+ return [key, await fetchPaddleMetric(baseUrl, pathname, args, tokenEnv)];
137
182
  }
138
183
  catch (error) {
139
184
  warnings.push(`${key}: ${error instanceof Error ? error.message : String(error)}`);
140
185
  return [key, null];
141
186
  }
142
187
  }
143
- async function main() {
144
- await loadOpenClawGrowthSecrets();
145
- const args = parseArgs(process.argv.slice(2));
146
- const baseUrl = paddleBaseUrl(args.environment);
188
+ async function fetchAccountSummary(args, account) {
189
+ const environment = ['live', 'sandbox'].includes(account.environment) ? account.environment : args.environment;
190
+ const baseUrl = paddleBaseUrl(environment);
147
191
  const warnings = [];
148
192
  const pairs = await Promise.all([
149
- fetchOptionalMetric(baseUrl, '/metrics/revenue', 'revenue', args, warnings),
150
- fetchOptionalMetric(baseUrl, '/metrics/monthly-recurring-revenue', 'monthlyRecurringRevenue', args, warnings),
151
- fetchOptionalMetric(baseUrl, '/metrics/active-subscribers', 'activeSubscribers', args, warnings),
152
- fetchOptionalMetric(baseUrl, '/metrics/refunds', 'refunds', args, warnings),
153
- fetchOptionalMetric(baseUrl, '/metrics/chargebacks', 'chargebacks', args, warnings),
154
- fetchOptionalMetric(baseUrl, '/metrics/checkout-conversion', 'checkoutConversion', args, warnings),
193
+ fetchOptionalMetric(baseUrl, '/metrics/revenue', 'revenue', args, warnings, account.tokenEnv),
194
+ fetchOptionalMetric(baseUrl, '/metrics/monthly-recurring-revenue', 'monthlyRecurringRevenue', args, warnings, account.tokenEnv),
195
+ fetchOptionalMetric(baseUrl, '/metrics/active-subscribers', 'activeSubscribers', args, warnings, account.tokenEnv),
196
+ fetchOptionalMetric(baseUrl, '/metrics/refunds', 'refunds', args, warnings, account.tokenEnv),
197
+ fetchOptionalMetric(baseUrl, '/metrics/chargebacks', 'chargebacks', args, warnings, account.tokenEnv),
198
+ fetchOptionalMetric(baseUrl, '/metrics/checkout-conversion', 'checkoutConversion', args, warnings, account.tokenEnv),
155
199
  ]);
156
200
  const metrics = Object.fromEntries(pairs);
157
- const summary = buildPaddleSummary({
158
- environment: args.environment,
201
+ return {
202
+ ...account,
203
+ environment,
159
204
  window: `${args.from}_${args.to}`,
160
205
  metrics,
161
206
  warnings,
162
207
  maxSignals: args.maxSignals,
163
- });
208
+ };
209
+ }
210
+ async function main() {
211
+ await loadOpenClawGrowthSecrets();
212
+ const args = parseArgs(process.argv.slice(2));
213
+ const accounts = await resolvePaddleAccounts(args);
214
+ const accountSummaries = await Promise.all(accounts.map((account) => fetchAccountSummary(args, account)));
215
+ const summary = accountSummaries.length > 1
216
+ ? buildPaddleSummary({ accounts: accountSummaries, window: `${args.from}_${args.to}`, maxSignals: args.maxSignals })
217
+ : buildPaddleSummary(accountSummaries[0]);
164
218
  await writeJsonOutput(args.out, summary);
165
219
  }
166
220
  main().catch((error) => {
@@ -1 +1 @@
1
- {"version":3,"file":"export-paddle-summary.mjs","sourceRoot":"","sources":["../../src/runtime/export-paddle-summary.mts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"export-paddle-summary.mjs","sourceRoot":"","sources":["../../src/runtime/export-paddle-summary.mts"],"names":[],"mappings":"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"}
@@ -74,6 +74,21 @@ export declare function buildRevenueCatSummary(input: any): {
74
74
  };
75
75
  };
76
76
  export declare function buildPaddleSummary(input: any): {
77
+ project: string;
78
+ window: string;
79
+ metrics: {
80
+ accounts: any;
81
+ };
82
+ signals: any;
83
+ meta: {
84
+ generatedAt: string;
85
+ source: string;
86
+ multiAccount: boolean;
87
+ accountCount: any;
88
+ accounts: any;
89
+ warnings: any;
90
+ };
91
+ } | {
77
92
  project: string;
78
93
  window: string;
79
94
  metrics: any;
@@ -82,6 +97,8 @@ export declare function buildPaddleSummary(input: any): {
82
97
  generatedAt: string;
83
98
  source: string;
84
99
  environment: any;
100
+ accountId: any;
101
+ accountLabel: any;
85
102
  currencyCode: string;
86
103
  updatedAt: string;
87
104
  warnings: any;
@@ -1223,6 +1223,9 @@ function formatMinorCurrency(amount, currencyCode) {
1223
1223
  }
1224
1224
  }
1225
1225
  export function buildPaddleSummary(input) {
1226
+ if (Array.isArray(input?.accounts)) {
1227
+ return buildCombinedPaddleSummary(input);
1228
+ }
1226
1229
  const revenue = input?.metrics?.revenue || null;
1227
1230
  const mrr = input?.metrics?.monthlyRecurringRevenue || null;
1228
1231
  const activeSubscribers = input?.metrics?.activeSubscribers || null;
@@ -1395,6 +1398,8 @@ export function buildPaddleSummary(input) {
1395
1398
  generatedAt: new Date().toISOString(),
1396
1399
  source: 'paddle',
1397
1400
  environment: input?.environment || 'live',
1401
+ accountId: input?.id || input?.accountId || null,
1402
+ accountLabel: input?.label || null,
1398
1403
  currencyCode: currency || null,
1399
1404
  updatedAt: [
1400
1405
  metricUpdatedAt(revenue),
@@ -1408,6 +1413,65 @@ export function buildPaddleSummary(input) {
1408
1413
  },
1409
1414
  };
1410
1415
  }
1416
+ function buildCombinedPaddleSummary(input) {
1417
+ const accounts = Array.isArray(input?.accounts) ? input.accounts : [];
1418
+ const maxSignals = Math.max(1, Number(input?.maxSignals) || 6);
1419
+ const summaries = accounts
1420
+ .filter((account) => account && typeof account === 'object')
1421
+ .map((account, index) => {
1422
+ const accountId = String(account.id || account.key || account.label || `paddle_${index + 1}`).trim();
1423
+ const label = String(account.label || accountId).trim();
1424
+ const summary = buildPaddleSummary({
1425
+ ...account,
1426
+ accounts: undefined,
1427
+ maxSignals: account.maxSignals || maxSignals,
1428
+ });
1429
+ return { accountId, label, summary };
1430
+ });
1431
+ const signals = summaries
1432
+ .flatMap(({ accountId, label, summary }) => (Array.isArray(summary.signals) ? summary.signals : []).map((signal) => ({
1433
+ ...signal,
1434
+ id: `${accountId}:${signal.id}`,
1435
+ sourceProject: summary.project,
1436
+ evidence: [`Paddle account: ${label}`, ...(signal.evidence || [])],
1437
+ keywords: [accountId, ...(signal.keywords || [])],
1438
+ })))
1439
+ .sort((a, b) => {
1440
+ const priorityDelta = priorityRank(b.priority) - priorityRank(a.priority);
1441
+ if (priorityDelta !== 0)
1442
+ return priorityDelta;
1443
+ return (Number(b.current_value) || 0) - (Number(a.current_value) || 0);
1444
+ })
1445
+ .slice(0, maxSignals);
1446
+ const warnings = summaries.flatMap(({ label, summary }) => (Array.isArray(summary.meta?.warnings) ? summary.meta.warnings : []).map((warning) => `${label}: ${warning}`));
1447
+ return {
1448
+ project: 'paddle:multiple',
1449
+ window: String(input?.window || summaries[0]?.summary?.window || 'last_30d'),
1450
+ metrics: {
1451
+ accounts: summaries.map(({ accountId, label, summary }) => ({
1452
+ id: accountId,
1453
+ label,
1454
+ environment: summary.meta?.environment || null,
1455
+ metrics: summary.metrics || {},
1456
+ })),
1457
+ },
1458
+ signals,
1459
+ meta: {
1460
+ generatedAt: new Date().toISOString(),
1461
+ source: 'paddle',
1462
+ multiAccount: true,
1463
+ accountCount: summaries.length,
1464
+ accounts: summaries.map(({ accountId, label, summary }) => ({
1465
+ id: accountId,
1466
+ label,
1467
+ environment: summary.meta?.environment || null,
1468
+ currencyCode: summary.meta?.currencyCode || null,
1469
+ updatedAt: summary.meta?.updatedAt || null,
1470
+ })),
1471
+ warnings,
1472
+ },
1473
+ };
1474
+ }
1411
1475
  function seoNumber(value) {
1412
1476
  const numeric = coerceNumber(value);
1413
1477
  return numeric === null ? 0 : numeric;