@sendly/cli 1.1.0 → 2.3.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,13 @@
1
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
2
+ export default class WebhooksCreate extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static flags: {
6
+ url: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
7
+ events: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
8
+ description: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
9
+ json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
10
+ quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
11
+ };
12
+ run(): Promise<void>;
13
+ }
@@ -0,0 +1,56 @@
1
+ import { Flags } from "@oclif/core";
2
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
3
+ import { apiClient } from "../../lib/api-client.js";
4
+ import { success, warn, json, colors, codeBlock, isJsonMode, } from "../../lib/output.js";
5
+ export default class WebhooksCreate extends AuthenticatedCommand {
6
+ static description = "Create a webhook";
7
+ static examples = [
8
+ '<%= config.bin %> webhooks create --url https://myapp.com/webhook --events message.delivered',
9
+ '<%= config.bin %> webhooks create --url https://myapp.com/webhook --events message.delivered,message.failed --description "Production webhook"',
10
+ '<%= config.bin %> webhooks create --url https://webhook.site/abc123 --events message.sent --json',
11
+ ];
12
+ static flags = {
13
+ ...AuthenticatedCommand.baseFlags,
14
+ url: Flags.string({
15
+ char: "u",
16
+ description: "Webhook URL (must be HTTPS)",
17
+ required: true,
18
+ }),
19
+ events: Flags.string({
20
+ char: "e",
21
+ description: "Comma-separated list of events to listen for",
22
+ required: true,
23
+ }),
24
+ description: Flags.string({
25
+ char: "d",
26
+ description: "Description for the webhook",
27
+ }),
28
+ };
29
+ async run() {
30
+ const { flags } = await this.parse(WebhooksCreate);
31
+ const events = flags.events.split(",").map(e => e.trim());
32
+ const response = await apiClient.post("/api/v1/webhooks", {
33
+ url: flags.url,
34
+ events,
35
+ ...(flags.description && { description: flags.description }),
36
+ });
37
+ if (isJsonMode()) {
38
+ json(response);
39
+ return;
40
+ }
41
+ success("Webhook created", {
42
+ ID: response.id,
43
+ URL: response.url,
44
+ Events: response.events.join(", "),
45
+ ...(response.description && { Description: response.description }),
46
+ Status: response.isActive ? colors.success("active") : colors.warning("inactive"),
47
+ });
48
+ console.log();
49
+ warn("Copy your webhook secret now. You won't be able to see it again!");
50
+ codeBlock(response.secret);
51
+ console.log();
52
+ console.log(colors.dim("Use this secret to verify webhook signatures in your application."));
53
+ console.log(colors.dim("See the docs for signature verification examples."));
54
+ }
55
+ }
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3dlYmhvb2tzL2NyZWF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsT0FBTyxFQUNQLElBQUksRUFDSixJQUFJLEVBQ0osTUFBTSxFQUNOLFNBQVMsRUFDVCxVQUFVLEdBQ1gsTUFBTSxxQkFBcUIsQ0FBQztBQWE3QixNQUFNLENBQUMsT0FBTyxPQUFPLGNBQWUsU0FBUSxvQkFBb0I7SUFDOUQsTUFBTSxDQUFDLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQztJQUV4QyxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLDhGQUE4RjtRQUM5RixnSkFBZ0o7UUFDaEosa0dBQWtHO0tBQ25HLENBQUM7SUFFRixNQUFNLENBQUMsS0FBSyxHQUFHO1FBQ2IsR0FBRyxvQkFBb0IsQ0FBQyxTQUFTO1FBQ2pDLEdBQUcsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ2hCLElBQUksRUFBRSxHQUFHO1lBQ1QsV0FBVyxFQUFFLDZCQUE2QjtZQUMxQyxRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUM7UUFDRixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUNuQixJQUFJLEVBQUUsR0FBRztZQUNULFdBQVcsRUFBRSw4Q0FBOEM7WUFDM0QsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDO1FBQ0YsV0FBVyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDeEIsSUFBSSxFQUFFLEdBQUc7WUFDVCxXQUFXLEVBQUUsNkJBQTZCO1NBQzNDLENBQUM7S0FDSCxDQUFDO0lBRUYsS0FBSyxDQUFDLEdBQUc7UUFDUCxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRW5ELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRTFELE1BQU0sUUFBUSxHQUFHLE1BQU0sU0FBUyxDQUFDLElBQUksQ0FBd0Isa0JBQWtCLEVBQUU7WUFDL0UsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHO1lBQ2QsTUFBTTtZQUNOLEdBQUcsQ0FBQyxLQUFLLENBQUMsV0FBVyxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUM3RCxDQUFDLENBQUM7UUFFSCxJQUFJLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2YsT0FBTztRQUNULENBQUM7UUFFRCxPQUFPLENBQUMsaUJBQWlCLEVBQUU7WUFDekIsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFO1lBQ2YsR0FBRyxFQUFFLFFBQVEsQ0FBQyxHQUFHO1lBQ2pCLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDbEMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxXQUFXLElBQUksRUFBRSxXQUFXLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2xFLE1BQU0sRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztTQUNsRixDQUFDLENBQUM7UUFFSCxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUMsa0VBQWtFLENBQUMsQ0FBQztRQUN6RSxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTNCLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxtRUFBbUUsQ0FBQyxDQUFDLENBQUM7UUFDN0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLG1EQUFtRCxDQUFDLENBQUMsQ0FBQztJQUMvRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmxhZ3MgfSBmcm9tIFwiQG9jbGlmL2NvcmVcIjtcbmltcG9ydCB7IEF1dGhlbnRpY2F0ZWRDb21tYW5kIH0gZnJvbSBcIi4uLy4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGFwaUNsaWVudCB9IGZyb20gXCIuLi8uLi9saWIvYXBpLWNsaWVudC5qc1wiO1xuaW1wb3J0IHtcbiAgc3VjY2VzcyxcbiAgd2FybixcbiAganNvbixcbiAgY29sb3JzLFxuICBjb2RlQmxvY2ssXG4gIGlzSnNvbk1vZGUsXG59IGZyb20gXCIuLi8uLi9saWIvb3V0cHV0LmpzXCI7XG5cbmludGVyZmFjZSBDcmVhdGVXZWJob29rUmVzcG9uc2Uge1xuICBpZDogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgZXZlbnRzOiBzdHJpbmdbXTtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHNlY3JldDogc3RyaW5nOyAvLyBPbmx5IHJldHVybmVkIG9uIGNyZWF0aW9uXG4gIHNlY3JldFZlcnNpb246IG51bWJlcjtcbiAgaXNBY3RpdmU6IGJvb2xlYW47XG4gIGNyZWF0ZWRBdDogc3RyaW5nO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXZWJob29rc0NyZWF0ZSBleHRlbmRzIEF1dGhlbnRpY2F0ZWRDb21tYW5kIHtcbiAgc3RhdGljIGRlc2NyaXB0aW9uID0gXCJDcmVhdGUgYSB3ZWJob29rXCI7XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgICc8JT0gY29uZmlnLmJpbiAlPiB3ZWJob29rcyBjcmVhdGUgLS11cmwgaHR0cHM6Ly9teWFwcC5jb20vd2ViaG9vayAtLWV2ZW50cyBtZXNzYWdlLmRlbGl2ZXJlZCcsXG4gICAgJzwlPSBjb25maWcuYmluICU+IHdlYmhvb2tzIGNyZWF0ZSAtLXVybCBodHRwczovL215YXBwLmNvbS93ZWJob29rIC0tZXZlbnRzIG1lc3NhZ2UuZGVsaXZlcmVkLG1lc3NhZ2UuZmFpbGVkIC0tZGVzY3JpcHRpb24gXCJQcm9kdWN0aW9uIHdlYmhvb2tcIicsXG4gICAgJzwlPSBjb25maWcuYmluICU+IHdlYmhvb2tzIGNyZWF0ZSAtLXVybCBodHRwczovL3dlYmhvb2suc2l0ZS9hYmMxMjMgLS1ldmVudHMgbWVzc2FnZS5zZW50IC0tanNvbicsXG4gIF07XG5cbiAgc3RhdGljIGZsYWdzID0ge1xuICAgIC4uLkF1dGhlbnRpY2F0ZWRDb21tYW5kLmJhc2VGbGFncyxcbiAgICB1cmw6IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcInVcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIldlYmhvb2sgVVJMIChtdXN0IGJlIEhUVFBTKVwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSksXG4gICAgZXZlbnRzOiBGbGFncy5zdHJpbmcoe1xuICAgICAgY2hhcjogXCJlXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBldmVudHMgdG8gbGlzdGVuIGZvclwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSksXG4gICAgZGVzY3JpcHRpb246IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcImRcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkRlc2NyaXB0aW9uIGZvciB0aGUgd2ViaG9va1wiLFxuICAgIH0pLFxuICB9O1xuXG4gIGFzeW5jIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGZsYWdzIH0gPSBhd2FpdCB0aGlzLnBhcnNlKFdlYmhvb2tzQ3JlYXRlKTtcblxuICAgIGNvbnN0IGV2ZW50cyA9IGZsYWdzLmV2ZW50cy5zcGxpdChcIixcIikubWFwKGUgPT4gZS50cmltKCkpO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhcGlDbGllbnQucG9zdDxDcmVhdGVXZWJob29rUmVzcG9uc2U+KFwiL2FwaS92MS93ZWJob29rc1wiLCB7XG4gICAgICB1cmw6IGZsYWdzLnVybCxcbiAgICAgIGV2ZW50cyxcbiAgICAgIC4uLihmbGFncy5kZXNjcmlwdGlvbiAmJiB7IGRlc2NyaXB0aW9uOiBmbGFncy5kZXNjcmlwdGlvbiB9KSxcbiAgICB9KTtcblxuICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgIGpzb24ocmVzcG9uc2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1Y2Nlc3MoXCJXZWJob29rIGNyZWF0ZWRcIiwge1xuICAgICAgSUQ6IHJlc3BvbnNlLmlkLFxuICAgICAgVVJMOiByZXNwb25zZS51cmwsXG4gICAgICBFdmVudHM6IHJlc3BvbnNlLmV2ZW50cy5qb2luKFwiLCBcIiksXG4gICAgICAuLi4ocmVzcG9uc2UuZGVzY3JpcHRpb24gJiYgeyBEZXNjcmlwdGlvbjogcmVzcG9uc2UuZGVzY3JpcHRpb24gfSksXG4gICAgICBTdGF0dXM6IHJlc3BvbnNlLmlzQWN0aXZlID8gY29sb3JzLnN1Y2Nlc3MoXCJhY3RpdmVcIikgOiBjb2xvcnMud2FybmluZyhcImluYWN0aXZlXCIpLFxuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coKTtcbiAgICB3YXJuKFwiQ29weSB5b3VyIHdlYmhvb2sgc2VjcmV0IG5vdy4gWW91IHdvbid0IGJlIGFibGUgdG8gc2VlIGl0IGFnYWluIVwiKTtcbiAgICBjb2RlQmxvY2socmVzcG9uc2Uuc2VjcmV0KTtcblxuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coY29sb3JzLmRpbShcIlVzZSB0aGlzIHNlY3JldCB0byB2ZXJpZnkgd2ViaG9vayBzaWduYXR1cmVzIGluIHlvdXIgYXBwbGljYXRpb24uXCIpKTtcbiAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwiU2VlIHRoZSBkb2NzIGZvciBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGV4YW1wbGVzLlwiKSk7XG4gIH1cbn0iXX0=
@@ -0,0 +1,14 @@
1
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
2
+ export default class WebhooksDelete extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ id: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ yes: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
10
+ json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
11
+ quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
12
+ };
13
+ run(): Promise<void>;
14
+ }
@@ -0,0 +1,64 @@
1
+ import { Args, Flags } from "@oclif/core";
2
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
3
+ import { apiClient } from "../../lib/api-client.js";
4
+ import { success, error, json, colors, isJsonMode } from "../../lib/output.js";
5
+ import inquirer from "inquirer";
6
+ export default class WebhooksDelete extends AuthenticatedCommand {
7
+ static description = "Delete a webhook";
8
+ static examples = [
9
+ "<%= config.bin %> webhooks delete whk_abc123",
10
+ "<%= config.bin %> webhooks delete whk_abc123 --yes",
11
+ "<%= config.bin %> webhooks delete whk_abc123 --json",
12
+ ];
13
+ static args = {
14
+ id: Args.string({
15
+ description: "Webhook ID to delete",
16
+ required: true,
17
+ }),
18
+ };
19
+ static flags = {
20
+ ...AuthenticatedCommand.baseFlags,
21
+ yes: Flags.boolean({
22
+ char: "y",
23
+ description: "Skip confirmation prompt",
24
+ default: false,
25
+ }),
26
+ };
27
+ async run() {
28
+ const { args, flags } = await this.parse(WebhooksDelete);
29
+ // Get webhook details for confirmation
30
+ let webhook;
31
+ try {
32
+ webhook = await apiClient.get(`/api/v1/webhooks/${args.id}`);
33
+ }
34
+ catch (err) {
35
+ error(`Webhook not found: ${args.id}`);
36
+ this.exit(1);
37
+ }
38
+ // Confirm deletion
39
+ if (!flags.yes && !isJsonMode()) {
40
+ const { confirm } = await inquirer.prompt([
41
+ {
42
+ type: "confirm",
43
+ name: "confirm",
44
+ message: `Are you sure you want to delete webhook ${colors.code(args.id)} (${colors.dim(webhook.url)})? This cannot be undone.`,
45
+ default: false,
46
+ },
47
+ ]);
48
+ if (!confirm) {
49
+ error("Deletion cancelled");
50
+ return;
51
+ }
52
+ }
53
+ await apiClient.delete(`/api/v1/webhooks/${args.id}`);
54
+ if (isJsonMode()) {
55
+ json({ success: true, webhookId: args.id, deleted: true });
56
+ return;
57
+ }
58
+ success("Webhook deleted", {
59
+ ID: args.id,
60
+ URL: webhook.url,
61
+ });
62
+ }
63
+ }
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3dlYmhvb2tzL2RlbGV0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMxQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMvRSxPQUFPLFFBQVEsTUFBTSxVQUFVLENBQUM7QUFFaEMsTUFBTSxDQUFDLE9BQU8sT0FBTyxjQUFlLFNBQVEsb0JBQW9CO0lBQzlELE1BQU0sQ0FBQyxXQUFXLEdBQUcsa0JBQWtCLENBQUM7SUFFeEMsTUFBTSxDQUFDLFFBQVEsR0FBRztRQUNoQiw4Q0FBOEM7UUFDOUMsb0RBQW9EO1FBQ3BELHFEQUFxRDtLQUN0RCxDQUFDO0lBRUYsTUFBTSxDQUFDLElBQUksR0FBRztRQUNaLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ2QsV0FBVyxFQUFFLHNCQUFzQjtZQUNuQyxRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUM7S0FDSCxDQUFDO0lBRUYsTUFBTSxDQUFDLEtBQUssR0FBRztRQUNiLEdBQUcsb0JBQW9CLENBQUMsU0FBUztRQUNqQyxHQUFHLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUNqQixJQUFJLEVBQUUsR0FBRztZQUNULFdBQVcsRUFBRSwwQkFBMEI7WUFDdkMsT0FBTyxFQUFFLEtBQUs7U0FDZixDQUFDO0tBQ0gsQ0FBQztJQUVGLEtBQUssQ0FBQyxHQUFHO1FBQ1AsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFekQsdUNBQXVDO1FBQ3ZDLElBQUksT0FBTyxDQUFDO1FBQ1osSUFBSSxDQUFDO1lBQ0gsT0FBTyxHQUFHLE1BQU0sU0FBUyxDQUFDLEdBQUcsQ0FBOEIsb0JBQW9CLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzVGLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsS0FBSyxDQUFDLHNCQUFzQixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2YsQ0FBQztRQUVELG1CQUFtQjtRQUNuQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDaEMsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQztnQkFDeEM7b0JBQ0UsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsT0FBTyxFQUFFLDJDQUEyQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCO29CQUMvSCxPQUFPLEVBQUUsS0FBSztpQkFDZjthQUNGLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDYixLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztnQkFDNUIsT0FBTztZQUNULENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxTQUFTLENBQUMsTUFBTSxDQUFDLG9CQUFvQixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUV0RCxJQUFJLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMzRCxPQUFPO1FBQ1QsQ0FBQztRQUVELE9BQU8sQ0FBQyxpQkFBaUIsRUFBRTtZQUN6QixFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDWCxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7U0FDakIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFyZ3MsIEZsYWdzIH0gZnJvbSBcIkBvY2xpZi9jb3JlXCI7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGVkQ29tbWFuZCB9IGZyb20gXCIuLi8uLi9saWIvYmFzZS1jb21tYW5kLmpzXCI7XG5pbXBvcnQgeyBhcGlDbGllbnQgfSBmcm9tIFwiLi4vLi4vbGliL2FwaS1jbGllbnQuanNcIjtcbmltcG9ydCB7IHN1Y2Nlc3MsIGVycm9yLCBqc29uLCBjb2xvcnMsIGlzSnNvbk1vZGUgfSBmcm9tIFwiLi4vLi4vbGliL291dHB1dC5qc1wiO1xuaW1wb3J0IGlucXVpcmVyIGZyb20gXCJpbnF1aXJlclwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXZWJob29rc0RlbGV0ZSBleHRlbmRzIEF1dGhlbnRpY2F0ZWRDb21tYW5kIHtcbiAgc3RhdGljIGRlc2NyaXB0aW9uID0gXCJEZWxldGUgYSB3ZWJob29rXCI7XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gd2ViaG9va3MgZGVsZXRlIHdoa19hYmMxMjNcIixcbiAgICBcIjwlPSBjb25maWcuYmluICU+IHdlYmhvb2tzIGRlbGV0ZSB3aGtfYWJjMTIzIC0teWVzXCIsXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiB3ZWJob29rcyBkZWxldGUgd2hrX2FiYzEyMyAtLWpzb25cIixcbiAgXTtcblxuICBzdGF0aWMgYXJncyA9IHtcbiAgICBpZDogQXJncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246IFwiV2ViaG9vayBJRCB0byBkZWxldGVcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pLFxuICB9O1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5BdXRoZW50aWNhdGVkQ29tbWFuZC5iYXNlRmxhZ3MsXG4gICAgeWVzOiBGbGFncy5ib29sZWFuKHtcbiAgICAgIGNoYXI6IFwieVwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiU2tpcCBjb25maXJtYXRpb24gcHJvbXB0XCIsXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB9KSxcbiAgfTtcblxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBhcmdzLCBmbGFncyB9ID0gYXdhaXQgdGhpcy5wYXJzZShXZWJob29rc0RlbGV0ZSk7XG5cbiAgICAvLyBHZXQgd2ViaG9vayBkZXRhaWxzIGZvciBjb25maXJtYXRpb25cbiAgICBsZXQgd2ViaG9vaztcbiAgICB0cnkge1xuICAgICAgd2ViaG9vayA9IGF3YWl0IGFwaUNsaWVudC5nZXQ8eyBpZDogc3RyaW5nOyB1cmw6IHN0cmluZyB9PihgL2FwaS92MS93ZWJob29rcy8ke2FyZ3MuaWR9YCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBlcnJvcihgV2ViaG9vayBub3QgZm91bmQ6ICR7YXJncy5pZH1gKTtcbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBDb25maXJtIGRlbGV0aW9uXG4gICAgaWYgKCFmbGFncy55ZXMgJiYgIWlzSnNvbk1vZGUoKSkge1xuICAgICAgY29uc3QgeyBjb25maXJtIH0gPSBhd2FpdCBpbnF1aXJlci5wcm9tcHQoW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJjb25maXJtXCIsXG4gICAgICAgICAgbmFtZTogXCJjb25maXJtXCIsXG4gICAgICAgICAgbWVzc2FnZTogYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgd2ViaG9vayAke2NvbG9ycy5jb2RlKGFyZ3MuaWQpfSAoJHtjb2xvcnMuZGltKHdlYmhvb2sudXJsKX0pPyBUaGlzIGNhbm5vdCBiZSB1bmRvbmUuYCxcbiAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuXG4gICAgICBpZiAoIWNvbmZpcm0pIHtcbiAgICAgICAgZXJyb3IoXCJEZWxldGlvbiBjYW5jZWxsZWRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBhcGlDbGllbnQuZGVsZXRlKGAvYXBpL3YxL3dlYmhvb2tzLyR7YXJncy5pZH1gKTtcblxuICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgIGpzb24oeyBzdWNjZXNzOiB0cnVlLCB3ZWJob29rSWQ6IGFyZ3MuaWQsIGRlbGV0ZWQ6IHRydWUgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3VjY2VzcyhcIldlYmhvb2sgZGVsZXRlZFwiLCB7XG4gICAgICBJRDogYXJncy5pZCxcbiAgICAgIFVSTDogd2ViaG9vay51cmwsXG4gICAgfSk7XG4gIH1cbn0iXX0=
@@ -0,0 +1,15 @@
1
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
2
+ export default class WebhooksDeliveries extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ id: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ limit: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<number, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
10
+ "failed-only": import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
11
+ json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
12
+ quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
13
+ };
14
+ run(): Promise<void>;
15
+ }
@@ -0,0 +1,137 @@
1
+ import { Args, Flags } from "@oclif/core";
2
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
3
+ import { apiClient } from "../../lib/api-client.js";
4
+ import { table, json, info, colors, formatDate, isJsonMode, } from "../../lib/output.js";
5
+ export default class WebhooksDeliveries extends AuthenticatedCommand {
6
+ static description = "View webhook delivery history";
7
+ static examples = [
8
+ "<%= config.bin %> webhooks deliveries whk_abc123",
9
+ "<%= config.bin %> webhooks deliveries whk_abc123 --limit 20",
10
+ "<%= config.bin %> webhooks deliveries whk_abc123 --failed-only",
11
+ "<%= config.bin %> webhooks deliveries whk_abc123 --json",
12
+ ];
13
+ static args = {
14
+ id: Args.string({
15
+ description: "Webhook ID",
16
+ required: true,
17
+ }),
18
+ };
19
+ static flags = {
20
+ ...AuthenticatedCommand.baseFlags,
21
+ limit: Flags.integer({
22
+ char: "l",
23
+ description: "Number of deliveries to show",
24
+ default: 10,
25
+ }),
26
+ "failed-only": Flags.boolean({
27
+ description: "Show only failed deliveries",
28
+ default: false,
29
+ }),
30
+ };
31
+ async run() {
32
+ const { args, flags } = await this.parse(WebhooksDeliveries);
33
+ const params = new URLSearchParams({
34
+ limit: String(flags.limit),
35
+ ...(flags["failed-only"] && { status: "failed" }),
36
+ });
37
+ const deliveries = await apiClient.get(`/api/v1/webhooks/${args.id}/deliveries?${params.toString()}`);
38
+ if (isJsonMode()) {
39
+ json(deliveries);
40
+ return;
41
+ }
42
+ if (deliveries.length === 0) {
43
+ info(flags["failed-only"] ? "No failed deliveries found" : "No deliveries found");
44
+ return;
45
+ }
46
+ console.log();
47
+ console.log(colors.dim(`Showing ${deliveries.length} deliveries for webhook ${args.id}`));
48
+ console.log();
49
+ // Add computed fields for better display
50
+ const deliveriesWithComputed = deliveries.map(d => ({
51
+ ...d,
52
+ attemptDisplay: `${d.attemptNumber}/${d.maxAttempts}`,
53
+ }));
54
+ table(deliveriesWithComputed, [
55
+ {
56
+ header: "Delivery ID",
57
+ key: "id",
58
+ width: 18,
59
+ formatter: (v) => colors.dim(String(v).slice(0, 15) + "..."),
60
+ },
61
+ {
62
+ header: "Event",
63
+ key: "eventType",
64
+ width: 15,
65
+ formatter: (v) => String(v).replace("message.", ""),
66
+ },
67
+ {
68
+ header: "Status",
69
+ key: "status",
70
+ width: 12,
71
+ formatter: (v) => {
72
+ switch (v) {
73
+ case "delivered":
74
+ return colors.success("delivered");
75
+ case "failed":
76
+ return colors.error("failed");
77
+ case "pending":
78
+ return colors.warning("pending");
79
+ case "cancelled":
80
+ return colors.dim("cancelled");
81
+ default:
82
+ return String(v);
83
+ }
84
+ },
85
+ },
86
+ {
87
+ header: "Attempt",
88
+ key: "attemptDisplay",
89
+ width: 10,
90
+ },
91
+ {
92
+ header: "Status Code",
93
+ key: "responseStatusCode",
94
+ width: 12,
95
+ formatter: (v) => {
96
+ if (!v)
97
+ return colors.dim("-");
98
+ const code = Number(v);
99
+ return code >= 200 && code < 300
100
+ ? colors.success(String(code))
101
+ : colors.error(String(code));
102
+ },
103
+ },
104
+ {
105
+ header: "Response Time",
106
+ key: "responseTime",
107
+ width: 14,
108
+ formatter: (v) => v ? `${v}ms` : colors.dim("-"),
109
+ },
110
+ {
111
+ header: "Created",
112
+ key: "createdAt",
113
+ width: 16,
114
+ formatter: (v) => formatDate(String(v)),
115
+ },
116
+ ]);
117
+ // Show failed delivery details
118
+ const failed = deliveries.filter(d => d.status === "failed" && d.errorMessage);
119
+ if (failed.length > 0 && !flags["failed-only"]) {
120
+ console.log();
121
+ console.log(colors.error("Failed deliveries:"));
122
+ failed.forEach(delivery => {
123
+ console.log(colors.dim(` ${delivery.id.slice(0, 15)}...:`), delivery.errorMessage || "Unknown error");
124
+ });
125
+ }
126
+ // Show pending retries
127
+ const pending = deliveries.filter(d => d.status === "pending" && d.nextRetryAt);
128
+ if (pending.length > 0) {
129
+ console.log();
130
+ console.log(colors.warning("Pending retries:"));
131
+ pending.forEach(delivery => {
132
+ console.log(colors.dim(` ${delivery.id.slice(0, 15)}...:`), `Next retry at ${formatDate(delivery.nextRetryAt)}`);
133
+ });
134
+ }
135
+ }
136
+ }
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsaXZlcmllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy93ZWJob29rcy9kZWxpdmVyaWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsS0FBSyxFQUNMLElBQUksRUFDSixJQUFJLEVBQ0osTUFBTSxFQUNOLFVBQVUsRUFDVixVQUFVLEdBQ1gsTUFBTSxxQkFBcUIsQ0FBQztBQWlCN0IsTUFBTSxDQUFDLE9BQU8sT0FBTyxrQkFBbUIsU0FBUSxvQkFBb0I7SUFDbEUsTUFBTSxDQUFDLFdBQVcsR0FBRywrQkFBK0IsQ0FBQztJQUVyRCxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLGtEQUFrRDtRQUNsRCw2REFBNkQ7UUFDN0QsZ0VBQWdFO1FBQ2hFLHlEQUF5RDtLQUMxRCxDQUFDO0lBRUYsTUFBTSxDQUFDLElBQUksR0FBRztRQUNaLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ2QsV0FBVyxFQUFFLFlBQVk7WUFDekIsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDO0tBQ0gsQ0FBQztJQUVGLE1BQU0sQ0FBQyxLQUFLLEdBQUc7UUFDYixHQUFHLG9CQUFvQixDQUFDLFNBQVM7UUFDakMsS0FBSyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDbkIsSUFBSSxFQUFFLEdBQUc7WUFDVCxXQUFXLEVBQUUsOEJBQThCO1lBQzNDLE9BQU8sRUFBRSxFQUFFO1NBQ1osQ0FBQztRQUNGLGFBQWEsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQzNCLFdBQVcsRUFBRSw2QkFBNkI7WUFDMUMsT0FBTyxFQUFFLEtBQUs7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QUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxpQkFBaUIsVUFBVSxDQUFDLFFBQVEsQ0FBQyxXQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckgsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFyZ3MsIEZsYWdzIH0gZnJvbSBcIkBvY2xpZi9jb3JlXCI7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGVkQ29tbWFuZCB9IGZyb20gXCIuLi8uLi9saWIvYmFzZS1jb21tYW5kLmpzXCI7XG5pbXBvcnQgeyBhcGlDbGllbnQgfSBmcm9tIFwiLi4vLi4vbGliL2FwaS1jbGllbnQuanNcIjtcbmltcG9ydCB7XG4gIHRhYmxlLFxuICBqc29uLFxuICBpbmZvLFxuICBjb2xvcnMsXG4gIGZvcm1hdERhdGUsXG4gIGlzSnNvbk1vZGUsXG59IGZyb20gXCIuLi8uLi9saWIvb3V0cHV0LmpzXCI7XG5cbmludGVyZmFjZSBXZWJob29rRGVsaXZlcnkge1xuICBpZDogc3RyaW5nO1xuICBldmVudFR5cGU6IHN0cmluZztcbiAgYXR0ZW1wdE51bWJlcjogbnVtYmVyO1xuICBtYXhBdHRlbXB0czogbnVtYmVyO1xuICBzdGF0dXM6IFwicGVuZGluZ1wiIHwgXCJkZWxpdmVyZWRcIiB8IFwiZmFpbGVkXCIgfCBcImNhbmNlbGxlZFwiO1xuICByZXNwb25zZVN0YXR1c0NvZGU/OiBudW1iZXI7XG4gIHJlc3BvbnNlVGltZT86IG51bWJlcjtcbiAgZXJyb3JNZXNzYWdlPzogc3RyaW5nO1xuICBlcnJvckNvZGU/OiBzdHJpbmc7XG4gIG5leHRSZXRyeUF0Pzogc3RyaW5nO1xuICBjcmVhdGVkQXQ6IHN0cmluZztcbiAgZGVsaXZlcmVkQXQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdlYmhvb2tzRGVsaXZlcmllcyBleHRlbmRzIEF1dGhlbnRpY2F0ZWRDb21tYW5kIHtcbiAgc3RhdGljIGRlc2NyaXB0aW9uID0gXCJWaWV3IHdlYmhvb2sgZGVsaXZlcnkgaGlzdG9yeVwiO1xuXG4gIHN0YXRpYyBleGFtcGxlcyA9IFtcbiAgICBcIjwlPSBjb25maWcuYmluICU+IHdlYmhvb2tzIGRlbGl2ZXJpZXMgd2hrX2FiYzEyM1wiLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gd2ViaG9va3MgZGVsaXZlcmllcyB3aGtfYWJjMTIzIC0tbGltaXQgMjBcIixcbiAgICBcIjwlPSBjb25maWcuYmluICU+IHdlYmhvb2tzIGRlbGl2ZXJpZXMgd2hrX2FiYzEyMyAtLWZhaWxlZC1vbmx5XCIsXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiB3ZWJob29rcyBkZWxpdmVyaWVzIHdoa19hYmMxMjMgLS1qc29uXCIsXG4gIF07XG5cbiAgc3RhdGljIGFyZ3MgPSB7XG4gICAgaWQ6IEFyZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIldlYmhvb2sgSURcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pLFxuICB9O1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5BdXRoZW50aWNhdGVkQ29tbWFuZC5iYXNlRmxhZ3MsXG4gICAgbGltaXQ6IEZsYWdzLmludGVnZXIoe1xuICAgICAgY2hhcjogXCJsXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJOdW1iZXIgb2YgZGVsaXZlcmllcyB0byBzaG93XCIsXG4gICAgICBkZWZhdWx0OiAxMCxcbiAgICB9KSxcbiAgICBcImZhaWxlZC1vbmx5XCI6IEZsYWdzLmJvb2xlYW4oe1xuICAgICAgZGVzY3JpcHRpb246IFwiU2hvdyBvbmx5IGZhaWxlZCBkZWxpdmVyaWVzXCIsXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICB9KSxcbiAgfTtcblxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBhcmdzLCBmbGFncyB9ID0gYXdhaXQgdGhpcy5wYXJzZShXZWJob29rc0RlbGl2ZXJpZXMpO1xuXG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICBsaW1pdDogU3RyaW5nKGZsYWdzLmxpbWl0KSxcbiAgICAgIC4uLihmbGFnc1tcImZhaWxlZC1vbmx5XCJdICYmIHsgc3RhdHVzOiBcImZhaWxlZFwiIH0pLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZGVsaXZlcmllcyA9IGF3YWl0IGFwaUNsaWVudC5nZXQ8V2ViaG9va0RlbGl2ZXJ5W10+KFxuICAgICAgYC9hcGkvdjEvd2ViaG9va3MvJHthcmdzLmlkfS9kZWxpdmVyaWVzPyR7cGFyYW1zLnRvU3RyaW5nKCl9YFxuICAgICk7XG5cbiAgICBpZiAoaXNKc29uTW9kZSgpKSB7XG4gICAgICBqc29uKGRlbGl2ZXJpZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkZWxpdmVyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaW5mbyhmbGFnc1tcImZhaWxlZC1vbmx5XCJdID8gXCJObyBmYWlsZWQgZGVsaXZlcmllcyBmb3VuZFwiIDogXCJObyBkZWxpdmVyaWVzIGZvdW5kXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coY29sb3JzLmRpbShgU2hvd2luZyAke2RlbGl2ZXJpZXMubGVuZ3RofSBkZWxpdmVyaWVzIGZvciB3ZWJob29rICR7YXJncy5pZH1gKSk7XG4gICAgY29uc29sZS5sb2coKTtcblxuICAgIC8vIEFkZCBjb21wdXRlZCBmaWVsZHMgZm9yIGJldHRlciBkaXNwbGF5XG4gICAgY29uc3QgZGVsaXZlcmllc1dpdGhDb21wdXRlZCA9IGRlbGl2ZXJpZXMubWFwKGQgPT4gKHtcbiAgICAgIC4uLmQsXG4gICAgICBhdHRlbXB0RGlzcGxheTogYCR7ZC5hdHRlbXB0TnVtYmVyfS8ke2QubWF4QXR0ZW1wdHN9YCxcbiAgICB9KSk7XG5cbiAgICB0YWJsZShkZWxpdmVyaWVzV2l0aENvbXB1dGVkLCBbXG4gICAgICB7XG4gICAgICAgIGhlYWRlcjogXCJEZWxpdmVyeSBJRFwiLFxuICAgICAgICBrZXk6IFwiaWRcIixcbiAgICAgICAgd2lkdGg6IDE4LFxuICAgICAgICBmb3JtYXR0ZXI6ICh2KSA9PiBjb2xvcnMuZGltKFN0cmluZyh2KS5zbGljZSgwLCAxNSkgKyBcIi4uLlwiKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGhlYWRlcjogXCJFdmVudFwiLFxuICAgICAgICBrZXk6IFwiZXZlbnRUeXBlXCIsXG4gICAgICAgIHdpZHRoOiAxNSxcbiAgICAgICAgZm9ybWF0dGVyOiAodikgPT4gU3RyaW5nKHYpLnJlcGxhY2UoXCJtZXNzYWdlLlwiLCBcIlwiKSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGhlYWRlcjogXCJTdGF0dXNcIixcbiAgICAgICAga2V5OiBcInN0YXR1c1wiLFxuICAgICAgICB3aWR0aDogMTIsXG4gICAgICAgIGZvcm1hdHRlcjogKHYpID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKHYpIHtcbiAgICAgICAgICAgIGNhc2UgXCJkZWxpdmVyZWRcIjpcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbG9ycy5zdWNjZXNzKFwiZGVsaXZlcmVkXCIpO1xuICAgICAgICAgICAgY2FzZSBcImZhaWxlZFwiOlxuICAgICAgICAgICAgICByZXR1cm4gY29sb3JzLmVycm9yKFwiZmFpbGVkXCIpO1xuICAgICAgICAgICAgY2FzZSBcInBlbmRpbmdcIjpcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbG9ycy53YXJuaW5nKFwicGVuZGluZ1wiKTtcbiAgICAgICAgICAgIGNhc2UgXCJjYW5jZWxsZWRcIjpcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbG9ycy5kaW0oXCJjYW5jZWxsZWRcIik7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHYpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGhlYWRlcjogXCJBdHRlbXB0XCIsXG4gICAgICAgIGtleTogXCJhdHRlbXB0RGlzcGxheVwiLFxuICAgICAgICB3aWR0aDogMTAsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBoZWFkZXI6IFwiU3RhdHVzIENvZGVcIixcbiAgICAgICAga2V5OiBcInJlc3BvbnNlU3RhdHVzQ29kZVwiLFxuICAgICAgICB3aWR0aDogMTIsXG4gICAgICAgIGZvcm1hdHRlcjogKHYpID0+IHtcbiAgICAgICAgICBpZiAoIXYpIHJldHVybiBjb2xvcnMuZGltKFwiLVwiKTtcbiAgICAgICAgICBjb25zdCBjb2RlID0gTnVtYmVyKHYpO1xuICAgICAgICAgIHJldHVybiBjb2RlID49IDIwMCAmJiBjb2RlIDwgMzAwIFxuICAgICAgICAgICAgPyBjb2xvcnMuc3VjY2VzcyhTdHJpbmcoY29kZSkpXG4gICAgICAgICAgICA6IGNvbG9ycy5lcnJvcihTdHJpbmcoY29kZSkpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyOiBcIlJlc3BvbnNlIFRpbWVcIixcbiAgICAgICAga2V5OiBcInJlc3BvbnNlVGltZVwiLFxuICAgICAgICB3aWR0aDogMTQsXG4gICAgICAgIGZvcm1hdHRlcjogKHYpID0+IHYgPyBgJHt2fW1zYCA6IGNvbG9ycy5kaW0oXCItXCIpLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyOiBcIkNyZWF0ZWRcIixcbiAgICAgICAga2V5OiBcImNyZWF0ZWRBdFwiLFxuICAgICAgICB3aWR0aDogMTYsXG4gICAgICAgIGZvcm1hdHRlcjogKHYpID0+IGZvcm1hdERhdGUoU3RyaW5nKHYpKSxcbiAgICAgIH0sXG4gICAgXSk7XG5cbiAgICAvLyBTaG93IGZhaWxlZCBkZWxpdmVyeSBkZXRhaWxzXG4gICAgY29uc3QgZmFpbGVkID0gZGVsaXZlcmllcy5maWx0ZXIoZCA9PiBkLnN0YXR1cyA9PT0gXCJmYWlsZWRcIiAmJiBkLmVycm9yTWVzc2FnZSk7XG4gICAgaWYgKGZhaWxlZC5sZW5ndGggPiAwICYmICFmbGFnc1tcImZhaWxlZC1vbmx5XCJdKSB7XG4gICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgY29uc29sZS5sb2coY29sb3JzLmVycm9yKFwiRmFpbGVkIGRlbGl2ZXJpZXM6XCIpKTtcbiAgICAgIGZhaWxlZC5mb3JFYWNoKGRlbGl2ZXJ5ID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coY29sb3JzLmRpbShgICAke2RlbGl2ZXJ5LmlkLnNsaWNlKDAsIDE1KX0uLi46YCksIGRlbGl2ZXJ5LmVycm9yTWVzc2FnZSB8fCBcIlVua25vd24gZXJyb3JcIik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTaG93IHBlbmRpbmcgcmV0cmllc1xuICAgIGNvbnN0IHBlbmRpbmcgPSBkZWxpdmVyaWVzLmZpbHRlcihkID0+IGQuc3RhdHVzID09PSBcInBlbmRpbmdcIiAmJiBkLm5leHRSZXRyeUF0KTtcbiAgICBpZiAocGVuZGluZy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgY29uc29sZS5sb2coY29sb3JzLndhcm5pbmcoXCJQZW5kaW5nIHJldHJpZXM6XCIpKTtcbiAgICAgIHBlbmRpbmcuZm9yRWFjaChkZWxpdmVyeSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oYCAgJHtkZWxpdmVyeS5pZC5zbGljZSgwLCAxNSl9Li4uOmApLCBgTmV4dCByZXRyeSBhdCAke2Zvcm1hdERhdGUoZGVsaXZlcnkubmV4dFJldHJ5QXQhKX1gKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufSJdfQ==
@@ -0,0 +1,13 @@
1
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
2
+ export default class WebhooksGet extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ id: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
10
+ quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
11
+ };
12
+ run(): Promise<void>;
13
+ }
@@ -0,0 +1,57 @@
1
+ import { Args } from "@oclif/core";
2
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
3
+ import { apiClient } from "../../lib/api-client.js";
4
+ import { keyValue, json, header, formatDate, colors, isJsonMode, } from "../../lib/output.js";
5
+ export default class WebhooksGet extends AuthenticatedCommand {
6
+ static description = "Get webhook details";
7
+ static examples = [
8
+ "<%= config.bin %> webhooks get whk_abc123",
9
+ "<%= config.bin %> webhooks get whk_abc123 --json",
10
+ ];
11
+ static args = {
12
+ id: Args.string({
13
+ description: "Webhook ID",
14
+ required: true,
15
+ }),
16
+ };
17
+ static flags = {
18
+ ...AuthenticatedCommand.baseFlags,
19
+ };
20
+ async run() {
21
+ const { args } = await this.parse(WebhooksGet);
22
+ const webhook = await apiClient.get(`/api/v1/webhooks/${args.id}`);
23
+ if (isJsonMode()) {
24
+ json(webhook);
25
+ return;
26
+ }
27
+ header(`Webhook ${webhook.id}`);
28
+ console.log();
29
+ keyValue({
30
+ "ID": webhook.id,
31
+ "URL": webhook.url,
32
+ "Events": webhook.events.join(", "),
33
+ ...(webhook.description ? { "Description": webhook.description } : {}),
34
+ "Status": webhook.isActive ? colors.success("active") : colors.warning("inactive"),
35
+ "Circuit State": webhook.circuitState === "closed"
36
+ ? colors.success("closed")
37
+ : webhook.circuitState === "open"
38
+ ? colors.error("open")
39
+ : colors.warning("half_open"),
40
+ "Failure Count": String(webhook.failureCount),
41
+ "Secret Version": String(webhook.secretVersion),
42
+ "Created": formatDate(webhook.createdAt),
43
+ "Updated": formatDate(webhook.updatedAt),
44
+ });
45
+ if (webhook.failureCount > 0) {
46
+ console.log();
47
+ console.log(colors.warning(`⚠ This webhook has failed ${webhook.failureCount} times recently.`));
48
+ console.log(colors.dim("Check delivery history with:"), colors.code(`sendly webhooks deliveries ${webhook.id}`));
49
+ }
50
+ if (webhook.circuitState === "open") {
51
+ console.log();
52
+ console.log(colors.error("⚠ Circuit breaker is OPEN - webhook deliveries are paused."));
53
+ console.log(colors.dim("Test your endpoint and the circuit will auto-recover."));
54
+ }
55
+ }
56
+ }
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3dlYmhvb2tzL2dldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsUUFBUSxFQUNSLElBQUksRUFDSixNQUFNLEVBQ04sVUFBVSxFQUNWLE1BQU0sRUFFTixVQUFVLEdBQ1gsTUFBTSxxQkFBcUIsQ0FBQztBQWU3QixNQUFNLENBQUMsT0FBTyxPQUFPLFdBQVksU0FBUSxvQkFBb0I7SUFDM0QsTUFBTSxDQUFDLFdBQVcsR0FBRyxxQkFBcUIsQ0FBQztJQUUzQyxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLDJDQUEyQztRQUMzQyxrREFBa0Q7S0FDbkQsQ0FBQztJQUVGLE1BQU0sQ0FBQyxJQUFJLEdBQUc7UUFDWixFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNkLFdBQVcsRUFBRSxZQUFZO1lBQ3pCLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQztLQUNILENBQUM7SUFFRixNQUFNLENBQUMsS0FBSyxHQUFHO1FBQ2IsR0FBRyxvQkFBb0IsQ0FBQyxTQUFTO0tBQ2xDLENBQUM7SUFFRixLQUFLLENBQUMsR0FBRztRQUNQLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFL0MsTUFBTSxPQUFPLEdBQUcsTUFBTSxTQUFTLENBQUMsR0FBRyxDQUFVLG9CQUFvQixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUU1RSxJQUFJLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2QsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLENBQUMsV0FBVyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNoQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFZCxRQUFRLENBQUM7WUFDUCxJQUFJLEVBQUUsT0FBTyxDQUFDLEVBQUU7WUFDaEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxHQUFHO1lBQ2xCLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDbkMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3RFLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztZQUNsRixlQUFlLEVBQUUsT0FBTyxDQUFDLFlBQVksS0FBSyxRQUFRO2dCQUNoRCxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7Z0JBQzFCLENBQUMsQ0FBQyxPQUFPLENBQUMsWUFBWSxLQUFLLE1BQU07b0JBQy9CLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztvQkFDdEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1lBQ2pDLGVBQWUsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztZQUM3QyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztZQUMvQyxTQUFTLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7WUFDeEMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1NBQ3pDLENBQUMsQ0FBQztRQUVILElBQUksT0FBTyxDQUFDLFlBQVksR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM3QixPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsNkJBQTZCLE9BQU8sQ0FBQyxZQUFZLGtCQUFrQixDQUFDLENBQUMsQ0FBQztZQUNqRyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLDhCQUE4QixPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25ILENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxZQUFZLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDcEMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDREQUE0RCxDQUFDLENBQUMsQ0FBQztZQUN4RixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsdURBQXVELENBQUMsQ0FBQyxDQUFDO1FBQ25GLENBQUM7SUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXJncyB9IGZyb20gXCJAb2NsaWYvY29yZVwiO1xuaW1wb3J0IHsgQXV0aGVudGljYXRlZENvbW1hbmQgfSBmcm9tIFwiLi4vLi4vbGliL2Jhc2UtY29tbWFuZC5qc1wiO1xuaW1wb3J0IHsgYXBpQ2xpZW50IH0gZnJvbSBcIi4uLy4uL2xpYi9hcGktY2xpZW50LmpzXCI7XG5pbXBvcnQge1xuICBrZXlWYWx1ZSxcbiAganNvbixcbiAgaGVhZGVyLFxuICBmb3JtYXREYXRlLFxuICBjb2xvcnMsXG4gIGRpdmlkZXIsXG4gIGlzSnNvbk1vZGUsXG59IGZyb20gXCIuLi8uLi9saWIvb3V0cHV0LmpzXCI7XG5cbmludGVyZmFjZSBXZWJob29rIHtcbiAgaWQ6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIGV2ZW50czogc3RyaW5nW107XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBpc0FjdGl2ZTogYm9vbGVhbjtcbiAgZmFpbHVyZUNvdW50OiBudW1iZXI7XG4gIGNpcmN1aXRTdGF0ZTogXCJjbG9zZWRcIiB8IFwib3BlblwiIHwgXCJoYWxmX29wZW5cIjtcbiAgc2VjcmV0VmVyc2lvbjogbnVtYmVyO1xuICBjcmVhdGVkQXQ6IHN0cmluZztcbiAgdXBkYXRlZEF0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdlYmhvb2tzR2V0IGV4dGVuZHMgQXV0aGVudGljYXRlZENvbW1hbmQge1xuICBzdGF0aWMgZGVzY3JpcHRpb24gPSBcIkdldCB3ZWJob29rIGRldGFpbHNcIjtcblxuICBzdGF0aWMgZXhhbXBsZXMgPSBbXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiB3ZWJob29rcyBnZXQgd2hrX2FiYzEyM1wiLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gd2ViaG9va3MgZ2V0IHdoa19hYmMxMjMgLS1qc29uXCIsXG4gIF07XG5cbiAgc3RhdGljIGFyZ3MgPSB7XG4gICAgaWQ6IEFyZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIldlYmhvb2sgSURcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pLFxuICB9O1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5BdXRoZW50aWNhdGVkQ29tbWFuZC5iYXNlRmxhZ3MsXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgYXJncyB9ID0gYXdhaXQgdGhpcy5wYXJzZShXZWJob29rc0dldCk7XG5cbiAgICBjb25zdCB3ZWJob29rID0gYXdhaXQgYXBpQ2xpZW50LmdldDxXZWJob29rPihgL2FwaS92MS93ZWJob29rcy8ke2FyZ3MuaWR9YCk7XG5cbiAgICBpZiAoaXNKc29uTW9kZSgpKSB7XG4gICAgICBqc29uKHdlYmhvb2spO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGhlYWRlcihgV2ViaG9vayAke3dlYmhvb2suaWR9YCk7XG4gICAgY29uc29sZS5sb2coKTtcblxuICAgIGtleVZhbHVlKHtcbiAgICAgIFwiSURcIjogd2ViaG9vay5pZCxcbiAgICAgIFwiVVJMXCI6IHdlYmhvb2sudXJsLFxuICAgICAgXCJFdmVudHNcIjogd2ViaG9vay5ldmVudHMuam9pbihcIiwgXCIpLFxuICAgICAgLi4uKHdlYmhvb2suZGVzY3JpcHRpb24gPyB7IFwiRGVzY3JpcHRpb25cIjogd2ViaG9vay5kZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgXCJTdGF0dXNcIjogd2ViaG9vay5pc0FjdGl2ZSA/IGNvbG9ycy5zdWNjZXNzKFwiYWN0aXZlXCIpIDogY29sb3JzLndhcm5pbmcoXCJpbmFjdGl2ZVwiKSxcbiAgICAgIFwiQ2lyY3VpdCBTdGF0ZVwiOiB3ZWJob29rLmNpcmN1aXRTdGF0ZSA9PT0gXCJjbG9zZWRcIiBcbiAgICAgICAgPyBjb2xvcnMuc3VjY2VzcyhcImNsb3NlZFwiKVxuICAgICAgICA6IHdlYmhvb2suY2lyY3VpdFN0YXRlID09PSBcIm9wZW5cIiBcbiAgICAgICAgICA/IGNvbG9ycy5lcnJvcihcIm9wZW5cIilcbiAgICAgICAgICA6IGNvbG9ycy53YXJuaW5nKFwiaGFsZl9vcGVuXCIpLFxuICAgICAgXCJGYWlsdXJlIENvdW50XCI6IFN0cmluZyh3ZWJob29rLmZhaWx1cmVDb3VudCksXG4gICAgICBcIlNlY3JldCBWZXJzaW9uXCI6IFN0cmluZyh3ZWJob29rLnNlY3JldFZlcnNpb24pLFxuICAgICAgXCJDcmVhdGVkXCI6IGZvcm1hdERhdGUod2ViaG9vay5jcmVhdGVkQXQpLFxuICAgICAgXCJVcGRhdGVkXCI6IGZvcm1hdERhdGUod2ViaG9vay51cGRhdGVkQXQpLFxuICAgIH0pO1xuXG4gICAgaWYgKHdlYmhvb2suZmFpbHVyZUNvdW50ID4gMCkge1xuICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy53YXJuaW5nKGDimqAgVGhpcyB3ZWJob29rIGhhcyBmYWlsZWQgJHt3ZWJob29rLmZhaWx1cmVDb3VudH0gdGltZXMgcmVjZW50bHkuYCkpO1xuICAgICAgY29uc29sZS5sb2coY29sb3JzLmRpbShcIkNoZWNrIGRlbGl2ZXJ5IGhpc3Rvcnkgd2l0aDpcIiksIGNvbG9ycy5jb2RlKGBzZW5kbHkgd2ViaG9va3MgZGVsaXZlcmllcyAke3dlYmhvb2suaWR9YCkpO1xuICAgIH1cblxuICAgIGlmICh3ZWJob29rLmNpcmN1aXRTdGF0ZSA9PT0gXCJvcGVuXCIpIHtcbiAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICBjb25zb2xlLmxvZyhjb2xvcnMuZXJyb3IoXCLimqAgQ2lyY3VpdCBicmVha2VyIGlzIE9QRU4gLSB3ZWJob29rIGRlbGl2ZXJpZXMgYXJlIHBhdXNlZC5cIikpO1xuICAgICAgY29uc29sZS5sb2coY29sb3JzLmRpbShcIlRlc3QgeW91ciBlbmRwb2ludCBhbmQgdGhlIGNpcmN1aXQgd2lsbCBhdXRvLXJlY292ZXIuXCIpKTtcbiAgICB9XG4gIH1cbn0iXX0=
@@ -11,7 +11,7 @@ export default class WebhooksList extends AuthenticatedCommand {
11
11
  ...AuthenticatedCommand.baseFlags,
12
12
  };
13
13
  async run() {
14
- const webhooks = await apiClient.get("/api/webhooks");
14
+ const webhooks = await apiClient.get("/api/v1/webhooks");
15
15
  if (isJsonMode()) {
16
16
  json(webhooks);
17
17
  return;
@@ -77,4 +77,4 @@ export default class WebhooksList extends AuthenticatedCommand {
77
77
  ]);
78
78
  }
79
79
  }
80
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy93ZWJob29rcy9saXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsS0FBSyxFQUNMLElBQUksRUFDSixJQUFJLEVBRUosTUFBTSxFQUNOLFVBQVUsR0FDWCxNQUFNLHFCQUFxQixDQUFDO0FBYTdCLE1BQU0sQ0FBQyxPQUFPLE9BQU8sWUFBYSxTQUFRLG9CQUFvQjtJQUM1RCxNQUFNLENBQUMsV0FBVyxHQUFHLDBCQUEwQixDQUFDO0lBRWhELE1BQU0sQ0FBQyxRQUFRLEdBQUc7UUFDaEIsaUNBQWlDO1FBQ2pDLHdDQUF3QztLQUN6QyxDQUFDO0lBRUYsTUFBTSxDQUFDLEtBQUssR0FBRztRQUNiLEdBQUcsb0JBQW9CLENBQUMsU0FBUztLQUNsQyxDQUFDO0lBRUYsS0FBSyxDQUFDLEdBQUc7UUFDUCxNQUFNLFFBQVEsR0FBRyxNQUFNLFNBQVMsQ0FBQyxHQUFHLENBQVksZUFBZSxDQUFDLENBQUM7UUFFakUsSUFBSSxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNmLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1lBQy9CLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUUsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMvRSxPQUFPO1FBQ1QsQ0FBQztRQUVELE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUVkLEtBQUssQ0FBQyxRQUFRLEVBQUU7WUFDZDtnQkFDRSxNQUFNLEVBQUUsSUFBSTtnQkFDWixHQUFHLEVBQUUsSUFBSTtnQkFDVCxLQUFLLEVBQUUsRUFBRTtnQkFDVCxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDO2FBQzdEO1lBQ0Q7Z0JBQ0UsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsR0FBRyxFQUFFLEtBQUs7Z0JBQ1YsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQ2YsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN0QixPQUFPLEdBQUcsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDMUQsQ0FBQzthQUNGO1lBQ0Q7Z0JBQ0UsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLEdBQUcsRUFBRSxRQUFRO2dCQUNiLEtBQUssRUFBRSxFQUFFO2dCQUNULFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO29CQUNmLE1BQU0sTUFBTSxHQUFHLENBQWEsQ0FBQztvQkFDN0IsT0FBTyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7d0JBQ3RCLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLFNBQVM7d0JBQzNCLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ2xELENBQUM7YUFDRjtZQUNEO2dCQUNFLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixHQUFHLEVBQUUsVUFBVTtnQkFDZixLQUFLLEVBQUUsRUFBRTtnQkFDVCxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNmLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUM7YUFDMUQ7WUFDRDtnQkFDRSxNQUFNLEVBQUUsU0FBUztnQkFDakIsR0FBRyxFQUFFLGNBQWM7Z0JBQ25CLEtBQUssRUFBRSxFQUFFO2dCQUNULFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO29CQUNmLFFBQVEsQ0FBQyxFQUFFLENBQUM7d0JBQ1YsS0FBSyxRQUFROzRCQUNYLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDbEMsS0FBSyxNQUFNOzRCQUNULE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDOUIsS0FBSyxXQUFXOzRCQUNkLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQzt3QkFDckM7NEJBQ0UsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3JCLENBQUM7Z0JBQ0gsQ0FBQzthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF1dGhlbnRpY2F0ZWRDb21tYW5kIH0gZnJvbSBcIi4uLy4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGFwaUNsaWVudCB9IGZyb20gXCIuLi8uLi9saWIvYXBpLWNsaWVudC5qc1wiO1xuaW1wb3J0IHtcbiAgdGFibGUsXG4gIGpzb24sXG4gIGluZm8sXG4gIGZvcm1hdFN0YXR1cyxcbiAgY29sb3JzLFxuICBpc0pzb25Nb2RlLFxufSBmcm9tIFwiLi4vLi4vbGliL291dHB1dC5qc1wiO1xuXG5pbnRlcmZhY2UgV2ViaG9vayB7XG4gIGlkOiBzdHJpbmc7XG4gIHVybDogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgZXZlbnRzOiBzdHJpbmdbXTtcbiAgaXNBY3RpdmU6IGJvb2xlYW47XG4gIGZhaWx1cmVDb3VudDogbnVtYmVyO1xuICBjaXJjdWl0U3RhdGU6IFwiY2xvc2VkXCIgfCBcIm9wZW5cIiB8IFwiaGFsZl9vcGVuXCI7XG4gIGNyZWF0ZWRBdDogc3RyaW5nO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXZWJob29rc0xpc3QgZXh0ZW5kcyBBdXRoZW50aWNhdGVkQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9IFwiTGlzdCBjb25maWd1cmVkIHdlYmhvb2tzXCI7XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gd2ViaG9va3MgbGlzdFwiLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gd2ViaG9va3MgbGlzdCAtLWpzb25cIixcbiAgXTtcblxuICBzdGF0aWMgZmxhZ3MgPSB7XG4gICAgLi4uQXV0aGVudGljYXRlZENvbW1hbmQuYmFzZUZsYWdzLFxuICB9O1xuXG4gIGFzeW5jIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB3ZWJob29rcyA9IGF3YWl0IGFwaUNsaWVudC5nZXQ8V2ViaG9va1tdPihcIi9hcGkvd2ViaG9va3NcIik7XG5cbiAgICBpZiAoaXNKc29uTW9kZSgpKSB7XG4gICAgICBqc29uKHdlYmhvb2tzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAod2ViaG9va3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBpbmZvKFwiTm8gd2ViaG9va3MgY29uZmlndXJlZFwiKTtcbiAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICBjb25zb2xlLmxvZyhgICBDcmVhdGUgb25lIHdpdGggJHtjb2xvcnMuY29kZShcInNlbmRseSB3ZWJob29rcyBjcmVhdGVcIil9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgICBPciB0ZXN0IGxvY2FsbHkgd2l0aCAke2NvbG9ycy5jb2RlKFwic2VuZGx5IHdlYmhvb2tzIGxpc3RlblwiKX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygpO1xuXG4gICAgdGFibGUod2ViaG9va3MsIFtcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyOiBcIklEXCIsXG4gICAgICAgIGtleTogXCJpZFwiLFxuICAgICAgICB3aWR0aDogMTgsXG4gICAgICAgIGZvcm1hdHRlcjogKHYpID0+IGNvbG9ycy5kaW0oU3RyaW5nKHYpLnNsaWNlKDAsIDE1KSArIFwiLi4uXCIpLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyOiBcIlVSTFwiLFxuICAgICAgICBrZXk6IFwidXJsXCIsXG4gICAgICAgIHdpZHRoOiAzNSxcbiAgICAgICAgZm9ybWF0dGVyOiAodikgPT4ge1xuICAgICAgICAgIGNvbnN0IHVybCA9IFN0cmluZyh2KTtcbiAgICAgICAgICByZXR1cm4gdXJsLmxlbmd0aCA+IDMyID8gdXJsLnNsaWNlKDAsIDMyKSArIFwiLi4uXCIgOiB1cmw7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBoZWFkZXI6IFwiRXZlbnRzXCIsXG4gICAgICAgIGtleTogXCJldmVudHNcIixcbiAgICAgICAgd2lkdGg6IDE1LFxuICAgICAgICBmb3JtYXR0ZXI6ICh2KSA9PiB7XG4gICAgICAgICAgY29uc3QgZXZlbnRzID0gdiBhcyBzdHJpbmdbXTtcbiAgICAgICAgICByZXR1cm4gZXZlbnRzLmxlbmd0aCA+IDJcbiAgICAgICAgICAgID8gYCR7ZXZlbnRzLmxlbmd0aH0gZXZlbnRzYFxuICAgICAgICAgICAgOiBldmVudHMuam9pbihcIiwgXCIpLnJlcGxhY2UoL21lc3NhZ2VcXC4vZywgXCJcIik7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBoZWFkZXI6IFwiU3RhdHVzXCIsXG4gICAgICAgIGtleTogXCJpc0FjdGl2ZVwiLFxuICAgICAgICB3aWR0aDogMTAsXG4gICAgICAgIGZvcm1hdHRlcjogKHYpID0+XG4gICAgICAgICAgdiA/IGNvbG9ycy5zdWNjZXNzKFwiYWN0aXZlXCIpIDogY29sb3JzLmVycm9yKFwiZGlzYWJsZWRcIiksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBoZWFkZXI6IFwiQ2lyY3VpdFwiLFxuICAgICAgICBrZXk6IFwiY2lyY3VpdFN0YXRlXCIsXG4gICAgICAgIHdpZHRoOiAxMCxcbiAgICAgICAgZm9ybWF0dGVyOiAodikgPT4ge1xuICAgICAgICAgIHN3aXRjaCAodikge1xuICAgICAgICAgICAgY2FzZSBcImNsb3NlZFwiOlxuICAgICAgICAgICAgICByZXR1cm4gY29sb3JzLnN1Y2Nlc3MoXCJjbG9zZWRcIik7XG4gICAgICAgICAgICBjYXNlIFwib3BlblwiOlxuICAgICAgICAgICAgICByZXR1cm4gY29sb3JzLmVycm9yKFwib3BlblwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJoYWxmX29wZW5cIjpcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbG9ycy53YXJuaW5nKFwiaGFsZl9vcGVuXCIpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0pO1xuICB9XG59XG4iXX0=
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy93ZWJob29rcy9saXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsS0FBSyxFQUNMLElBQUksRUFDSixJQUFJLEVBRUosTUFBTSxFQUNOLFVBQVUsR0FDWCxNQUFNLHFCQUFxQixDQUFDO0FBYTdCLE1BQU0sQ0FBQyxPQUFPLE9BQU8sWUFBYSxTQUFRLG9CQUFvQjtJQUM1RCxNQUFNLENBQUMsV0FBVyxHQUFHLDBCQUEwQixDQUFDO0lBRWhELE1BQU0sQ0FBQyxRQUFRLEdBQUc7UUFDaEIsaUNBQWlDO1FBQ2pDLHdDQUF3QztLQUN6QyxDQUFDO0lBRUYsTUFBTSxDQUFDLEtBQUssR0FBRztRQUNiLEdBQUcsb0JBQW9CLENBQUMsU0FBUztLQUNsQyxDQUFDO0lBRUYsS0FBSyxDQUFDLEdBQUc7UUFDUCxNQUFNLFFBQVEsR0FBRyxNQUFNLFNBQVMsQ0FBQyxHQUFHLENBQVksa0JBQWtCLENBQUMsQ0FBQztRQUVwRSxJQUFJLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2YsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7WUFDL0IsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUMxRSxPQUFPLENBQUMsR0FBRyxDQUNULDBCQUEwQixNQUFNLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEVBQUUsQ0FDbEUsQ0FBQztZQUNGLE9BQU87UUFDVCxDQUFDO1FBRUQsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRWQsS0FBSyxDQUFDLFFBQVEsRUFBRTtZQUNkO2dCQUNFLE1BQU0sRUFBRSxJQUFJO2dCQUNaLEdBQUcsRUFBRSxJQUFJO2dCQUNULEtBQUssRUFBRSxFQUFFO2dCQUNULFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7YUFDN0Q7WUFDRDtnQkFDRSxNQUFNLEVBQUUsS0FBSztnQkFDYixHQUFHLEVBQUUsS0FBSztnQkFDVixLQUFLLEVBQUUsRUFBRTtnQkFDVCxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtvQkFDZixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3RCLE9BQU8sR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUMxRCxDQUFDO2FBQ0Y7WUFDRDtnQkFDRSxNQUFNLEVBQUUsUUFBUTtnQkFDaEIsR0FBRyxFQUFFLFFBQVE7Z0JBQ2IsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQ2YsTUFBTSxNQUFNLEdBQUcsQ0FBYSxDQUFDO29CQUM3QixPQUFPLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQzt3QkFDdEIsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sU0FBUzt3QkFDM0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDbEQsQ0FBQzthQUNGO1lBQ0Q7Z0JBQ0UsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLEdBQUcsRUFBRSxVQUFVO2dCQUNmLEtBQUssRUFBRSxFQUFFO2dCQUNULFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ2YsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQzthQUMxRDtZQUNEO2dCQUNFLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixHQUFHLEVBQUUsY0FBYztnQkFDbkIsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQ2YsUUFBUSxDQUFDLEVBQUUsQ0FBQzt3QkFDVixLQUFLLFFBQVE7NEJBQ1gsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUNsQyxLQUFLLE1BQU07NEJBQ1QsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUM5QixLQUFLLFdBQVc7NEJBQ2QsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO3dCQUNyQzs0QkFDRSxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDckIsQ0FBQztnQkFDSCxDQUFDO2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXV0aGVudGljYXRlZENvbW1hbmQgfSBmcm9tIFwiLi4vLi4vbGliL2Jhc2UtY29tbWFuZC5qc1wiO1xuaW1wb3J0IHsgYXBpQ2xpZW50IH0gZnJvbSBcIi4uLy4uL2xpYi9hcGktY2xpZW50LmpzXCI7XG5pbXBvcnQge1xuICB0YWJsZSxcbiAganNvbixcbiAgaW5mbyxcbiAgZm9ybWF0U3RhdHVzLFxuICBjb2xvcnMsXG4gIGlzSnNvbk1vZGUsXG59IGZyb20gXCIuLi8uLi9saWIvb3V0cHV0LmpzXCI7XG5cbmludGVyZmFjZSBXZWJob29rIHtcbiAgaWQ6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBldmVudHM6IHN0cmluZ1tdO1xuICBpc0FjdGl2ZTogYm9vbGVhbjtcbiAgZmFpbHVyZUNvdW50OiBudW1iZXI7XG4gIGNpcmN1aXRTdGF0ZTogXCJjbG9zZWRcIiB8IFwib3BlblwiIHwgXCJoYWxmX29wZW5cIjtcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdlYmhvb2tzTGlzdCBleHRlbmRzIEF1dGhlbnRpY2F0ZWRDb21tYW5kIHtcbiAgc3RhdGljIGRlc2NyaXB0aW9uID0gXCJMaXN0IGNvbmZpZ3VyZWQgd2ViaG9va3NcIjtcblxuICBzdGF0aWMgZXhhbXBsZXMgPSBbXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiB3ZWJob29rcyBsaXN0XCIsXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiB3ZWJob29rcyBsaXN0IC0tanNvblwiLFxuICBdO1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5BdXRoZW50aWNhdGVkQ29tbWFuZC5iYXNlRmxhZ3MsXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHdlYmhvb2tzID0gYXdhaXQgYXBpQ2xpZW50LmdldDxXZWJob29rW10+KFwiL2FwaS92MS93ZWJob29rc1wiKTtcblxuICAgIGlmIChpc0pzb25Nb2RlKCkpIHtcbiAgICAgIGpzb24od2ViaG9va3MpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh3ZWJob29rcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGluZm8oXCJObyB3ZWJob29rcyBjb25maWd1cmVkXCIpO1xuICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgIGNvbnNvbGUubG9nKGAgIENyZWF0ZSBvbmUgd2l0aCAke2NvbG9ycy5jb2RlKFwic2VuZGx5IHdlYmhvb2tzIGNyZWF0ZVwiKX1gKTtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgICBPciB0ZXN0IGxvY2FsbHkgd2l0aCAke2NvbG9ycy5jb2RlKFwic2VuZGx5IHdlYmhvb2tzIGxpc3RlblwiKX1gLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygpO1xuXG4gICAgdGFibGUod2ViaG9va3MsIFtcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyOiBcIklEXCIsXG4gICAgICAgIGtleTogXCJpZFwiLFxuICAgICAgICB3aWR0aDogMTgsXG4gICAgICAgIGZvcm1hdHRlcjogKHYpID0+IGNvbG9ycy5kaW0oU3RyaW5nKHYpLnNsaWNlKDAsIDE1KSArIFwiLi4uXCIpLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyOiBcIlVSTFwiLFxuICAgICAgICBrZXk6IFwidXJsXCIsXG4gICAgICAgIHdpZHRoOiAzNSxcbiAgICAgICAgZm9ybWF0dGVyOiAodikgPT4ge1xuICAgICAgICAgIGNvbnN0IHVybCA9IFN0cmluZyh2KTtcbiAgICAgICAgICByZXR1cm4gdXJsLmxlbmd0aCA+IDMyID8gdXJsLnNsaWNlKDAsIDMyKSArIFwiLi4uXCIgOiB1cmw7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBoZWFkZXI6IFwiRXZlbnRzXCIsXG4gICAgICAgIGtleTogXCJldmVudHNcIixcbiAgICAgICAgd2lkdGg6IDE1LFxuICAgICAgICBmb3JtYXR0ZXI6ICh2KSA9PiB7XG4gICAgICAgICAgY29uc3QgZXZlbnRzID0gdiBhcyBzdHJpbmdbXTtcbiAgICAgICAgICByZXR1cm4gZXZlbnRzLmxlbmd0aCA+IDJcbiAgICAgICAgICAgID8gYCR7ZXZlbnRzLmxlbmd0aH0gZXZlbnRzYFxuICAgICAgICAgICAgOiBldmVudHMuam9pbihcIiwgXCIpLnJlcGxhY2UoL21lc3NhZ2VcXC4vZywgXCJcIik7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBoZWFkZXI6IFwiU3RhdHVzXCIsXG4gICAgICAgIGtleTogXCJpc0FjdGl2ZVwiLFxuICAgICAgICB3aWR0aDogMTAsXG4gICAgICAgIGZvcm1hdHRlcjogKHYpID0+XG4gICAgICAgICAgdiA/IGNvbG9ycy5zdWNjZXNzKFwiYWN0aXZlXCIpIDogY29sb3JzLmVycm9yKFwiZGlzYWJsZWRcIiksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBoZWFkZXI6IFwiQ2lyY3VpdFwiLFxuICAgICAgICBrZXk6IFwiY2lyY3VpdFN0YXRlXCIsXG4gICAgICAgIHdpZHRoOiAxMCxcbiAgICAgICAgZm9ybWF0dGVyOiAodikgPT4ge1xuICAgICAgICAgIHN3aXRjaCAodikge1xuICAgICAgICAgICAgY2FzZSBcImNsb3NlZFwiOlxuICAgICAgICAgICAgICByZXR1cm4gY29sb3JzLnN1Y2Nlc3MoXCJjbG9zZWRcIik7XG4gICAgICAgICAgICBjYXNlIFwib3BlblwiOlxuICAgICAgICAgICAgICByZXR1cm4gY29sb3JzLmVycm9yKFwib3BlblwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJoYWxmX29wZW5cIjpcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbG9ycy53YXJuaW5nKFwiaGFsZl9vcGVuXCIpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,14 @@
1
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
2
+ export default class WebhooksRotateSecret extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ id: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ yes: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
10
+ json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
11
+ quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
12
+ };
13
+ run(): Promise<void>;
14
+ }
@@ -0,0 +1,87 @@
1
+ import { Args, Flags } from "@oclif/core";
2
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
3
+ import { apiClient } from "../../lib/api-client.js";
4
+ import { success, warn, error, json, colors, codeBlock, isJsonMode, } from "../../lib/output.js";
5
+ import inquirer from "inquirer";
6
+ export default class WebhooksRotateSecret extends AuthenticatedCommand {
7
+ static description = "Rotate webhook secret";
8
+ static examples = [
9
+ "<%= config.bin %> webhooks rotate-secret whk_abc123",
10
+ "<%= config.bin %> webhooks rotate-secret whk_abc123 --yes",
11
+ "<%= config.bin %> webhooks rotate-secret whk_abc123 --json",
12
+ ];
13
+ static args = {
14
+ id: Args.string({
15
+ description: "Webhook ID",
16
+ required: true,
17
+ }),
18
+ };
19
+ static flags = {
20
+ ...AuthenticatedCommand.baseFlags,
21
+ yes: Flags.boolean({
22
+ char: "y",
23
+ description: "Skip confirmation prompt",
24
+ default: false,
25
+ }),
26
+ };
27
+ async run() {
28
+ const { args, flags } = await this.parse(WebhooksRotateSecret);
29
+ // Get webhook details for confirmation
30
+ let webhook;
31
+ try {
32
+ webhook = await apiClient.get(`/api/v1/webhooks/${args.id}`);
33
+ }
34
+ catch (err) {
35
+ error(`Webhook not found: ${args.id}`);
36
+ this.exit(1);
37
+ }
38
+ // Confirm rotation
39
+ if (!flags.yes && !isJsonMode()) {
40
+ console.log();
41
+ console.log(colors.warning("⚠ This will rotate the webhook secret and invalidate the old one after 24 hours."));
42
+ console.log(colors.dim("Make sure to update your application with the new secret."));
43
+ console.log();
44
+ const { confirm } = await inquirer.prompt([
45
+ {
46
+ type: "confirm",
47
+ name: "confirm",
48
+ message: `Rotate secret for webhook ${colors.code(args.id)} (${colors.dim(webhook.url)})?`,
49
+ default: false,
50
+ },
51
+ ]);
52
+ if (!confirm) {
53
+ error("Secret rotation cancelled");
54
+ return;
55
+ }
56
+ }
57
+ try {
58
+ const result = await apiClient.post(`/api/v1/webhooks/${args.id}/rotate-secret`);
59
+ if (isJsonMode()) {
60
+ json(result);
61
+ return;
62
+ }
63
+ success("Webhook secret rotated", {
64
+ "Webhook ID": result.id,
65
+ "Secret Version": `${webhook.secretVersion} → ${result.newSecretVersion}`,
66
+ "Grace Period": `${result.gracePeriodHours} hours`,
67
+ "Rotated At": result.rotatedAt,
68
+ });
69
+ console.log();
70
+ warn("Copy your new webhook secret now. The old secret will expire in 24 hours!");
71
+ codeBlock(result.newSecret);
72
+ console.log();
73
+ console.log(colors.dim("Update your application with this new secret for webhook signature verification."));
74
+ console.log(colors.dim(`The old secret will remain valid for ${result.gracePeriodHours} hours to allow for graceful migration.`));
75
+ }
76
+ catch (err) {
77
+ if (err instanceof Error) {
78
+ error(`Failed to rotate secret: ${err.message}`);
79
+ }
80
+ else {
81
+ error(`Failed to rotate secret: ${String(err)}`);
82
+ }
83
+ this.exit(1);
84
+ }
85
+ }
86
+ }
87
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm90YXRlLXNlY3JldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy93ZWJob29rcy9yb3RhdGUtc2VjcmV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsT0FBTyxFQUNQLElBQUksRUFDSixLQUFLLEVBQ0wsSUFBSSxFQUNKLE1BQU0sRUFDTixTQUFTLEVBQ1QsVUFBVSxHQUNYLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxRQUFRLE1BQU0sVUFBVSxDQUFDO0FBVWhDLE1BQU0sQ0FBQyxPQUFPLE9BQU8sb0JBQXFCLFNBQVEsb0JBQW9CO0lBQ3BFLE1BQU0sQ0FBQyxXQUFXLEdBQUcsdUJBQXVCLENBQUM7SUFFN0MsTUFBTSxDQUFDLFFBQVEsR0FBRztRQUNoQixxREFBcUQ7UUFDckQsMkRBQTJEO1FBQzNELDREQUE0RDtLQUM3RCxDQUFDO0lBRUYsTUFBTSxDQUFDLElBQUksR0FBRztRQUNaLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ2QsV0FBVyxFQUFFLFlBQVk7WUFDekIsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDO0tBQ0gsQ0FBQztJQUVGLE1BQU0sQ0FBQyxLQUFLLEdBQUc7UUFDYixHQUFHLG9CQUFvQixDQUFDLFNBQVM7UUFDakMsR0FBRyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDakIsSUFBSSxFQUFFLEdBQUc7WUFDVCxXQUFXLEVBQUUsMEJBQTBCO1lBQ3ZDLE9BQU8sRUFBRSxLQUFLO1NBQ2YsQ0FBQztLQUNILENBQUM7SUFFRixLQUFLLENBQUMsR0FBRztRQUNQLE1BQU0sRUFBRSxJ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QUNOLEtBQUssQ0FBQyw0QkFBNEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNuRCxDQUFDO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXJncywgRmxhZ3MgfSBmcm9tIFwiQG9jbGlmL2NvcmVcIjtcbmltcG9ydCB7IEF1dGhlbnRpY2F0ZWRDb21tYW5kIH0gZnJvbSBcIi4uLy4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGFwaUNsaWVudCB9IGZyb20gXCIuLi8uLi9saWIvYXBpLWNsaWVudC5qc1wiO1xuaW1wb3J0IHtcbiAgc3VjY2VzcyxcbiAgd2FybixcbiAgZXJyb3IsXG4gIGpzb24sXG4gIGNvbG9ycyxcbiAgY29kZUJsb2NrLFxuICBpc0pzb25Nb2RlLFxufSBmcm9tIFwiLi4vLi4vbGliL291dHB1dC5qc1wiO1xuaW1wb3J0IGlucXVpcmVyIGZyb20gXCJpbnF1aXJlclwiO1xuXG5pbnRlcmZhY2UgUm90YXRlU2VjcmV0UmVzcG9uc2Uge1xuICBpZDogc3RyaW5nO1xuICBuZXdTZWNyZXQ6IHN0cmluZztcbiAgbmV3U2VjcmV0VmVyc2lvbjogbnVtYmVyO1xuICBncmFjZVBlcmlvZEhvdXJzOiBudW1iZXI7XG4gIHJvdGF0ZWRBdDogc3RyaW5nO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXZWJob29rc1JvdGF0ZVNlY3JldCBleHRlbmRzIEF1dGhlbnRpY2F0ZWRDb21tYW5kIHtcbiAgc3RhdGljIGRlc2NyaXB0aW9uID0gXCJSb3RhdGUgd2ViaG9vayBzZWNyZXRcIjtcblxuICBzdGF0aWMgZXhhbXBsZXMgPSBbXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiB3ZWJob29rcyByb3RhdGUtc2VjcmV0IHdoa19hYmMxMjNcIixcbiAgICBcIjwlPSBjb25maWcuYmluICU+IHdlYmhvb2tzIHJvdGF0ZS1zZWNyZXQgd2hrX2FiYzEyMyAtLXllc1wiLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gd2ViaG9va3Mgcm90YXRlLXNlY3JldCB3aGtfYWJjMTIzIC0tanNvblwiLFxuICBdO1xuXG4gIHN0YXRpYyBhcmdzID0ge1xuICAgIGlkOiBBcmdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJXZWJob29rIElEXCIsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KSxcbiAgfTtcblxuICBzdGF0aWMgZmxhZ3MgPSB7XG4gICAgLi4uQXV0aGVudGljYXRlZENvbW1hbmQuYmFzZUZsYWdzLFxuICAgIHllczogRmxhZ3MuYm9vbGVhbih7XG4gICAgICBjaGFyOiBcInlcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlNraXAgY29uZmlybWF0aW9uIHByb21wdFwiLFxuICAgICAgZGVmYXVsdDogZmFsc2UsXG4gICAgfSksXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgYXJncywgZmxhZ3MgfSA9IGF3YWl0IHRoaXMucGFyc2UoV2ViaG9va3NSb3RhdGVTZWNyZXQpO1xuXG4gICAgLy8gR2V0IHdlYmhvb2sgZGV0YWlscyBmb3IgY29uZmlybWF0aW9uXG4gICAgbGV0IHdlYmhvb2s7XG4gICAgdHJ5IHtcbiAgICAgIHdlYmhvb2sgPSBhd2FpdCBhcGlDbGllbnQuZ2V0PHsgaWQ6IHN0cmluZzsgdXJsOiBzdHJpbmc7IHNlY3JldFZlcnNpb246IG51bWJlciB9PihcbiAgICAgICAgYC9hcGkvdjEvd2ViaG9va3MvJHthcmdzLmlkfWBcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBlcnJvcihgV2ViaG9vayBub3QgZm91bmQ6ICR7YXJncy5pZH1gKTtcbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBDb25maXJtIHJvdGF0aW9uXG4gICAgaWYgKCFmbGFncy55ZXMgJiYgIWlzSnNvbk1vZGUoKSkge1xuICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy53YXJuaW5nKFwi4pqgIFRoaXMgd2lsbCByb3RhdGUgdGhlIHdlYmhvb2sgc2VjcmV0IGFuZCBpbnZhbGlkYXRlIHRoZSBvbGQgb25lIGFmdGVyIDI0IGhvdXJzLlwiKSk7XG4gICAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwiTWFrZSBzdXJlIHRvIHVwZGF0ZSB5b3VyIGFwcGxpY2F0aW9uIHdpdGggdGhlIG5ldyBzZWNyZXQuXCIpKTtcbiAgICAgIGNvbnNvbGUubG9nKCk7XG5cbiAgICAgIGNvbnN0IHsgY29uZmlybSB9ID0gYXdhaXQgaW5xdWlyZXIucHJvbXB0KFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwiY29uZmlybVwiLFxuICAgICAgICAgIG5hbWU6IFwiY29uZmlybVwiLFxuICAgICAgICAgIG1lc3NhZ2U6IGBSb3RhdGUgc2VjcmV0IGZvciB3ZWJob29rICR7Y29sb3JzLmNvZGUoYXJncy5pZCl9ICgke2NvbG9ycy5kaW0od2ViaG9vay51cmwpfSk/YCxcbiAgICAgICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuXG4gICAgICBpZiAoIWNvbmZpcm0pIHtcbiAgICAgICAgZXJyb3IoXCJTZWNyZXQgcm90YXRpb24gY2FuY2VsbGVkXCIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFwaUNsaWVudC5wb3N0PFJvdGF0ZVNlY3JldFJlc3BvbnNlPihcbiAgICAgICAgYC9hcGkvdjEvd2ViaG9va3MvJHthcmdzLmlkfS9yb3RhdGUtc2VjcmV0YFxuICAgICAgKTtcblxuICAgICAgaWYgKGlzSnNvbk1vZGUoKSkge1xuICAgICAgICBqc29uKHJlc3VsdCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc3VjY2VzcyhcIldlYmhvb2sgc2VjcmV0IHJvdGF0ZWRcIiwge1xuICAgICAgICBcIldlYmhvb2sgSURcIjogcmVzdWx0LmlkLFxuICAgICAgICBcIlNlY3JldCBWZXJzaW9uXCI6IGAke3dlYmhvb2suc2VjcmV0VmVyc2lvbn0g4oaSICR7cmVzdWx0Lm5ld1NlY3JldFZlcnNpb259YCxcbiAgICAgICAgXCJHcmFjZSBQZXJpb2RcIjogYCR7cmVzdWx0LmdyYWNlUGVyaW9kSG91cnN9IGhvdXJzYCxcbiAgICAgICAgXCJSb3RhdGVkIEF0XCI6IHJlc3VsdC5yb3RhdGVkQXQsXG4gICAgICB9KTtcblxuICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgIHdhcm4oXCJDb3B5IHlvdXIgbmV3IHdlYmhvb2sgc2VjcmV0IG5vdy4gVGhlIG9sZCBzZWNyZXQgd2lsbCBleHBpcmUgaW4gMjQgaG91cnMhXCIpO1xuICAgICAgY29kZUJsb2NrKHJlc3VsdC5uZXdTZWNyZXQpO1xuXG4gICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgY29uc29sZS5sb2coY29sb3JzLmRpbShcIlVwZGF0ZSB5b3VyIGFwcGxpY2F0aW9uIHdpdGggdGhpcyBuZXcgc2VjcmV0IGZvciB3ZWJob29rIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24uXCIpKTtcbiAgICAgIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oYFRoZSBvbGQgc2VjcmV0IHdpbGwgcmVtYWluIHZhbGlkIGZvciAke3Jlc3VsdC5ncmFjZVBlcmlvZEhvdXJzfSBob3VycyB0byBhbGxvdyBmb3IgZ3JhY2VmdWwgbWlncmF0aW9uLmApKTtcblxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGVycm9yKGBGYWlsZWQgdG8gcm90YXRlIHNlY3JldDogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKGBGYWlsZWQgdG8gcm90YXRlIHNlY3JldDogJHtTdHJpbmcoZXJyKX1gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG4gIH1cbn0iXX0=
@@ -0,0 +1,13 @@
1
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
2
+ export default class WebhooksTest extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ id: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
10
+ quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
11
+ };
12
+ run(): Promise<void>;
13
+ }
@@ -0,0 +1,73 @@
1
+ import { Args } from "@oclif/core";
2
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
3
+ import { apiClient } from "../../lib/api-client.js";
4
+ import { success, error, spinner, json, colors, isJsonMode, } from "../../lib/output.js";
5
+ export default class WebhooksTest extends AuthenticatedCommand {
6
+ static description = "Send a test event to a webhook";
7
+ static examples = [
8
+ "<%= config.bin %> webhooks test whk_abc123",
9
+ "<%= config.bin %> webhooks test whk_abc123 --json",
10
+ ];
11
+ static args = {
12
+ id: Args.string({
13
+ description: "Webhook ID to test",
14
+ required: true,
15
+ }),
16
+ };
17
+ static flags = {
18
+ ...AuthenticatedCommand.baseFlags,
19
+ };
20
+ async run() {
21
+ const { args } = await this.parse(WebhooksTest);
22
+ const testSpinner = spinner("Sending test event...");
23
+ testSpinner.start();
24
+ try {
25
+ const result = await apiClient.post(`/api/v1/webhooks/${args.id}/test`);
26
+ testSpinner.stop();
27
+ if (isJsonMode()) {
28
+ json(result);
29
+ return;
30
+ }
31
+ if (result.status === "delivered") {
32
+ success("Test event delivered", {
33
+ "Delivery ID": result.deliveryId,
34
+ "Webhook URL": result.webhookUrl,
35
+ "Event Type": result.eventType,
36
+ "Response Time": `${result.responseTime}ms`,
37
+ "Status Code": String(result.statusCode),
38
+ "Delivered At": result.deliveredAt,
39
+ });
40
+ if (result.responseBody) {
41
+ console.log();
42
+ console.log(colors.dim("Response Body:"));
43
+ console.log(result.responseBody.substring(0, 200) + (result.responseBody.length > 200 ? "..." : ""));
44
+ }
45
+ }
46
+ else {
47
+ error("Test event failed", {
48
+ "Delivery ID": result.deliveryId,
49
+ "Webhook URL": result.webhookUrl,
50
+ "Status": result.status,
51
+ "Error": result.error || "Unknown error",
52
+ ...(result.statusCode && { "Status Code": String(result.statusCode) }),
53
+ });
54
+ }
55
+ }
56
+ catch (err) {
57
+ testSpinner.stop();
58
+ if (err instanceof Error && err.message.includes("404")) {
59
+ error(`Webhook not found: ${args.id}`);
60
+ }
61
+ else {
62
+ if (err instanceof Error) {
63
+ error(`Failed to send test event: ${err.message}`);
64
+ }
65
+ else {
66
+ error(`Failed to send test event: ${String(err)}`);
67
+ }
68
+ }
69
+ this.exit(1);
70
+ }
71
+ }
72
+ }
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy93ZWJob29rcy90ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbkMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFDTCxPQUFPLEVBQ1AsS0FBSyxFQUNMLE9BQU8sRUFDUCxJQUFJLEVBQ0osTUFBTSxFQUVOLFVBQVUsR0FDWCxNQUFNLHFCQUFxQixDQUFDO0FBZTdCLE1BQU0sQ0FBQyxPQUFPLE9BQU8sWUFBYSxTQUFRLG9CQUFvQjtJQUM1RCxNQUFNLENBQUMsV0FBVyxHQUFHLGdDQUFnQyxDQUFDO0lBRXRELE1BQU0sQ0FBQyxRQUFRLEdBQUc7UUFDaEIsNENBQTRDO1FBQzVDLG1EQUFtRDtLQUNwRCxDQUFDO0lBRUYsTUFBTSxDQUFDLElBQUksR0FBRztRQUNaLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ2QsV0FBVyxFQUFFLG9CQUFvQjtZQUNqQyxRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUM7S0FDSCxDQUFDO0lBRUYsTUFBTSxDQUFDLEtBQUssR0FBRztRQUNiLEdBQUcsb0JBQW9CLENBQUMsU0FBUztLQUNsQyxDQUFDO0lBRUYsS0FBSyxDQUFDLEdBQUc7UUFDUCxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRWhELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3JELFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUVwQixJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxJQUFJLENBQXNCLG9CQUFvQixJQUFJLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUU3RixXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFbkIsSUFBSSxVQUFVLEVBQUUsRUFBRSxDQUFDO2dCQUNqQixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2IsT0FBTztZQUNULENBQUM7WUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7Z0JBQ2xDLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRTtvQkFDOUIsYUFBYSxFQUFFLE1BQU0sQ0FBQyxVQUFVO29CQUNoQyxhQUFhLEVBQUUsTUFBTSxDQUFDLFVBQVU7b0JBQ2hDLFlBQVksRUFBRSxNQUFNLENBQUMsU0FBUztvQkFDOUIsZUFBZSxFQUFFLEdBQUcsTUFBTSxDQUFDLFlBQVksSUFBSTtvQkFDM0MsYUFBYSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO29CQUN4QyxjQUFjLEVBQUUsTUFBTSxDQUFDLFdBQVc7aUJBQ25DLENBQUMsQ0FBQztnQkFFSCxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDeEIsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO29CQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7b0JBQzFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZHLENBQUM7WUFDSCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sS0FBSyxDQUFDLG1CQUFtQixFQUFFO29CQUN6QixhQUFhLEVBQUUsTUFBTSxDQUFDLFVBQVU7b0JBQ2hDLGFBQWEsRUFBRSxNQUFNLENBQUMsVUFBVTtvQkFDaEMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFNO29CQUN2QixPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssSUFBSSxlQUFlO29CQUN4QyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxFQUFFLGFBQWEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7aUJBQ3ZFLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUVuQixJQUFJLEdBQUcsWUFBWSxLQUFLLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDeEQsS0FBSyxDQUFDLHNCQUFzQixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN6QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxHQUFHLFlBQVksS0FBSyxFQUFFLENBQUM7b0JBQ3pCLEtBQUssQ0FBQyw4QkFBOEIsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ3JELENBQUM7cUJBQU0sQ0FBQztvQkFDTixLQUFLLENBQUMsOEJBQThCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3JELENBQUM7WUFDSCxDQUFDO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXJncyB9IGZyb20gXCJAb2NsaWYvY29yZVwiO1xuaW1wb3J0IHsgQXV0aGVudGljYXRlZENvbW1hbmQgfSBmcm9tIFwiLi4vLi4vbGliL2Jhc2UtY29tbWFuZC5qc1wiO1xuaW1wb3J0IHsgYXBpQ2xpZW50IH0gZnJvbSBcIi4uLy4uL2xpYi9hcGktY2xpZW50LmpzXCI7XG5pbXBvcnQge1xuICBzdWNjZXNzLFxuICBlcnJvcixcbiAgc3Bpbm5lcixcbiAganNvbixcbiAgY29sb3JzLFxuICBrZXlWYWx1ZSxcbiAgaXNKc29uTW9kZSxcbn0gZnJvbSBcIi4uLy4uL2xpYi9vdXRwdXQuanNcIjtcblxuaW50ZXJmYWNlIFRlc3RXZWJob29rUmVzcG9uc2Uge1xuICBpZDogc3RyaW5nO1xuICBkZWxpdmVyeUlkOiBzdHJpbmc7XG4gIHdlYmhvb2tVcmw6IHN0cmluZztcbiAgZXZlbnRUeXBlOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuICByZXNwb25zZVRpbWU6IG51bWJlcjtcbiAgc3RhdHVzQ29kZT86IG51bWJlcjtcbiAgcmVzcG9uc2VCb2R5Pzogc3RyaW5nO1xuICBlcnJvcj86IHN0cmluZztcbiAgZGVsaXZlcmVkQXQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2ViaG9va3NUZXN0IGV4dGVuZHMgQXV0aGVudGljYXRlZENvbW1hbmQge1xuICBzdGF0aWMgZGVzY3JpcHRpb24gPSBcIlNlbmQgYSB0ZXN0IGV2ZW50IHRvIGEgd2ViaG9va1wiO1xuXG4gIHN0YXRpYyBleGFtcGxlcyA9IFtcbiAgICBcIjwlPSBjb25maWcuYmluICU+IHdlYmhvb2tzIHRlc3Qgd2hrX2FiYzEyM1wiLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gd2ViaG9va3MgdGVzdCB3aGtfYWJjMTIzIC0tanNvblwiLFxuICBdO1xuXG4gIHN0YXRpYyBhcmdzID0ge1xuICAgIGlkOiBBcmdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJXZWJob29rIElEIHRvIHRlc3RcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pLFxuICB9O1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5BdXRoZW50aWNhdGVkQ29tbWFuZC5iYXNlRmxhZ3MsXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgYXJncyB9ID0gYXdhaXQgdGhpcy5wYXJzZShXZWJob29rc1Rlc3QpO1xuXG4gICAgY29uc3QgdGVzdFNwaW5uZXIgPSBzcGlubmVyKFwiU2VuZGluZyB0ZXN0IGV2ZW50Li4uXCIpO1xuICAgIHRlc3RTcGlubmVyLnN0YXJ0KCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXBpQ2xpZW50LnBvc3Q8VGVzdFdlYmhvb2tSZXNwb25zZT4oYC9hcGkvdjEvd2ViaG9va3MvJHthcmdzLmlkfS90ZXN0YCk7XG4gICAgICBcbiAgICAgIHRlc3RTcGlubmVyLnN0b3AoKTtcblxuICAgICAgaWYgKGlzSnNvbk1vZGUoKSkge1xuICAgICAgICBqc29uKHJlc3VsdCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwiZGVsaXZlcmVkXCIpIHtcbiAgICAgICAgc3VjY2VzcyhcIlRlc3QgZXZlbnQgZGVsaXZlcmVkXCIsIHtcbiAgICAgICAgICBcIkRlbGl2ZXJ5IElEXCI6IHJlc3VsdC5kZWxpdmVyeUlkLFxuICAgICAgICAgIFwiV2ViaG9vayBVUkxcIjogcmVzdWx0LndlYmhvb2tVcmwsXG4gICAgICAgICAgXCJFdmVudCBUeXBlXCI6IHJlc3VsdC5ldmVudFR5cGUsXG4gICAgICAgICAgXCJSZXNwb25zZSBUaW1lXCI6IGAke3Jlc3VsdC5yZXNwb25zZVRpbWV9bXNgLFxuICAgICAgICAgIFwiU3RhdHVzIENvZGVcIjogU3RyaW5nKHJlc3VsdC5zdGF0dXNDb2RlKSxcbiAgICAgICAgICBcIkRlbGl2ZXJlZCBBdFwiOiByZXN1bHQuZGVsaXZlcmVkQXQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQucmVzcG9uc2VCb2R5KSB7XG4gICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwiUmVzcG9uc2UgQm9keTpcIikpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC5yZXNwb25zZUJvZHkuc3Vic3RyaW5nKDAsIDIwMCkgKyAocmVzdWx0LnJlc3BvbnNlQm9keS5sZW5ndGggPiAyMDAgPyBcIi4uLlwiIDogXCJcIikpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvcihcIlRlc3QgZXZlbnQgZmFpbGVkXCIsIHtcbiAgICAgICAgICBcIkRlbGl2ZXJ5IElEXCI6IHJlc3VsdC5kZWxpdmVyeUlkLFxuICAgICAgICAgIFwiV2ViaG9vayBVUkxcIjogcmVzdWx0LndlYmhvb2tVcmwsXG4gICAgICAgICAgXCJTdGF0dXNcIjogcmVzdWx0LnN0YXR1cyxcbiAgICAgICAgICBcIkVycm9yXCI6IHJlc3VsdC5lcnJvciB8fCBcIlVua25vd24gZXJyb3JcIixcbiAgICAgICAgICAuLi4ocmVzdWx0LnN0YXR1c0NvZGUgJiYgeyBcIlN0YXR1cyBDb2RlXCI6IFN0cmluZyhyZXN1bHQuc3RhdHVzQ29kZSkgfSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGVzdFNwaW5uZXIuc3RvcCgpO1xuICAgICAgXG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyLm1lc3NhZ2UuaW5jbHVkZXMoXCI0MDRcIikpIHtcbiAgICAgICAgZXJyb3IoYFdlYmhvb2sgbm90IGZvdW5kOiAke2FyZ3MuaWR9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBlcnJvcihgRmFpbGVkIHRvIHNlbmQgdGVzdCBldmVudDogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnJvcihgRmFpbGVkIHRvIHNlbmQgdGVzdCBldmVudDogJHtTdHJpbmcoZXJyKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH1cbiAgfVxufSJdfQ==
@@ -0,0 +1,17 @@
1
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
2
+ export default class WebhooksUpdate extends AuthenticatedCommand {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ id: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
7
+ };
8
+ static flags: {
9
+ url: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
10
+ events: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
11
+ description: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
12
+ active: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
13
+ json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
14
+ quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
15
+ };
16
+ run(): Promise<void>;
17
+ }
@@ -0,0 +1,104 @@
1
+ import { Args, Flags } from "@oclif/core";
2
+ import { AuthenticatedCommand } from "../../lib/base-command.js";
3
+ import { apiClient } from "../../lib/api-client.js";
4
+ import { success, error, json, colors, isJsonMode, } from "../../lib/output.js";
5
+ export default class WebhooksUpdate extends AuthenticatedCommand {
6
+ static description = "Update a webhook";
7
+ static examples = [
8
+ '<%= config.bin %> webhooks update whk_abc123 --url https://newdomain.com/webhook',
9
+ '<%= config.bin %> webhooks update whk_abc123 --events message.delivered,message.failed',
10
+ '<%= config.bin %> webhooks update whk_abc123 --description "Updated production webhook"',
11
+ '<%= config.bin %> webhooks update whk_abc123 --active false',
12
+ '<%= config.bin %> webhooks update whk_abc123 --url https://newdomain.com/webhook --events message.sent --json',
13
+ ];
14
+ static args = {
15
+ id: Args.string({
16
+ description: "Webhook ID to update",
17
+ required: true,
18
+ }),
19
+ };
20
+ static flags = {
21
+ ...AuthenticatedCommand.baseFlags,
22
+ url: Flags.string({
23
+ char: "u",
24
+ description: "Update webhook URL (must be HTTPS)",
25
+ }),
26
+ events: Flags.string({
27
+ char: "e",
28
+ description: "Update events list (comma-separated)",
29
+ }),
30
+ description: Flags.string({
31
+ char: "d",
32
+ description: "Update description",
33
+ }),
34
+ active: Flags.boolean({
35
+ char: "a",
36
+ description: "Enable or disable the webhook",
37
+ allowNo: true,
38
+ }),
39
+ };
40
+ async run() {
41
+ const { args, flags } = await this.parse(WebhooksUpdate);
42
+ // Check if any update flags were provided
43
+ const hasUpdates = !!(flags.url || flags.events || flags.description || flags.active !== undefined);
44
+ if (!hasUpdates) {
45
+ error("No updates specified. Use --url, --events, --description, or --active flags.");
46
+ this.exit(1);
47
+ }
48
+ // Build update payload
49
+ const updateData = {};
50
+ if (flags.url) {
51
+ updateData.url = flags.url;
52
+ }
53
+ if (flags.events) {
54
+ updateData.events = flags.events.split(",").map(e => e.trim());
55
+ }
56
+ if (flags.description !== undefined) {
57
+ updateData.description = flags.description;
58
+ }
59
+ if (flags.active !== undefined) {
60
+ updateData.isActive = flags.active;
61
+ }
62
+ try {
63
+ const webhook = await apiClient.patch(`/api/v1/webhooks/${args.id}`, updateData);
64
+ if (isJsonMode()) {
65
+ json(webhook);
66
+ return;
67
+ }
68
+ success("Webhook updated", {
69
+ ID: webhook.id,
70
+ URL: webhook.url,
71
+ Events: webhook.events.join(", "),
72
+ ...(webhook.description && { Description: webhook.description }),
73
+ Status: webhook.isActive ? colors.success("active") : colors.warning("inactive"),
74
+ "Updated At": webhook.updatedAt,
75
+ });
76
+ // Show what changed
77
+ console.log();
78
+ console.log(colors.dim("Updated fields:"));
79
+ if (flags.url)
80
+ console.log(colors.dim(" • URL"));
81
+ if (flags.events)
82
+ console.log(colors.dim(" • Events"));
83
+ if (flags.description !== undefined)
84
+ console.log(colors.dim(" • Description"));
85
+ if (flags.active !== undefined)
86
+ console.log(colors.dim(" • Active status"));
87
+ }
88
+ catch (err) {
89
+ if (err instanceof Error && err.message.includes("404")) {
90
+ error(`Webhook not found: ${args.id}`);
91
+ }
92
+ else {
93
+ if (err instanceof Error) {
94
+ error(`Failed to update webhook: ${err.message}`);
95
+ }
96
+ else {
97
+ error(`Failed to update webhook: ${String(err)}`);
98
+ }
99
+ }
100
+ this.exit(1);
101
+ }
102
+ }
103
+ }
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3dlYmhvb2tzL3VwZGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMxQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUNMLE9BQU8sRUFDUCxLQUFLLEVBQ0wsSUFBSSxFQUNKLE1BQU0sRUFDTixVQUFVLEdBQ1gsTUFBTSxxQkFBcUIsQ0FBQztBQVc3QixNQUFNLENBQUMsT0FBTyxPQUFPLGNBQWUsU0FBUSxvQkFBb0I7SUFDOUQsTUFBTSxDQUFDLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQztJQUV4QyxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLGtGQUFrRjtRQUNsRix3RkFBd0Y7UUFDeEYseUZBQXlGO1FBQ3pGLDZEQUE2RDtRQUM3RCwrR0FBK0c7S0FDaEgsQ0FBQztJQUVGLE1BQU0sQ0FBQyxJQUFJLEdBQUc7UUFDWixFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNkLFdBQVcsRUFBRSxzQkFBc0I7WUFDbkMsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDO0tBQ0gsQ0FBQztJQUVGLE1BQU0sQ0FBQyxLQUFLLEdBQUc7UUFDYixHQUFHLG9CQUFvQixDQUFDLFNBQVM7UUFDakMsR0FBRyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDaEIsSUFBSSxFQUFFLEdBQUc7WUFDVCxXQUFXLEVBQUUsb0NBQW9DO1NBQ2xELENBQUM7UUFDRixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUNuQixJQUFJLEVBQUUsR0FBRztZQUNULFdBQVcsRUFBRSxzQ0FBc0M7U0FDcEQsQ0FBQztRQUNGLFdBQVcsRUFBRSxL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Q0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ2xELElBQUksS0FBSyxDQUFDLE1BQU07Z0JBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDeEQsSUFBSSxLQUFLLENBQUMsV0FBVyxLQUFLLFNBQVM7Z0JBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztZQUNoRixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUztnQkFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1FBRS9FLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsSUFBSSxHQUFHLFlBQVksS0FBSyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3hELEtBQUssQ0FBQyxzQkFBc0IsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDekMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksR0FBRyxZQUFZLEtBQUssRUFBRSxDQUFDO29CQUN6QixLQUFLLENBQUMsNkJBQTZCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUNwRCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sS0FBSyxDQUFDLDZCQUE2QixNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNwRCxDQUFDO1lBQ0gsQ0FBQztZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFyZ3MsIEZsYWdzIH0gZnJvbSBcIkBvY2xpZi9jb3JlXCI7XG5pbXBvcnQgeyBBdXRoZW50aWNhdGVkQ29tbWFuZCB9IGZyb20gXCIuLi8uLi9saWIvYmFzZS1jb21tYW5kLmpzXCI7XG5pbXBvcnQgeyBhcGlDbGllbnQgfSBmcm9tIFwiLi4vLi4vbGliL2FwaS1jbGllbnQuanNcIjtcbmltcG9ydCB7XG4gIHN1Y2Nlc3MsXG4gIGVycm9yLFxuICBqc29uLFxuICBjb2xvcnMsXG4gIGlzSnNvbk1vZGUsXG59IGZyb20gXCIuLi8uLi9saWIvb3V0cHV0LmpzXCI7XG5cbmludGVyZmFjZSBVcGRhdGVXZWJob29rUmVzcG9uc2Uge1xuICBpZDogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgZXZlbnRzOiBzdHJpbmdbXTtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGlzQWN0aXZlOiBib29sZWFuO1xuICB1cGRhdGVkQXQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2ViaG9va3NVcGRhdGUgZXh0ZW5kcyBBdXRoZW50aWNhdGVkQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9IFwiVXBkYXRlIGEgd2ViaG9va1wiO1xuXG4gIHN0YXRpYyBleGFtcGxlcyA9IFtcbiAgICAnPCU9IGNvbmZpZy5iaW4gJT4gd2ViaG9va3MgdXBkYXRlIHdoa19hYmMxMjMgLS11cmwgaHR0cHM6Ly9uZXdkb21haW4uY29tL3dlYmhvb2snLFxuICAgICc8JT0gY29uZmlnLmJpbiAlPiB3ZWJob29rcyB1cGRhdGUgd2hrX2FiYzEyMyAtLWV2ZW50cyBtZXNzYWdlLmRlbGl2ZXJlZCxtZXNzYWdlLmZhaWxlZCcsXG4gICAgJzwlPSBjb25maWcuYmluICU+IHdlYmhvb2tzIHVwZGF0ZSB3aGtfYWJjMTIzIC0tZGVzY3JpcHRpb24gXCJVcGRhdGVkIHByb2R1Y3Rpb24gd2ViaG9va1wiJyxcbiAgICAnPCU9IGNvbmZpZy5iaW4gJT4gd2ViaG9va3MgdXBkYXRlIHdoa19hYmMxMjMgLS1hY3RpdmUgZmFsc2UnLFxuICAgICc8JT0gY29uZmlnLmJpbiAlPiB3ZWJob29rcyB1cGRhdGUgd2hrX2FiYzEyMyAtLXVybCBodHRwczovL25ld2RvbWFpbi5jb20vd2ViaG9vayAtLWV2ZW50cyBtZXNzYWdlLnNlbnQgLS1qc29uJyxcbiAgXTtcblxuICBzdGF0aWMgYXJncyA9IHtcbiAgICBpZDogQXJncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246IFwiV2ViaG9vayBJRCB0byB1cGRhdGVcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pLFxuICB9O1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5BdXRoZW50aWNhdGVkQ29tbWFuZC5iYXNlRmxhZ3MsXG4gICAgdXJsOiBGbGFncy5zdHJpbmcoe1xuICAgICAgY2hhcjogXCJ1XCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJVcGRhdGUgd2ViaG9vayBVUkwgKG11c3QgYmUgSFRUUFMpXCIsXG4gICAgfSksXG4gICAgZXZlbnRzOiBGbGFncy5zdHJpbmcoe1xuICAgICAgY2hhcjogXCJlXCIsXG4gICAgICBkZXNjcmlwdGlvbjogXCJVcGRhdGUgZXZlbnRzIGxpc3QgKGNvbW1hLXNlcGFyYXRlZClcIixcbiAgICB9KSxcbiAgICBkZXNjcmlwdGlvbjogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGNoYXI6IFwiZFwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiVXBkYXRlIGRlc2NyaXB0aW9uXCIsXG4gICAgfSksXG4gICAgYWN0aXZlOiBGbGFncy5ib29sZWFuKHtcbiAgICAgIGNoYXI6IFwiYVwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiRW5hYmxlIG9yIGRpc2FibGUgdGhlIHdlYmhvb2tcIixcbiAgICAgIGFsbG93Tm86IHRydWUsXG4gICAgfSksXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgYXJncywgZmxhZ3MgfSA9IGF3YWl0IHRoaXMucGFyc2UoV2ViaG9va3NVcGRhdGUpO1xuXG4gICAgLy8gQ2hlY2sgaWYgYW55IHVwZGF0ZSBmbGFncyB3ZXJlIHByb3ZpZGVkXG4gICAgY29uc3QgaGFzVXBkYXRlcyA9ICEhKGZsYWdzLnVybCB8fCBmbGFncy5ldmVudHMgfHwgZmxhZ3MuZGVzY3JpcHRpb24gfHwgZmxhZ3MuYWN0aXZlICE9PSB1bmRlZmluZWQpO1xuICAgIFxuICAgIGlmICghaGFzVXBkYXRlcykge1xuICAgICAgZXJyb3IoXCJObyB1cGRhdGVzIHNwZWNpZmllZC4gVXNlIC0tdXJsLCAtLWV2ZW50cywgLS1kZXNjcmlwdGlvbiwgb3IgLS1hY3RpdmUgZmxhZ3MuXCIpO1xuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIHVwZGF0ZSBwYXlsb2FkXG4gICAgY29uc3QgdXBkYXRlRGF0YTogYW55ID0ge307XG4gICAgXG4gICAgaWYgKGZsYWdzLnVybCkge1xuICAgICAgdXBkYXRlRGF0YS51cmwgPSBmbGFncy51cmw7XG4gICAgfVxuICAgIFxuICAgIGlmIChmbGFncy5ldmVudHMpIHtcbiAgICAgIHVwZGF0ZURhdGEuZXZlbnRzID0gZmxhZ3MuZXZlbnRzLnNwbGl0KFwiLFwiKS5tYXAoZSA9PiBlLnRyaW0oKSk7XG4gICAgfVxuICAgIFxuICAgIGlmIChmbGFncy5kZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1cGRhdGVEYXRhLmRlc2NyaXB0aW9uID0gZmxhZ3MuZGVzY3JpcHRpb247XG4gICAgfVxuICAgIFxuICAgIGlmIChmbGFncy5hY3RpdmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdXBkYXRlRGF0YS5pc0FjdGl2ZSA9IGZsYWdzLmFjdGl2ZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2ViaG9vayA9IGF3YWl0IGFwaUNsaWVudC5wYXRjaDxVcGRhdGVXZWJob29rUmVzcG9uc2U+KFxuICAgICAgICBgL2FwaS92MS93ZWJob29rcy8ke2FyZ3MuaWR9YCxcbiAgICAgICAgdXBkYXRlRGF0YVxuICAgICAgKTtcblxuICAgICAgaWYgKGlzSnNvbk1vZGUoKSkge1xuICAgICAgICBqc29uKHdlYmhvb2spO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHN1Y2Nlc3MoXCJXZWJob29rIHVwZGF0ZWRcIiwge1xuICAgICAgICBJRDogd2ViaG9vay5pZCxcbiAgICAgICAgVVJMOiB3ZWJob29rLnVybCxcbiAgICAgICAgRXZlbnRzOiB3ZWJob29rLmV2ZW50cy5qb2luKFwiLCBcIiksXG4gICAgICAgIC4uLih3ZWJob29rLmRlc2NyaXB0aW9uICYmIHsgRGVzY3JpcHRpb246IHdlYmhvb2suZGVzY3JpcHRpb24gfSksXG4gICAgICAgIFN0YXR1czogd2ViaG9vay5pc0FjdGl2ZSA/IGNvbG9ycy5zdWNjZXNzKFwiYWN0aXZlXCIpIDogY29sb3JzLndhcm5pbmcoXCJpbmFjdGl2ZVwiKSxcbiAgICAgICAgXCJVcGRhdGVkIEF0XCI6IHdlYmhvb2sudXBkYXRlZEF0LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNob3cgd2hhdCBjaGFuZ2VkXG4gICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgY29uc29sZS5sb2coY29sb3JzLmRpbShcIlVwZGF0ZWQgZmllbGRzOlwiKSk7XG4gICAgICBpZiAoZmxhZ3MudXJsKSBjb25zb2xlLmxvZyhjb2xvcnMuZGltKFwiICDigKIgVVJMXCIpKTtcbiAgICAgIGlmIChmbGFncy5ldmVudHMpIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oXCIgIOKAoiBFdmVudHNcIikpO1xuICAgICAgaWYgKGZsYWdzLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oXCIgIOKAoiBEZXNjcmlwdGlvblwiKSk7XG4gICAgICBpZiAoZmxhZ3MuYWN0aXZlICE9PSB1bmRlZmluZWQpIGNvbnNvbGUubG9nKGNvbG9ycy5kaW0oXCIgIOKAoiBBY3RpdmUgc3RhdHVzXCIpKTtcblxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yICYmIGVyci5tZXNzYWdlLmluY2x1ZGVzKFwiNDA0XCIpKSB7XG4gICAgICAgIGVycm9yKGBXZWJob29rIG5vdCBmb3VuZDogJHthcmdzLmlkfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgZXJyb3IoYEZhaWxlZCB0byB1cGRhdGUgd2ViaG9vazogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnJvcihgRmFpbGVkIHRvIHVwZGF0ZSB3ZWJob29rOiAke1N0cmluZyhlcnIpfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmV4aXQoMSk7XG4gICAgfVxuICB9XG59Il19
@@ -1039,6 +1039,228 @@
1039
1039
  "send.js"
1040
1040
  ]
1041
1041
  },
1042
+ "webhooks:create": {
1043
+ "aliases": [],
1044
+ "args": {},
1045
+ "description": "Create a webhook",
1046
+ "examples": [
1047
+ "<%= config.bin %> webhooks create --url https://myapp.com/webhook --events message.delivered",
1048
+ "<%= config.bin %> webhooks create --url https://myapp.com/webhook --events message.delivered,message.failed --description \"Production webhook\"",
1049
+ "<%= config.bin %> webhooks create --url https://webhook.site/abc123 --events message.sent --json"
1050
+ ],
1051
+ "flags": {
1052
+ "json": {
1053
+ "description": "Output in JSON format",
1054
+ "name": "json",
1055
+ "allowNo": false,
1056
+ "type": "boolean"
1057
+ },
1058
+ "quiet": {
1059
+ "char": "q",
1060
+ "description": "Minimal output",
1061
+ "name": "quiet",
1062
+ "allowNo": false,
1063
+ "type": "boolean"
1064
+ },
1065
+ "url": {
1066
+ "char": "u",
1067
+ "description": "Webhook URL (must be HTTPS)",
1068
+ "name": "url",
1069
+ "required": true,
1070
+ "hasDynamicHelp": false,
1071
+ "multiple": false,
1072
+ "type": "option"
1073
+ },
1074
+ "events": {
1075
+ "char": "e",
1076
+ "description": "Comma-separated list of events to listen for",
1077
+ "name": "events",
1078
+ "required": true,
1079
+ "hasDynamicHelp": false,
1080
+ "multiple": false,
1081
+ "type": "option"
1082
+ },
1083
+ "description": {
1084
+ "char": "d",
1085
+ "description": "Description for the webhook",
1086
+ "name": "description",
1087
+ "hasDynamicHelp": false,
1088
+ "multiple": false,
1089
+ "type": "option"
1090
+ }
1091
+ },
1092
+ "hasDynamicHelp": false,
1093
+ "hiddenAliases": [],
1094
+ "id": "webhooks:create",
1095
+ "pluginAlias": "@sendly/cli",
1096
+ "pluginName": "@sendly/cli",
1097
+ "pluginType": "core",
1098
+ "strict": true,
1099
+ "isESM": true,
1100
+ "relativePath": [
1101
+ "dist",
1102
+ "commands",
1103
+ "webhooks",
1104
+ "create.js"
1105
+ ]
1106
+ },
1107
+ "webhooks:delete": {
1108
+ "aliases": [],
1109
+ "args": {
1110
+ "id": {
1111
+ "description": "Webhook ID to delete",
1112
+ "name": "id",
1113
+ "required": true
1114
+ }
1115
+ },
1116
+ "description": "Delete a webhook",
1117
+ "examples": [
1118
+ "<%= config.bin %> webhooks delete whk_abc123",
1119
+ "<%= config.bin %> webhooks delete whk_abc123 --yes",
1120
+ "<%= config.bin %> webhooks delete whk_abc123 --json"
1121
+ ],
1122
+ "flags": {
1123
+ "json": {
1124
+ "description": "Output in JSON format",
1125
+ "name": "json",
1126
+ "allowNo": false,
1127
+ "type": "boolean"
1128
+ },
1129
+ "quiet": {
1130
+ "char": "q",
1131
+ "description": "Minimal output",
1132
+ "name": "quiet",
1133
+ "allowNo": false,
1134
+ "type": "boolean"
1135
+ },
1136
+ "yes": {
1137
+ "char": "y",
1138
+ "description": "Skip confirmation prompt",
1139
+ "name": "yes",
1140
+ "allowNo": false,
1141
+ "type": "boolean"
1142
+ }
1143
+ },
1144
+ "hasDynamicHelp": false,
1145
+ "hiddenAliases": [],
1146
+ "id": "webhooks:delete",
1147
+ "pluginAlias": "@sendly/cli",
1148
+ "pluginName": "@sendly/cli",
1149
+ "pluginType": "core",
1150
+ "strict": true,
1151
+ "isESM": true,
1152
+ "relativePath": [
1153
+ "dist",
1154
+ "commands",
1155
+ "webhooks",
1156
+ "delete.js"
1157
+ ]
1158
+ },
1159
+ "webhooks:deliveries": {
1160
+ "aliases": [],
1161
+ "args": {
1162
+ "id": {
1163
+ "description": "Webhook ID",
1164
+ "name": "id",
1165
+ "required": true
1166
+ }
1167
+ },
1168
+ "description": "View webhook delivery history",
1169
+ "examples": [
1170
+ "<%= config.bin %> webhooks deliveries whk_abc123",
1171
+ "<%= config.bin %> webhooks deliveries whk_abc123 --limit 20",
1172
+ "<%= config.bin %> webhooks deliveries whk_abc123 --failed-only",
1173
+ "<%= config.bin %> webhooks deliveries whk_abc123 --json"
1174
+ ],
1175
+ "flags": {
1176
+ "json": {
1177
+ "description": "Output in JSON format",
1178
+ "name": "json",
1179
+ "allowNo": false,
1180
+ "type": "boolean"
1181
+ },
1182
+ "quiet": {
1183
+ "char": "q",
1184
+ "description": "Minimal output",
1185
+ "name": "quiet",
1186
+ "allowNo": false,
1187
+ "type": "boolean"
1188
+ },
1189
+ "limit": {
1190
+ "char": "l",
1191
+ "description": "Number of deliveries to show",
1192
+ "name": "limit",
1193
+ "default": 10,
1194
+ "hasDynamicHelp": false,
1195
+ "multiple": false,
1196
+ "type": "option"
1197
+ },
1198
+ "failed-only": {
1199
+ "description": "Show only failed deliveries",
1200
+ "name": "failed-only",
1201
+ "allowNo": false,
1202
+ "type": "boolean"
1203
+ }
1204
+ },
1205
+ "hasDynamicHelp": false,
1206
+ "hiddenAliases": [],
1207
+ "id": "webhooks:deliveries",
1208
+ "pluginAlias": "@sendly/cli",
1209
+ "pluginName": "@sendly/cli",
1210
+ "pluginType": "core",
1211
+ "strict": true,
1212
+ "isESM": true,
1213
+ "relativePath": [
1214
+ "dist",
1215
+ "commands",
1216
+ "webhooks",
1217
+ "deliveries.js"
1218
+ ]
1219
+ },
1220
+ "webhooks:get": {
1221
+ "aliases": [],
1222
+ "args": {
1223
+ "id": {
1224
+ "description": "Webhook ID",
1225
+ "name": "id",
1226
+ "required": true
1227
+ }
1228
+ },
1229
+ "description": "Get webhook details",
1230
+ "examples": [
1231
+ "<%= config.bin %> webhooks get whk_abc123",
1232
+ "<%= config.bin %> webhooks get whk_abc123 --json"
1233
+ ],
1234
+ "flags": {
1235
+ "json": {
1236
+ "description": "Output in JSON format",
1237
+ "name": "json",
1238
+ "allowNo": false,
1239
+ "type": "boolean"
1240
+ },
1241
+ "quiet": {
1242
+ "char": "q",
1243
+ "description": "Minimal output",
1244
+ "name": "quiet",
1245
+ "allowNo": false,
1246
+ "type": "boolean"
1247
+ }
1248
+ },
1249
+ "hasDynamicHelp": false,
1250
+ "hiddenAliases": [],
1251
+ "id": "webhooks:get",
1252
+ "pluginAlias": "@sendly/cli",
1253
+ "pluginName": "@sendly/cli",
1254
+ "pluginType": "core",
1255
+ "strict": true,
1256
+ "isESM": true,
1257
+ "relativePath": [
1258
+ "dist",
1259
+ "commands",
1260
+ "webhooks",
1261
+ "get.js"
1262
+ ]
1263
+ },
1042
1264
  "webhooks:list": {
1043
1265
  "aliases": [],
1044
1266
  "args": {},
@@ -1141,7 +1363,181 @@
1141
1363
  "webhooks",
1142
1364
  "listen.js"
1143
1365
  ]
1366
+ },
1367
+ "webhooks:rotate-secret": {
1368
+ "aliases": [],
1369
+ "args": {
1370
+ "id": {
1371
+ "description": "Webhook ID",
1372
+ "name": "id",
1373
+ "required": true
1374
+ }
1375
+ },
1376
+ "description": "Rotate webhook secret",
1377
+ "examples": [
1378
+ "<%= config.bin %> webhooks rotate-secret whk_abc123",
1379
+ "<%= config.bin %> webhooks rotate-secret whk_abc123 --yes",
1380
+ "<%= config.bin %> webhooks rotate-secret whk_abc123 --json"
1381
+ ],
1382
+ "flags": {
1383
+ "json": {
1384
+ "description": "Output in JSON format",
1385
+ "name": "json",
1386
+ "allowNo": false,
1387
+ "type": "boolean"
1388
+ },
1389
+ "quiet": {
1390
+ "char": "q",
1391
+ "description": "Minimal output",
1392
+ "name": "quiet",
1393
+ "allowNo": false,
1394
+ "type": "boolean"
1395
+ },
1396
+ "yes": {
1397
+ "char": "y",
1398
+ "description": "Skip confirmation prompt",
1399
+ "name": "yes",
1400
+ "allowNo": false,
1401
+ "type": "boolean"
1402
+ }
1403
+ },
1404
+ "hasDynamicHelp": false,
1405
+ "hiddenAliases": [],
1406
+ "id": "webhooks:rotate-secret",
1407
+ "pluginAlias": "@sendly/cli",
1408
+ "pluginName": "@sendly/cli",
1409
+ "pluginType": "core",
1410
+ "strict": true,
1411
+ "isESM": true,
1412
+ "relativePath": [
1413
+ "dist",
1414
+ "commands",
1415
+ "webhooks",
1416
+ "rotate-secret.js"
1417
+ ]
1418
+ },
1419
+ "webhooks:test": {
1420
+ "aliases": [],
1421
+ "args": {
1422
+ "id": {
1423
+ "description": "Webhook ID to test",
1424
+ "name": "id",
1425
+ "required": true
1426
+ }
1427
+ },
1428
+ "description": "Send a test event to a webhook",
1429
+ "examples": [
1430
+ "<%= config.bin %> webhooks test whk_abc123",
1431
+ "<%= config.bin %> webhooks test whk_abc123 --json"
1432
+ ],
1433
+ "flags": {
1434
+ "json": {
1435
+ "description": "Output in JSON format",
1436
+ "name": "json",
1437
+ "allowNo": false,
1438
+ "type": "boolean"
1439
+ },
1440
+ "quiet": {
1441
+ "char": "q",
1442
+ "description": "Minimal output",
1443
+ "name": "quiet",
1444
+ "allowNo": false,
1445
+ "type": "boolean"
1446
+ }
1447
+ },
1448
+ "hasDynamicHelp": false,
1449
+ "hiddenAliases": [],
1450
+ "id": "webhooks:test",
1451
+ "pluginAlias": "@sendly/cli",
1452
+ "pluginName": "@sendly/cli",
1453
+ "pluginType": "core",
1454
+ "strict": true,
1455
+ "isESM": true,
1456
+ "relativePath": [
1457
+ "dist",
1458
+ "commands",
1459
+ "webhooks",
1460
+ "test.js"
1461
+ ]
1462
+ },
1463
+ "webhooks:update": {
1464
+ "aliases": [],
1465
+ "args": {
1466
+ "id": {
1467
+ "description": "Webhook ID to update",
1468
+ "name": "id",
1469
+ "required": true
1470
+ }
1471
+ },
1472
+ "description": "Update a webhook",
1473
+ "examples": [
1474
+ "<%= config.bin %> webhooks update whk_abc123 --url https://newdomain.com/webhook",
1475
+ "<%= config.bin %> webhooks update whk_abc123 --events message.delivered,message.failed",
1476
+ "<%= config.bin %> webhooks update whk_abc123 --description \"Updated production webhook\"",
1477
+ "<%= config.bin %> webhooks update whk_abc123 --active false",
1478
+ "<%= config.bin %> webhooks update whk_abc123 --url https://newdomain.com/webhook --events message.sent --json"
1479
+ ],
1480
+ "flags": {
1481
+ "json": {
1482
+ "description": "Output in JSON format",
1483
+ "name": "json",
1484
+ "allowNo": false,
1485
+ "type": "boolean"
1486
+ },
1487
+ "quiet": {
1488
+ "char": "q",
1489
+ "description": "Minimal output",
1490
+ "name": "quiet",
1491
+ "allowNo": false,
1492
+ "type": "boolean"
1493
+ },
1494
+ "url": {
1495
+ "char": "u",
1496
+ "description": "Update webhook URL (must be HTTPS)",
1497
+ "name": "url",
1498
+ "hasDynamicHelp": false,
1499
+ "multiple": false,
1500
+ "type": "option"
1501
+ },
1502
+ "events": {
1503
+ "char": "e",
1504
+ "description": "Update events list (comma-separated)",
1505
+ "name": "events",
1506
+ "hasDynamicHelp": false,
1507
+ "multiple": false,
1508
+ "type": "option"
1509
+ },
1510
+ "description": {
1511
+ "char": "d",
1512
+ "description": "Update description",
1513
+ "name": "description",
1514
+ "hasDynamicHelp": false,
1515
+ "multiple": false,
1516
+ "type": "option"
1517
+ },
1518
+ "active": {
1519
+ "char": "a",
1520
+ "description": "Enable or disable the webhook",
1521
+ "name": "active",
1522
+ "allowNo": true,
1523
+ "type": "boolean"
1524
+ }
1525
+ },
1526
+ "hasDynamicHelp": false,
1527
+ "hiddenAliases": [],
1528
+ "id": "webhooks:update",
1529
+ "pluginAlias": "@sendly/cli",
1530
+ "pluginName": "@sendly/cli",
1531
+ "pluginType": "core",
1532
+ "strict": true,
1533
+ "isESM": true,
1534
+ "relativePath": [
1535
+ "dist",
1536
+ "commands",
1537
+ "webhooks",
1538
+ "update.js"
1539
+ ]
1144
1540
  }
1145
1541
  },
1146
- "version": "1.1.0"
1542
+ "version": "2.3.0"
1147
1543
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sendly/cli",
3
- "version": "1.1.0",
3
+ "version": "2.3.0",
4
4
  "type": "module",
5
5
  "description": "Sendly CLI - Send SMS from your terminal",
6
6
  "author": "Sendly <support@sendly.live>",