@atlasauth/cli 0.2.0 → 0.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.
@@ -0,0 +1,421 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.REFERALLY_VERSION = void 0;
4
+ exports.pingSkewMs = pingSkewMs;
5
+ exports.describeTestLines = describeTestLines;
6
+ exports.parseCodeCsv = parseCodeCsv;
7
+ exports.referrals = referrals;
8
+ const node_crypto_1 = require("node:crypto");
9
+ const backend_1 = require("@atlasauth/backend");
10
+ const args_1 = require("../args");
11
+ const errors_1 = require("../errors");
12
+ const output_1 = require("../output");
13
+ const project_1 = require("../project");
14
+ const secrets_1 = require("../secrets");
15
+ const project_commands_1 = require("./project-commands");
16
+ const shared_1 = require("./shared");
17
+ /**
18
+ * `atlas referrals connect | backfill | status`: referral attribution from the
19
+ * terminal.
20
+ *
21
+ * `connect --provider referally` is bring-your-own-key: the Referally merchant
22
+ * key is used for one call (it creates the Atlas connection on Referally) and
23
+ * is never stored or printed. The connection id and secret Referally returns
24
+ * go straight onto the instance; the secret is never printed either.
25
+ */
26
+ /** The Referally API version pinned on every call. */
27
+ exports.REFERALLY_VERSION = '2026-10-21';
28
+ const PROVIDERS = ['referally', 'webhook'];
29
+ /** Read a key from a file, or stdin with '-'. A bare key or a dotenv line. Never printed. */
30
+ function readKeyFile(ctx, file, what) {
31
+ let text;
32
+ try {
33
+ text = ctx.readFile(file === '-' ? '/dev/stdin' : file);
34
+ }
35
+ catch {
36
+ throw new errors_1.CliError(`Could not read ${what} from ${file === '-' ? 'stdin' : file}.`);
37
+ }
38
+ const line = text.split(/\r?\n/).map((l) => l.trim()).find((l) => l && !l.startsWith('#')) ?? '';
39
+ const m = /^[A-Za-z_][A-Za-z0-9_]*=(.*)$/.exec(line);
40
+ const key = (m ? m[1] : line).trim().replace(/^"(.*)"$/, '$1');
41
+ if (!key || /\s/.test(key))
42
+ throw new errors_1.CliError(`No ${what} found in ${file === '-' ? 'stdin' : file}.`);
43
+ return key;
44
+ }
45
+ function httpsUrl(raw, flag) {
46
+ let u;
47
+ try {
48
+ u = new URL(raw);
49
+ }
50
+ catch {
51
+ throw new errors_1.CliError(`${flag} must be an absolute URL, got '${raw}'.`);
52
+ }
53
+ const local = u.hostname === 'localhost' || u.hostname === '127.0.0.1' || u.hostname.endsWith('.localhost');
54
+ if (u.protocol !== 'https:' && !(u.protocol === 'http:' && local)) {
55
+ throw new errors_1.CliError(`${flag} must use https (http only for localhost), got '${raw}'.`);
56
+ }
57
+ return raw.replace(/\/+$/, '');
58
+ }
59
+ /** Platform clock minus ours, in ms, from a ping. */
60
+ function pingSkewMs(ping, receivedAt, latencyMs) {
61
+ if (typeof ping.clock_skew_ms === 'number')
62
+ return ping.clock_skew_ms;
63
+ if (ping.server_time === undefined || ping.server_time === null)
64
+ return null;
65
+ const server = typeof ping.server_time === 'number' ? ping.server_time : Date.parse(ping.server_time);
66
+ if (!Number.isFinite(server))
67
+ return null;
68
+ return Math.round(server - (receivedAt - (latencyMs ?? 0) / 2));
69
+ }
70
+ /** Lines describing a connection test (a ping where the provider supports it). */
71
+ function describeTestLines(test, receivedAt) {
72
+ const lines = [];
73
+ const meta = [test.http_status ? `HTTP ${test.http_status}` : '', typeof test.latency_ms === 'number' ? `${Math.round(test.latency_ms)} ms` : '']
74
+ .filter(Boolean)
75
+ .join(', ');
76
+ lines.push(test.ok ? `Connection OK${meta ? ` (${meta})` : ''}.` : `Connection test failed${meta ? ` (${meta})` : ''}: ${test.error?.message ?? 'no answer'}.`);
77
+ const ping = test.ping;
78
+ if (ping) {
79
+ if (ping.org_name)
80
+ lines.push(` Organization: ${ping.org_name}`);
81
+ const program = ping.program_name && ping.program_id ? `${ping.program_name} (${ping.program_id})` : (ping.program_name ?? ping.program_id);
82
+ if (program)
83
+ lines.push(` Program: ${program}`);
84
+ if (typeof ping.auto_enroll_users === 'boolean')
85
+ lines.push(` Auto-enroll users: ${ping.auto_enroll_users ? 'on' : 'off'}`);
86
+ const skew = pingSkewMs(ping, receivedAt, test.latency_ms);
87
+ if (skew !== null) {
88
+ lines.push(` Clock skew: ${(skew / 1000).toFixed(1)} s`);
89
+ if (Math.abs(skew) > 60_000) {
90
+ lines.push(' Warning: the clocks differ by more than 60 seconds. Signed calls fail beyond 5 minutes.');
91
+ }
92
+ }
93
+ }
94
+ return lines;
95
+ }
96
+ /** A `customerRef,code` CSV → map; throws on a bad line. A header row is skipped. */
97
+ function parseCodeCsv(text) {
98
+ const out = {};
99
+ const lines = text.split(/\r?\n/);
100
+ lines.forEach((line, i) => {
101
+ const l = line.trim();
102
+ if (!l || l.startsWith('#'))
103
+ return;
104
+ const [ref, code] = l.split(/[;,\t]/).map((x) => x.trim().replace(/^"(.*)"$/, '$1'));
105
+ if (i === 0 && /^(customer_?ref|user_?id|external_?id|user)$/i.test(ref ?? ''))
106
+ return;
107
+ if (!ref || !code)
108
+ throw new errors_1.CliError(`--map line ${i + 1}: expected customerRef,code.`);
109
+ if (!/^[A-Za-z0-9_-]{3,64}$/.test(code))
110
+ throw new errors_1.CliError(`--map line ${i + 1}: '${code}' is not a valid code.`);
111
+ out[ref] = code;
112
+ });
113
+ return out;
114
+ }
115
+ async function referallyCreateConnection(ctx, input) {
116
+ const fetchImpl = ctx.fetch ?? globalThis.fetch;
117
+ let res;
118
+ try {
119
+ res = await fetchImpl(`${input.baseUrl}/v1/auth/connections`, {
120
+ method: 'POST',
121
+ headers: {
122
+ authorization: `Bearer ${input.key}`,
123
+ 'content-type': 'application/json',
124
+ accept: 'application/json',
125
+ 'referally-version': exports.REFERALLY_VERSION,
126
+ },
127
+ body: JSON.stringify(input.body),
128
+ });
129
+ }
130
+ catch (err) {
131
+ throw new errors_1.CliError(`Could not reach Referally at ${input.baseUrl}: ${err instanceof Error ? err.message : String(err)}`);
132
+ }
133
+ const text = await res.text();
134
+ let json = {};
135
+ try {
136
+ json = text ? JSON.parse(text) : {};
137
+ }
138
+ catch {
139
+ /* not JSON */
140
+ }
141
+ if (!res.ok) {
142
+ const err = (json.error ?? json.errors);
143
+ const msg = (typeof err === 'object' && err && 'message' in err ? String(err.message) : null) ??
144
+ (Array.isArray(err) && err[0] && typeof err[0] === 'object' && 'message' in err[0] ? String(err[0].message) : null) ??
145
+ (typeof json.message === 'string' ? json.message : null);
146
+ const hint = res.status === 401 || res.status === 403 ? ' Check the merchant key.' : '';
147
+ throw new errors_1.CliError(`Referally refused to create the connection (HTTP ${res.status})${msg ? `: ${msg}` : ''}.${hint}`);
148
+ }
149
+ if (typeof json.id !== 'string' || typeof json.secret !== 'string') {
150
+ throw new errors_1.CliError('Referally answered without a connection id and secret.');
151
+ }
152
+ return json;
153
+ }
154
+ async function connect(ctx, args) {
155
+ const v = args.values;
156
+ const json = (0, shared_1.wantsJson)(v);
157
+ const provider = (0, args_1.str)(v, 'provider') ?? 'referally';
158
+ if (!PROVIDERS.includes(provider)) {
159
+ throw new errors_1.CliError(`--provider must be one of ${PROVIDERS.join(', ')}, got '${provider}'.`);
160
+ }
161
+ const cred = (0, project_commands_1.instanceCredential)(ctx, args);
162
+ const http = (0, project_1.httpFor)(ctx, cred);
163
+ const product = (0, args_1.str)(v, 'product') ?? 'atlasauth';
164
+ const out = json ? { out: () => undefined, err: ctx.io.err } : ctx.io;
165
+ let patch;
166
+ let summary;
167
+ if (provider === 'referally') {
168
+ const program = (0, args_1.str)(v, 'program');
169
+ if (!program)
170
+ throw new errors_1.CliError('referrals connect --provider referally needs --program <prg_…>.');
171
+ const baseRaw = (0, args_1.str)(v, 'base-url') ?? ctx.env.REFERALLY_BASE_URL?.trim();
172
+ if (!baseRaw)
173
+ throw new errors_1.CliError('Pass --base-url <your Referally base URL> (or set REFERALLY_BASE_URL).');
174
+ const baseUrl = httpsUrl(baseRaw, '--base-url');
175
+ const keyFile = (0, args_1.str)(v, 'referally-key-file');
176
+ const key = (0, args_1.str)(v, 'referally-key') ?? (keyFile ? readKeyFile(ctx, keyFile, 'the Referally key') : ctx.env.REFERALLY_API_KEY?.trim());
177
+ if (!key) {
178
+ throw new errors_1.CliError('Pass your Referally merchant key with --referally-key-file <path|-> (or --referally-key, or REFERALLY_API_KEY). It is used once and never stored.');
179
+ }
180
+ const destination = (0, args_1.str)(v, 'destination');
181
+ if (destination)
182
+ httpsUrl(destination, '--destination');
183
+ const instance = await http.get('/v1/instance');
184
+ const created = await referallyCreateConnection(ctx, {
185
+ baseUrl,
186
+ key,
187
+ body: {
188
+ provider: 'atlas',
189
+ instanceId: instance.id,
190
+ programId: program,
191
+ ...(v['auto-enroll'] === true ? { autoEnrollUsers: true } : {}),
192
+ ...(destination ? { destinationUrl: destination } : {}),
193
+ },
194
+ });
195
+ const trackingToken = (0, args_1.str)(v, 'tracking-token') ?? (typeof created.trackingToken === 'string' ? created.trackingToken : null);
196
+ patch = {
197
+ provider: 'referally',
198
+ endpoint_url: baseUrl,
199
+ connection_id: created.id,
200
+ signing_secret: created.secret,
201
+ program_id: program,
202
+ ...(v['auto-enroll'] === true ? { auto_enroll_users: true } : {}),
203
+ ...(trackingToken ? { tracking_token: trackingToken } : {}),
204
+ };
205
+ try {
206
+ await http.patch('/v1/instance/referrals', patch);
207
+ }
208
+ catch (err) {
209
+ // The secret is shown once by Referally: keep it so the merchant can finish by hand.
210
+ const saved = (0, secrets_1.deliverSecret)({
211
+ io: out,
212
+ env: ctx.env,
213
+ product,
214
+ fileName: `referally-connection-${created.id}.env`,
215
+ entries: { REFERALLY_CONNECTION_ID: created.id, REFERALLY_CONNECTION_SECRET: created.secret },
216
+ label: 'The Referally connection secret (not saved on Atlas)',
217
+ force: v.force === true,
218
+ comment: `Referally connection ${created.id}: saving it on the Atlas instance failed. Paste it in Users → Referrals.`,
219
+ });
220
+ ctx.io.err(`atlas: the connection ${created.id} was created on Referally, but saving it on the instance failed.${saved.path ? ` Its secret is in ${saved.path}.` : ''}`);
221
+ throw err;
222
+ }
223
+ summary = { provider: 'referally', instance_id: instance.id, endpoint_url: baseUrl, connection_id: created.id, program_id: program, tracking_token: trackingToken };
224
+ if (!json)
225
+ out.out(`Created Referally connection ${created.id} for instance ${instance.id} and saved it (the secret was not printed).`);
226
+ }
227
+ else {
228
+ const endpoint = (0, args_1.str)(v, 'endpoint');
229
+ if (!endpoint)
230
+ throw new errors_1.CliError('referrals connect --provider webhook needs --endpoint <https-url>.');
231
+ const endpointUrl = httpsUrl(endpoint, '--endpoint');
232
+ const secretFile = (0, args_1.str)(v, 'secret-file');
233
+ let secret;
234
+ let generated = false;
235
+ if (secretFile)
236
+ secret = readKeyFile(ctx, secretFile, 'the signing secret');
237
+ else {
238
+ secret = `rfs_${(0, node_crypto_1.randomBytes)(32).toString('base64url')}`;
239
+ generated = true;
240
+ }
241
+ if (secret.length < 16)
242
+ throw new errors_1.CliError('The signing secret must be at least 16 characters.');
243
+ patch = {
244
+ provider: 'webhook',
245
+ endpoint_url: endpointUrl,
246
+ signing_secret: secret,
247
+ ...((0, args_1.str)(v, 'program') ? { program_id: (0, args_1.str)(v, 'program') } : {}),
248
+ ...(v['auto-enroll'] === true ? { auto_enroll_users: true } : {}),
249
+ };
250
+ await http.patch('/v1/instance/referrals', patch);
251
+ let secretPath;
252
+ if (generated) {
253
+ secretPath = (0, secrets_1.deliverSecret)({
254
+ io: out,
255
+ env: ctx.env,
256
+ product,
257
+ fileName: 'referrals-signing-secret.env',
258
+ entries: { ATLAS_REFERRALS_SIGNING_SECRET: secret },
259
+ label: 'The signing secret (configure it on your referral platform)',
260
+ printSecret: v['print-secret'] === true,
261
+ force: v.force === true,
262
+ comment: `Signing secret for Atlas referral calls to ${endpointUrl}.`,
263
+ }).path;
264
+ }
265
+ summary = { provider: 'webhook', endpoint_url: endpointUrl, secret_file: secretPath ?? null };
266
+ if (!json)
267
+ out.out(`Saved the referral protocol connection to ${endpointUrl}.`);
268
+ }
269
+ const test = await http.post('/v1/instance/referrals/test', {});
270
+ const receivedAt = Date.now();
271
+ let enabled = false;
272
+ if (v.enable === true) {
273
+ if (!test.ok) {
274
+ ctx.io.err('atlas: not turning referrals on: the connection test failed.');
275
+ }
276
+ else {
277
+ await http.patch('/v1/instance/referrals', { enabled: true });
278
+ enabled = true;
279
+ }
280
+ }
281
+ if (json) {
282
+ (0, output_1.printJson)(ctx.io, { ...summary, test, enabled });
283
+ }
284
+ else {
285
+ for (const line of describeTestLines(test, receivedAt))
286
+ ctx.io.out(line);
287
+ ctx.io.out(enabled
288
+ ? 'Referral attribution is on.'
289
+ : v.enable === true
290
+ ? 'Referral attribution stays off until the test passes.'
291
+ : "Turn it on with 'atlas referrals connect … --enable', or in the dashboard (Users → Referrals).");
292
+ }
293
+ return test.ok ? 0 : 1;
294
+ }
295
+ async function backfill(ctx, args) {
296
+ const v = args.values;
297
+ const since = (0, args_1.str)(v, 'since');
298
+ if (!since || !/^\d{4}-\d{2}-\d{2}(T.*)?$/.test(since) || Number.isNaN(Date.parse(since))) {
299
+ throw new errors_1.CliError('referrals backfill needs --since <YYYY-MM-DD>.');
300
+ }
301
+ const mapFile = (0, args_1.str)(v, 'map');
302
+ let codes;
303
+ if (mapFile) {
304
+ let text;
305
+ try {
306
+ text = ctx.readFile(mapFile === '-' ? '/dev/stdin' : mapFile);
307
+ }
308
+ catch {
309
+ throw new errors_1.CliError(`Could not read ${mapFile}.`);
310
+ }
311
+ codes = parseCodeCsv(text);
312
+ }
313
+ const metadataPath = (0, args_1.str)(v, 'metadata-path');
314
+ if (metadataPath && !/^(public|private|unsafe)_metadata(\.[A-Za-z0-9_-]{1,64}){1,4}$/.test(metadataPath)) {
315
+ throw new errors_1.CliError(`--metadata-path must look like public_metadata.referral_code, got '${metadataPath}'.`);
316
+ }
317
+ const http = (0, project_1.httpFor)(ctx, (0, project_commands_1.instanceCredential)(ctx, args));
318
+ let job = await http.post('/v1/instance/referrals/backfill', {
319
+ since,
320
+ ...(codes && Object.keys(codes).length ? { codes } : {}),
321
+ ...(metadataPath ? { code_metadata_path: metadataPath } : {}),
322
+ });
323
+ const running = (s) => s === 'queued' || s === 'running' || s === 'pending';
324
+ if (v.wait === true) {
325
+ const sleep = ctx.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
326
+ while (running(job.status)) {
327
+ await sleep(2000);
328
+ job = await http.get(`/v1/instance/referrals/backfill/${encodeURIComponent(job.id)}`);
329
+ }
330
+ }
331
+ if ((0, shared_1.wantsJson)(v))
332
+ (0, output_1.printJson)(ctx.io, job);
333
+ else {
334
+ const counts = [
335
+ typeof job.users_scanned === 'number' ? `${job.users_scanned} users` : '',
336
+ typeof job.calls_queued === 'number' ? `${job.calls_queued} calls queued` : '',
337
+ typeof job.users_skipped === 'number' ? `${job.users_skipped} skipped` : '',
338
+ job.calls ? `${job.calls.succeeded} sent, ${job.calls.failed} failed` : '',
339
+ ].filter(Boolean);
340
+ ctx.io.out(`Backfill ${job.id}: ${job.status}${counts.length ? ` (${counts.join(', ')})` : ''}.`);
341
+ if (codes)
342
+ ctx.io.out(`${Object.keys(codes).length} code(s) read from ${mapFile}.`);
343
+ if (running(job.status) && v.wait !== true)
344
+ ctx.io.out("Add --wait to follow it, or watch the delivery log in the dashboard.");
345
+ if (job.truncated && job.next_since) {
346
+ ctx.io.out(`Stopped at the cap. Run it again with --since ${new Date(job.next_since).toISOString().slice(0, 10)} for the rest.`);
347
+ }
348
+ if (job.error)
349
+ ctx.io.err(`atlas: ${job.error}`);
350
+ }
351
+ return job.status === 'failed' || (job.calls?.failed ?? 0) > 0 ? 1 : 0;
352
+ }
353
+ const FINDING_COLUMNS = [
354
+ { header: 'SEVERITY', get: (f) => f.severity },
355
+ { header: 'CODE', get: (f) => f.code },
356
+ { header: 'MESSAGE', get: (f) => f.message },
357
+ ];
358
+ async function status(ctx, args) {
359
+ const http = (0, project_1.httpFor)(ctx, (0, project_commands_1.instanceCredential)(ctx, args));
360
+ const settings = await http.get('/v1/instance/referrals');
361
+ let findings = [];
362
+ try {
363
+ const report = await http.get('/v1/instance/preflight');
364
+ findings = (report.findings ?? []).filter((f) => f.code.startsWith('referral'));
365
+ }
366
+ catch (err) {
367
+ if (!(err instanceof backend_1.AtlasApiError))
368
+ throw err;
369
+ }
370
+ if ((0, shared_1.wantsJson)(args.values)) {
371
+ (0, output_1.printJson)(ctx.io, { settings, findings });
372
+ return findings.some((f) => f.severity === 'error') ? 1 : 0;
373
+ }
374
+ const c = settings.connection ?? null;
375
+ const lines = [
376
+ `Referral attribution: ${settings.enabled ? 'on' : 'off'}`,
377
+ `Provider: ${settings.provider}`,
378
+ `Endpoint: ${settings.endpoint_url ?? '(not set)'}`,
379
+ `Connection ID: ${settings.connection_id ?? '(not set)'}`,
380
+ `Program ID: ${settings.program_id ?? '(not set)'}`,
381
+ `Signing secret: ${settings.signing_secret_set ? 'set' : 'not set'}`,
382
+ ];
383
+ if (settings.forward_lifecycle !== undefined)
384
+ lines.push(`Forward lifecycle: ${settings.forward_lifecycle ? 'on' : 'off'}`);
385
+ if (settings.missing?.length)
386
+ lines.push(`Missing: ${settings.missing.join(', ')}`);
387
+ if (c?.last_test) {
388
+ lines.push(`Last test: ${c.last_test.ok ? 'ok' : `failed${c.last_test.error ? ` (${c.last_test.error})` : ''}`} at ${new Date(c.last_test.at).toISOString()}`);
389
+ }
390
+ if (c)
391
+ lines.push(`Failed (7 days): ${c.failed_calls_7d ?? 0} Retrying: ${c.retrying_calls ?? 0}`);
392
+ for (const l of lines)
393
+ ctx.io.out(l);
394
+ if (c?.alert)
395
+ ctx.io.out(`Alert: ${c.alert.code}${c.alert.message ? `: ${c.alert.message}` : ''}`);
396
+ ctx.io.out('');
397
+ if (findings.length === 0)
398
+ ctx.io.out('No referral findings in preflight.');
399
+ else {
400
+ ctx.io.out((0, output_1.renderTable)(FINDING_COLUMNS, findings));
401
+ for (const f of findings.filter((x) => x.severity !== 'info'))
402
+ ctx.io.out(`${f.code}: ${f.fix}`);
403
+ }
404
+ return findings.some((f) => f.severity === 'error') ? 1 : 0;
405
+ }
406
+ async function referrals(ctx, args) {
407
+ const sub = args.positionals[1];
408
+ switch (sub) {
409
+ case 'connect':
410
+ return connect(ctx, args);
411
+ case 'backfill':
412
+ return backfill(ctx, args);
413
+ case 'status':
414
+ return status(ctx, args);
415
+ default:
416
+ throw new errors_1.CliError(sub
417
+ ? `Unknown subcommand 'referrals ${sub}'. Try: connect, backfill, status.`
418
+ : 'referrals needs a subcommand: connect, backfill, status.');
419
+ }
420
+ }
421
+ //# sourceMappingURL=referrals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"referrals.js","sourceRoot":"","sources":["../../src/commands/referrals.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,7 @@
1
- import type { ParsedArgs } from '../args';
1
+ import { type ParsedArgs } from '../args';
2
2
  import type { RunContext } from '../context';
3
- /** `atlas webhooks list` — the one read `client.webhooks` exposes for endpoints. */
3
+ /**
4
+ * `atlas webhooks list | create`. `create` writes the endpoint's signing secret
5
+ * to a 0600 file (never printed unless --print-secret).
6
+ */
4
7
  export declare function webhooks(ctx: RunContext, args: ParsedArgs): Promise<number>;
@@ -1,8 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.webhooks = webhooks;
4
+ const args_1 = require("../args");
4
5
  const errors_1 = require("../errors");
5
6
  const output_1 = require("../output");
7
+ const project_1 = require("../project");
8
+ const secrets_1 = require("../secrets");
6
9
  const shared_1 = require("./shared");
7
10
  const COLUMNS = [
8
11
  { header: 'ID', get: (w) => w.id },
@@ -11,7 +14,10 @@ const COLUMNS = [
11
14
  { header: 'EVENTS', get: (w) => w.enabled_events },
12
15
  { header: 'CREATED', get: (w) => (0, output_1.fmtTime)(w.created_at) },
13
16
  ];
14
- /** `atlas webhooks list` — the one read `client.webhooks` exposes for endpoints. */
17
+ /**
18
+ * `atlas webhooks list | create`. `create` writes the endpoint's signing secret
19
+ * to a 0600 file (never printed unless --print-secret).
20
+ */
15
21
  async function webhooks(ctx, args) {
16
22
  const sub = args.positionals[1];
17
23
  const json = (0, shared_1.wantsJson)(args.values);
@@ -25,10 +31,38 @@ async function webhooks(ctx, args) {
25
31
  ctx.io.out((0, output_1.renderTable)(COLUMNS, page.data));
26
32
  return 0;
27
33
  }
34
+ case 'create': {
35
+ const url = (0, args_1.str)(args.values, 'url');
36
+ if (!url)
37
+ throw new errors_1.CliError('webhooks create requires --url <https-url>.');
38
+ const events = (0, args_1.list)(args.values, 'events');
39
+ const auth = (0, shared_1.resolveAuth)(ctx, args.values);
40
+ const endpoint = await (0, project_1.httpFor)(ctx, { secretKey: auth.secretKey, apiUrl: auth.apiUrl }).post('/v1/webhook_endpoints', { url, ...(events.length ? { enabled_events: events } : {}) });
41
+ const { secret, ...rest } = endpoint;
42
+ let secretFile;
43
+ if (secret) {
44
+ secretFile = (0, secrets_1.deliverSecret)({
45
+ io: json ? { out: () => undefined, err: ctx.io.err } : ctx.io,
46
+ env: ctx.env,
47
+ product: (0, args_1.str)(args.values, 'product') ?? 'atlasauth',
48
+ fileName: `webhook-${endpoint.id}.env`,
49
+ entries: { ATLAS_WEBHOOK_SECRET: secret },
50
+ label: 'The signing secret',
51
+ printSecret: args.values['print-secret'] === true,
52
+ force: args.values.force === true,
53
+ comment: `Signing secret for webhook endpoint ${endpoint.id} (${url}).`,
54
+ }).path;
55
+ }
56
+ if (json)
57
+ (0, output_1.printJson)(ctx.io, args.values['print-secret'] === true ? endpoint : { ...rest, secret_file: secretFile ?? null });
58
+ else
59
+ ctx.io.out(`Created webhook endpoint ${endpoint.id} → ${endpoint.url}.`);
60
+ return 0;
61
+ }
28
62
  default:
29
63
  throw new errors_1.CliError(sub
30
- ? `Unknown subcommand 'webhooks ${sub}'. Try: list.`
31
- : 'webhooks needs a subcommand: list.');
64
+ ? `Unknown subcommand 'webhooks ${sub}'. Try: list, create.`
65
+ : 'webhooks needs a subcommand: list, create.');
32
66
  }
33
67
  }
34
68
  //# sourceMappingURL=webhooks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/commands/webhooks.ts"],"names":[],"mappings":";;AAgBA,4BAoBC;AAjCD,sCAAqC;AACrC,sCAAyE;AACzE,qCAAoD;AAEpD,MAAM,OAAO,GAA8B;IACzC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;IAClC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE;IACpC,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE;IAC1C,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE;IAClD,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,gBAAO,EAAC,CAAC,CAAC,UAAU,CAAC,EAAE;CACzD,CAAC;AAEF,oFAAoF;AAC7E,KAAK,UAAU,QAAQ,CAAC,GAAe,EAAE,IAAgB;IAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,IAAA,kBAAS,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEpC,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,sBAAa,EAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACnD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACpD,IAAI,IAAI;gBAAE,IAAA,kBAAS,EAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;;gBAC7B,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAA,oBAAW,EAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACjD,OAAO,CAAC,CAAC;QACX,CAAC;QAED;YACE,MAAM,IAAI,iBAAQ,CAChB,GAAG;gBACD,CAAC,CAAC,gCAAgC,GAAG,eAAe;gBACpD,CAAC,CAAC,oCAAoC,CACzC,CAAC;IACN,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/commands/webhooks.ts"],"names":[],"mappings":";;AAqBA,4BAgDC;AApED,kCAAqD;AAErD,sCAAqC;AACrC,sCAAyE;AACzE,wCAAqC;AACrC,wCAA2C;AAC3C,qCAAiE;AAEjE,MAAM,OAAO,GAA8B;IACzC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;IAClC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE;IACpC,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE;IAC1C,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE;IAClD,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,gBAAO,EAAC,CAAC,CAAC,UAAU,CAAC,EAAE;CACzD,CAAC;AAEF;;;GAGG;AACI,KAAK,UAAU,QAAQ,CAAC,GAAe,EAAE,IAAgB;IAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,IAAA,kBAAS,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEpC,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,sBAAa,EAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACnD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACpD,IAAI,IAAI;gBAAE,IAAA,kBAAS,EAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;;gBAC7B,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAA,oBAAW,EAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACjD,OAAO,CAAC,CAAC;QACX,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,GAAG,GAAG,IAAA,UAAG,EAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACpC,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,iBAAQ,CAAC,6CAA6C,CAAC,CAAC;YAC5E,MAAM,MAAM,GAAG,IAAA,WAAI,EAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,IAAA,oBAAW,EAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3C,MAAM,QAAQ,GAAG,MAAM,IAAA,iBAAO,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAE1F,uBAAuB,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC1F,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC;YACrC,IAAI,UAA8B,CAAC;YACnC,IAAI,MAAM,EAAE,CAAC;gBACX,UAAU,GAAG,IAAA,uBAAa,EAAC;oBACzB,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;oBAC7D,GAAG,EAAE,GAAG,CAAC,GAAG;oBACZ,OAAO,EAAE,IAAA,UAAG,EAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,WAAW;oBACnD,QAAQ,EAAE,WAAW,QAAQ,CAAC,EAAE,MAAM;oBACtC,OAAO,EAAE,EAAE,oBAAoB,EAAE,MAAM,EAAE;oBACzC,KAAK,EAAE,oBAAoB;oBAC3B,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,IAAI;oBACjD,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI;oBACjC,OAAO,EAAE,uCAAuC,QAAQ,CAAC,EAAE,KAAK,GAAG,IAAI;iBACxE,CAAC,CAAC,IAAI,CAAC;YACV,CAAC;YACD,IAAI,IAAI;gBAAE,IAAA,kBAAS,EAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,UAAU,IAAI,IAAI,EAAE,CAAC,CAAC;;gBACvH,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,4BAA4B,QAAQ,CAAC,EAAE,MAAM,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC;YAC9E,OAAO,CAAC,CAAC;QACX,CAAC;QAED;YACE,MAAM,IAAI,iBAAQ,CAChB,GAAG;gBACD,CAAC,CAAC,gCAAgC,GAAG,uBAAuB;gBAC5D,CAAC,CAAC,4CAA4C,CACjD,CAAC;IACN,CAAC;AACH,CAAC"}
package/dist/context.d.ts CHANGED
@@ -42,6 +42,13 @@ export interface RunContext {
42
42
  * of touching the disk. Defaults to reading UTF-8 off the real filesystem.
43
43
  */
44
44
  readFile: (path: string) => string;
45
+ /**
46
+ * `fetch` for calls outside the Atlas API (`atlas referrals connect` calls
47
+ * the referral platform's own API). Optional; defaults to the global fetch.
48
+ */
49
+ fetch?: typeof fetch;
50
+ /** Wait between polls (`--wait`). Optional; defaults to a real timer. */
51
+ sleep?: (ms: number) => Promise<void>;
45
52
  }
46
53
  /**
47
54
  * The production context, with any piece overridable. Tests call this with a
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":";;AAmDA,wCAWC;AA9DD,qCAAuC;AACvC,gDAAyE;AACzE,qCAAgF;AAChF,+CAAkE;AAClE,6BAA0C;AAC1C,qCAA0D;AAyC1D;;;;GAIG;AACH,SAAgB,cAAc,CAAC,YAAiC,EAAE;IAChE,OAAO;QACL,EAAE,EAAE,IAAA,cAAS,GAAE;QACf,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,MAAM,EAAE,IAAI,wBAAe,CAAC,IAAA,0BAAiB,GAAE,CAAC;QAChD,MAAM,EAAE,IAAA,wBAAe,GAAE;QACzB,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,IAAA,2BAAiB,EAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAC/E,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,IAAA,8BAAgB,EAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAC5E,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,sBAAY,EAAC,IAAI,EAAE,MAAM,CAAC;QAC9C,GAAG,SAAS;KACb,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":";;AA0DA,wCAWC;AArED,qCAAuC;AACvC,gDAAyE;AACzE,qCAAgF;AAChF,+CAAkE;AAClE,6BAA0C;AAC1C,qCAA0D;AAgD1D;;;;GAIG;AACH,SAAgB,cAAc,CAAC,YAAiC,EAAE;IAChE,OAAO;QACL,EAAE,EAAE,IAAA,cAAS,GAAE;QACf,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,MAAM,EAAE,IAAI,wBAAe,CAAC,IAAA,0BAAiB,GAAE,CAAC;QAChD,MAAM,EAAE,IAAA,wBAAe,GAAE;QACzB,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,IAAA,2BAAiB,EAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAC/E,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,IAAA,8BAAgB,EAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAC5E,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,sBAAY,EAAC,IAAI,EAAE,MAAM,CAAC;QAC9C,GAAG,SAAS;KACb,CAAC;AACJ,CAAC"}
package/dist/help.d.ts CHANGED
@@ -3,6 +3,6 @@
3
3
  * out of the handlers so the dispatch code stays about control flow and the
4
4
  * copy can be read (and kept consistent) in one place.
5
5
  */
6
- export declare const TOP_HELP = "atlas \u2014 manage an Atlas instance from the terminal\n\nUsage: atlas <command> [subcommand] [arguments] [options]\n\nCommands:\n login Authenticate and store a profile credential\n logout Remove a stored profile credential\n whoami Show the active profile and instance\n users list|get|create|delete\n orgs list|get|members\n api-keys list|create|revoke\n webhooks list\n sessions revoke\n config export|import Config-as-code: round-trip the instance's config\n actions list|deploy|test|logs\n\nGlobal options:\n --profile <name> Use a named profile (default: active, else \"default\")\n --json Emit raw JSON instead of a human table\n --limit <n> Page size for list commands that paginate\n --starting-after <cursor> Pagination cursor (from a prior page's hint)\n -h, --help Show this help, or help for a command\n -v, --version Print the version\n\nEnvironment overrides:\n ATLAS_SECRET_KEY Secret key to use instead of the stored one\n ATLAS_API_URL API URL to use instead of the stored one\n\nRun 'atlas <command> --help' for command-specific help.";
6
+ export declare const TOP_HELP = "atlas \u2014 manage an Atlas instance from the terminal\n\nUsage: atlas <command> [subcommand] [arguments] [options]\n\nCommands:\n login Authenticate and store a profile credential\n logout Remove a stored profile credential\n whoami Show the active profile and instance\n users list|get|create|delete\n orgs list|get|members\n api-keys list|create|revoke\n webhooks list|create\n sessions revoke\n config export|import Config-as-code: round-trip the instance's config\n actions list|deploy|test|logs\n init Create or complete an app's setup (idempotent); secrets to 0600 files\n preflight Check an instance's setup; non-zero exit on errors (for CI)\n env Print deploy variables: public values + secret file paths\n client rotate Rotate an OAuth client secret straight into its file\n referrals connect|backfill|status\n Connect a referral platform, backfill, check the connection\n\nGlobal options:\n --profile <name> Use a named profile (default: active, else \"default\")\n --json Emit raw JSON instead of a human table\n --limit <n> Page size for list commands that paginate\n --starting-after <cursor> Pagination cursor (from a prior page's hint)\n -h, --help Show this help, or help for a command\n -v, --version Print the version\n\nEnvironment overrides:\n ATLAS_SECRET_KEY Secret key to use instead of the stored one\n ATLAS_API_URL API URL to use instead of the stored one\n ATLAS_PLATFORM_KEY Platform key (psk_) for atlas init\n REFERALLY_BASE_URL Referally base URL for atlas referrals connect\n REFERALLY_API_KEY Referally merchant key for atlas referrals connect (never stored)\n\nSecrets: a command that receives a secret writes it to a 0600 file under\n~/.config/<product>/ and prints only the path. --print-secret prints it instead.\n\nRun 'atlas <command> --help' for command-specific help.";
7
7
  /** Per-command help, keyed by the resource word. */
8
8
  export declare const COMMAND_HELP: Record<string, string>;