saasignal 0.9.32 → 0.9.33

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/dist/cli.js CHANGED
@@ -15,12 +15,26 @@ Environment:
15
15
  Namespaces:
16
16
  auth Browser login, logout, and status
17
17
  kv Key-value store
18
+ locks Distributed locks
19
+ sketches Probabilistic data structures (HLL, CMS)
18
20
  channels Real-time pub/sub
19
21
  jobs Task / queue / cron
20
- billing Packages, tokens, usage
22
+ workflows Multi-step workflow orchestration
23
+ webhooks Webhook management and publishing
21
24
  storage Object storage (buckets, objects, signed URLs)
25
+ media Media asset processing (images, video)
22
26
  ai AI models, inference, and retrieval primitives
23
- delivery Delivery and ETA primitives
27
+ search Full-text and vector search indexes
28
+ matching Constraint-solving and assignment optimization
29
+ ranking Behavioral and semantic item ranking
30
+ logistics Geospatial, tracking, routing, geocoding
31
+ delivery Delivery order, driver, and zone management
32
+ commerce E-commerce catalogs, carts, orders, payments
33
+ booking Appointment and resource booking
34
+ messaging Conversations, messages, and reactions
35
+ billing Packages, tokens, usage
36
+ orgs Organization and project management
37
+ meta Health checks, docs, and API metadata
24
38
 
25
39
  KV Commands:
26
40
  kv get <key>
@@ -28,9 +42,24 @@ KV Commands:
28
42
  kv delete <key>
29
43
  kv increment <key> [--delta <n>] [--ttl <seconds>]
30
44
  kv scan [--prefix <p>] [--limit <n>] [--cursor <c>]
45
+ kv batch --ops <json-array>
46
+
47
+ Locks Commands:
48
+ locks acquire <key> --ttl-ms <ms> [--holder-id <id>]
49
+ locks release <key> --token <lock_token>
50
+ locks renew <key> --token <lock_token> --ttl-ms <ms>
51
+ locks status <key>
52
+
53
+ Sketches Commands:
54
+ sketches hll add <key> --elements <json-array>
55
+ sketches hll count <key>
56
+ sketches hll merge --dest-key <key> --source-keys <json-array>
57
+ sketches cms increment <key> --elements <json-array>
58
+ sketches cms estimate <key> --item <item>
31
59
 
32
60
  Channel Commands:
33
61
  channels publish <channel> <event> <json-data>
62
+ channels batch-publish --messages <json-array>
34
63
  channels presence <channel>
35
64
  channels history <channel> [--limit <n>]
36
65
 
@@ -38,12 +67,33 @@ Job Commands:
38
67
  jobs create <name> --trigger <type> [--queue <q>] [--cron <expr>] [--delay <s>] [--payload <json>] [--handler <url>]
39
68
  jobs list [--status <s>] [--trigger-type <t>] [--queue <q>] [--limit <n>]
40
69
  jobs get <job_id>
70
+ jobs update <job_id> [--handler <url>] [--payload <json>] [--enabled <bool>] [--cron <expr>]
41
71
  jobs cancel <job_id>
42
72
  jobs trigger <job_id>
43
73
  jobs retry <job_id>
44
74
  jobs runs <job_id> [--limit <n>]
45
75
  jobs claim <queue> [--count <n>] [--timeout <s>]
46
76
  jobs ack <job_id> --status <completed|failed> [--result <json>] [--error <msg>]
77
+ jobs batch-create --jobs <json-array>
78
+
79
+ Workflow Commands:
80
+ workflows create-blueprint --body <json>
81
+ workflows list-blueprints [--limit <n>] [--cursor <c>]
82
+ workflows trigger <blueprint_id> [--input-data <json>] [--idempotency-key <key>]
83
+ workflows get-execution <execution_id>
84
+ workflows cancel <execution_id>
85
+ workflows resume <execution_id> [--step-id <id>] [--override-output <json>]
86
+
87
+ Webhook Commands:
88
+ webhooks create --name <n> --url <u> --topics <json-array> [--secret <s>]
89
+ webhooks list [--limit <n>] [--cursor <c>] [--enabled <bool>]
90
+ webhooks get <webhook_id>
91
+ webhooks update <webhook_id> [--name <n>] [--url <u>] [--topics <json>]
92
+ webhooks delete <webhook_id>
93
+ webhooks test <webhook_id>
94
+ webhooks deliveries <webhook_id> [--limit <n>]
95
+ webhooks retry-delivery <webhook_id> <delivery_id>
96
+ webhooks publish --topic <t> --data <json>
47
97
 
48
98
  Billing Commands:
49
99
  billing packages
@@ -51,6 +101,8 @@ Billing Commands:
51
101
  billing balance <org_id>
52
102
  billing bundles
53
103
  billing token-usage <org_id> [--from <date>] [--to <date>] [--granularity <hour|day|month>]
104
+ billing subscription <org_id>
105
+ billing switch-to-free <org_id>
54
106
 
55
107
  Storage Commands:
56
108
  storage buckets list [--limit <n>] [--cursor <c>]
@@ -60,9 +112,20 @@ Storage Commands:
60
112
  storage objects list <bucket_id> [--prefix <p>] [--delimiter <d>] [--limit <n>]
61
113
  storage objects put <bucket_id> <key> <file_path> [--content-type <ct>]
62
114
  storage objects get <bucket_id> <key>
115
+ storage objects head <bucket_id> <key>
63
116
  storage objects delete <bucket_id> <key>
64
117
  storage signed-url <bucket_id> <key> --method <GET|PUT> [--expires-in <s>] [--content-type <ct>]
65
118
 
119
+ Media Commands:
120
+ media upload <file_path> [--content-type <ct>] [--visibility <v>]
121
+ media upload-url --url <u> [--filename <f>] [--visibility <v>]
122
+ media list [--limit <n>] [--cursor <c>] [--media-type <t>]
123
+ media get <asset_id>
124
+ media delete <asset_id>
125
+ media transform-image <asset_id> --body <json>
126
+ media encode-video <asset_id> --body <json>
127
+ media list-variants <asset_id>
128
+
66
129
  AI Commands:
67
130
  ai models
68
131
  ai model <model_id>
@@ -83,19 +146,231 @@ AI Commands:
83
146
  ai operations get <operation_id>
84
147
  ai operations cancel <operation_id>
85
148
 
149
+ Search Commands:
150
+ search create-index --body <json>
151
+ search list-indexes
152
+ search get-index <index_id>
153
+ search update-index <index_id> --body <json>
154
+ search delete-index <index_id>
155
+ search upsert-docs <index_id> --body <json>
156
+ search list-docs <index_id>
157
+ search get-doc <index_id> <document_id>
158
+ search delete-doc <index_id> <document_id>
159
+ search query <index_id> --body <json>
160
+ search suggest <index_id> --prefix <p> [--limit <n>]
161
+ search stats <index_id>
162
+ search rebuild <index_id> [--async <true|false>]
163
+
164
+ Matching Commands:
165
+ matching create-operation --body <json>
166
+ matching batch-operation --body <json>
167
+ matching get-operation <operation_id>
168
+ matching cancel-operation <operation_id>
169
+ matching create-template --body <json>
170
+ matching list-templates
171
+ matching get-template <template_id>
172
+ matching update-template <template_id> --body <json>
173
+ matching delete-template <template_id>
174
+ matching template-operation <template_id> [--body <json>]
175
+
176
+ Ranking Commands:
177
+ ranking create-collection --body <json>
178
+ ranking list-collections
179
+ ranking get-collection <collection_id>
180
+ ranking update-collection <collection_id> --body <json>
181
+ ranking delete-collection <collection_id>
182
+ ranking upsert-items <collection_id> --body <json>
183
+ ranking list-items <collection_id>
184
+ ranking get-item <collection_id> <item_id>
185
+ ranking delete-item <collection_id> <item_id>
186
+ ranking ingest-signals <collection_id> --body <json>
187
+ ranking rank <collection_id> --body <json>
188
+ ranking related <collection_id> --body <json>
189
+ ranking stats <collection_id>
190
+
191
+ Logistics Commands:
192
+ logistics geo create --body <json>
193
+ logistics geo list [--type <t>] [--status <s>] [--limit <n>]
194
+ logistics geo nearby --lat <lat> --lng <lng> [--radius-km <r>] [--type <t>]
195
+ logistics geo get <entity_id>
196
+ logistics geo update <entity_id> --body <json>
197
+ logistics geo deactivate <entity_id>
198
+ logistics geofences create --body <json>
199
+ logistics geofences list [--enabled <bool>] [--limit <n>]
200
+ logistics geofences get <fence_id>
201
+ logistics geofences delete <fence_id>
202
+ logistics eta-fences create --name <n> --dest-lat <lat> --dest-lng <lng> --threshold <min>
203
+ logistics eta-fences list [--enabled <bool>] [--limit <n>]
204
+ logistics eta-fences get <fence_id>
205
+ logistics eta-fences delete <fence_id>
206
+ logistics tracking ping <entity_id> --lat <lat> --lng <lng> [--heading <h>] [--speed <s>]
207
+ logistics tracking batch-ping <entity_id> --pings <json-array>
208
+ logistics tracking history <entity_id> [--limit <n>]
209
+ logistics routing route --origin-lat <lat> --origin-lng <lng> --dest-lat <lat> --dest-lng <lng>
210
+ logistics routing optimize --origin-lat <lat> --origin-lng <lng> --stops <json-array>
211
+ logistics routing distance-matrix --origins <json> --destinations <json>
212
+ logistics routing dispatch --agents <json> --tasks <json>
213
+ logistics routing isochrone --origin-lat <lat> --origin-lng <lng> --minutes <json-array>
214
+ logistics routing snap --pings <json-array> [--profile <driving|walking|cycling>]
215
+ logistics geocoding forward --q <query> [--limit <n>] [--country <c>]
216
+ logistics geocoding reverse --lat <lat> --lng <lng>
217
+ logistics geocoding autocomplete --q <query> [--limit <n>] [--country <c>]
218
+
86
219
  Delivery Commands:
87
220
  delivery orders list [--status <s>] [--driver-id <id>] [--limit <n>]
88
221
  delivery orders get <order_id>
89
222
  delivery orders create --customer-id <id> --dropoff <address> [--pickup <address>]
223
+ delivery orders update <order_id> [--driver-id <id>] [--dropoff <addr>]
90
224
  delivery orders transition <order_id> --status <s> [--driver-id <id>]
225
+ delivery orders events <order_id>
226
+ delivery orders delete <order_id>
227
+ delivery orders proof list <order_id>
228
+ delivery orders proof get <order_id> <proof_id>
229
+ delivery orders proof create <order_id> --type <t> --value <v> [--stop-id <id>]
230
+ delivery orders proof delete <order_id> <proof_id>
91
231
  delivery drivers list [--status <s>] [--limit <n>]
92
232
  delivery drivers get <driver_id>
233
+ delivery drivers create --name <n> [--phone <p>] [--email <e>]
234
+ delivery drivers update <driver_id> [--name <n>] [--phone <p>]
235
+ delivery drivers online <driver_id>
236
+ delivery drivers offline <driver_id>
237
+ delivery drivers delete <driver_id>
238
+ delivery customers list [--limit <n>]
239
+ delivery customers get <customer_id>
240
+ delivery customers create --name <n> [--email <e>] [--phone <p>]
241
+ delivery customers update <customer_id> [--name <n>]
242
+ delivery customers delete <customer_id>
243
+ delivery customers addresses list <customer_id>
244
+ delivery customers addresses add <customer_id> --address-line <a> [--label <l>]
245
+ delivery customers addresses delete <customer_id> <address_id>
246
+ delivery vehicles list [--type <t>] [--limit <n>]
247
+ delivery vehicles get <vehicle_id>
248
+ delivery vehicles create [--type <t>] [--plate <p>] [--name <n>]
249
+ delivery vehicles update <vehicle_id> [--type <t>] [--plate <p>]
250
+ delivery vehicles delete <vehicle_id>
251
+ delivery stops list <order_id>
252
+ delivery stops get <stop_id>
253
+ delivery stops create <order_id> --sequence <n> --type <t> [--address <a>]
254
+ delivery stops update <stop_id> [--sequence <n>] [--address <a>]
255
+ delivery stops arrive <stop_id>
256
+ delivery stops complete <stop_id>
257
+ delivery stops skip <stop_id>
258
+ delivery stops delete <stop_id>
259
+ delivery dispatch suggest --order-id <id> [--radius-km <r>] [--limit <n>]
260
+ delivery dispatch auto-assign --order-id <id>
261
+ delivery tracking-links create --order-id <id> [--ttl-minutes <m>]
262
+ delivery tracking-links resolve <token>
263
+ delivery tracking-links revoke <link_id>
264
+ delivery tracking-pages customer-page <token>
265
+ delivery tracking-pages customer-feed <token>
266
+ delivery tracking-pages rate <token> --score <n> [--comment <c>]
267
+ delivery tracking-pages driver-page <token>
268
+ delivery tracking-pages ping <token> --lat <lat> --lng <lng>
269
+ delivery tracking-pages comment-proof <token> --text <t>
270
+ delivery dispatch-rules list
271
+ delivery dispatch-rules get <rule_id>
272
+ delivery dispatch-rules create --body <json>
273
+ delivery dispatch-rules update <rule_id> --body <json>
274
+ delivery dispatch-rules delete <rule_id>
275
+ delivery dispatch-rules evaluate --lat <lat> --lng <lng> [--time <t>]
276
+ delivery auto-dispatch --order-id <id>
277
+ delivery zones list [--limit <n>]
278
+ delivery zones get <zone_id>
279
+ delivery zones create --body <json>
280
+ delivery zones update <zone_id> --body <json>
281
+ delivery zones delete <zone_id>
93
282
  delivery eta-fences list [--enabled <true|false>] [--limit <n>]
94
283
  delivery eta-fences get <fence_id>
95
284
  delivery eta-fences create --name <n> --dest-lat <lat> --dest-lng <lng> --threshold <min>
96
285
  delivery eta-fences delete <fence_id>
97
- delivery settings
98
- delivery analytics [--from <date>] [--to <date>]
286
+ delivery hubs list [--limit <n>]
287
+ delivery hubs get <hub_id>
288
+ delivery hubs create --name <n> [--address <a>] [--lat <lat>] [--lng <lng>]
289
+ delivery hubs update <hub_id> [--name <n>] [--address <a>]
290
+ delivery hubs delete <hub_id>
291
+ delivery notifications list
292
+ delivery notifications upsert --event <e> --enabled <bool> [--channel <c>]
293
+ delivery webhooks list
294
+ delivery webhooks create --name <n> --url <u> --topics <json-array>
295
+ delivery settings [get]
296
+ delivery settings update --body <json>
297
+ delivery analytics [summary] [--from <date>] [--to <date>]
298
+ delivery analytics drivers [--from <date>] [--to <date>]
299
+ delivery export orders [--from <date>] [--to <date>] [--format <json|csv>]
300
+
301
+ Commerce Commands:
302
+ commerce settings [get|update] [--body <json>]
303
+ commerce catalogs list|get|create|update|delete [args...]
304
+ commerce categories list|get|tree|create|update|delete [args...]
305
+ commerce products list|get|create|update|delete [args...]
306
+ commerce variants list|get|create|update|delete <product_id> [args...]
307
+ commerce inventory list|get|update|adjust [args...]
308
+ commerce customers list|get|create|update|delete [args...]
309
+ commerce customers addresses list|add|delete <customer_id> [args...]
310
+ commerce carts create|get|add-item|update-item|remove-item|apply-discount|remove-discount|checkout [args...]
311
+ commerce orders list|get|update|transition|events|delete [args...]
312
+ commerce payments list|get|create|transition <order_id> [args...]
313
+ commerce reviews list|get|create|transition|delete [args...]
314
+ commerce discounts list|get|create|update|delete|validate [args...]
315
+ commerce webhooks list|create [args...]
316
+ commerce analytics summary|top-products|revenue [--from <date>] [--to <date>]
317
+ commerce export orders|products|customers [--format <json|csv>]
318
+
319
+ Booking Commands:
320
+ booking settings [get|update] [--body <json>]
321
+ booking resources list|get|create|update|delete [args...]
322
+ booking resources set-availability <resource_id> --rules <json>
323
+ booking resources get-availability <resource_id>
324
+ booking resources slots <resource_id> --date <d> [--duration <min>]
325
+ booking bookings list|get|create|update|delete|transition|events [args...]
326
+ booking customers list|get|create|update|delete [args...]
327
+ booking blockers list|create|delete [args...]
328
+ booking webhooks list|create [args...]
329
+ booking analytics summary|by-resource|by-period [--from <date>] [--to <date>]
330
+ booking export bookings|customers|resources [--format <json|csv>]
331
+
332
+ Messaging Commands:
333
+ messaging settings [get|update] [--body <json>]
334
+ messaging conversations list|get|create|update|delete|archive|close|reopen [args...]
335
+ messaging participants list|add|update|remove <conversation_id> [args...]
336
+ messaging messages list|get|send|edit|delete <conversation_id> [args...]
337
+ messaging reactions add|remove <message_id> [args...]
338
+ messaging webhooks list|create [args...]
339
+ messaging analytics summary|by-conversation|by-period [--from <date>] [--to <date>]
340
+ messaging export conversations|messages [--format <json|csv>]
341
+
342
+ Orgs Commands:
343
+ orgs list
344
+ orgs create --name <n> [--slug <s>]
345
+ orgs get <org_id>
346
+ orgs update <org_id> [--name <n>] [--slug <s>]
347
+ orgs delete <org_id> --confirm-name <name>
348
+ orgs members <org_id>
349
+ orgs invite <org_id> --email <e> [--scopes <json>] [--project-id <id>]
350
+ orgs remove-member <org_id> <user_id>
351
+ orgs my-scopes <org_id>
352
+ orgs update-member-scopes <org_id> <user_id> --scopes <json>
353
+ orgs projects list <org_id>
354
+ orgs projects create <org_id> --name <n> [--region <r>]
355
+ orgs projects get <org_id> <project_id>
356
+ orgs projects delete <org_id> <project_id>
357
+ orgs tokens list <org_id> [--project-id <id>]
358
+ orgs tokens create <org_id> --name <n> --scopes <json> [--project-id <id>]
359
+ orgs tokens revoke <org_id> <token_id>
360
+
361
+ Meta Commands:
362
+ meta livez
363
+ meta readyz
364
+ meta healthz
365
+ meta openapi
366
+ meta skill
367
+ meta llms-txt
368
+ meta human-docs
369
+ meta robots-txt
370
+ meta sitemap-xml
371
+ meta landing
372
+ meta scalar-url
373
+ meta mcp-url
99
374
 
100
375
  Auth Commands:
101
376
  auth login
@@ -210,152 +485,1587 @@ async function executeNamespaceCommand(client, namespace, command, positional, f
210
485
  case "delivery":
211
486
  await handleDelivery(client, command, positional, flags);
212
487
  break;
488
+ case "locks":
489
+ await handleLocks(client, command, positional, flags);
490
+ break;
491
+ case "sketches":
492
+ await handleSketches(client, command, positional, flags);
493
+ break;
494
+ case "workflows":
495
+ await handleWorkflows(client, command, positional, flags);
496
+ break;
497
+ case "webhooks":
498
+ await handleWebhooks(client, command, positional, flags);
499
+ break;
500
+ case "media":
501
+ await handleMedia(client, command, positional, flags);
502
+ break;
503
+ case "search":
504
+ await handleSearch(client, command, positional, flags);
505
+ break;
506
+ case "matching":
507
+ await handleMatching(client, command, positional, flags);
508
+ break;
509
+ case "ranking":
510
+ await handleRanking(client, command, positional, flags);
511
+ break;
512
+ case "logistics":
513
+ await handleLogistics(client, command, positional, flags);
514
+ break;
515
+ case "commerce":
516
+ await handleCommerce(client, command, positional, flags);
517
+ break;
518
+ case "booking":
519
+ await handleBooking(client, command, positional, flags);
520
+ break;
521
+ case "messaging":
522
+ await handleMessaging(client, command, positional, flags);
523
+ break;
524
+ case "orgs":
525
+ await handleOrgs(client, command, positional, flags);
526
+ break;
527
+ case "meta":
528
+ await handleMeta(client, command, positional, flags);
529
+ break;
213
530
  default:
214
531
  console.error(`Unknown namespace: ${namespace}\n`);
215
532
  console.log(USAGE);
216
533
  process.exit(1);
217
534
  }
218
535
  }
219
- async function main() {
220
- const args = process.argv.slice(2);
221
- if (args.length === 0 || args[0] === "--help" || args[0] === "-h") {
222
- console.log(USAGE);
223
- process.exit(0);
536
+ async function handleLocks(client, cmd, pos, flags) {
537
+ switch (cmd) {
538
+ case "acquire":
539
+ out(await client.infra.locks.acquire(pos[0], {
540
+ ttl_ms: Number(flags["ttl-ms"]),
541
+ holder_id: flags["holder-id"],
542
+ }));
543
+ break;
544
+ case "release":
545
+ out(await client.infra.locks.release(pos[0], flags.token));
546
+ break;
547
+ case "renew":
548
+ out(await client.infra.locks.renew(pos[0], {
549
+ token: flags.token,
550
+ ttl_ms: Number(flags["ttl-ms"]),
551
+ }));
552
+ break;
553
+ case "status":
554
+ out(await client.infra.locks.status(pos[0]));
555
+ break;
556
+ default:
557
+ console.error(`Unknown locks command: ${cmd}`);
558
+ process.exit(1);
224
559
  }
225
- const [namespace, command, ...rest] = args;
226
- const { positional, flags } = parseArgs(rest);
227
- try {
228
- if (namespace === "auth") {
229
- await handleAuth(command);
230
- return;
231
- }
232
- const resolvedAuth = await resolveCliAuth();
233
- let client = new SaaSignalClient({ token: resolvedAuth.token, baseUrl: resolvedAuth.baseUrl });
234
- try {
235
- await executeNamespaceCommand(client, namespace, command, positional, flags);
560
+ }
561
+ async function handleSketches(client, cmd, pos, flags) {
562
+ switch (cmd) {
563
+ case "hll": {
564
+ const sub = pos[0];
565
+ switch (sub) {
566
+ case "add":
567
+ out(await client.infra.sketches.hll.add(pos[1], JSON.parse(flags.elements)));
568
+ break;
569
+ case "count":
570
+ out(await client.infra.sketches.hll.count(pos[1]));
571
+ break;
572
+ case "merge":
573
+ out(await client.infra.sketches.hll.merge(flags["dest-key"], JSON.parse(flags["source-keys"])));
574
+ break;
575
+ default:
576
+ console.error(`Unknown sketches hll command: ${sub}`);
577
+ process.exit(1);
578
+ }
579
+ break;
236
580
  }
237
- catch (error) {
238
- if (error instanceof SaaSignalError && error.status === 401 && resolvedAuth.profile) {
239
- const refreshedProfile = await refreshAuthProfile(resolvedAuth.profile);
240
- await saveAuthProfile(refreshedProfile);
241
- client = new SaaSignalClient({ token: refreshedProfile.access_token, baseUrl: resolvedAuth.baseUrl });
242
- await executeNamespaceCommand(client, namespace, command, positional, flags);
243
- return;
581
+ case "cms": {
582
+ const sub = pos[0];
583
+ switch (sub) {
584
+ case "increment":
585
+ out(await client.infra.sketches.cms.increment(pos[1], parseJsonFlag(flags, "elements")));
586
+ break;
587
+ case "estimate":
588
+ out(await client.infra.sketches.cms.estimate(pos[1], flags.item));
589
+ break;
590
+ default:
591
+ console.error(`Unknown sketches cms command: ${sub}`);
592
+ process.exit(1);
244
593
  }
245
- throw error;
594
+ break;
246
595
  }
596
+ default:
597
+ console.error(`Unknown sketches command: ${cmd}`);
598
+ process.exit(1);
247
599
  }
248
- catch (e) {
249
- if (e instanceof SaaSignalError) {
250
- console.error(JSON.stringify({ error: e.code, message: e.message, status: e.status }, null, 2));
600
+ }
601
+ async function handleWorkflows(client, cmd, pos, flags) {
602
+ switch (cmd) {
603
+ case "create-blueprint":
604
+ out(await client.infra.workflows.createBlueprint(parseJsonFlag(flags)));
605
+ break;
606
+ case "list-blueprints":
607
+ out(await client.infra.workflows.listBlueprints({
608
+ limit: flags.limit ? Number(flags.limit) : undefined,
609
+ cursor: flags.cursor,
610
+ }));
611
+ break;
612
+ case "trigger":
613
+ out(await client.infra.workflows.trigger(pos[0], {
614
+ input_data: flags["input-data"] ? JSON.parse(flags["input-data"]) : undefined,
615
+ idempotency_key: flags["idempotency-key"],
616
+ }));
617
+ break;
618
+ case "get-execution":
619
+ out(await client.infra.workflows.getExecution(pos[0]));
620
+ break;
621
+ case "cancel":
622
+ out(await client.infra.workflows.cancel(pos[0]));
623
+ break;
624
+ case "resume":
625
+ out(await client.infra.workflows.resume(pos[0], {
626
+ step_id: flags["step-id"],
627
+ override_output: flags["override-output"] ? JSON.parse(flags["override-output"]) : undefined,
628
+ }));
629
+ break;
630
+ default:
631
+ console.error(`Unknown workflows command: ${cmd}`);
251
632
  process.exit(1);
252
- return;
253
- }
254
- console.error(`Error: ${e.message}`);
255
- process.exit(1);
256
633
  }
257
634
  }
258
- async function handleKv(client, cmd, pos, flags) {
635
+ async function handleWebhooks(client, cmd, pos, flags) {
259
636
  switch (cmd) {
637
+ case "create":
638
+ out(await client.infra.webhooks.create({
639
+ name: flags.name,
640
+ url: flags.url,
641
+ topics: JSON.parse(flags.topics),
642
+ secret: flags.secret,
643
+ enabled: flags.enabled !== undefined ? flags.enabled === "true" : undefined,
644
+ }));
645
+ break;
646
+ case "list":
647
+ out(await client.infra.webhooks.list({
648
+ limit: flags.limit ? Number(flags.limit) : undefined,
649
+ cursor: flags.cursor,
650
+ enabled: flags.enabled !== undefined ? flags.enabled === "true" : undefined,
651
+ }));
652
+ break;
260
653
  case "get":
261
- out(await client.infra.kv.get(pos[0]));
654
+ out(await client.infra.webhooks.get(pos[0]));
262
655
  break;
263
- case "set": {
264
- const value = JSON.parse(pos[1]);
265
- out(await client.infra.kv.set(pos[0], value, {
266
- ttl: flags.ttl ? Number(flags.ttl) : undefined,
267
- if_not_exists: flags.nx === "true",
656
+ case "update":
657
+ out(await client.infra.webhooks.update(pos[0], {
658
+ name: flags.name,
659
+ url: flags.url,
660
+ topics: flags.topics ? JSON.parse(flags.topics) : undefined,
661
+ secret: flags.secret,
662
+ enabled: flags.enabled !== undefined ? flags.enabled === "true" : undefined,
268
663
  }));
269
664
  break;
270
- }
271
665
  case "delete":
272
- await client.infra.kv.delete(pos[0]);
666
+ await client.infra.webhooks.delete(pos[0]);
273
667
  console.log("Deleted");
274
668
  break;
275
- case "increment":
276
- out(await client.infra.kv.increment(pos[0], flags.delta ? Number(flags.delta) : 1, flags.ttl ? Number(flags.ttl) : undefined));
669
+ case "test":
670
+ out(await client.infra.webhooks.test(pos[0]));
277
671
  break;
278
- case "scan":
279
- out(await client.infra.kv.scan({
280
- prefix: flags.prefix,
672
+ case "deliveries":
673
+ out(await client.infra.webhooks.listDeliveries(pos[0], {
281
674
  limit: flags.limit ? Number(flags.limit) : undefined,
282
675
  cursor: flags.cursor,
283
676
  }));
284
677
  break;
678
+ case "retry-delivery":
679
+ out(await client.infra.webhooks.retryDelivery(pos[0], pos[1]));
680
+ break;
681
+ case "publish":
682
+ out(await client.infra.webhooks.publish(flags.topic, flags.data ? JSON.parse(flags.data) : {}));
683
+ break;
285
684
  default:
286
- console.error(`Unknown kv command: ${cmd}`);
685
+ console.error(`Unknown webhooks command: ${cmd}`);
287
686
  process.exit(1);
288
687
  }
289
688
  }
290
- async function handleChannels(client, cmd, pos, flags) {
689
+ async function handleMedia(client, cmd, pos, flags) {
291
690
  switch (cmd) {
292
- case "publish":
293
- out(await client.infra.channels.publish(pos[0], pos[1], JSON.parse(pos[2])));
691
+ case "upload": {
692
+ const filePath = pos[0];
693
+ const fileData = await (await import("node:fs/promises")).readFile(filePath);
694
+ const data = fileData.buffer.slice(fileData.byteOffset, fileData.byteOffset + fileData.byteLength);
695
+ const filename = filePath.split("/").pop() ?? filePath;
696
+ out(await client.infra.media.upload(filename, data, {
697
+ contentType: flags["content-type"],
698
+ visibility: flags.visibility,
699
+ }));
294
700
  break;
295
- case "presence":
296
- out(await client.infra.channels.presence(pos[0]));
701
+ }
702
+ case "upload-url":
703
+ out(await client.infra.media.uploadFromUrl(flags.url, {
704
+ filename: flags.filename,
705
+ visibility: flags.visibility,
706
+ }));
297
707
  break;
298
- case "history":
299
- out(await client.infra.channels.history(pos[0], { limit: flags.limit ? Number(flags.limit) : undefined }));
708
+ case "list":
709
+ out(await client.infra.media.list({
710
+ limit: flags.limit ? Number(flags.limit) : undefined,
711
+ cursor: flags.cursor,
712
+ media_type: flags["media-type"],
713
+ }));
714
+ break;
715
+ case "get":
716
+ out(await client.infra.media.get(pos[0]));
717
+ break;
718
+ case "delete":
719
+ await client.infra.media.delete(pos[0]);
720
+ console.log("Deleted");
721
+ break;
722
+ case "transform-image":
723
+ out(await client.infra.media.transformImage(pos[0], parseJsonFlag(flags)));
724
+ break;
725
+ case "encode-video":
726
+ out(await client.infra.media.encodeVideo(pos[0], parseJsonFlag(flags)));
727
+ break;
728
+ case "list-variants":
729
+ out(await client.infra.media.listVariants(pos[0]));
300
730
  break;
301
731
  default:
302
- console.error(`Unknown channels command: ${cmd}`);
732
+ console.error(`Unknown media command: ${cmd}`);
303
733
  process.exit(1);
304
734
  }
305
735
  }
306
- async function handleJobs(client, cmd, pos, flags) {
736
+ async function handleSearch(client, cmd, pos, flags) {
307
737
  switch (cmd) {
308
- case "create":
309
- out(await client.infra.jobs.create({
310
- name: pos[0],
311
- trigger: {
312
- type: flags.trigger,
313
- queue: flags.queue,
314
- schedule: flags.cron,
315
- delay_seconds: flags.delay ? Number(flags.delay) : undefined,
316
- },
317
- payload: flags.payload ? JSON.parse(flags.payload) : undefined,
318
- handler: flags.handler,
319
- max_attempts: flags["max-attempts"] ? Number(flags["max-attempts"]) : undefined,
320
- backoff: flags.backoff,
321
- }));
738
+ case "create-index":
739
+ out(await client.infra.decisioning.search.createIndex(parseJsonFlag(flags)));
322
740
  break;
323
- case "list":
324
- out(await client.infra.jobs.list({
325
- status: flags.status,
326
- trigger_type: flags["trigger-type"],
327
- queue: flags.queue,
741
+ case "list-indexes":
742
+ out(await client.infra.decisioning.search.listIndexes());
743
+ break;
744
+ case "get-index":
745
+ out(await client.infra.decisioning.search.getIndex(pos[0]));
746
+ break;
747
+ case "update-index":
748
+ out(await client.infra.decisioning.search.updateIndex(pos[0], parseJsonFlag(flags)));
749
+ break;
750
+ case "delete-index":
751
+ await client.infra.decisioning.search.deleteIndex(pos[0]);
752
+ console.log("Deleted");
753
+ break;
754
+ case "upsert-docs":
755
+ out(await client.infra.decisioning.search.upsertDocuments(pos[0], parseJsonFlag(flags)));
756
+ break;
757
+ case "list-docs":
758
+ out(await client.infra.decisioning.search.listDocuments(pos[0]));
759
+ break;
760
+ case "get-doc":
761
+ out(await client.infra.decisioning.search.getDocument(pos[0], pos[1]));
762
+ break;
763
+ case "delete-doc":
764
+ await client.infra.decisioning.search.deleteDocument(pos[0], pos[1]);
765
+ console.log("Deleted");
766
+ break;
767
+ case "query":
768
+ out(await client.infra.decisioning.search.query(pos[0], parseJsonFlag(flags)));
769
+ break;
770
+ case "suggest":
771
+ out(await client.infra.decisioning.search.suggest(pos[0], {
772
+ prefix: flags.prefix,
328
773
  limit: flags.limit ? Number(flags.limit) : undefined,
329
774
  }));
330
775
  break;
331
- case "get":
332
- out(await client.infra.jobs.get(pos[0]));
776
+ case "stats":
777
+ out(await client.infra.decisioning.search.stats(pos[0]));
333
778
  break;
334
- case "cancel":
335
- out(await client.infra.jobs.cancel(pos[0]));
779
+ case "rebuild":
780
+ out(await client.infra.decisioning.search.rebuild(pos[0], {
781
+ async: flags.async === "true",
782
+ }));
336
783
  break;
337
- case "trigger":
338
- out(await client.infra.jobs.trigger(pos[0]));
784
+ default:
785
+ console.error(`Unknown search command: ${cmd}`);
786
+ process.exit(1);
787
+ }
788
+ }
789
+ async function handleMatching(client, cmd, pos, flags) {
790
+ switch (cmd) {
791
+ case "create-operation":
792
+ out(await client.infra.decisioning.matching.createOperation(parseJsonFlag(flags)));
339
793
  break;
340
- case "retry":
341
- out(await client.infra.jobs.retry(pos[0]));
794
+ case "batch-operation":
795
+ out(await client.infra.decisioning.matching.createBatchOperation(parseJsonFlag(flags)));
342
796
  break;
343
- case "runs":
344
- out(await client.infra.jobs.runs(pos[0], { limit: flags.limit ? Number(flags.limit) : undefined }));
797
+ case "get-operation":
798
+ out(await client.infra.decisioning.matching.getOperation(pos[0]));
345
799
  break;
346
- case "claim":
347
- out(await client.infra.jobs.claim(pos[0], {
348
- count: flags.count ? Number(flags.count) : undefined,
349
- visibility_timeout: flags.timeout ? Number(flags.timeout) : undefined,
350
- }));
800
+ case "cancel-operation":
801
+ out(await client.infra.decisioning.matching.cancelOperation(pos[0]));
351
802
  break;
352
- case "ack":
353
- out(await client.infra.jobs.ack(pos[0], {
354
- status: flags.status,
355
- result: flags.result ? JSON.parse(flags.result) : undefined,
356
- error: flags.error,
803
+ case "create-template":
804
+ out(await client.infra.decisioning.matching.createTemplate(parseJsonFlag(flags)));
805
+ break;
806
+ case "list-templates":
807
+ out(await client.infra.decisioning.matching.listTemplates());
808
+ break;
809
+ case "get-template":
810
+ out(await client.infra.decisioning.matching.getTemplate(pos[0]));
811
+ break;
812
+ case "update-template":
813
+ out(await client.infra.decisioning.matching.updateTemplate(pos[0], parseJsonFlag(flags)));
814
+ break;
815
+ case "delete-template":
816
+ await client.infra.decisioning.matching.deleteTemplate(pos[0]);
817
+ console.log("Deleted");
818
+ break;
819
+ case "template-operation":
820
+ out(await client.infra.decisioning.matching.createTemplateOperation(pos[0], flags.body ? parseJsonFlag(flags) : undefined));
821
+ break;
822
+ default:
823
+ console.error(`Unknown matching command: ${cmd}`);
824
+ process.exit(1);
825
+ }
826
+ }
827
+ async function handleRanking(client, cmd, pos, flags) {
828
+ switch (cmd) {
829
+ case "create-collection":
830
+ out(await client.infra.decisioning.ranking.createCollection(parseJsonFlag(flags)));
831
+ break;
832
+ case "list-collections":
833
+ out(await client.infra.decisioning.ranking.listCollections());
834
+ break;
835
+ case "get-collection":
836
+ out(await client.infra.decisioning.ranking.getCollection(pos[0]));
837
+ break;
838
+ case "update-collection":
839
+ out(await client.infra.decisioning.ranking.updateCollection(pos[0], parseJsonFlag(flags)));
840
+ break;
841
+ case "delete-collection":
842
+ await client.infra.decisioning.ranking.deleteCollection(pos[0]);
843
+ console.log("Deleted");
844
+ break;
845
+ case "upsert-items":
846
+ out(await client.infra.decisioning.ranking.upsertItems(pos[0], parseJsonFlag(flags)));
847
+ break;
848
+ case "list-items":
849
+ out(await client.infra.decisioning.ranking.listItems(pos[0]));
850
+ break;
851
+ case "get-item":
852
+ out(await client.infra.decisioning.ranking.getItem(pos[0], pos[1]));
853
+ break;
854
+ case "delete-item":
855
+ await client.infra.decisioning.ranking.deleteItem(pos[0], pos[1]);
856
+ console.log("Deleted");
857
+ break;
858
+ case "ingest-signals":
859
+ out(await client.infra.decisioning.ranking.ingestSignals(pos[0], parseJsonFlag(flags)));
860
+ break;
861
+ case "rank":
862
+ out(await client.infra.decisioning.ranking.rank(pos[0], parseJsonFlag(flags)));
863
+ break;
864
+ case "related":
865
+ out(await client.infra.decisioning.ranking.related(pos[0], parseJsonFlag(flags)));
866
+ break;
867
+ case "stats":
868
+ out(await client.infra.decisioning.ranking.stats(pos[0]));
869
+ break;
870
+ default:
871
+ console.error(`Unknown ranking command: ${cmd}`);
872
+ process.exit(1);
873
+ }
874
+ }
875
+ async function handleLogistics(client, cmd, pos, flags) {
876
+ switch (cmd) {
877
+ case "geo": {
878
+ const sub = pos[0];
879
+ switch (sub) {
880
+ case "create":
881
+ out(await client.logistics.geo.create(parseJsonFlag(flags)));
882
+ break;
883
+ case "list":
884
+ out(await client.logistics.geo.list({
885
+ type: flags.type,
886
+ status: flags.status,
887
+ limit: flags.limit ? Number(flags.limit) : undefined,
888
+ cursor: flags.cursor,
889
+ }));
890
+ break;
891
+ case "nearby":
892
+ out(await client.logistics.geo.nearby({
893
+ lat: Number(flags.lat),
894
+ lng: Number(flags.lng),
895
+ radius_km: flags["radius-km"] ? Number(flags["radius-km"]) : undefined,
896
+ type: flags.type,
897
+ status: flags.status,
898
+ limit: flags.limit ? Number(flags.limit) : undefined,
899
+ }));
900
+ break;
901
+ case "get":
902
+ out(await client.logistics.geo.get(pos[1]));
903
+ break;
904
+ case "update":
905
+ out(await client.logistics.geo.update(pos[1], parseJsonFlag(flags)));
906
+ break;
907
+ case "deactivate":
908
+ out(await client.logistics.geo.deactivate(pos[1]));
909
+ break;
910
+ default:
911
+ console.error(`Unknown logistics geo command: ${sub}`);
912
+ process.exit(1);
913
+ }
914
+ break;
915
+ }
916
+ case "geofences": {
917
+ const sub = pos[0];
918
+ switch (sub) {
919
+ case "create":
920
+ out(await client.logistics.geofences.create(parseJsonFlag(flags)));
921
+ break;
922
+ case "list":
923
+ out(await client.logistics.geofences.list({
924
+ enabled: flags.enabled !== undefined ? flags.enabled === "true" : undefined,
925
+ limit: flags.limit ? Number(flags.limit) : undefined,
926
+ cursor: flags.cursor,
927
+ }));
928
+ break;
929
+ case "get":
930
+ out(await client.logistics.geofences.get(pos[1]));
931
+ break;
932
+ case "delete":
933
+ out(await client.logistics.geofences.delete(pos[1]));
934
+ break;
935
+ default:
936
+ console.error(`Unknown logistics geofences command: ${sub}`);
937
+ process.exit(1);
938
+ }
939
+ break;
940
+ }
941
+ case "eta-fences": {
942
+ const sub = pos[0];
943
+ switch (sub) {
944
+ case "create":
945
+ out(await client.logistics.etaFences.create({
946
+ name: flags.name,
947
+ dest_lat: Number(flags["dest-lat"]),
948
+ dest_lng: Number(flags["dest-lng"]),
949
+ threshold_min: Number(flags.threshold),
950
+ avg_speed_kmh: flags["avg-speed"] ? Number(flags["avg-speed"]) : undefined,
951
+ }));
952
+ break;
953
+ case "list":
954
+ out(await client.logistics.etaFences.list({
955
+ enabled: flags.enabled !== undefined ? flags.enabled === "true" : undefined,
956
+ limit: flags.limit ? Number(flags.limit) : undefined,
957
+ cursor: flags.cursor,
958
+ }));
959
+ break;
960
+ case "get":
961
+ out(await client.logistics.etaFences.get(pos[1]));
962
+ break;
963
+ case "delete":
964
+ out(await client.logistics.etaFences.delete(pos[1]));
965
+ break;
966
+ default:
967
+ console.error(`Unknown logistics eta-fences command: ${sub}`);
968
+ process.exit(1);
969
+ }
970
+ break;
971
+ }
972
+ case "tracking": {
973
+ const sub = pos[0];
974
+ switch (sub) {
975
+ case "ping":
976
+ out(await client.logistics.tracking.ping(pos[1], {
977
+ lat: Number(flags.lat),
978
+ lng: Number(flags.lng),
979
+ heading: flags.heading ? Number(flags.heading) : undefined,
980
+ speed: flags.speed ? Number(flags.speed) : undefined,
981
+ accuracy: flags.accuracy ? Number(flags.accuracy) : undefined,
982
+ }));
983
+ break;
984
+ case "batch-ping":
985
+ out(await client.logistics.tracking.batchPing(pos[1], parseJsonFlag(flags, "pings")));
986
+ break;
987
+ case "history":
988
+ out(await client.logistics.tracking.history(pos[1], {
989
+ limit: flags.limit ? Number(flags.limit) : undefined,
990
+ cursor: flags.cursor,
991
+ }));
992
+ break;
993
+ default:
994
+ console.error(`Unknown logistics tracking command: ${sub}`);
995
+ process.exit(1);
996
+ }
997
+ break;
998
+ }
999
+ case "routing": {
1000
+ const sub = pos[0];
1001
+ switch (sub) {
1002
+ case "route":
1003
+ out(await client.logistics.routing.route({ lat: Number(flags["origin-lat"]), lng: Number(flags["origin-lng"]) }, { lat: Number(flags["dest-lat"]), lng: Number(flags["dest-lng"]) }, flags.waypoints ? JSON.parse(flags.waypoints) : undefined));
1004
+ break;
1005
+ case "optimize":
1006
+ out(await client.logistics.routing.optimize({ lat: Number(flags["origin-lat"]), lng: Number(flags["origin-lng"]) }, parseJsonFlag(flags, "stops"), flags["dest-lat"] ? { lat: Number(flags["dest-lat"]), lng: Number(flags["dest-lng"]) } : undefined));
1007
+ break;
1008
+ case "distance-matrix":
1009
+ out(await client.logistics.routing.distanceMatrix(parseJsonFlag(flags, "origins"), parseJsonFlag(flags, "destinations")));
1010
+ break;
1011
+ case "dispatch":
1012
+ out(await client.logistics.routing.dispatch(parseJsonFlag(flags, "agents"), parseJsonFlag(flags, "tasks")));
1013
+ break;
1014
+ case "isochrone":
1015
+ out(await client.logistics.routing.isochrone({ lat: Number(flags["origin-lat"]), lng: Number(flags["origin-lng"]) }, JSON.parse(flags.minutes), flags.profile));
1016
+ break;
1017
+ case "snap":
1018
+ out(await client.logistics.routing.snap(parseJsonFlag(flags, "pings"), flags.profile));
1019
+ break;
1020
+ default:
1021
+ console.error(`Unknown logistics routing command: ${sub}`);
1022
+ process.exit(1);
1023
+ }
1024
+ break;
1025
+ }
1026
+ case "geocoding": {
1027
+ const sub = pos[0];
1028
+ switch (sub) {
1029
+ case "forward":
1030
+ out(await client.logistics.geocoding.forward(flags.q ?? pos[1], {
1031
+ limit: flags.limit ? Number(flags.limit) : undefined,
1032
+ country: flags.country,
1033
+ bbox: flags.bbox,
1034
+ }));
1035
+ break;
1036
+ case "reverse":
1037
+ out(await client.logistics.geocoding.reverse(Number(flags.lat), Number(flags.lng)));
1038
+ break;
1039
+ case "autocomplete":
1040
+ out(await client.logistics.geocoding.autocomplete(flags.q ?? pos[1], {
1041
+ limit: flags.limit ? Number(flags.limit) : undefined,
1042
+ country: flags.country,
1043
+ language: flags.language,
1044
+ }));
1045
+ break;
1046
+ default:
1047
+ console.error(`Unknown logistics geocoding command: ${sub}`);
1048
+ process.exit(1);
1049
+ }
1050
+ break;
1051
+ }
1052
+ default:
1053
+ console.error(`Unknown logistics command: ${cmd}`);
1054
+ process.exit(1);
1055
+ }
1056
+ }
1057
+ async function handleCommerce(client, cmd, pos, flags) {
1058
+ switch (cmd) {
1059
+ case "settings": {
1060
+ const sub = pos[0];
1061
+ if (!sub || sub === "get") {
1062
+ out(await client.commerce.settings.get());
1063
+ }
1064
+ else if (sub === "update") {
1065
+ out(await client.commerce.settings.update(parseJsonFlag(flags)));
1066
+ }
1067
+ else {
1068
+ console.error(`Unknown commerce settings command: ${sub}`);
1069
+ process.exit(1);
1070
+ }
1071
+ break;
1072
+ }
1073
+ case "catalogs": {
1074
+ const sub = pos[0];
1075
+ switch (sub) {
1076
+ case "list":
1077
+ out(await client.commerce.catalogs.list({ limit: flags.limit ? Number(flags.limit) : undefined, cursor: flags.cursor }));
1078
+ break;
1079
+ case "get":
1080
+ out(await client.commerce.catalogs.get(pos[1]));
1081
+ break;
1082
+ case "create":
1083
+ out(await client.commerce.catalogs.create({ name: flags.name, description: flags.description, metadata: flags.metadata ? JSON.parse(flags.metadata) : undefined }));
1084
+ break;
1085
+ case "update":
1086
+ out(await client.commerce.catalogs.update(pos[1], { name: flags.name, description: flags.description, metadata: flags.metadata ? JSON.parse(flags.metadata) : undefined }));
1087
+ break;
1088
+ case "delete":
1089
+ await client.commerce.catalogs.delete(pos[1]);
1090
+ console.log("Deleted");
1091
+ break;
1092
+ default:
1093
+ console.error(`Unknown commerce catalogs command: ${sub}`);
1094
+ process.exit(1);
1095
+ }
1096
+ break;
1097
+ }
1098
+ case "categories": {
1099
+ const sub = pos[0];
1100
+ switch (sub) {
1101
+ case "list":
1102
+ out(await client.commerce.categories.list({ catalog_id: flags["catalog-id"], parent_id: flags["parent-id"], limit: flags.limit ? Number(flags.limit) : undefined }));
1103
+ break;
1104
+ case "get":
1105
+ out(await client.commerce.categories.get(pos[1]));
1106
+ break;
1107
+ case "tree":
1108
+ out(await client.commerce.categories.getTree(pos[1]));
1109
+ break;
1110
+ case "create":
1111
+ out(await client.commerce.categories.create(parseJsonFlag(flags)));
1112
+ break;
1113
+ case "update":
1114
+ out(await client.commerce.categories.update(pos[1], parseJsonFlag(flags)));
1115
+ break;
1116
+ case "delete":
1117
+ await client.commerce.categories.delete(pos[1]);
1118
+ console.log("Deleted");
1119
+ break;
1120
+ default:
1121
+ console.error(`Unknown commerce categories command: ${sub}`);
1122
+ process.exit(1);
1123
+ }
1124
+ break;
1125
+ }
1126
+ case "products": {
1127
+ const sub = pos[0];
1128
+ switch (sub) {
1129
+ case "list":
1130
+ out(await client.commerce.products.list({ catalog_id: flags["catalog-id"], category_id: flags["category-id"], status: flags.status, tag: flags.tag, limit: flags.limit ? Number(flags.limit) : undefined }));
1131
+ break;
1132
+ case "get":
1133
+ out(await client.commerce.products.get(pos[1]));
1134
+ break;
1135
+ case "create":
1136
+ out(await client.commerce.products.create(parseJsonFlag(flags)));
1137
+ break;
1138
+ case "update":
1139
+ out(await client.commerce.products.update(pos[1], parseJsonFlag(flags)));
1140
+ break;
1141
+ case "delete":
1142
+ await client.commerce.products.delete(pos[1]);
1143
+ console.log("Deleted");
1144
+ break;
1145
+ default:
1146
+ console.error(`Unknown commerce products command: ${sub}`);
1147
+ process.exit(1);
1148
+ }
1149
+ break;
1150
+ }
1151
+ case "variants": {
1152
+ const sub = pos[0];
1153
+ switch (sub) {
1154
+ case "list":
1155
+ out(await client.commerce.variants.list(pos[1]));
1156
+ break;
1157
+ case "get":
1158
+ out(await client.commerce.variants.get(pos[1], pos[2]));
1159
+ break;
1160
+ case "create":
1161
+ out(await client.commerce.variants.create(pos[1], parseJsonFlag(flags)));
1162
+ break;
1163
+ case "update":
1164
+ out(await client.commerce.variants.update(pos[1], pos[2], parseJsonFlag(flags)));
1165
+ break;
1166
+ case "delete":
1167
+ await client.commerce.variants.delete(pos[1], pos[2]);
1168
+ console.log("Deleted");
1169
+ break;
1170
+ default:
1171
+ console.error(`Unknown commerce variants command: ${sub}`);
1172
+ process.exit(1);
1173
+ }
1174
+ break;
1175
+ }
1176
+ case "inventory": {
1177
+ const sub = pos[0];
1178
+ switch (sub) {
1179
+ case "list":
1180
+ out(await client.commerce.inventory.list({ product_id: flags["product-id"], variant_id: flags["variant-id"], location: flags.location, limit: flags.limit ? Number(flags.limit) : undefined }));
1181
+ break;
1182
+ case "get":
1183
+ out(await client.commerce.inventory.get(pos[1]));
1184
+ break;
1185
+ case "update":
1186
+ out(await client.commerce.inventory.update(pos[1], parseJsonFlag(flags)));
1187
+ break;
1188
+ case "adjust":
1189
+ out(await client.commerce.inventory.adjust(pos[1], { adjustment: Number(flags.adjustment), reason: flags.reason }));
1190
+ break;
1191
+ default:
1192
+ console.error(`Unknown commerce inventory command: ${sub}`);
1193
+ process.exit(1);
1194
+ }
1195
+ break;
1196
+ }
1197
+ case "customers": {
1198
+ const sub = pos[0];
1199
+ switch (sub) {
1200
+ case "list":
1201
+ out(await client.commerce.customers.list({ limit: flags.limit ? Number(flags.limit) : undefined }));
1202
+ break;
1203
+ case "get":
1204
+ out(await client.commerce.customers.get(pos[1]));
1205
+ break;
1206
+ case "create":
1207
+ out(await client.commerce.customers.create({ name: flags.name, external_id: flags["external-id"], email: flags.email, phone: flags.phone, metadata: flags.metadata ? JSON.parse(flags.metadata) : undefined }));
1208
+ break;
1209
+ case "update":
1210
+ out(await client.commerce.customers.update(pos[1], { name: flags.name, external_id: flags["external-id"], email: flags.email, phone: flags.phone, metadata: flags.metadata ? JSON.parse(flags.metadata) : undefined }));
1211
+ break;
1212
+ case "delete":
1213
+ await client.commerce.customers.delete(pos[1]);
1214
+ console.log("Deleted");
1215
+ break;
1216
+ case "addresses": {
1217
+ const addrCmd = pos[1];
1218
+ switch (addrCmd) {
1219
+ case "list":
1220
+ out(await client.commerce.customers.listAddresses(pos[2]));
1221
+ break;
1222
+ case "add":
1223
+ out(await client.commerce.customers.addAddress(pos[2], parseJsonFlag(flags)));
1224
+ break;
1225
+ case "delete":
1226
+ await client.commerce.customers.deleteAddress(pos[2], pos[3]);
1227
+ console.log("Deleted");
1228
+ break;
1229
+ default:
1230
+ console.error(`Unknown commerce customers addresses command: ${addrCmd}`);
1231
+ process.exit(1);
1232
+ }
1233
+ break;
1234
+ }
1235
+ default:
1236
+ console.error(`Unknown commerce customers command: ${sub}`);
1237
+ process.exit(1);
1238
+ }
1239
+ break;
1240
+ }
1241
+ case "carts": {
1242
+ const sub = pos[0];
1243
+ switch (sub) {
1244
+ case "create":
1245
+ out(await client.commerce.carts.create({ customer_id: flags["customer-id"], currency: flags.currency, metadata: flags.metadata ? JSON.parse(flags.metadata) : undefined }));
1246
+ break;
1247
+ case "get":
1248
+ out(await client.commerce.carts.get(pos[1]));
1249
+ break;
1250
+ case "add-item":
1251
+ out(await client.commerce.carts.addItem(pos[1], { product_id: flags["product-id"], variant_id: flags["variant-id"], quantity: Number(flags.quantity) }));
1252
+ break;
1253
+ case "update-item":
1254
+ out(await client.commerce.carts.updateItem(pos[1], pos[2], { quantity: Number(flags.quantity) }));
1255
+ break;
1256
+ case "remove-item":
1257
+ out(await client.commerce.carts.removeItem(pos[1], pos[2]));
1258
+ break;
1259
+ case "apply-discount":
1260
+ out(await client.commerce.carts.applyDiscount(pos[1], { code: flags.code }));
1261
+ break;
1262
+ case "remove-discount":
1263
+ out(await client.commerce.carts.removeDiscount(pos[1]));
1264
+ break;
1265
+ case "checkout":
1266
+ out(await client.commerce.carts.checkout(pos[1], flags.body ? parseJsonFlag(flags) : {}));
1267
+ break;
1268
+ default:
1269
+ console.error(`Unknown commerce carts command: ${sub}`);
1270
+ process.exit(1);
1271
+ }
1272
+ break;
1273
+ }
1274
+ case "orders": {
1275
+ const sub = pos[0];
1276
+ switch (sub) {
1277
+ case "list":
1278
+ out(await client.commerce.orders.list({ status: flags.status, customer_id: flags["customer-id"], limit: flags.limit ? Number(flags.limit) : undefined }));
1279
+ break;
1280
+ case "get":
1281
+ out(await client.commerce.orders.get(pos[1]));
1282
+ break;
1283
+ case "update":
1284
+ out(await client.commerce.orders.update(pos[1], parseJsonFlag(flags)));
1285
+ break;
1286
+ case "transition":
1287
+ out(await client.commerce.orders.transition(pos[1], { status: flags.status, reason: flags.reason, actor: flags.actor }));
1288
+ break;
1289
+ case "events":
1290
+ out(await client.commerce.orders.getEvents(pos[1]));
1291
+ break;
1292
+ case "delete":
1293
+ await client.commerce.orders.delete(pos[1]);
1294
+ console.log("Deleted");
1295
+ break;
1296
+ default:
1297
+ console.error(`Unknown commerce orders command: ${sub}`);
1298
+ process.exit(1);
1299
+ }
1300
+ break;
1301
+ }
1302
+ case "payments": {
1303
+ const sub = pos[0];
1304
+ switch (sub) {
1305
+ case "list":
1306
+ out(await client.commerce.payments.list(pos[1]));
1307
+ break;
1308
+ case "get":
1309
+ out(await client.commerce.payments.get(pos[1], pos[2]));
1310
+ break;
1311
+ case "create":
1312
+ out(await client.commerce.payments.create(pos[1], parseJsonFlag(flags)));
1313
+ break;
1314
+ case "transition":
1315
+ out(await client.commerce.payments.transition(pos[1], pos[2], { status: flags.status, reason: flags.reason }));
1316
+ break;
1317
+ default:
1318
+ console.error(`Unknown commerce payments command: ${sub}`);
1319
+ process.exit(1);
1320
+ }
1321
+ break;
1322
+ }
1323
+ case "reviews": {
1324
+ const sub = pos[0];
1325
+ switch (sub) {
1326
+ case "list":
1327
+ out(await client.commerce.reviews.list({ product_id: flags["product-id"], customer_id: flags["customer-id"], status: flags.status, limit: flags.limit ? Number(flags.limit) : undefined }));
1328
+ break;
1329
+ case "get":
1330
+ out(await client.commerce.reviews.get(pos[1]));
1331
+ break;
1332
+ case "create":
1333
+ out(await client.commerce.reviews.create(parseJsonFlag(flags)));
1334
+ break;
1335
+ case "transition":
1336
+ out(await client.commerce.reviews.transition(pos[1], { status: flags.status, reason: flags.reason }));
1337
+ break;
1338
+ case "delete":
1339
+ await client.commerce.reviews.delete(pos[1]);
1340
+ console.log("Deleted");
1341
+ break;
1342
+ default:
1343
+ console.error(`Unknown commerce reviews command: ${sub}`);
1344
+ process.exit(1);
1345
+ }
1346
+ break;
1347
+ }
1348
+ case "discounts": {
1349
+ const sub = pos[0];
1350
+ switch (sub) {
1351
+ case "list":
1352
+ out(await client.commerce.discounts.list({ enabled: flags.enabled !== undefined ? flags.enabled === "true" : undefined, limit: flags.limit ? Number(flags.limit) : undefined }));
1353
+ break;
1354
+ case "get":
1355
+ out(await client.commerce.discounts.get(pos[1]));
1356
+ break;
1357
+ case "create":
1358
+ out(await client.commerce.discounts.create(parseJsonFlag(flags)));
1359
+ break;
1360
+ case "update":
1361
+ out(await client.commerce.discounts.update(pos[1], parseJsonFlag(flags)));
1362
+ break;
1363
+ case "delete":
1364
+ await client.commerce.discounts.delete(pos[1]);
1365
+ console.log("Deleted");
1366
+ break;
1367
+ case "validate":
1368
+ out(await client.commerce.discounts.validate({ code: flags.code, order_amount: flags["order-amount"] ? Number(flags["order-amount"]) : undefined }));
1369
+ break;
1370
+ default:
1371
+ console.error(`Unknown commerce discounts command: ${sub}`);
1372
+ process.exit(1);
1373
+ }
1374
+ break;
1375
+ }
1376
+ case "webhooks": {
1377
+ const sub = pos[0];
1378
+ switch (sub) {
1379
+ case "list":
1380
+ out(await client.commerce.webhooks.list());
1381
+ break;
1382
+ case "create":
1383
+ out(await client.commerce.webhooks.create({ name: flags.name, url: flags.url, topics: JSON.parse(flags.topics), secret: flags.secret }));
1384
+ break;
1385
+ default:
1386
+ console.error(`Unknown commerce webhooks command: ${sub}`);
1387
+ process.exit(1);
1388
+ }
1389
+ break;
1390
+ }
1391
+ case "analytics": {
1392
+ const sub = pos[0];
1393
+ switch (sub) {
1394
+ case "summary":
1395
+ out(await client.commerce.analytics.summary({ from: flags.from, to: flags.to }));
1396
+ break;
1397
+ case "top-products":
1398
+ out(await client.commerce.analytics.topProducts({ from: flags.from, to: flags.to, limit: flags.limit ? Number(flags.limit) : undefined }));
1399
+ break;
1400
+ case "revenue":
1401
+ out(await client.commerce.analytics.revenue({ from: flags.from, to: flags.to, granularity: flags.granularity }));
1402
+ break;
1403
+ default:
1404
+ console.error(`Unknown commerce analytics command: ${sub}`);
1405
+ process.exit(1);
1406
+ }
1407
+ break;
1408
+ }
1409
+ case "export": {
1410
+ const sub = pos[0];
1411
+ switch (sub) {
1412
+ case "orders":
1413
+ out(await client.commerce.export.orders({ from: flags.from, to: flags.to, status: flags.status, format: flags.format }));
1414
+ break;
1415
+ case "products":
1416
+ out(await client.commerce.export.products({ catalog_id: flags["catalog-id"], status: flags.status, format: flags.format }));
1417
+ break;
1418
+ case "customers":
1419
+ out(await client.commerce.export.customers({ format: flags.format }));
1420
+ break;
1421
+ default:
1422
+ console.error(`Unknown commerce export command: ${sub}`);
1423
+ process.exit(1);
1424
+ }
1425
+ break;
1426
+ }
1427
+ default:
1428
+ console.error(`Unknown commerce command: ${cmd}`);
1429
+ process.exit(1);
1430
+ }
1431
+ }
1432
+ async function handleBooking(client, cmd, pos, flags) {
1433
+ switch (cmd) {
1434
+ case "settings": {
1435
+ const sub = pos[0];
1436
+ if (!sub || sub === "get") {
1437
+ out(await client.booking.settings.get());
1438
+ }
1439
+ else if (sub === "update") {
1440
+ out(await client.booking.settings.update(parseJsonFlag(flags)));
1441
+ }
1442
+ else {
1443
+ console.error(`Unknown booking settings command: ${sub}`);
1444
+ process.exit(1);
1445
+ }
1446
+ break;
1447
+ }
1448
+ case "resources": {
1449
+ const sub = pos[0];
1450
+ switch (sub) {
1451
+ case "list":
1452
+ out(await client.booking.resources.list({ type: flags.type, enabled: flags.enabled !== undefined ? flags.enabled === "true" : undefined, limit: flags.limit ? Number(flags.limit) : undefined }));
1453
+ break;
1454
+ case "get":
1455
+ out(await client.booking.resources.get(pos[1]));
1456
+ break;
1457
+ case "create":
1458
+ out(await client.booking.resources.create(parseJsonFlag(flags)));
1459
+ break;
1460
+ case "update":
1461
+ out(await client.booking.resources.update(pos[1], parseJsonFlag(flags)));
1462
+ break;
1463
+ case "delete":
1464
+ await client.booking.resources.delete(pos[1]);
1465
+ console.log("Deleted");
1466
+ break;
1467
+ case "set-availability":
1468
+ out(await client.booking.resources.setAvailability(pos[1], parseJsonFlag(flags, "rules")));
1469
+ break;
1470
+ case "get-availability":
1471
+ out(await client.booking.resources.getAvailability(pos[1]));
1472
+ break;
1473
+ case "slots":
1474
+ out(await client.booking.resources.getSlots(pos[1], flags.date, flags.duration ? Number(flags.duration) : undefined));
1475
+ break;
1476
+ default:
1477
+ console.error(`Unknown booking resources command: ${sub}`);
1478
+ process.exit(1);
1479
+ }
1480
+ break;
1481
+ }
1482
+ case "bookings": {
1483
+ const sub = pos[0];
1484
+ switch (sub) {
1485
+ case "list":
1486
+ out(await client.booking.bookings.list({ status: flags.status, resource_id: flags["resource-id"], customer_id: flags["customer-id"], from: flags.from, to: flags.to, limit: flags.limit ? Number(flags.limit) : undefined }));
1487
+ break;
1488
+ case "get":
1489
+ out(await client.booking.bookings.get(pos[1]));
1490
+ break;
1491
+ case "create":
1492
+ out(await client.booking.bookings.create(parseJsonFlag(flags)));
1493
+ break;
1494
+ case "update":
1495
+ out(await client.booking.bookings.update(pos[1], parseJsonFlag(flags)));
1496
+ break;
1497
+ case "delete":
1498
+ await client.booking.bookings.delete(pos[1]);
1499
+ console.log("Deleted");
1500
+ break;
1501
+ case "transition":
1502
+ out(await client.booking.bookings.transition(pos[1], { status: flags.status, cancel_reason: flags["cancel-reason"], actor: flags.actor }));
1503
+ break;
1504
+ case "events":
1505
+ out(await client.booking.bookings.getEvents(pos[1]));
1506
+ break;
1507
+ default:
1508
+ console.error(`Unknown booking bookings command: ${sub}`);
1509
+ process.exit(1);
1510
+ }
1511
+ break;
1512
+ }
1513
+ case "customers": {
1514
+ const sub = pos[0];
1515
+ switch (sub) {
1516
+ case "list":
1517
+ out(await client.booking.customers.list({ email: flags.email, q: flags.q, limit: flags.limit ? Number(flags.limit) : undefined }));
1518
+ break;
1519
+ case "get":
1520
+ out(await client.booking.customers.get(pos[1]));
1521
+ break;
1522
+ case "create":
1523
+ out(await client.booking.customers.create({ name: flags.name, external_id: flags["external-id"], email: flags.email, phone: flags.phone, notes: flags.notes, metadata: flags.metadata ? JSON.parse(flags.metadata) : undefined }));
1524
+ break;
1525
+ case "update":
1526
+ out(await client.booking.customers.update(pos[1], parseJsonFlag(flags)));
1527
+ break;
1528
+ case "delete":
1529
+ await client.booking.customers.delete(pos[1]);
1530
+ console.log("Deleted");
1531
+ break;
1532
+ default:
1533
+ console.error(`Unknown booking customers command: ${sub}`);
1534
+ process.exit(1);
1535
+ }
1536
+ break;
1537
+ }
1538
+ case "blockers": {
1539
+ const sub = pos[0];
1540
+ switch (sub) {
1541
+ case "list":
1542
+ out(await client.booking.blockers.list({ resource_id: flags["resource-id"], from: flags.from, to: flags.to, limit: flags.limit ? Number(flags.limit) : undefined }));
1543
+ break;
1544
+ case "create":
1545
+ out(await client.booking.blockers.create(parseJsonFlag(flags)));
1546
+ break;
1547
+ case "delete":
1548
+ await client.booking.blockers.delete(pos[1]);
1549
+ console.log("Deleted");
1550
+ break;
1551
+ default:
1552
+ console.error(`Unknown booking blockers command: ${sub}`);
1553
+ process.exit(1);
1554
+ }
1555
+ break;
1556
+ }
1557
+ case "webhooks": {
1558
+ const sub = pos[0];
1559
+ switch (sub) {
1560
+ case "list":
1561
+ out(await client.booking.webhooks.list());
1562
+ break;
1563
+ case "create":
1564
+ out(await client.booking.webhooks.create({ name: flags.name, url: flags.url, topics: JSON.parse(flags.topics), secret: flags.secret }));
1565
+ break;
1566
+ default:
1567
+ console.error(`Unknown booking webhooks command: ${sub}`);
1568
+ process.exit(1);
1569
+ }
1570
+ break;
1571
+ }
1572
+ case "analytics": {
1573
+ const sub = pos[0];
1574
+ switch (sub) {
1575
+ case "summary":
1576
+ out(await client.booking.analytics.summary({ from: flags.from, to: flags.to }));
1577
+ break;
1578
+ case "by-resource":
1579
+ out(await client.booking.analytics.byResource({ from: flags.from, to: flags.to }));
1580
+ break;
1581
+ case "by-period":
1582
+ out(await client.booking.analytics.byPeriod({ from: flags.from, to: flags.to, group_by: flags["group-by"] }));
1583
+ break;
1584
+ default:
1585
+ console.error(`Unknown booking analytics command: ${sub}`);
1586
+ process.exit(1);
1587
+ }
1588
+ break;
1589
+ }
1590
+ case "export": {
1591
+ const sub = pos[0];
1592
+ switch (sub) {
1593
+ case "bookings":
1594
+ out(await client.booking.export.bookings({ from: flags.from, to: flags.to, status: flags.status, format: flags.format }));
1595
+ break;
1596
+ case "customers":
1597
+ out(await client.booking.export.customers({ from: flags.from, to: flags.to, format: flags.format }));
1598
+ break;
1599
+ case "resources":
1600
+ out(await client.booking.export.resources({ type: flags.type, format: flags.format }));
1601
+ break;
1602
+ default:
1603
+ console.error(`Unknown booking export command: ${sub}`);
1604
+ process.exit(1);
1605
+ }
1606
+ break;
1607
+ }
1608
+ default:
1609
+ console.error(`Unknown booking command: ${cmd}`);
1610
+ process.exit(1);
1611
+ }
1612
+ }
1613
+ async function handleMessaging(client, cmd, pos, flags) {
1614
+ switch (cmd) {
1615
+ case "settings": {
1616
+ const sub = pos[0];
1617
+ if (!sub || sub === "get") {
1618
+ out(await client.messaging.settings.get());
1619
+ }
1620
+ else if (sub === "update") {
1621
+ out(await client.messaging.settings.update(parseJsonFlag(flags)));
1622
+ }
1623
+ else {
1624
+ console.error(`Unknown messaging settings command: ${sub}`);
1625
+ process.exit(1);
1626
+ }
1627
+ break;
1628
+ }
1629
+ case "conversations": {
1630
+ const sub = pos[0];
1631
+ switch (sub) {
1632
+ case "list":
1633
+ out(await client.messaging.conversations.list({ type: flags.type, status: flags.status, limit: flags.limit ? Number(flags.limit) : undefined }));
1634
+ break;
1635
+ case "get":
1636
+ out(await client.messaging.conversations.get(pos[1]));
1637
+ break;
1638
+ case "create":
1639
+ out(await client.messaging.conversations.create({ type: flags.type, title: flags.title, description: flags.description, metadata: flags.metadata ? JSON.parse(flags.metadata) : undefined }));
1640
+ break;
1641
+ case "update":
1642
+ out(await client.messaging.conversations.update(pos[1], { title: flags.title, description: flags.description, metadata: flags.metadata ? JSON.parse(flags.metadata) : undefined }));
1643
+ break;
1644
+ case "delete":
1645
+ await client.messaging.conversations.delete(pos[1]);
1646
+ console.log("Deleted");
1647
+ break;
1648
+ case "archive":
1649
+ out(await client.messaging.conversations.archive(pos[1]));
1650
+ break;
1651
+ case "close":
1652
+ out(await client.messaging.conversations.close(pos[1]));
1653
+ break;
1654
+ case "reopen":
1655
+ out(await client.messaging.conversations.reopen(pos[1]));
1656
+ break;
1657
+ default:
1658
+ console.error(`Unknown messaging conversations command: ${sub}`);
1659
+ process.exit(1);
1660
+ }
1661
+ break;
1662
+ }
1663
+ case "participants": {
1664
+ const sub = pos[0];
1665
+ switch (sub) {
1666
+ case "list":
1667
+ out(await client.messaging.participants.list(pos[1], { limit: flags.limit ? Number(flags.limit) : undefined }));
1668
+ break;
1669
+ case "add":
1670
+ out(await client.messaging.participants.add(pos[1], { external_id: flags["external-id"], display_name: flags["display-name"], role: flags.role, metadata: flags.metadata ? JSON.parse(flags.metadata) : undefined }));
1671
+ break;
1672
+ case "update":
1673
+ out(await client.messaging.participants.update(pos[1], pos[2], { display_name: flags["display-name"], role: flags.role, last_read_at: flags["last-read-at"], metadata: flags.metadata ? JSON.parse(flags.metadata) : undefined }));
1674
+ break;
1675
+ case "remove":
1676
+ await client.messaging.participants.remove(pos[1], pos[2]);
1677
+ console.log("Removed");
1678
+ break;
1679
+ default:
1680
+ console.error(`Unknown messaging participants command: ${sub}`);
1681
+ process.exit(1);
1682
+ }
1683
+ break;
1684
+ }
1685
+ case "messages": {
1686
+ const sub = pos[0];
1687
+ switch (sub) {
1688
+ case "list":
1689
+ out(await client.messaging.messages.list(pos[1], { before: flags.before, after: flags.after, limit: flags.limit ? Number(flags.limit) : undefined }));
1690
+ break;
1691
+ case "get":
1692
+ out(await client.messaging.messages.get(pos[1], pos[2]));
1693
+ break;
1694
+ case "send":
1695
+ out(await client.messaging.messages.send(pos[1], { participant_id: flags["participant-id"], body: flags.body ?? flags.text, type: flags.type, reply_to: flags["reply-to"], metadata: flags.metadata ? JSON.parse(flags.metadata) : undefined }));
1696
+ break;
1697
+ case "edit":
1698
+ out(await client.messaging.messages.edit(pos[1], pos[2], { body: flags.body ?? flags.text }));
1699
+ break;
1700
+ case "delete":
1701
+ await client.messaging.messages.delete(pos[1], pos[2]);
1702
+ console.log("Deleted");
1703
+ break;
1704
+ default:
1705
+ console.error(`Unknown messaging messages command: ${sub}`);
1706
+ process.exit(1);
1707
+ }
1708
+ break;
1709
+ }
1710
+ case "reactions": {
1711
+ const sub = pos[0];
1712
+ switch (sub) {
1713
+ case "add":
1714
+ out(await client.messaging.reactions.add(pos[1], { participant_id: flags["participant-id"], emoji: flags.emoji }));
1715
+ break;
1716
+ case "remove":
1717
+ await client.messaging.reactions.remove(pos[1], pos[2]);
1718
+ console.log("Removed");
1719
+ break;
1720
+ default:
1721
+ console.error(`Unknown messaging reactions command: ${sub}`);
1722
+ process.exit(1);
1723
+ }
1724
+ break;
1725
+ }
1726
+ case "webhooks": {
1727
+ const sub = pos[0];
1728
+ switch (sub) {
1729
+ case "list":
1730
+ out(await client.messaging.webhooks.list());
1731
+ break;
1732
+ case "create":
1733
+ out(await client.messaging.webhooks.create({ name: flags.name, url: flags.url, topics: JSON.parse(flags.topics), secret: flags.secret }));
1734
+ break;
1735
+ default:
1736
+ console.error(`Unknown messaging webhooks command: ${sub}`);
1737
+ process.exit(1);
1738
+ }
1739
+ break;
1740
+ }
1741
+ case "analytics": {
1742
+ const sub = pos[0];
1743
+ switch (sub) {
1744
+ case "summary":
1745
+ out(await client.messaging.analytics.summary({ from: flags.from, to: flags.to }));
1746
+ break;
1747
+ case "by-conversation":
1748
+ out(await client.messaging.analytics.byConversation({ from: flags.from, to: flags.to }));
1749
+ break;
1750
+ case "by-period":
1751
+ out(await client.messaging.analytics.byPeriod({ from: flags.from, to: flags.to, group_by: flags["group-by"] }));
1752
+ break;
1753
+ default:
1754
+ console.error(`Unknown messaging analytics command: ${sub}`);
1755
+ process.exit(1);
1756
+ }
1757
+ break;
1758
+ }
1759
+ case "export": {
1760
+ const sub = pos[0];
1761
+ switch (sub) {
1762
+ case "conversations":
1763
+ out(await client.messaging.export.conversations({ from: flags.from, to: flags.to, status: flags.status, format: flags.format }));
1764
+ break;
1765
+ case "messages":
1766
+ out(await client.messaging.export.messages({ from: flags.from, to: flags.to, format: flags.format }));
1767
+ break;
1768
+ default:
1769
+ console.error(`Unknown messaging export command: ${sub}`);
1770
+ process.exit(1);
1771
+ }
1772
+ break;
1773
+ }
1774
+ default:
1775
+ console.error(`Unknown messaging command: ${cmd}`);
1776
+ process.exit(1);
1777
+ }
1778
+ }
1779
+ async function handleOrgs(client, cmd, pos, flags) {
1780
+ switch (cmd) {
1781
+ case "list":
1782
+ out(await client.core.orgs.list());
1783
+ break;
1784
+ case "create":
1785
+ out(await client.core.orgs.create({ name: flags.name, slug: flags.slug }));
1786
+ break;
1787
+ case "get":
1788
+ out(await client.core.orgs.get(pos[0]));
1789
+ break;
1790
+ case "update":
1791
+ out(await client.core.orgs.update(pos[0], { name: flags.name, slug: flags.slug }));
1792
+ break;
1793
+ case "delete":
1794
+ await client.core.orgs.delete(pos[0], flags["confirm-name"]);
1795
+ console.log("Deleted");
1796
+ break;
1797
+ case "members":
1798
+ out(await client.core.orgs.members(pos[0]));
1799
+ break;
1800
+ case "invite":
1801
+ out(await client.core.orgs.invite(pos[0], {
1802
+ email: flags.email,
1803
+ scopes: flags.scopes ? JSON.parse(flags.scopes) : undefined,
1804
+ project_id: flags["project-id"],
1805
+ }));
1806
+ break;
1807
+ case "remove-member":
1808
+ await client.core.orgs.removeMember(pos[0], pos[1]);
1809
+ console.log("Removed");
1810
+ break;
1811
+ case "my-scopes":
1812
+ out(await client.core.orgs.myScopes(pos[0]));
1813
+ break;
1814
+ case "update-member-scopes":
1815
+ await client.core.orgs.updateMemberScopes(pos[0], pos[1], JSON.parse(flags.scopes));
1816
+ console.log("Updated");
1817
+ break;
1818
+ case "projects": {
1819
+ const sub = pos[0];
1820
+ switch (sub) {
1821
+ case "list":
1822
+ out(await client.core.orgs.listProjects(pos[1] ?? flags["org-id"]));
1823
+ break;
1824
+ case "create":
1825
+ out(await client.core.orgs.createProject(pos[1] ?? flags["org-id"], { name: flags.name, region: flags.region }));
1826
+ break;
1827
+ case "get":
1828
+ out(await client.core.orgs.getProject(pos[1], pos[2]));
1829
+ break;
1830
+ case "delete":
1831
+ await client.core.orgs.deleteProject(pos[1], pos[2]);
1832
+ console.log("Deleted");
1833
+ break;
1834
+ default:
1835
+ console.error(`Unknown orgs projects command: ${sub}`);
1836
+ process.exit(1);
1837
+ }
1838
+ break;
1839
+ }
1840
+ case "tokens": {
1841
+ const sub = pos[0];
1842
+ switch (sub) {
1843
+ case "list":
1844
+ out(await client.core.orgs.listTokens(pos[1] ?? flags["org-id"], flags["project-id"]));
1845
+ break;
1846
+ case "create":
1847
+ out(await client.core.orgs.createToken(pos[1] ?? flags["org-id"], {
1848
+ name: flags.name,
1849
+ scopes: JSON.parse(flags.scopes),
1850
+ project_id: flags["project-id"],
1851
+ expires_at: flags["expires-at"],
1852
+ }));
1853
+ break;
1854
+ case "revoke":
1855
+ await client.core.orgs.revokeToken(pos[1], pos[2]);
1856
+ console.log("Revoked");
1857
+ break;
1858
+ default:
1859
+ console.error(`Unknown orgs tokens command: ${sub}`);
1860
+ process.exit(1);
1861
+ }
1862
+ break;
1863
+ }
1864
+ default:
1865
+ console.error(`Unknown orgs command: ${cmd}`);
1866
+ process.exit(1);
1867
+ }
1868
+ }
1869
+ async function handleMeta(client, cmd, _pos, _flags) {
1870
+ switch (cmd) {
1871
+ case "livez":
1872
+ out(await client.meta.livez());
1873
+ break;
1874
+ case "readyz":
1875
+ out(await client.meta.readyz());
1876
+ break;
1877
+ case "healthz":
1878
+ out(await client.meta.healthz());
1879
+ break;
1880
+ case "openapi":
1881
+ out(await client.meta.openApiSpec());
1882
+ break;
1883
+ case "skill":
1884
+ console.log(await client.meta.saasignalSkill());
1885
+ break;
1886
+ case "llms-txt":
1887
+ console.log(await client.meta.llmsTxt());
1888
+ break;
1889
+ case "human-docs":
1890
+ console.log(await client.meta.humanDocs());
1891
+ break;
1892
+ case "robots-txt":
1893
+ console.log(await client.meta.robotsTxt());
1894
+ break;
1895
+ case "sitemap-xml":
1896
+ console.log(await client.meta.sitemapXml());
1897
+ break;
1898
+ case "landing":
1899
+ console.log(await client.meta.landing());
1900
+ break;
1901
+ case "scalar-url":
1902
+ console.log(client.meta.scalarUrl());
1903
+ break;
1904
+ case "mcp-url":
1905
+ console.log(client.meta.mcpUrl());
1906
+ break;
1907
+ default:
1908
+ console.error(`Unknown meta command: ${cmd}`);
1909
+ process.exit(1);
1910
+ }
1911
+ }
1912
+ async function main() {
1913
+ const args = process.argv.slice(2);
1914
+ if (args.length === 0 || args[0] === "--help" || args[0] === "-h") {
1915
+ console.log(USAGE);
1916
+ process.exit(0);
1917
+ }
1918
+ const [namespace, command, ...rest] = args;
1919
+ const { positional, flags } = parseArgs(rest);
1920
+ try {
1921
+ if (namespace === "auth") {
1922
+ await handleAuth(command);
1923
+ return;
1924
+ }
1925
+ const resolvedAuth = await resolveCliAuth();
1926
+ let client = new SaaSignalClient({ token: resolvedAuth.token, baseUrl: resolvedAuth.baseUrl });
1927
+ try {
1928
+ await executeNamespaceCommand(client, namespace, command, positional, flags);
1929
+ }
1930
+ catch (error) {
1931
+ if (error instanceof SaaSignalError && error.status === 401 && resolvedAuth.profile) {
1932
+ const refreshedProfile = await refreshAuthProfile(resolvedAuth.profile);
1933
+ await saveAuthProfile(refreshedProfile);
1934
+ client = new SaaSignalClient({ token: refreshedProfile.access_token, baseUrl: resolvedAuth.baseUrl });
1935
+ await executeNamespaceCommand(client, namespace, command, positional, flags);
1936
+ return;
1937
+ }
1938
+ throw error;
1939
+ }
1940
+ }
1941
+ catch (e) {
1942
+ if (e instanceof SaaSignalError) {
1943
+ console.error(JSON.stringify({ error: e.code, message: e.message, status: e.status }, null, 2));
1944
+ process.exit(1);
1945
+ return;
1946
+ }
1947
+ console.error(`Error: ${e.message}`);
1948
+ process.exit(1);
1949
+ }
1950
+ }
1951
+ async function handleKv(client, cmd, pos, flags) {
1952
+ switch (cmd) {
1953
+ case "get":
1954
+ out(await client.infra.kv.get(pos[0]));
1955
+ break;
1956
+ case "set": {
1957
+ const value = JSON.parse(pos[1]);
1958
+ out(await client.infra.kv.set(pos[0], value, {
1959
+ ttl: flags.ttl ? Number(flags.ttl) : undefined,
1960
+ if_not_exists: flags.nx === "true",
1961
+ }));
1962
+ break;
1963
+ }
1964
+ case "delete":
1965
+ await client.infra.kv.delete(pos[0]);
1966
+ console.log("Deleted");
1967
+ break;
1968
+ case "increment":
1969
+ out(await client.infra.kv.increment(pos[0], flags.delta ? Number(flags.delta) : 1, flags.ttl ? Number(flags.ttl) : undefined));
1970
+ break;
1971
+ case "scan":
1972
+ out(await client.infra.kv.scan({
1973
+ prefix: flags.prefix,
1974
+ limit: flags.limit ? Number(flags.limit) : undefined,
1975
+ cursor: flags.cursor,
1976
+ }));
1977
+ break;
1978
+ case "batch":
1979
+ out(await client.infra.kv.batch(parseJsonFlag(flags, "ops")));
1980
+ break;
1981
+ default:
1982
+ console.error(`Unknown kv command: ${cmd}`);
1983
+ process.exit(1);
1984
+ }
1985
+ }
1986
+ async function handleChannels(client, cmd, pos, flags) {
1987
+ switch (cmd) {
1988
+ case "publish":
1989
+ out(await client.infra.channels.publish(pos[0], pos[1], JSON.parse(pos[2])));
1990
+ break;
1991
+ case "presence":
1992
+ out(await client.infra.channels.presence(pos[0]));
1993
+ break;
1994
+ case "history":
1995
+ out(await client.infra.channels.history(pos[0], { limit: flags.limit ? Number(flags.limit) : undefined }));
1996
+ break;
1997
+ case "batch-publish":
1998
+ out(await client.infra.channels.batchPublish(parseJsonFlag(flags, "messages")));
1999
+ break;
2000
+ default:
2001
+ console.error(`Unknown channels command: ${cmd}`);
2002
+ process.exit(1);
2003
+ }
2004
+ }
2005
+ async function handleJobs(client, cmd, pos, flags) {
2006
+ switch (cmd) {
2007
+ case "create":
2008
+ out(await client.infra.jobs.create({
2009
+ name: pos[0],
2010
+ trigger: {
2011
+ type: flags.trigger,
2012
+ queue: flags.queue,
2013
+ schedule: flags.cron,
2014
+ delay_seconds: flags.delay ? Number(flags.delay) : undefined,
2015
+ },
2016
+ payload: flags.payload ? JSON.parse(flags.payload) : undefined,
2017
+ handler: flags.handler,
2018
+ max_attempts: flags["max-attempts"] ? Number(flags["max-attempts"]) : undefined,
2019
+ backoff: flags.backoff,
2020
+ }));
2021
+ break;
2022
+ case "list":
2023
+ out(await client.infra.jobs.list({
2024
+ status: flags.status,
2025
+ trigger_type: flags["trigger-type"],
2026
+ queue: flags.queue,
2027
+ limit: flags.limit ? Number(flags.limit) : undefined,
2028
+ }));
2029
+ break;
2030
+ case "get":
2031
+ out(await client.infra.jobs.get(pos[0]));
2032
+ break;
2033
+ case "cancel":
2034
+ out(await client.infra.jobs.cancel(pos[0]));
2035
+ break;
2036
+ case "trigger":
2037
+ out(await client.infra.jobs.trigger(pos[0]));
2038
+ break;
2039
+ case "retry":
2040
+ out(await client.infra.jobs.retry(pos[0]));
2041
+ break;
2042
+ case "runs":
2043
+ out(await client.infra.jobs.runs(pos[0], { limit: flags.limit ? Number(flags.limit) : undefined }));
2044
+ break;
2045
+ case "claim":
2046
+ out(await client.infra.jobs.claim(pos[0], {
2047
+ count: flags.count ? Number(flags.count) : undefined,
2048
+ visibility_timeout: flags.timeout ? Number(flags.timeout) : undefined,
2049
+ }));
2050
+ break;
2051
+ case "ack":
2052
+ out(await client.infra.jobs.ack(pos[0], {
2053
+ status: flags.status,
2054
+ result: flags.result ? JSON.parse(flags.result) : undefined,
2055
+ error: flags.error,
2056
+ }));
2057
+ break;
2058
+ case "update":
2059
+ out(await client.infra.jobs.update(pos[0], {
2060
+ handler: flags.handler,
2061
+ payload: flags.payload ? JSON.parse(flags.payload) : undefined,
2062
+ enabled: flags.enabled !== undefined ? flags.enabled === "true" : undefined,
2063
+ trigger: flags.cron ? { schedule: flags.cron, timezone: flags.timezone } : undefined,
357
2064
  }));
358
2065
  break;
2066
+ case "batch-create":
2067
+ out(await client.infra.jobs.batchCreate(parseJsonFlag(flags, "jobs")));
2068
+ break;
359
2069
  default:
360
2070
  console.error(`Unknown jobs command: ${cmd}`);
361
2071
  process.exit(1);
@@ -382,6 +2092,12 @@ async function handleBilling(client, cmd, pos, flags) {
382
2092
  granularity: flags.granularity,
383
2093
  }));
384
2094
  break;
2095
+ case "subscription":
2096
+ out(await client.core.billing.subscription(pos[0]));
2097
+ break;
2098
+ case "switch-to-free":
2099
+ out(await client.core.billing.switchToFreePlan(pos[0]));
2100
+ break;
385
2101
  default:
386
2102
  console.error(`Unknown billing command: ${cmd}`);
387
2103
  process.exit(1);
@@ -446,6 +2162,9 @@ async function handleStorage(client, cmd, pos, flags) {
446
2162
  await client.infra.storage.deleteObject(pos[1], pos[2]);
447
2163
  console.log("Deleted");
448
2164
  break;
2165
+ case "head":
2166
+ out(await client.infra.storage.headObject(pos[1], pos[2]));
2167
+ break;
449
2168
  default:
450
2169
  console.error(`Unknown storage objects command: ${sub}`);
451
2170
  process.exit(1);
@@ -614,14 +2333,40 @@ async function handleDelivery(client, cmd, pos, flags) {
614
2333
  dropoff_address: flags.dropoff,
615
2334
  pickup_address: flags.pickup,
616
2335
  driver_id: flags["driver-id"],
2336
+ pickup_lat: flags["pickup-lat"] ? Number(flags["pickup-lat"]) : undefined,
2337
+ pickup_lng: flags["pickup-lng"] ? Number(flags["pickup-lng"]) : undefined,
2338
+ dropoff_lat: flags["dropoff-lat"] ? Number(flags["dropoff-lat"]) : undefined,
2339
+ dropoff_lng: flags["dropoff-lng"] ? Number(flags["dropoff-lng"]) : undefined,
2340
+ zone_id: flags["zone-id"],
2341
+ hub_id: flags["hub-id"],
2342
+ priority: flags.priority ? Number(flags.priority) : undefined,
2343
+ scheduled_at: flags["scheduled-at"],
2344
+ metadata: flags.metadata ? JSON.parse(flags.metadata) : undefined,
2345
+ }));
2346
+ break;
2347
+ case "update":
2348
+ out(await client.delivery.orders.update(pos[1], {
2349
+ driver_id: flags["driver-id"],
2350
+ dropoff_address: flags.dropoff,
2351
+ pickup_address: flags.pickup,
2352
+ metadata: flags.metadata ? JSON.parse(flags.metadata) : undefined,
617
2353
  }));
618
2354
  break;
619
2355
  case "transition":
620
2356
  out(await client.delivery.orders.transition(pos[1], {
621
2357
  status: flags.status,
622
2358
  driver_id: flags["driver-id"],
2359
+ failed_reason: flags["failed-reason"],
2360
+ cancelled_reason: flags["cancelled-reason"],
623
2361
  }));
624
2362
  break;
2363
+ case "events":
2364
+ out(await client.delivery.orders.events(pos[1]));
2365
+ break;
2366
+ case "delete":
2367
+ await client.delivery.orders.delete(pos[1]);
2368
+ console.log("Deleted");
2369
+ break;
625
2370
  case "proof": {
626
2371
  const proofCmd = pos[1];
627
2372
  switch (proofCmd) {
@@ -631,6 +2376,15 @@ async function handleDelivery(client, cmd, pos, flags) {
631
2376
  case "get":
632
2377
  out(await client.delivery.orders.getProof(pos[2], pos[3]));
633
2378
  break;
2379
+ case "create":
2380
+ out(await client.delivery.orders.addProof(pos[2], {
2381
+ type: flags.type,
2382
+ value: flags.value,
2383
+ stop_id: flags["stop-id"],
2384
+ lat: flags.lat ? Number(flags.lat) : undefined,
2385
+ lng: flags.lng ? Number(flags.lng) : undefined,
2386
+ }));
2387
+ break;
634
2388
  case "delete":
635
2389
  await client.delivery.orders.deleteProof(pos[2], pos[3]);
636
2390
  console.log("Deleted");
@@ -659,12 +2413,338 @@ async function handleDelivery(client, cmd, pos, flags) {
659
2413
  case "get":
660
2414
  out(await client.delivery.drivers.get(pos[1]));
661
2415
  break;
2416
+ case "create":
2417
+ out(await client.delivery.drivers.create({
2418
+ name: flags.name,
2419
+ phone: flags.phone,
2420
+ email: flags.email,
2421
+ status: flags.status,
2422
+ vehicle_id: flags["vehicle-id"],
2423
+ hub_id: flags["hub-id"],
2424
+ capacity: flags.capacity ? Number(flags.capacity) : undefined,
2425
+ metadata: flags.metadata ? JSON.parse(flags.metadata) : undefined,
2426
+ }));
2427
+ break;
2428
+ case "update":
2429
+ out(await client.delivery.drivers.update(pos[1], {
2430
+ name: flags.name,
2431
+ phone: flags.phone,
2432
+ email: flags.email,
2433
+ vehicle_id: flags["vehicle-id"],
2434
+ hub_id: flags["hub-id"],
2435
+ capacity: flags.capacity ? Number(flags.capacity) : undefined,
2436
+ metadata: flags.metadata ? JSON.parse(flags.metadata) : undefined,
2437
+ }));
2438
+ break;
2439
+ case "online":
2440
+ out(await client.delivery.drivers.online(pos[1]));
2441
+ break;
2442
+ case "offline":
2443
+ out(await client.delivery.drivers.offline(pos[1]));
2444
+ break;
2445
+ case "delete":
2446
+ await client.delivery.drivers.delete(pos[1]);
2447
+ console.log("Deleted");
2448
+ break;
662
2449
  default:
663
2450
  console.error(`Unknown delivery drivers command: ${sub}`);
664
2451
  process.exit(1);
665
2452
  }
666
2453
  break;
667
2454
  }
2455
+ case "customers": {
2456
+ const sub = pos[0];
2457
+ switch (sub) {
2458
+ case "list":
2459
+ out(await client.delivery.customers.list({ limit: flags.limit ? Number(flags.limit) : undefined }));
2460
+ break;
2461
+ case "get":
2462
+ out(await client.delivery.customers.get(pos[1]));
2463
+ break;
2464
+ case "create":
2465
+ out(await client.delivery.customers.create({
2466
+ name: flags.name,
2467
+ external_id: flags["external-id"],
2468
+ phone: flags.phone,
2469
+ email: flags.email,
2470
+ metadata: flags.metadata ? JSON.parse(flags.metadata) : undefined,
2471
+ }));
2472
+ break;
2473
+ case "update":
2474
+ out(await client.delivery.customers.update(pos[1], {
2475
+ name: flags.name,
2476
+ external_id: flags["external-id"],
2477
+ phone: flags.phone,
2478
+ email: flags.email,
2479
+ metadata: flags.metadata ? JSON.parse(flags.metadata) : undefined,
2480
+ }));
2481
+ break;
2482
+ case "delete":
2483
+ await client.delivery.customers.delete(pos[1]);
2484
+ console.log("Deleted");
2485
+ break;
2486
+ case "addresses": {
2487
+ const addrCmd = pos[1];
2488
+ switch (addrCmd) {
2489
+ case "list":
2490
+ out(await client.delivery.customers.listAddresses(pos[2]));
2491
+ break;
2492
+ case "add":
2493
+ out(await client.delivery.customers.addAddress(pos[2], {
2494
+ address_line: flags["address-line"],
2495
+ label: flags.label,
2496
+ lat: flags.lat ? Number(flags.lat) : undefined,
2497
+ lng: flags.lng ? Number(flags.lng) : undefined,
2498
+ }));
2499
+ break;
2500
+ case "delete":
2501
+ await client.delivery.customers.deleteAddress(pos[2], pos[3]);
2502
+ console.log("Deleted");
2503
+ break;
2504
+ default:
2505
+ console.error(`Unknown delivery customers addresses command: ${addrCmd}`);
2506
+ process.exit(1);
2507
+ }
2508
+ break;
2509
+ }
2510
+ default:
2511
+ console.error(`Unknown delivery customers command: ${sub}`);
2512
+ process.exit(1);
2513
+ }
2514
+ break;
2515
+ }
2516
+ case "vehicles": {
2517
+ const sub = pos[0];
2518
+ switch (sub) {
2519
+ case "list":
2520
+ out(await client.delivery.vehicles.list({
2521
+ type: flags.type,
2522
+ limit: flags.limit ? Number(flags.limit) : undefined,
2523
+ }));
2524
+ break;
2525
+ case "get":
2526
+ out(await client.delivery.vehicles.get(pos[1]));
2527
+ break;
2528
+ case "create":
2529
+ out(await client.delivery.vehicles.create({
2530
+ type: flags.type,
2531
+ plate: flags.plate,
2532
+ name: flags.name,
2533
+ capacity: flags.capacity ? Number(flags.capacity) : undefined,
2534
+ driver_id: flags["driver-id"],
2535
+ metadata: flags.metadata ? JSON.parse(flags.metadata) : undefined,
2536
+ }));
2537
+ break;
2538
+ case "update":
2539
+ out(await client.delivery.vehicles.update(pos[1], {
2540
+ type: flags.type,
2541
+ plate: flags.plate,
2542
+ name: flags.name,
2543
+ capacity: flags.capacity ? Number(flags.capacity) : undefined,
2544
+ driver_id: flags["driver-id"],
2545
+ metadata: flags.metadata ? JSON.parse(flags.metadata) : undefined,
2546
+ }));
2547
+ break;
2548
+ case "delete":
2549
+ await client.delivery.vehicles.delete(pos[1]);
2550
+ console.log("Deleted");
2551
+ break;
2552
+ default:
2553
+ console.error(`Unknown delivery vehicles command: ${sub}`);
2554
+ process.exit(1);
2555
+ }
2556
+ break;
2557
+ }
2558
+ case "stops": {
2559
+ const sub = pos[0];
2560
+ switch (sub) {
2561
+ case "list":
2562
+ out(await client.delivery.stops.list(pos[1]));
2563
+ break;
2564
+ case "get":
2565
+ out(await client.delivery.stops.get(pos[1]));
2566
+ break;
2567
+ case "create":
2568
+ out(await client.delivery.stops.create(pos[1], {
2569
+ sequence: Number(flags.sequence),
2570
+ type: flags.type,
2571
+ address: flags.address,
2572
+ lat: flags.lat ? Number(flags.lat) : undefined,
2573
+ lng: flags.lng ? Number(flags.lng) : undefined,
2574
+ contact_name: flags["contact-name"],
2575
+ contact_phone: flags["contact-phone"],
2576
+ notes: flags.notes,
2577
+ }));
2578
+ break;
2579
+ case "update":
2580
+ out(await client.delivery.stops.update(pos[1], {
2581
+ sequence: flags.sequence ? Number(flags.sequence) : undefined,
2582
+ type: flags.type,
2583
+ address: flags.address,
2584
+ lat: flags.lat ? Number(flags.lat) : undefined,
2585
+ lng: flags.lng ? Number(flags.lng) : undefined,
2586
+ contact_name: flags["contact-name"],
2587
+ contact_phone: flags["contact-phone"],
2588
+ notes: flags.notes,
2589
+ }));
2590
+ break;
2591
+ case "arrive":
2592
+ out(await client.delivery.stops.arrive(pos[1]));
2593
+ break;
2594
+ case "complete":
2595
+ out(await client.delivery.stops.complete(pos[1]));
2596
+ break;
2597
+ case "skip":
2598
+ out(await client.delivery.stops.skip(pos[1]));
2599
+ break;
2600
+ case "delete":
2601
+ await client.delivery.stops.delete(pos[1]);
2602
+ console.log("Deleted");
2603
+ break;
2604
+ default:
2605
+ console.error(`Unknown delivery stops command: ${sub}`);
2606
+ process.exit(1);
2607
+ }
2608
+ break;
2609
+ }
2610
+ case "dispatch": {
2611
+ const sub = pos[0];
2612
+ switch (sub) {
2613
+ case "suggest":
2614
+ out(await client.delivery.dispatch.suggest({
2615
+ order_id: flags["order-id"],
2616
+ radius_km: flags["radius-km"] ? Number(flags["radius-km"]) : undefined,
2617
+ limit: flags.limit ? Number(flags.limit) : undefined,
2618
+ }));
2619
+ break;
2620
+ case "auto-assign":
2621
+ out(await client.delivery.dispatch.autoAssign({ order_id: flags["order-id"] }));
2622
+ break;
2623
+ default:
2624
+ console.error(`Unknown delivery dispatch command: ${sub}`);
2625
+ process.exit(1);
2626
+ }
2627
+ break;
2628
+ }
2629
+ case "tracking-links": {
2630
+ const sub = pos[0];
2631
+ switch (sub) {
2632
+ case "create":
2633
+ out(await client.delivery.trackingLinks.create({
2634
+ order_id: flags["order-id"],
2635
+ ttl_minutes: flags["ttl-minutes"] ? Number(flags["ttl-minutes"]) : undefined,
2636
+ }));
2637
+ break;
2638
+ case "resolve":
2639
+ out(await client.delivery.trackingLinks.resolve(pos[1]));
2640
+ break;
2641
+ case "revoke":
2642
+ await client.delivery.trackingLinks.revoke(pos[1]);
2643
+ console.log("Revoked");
2644
+ break;
2645
+ default:
2646
+ console.error(`Unknown delivery tracking-links command: ${sub}`);
2647
+ process.exit(1);
2648
+ }
2649
+ break;
2650
+ }
2651
+ case "tracking-pages": {
2652
+ const sub = pos[0];
2653
+ switch (sub) {
2654
+ case "customer-page":
2655
+ console.log(await client.delivery.trackingPages.customerPage(pos[1]));
2656
+ break;
2657
+ case "customer-feed":
2658
+ out(await client.delivery.trackingPages.customerFeed(pos[1]));
2659
+ break;
2660
+ case "rate":
2661
+ out(await client.delivery.trackingPages.rate(pos[1], {
2662
+ score: Number(flags.score),
2663
+ comment: flags.comment,
2664
+ }));
2665
+ break;
2666
+ case "driver-page":
2667
+ console.log(await client.delivery.trackingPages.driverPage(pos[1]));
2668
+ break;
2669
+ case "ping":
2670
+ out(await client.delivery.trackingPages.ping(pos[1], {
2671
+ lat: Number(flags.lat),
2672
+ lng: Number(flags.lng),
2673
+ }));
2674
+ break;
2675
+ case "comment-proof":
2676
+ out(await client.delivery.trackingPages.commentProof(pos[1], {
2677
+ text: flags.text,
2678
+ lat: flags.lat ? Number(flags.lat) : undefined,
2679
+ lng: flags.lng ? Number(flags.lng) : undefined,
2680
+ }));
2681
+ break;
2682
+ default:
2683
+ console.error(`Unknown delivery tracking-pages command: ${sub}`);
2684
+ process.exit(1);
2685
+ }
2686
+ break;
2687
+ }
2688
+ case "dispatch-rules": {
2689
+ const sub = pos[0];
2690
+ switch (sub) {
2691
+ case "list":
2692
+ out(await client.delivery.dispatchRules.list());
2693
+ break;
2694
+ case "get":
2695
+ out(await client.delivery.dispatchRules.get(pos[1]));
2696
+ break;
2697
+ case "create":
2698
+ out(await client.delivery.dispatchRules.create(parseJsonFlag(flags)));
2699
+ break;
2700
+ case "update":
2701
+ out(await client.delivery.dispatchRules.update(pos[1], parseJsonFlag(flags)));
2702
+ break;
2703
+ case "delete":
2704
+ await client.delivery.dispatchRules.delete(pos[1]);
2705
+ console.log("Deleted");
2706
+ break;
2707
+ case "evaluate":
2708
+ out(await client.delivery.dispatchRules.evaluate({
2709
+ lat: Number(flags.lat),
2710
+ lng: Number(flags.lng),
2711
+ time: flags.time,
2712
+ }));
2713
+ break;
2714
+ default:
2715
+ console.error(`Unknown delivery dispatch-rules command: ${sub}`);
2716
+ process.exit(1);
2717
+ }
2718
+ break;
2719
+ }
2720
+ case "auto-dispatch":
2721
+ out(await client.delivery.dispatchRules.autoDispatch({ order_id: flags["order-id"] }));
2722
+ break;
2723
+ case "zones": {
2724
+ const sub = pos[0];
2725
+ switch (sub) {
2726
+ case "list":
2727
+ out(await client.delivery.zones.list({ limit: flags.limit ? Number(flags.limit) : undefined }));
2728
+ break;
2729
+ case "get":
2730
+ out(await client.delivery.zones.get(pos[1]));
2731
+ break;
2732
+ case "create":
2733
+ out(await client.delivery.zones.create(parseJsonFlag(flags)));
2734
+ break;
2735
+ case "update":
2736
+ out(await client.delivery.zones.update(pos[1], parseJsonFlag(flags)));
2737
+ break;
2738
+ case "delete":
2739
+ await client.delivery.zones.delete(pos[1]);
2740
+ console.log("Deleted");
2741
+ break;
2742
+ default:
2743
+ console.error(`Unknown delivery zones command: ${sub}`);
2744
+ process.exit(1);
2745
+ }
2746
+ break;
2747
+ }
668
2748
  case "eta-fences": {
669
2749
  const sub = pos[0];
670
2750
  switch (sub) {
@@ -696,15 +2776,128 @@ async function handleDelivery(client, cmd, pos, flags) {
696
2776
  }
697
2777
  break;
698
2778
  }
699
- case "settings":
700
- out(await client.delivery.settings.get());
2779
+ case "hubs": {
2780
+ const sub = pos[0];
2781
+ switch (sub) {
2782
+ case "list":
2783
+ out(await client.delivery.hubs.list({ limit: flags.limit ? Number(flags.limit) : undefined }));
2784
+ break;
2785
+ case "get":
2786
+ out(await client.delivery.hubs.get(pos[1]));
2787
+ break;
2788
+ case "create":
2789
+ out(await client.delivery.hubs.create({
2790
+ name: flags.name,
2791
+ address: flags.address,
2792
+ lat: flags.lat ? Number(flags.lat) : undefined,
2793
+ lng: flags.lng ? Number(flags.lng) : undefined,
2794
+ radius_km: flags["radius-km"] ? Number(flags["radius-km"]) : undefined,
2795
+ }));
2796
+ break;
2797
+ case "update":
2798
+ out(await client.delivery.hubs.update(pos[1], {
2799
+ name: flags.name,
2800
+ address: flags.address,
2801
+ lat: flags.lat ? Number(flags.lat) : undefined,
2802
+ lng: flags.lng ? Number(flags.lng) : undefined,
2803
+ radius_km: flags["radius-km"] ? Number(flags["radius-km"]) : undefined,
2804
+ }));
2805
+ break;
2806
+ case "delete":
2807
+ await client.delivery.hubs.delete(pos[1]);
2808
+ console.log("Deleted");
2809
+ break;
2810
+ default:
2811
+ console.error(`Unknown delivery hubs command: ${sub}`);
2812
+ process.exit(1);
2813
+ }
2814
+ break;
2815
+ }
2816
+ case "notifications": {
2817
+ const sub = pos[0];
2818
+ switch (sub) {
2819
+ case "list":
2820
+ out(await client.delivery.notifications.list());
2821
+ break;
2822
+ case "upsert":
2823
+ out(await client.delivery.notifications.upsert({
2824
+ event: flags.event,
2825
+ enabled: flags.enabled === "true",
2826
+ channel: flags.channel,
2827
+ }));
2828
+ break;
2829
+ default:
2830
+ console.error(`Unknown delivery notifications command: ${sub}`);
2831
+ process.exit(1);
2832
+ }
701
2833
  break;
702
- case "analytics":
703
- out(await client.delivery.analytics.summary({
704
- from: flags.from,
705
- to: flags.to,
706
- }));
2834
+ }
2835
+ case "webhooks": {
2836
+ const sub = pos[0];
2837
+ switch (sub) {
2838
+ case "list":
2839
+ out(await client.delivery.webhooks.list());
2840
+ break;
2841
+ case "create":
2842
+ out(await client.delivery.webhooks.create({
2843
+ name: flags.name,
2844
+ url: flags.url,
2845
+ topics: flags.topics ? JSON.parse(flags.topics) : [],
2846
+ secret: flags.secret,
2847
+ }));
2848
+ break;
2849
+ default:
2850
+ console.error(`Unknown delivery webhooks command: ${sub}`);
2851
+ process.exit(1);
2852
+ }
2853
+ break;
2854
+ }
2855
+ case "settings": {
2856
+ const sub = pos[0];
2857
+ if (!sub || sub === "get") {
2858
+ out(await client.delivery.settings.get());
2859
+ }
2860
+ else if (sub === "update") {
2861
+ out(await client.delivery.settings.update(parseJsonFlag(flags)));
2862
+ }
2863
+ else {
2864
+ console.error(`Unknown delivery settings command: ${sub}`);
2865
+ process.exit(1);
2866
+ }
2867
+ break;
2868
+ }
2869
+ case "analytics": {
2870
+ const sub = pos[0] ?? "summary";
2871
+ switch (sub) {
2872
+ case "summary":
2873
+ out(await client.delivery.analytics.summary({ from: flags.from, to: flags.to }));
2874
+ break;
2875
+ case "drivers":
2876
+ out(await client.delivery.analytics.drivers({ from: flags.from, to: flags.to, driver_id: flags["driver-id"] }));
2877
+ break;
2878
+ default:
2879
+ console.error(`Unknown delivery analytics command: ${sub}`);
2880
+ process.exit(1);
2881
+ }
2882
+ break;
2883
+ }
2884
+ case "export": {
2885
+ const sub = pos[0];
2886
+ switch (sub) {
2887
+ case "orders":
2888
+ out(await client.delivery.export.orders({
2889
+ from: flags.from,
2890
+ to: flags.to,
2891
+ status: flags.status,
2892
+ format: flags.format,
2893
+ }));
2894
+ break;
2895
+ default:
2896
+ console.error(`Unknown delivery export command: ${sub}`);
2897
+ process.exit(1);
2898
+ }
707
2899
  break;
2900
+ }
708
2901
  default:
709
2902
  console.error(`Unknown delivery command: ${cmd}`);
710
2903
  process.exit(1);