@atlasauth/cli 0.8.0 → 0.9.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.
Files changed (53) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/args.d.ts +127 -0
  3. package/dist/args.js +56 -1
  4. package/dist/args.js.map +1 -1
  5. package/dist/commands/auth.js +5 -1
  6. package/dist/commands/auth.js.map +1 -1
  7. package/dist/commands/config.d.ts +15 -0
  8. package/dist/commands/config.js +76 -6
  9. package/dist/commands/config.js.map +1 -1
  10. package/dist/commands/csp.d.ts +32 -0
  11. package/dist/commands/csp.js +180 -0
  12. package/dist/commands/csp.js.map +1 -0
  13. package/dist/commands/info.js +1 -1
  14. package/dist/commands/info.js.map +1 -1
  15. package/dist/commands/init.js +26 -2
  16. package/dist/commands/init.js.map +1 -1
  17. package/dist/commands/integrations.d.ts +8 -0
  18. package/dist/commands/integrations.js +112 -0
  19. package/dist/commands/integrations.js.map +1 -0
  20. package/dist/commands/listen.d.ts +17 -0
  21. package/dist/commands/listen.js +223 -0
  22. package/dist/commands/listen.js.map +1 -0
  23. package/dist/commands/move-origin.d.ts +11 -0
  24. package/dist/commands/move-origin.js +95 -0
  25. package/dist/commands/move-origin.js.map +1 -0
  26. package/dist/commands/operator.d.ts +26 -0
  27. package/dist/commands/operator.js +198 -0
  28. package/dist/commands/operator.js.map +1 -0
  29. package/dist/commands/project-commands.d.ts +12 -0
  30. package/dist/commands/project-commands.js +130 -30
  31. package/dist/commands/project-commands.js.map +1 -1
  32. package/dist/commands/referrals.d.ts +4 -4
  33. package/dist/commands/referrals.js +203 -33
  34. package/dist/commands/referrals.js.map +1 -1
  35. package/dist/commands/shared.d.ts +6 -0
  36. package/dist/commands/shared.js +10 -1
  37. package/dist/commands/shared.js.map +1 -1
  38. package/dist/commands/status.d.ts +3 -0
  39. package/dist/commands/status.js +77 -0
  40. package/dist/commands/status.js.map +1 -0
  41. package/dist/commands/webhooks.d.ts +29 -2
  42. package/dist/commands/webhooks.js +257 -24
  43. package/dist/commands/webhooks.js.map +1 -1
  44. package/dist/config.d.ts +14 -0
  45. package/dist/config.js.map +1 -1
  46. package/dist/context.d.ts +5 -0
  47. package/dist/context.js.map +1 -1
  48. package/dist/help.d.ts +1 -1
  49. package/dist/help.js +177 -16
  50. package/dist/help.js.map +1 -1
  51. package/dist/run.js +14 -0
  52. package/dist/run.js.map +1 -1
  53. package/package.json +4 -3
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.status = status;
4
+ const output_1 = require("../output");
5
+ const project_1 = require("../project");
6
+ const project_commands_1 = require("./project-commands");
7
+ const shared_1 = require("./shared");
8
+ /**
9
+ * `atlas status`: "is it Atlas, a service we depend on, or us?" in one look.
10
+ * Atlas's own components and the open incidents that concern this instance,
11
+ * the instance's incident subscription, and the state of every upstream status
12
+ * page it declared. Exits 1 when Atlas or an enabled dependency reports a
13
+ * partial or major outage, so a script can branch on it.
14
+ */
15
+ const OUTAGE = new Set(['partial_outage', 'major_outage']);
16
+ const COMPONENT_COLUMNS = [
17
+ { header: 'COMPONENT', get: (c) => c.id },
18
+ { header: 'STATUS', get: (c) => c.status },
19
+ { header: 'REGIONS', get: (c) => c.regions },
20
+ ];
21
+ const INCIDENT_COLUMNS = [
22
+ { header: 'INCIDENT', get: (i) => i.id },
23
+ { header: 'STATUS', get: (i) => i.status },
24
+ { header: 'IMPACT', get: (i) => (i.kind === 'maintenance' ? 'maintenance' : i.impact) },
25
+ { header: 'REGIONS', get: (i) => (i.regions.length ? i.regions : 'all') },
26
+ { header: 'TITLE', get: (i) => i.title },
27
+ ];
28
+ const DEPENDENCY_COLUMNS = [
29
+ { header: 'DEPENDENCY', get: (d) => d.name },
30
+ { header: 'STATE', get: (d) => (d.enabled ? `${d.state}${d.stale ? ' (stale)' : ''}` : 'disabled') },
31
+ { header: 'URL', get: (d) => d.url },
32
+ { header: 'LAST ERROR', get: (d) => d.last_error ?? '' },
33
+ ];
34
+ function subscriptionLine(s) {
35
+ if (!s.subscribed)
36
+ return 'Subscription: none (no incident notifications; set one up in the dashboard under Instance health, Status & upstream)';
37
+ if (!s.enabled)
38
+ return 'Subscription: disabled';
39
+ const regions = s.regions.length ? s.regions.join(', ') : 'all regions';
40
+ const components = s.component_ids.length ? s.component_ids.join(', ') : 'all components';
41
+ const channels = [s.email_owners ? 'email' : null, s.webhook ? 'webhook' : null, 'rss'].filter(Boolean).join(', ');
42
+ return `Subscription: ${regions}; ${components}; impact ≥ ${s.min_impact}${s.include_maintenance ? ' + maintenance' : ''} (${channels})`;
43
+ }
44
+ async function status(ctx, args) {
45
+ const http = (0, project_1.httpFor)(ctx, (0, project_commands_1.instanceCredential)(ctx, args));
46
+ const [service, subscription, incidents, dependencies] = await Promise.all([
47
+ http.get('/v1/status'),
48
+ http.get('/v1/instance/status_subscription'),
49
+ http.get('/v1/instance/status_incidents?open=true'),
50
+ http.get('/v1/instance/status_dependencies'),
51
+ ]);
52
+ const atlasDown = service.status === 'major_outage' || (incidents.data ?? []).some((i) => i.kind === 'incident' && (i.impact === 'major' || i.impact === 'critical'));
53
+ const upstreamDown = (dependencies.data ?? []).some((d) => d.enabled && OUTAGE.has(d.state));
54
+ const code = atlasDown || upstreamDown ? 1 : 0;
55
+ if ((0, shared_1.wantsJson)(args.values)) {
56
+ (0, output_1.printJson)(ctx.io, { service, subscription, incidents: incidents.data ?? [], dependencies: dependencies.data ?? [], dependencies_state: dependencies.state });
57
+ return code;
58
+ }
59
+ ctx.io.out(`Atlas: ${service.status}`);
60
+ ctx.io.out(subscriptionLine(subscription));
61
+ ctx.io.out('');
62
+ ctx.io.out((0, output_1.renderTable)(COMPONENT_COLUMNS, service.components ?? []));
63
+ ctx.io.out('');
64
+ if ((incidents.data ?? []).length === 0)
65
+ ctx.io.out('No open Atlas incidents concern this instance.');
66
+ else
67
+ ctx.io.out((0, output_1.renderTable)(INCIDENT_COLUMNS, incidents.data));
68
+ ctx.io.out('');
69
+ if ((dependencies.data ?? []).length === 0)
70
+ ctx.io.out('No upstream status pages declared (POST /v1/instance/status_dependencies).');
71
+ else {
72
+ ctx.io.out(`Upstream: ${dependencies.state}`);
73
+ ctx.io.out((0, output_1.renderTable)(DEPENDENCY_COLUMNS, dependencies.data));
74
+ }
75
+ return code;
76
+ }
77
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,34 @@
1
1
  import { type ParsedArgs } from '../args';
2
2
  import type { RunContext } from '../context';
3
+ /** One row of `GET /v1/webhook_endpoints/:id/deliveries` (and the inline result of a synchronous test). */
4
+ export interface Delivery {
5
+ id: string;
6
+ delivery_id?: string;
7
+ event_id?: string;
8
+ event_type?: string | null;
9
+ attempt_number?: number;
10
+ status?: string;
11
+ http_status?: number | null;
12
+ latency_ms?: number | null;
13
+ error?: string | null;
14
+ response_snippet?: string | null;
15
+ signature_header_sent?: string | null;
16
+ next_retry_at?: number | null;
17
+ delivered_at?: number | null;
18
+ created_at?: number;
19
+ }
20
+ /** `10s`, `500ms`, `2m` or a bare number of seconds → milliseconds. */
21
+ export declare function parseDuration(raw: string, flag: string): number;
3
22
  /**
4
- * `atlas webhooks list | create`. `create` writes the endpoint's signing secret
5
- * to a 0600 file (never printed unless --print-secret).
23
+ * A `--since` / `--until` value as the ISO timestamp the API takes: an ISO date
24
+ * or datetime passes through, `2h` / `7d` mean "that long ago", and the
25
+ * keyword `failing_since` is left for the server to resolve.
26
+ */
27
+ export declare function parseWhen(raw: string, flag: string, now?: number): string;
28
+ /**
29
+ * `atlas webhooks list | create | upsert | update | test | deliveries |
30
+ * redeliver | replay | rotate | reveal`. Every signing secret (create, upsert,
31
+ * rotate, reveal) goes to a 0600 file, never to the terminal unless
32
+ * --print-secret.
6
33
  */
7
34
  export declare function webhooks(ctx: RunContext, args: ParsedArgs): Promise<number>;
@@ -1,5 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseDuration = parseDuration;
4
+ exports.parseWhen = parseWhen;
3
5
  exports.webhooks = webhooks;
4
6
  const args_1 = require("../args");
5
7
  const errors_1 = require("../errors");
@@ -14,16 +16,80 @@ const COLUMNS = [
14
16
  { header: 'EVENTS', get: (w) => w.enabled_events },
15
17
  { header: 'CREATED', get: (w) => (0, output_1.fmtTime)(w.created_at) },
16
18
  ];
19
+ const DELIVERY_COLUMNS = [
20
+ { header: 'ID', get: (d) => d.id },
21
+ { header: 'EVENT', get: (d) => d.event_type },
22
+ { header: 'STATUS', get: (d) => d.status },
23
+ { header: 'HTTP', get: (d) => d.http_status },
24
+ { header: 'ATTEMPT', get: (d) => d.attempt_number },
25
+ { header: 'ERROR', get: (d) => d.error },
26
+ { header: 'CREATED', get: (d) => (0, output_1.fmtTime)(d.created_at) },
27
+ ];
28
+ /** Delivery states that mean the attempt is over. */
29
+ const SETTLED = new Set(['delivered', 'succeeded', 'failed', 'exhausted', 'dead']);
30
+ /** `10s`, `500ms`, `2m` or a bare number of seconds → milliseconds. */
31
+ function parseDuration(raw, flag) {
32
+ const m = /^(\d+(?:\.\d+)?)(ms|s|m|h|d)?$/.exec(raw.trim());
33
+ if (!m)
34
+ throw new errors_1.CliError(`${flag} must be a duration like 10s, 2m, 1h or 7d (got '${raw}').`);
35
+ const unit = { ms: 1, s: 1000, m: 60_000, h: 3_600_000, d: 86_400_000 }[(m[2] ?? 's')];
36
+ return Math.round(Number(m[1]) * unit);
37
+ }
38
+ /**
39
+ * A `--since` / `--until` value as the ISO timestamp the API takes: an ISO date
40
+ * or datetime passes through, `2h` / `7d` mean "that long ago", and the
41
+ * keyword `failing_since` is left for the server to resolve.
42
+ */
43
+ function parseWhen(raw, flag, now = Date.now()) {
44
+ if (raw === 'failing_since')
45
+ return raw;
46
+ if (/^\d+(\.\d+)?(ms|s|m|h|d)$/.test(raw))
47
+ return new Date(now - parseDuration(raw, flag)).toISOString();
48
+ const t = Date.parse(raw);
49
+ if (Number.isNaN(t))
50
+ throw new errors_1.CliError(`${flag} must be an ISO date (2026-10-01T00:00:00Z) or a relative time like 2h or 7d (got '${raw}').`);
51
+ return new Date(t).toISOString();
52
+ }
53
+ const endpointPath = (id) => `/v1/webhook_endpoints/${encodeURIComponent(id)}`;
54
+ function query(params) {
55
+ const q = new URLSearchParams();
56
+ for (const [k, v] of Object.entries(params))
57
+ if (v !== undefined)
58
+ q.set(k, v);
59
+ const text = q.toString();
60
+ return text ? `?${text}` : '';
61
+ }
17
62
  /**
18
- * `atlas webhooks list | create`. `create` writes the endpoint's signing secret
19
- * to a 0600 file (never printed unless --print-secret).
63
+ * `atlas webhooks list | create | upsert | update | test | deliveries |
64
+ * redeliver | replay | rotate | reveal`. Every signing secret (create, upsert,
65
+ * rotate, reveal) goes to a 0600 file, never to the terminal unless
66
+ * --print-secret.
20
67
  */
21
68
  async function webhooks(ctx, args) {
22
69
  const sub = args.positionals[1];
23
70
  const json = (0, shared_1.wantsJson)(args.values);
71
+ const v = args.values;
72
+ const deliver = (endpointId, secret, label, comment, replace = false) => {
73
+ const io = json ? { out: () => undefined, err: ctx.io.err } : ctx.io;
74
+ return ((0, secrets_1.deliverSecret)({
75
+ io,
76
+ env: ctx.env,
77
+ product: (0, args_1.str)(v, 'product') ?? 'atlasauth',
78
+ fileName: `webhook-${endpointId}.env`,
79
+ entries: { ATLAS_WEBHOOK_SECRET: secret },
80
+ label,
81
+ printSecret: v['print-secret'] === true,
82
+ force: v.force === true || replace,
83
+ comment,
84
+ }).path ?? '');
85
+ };
86
+ const api = () => {
87
+ const auth = (0, shared_1.resolveAuth)(ctx, v);
88
+ return (0, project_1.httpFor)(ctx, { secretKey: auth.secretKey, apiUrl: auth.apiUrl });
89
+ };
24
90
  switch (sub) {
25
91
  case 'list': {
26
- const { client } = (0, shared_1.requireClient)(ctx, args.values);
92
+ const { client } = (0, shared_1.requireClient)(ctx, v);
27
93
  const page = await client.webhooks.endpoints.list();
28
94
  if (json)
29
95
  (0, output_1.printJson)(ctx.io, page);
@@ -31,38 +97,205 @@ async function webhooks(ctx, args) {
31
97
  ctx.io.out((0, output_1.renderTable)(COLUMNS, page.data));
32
98
  return 0;
33
99
  }
34
- case 'create': {
35
- const url = (0, args_1.str)(args.values, 'url');
100
+ case 'create':
101
+ case 'upsert': {
102
+ const url = (0, args_1.str)(v, 'url');
36
103
  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 } : {}) });
104
+ throw new errors_1.CliError(`webhooks ${sub} requires --url <https-url>.`);
105
+ const events = (0, args_1.list)(v, 'events');
106
+ const body = { url, ...(events.length ? { enabled_events: events } : {}) };
107
+ const http = api();
108
+ // `upsert` is the idempotent form: one endpoint per URL, secret revealed only when it is created.
109
+ const endpoint = sub === 'create'
110
+ ? await http.post('/v1/webhook_endpoints', body)
111
+ : await http.put('/v1/webhook_endpoints/by_url', body);
41
112
  const { secret, ...rest } = endpoint;
42
113
  let secretFile;
43
114
  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;
115
+ secretFile = deliver(endpoint.id, secret, 'The signing secret', `Signing secret for webhook endpoint ${endpoint.id} (${url}).`);
55
116
  }
56
117
  if (json)
57
- (0, output_1.printJson)(ctx.io, args.values['print-secret'] === true ? endpoint : { ...rest, secret_file: secretFile ?? null });
58
- else
118
+ (0, output_1.printJson)(ctx.io, v['print-secret'] === true ? endpoint : { ...rest, secret_file: secretFile ?? null });
119
+ else if (sub === 'create' || secret)
59
120
  ctx.io.out(`Created webhook endpoint ${endpoint.id} → ${endpoint.url}.`);
121
+ else
122
+ ctx.io.out(`Webhook endpoint ${endpoint.id} → ${endpoint.url} already existed (updated, secret unchanged).`);
123
+ return 0;
124
+ }
125
+ case 'update': {
126
+ const id = (0, shared_1.requireArg)(args.positionals, 2, 'endpoint-id');
127
+ if (v.active === true && v.inactive === true)
128
+ throw new errors_1.CliError('Pass --active or --inactive, not both.');
129
+ const body = {};
130
+ const url = (0, args_1.str)(v, 'url');
131
+ if (url)
132
+ body.url = url;
133
+ const events = (0, args_1.list)(v, 'events');
134
+ if (events.length)
135
+ body.enabled_events = events;
136
+ if (v.active === true)
137
+ body.active = true;
138
+ if (v.inactive === true)
139
+ body.active = false;
140
+ if (Object.keys(body).length === 0)
141
+ throw new errors_1.CliError('webhooks update needs at least one of --url, --events, --active, --inactive.');
142
+ const updated = await api().patch(endpointPath(id), body);
143
+ if (json)
144
+ (0, output_1.printJson)(ctx.io, updated);
145
+ else
146
+ ctx.io.out(`Updated webhook endpoint ${updated.id ?? id}: ${Object.keys(body).join(', ')}.`);
147
+ return 0;
148
+ }
149
+ case 'test': {
150
+ const id = (0, shared_1.requireArg)(args.positionals, 2, 'endpoint-id');
151
+ const http = api();
152
+ const timeoutMs = parseDuration((0, args_1.str)(v, 'timeout') ?? '10s', '--timeout');
153
+ const wait = v['no-wait'] !== true;
154
+ const secs = Math.max(1, Math.ceil(timeoutMs / 1000));
155
+ const sent = await http.post(`${endpointPath(id)}/test${wait ? `?wait=${secs}s` : ''}`, {});
156
+ let result = sent;
157
+ // An API that only queues the test answers `queued` with no HTTP status: poll the log for the outcome.
158
+ if (wait && !SETTLED.has(sent.status ?? '') && sent.http_status == null) {
159
+ const sleep = ctx.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
160
+ const deliveryId = sent.delivery_id ?? sent.id;
161
+ const deadline = Date.now() + timeoutMs;
162
+ for (;;) {
163
+ const page = await http.get(`${endpointPath(id)}/deliveries?limit=20`);
164
+ const row = page.data.find((d) => d.id === deliveryId);
165
+ if (row)
166
+ result = { ...sent, ...row };
167
+ if (row && (SETTLED.has(row.status ?? '') || row.http_status != null))
168
+ break;
169
+ if (Date.now() >= deadline)
170
+ break;
171
+ await sleep(500);
172
+ }
173
+ }
174
+ if (json)
175
+ (0, output_1.printJson)(ctx.io, result);
176
+ else {
177
+ const ok = result.http_status != null && result.http_status >= 200 && result.http_status < 300;
178
+ ctx.io.out(`Test delivery ${result.delivery_id ?? result.id}: ${result.status ?? 'queued'}${result.http_status != null ? ` (HTTP ${result.http_status})` : ''}${result.latency_ms != null ? ` in ${result.latency_ms} ms` : ''}.`);
179
+ if (result.error)
180
+ ctx.io.out(`Error: ${result.error}`);
181
+ if (result.response_snippet)
182
+ ctx.io.out(`Response: ${result.response_snippet}`);
183
+ if (!wait)
184
+ ctx.io.out(`Queued. See the outcome with: atlas webhooks deliveries ${id}`);
185
+ else if (result.http_status == null)
186
+ ctx.io.out(`No result within ${secs}s. See it with: atlas webhooks deliveries ${id}`);
187
+ else if (!ok)
188
+ ctx.io.err('atlas: the endpoint did not answer with a 2xx.');
189
+ }
190
+ const ok = !wait || (result.http_status != null && result.http_status >= 200 && result.http_status < 300);
191
+ return ok ? 0 : 1;
192
+ }
193
+ case 'deliveries': {
194
+ const id = (0, shared_1.requireArg)(args.positionals, 2, 'endpoint-id');
195
+ const q = query({
196
+ status: (0, args_1.str)(v, 'status'),
197
+ event_type: (0, args_1.str)(v, 'event-type'),
198
+ since: (0, args_1.str)(v, 'since') ? parseWhen((0, args_1.str)(v, 'since'), '--since') : undefined,
199
+ until: (0, args_1.str)(v, 'until') ? parseWhen((0, args_1.str)(v, 'until'), '--until') : undefined,
200
+ starting_after: (0, args_1.str)(v, 'starting-after'),
201
+ limit: (0, args_1.limit)(v)?.toString(),
202
+ });
203
+ const page = await api().get(`${endpointPath(id)}/deliveries${q}`);
204
+ if (json)
205
+ (0, output_1.printJson)(ctx.io, page);
206
+ else {
207
+ ctx.io.out((0, output_1.renderTable)(DELIVERY_COLUMNS, page.data));
208
+ const last = page.data[page.data.length - 1];
209
+ if (page.has_more && (page.next_cursor ?? last?.id)) {
210
+ ctx.io.out('');
211
+ ctx.io.out(`More results: --starting-after ${page.next_cursor ?? last.id}`);
212
+ }
213
+ }
214
+ return 0;
215
+ }
216
+ case 'redeliver': {
217
+ const id = (0, shared_1.requireArg)(args.positionals, 2, 'endpoint-id');
218
+ const http = api();
219
+ const delivery = (0, args_1.str)(v, 'delivery');
220
+ let res;
221
+ if (delivery) {
222
+ res = await http.post(`${endpointPath(id)}/deliveries/${encodeURIComponent(delivery)}/redeliver`, {});
223
+ }
224
+ else {
225
+ const since = (0, args_1.str)(v, 'since');
226
+ const until = (0, args_1.str)(v, 'until');
227
+ const status = (0, args_1.str)(v, 'status') ?? 'failed';
228
+ if (!since && !until && (0, args_1.str)(v, 'status') === undefined) {
229
+ throw new errors_1.CliError('webhooks redeliver needs --delivery <id> for one delivery, or --status / --since / --until for a batch.');
230
+ }
231
+ res = await http.post(`${endpointPath(id)}/redeliver`, {
232
+ ...(since ? { since: parseWhen(since, '--since') } : {}),
233
+ ...(until ? { until: parseWhen(until, '--until') } : {}),
234
+ status,
235
+ });
236
+ }
237
+ if (json)
238
+ (0, output_1.printJson)(ctx.io, res);
239
+ else {
240
+ const r = res;
241
+ const n = r.queued;
242
+ ctx.io.out(n !== undefined ? `Queued ${n} redeliver${n === 1 ? 'y' : 'ies'} for ${id}.` : `Queued a redelivery${r.id ? ` (${r.id})` : ''} for ${id}.`);
243
+ }
244
+ return 0;
245
+ }
246
+ case 'replay': {
247
+ const id = (0, shared_1.requireArg)(args.positionals, 2, 'endpoint-id');
248
+ const since = (0, args_1.str)(v, 'since') ?? 'failing_since';
249
+ const res = await api().post(`${endpointPath(id)}/replay${query({ since: parseWhen(since, '--since') })}`, {});
250
+ if (json)
251
+ (0, output_1.printJson)(ctx.io, res);
252
+ else {
253
+ const n = res.queued;
254
+ ctx.io.out(n !== undefined ? `Queued ${n} held event(s) for replay on ${id}.` : `Queued a replay for ${id}.`);
255
+ }
256
+ return 0;
257
+ }
258
+ case 'rotate': {
259
+ const id = (0, shared_1.requireArg)(args.positionals, 2, 'endpoint-id');
260
+ const overlapRaw = (0, args_1.str)(v, 'overlap');
261
+ if (v.now === true && overlapRaw !== undefined)
262
+ throw new errors_1.CliError('Pass --now or --overlap, not both.');
263
+ let overlap;
264
+ if (v.now === true)
265
+ overlap = 0;
266
+ else if (overlapRaw !== undefined) {
267
+ const n = Number(overlapRaw);
268
+ if (!Number.isInteger(n) || n < 0)
269
+ throw new errors_1.CliError(`--overlap must be a whole number of seconds, got '${overlapRaw}'.`);
270
+ overlap = n;
271
+ }
272
+ const res = await api().post(`${endpointPath(id)}/rotate_secret`, overlap === undefined ? {} : { overlap_seconds: overlap });
273
+ const file = deliver(id, res.secret, 'The new signing secret', `Rotated signing secret for webhook endpoint ${id}.`, true);
274
+ if (json)
275
+ (0, output_1.printJson)(ctx.io, v['print-secret'] === true ? res : { ...res, secret: undefined, secret_file: file || null });
276
+ else {
277
+ const exp = res.previous_secret_expires_at;
278
+ if (res.overlap_seconds === 0 || exp === null)
279
+ ctx.io.out('The previous secret stopped signing immediately.');
280
+ else if (typeof exp === 'number')
281
+ ctx.io.out(`The previous secret keeps signing until ${new Date(exp).toISOString()}; deploy the new one before then.`);
282
+ if (res.warning)
283
+ ctx.io.out(res.warning);
284
+ }
285
+ return 0;
286
+ }
287
+ case 'reveal': {
288
+ const id = (0, shared_1.requireArg)(args.positionals, 2, 'endpoint-id');
289
+ const res = await api().post(`${endpointPath(id)}/reveal_secret`, {});
290
+ const file = deliver(id, res.secret, 'The revealed signing secret', `Signing secret for webhook endpoint ${id}.`, true);
291
+ if (json)
292
+ (0, output_1.printJson)(ctx.io, v['print-secret'] === true ? res : { object: 'webhook_secret', secret_file: file || null });
60
293
  return 0;
61
294
  }
62
295
  default:
63
296
  throw new errors_1.CliError(sub
64
- ? `Unknown subcommand 'webhooks ${sub}'. Try: list, create.`
65
- : 'webhooks needs a subcommand: list, create.');
297
+ ? `Unknown subcommand 'webhooks ${sub}'. Try: list, create, upsert, update, test, deliveries, redeliver, replay, rotate, reveal.`
298
+ : 'webhooks needs a subcommand: list, create, upsert, update, test, deliveries, redeliver, replay, rotate, reveal.');
66
299
  }
67
300
  }
68
301
  //# sourceMappingURL=webhooks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/commands/webhooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/commands/webhooks.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -7,6 +7,20 @@
7
7
  export interface Profile {
8
8
  api_url: string;
9
9
  secret_key: string;
10
+ /** When `secret_key` is a one-hour token (from `atlas login --device`), when it expires (Unix ms). */
11
+ expires_at?: number;
12
+ /** The resource the short-lived token is bound to (`ins_…`, `app_…`, `acct_…`). */
13
+ resource?: string;
14
+ scope?: string;
15
+ /**
16
+ * The operator token from `atlas login --device` (short-lived, Unix-ms expiry):
17
+ * `atlas token` swaps it for resource-bound tokens. Never a long-lived key.
18
+ */
19
+ operator?: {
20
+ access_token: string;
21
+ expires_at: number;
22
+ issuer: string;
23
+ };
10
24
  }
11
25
  /** The whole config file: named profiles plus which one is active. */
12
26
  export interface ConfigFile {
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;AA0CA,8CAGC;AA7CD,qCAA4E;AAC5E,qCAAkC;AAClC,yCAA0C;AAC1C,qCAAoC;AA+BpC,MAAM,KAAK,GAAe,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AAE3C;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACpE,MAAM,IAAI,GAAG,GAAG,CAAC,eAAe,EAAE,IAAI,EAAE,IAAI,IAAA,gBAAI,EAAC,IAAA,iBAAO,GAAE,EAAE,SAAS,CAAC,CAAC;IACvE,OAAO,IAAA,gBAAI,EAAC,IAAI,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;AAChD,CAAC;AAED,iFAAiF;AACjF,MAAa,eAAe;IACL;IAArB,YAAqB,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;IAErC,IAAI;QACF,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,IAAA,sBAAY,EAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,qDAAqD;YACrD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAe,CAAC;YAC9C,+EAA+E;YAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;QACpF,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,iBAAQ,CAChB,kBAAkB,IAAI,CAAC,IAAI,qEAAqE,CACjG,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAkB;QACrB,IAAA,mBAAS,EAAC,IAAA,mBAAO,EAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAChE,uEAAuE;QACvE,wEAAwE;QACxE,uCAAuC;QACvC,IAAA,uBAAa,EAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAClF,IAAA,mBAAS,EAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;CACF;AA9BD,0CA8BC;AAED,kFAAkF;AAClF,MAAa,iBAAiB;IACnB,IAAI,GAAG,UAAU,CAAC;IACnB,IAAI,CAAa;IACzB,YAAY,UAAsB,KAAK;QACrC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IACD,IAAI;QACF,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,CAAC,MAAkB;QACrB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;CACF;AAZD,8CAYC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;AAoDA,8CAGC;AAvDD,qCAA4E;AAC5E,qCAAkC;AAClC,yCAA0C;AAC1C,qCAAoC;AAyCpC,MAAM,KAAK,GAAe,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AAE3C;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACpE,MAAM,IAAI,GAAG,GAAG,CAAC,eAAe,EAAE,IAAI,EAAE,IAAI,IAAA,gBAAI,EAAC,IAAA,iBAAO,GAAE,EAAE,SAAS,CAAC,CAAC;IACvE,OAAO,IAAA,gBAAI,EAAC,IAAI,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;AAChD,CAAC;AAED,iFAAiF;AACjF,MAAa,eAAe;IACL;IAArB,YAAqB,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;IAErC,IAAI;QACF,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,IAAA,sBAAY,EAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACP,qDAAqD;YACrD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAe,CAAC;YAC9C,+EAA+E;YAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;QACpF,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,iBAAQ,CAChB,kBAAkB,IAAI,CAAC,IAAI,qEAAqE,CACjG,CAAC;QACJ,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAkB;QACrB,IAAA,mBAAS,EAAC,IAAA,mBAAO,EAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAChE,uEAAuE;QACvE,wEAAwE;QACxE,uCAAuC;QACvC,IAAA,uBAAa,EAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAClF,IAAA,mBAAS,EAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;CACF;AA9BD,0CA8BC;AAED,kFAAkF;AAClF,MAAa,iBAAiB;IACnB,IAAI,GAAG,UAAU,CAAC;IACnB,IAAI,CAAa;IACzB,YAAY,UAAsB,KAAK;QACrC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IACD,IAAI;QACF,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,CAAC,MAAkB;QACrB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;CACF;AAZD,8CAYC"}
package/dist/context.d.ts CHANGED
@@ -57,6 +57,11 @@ export interface RunContext {
57
57
  exec?: (cmd: string, args: string[], opts: {
58
58
  cwd: string;
59
59
  }) => Promise<number>;
60
+ /**
61
+ * Stops a long-running command (`atlas listen`). Optional; defaults to an
62
+ * abort on SIGINT/SIGTERM so Ctrl-C ends the stream cleanly.
63
+ */
64
+ signal?: AbortSignal;
60
65
  }
61
66
  /**
62
67
  * 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":";;AAgEA,wCAWC;AA3ED,qCAAuC;AACvC,gDAAyE;AACzE,qCAAgF;AAChF,+CAAkE;AAClE,6BAA0C;AAC1C,qCAA0D;AAsD1D;;;;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":";;AAqEA,wCAWC;AAhFD,qCAAuC;AACvC,gDAAyE;AACzE,qCAAgF;AAChF,+CAAkE;AAClE,6BAA0C;AAC1C,qCAA0D;AA2D1D;;;;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|create\n sessions revoke\n config export|import Config-as-code: round-trip the instance's config\n actions list|deploy|test|logs|gallery|show|install|installs|update|publish\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 import --from <vendor> <file>\n Move users from Auth0, Clerk, Supabase, Firebase, Cognito,\n Auth.js, WorkOS or Better Auth (resumable; --dry-run first)\n migrate code --from <vendor> [path]\n Rewrite an app's auth code onto Atlas (Clerk, Auth.js,\n Supabase, Auth0, Better Auth); a dry run with a diff unless --yes\n migrate better-auth [path] Move a Better Auth app to Atlas end to end: config, users,\n sessions and code, resumable (--dry-run, --resume, --yes)\n migrate better-auth config [path]\n Translate the app's betterAuth({...}) options into Atlas\n config files plus a report (offline)\n info [path] Print the environment for a support ticket (versions, SDKs,\n instance, API latency, preflight); secrets redacted\n mcp install Add the Atlas MCP server (docs search) to Cursor, Claude Code,\n Codex or VS Code\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 Referalli base URL for atlas referrals connect\n REFERALLY_API_KEY Referalli 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.";
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 (--device: operator sign-in in the browser, no key stored)\n token --resource <id> A one-hour token for one instance/app from your operator sign-in\n keys whoami|list|create|rotate|revoke|revoke-leaked\n Scoped secret keys; new secrets go sealed into 0600 files\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|upsert|update|test|deliveries|redeliver|replay|rotate|reveal\n listen --forward-to <url> Forward live events to your local server, signed (no tunnel)\n move-origin --from --to Move an app to a new domain in one step (--dry-run first)\n csp --framework next|express|nginx\n Print the Content Security Policy sources Atlas needs\n integrations list|get|set|remove|deliveries Identity integrations (chat, docs, consent, referrals, custom)\n sessions revoke\n config export|import|plan Config-as-code: round-trip the instance's config; plan = drift diff\n actions list|deploy|test|logs|gallery|show|install|installs|update|publish\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 doctor Integration health: webhooks, logout, referrals, email, consent (exit 1 on a failure)\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 status Atlas status, incidents that concern the instance and its\n upstream status pages; non-zero exit on an outage\n import --from <vendor> <file>\n Move users from Auth0, Clerk, Supabase, Firebase, Cognito,\n Auth.js, WorkOS or Better Auth (resumable; --dry-run first)\n migrate code --from <vendor> [path]\n Rewrite an app's auth code onto Atlas (Clerk, Auth.js,\n Supabase, Auth0, Better Auth); a dry run with a diff unless --yes\n migrate better-auth [path] Move a Better Auth app to Atlas end to end: config, users,\n sessions and code, resumable (--dry-run, --resume, --yes)\n migrate better-auth config [path]\n Translate the app's betterAuth({...}) options into Atlas\n config files plus a report (offline)\n info [path] Print the environment for a support ticket (versions, SDKs,\n instance, API latency, preflight); secrets redacted\n mcp install Add the Atlas MCP server (docs search) to Cursor, Claude Code,\n Codex or VS Code\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_BASE API URL to use instead of the stored one\n ATLAS_API_URL Same (the older name); ATLAS_API_BASE wins when both are set\n ATLAS_PLATFORM_KEY Platform key (psk_) for atlas init\n REFERALLI_BASE_URL Referalli base URL for atlas referrals connect\n REFERALLI_API_KEY Referalli merchant key for atlas referrals connect (never stored)\n (the old REFERALLY_BASE_URL / REFERALLY_API_KEY still work, with a notice)\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>;