primitive-admin 1.0.35 → 1.0.37

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,386 @@
1
+ import { ApiClient } from "../lib/api-client.js";
2
+ import { resolveAppId } from "../lib/config.js";
3
+ import { success, error, info, keyValue, formatTable, formatId, formatDate, formatStatus, json, divider, } from "../lib/output.js";
4
+ export function registerWebhooksCommands(program) {
5
+ const webhooks = program
6
+ .command("webhooks")
7
+ .description("Manage inbound webhooks that trigger workflows")
8
+ .addHelpText("after", `
9
+ Examples:
10
+ $ primitive webhooks list
11
+ $ primitive webhooks create --key stripe-events --name "Stripe Events" --workflow-key process-stripe --scheme hmac-sha256
12
+ $ primitive webhooks get 01HXY...
13
+ $ primitive webhooks rotate-secret 01HXY... --secret newsecret123
14
+ $ primitive webhooks events 01HXY...
15
+ $ primitive webhooks test 01HXY... --payload '{"event":"test"}'
16
+ `);
17
+ // List webhooks
18
+ webhooks
19
+ .command("list")
20
+ .description("List webhooks")
21
+ .argument("[app-id]", "App ID (uses current app if not specified)")
22
+ .option("--app <app-id>", "App ID")
23
+ .option("--status <status>", "Filter by status: active, paused, disabled")
24
+ .option("--json", "Output as JSON")
25
+ .action(async (appId, options) => {
26
+ const resolvedAppId = resolveAppId(appId, options);
27
+ const client = new ApiClient();
28
+ try {
29
+ const { items } = await client.listWebhooks(resolvedAppId, {
30
+ status: options.status,
31
+ });
32
+ if (options.json) {
33
+ json(items);
34
+ return;
35
+ }
36
+ if (!items || items.length === 0) {
37
+ info("No webhooks found.");
38
+ return;
39
+ }
40
+ console.log(formatTable(items, [
41
+ { header: "KEY", key: "webhookKey" },
42
+ { header: "NAME", key: "displayName" },
43
+ { header: "SCHEME", key: "verificationScheme" },
44
+ { header: "WORKFLOW", key: "workflowKey" },
45
+ { header: "STATUS", key: "status", format: formatStatus },
46
+ { header: "LAST TRIGGERED", key: "lastTriggeredAt", format: formatDate },
47
+ ]));
48
+ }
49
+ catch (err) {
50
+ error(err.message);
51
+ process.exit(1);
52
+ }
53
+ });
54
+ // Create webhook
55
+ webhooks
56
+ .command("create")
57
+ .description("Create a new webhook")
58
+ .argument("[app-id]", "App ID (uses current app if not specified)")
59
+ .option("--app <app-id>", "App ID")
60
+ .option("--key <key>", "Webhook key (unique identifier)")
61
+ .option("--name <name>", "Display name")
62
+ .option("--workflow-key <wfKey>", "Workflow key to trigger")
63
+ .option("--scheme <scheme>", "Verification scheme (e.g., hmac-sha256, none)")
64
+ .option("--secret <secret>", "Signing secret")
65
+ .option("--description <desc>", "Description")
66
+ .option("--tolerance-seconds <n>", "Timestamp tolerance in seconds")
67
+ .option("--no-dedup", "Disable deduplication")
68
+ .option("--dedup-window-ms <n>", "Deduplication window in milliseconds")
69
+ .option("--allowed-ips <cidrs...>", "Allowed IP CIDRs")
70
+ .option("--input-mapping <json>", "Input mapping as JSON")
71
+ .option("--json", "Output as JSON")
72
+ .action(async (appId, options) => {
73
+ const resolvedAppId = resolveAppId(appId, options);
74
+ const client = new ApiClient();
75
+ if (!options.key || !options.name || !options.workflowKey || !options.scheme) {
76
+ error("Required: --key, --name, --workflow-key, --scheme");
77
+ process.exit(1);
78
+ }
79
+ const payload = {
80
+ webhookKey: options.key,
81
+ displayName: options.name,
82
+ workflowKey: options.workflowKey,
83
+ verificationScheme: options.scheme,
84
+ };
85
+ if (options.secret)
86
+ payload.signingSecret = options.secret;
87
+ if (options.description)
88
+ payload.description = options.description;
89
+ if (options.toleranceSeconds)
90
+ payload.toleranceSeconds = parseInt(options.toleranceSeconds);
91
+ if (options.dedup === false)
92
+ payload.deduplicationEnabled = false;
93
+ if (options.dedupWindowMs)
94
+ payload.deduplicationWindowMs = parseInt(options.dedupWindowMs);
95
+ if (options.allowedIps)
96
+ payload.allowedIpCidrs = options.allowedIps;
97
+ if (options.inputMapping) {
98
+ try {
99
+ payload.inputMapping = JSON.parse(options.inputMapping);
100
+ }
101
+ catch {
102
+ error("Invalid JSON in --input-mapping");
103
+ process.exit(1);
104
+ }
105
+ }
106
+ try {
107
+ const result = await client.createWebhook(resolvedAppId, payload);
108
+ if (options.json) {
109
+ json(result);
110
+ return;
111
+ }
112
+ success(`Webhook created: ${result.displayName}`);
113
+ keyValue("Webhook ID", result.webhookId);
114
+ keyValue("Key", result.webhookKey);
115
+ keyValue("Workflow", result.workflowKey);
116
+ keyValue("Scheme", result.verificationScheme);
117
+ }
118
+ catch (err) {
119
+ error(err.message);
120
+ process.exit(1);
121
+ }
122
+ });
123
+ // Get webhook
124
+ webhooks
125
+ .command("get")
126
+ .description("Get webhook details")
127
+ .argument("<webhook-id>", "Webhook ID")
128
+ .option("--app <app-id>", "App ID (uses current app if not specified)")
129
+ .option("--json", "Output as JSON")
130
+ .action(async (webhookId, options) => {
131
+ const resolvedAppId = resolveAppId(undefined, options);
132
+ const client = new ApiClient();
133
+ try {
134
+ const result = await client.getWebhook(resolvedAppId, webhookId);
135
+ if (options.json) {
136
+ json(result);
137
+ return;
138
+ }
139
+ keyValue("Webhook ID", result.webhookId);
140
+ keyValue("Key", result.webhookKey);
141
+ keyValue("Name", result.displayName);
142
+ keyValue("Description", result.description || "-");
143
+ keyValue("Status", formatStatus(result.status));
144
+ keyValue("Workflow Key", result.workflowKey);
145
+ keyValue("Verification Scheme", result.verificationScheme);
146
+ keyValue("Signing Secret", result.signingSecretMasked || "-");
147
+ divider();
148
+ info("Configuration:");
149
+ keyValue(" Tolerance Seconds", String(result.toleranceSeconds ?? "-"));
150
+ keyValue(" Deduplication", result.deduplicationEnabled ? "enabled" : "disabled");
151
+ keyValue(" Dedup Window", result.deduplicationWindowMs ? `${result.deduplicationWindowMs}ms` : "-");
152
+ keyValue(" Grace Period", result.secretGracePeriodMs ? `${result.secretGracePeriodMs}ms` : "-");
153
+ keyValue(" Allowed IPs", result.allowedIpCidrs || "-");
154
+ keyValue(" Input Mapping", result.inputMapping || "-");
155
+ divider();
156
+ keyValue("Last Triggered", result.lastTriggeredAt ? formatDate(result.lastTriggeredAt) : "never");
157
+ keyValue("Created", formatDate(result.createdAt));
158
+ keyValue("Modified", formatDate(result.modifiedAt));
159
+ }
160
+ catch (err) {
161
+ error(err.message);
162
+ process.exit(1);
163
+ }
164
+ });
165
+ // Update webhook
166
+ webhooks
167
+ .command("update")
168
+ .description("Update a webhook")
169
+ .argument("<webhook-id>", "Webhook ID")
170
+ .option("--app <app-id>", "App ID (uses current app if not specified)")
171
+ .option("--name <name>", "Display name")
172
+ .option("--description <desc>", "Description")
173
+ .option("--status <status>", "Status: active, paused, disabled")
174
+ .option("--scheme <scheme>", "Verification scheme")
175
+ .option("--workflow-key <wfKey>", "Workflow key to trigger")
176
+ .option("--tolerance-seconds <n>", "Timestamp tolerance in seconds")
177
+ .option("--no-dedup", "Disable deduplication")
178
+ .option("--dedup-window-ms <n>", "Deduplication window in milliseconds")
179
+ .option("--allowed-ips <cidrs...>", "Allowed IP CIDRs")
180
+ .option("--grace-period-ms <n>", "Secret grace period in milliseconds")
181
+ .option("--input-mapping <json>", "Input mapping as JSON")
182
+ .option("--json", "Output as JSON")
183
+ .action(async (webhookId, options) => {
184
+ const resolvedAppId = resolveAppId(undefined, options);
185
+ const payload = {};
186
+ if (options.name)
187
+ payload.displayName = options.name;
188
+ if (options.description)
189
+ payload.description = options.description;
190
+ if (options.status)
191
+ payload.status = options.status;
192
+ if (options.scheme)
193
+ payload.verificationScheme = options.scheme;
194
+ if (options.workflowKey)
195
+ payload.workflowKey = options.workflowKey;
196
+ if (options.toleranceSeconds)
197
+ payload.toleranceSeconds = parseInt(options.toleranceSeconds);
198
+ if (options.dedup === false)
199
+ payload.deduplicationEnabled = false;
200
+ if (options.dedupWindowMs)
201
+ payload.deduplicationWindowMs = parseInt(options.dedupWindowMs);
202
+ if (options.allowedIps)
203
+ payload.allowedIpCidrs = options.allowedIps;
204
+ if (options.gracePeriodMs)
205
+ payload.secretGracePeriodMs = parseInt(options.gracePeriodMs);
206
+ if (options.inputMapping) {
207
+ try {
208
+ payload.inputMapping = JSON.parse(options.inputMapping);
209
+ }
210
+ catch {
211
+ error("Invalid JSON in --input-mapping");
212
+ process.exit(1);
213
+ }
214
+ }
215
+ if (Object.keys(payload).length === 0) {
216
+ error("No update options specified.");
217
+ process.exit(1);
218
+ }
219
+ const client = new ApiClient();
220
+ try {
221
+ const result = await client.updateWebhook(resolvedAppId, webhookId, payload);
222
+ if (options.json) {
223
+ json(result);
224
+ return;
225
+ }
226
+ success("Webhook updated.");
227
+ }
228
+ catch (err) {
229
+ error(err.message);
230
+ process.exit(1);
231
+ }
232
+ });
233
+ // Delete webhook
234
+ webhooks
235
+ .command("delete")
236
+ .description("Delete a webhook")
237
+ .argument("<webhook-id>", "Webhook ID")
238
+ .option("--app <app-id>", "App ID (uses current app if not specified)")
239
+ .option("-y, --yes", "Skip confirmation prompt")
240
+ .action(async (webhookId, options) => {
241
+ const resolvedAppId = resolveAppId(undefined, options);
242
+ if (!options.yes) {
243
+ const inquirer = await import("inquirer");
244
+ const { confirm } = await inquirer.default.prompt([
245
+ {
246
+ type: "confirm",
247
+ name: "confirm",
248
+ message: `Are you sure you want to delete webhook ${webhookId}?`,
249
+ default: false,
250
+ },
251
+ ]);
252
+ if (!confirm) {
253
+ info("Cancelled.");
254
+ return;
255
+ }
256
+ }
257
+ const client = new ApiClient();
258
+ try {
259
+ await client.deleteWebhook(resolvedAppId, webhookId);
260
+ success("Webhook deleted.");
261
+ }
262
+ catch (err) {
263
+ error(err.message);
264
+ process.exit(1);
265
+ }
266
+ });
267
+ // Rotate secret
268
+ webhooks
269
+ .command("rotate-secret")
270
+ .description("Rotate the signing secret for a webhook")
271
+ .argument("<webhook-id>", "Webhook ID")
272
+ .requiredOption("--secret <new-secret>", "New signing secret")
273
+ .option("--app <app-id>", "App ID (uses current app if not specified)")
274
+ .option("--json", "Output as JSON")
275
+ .action(async (webhookId, options) => {
276
+ const resolvedAppId = resolveAppId(undefined, options);
277
+ const client = new ApiClient();
278
+ try {
279
+ const result = await client.rotateWebhookSecret(resolvedAppId, webhookId, {
280
+ signingSecret: options.secret,
281
+ });
282
+ if (options.json) {
283
+ json(result);
284
+ return;
285
+ }
286
+ success("Signing secret rotated.");
287
+ if (result.signingSecretMasked) {
288
+ keyValue("Secret (masked)", result.signingSecretMasked);
289
+ }
290
+ }
291
+ catch (err) {
292
+ error(err.message);
293
+ process.exit(1);
294
+ }
295
+ });
296
+ // List webhook events
297
+ webhooks
298
+ .command("events")
299
+ .description("View webhook event history")
300
+ .argument("<webhook-id>", "Webhook ID")
301
+ .option("--app <app-id>", "App ID (uses current app if not specified)")
302
+ .option("--limit <n>", "Number of events to show", "20")
303
+ .option("--json", "Output as JSON")
304
+ .action(async (webhookId, options) => {
305
+ const resolvedAppId = resolveAppId(undefined, options);
306
+ const client = new ApiClient();
307
+ try {
308
+ const result = await client.listWebhookEvents(resolvedAppId, webhookId, {
309
+ limit: parseInt(options.limit),
310
+ });
311
+ const events = result?.items ?? result ?? [];
312
+ if (options.json) {
313
+ json(events);
314
+ return;
315
+ }
316
+ if (!events || events.length === 0) {
317
+ info("No events found.");
318
+ return;
319
+ }
320
+ console.log(formatTable(events, [
321
+ { header: "EVENT ID", key: "eventId", format: formatId },
322
+ { header: "EXTERNAL ID", key: "externalEventId" },
323
+ { header: "STATUS", key: "status", format: formatStatus },
324
+ { header: "HTTP", key: "httpStatus" },
325
+ { header: "REASON", key: "rejectionReason" },
326
+ { header: "CREATED", key: "createdAt", format: formatDate },
327
+ ]));
328
+ }
329
+ catch (err) {
330
+ error(err.message);
331
+ process.exit(1);
332
+ }
333
+ });
334
+ // Test webhook
335
+ webhooks
336
+ .command("test")
337
+ .description("Send a test payload to a webhook")
338
+ .argument("<webhook-id>", "Webhook ID")
339
+ .option("--app <app-id>", "App ID (uses current app if not specified)")
340
+ .option("--payload <json>", "Test payload as JSON")
341
+ .option("--json", "Output as JSON")
342
+ .action(async (webhookId, options) => {
343
+ const resolvedAppId = resolveAppId(undefined, options);
344
+ let payload = {};
345
+ if (options.payload) {
346
+ try {
347
+ payload = JSON.parse(options.payload);
348
+ }
349
+ catch {
350
+ error("Invalid JSON in --payload");
351
+ process.exit(1);
352
+ }
353
+ }
354
+ const client = new ApiClient();
355
+ try {
356
+ const result = await client.testWebhook(resolvedAppId, webhookId, payload);
357
+ if (options.json) {
358
+ json(result);
359
+ return;
360
+ }
361
+ if (result.success) {
362
+ success("Test webhook delivered successfully.");
363
+ if (result.signatureHeaders) {
364
+ divider();
365
+ info("Generated Signature Headers:");
366
+ for (const [header, value] of Object.entries(result.signatureHeaders)) {
367
+ keyValue(` ${header}`, String(value));
368
+ }
369
+ }
370
+ if (result.payload) {
371
+ divider();
372
+ info("Test Payload:");
373
+ console.log(JSON.stringify(result.payload, null, 2));
374
+ }
375
+ }
376
+ else {
377
+ error(`Test failed: ${result.message || result.errorCode || "unknown error"}`);
378
+ }
379
+ }
380
+ catch (err) {
381
+ error(err.message);
382
+ process.exit(1);
383
+ }
384
+ });
385
+ }
386
+ //# sourceMappingURL=webhooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../../src/commands/webhooks.ts"],"names":[],"mappings":"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"}