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