@sendly/cli 3.38.0 → 3.39.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +92 -2
- package/dist/commands/rcs/agents/create.d.ts +44 -0
- package/dist/commands/rcs/agents/create.js +71 -0
- package/dist/commands/rcs/agents/devices/set.d.ts +16 -0
- package/dist/commands/rcs/agents/devices/set.js +77 -0
- package/dist/commands/rcs/agents/get.d.ts +13 -0
- package/dist/commands/rcs/agents/get.js +51 -0
- package/dist/commands/rcs/agents/request-launch.d.ts +16 -0
- package/dist/commands/rcs/agents/request-launch.js +71 -0
- package/dist/commands/rcs/agents/submit.d.ts +14 -0
- package/dist/commands/rcs/agents/submit.js +56 -0
- package/dist/commands/rcs/agents/update.d.ts +48 -0
- package/dist/commands/rcs/agents/update.js +81 -0
- package/dist/commands/rcs/agents.js +10 -2
- package/dist/commands/rcs/brands/create.d.ts +30 -0
- package/dist/commands/rcs/brands/create.js +55 -0
- package/dist/commands/rcs/brands/update.d.ts +33 -0
- package/dist/commands/rcs/brands/update.js +62 -0
- package/dist/commands/rcs/dossier.d.ts +10 -0
- package/dist/commands/rcs/dossier.js +73 -0
- package/dist/commands/rcs/registration.d.ts +10 -0
- package/dist/commands/rcs/registration.js +59 -0
- package/dist/lib/api-client.d.ts +11 -2
- package/dist/lib/api-client.js +19 -9
- package/dist/lib/base-command.js +5 -2
- package/dist/lib/rcs-registration.d.ts +231 -0
- package/dist/lib/rcs-registration.js +734 -0
- package/oclif.manifest.json +3242 -1960
- package/package.json +11 -2
package/README.md
CHANGED
|
@@ -167,6 +167,14 @@ sendly sms scheduled
|
|
|
167
167
|
sendly sms cancel sched_abc123
|
|
168
168
|
```
|
|
169
169
|
|
|
170
|
+
#### Idempotent Sends
|
|
171
|
+
|
|
172
|
+
Every send command (`sms send`, `sms group`, `sms schedule`, `sms batch`, `rcs send`, `whatsapp send`) accepts `--idempotency-key` (1-255 printable ASCII characters). Re-running with the same key within 24 hours returns the original result instead of sending again, so a crashed script or CI job is safe to re-run. Without the flag, non-batch sends carry an auto-generated `Idempotency-Key` that is reused across the CLI's own network-error retries, so a retry of a request that already reached the API does not send twice.
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
sendly sms send --to "+15551234567" --text "Your order has shipped!" --idempotency-key "order-4821-shipped"
|
|
176
|
+
```
|
|
177
|
+
|
|
170
178
|
### Numbers Commands
|
|
171
179
|
|
|
172
180
|
Buy international phone numbers and send from them. (US & Canada use toll-free
|
|
@@ -383,8 +391,90 @@ Send RCS messages from your brand's verified RCS agent — rich text with
|
|
|
383
391
|
tappable suggestion chips, or rich cards with images. Recipients whose device
|
|
384
392
|
doesn't support RCS automatically get the text delivered as plain SMS (rich
|
|
385
393
|
cards have no SMS form). Requires a live API key — RCS delivery is never
|
|
386
|
-
simulated on a test key. RCS is rolling out gradually;
|
|
387
|
-
|
|
394
|
+
simulated on a test key. RCS is rolling out gradually; once it is enabled for
|
|
395
|
+
your account you register your brand and agent from the CLI (below) — contact
|
|
396
|
+
support@sendly.live for early access.
|
|
397
|
+
|
|
398
|
+
#### Register Your Brand and Agent
|
|
399
|
+
|
|
400
|
+
The flow is brand → agent → submit → testing → request launch. Drafts are
|
|
401
|
+
saved as you go; required fields are only checked when you submit. Every
|
|
402
|
+
step is also available in the dashboard, and both see the same registration.
|
|
403
|
+
Registration commands need an API key with the `rcs:read` / `rcs:write`
|
|
404
|
+
scopes (or a `sendly login` session).
|
|
405
|
+
|
|
406
|
+
Start from what Sendly already knows about your business (your 10DLC brand
|
|
407
|
+
or toll-free verification), then draft the brand:
|
|
408
|
+
|
|
409
|
+
```bash
|
|
410
|
+
sendly rcs dossier --json > brand.json # prefilled details; edit as needed
|
|
411
|
+
sendly rcs brands create --from-json brand.json --ein 12-3456789 \
|
|
412
|
+
--legal-entity-type CORPORATION --organization-type PRIVATE_PROFIT
|
|
413
|
+
# or one field per flag:
|
|
414
|
+
sendly rcs brands create --display-name "Acme" --legal-name "Acme Inc" \
|
|
415
|
+
--website https://acme.com --address-line1 "1 Main St" --city Austin \
|
|
416
|
+
--state TX --postal-code 78701 --contact-first-name Jane \
|
|
417
|
+
--contact-last-name Doe --contact-email jane@acme.com \
|
|
418
|
+
--contact-phone +15125550100
|
|
419
|
+
sendly rcs brands update <brandId> --stock-symbol NASDAQ:ACME
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
Draft the agent under the brand. Logo, hero image and any opt-in screenshot
|
|
423
|
+
must already be public `https://` URLs — assets can't be uploaded from the
|
|
424
|
+
CLI (use the dashboard for that):
|
|
425
|
+
|
|
426
|
+
```bash
|
|
427
|
+
sendly rcs agents create --brand <brandId> --display-name "Acme" \
|
|
428
|
+
--use-case TRANSACTIONAL --description "Order updates from Acme" \
|
|
429
|
+
--logo-url https://acme.com/logo.png --hero-url https://acme.com/hero.png \
|
|
430
|
+
--brand-color "#1E90FF" --privacy-policy-url https://acme.com/privacy \
|
|
431
|
+
--terms-url https://acme.com/terms --website https://acme.com --website-label Acme
|
|
432
|
+
sendly rcs agents get <agentId>
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
Submit for review. Sendly checks the brand and agent, then sends them to the
|
|
436
|
+
carrier network; you're emailed when anything changes or needs attention:
|
|
437
|
+
|
|
438
|
+
```bash
|
|
439
|
+
sendly rcs agents submit <agentId>
|
|
440
|
+
sendly rcs registration # where things stand, and what to do next
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
Once the agent is in testing, invite test devices (the list you pass replaces
|
|
444
|
+
the current one), send them a message, and add the campaign details the
|
|
445
|
+
launch review needs:
|
|
446
|
+
|
|
447
|
+
```bash
|
|
448
|
+
sendly rcs agents devices set <agentId> --phone +13125550100 --phone "+13125550101=Jane's Pixel"
|
|
449
|
+
sendly rcs send --to +13125550100 --text "Hello from testing" --agent <agentId>
|
|
450
|
+
sendly rcs agents update <agentId> \
|
|
451
|
+
--company-overview "Acme sells widgets online" \
|
|
452
|
+
--agent-overview "Order and delivery updates" \
|
|
453
|
+
--interaction TRANSACTIONAL_UPDATES \
|
|
454
|
+
--message-example "Your Acme order #4821 has shipped. Reply STOP to opt out." \
|
|
455
|
+
--message-example "Your order is out for delivery today." \
|
|
456
|
+
--message-example "Delivered! Reply HELP for help." \
|
|
457
|
+
--opt-in-method "WEBSITE=Checkbox at checkout" \
|
|
458
|
+
--call-to-action "Get order updates by text" \
|
|
459
|
+
--call-to-action-url https://acme.com/checkout \
|
|
460
|
+
--call-to-action-media-url https://acme.com/optin.png \
|
|
461
|
+
--no-double-opt-in \
|
|
462
|
+
--opt-in-message "Welcome to Acme updates. Reply STOP to opt out." \
|
|
463
|
+
--help-response "Acme support: help@acme.com" \
|
|
464
|
+
--opt-out-response "You are unsubscribed from Acme updates."
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
Then request launch with a recording or screenshots of the agent on a test
|
|
468
|
+
device:
|
|
469
|
+
|
|
470
|
+
```bash
|
|
471
|
+
sendly rcs agents request-launch <agentId> --test-url https://acme.com/rcs-test.mp4
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
`brands create`, `brands update`, `agents create` and `agents update` accept
|
|
475
|
+
`--from-json <file>` for the full nested body (flags override fields in the
|
|
476
|
+
file); every write accepts `--idempotency-key`. Field errors come back as
|
|
477
|
+
`path: message` pairs (and as an `errors` array with `--json`).
|
|
388
478
|
|
|
389
479
|
#### Send a Message
|
|
390
480
|
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../../lib/base-command.js";
|
|
2
|
+
export default class RcsAgentsCreate extends AuthenticatedCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static flags: {
|
|
6
|
+
"from-json": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
7
|
+
"idempotency-key": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
8
|
+
"test-url": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
9
|
+
"test-message-id": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
10
|
+
"testing-info": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
11
|
+
"company-overview": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
12
|
+
"agent-overview": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
13
|
+
"campaign-info": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
14
|
+
interaction: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string[] | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
15
|
+
"message-example": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string[] | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
16
|
+
"opt-in-method": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string[] | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
17
|
+
"call-to-action": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
18
|
+
"call-to-action-url": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
19
|
+
"call-to-action-media-url": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
20
|
+
"double-opt-in": import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
21
|
+
"double-opt-in-message": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
22
|
+
"opt-in-message": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
23
|
+
"help-response": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
24
|
+
"opt-out-response": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
25
|
+
"display-name": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
26
|
+
"use-case": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
27
|
+
description: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
28
|
+
"logo-url": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
29
|
+
"hero-url": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
30
|
+
"brand-color": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
31
|
+
"privacy-policy-url": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
32
|
+
"terms-url": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
33
|
+
phone: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
34
|
+
"phone-label": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
35
|
+
website: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
36
|
+
"website-label": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
37
|
+
email: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
38
|
+
"email-label": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
39
|
+
brand: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
40
|
+
json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
41
|
+
quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
42
|
+
};
|
|
43
|
+
run(): Promise<void>;
|
|
44
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { Flags } from "@oclif/core";
|
|
2
|
+
import { AuthenticatedCommand } from "../../../lib/base-command.js";
|
|
3
|
+
import { apiClient } from "../../../lib/api-client.js";
|
|
4
|
+
import { json, success, error, colors, spinner, isJsonMode, } from "../../../lib/output.js";
|
|
5
|
+
import { AGENT_BASICS_FLAGS, AGENT_CAMPAIGN_FLAGS, AGENT_TESTING_FLAGS, buildAgentBody, idempotencyKeyFlag, nextStepFor, printAgent, printNextSteps, reportRcsError, } from "../../../lib/rcs-registration.js";
|
|
6
|
+
export default class RcsAgentsCreate extends AuthenticatedCommand {
|
|
7
|
+
static description = "Draft the RCS agent for a brand (step 2; logo, hero, and call-to-action media must already be public https:// URLs)";
|
|
8
|
+
static examples = [
|
|
9
|
+
'<%= config.bin %> rcs agents create --brand 3f6a1c9e-0000-0000-0000-000000000000 --display-name "Acme" --use-case TRANSACTIONAL --description "Order updates from Acme" --logo-url https://acme.com/logo.png --hero-url https://acme.com/hero.png --brand-color "#1E90FF" --privacy-policy-url https://acme.com/privacy --terms-url https://acme.com/terms --website https://acme.com --website-label "Acme"',
|
|
10
|
+
"<%= config.bin %> rcs agents create --brand 3f6a1c9e-0000-0000-0000-000000000000 --from-json agent.json",
|
|
11
|
+
"<%= config.bin %> rcs agents create --from-json agent.json --json",
|
|
12
|
+
];
|
|
13
|
+
static flags = {
|
|
14
|
+
...AuthenticatedCommand.baseFlags,
|
|
15
|
+
brand: Flags.string({
|
|
16
|
+
char: "b",
|
|
17
|
+
description: "Brand ID the agent belongs to (see `rcs registration`)",
|
|
18
|
+
}),
|
|
19
|
+
...AGENT_BASICS_FLAGS,
|
|
20
|
+
...AGENT_CAMPAIGN_FLAGS,
|
|
21
|
+
...AGENT_TESTING_FLAGS,
|
|
22
|
+
"from-json": Flags.string({
|
|
23
|
+
description: "Path to a JSON file with the agent ({ brandId, basics, campaign, testing }, or the output of `rcs agents get --json`); flags override fields in the file",
|
|
24
|
+
}),
|
|
25
|
+
"idempotency-key": idempotencyKeyFlag,
|
|
26
|
+
};
|
|
27
|
+
async run() {
|
|
28
|
+
const { flags } = await this.parse(RcsAgentsCreate);
|
|
29
|
+
const built = buildAgentBody(flags, { clearEmpty: false });
|
|
30
|
+
if (typeof built === "string") {
|
|
31
|
+
error(built);
|
|
32
|
+
this.exit(1);
|
|
33
|
+
}
|
|
34
|
+
const body = built;
|
|
35
|
+
if (flags.brand)
|
|
36
|
+
body.brandId = flags.brand;
|
|
37
|
+
if (typeof body.brandId !== "string" || !body.brandId) {
|
|
38
|
+
error("Choose a brand for this agent", {
|
|
39
|
+
hint: "Pass --brand <brandId>; find it with `sendly rcs registration`",
|
|
40
|
+
});
|
|
41
|
+
this.exit(1);
|
|
42
|
+
}
|
|
43
|
+
const saveSpinner = spinner("Saving agent draft...");
|
|
44
|
+
if (!isJsonMode()) {
|
|
45
|
+
saveSpinner.start();
|
|
46
|
+
}
|
|
47
|
+
let response;
|
|
48
|
+
try {
|
|
49
|
+
response = await apiClient.post("/api/v1/rcs/agents", body, true, { idempotencyKey: flags["idempotency-key"] });
|
|
50
|
+
saveSpinner.stop();
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
saveSpinner.stop();
|
|
54
|
+
if (reportRcsError(err))
|
|
55
|
+
this.exit(1);
|
|
56
|
+
throw err;
|
|
57
|
+
}
|
|
58
|
+
if (isJsonMode()) {
|
|
59
|
+
json(response);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const agent = response.agent;
|
|
63
|
+
success(`Agent draft saved: ${agent.id}`);
|
|
64
|
+
console.log();
|
|
65
|
+
printAgent(agent);
|
|
66
|
+
console.log();
|
|
67
|
+
console.log(colors.dim("Missing fields are checked when you submit; fill them in any time with `sendly rcs agents update`."));
|
|
68
|
+
printNextSteps(nextStepFor("draft", { brandId: agent.brandId, agentId: agent.id }));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3Jjcy9hZ2VudHMvY3JlYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZELE9BQU8sRUFDTCxJQUFJLEVBQ0osT0FBTyxFQUNQLEtBQUssRUFDTCxNQUFNLEVBQ04sT0FBTyxFQUNQLFVBQVUsR0FDWCxNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLG1CQUFtQixFQUNuQixjQUFjLEVBQ2Qsa0JBQWtCLEVBQ2xCLFdBQVcsRUFDWCxVQUFVLEVBQ1YsY0FBYyxFQUNkLGNBQWMsR0FFZixNQUFNLGtDQUFrQyxDQUFDO0FBTTFDLE1BQU0sQ0FBQyxPQUFPLE9BQU8sZUFBZ0IsU0FBUSxvQkFBb0I7SUFDL0QsTUFBTSxDQUFDLFdBQVcsR0FDaEIscUhBQXFILENBQUM7SUFFeEgsTUFBTSxDQUFDLFFBQVEsR0FBRztRQUNoQiw4WUFBOFk7UUFDOVkseUdBQXlHO1FBQ3pHLG1FQUFtRTtLQUNwRSxDQUFDO0lBRUYsTUFBTSxDQUFDLEtBQUssR0FBRztRQUNiLEdBQUcsb0JBQW9CLENBQUMsU0FBUztRQUNqQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUNsQixJQUFJLEVBQUUsR0FBRztZQUNULFdBQVcsRUFBRSx3REFBd0Q7U0FDdEUsQ0FBQztRQUNGLEdBQUcsa0JBQWtCO1FBQ3JCLEdBQUcsb0JBQW9CO1FBQ3ZCLEdBQUcsbUJBQW1CO1FBQ3RCLFdBQVcsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ3hCLFdBQVcsRUFDVCwwSkFBMEo7U0FDN0osQ0FBQztRQUNGLGlCQUFpQixFQUFFLGtCQUFrQjtLQUN0QyxDQUFDO0lBRUYsS0FBSyxDQUFDLEdBQUc7UUFDUCxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRXBELE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUMzRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzlCLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZixDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsS0FBZ0MsQ0FBQztRQUM5QyxJQUFJLEtBQUssQ0FBQyxLQUFLO1lBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQzVDLElBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxLQUFLLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN0RCxLQUFLLENBQUMsK0JBQStCLEVBQUU7Z0JBQ3JDLElBQUksRUFBRSxnRUFBZ0U7YUFDdkUsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUNsQixXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEIsQ0FBQztRQUVELElBQUksUUFBNkIsQ0FBQztRQUNsQyxJQUFJLENBQUM7WUFDSCxRQUFRLEdBQUcsTUFBTSxTQUFTLENBQUMsSUFBSSxDQUM3QixvQkFBb0IsRUFDcEIsSUFBSSxFQUNKLElBQUksRUFDSixFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUM3QyxDQUFDO1lBQ0YsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25CLElBQUksY0FBYyxDQUFDLEdBQUcsQ0FBQztnQkFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sR0FBRyxDQUFDO1FBQ1osQ0FBQztRQUVELElBQUksVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDZixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDN0IsT0FBTyxDQUFDLHNCQUFzQixLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMxQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDZCxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEIsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FDVCxNQUFNLENBQUMsR0FBRyxDQUNSLG9HQUFvRyxDQUNyRyxDQUNGLENBQUM7UUFDRixjQUFjLENBQ1osV0FBVyxDQUFDLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FDcEUsQ0FBQztJQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGbGFncyB9IGZyb20gXCJAb2NsaWYvY29yZVwiO1xuaW1wb3J0IHsgQXV0aGVudGljYXRlZENvbW1hbmQgfSBmcm9tIFwiLi4vLi4vLi4vbGliL2Jhc2UtY29tbWFuZC5qc1wiO1xuaW1wb3J0IHsgYXBpQ2xpZW50IH0gZnJvbSBcIi4uLy4uLy4uL2xpYi9hcGktY2xpZW50LmpzXCI7XG5pbXBvcnQge1xuICBqc29uLFxuICBzdWNjZXNzLFxuICBlcnJvcixcbiAgY29sb3JzLFxuICBzcGlubmVyLFxuICBpc0pzb25Nb2RlLFxufSBmcm9tIFwiLi4vLi4vLi4vbGliL291dHB1dC5qc1wiO1xuaW1wb3J0IHtcbiAgQUdFTlRfQkFTSUNTX0ZMQUdTLFxuICBBR0VOVF9DQU1QQUlHTl9GTEFHUyxcbiAgQUdFTlRfVEVTVElOR19GTEFHUyxcbiAgYnVpbGRBZ2VudEJvZHksXG4gIGlkZW1wb3RlbmN5S2V5RmxhZyxcbiAgbmV4dFN0ZXBGb3IsXG4gIHByaW50QWdlbnQsXG4gIHByaW50TmV4dFN0ZXBzLFxuICByZXBvcnRSY3NFcnJvcixcbiAgdHlwZSBQdWJsaWNSY3NBZ2VudCxcbn0gZnJvbSBcIi4uLy4uLy4uL2xpYi9yY3MtcmVnaXN0cmF0aW9uLmpzXCI7XG5cbmludGVyZmFjZSBDcmVhdGVBZ2VudFJlc3BvbnNlIHtcbiAgYWdlbnQ6IFB1YmxpY1Jjc0FnZW50O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSY3NBZ2VudHNDcmVhdGUgZXh0ZW5kcyBBdXRoZW50aWNhdGVkQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9XG4gICAgXCJEcmFmdCB0aGUgUkNTIGFnZW50IGZvciBhIGJyYW5kIChzdGVwIDI7IGxvZ28sIGhlcm8sIGFuZCBjYWxsLXRvLWFjdGlvbiBtZWRpYSBtdXN0IGFscmVhZHkgYmUgcHVibGljIGh0dHBzOi8vIFVSTHMpXCI7XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgICc8JT0gY29uZmlnLmJpbiAlPiByY3MgYWdlbnRzIGNyZWF0ZSAtLWJyYW5kIDNmNmExYzllLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCAtLWRpc3BsYXktbmFtZSBcIkFjbWVcIiAtLXVzZS1jYXNlIFRSQU5TQUNUSU9OQUwgLS1kZXNjcmlwdGlvbiBcIk9yZGVyIHVwZGF0ZXMgZnJvbSBBY21lXCIgLS1sb2dvLXVybCBodHRwczovL2FjbWUuY29tL2xvZ28ucG5nIC0taGVyby11cmwgaHR0cHM6Ly9hY21lLmNvbS9oZXJvLnBuZyAtLWJyYW5kLWNvbG9yIFwiIzFFOTBGRlwiIC0tcHJpdmFjeS1wb2xpY3ktdXJsIGh0dHBzOi8vYWNtZS5jb20vcHJpdmFjeSAtLXRlcm1zLXVybCBodHRwczovL2FjbWUuY29tL3Rlcm1zIC0td2Vic2l0ZSBodHRwczovL2FjbWUuY29tIC0td2Vic2l0ZS1sYWJlbCBcIkFjbWVcIicsXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiByY3MgYWdlbnRzIGNyZWF0ZSAtLWJyYW5kIDNmNmExYzllLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCAtLWZyb20tanNvbiBhZ2VudC5qc29uXCIsXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiByY3MgYWdlbnRzIGNyZWF0ZSAtLWZyb20tanNvbiBhZ2VudC5qc29uIC0tanNvblwiLFxuICBdO1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5BdXRoZW50aWNhdGVkQ29tbWFuZC5iYXNlRmxhZ3MsXG4gICAgYnJhbmQ6IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcImJcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkJyYW5kIElEIHRoZSBhZ2VudCBiZWxvbmdzIHRvIChzZWUgYHJjcyByZWdpc3RyYXRpb25gKVwiLFxuICAgIH0pLFxuICAgIC4uLkFHRU5UX0JBU0lDU19GTEFHUyxcbiAgICAuLi5BR0VOVF9DQU1QQUlHTl9GTEFHUyxcbiAgICAuLi5BR0VOVF9URVNUSU5HX0ZMQUdTLFxuICAgIFwiZnJvbS1qc29uXCI6IEZsYWdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJQYXRoIHRvIGEgSlNPTiBmaWxlIHdpdGggdGhlIGFnZW50ICh7IGJyYW5kSWQsIGJhc2ljcywgY2FtcGFpZ24sIHRlc3RpbmcgfSwgb3IgdGhlIG91dHB1dCBvZiBgcmNzIGFnZW50cyBnZXQgLS1qc29uYCk7IGZsYWdzIG92ZXJyaWRlIGZpZWxkcyBpbiB0aGUgZmlsZVwiLFxuICAgIH0pLFxuICAgIFwiaWRlbXBvdGVuY3kta2V5XCI6IGlkZW1wb3RlbmN5S2V5RmxhZyxcbiAgfTtcblxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBmbGFncyB9ID0gYXdhaXQgdGhpcy5wYXJzZShSY3NBZ2VudHNDcmVhdGUpO1xuXG4gICAgY29uc3QgYnVpbHQgPSBidWlsZEFnZW50Qm9keShmbGFncywgeyBjbGVhckVtcHR5OiBmYWxzZSB9KTtcbiAgICBpZiAodHlwZW9mIGJ1aWx0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBlcnJvcihidWlsdCk7XG4gICAgICB0aGlzLmV4aXQoMSk7XG4gICAgfVxuICAgIGNvbnN0IGJvZHkgPSBidWlsdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoZmxhZ3MuYnJhbmQpIGJvZHkuYnJhbmRJZCA9IGZsYWdzLmJyYW5kO1xuICAgIGlmICh0eXBlb2YgYm9keS5icmFuZElkICE9PSBcInN0cmluZ1wiIHx8ICFib2R5LmJyYW5kSWQpIHtcbiAgICAgIGVycm9yKFwiQ2hvb3NlIGEgYnJhbmQgZm9yIHRoaXMgYWdlbnRcIiwge1xuICAgICAgICBoaW50OiBcIlBhc3MgLS1icmFuZCA8YnJhbmRJZD47IGZpbmQgaXQgd2l0aCBgc2VuZGx5IHJjcyByZWdpc3RyYXRpb25gXCIsXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCBzYXZlU3Bpbm5lciA9IHNwaW5uZXIoXCJTYXZpbmcgYWdlbnQgZHJhZnQuLi5cIik7XG4gICAgaWYgKCFpc0pzb25Nb2RlKCkpIHtcbiAgICAgIHNhdmVTcGlubmVyLnN0YXJ0KCk7XG4gICAgfVxuXG4gICAgbGV0IHJlc3BvbnNlOiBDcmVhdGVBZ2VudFJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IGFwaUNsaWVudC5wb3N0PENyZWF0ZUFnZW50UmVzcG9uc2U+KFxuICAgICAgICBcIi9hcGkvdjEvcmNzL2FnZW50c1wiLFxuICAgICAgICBib2R5LFxuICAgICAgICB0cnVlLFxuICAgICAgICB7IGlkZW1wb3RlbmN5S2V5OiBmbGFnc1tcImlkZW1wb3RlbmN5LWtleVwiXSB9LFxuICAgICAgKTtcbiAgICAgIHNhdmVTcGlubmVyLnN0b3AoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNhdmVTcGlubmVyLnN0b3AoKTtcbiAgICAgIGlmIChyZXBvcnRSY3NFcnJvcihlcnIpKSB0aGlzLmV4aXQoMSk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgaWYgKGlzSnNvbk1vZGUoKSkge1xuICAgICAganNvbihyZXNwb25zZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYWdlbnQgPSByZXNwb25zZS5hZ2VudDtcbiAgICBzdWNjZXNzKGBBZ2VudCBkcmFmdCBzYXZlZDogJHthZ2VudC5pZH1gKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICAgIHByaW50QWdlbnQoYWdlbnQpO1xuICAgIGNvbnNvbGUubG9nKCk7XG4gICAgY29uc29sZS5sb2coXG4gICAgICBjb2xvcnMuZGltKFxuICAgICAgICBcIk1pc3NpbmcgZmllbGRzIGFyZSBjaGVja2VkIHdoZW4geW91IHN1Ym1pdDsgZmlsbCB0aGVtIGluIGFueSB0aW1lIHdpdGggYHNlbmRseSByY3MgYWdlbnRzIHVwZGF0ZWAuXCIsXG4gICAgICApLFxuICAgICk7XG4gICAgcHJpbnROZXh0U3RlcHMoXG4gICAgICBuZXh0U3RlcEZvcihcImRyYWZ0XCIsIHsgYnJhbmRJZDogYWdlbnQuYnJhbmRJZCwgYWdlbnRJZDogYWdlbnQuaWQgfSksXG4gICAgKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../../../lib/base-command.js";
|
|
2
|
+
export default class RcsAgentsDevicesSet extends AuthenticatedCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
id: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
phone: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string[] | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
10
|
+
clear: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
11
|
+
"idempotency-key": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
12
|
+
json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
13
|
+
quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
14
|
+
};
|
|
15
|
+
run(): Promise<void>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { Args, Flags } from "@oclif/core";
|
|
2
|
+
import { AuthenticatedCommand } from "../../../../lib/base-command.js";
|
|
3
|
+
import { apiClient } from "../../../../lib/api-client.js";
|
|
4
|
+
import { json, success, error, colors, spinner, isJsonMode, } from "../../../../lib/output.js";
|
|
5
|
+
import { idempotencyKeyFlag, parseDeviceFlags, printDevices, reportRcsError, } from "../../../../lib/rcs-registration.js";
|
|
6
|
+
export default class RcsAgentsDevicesSet extends AuthenticatedCommand {
|
|
7
|
+
static description = "Set the test devices invited to an RCS agent — the list you pass replaces the current one (up to 20)";
|
|
8
|
+
static examples = [
|
|
9
|
+
"<%= config.bin %> rcs agents devices set 3f6a1c9e-0000-0000-0000-000000000000 --phone +13125550100 --phone +13125550101",
|
|
10
|
+
'<%= config.bin %> rcs agents devices set 3f6a1c9e-0000-0000-0000-000000000000 --phone "+13125550100=Front desk Pixel"',
|
|
11
|
+
"<%= config.bin %> rcs agents devices set 3f6a1c9e-0000-0000-0000-000000000000 --clear",
|
|
12
|
+
];
|
|
13
|
+
static args = {
|
|
14
|
+
id: Args.string({
|
|
15
|
+
description: "Agent ID",
|
|
16
|
+
required: true,
|
|
17
|
+
}),
|
|
18
|
+
};
|
|
19
|
+
static flags = {
|
|
20
|
+
...AuthenticatedCommand.baseFlags,
|
|
21
|
+
phone: Flags.string({
|
|
22
|
+
char: "p",
|
|
23
|
+
description: 'Device phone number (E.164), optionally labelled as "+13125550100=Label". Repeatable.',
|
|
24
|
+
multiple: true,
|
|
25
|
+
exclusive: ["clear"],
|
|
26
|
+
}),
|
|
27
|
+
clear: Flags.boolean({
|
|
28
|
+
description: "Remove every invited device",
|
|
29
|
+
default: false,
|
|
30
|
+
}),
|
|
31
|
+
"idempotency-key": idempotencyKeyFlag,
|
|
32
|
+
};
|
|
33
|
+
async run() {
|
|
34
|
+
const { args, flags } = await this.parse(RcsAgentsDevicesSet);
|
|
35
|
+
const parsed = parseDeviceFlags(flags.phone);
|
|
36
|
+
if (typeof parsed === "string") {
|
|
37
|
+
error(parsed);
|
|
38
|
+
this.exit(1);
|
|
39
|
+
}
|
|
40
|
+
const devices = parsed;
|
|
41
|
+
if (devices.length === 0 && !flags.clear) {
|
|
42
|
+
error("Provide at least one --phone, or --clear to remove every device", {
|
|
43
|
+
hint: 'Example: --phone +13125550100 --phone "+13125550101=Jane\'s Pixel"',
|
|
44
|
+
});
|
|
45
|
+
this.exit(1);
|
|
46
|
+
}
|
|
47
|
+
const saveSpinner = spinner("Updating test devices...");
|
|
48
|
+
if (!isJsonMode()) {
|
|
49
|
+
saveSpinner.start();
|
|
50
|
+
}
|
|
51
|
+
let response;
|
|
52
|
+
try {
|
|
53
|
+
response = await apiClient.put(`/api/v1/rcs/agents/${encodeURIComponent(args.id)}/test-devices`, { devices }, true, { idempotencyKey: flags["idempotency-key"] });
|
|
54
|
+
saveSpinner.stop();
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
saveSpinner.stop();
|
|
58
|
+
if (reportRcsError(err))
|
|
59
|
+
this.exit(1);
|
|
60
|
+
throw err;
|
|
61
|
+
}
|
|
62
|
+
if (isJsonMode()) {
|
|
63
|
+
json(response);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const list = response.devices ?? [];
|
|
67
|
+
success(list.length === 0
|
|
68
|
+
? "Test devices cleared"
|
|
69
|
+
: `Test devices set: ${list.length}`);
|
|
70
|
+
printDevices(list);
|
|
71
|
+
if (list.length > 0) {
|
|
72
|
+
console.log();
|
|
73
|
+
console.log(colors.dim("Invites go out once the agent is in testing. Each device gets a prompt from the carrier network to accept; send a test message with `sendly rcs send` after it accepts."));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3Jjcy9hZ2VudHMvZGV2aWNlcy9zZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDdkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzFELE9BQU8sRUFDTCxJQUFJLEVBQ0osT0FBTyxFQUNQLEtBQUssRUFDTCxNQUFNLEVBQ04sT0FBTyxFQUNQLFVBQVUsR0FDWCxNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWixjQUFjLEdBRWYsTUFBTSxxQ0FBcUMsQ0FBQztBQU03QyxNQUFNLENBQUMsT0FBTyxPQUFPLG1CQUFvQixTQUFRLG9CQUFvQjtJQUNuRSxNQUFNLENBQUMsV0FBVyxHQUNoQixzR0FBc0csQ0FBQztJQUV6RyxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLHlIQUF5SDtRQUN6SCx1SEFBdUg7UUFDdkgsdUZBQXVGO0tBQ3hGLENBQUM7SUFFRixNQUFNLENBQUMsSUFBSSxHQUFHO1FBQ1osRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDZCxXQUFXLEVBQUUsVUFBVTtZQUN2QixRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUM7S0FDSCxDQUFDO0lBRUYsTUFBTSxDQUFDLEtBQUssR0FBRztRQUNiLEdBQUcsb0JBQW9CLENBQUMsU0FBUztRQUNqQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUNsQixJQUFJLEVBQUUsR0FBRztZQUNULFdBQVcsRUFDVCx1RkFBdUY7WUFDekYsUUFBUSxFQUFFLElBQUk7WUFDZCxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUM7U0FDckIsQ0FBQztRQUNGLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQ25CLFdBQVcsRUFBRSw2QkFBNkI7WUFDMUMsT0FBTyxFQUFFLEtBQUs7U0FDZixDQUFDO1FBQ0YsaUJBQWlCLEVBQUUsa0JBQWtCO0tBQ3RDLENBQUM7SUFFRixLQUFLLENBQUMsR0FBRztRQUNQLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFFOUQsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDL0IsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNmLENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxNQUF3RCxDQUFDO1FBQ3pFLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDekMsS0FBSyxDQUFDLGlFQUFpRSxFQUFFO2dCQUN2RSxJQUFJLEVBQUUsb0VBQW9FO2FBQzNFLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZixDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDbEIsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3RCLENBQUM7UUFFRCxJQUFJLFFBQTRCLENBQUM7UUFDakMsSUFBSSxDQUFDO1lBQ0gsUUFBUSxHQUFHLE1BQU0sU0FBUyxDQUFDLEdBQUcsQ0FDNUIsc0JBQXNCLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxFQUNoRSxFQUFFLE9BQU8sRUFBRSxFQUNYLElBQUksRUFDSixFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUM3QyxDQUFDO1lBQ0YsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25CLElBQUksY0FBYyxDQUFDLEdBQUcsQ0FBQztnQkFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sR0FBRyxDQUFDO1FBQ1osQ0FBQztRQUVELElBQUksVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDZixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO1FBQ3BDLE9BQU8sQ0FDTCxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDZixDQUFDLENBQUMsc0JBQXNCO1lBQ3hCLENBQUMsQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUN2QyxDQUFDO1FBQ0YsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25CLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwQixPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDZCxPQUFPLENBQUMsR0FBRyxDQUNULE1BQU0sQ0FBQyxHQUFHLENBQ1IseUtBQXlLLENBQzFLLENBQ0YsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXJncywgRmxhZ3MgfSBmcm9tIFwiQG9jbGlmL2NvcmVcIjtcbmltcG9ydCB7IEF1dGhlbnRpY2F0ZWRDb21tYW5kIH0gZnJvbSBcIi4uLy4uLy4uLy4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGFwaUNsaWVudCB9IGZyb20gXCIuLi8uLi8uLi8uLi9saWIvYXBpLWNsaWVudC5qc1wiO1xuaW1wb3J0IHtcbiAganNvbixcbiAgc3VjY2VzcyxcbiAgZXJyb3IsXG4gIGNvbG9ycyxcbiAgc3Bpbm5lcixcbiAgaXNKc29uTW9kZSxcbn0gZnJvbSBcIi4uLy4uLy4uLy4uL2xpYi9vdXRwdXQuanNcIjtcbmltcG9ydCB7XG4gIGlkZW1wb3RlbmN5S2V5RmxhZyxcbiAgcGFyc2VEZXZpY2VGbGFncyxcbiAgcHJpbnREZXZpY2VzLFxuICByZXBvcnRSY3NFcnJvcixcbiAgdHlwZSBQdWJsaWNSY3NUZXN0RGV2aWNlLFxufSBmcm9tIFwiLi4vLi4vLi4vLi4vbGliL3Jjcy1yZWdpc3RyYXRpb24uanNcIjtcblxuaW50ZXJmYWNlIFNldERldmljZXNSZXNwb25zZSB7XG4gIGRldmljZXM6IFB1YmxpY1Jjc1Rlc3REZXZpY2VbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmNzQWdlbnRzRGV2aWNlc1NldCBleHRlbmRzIEF1dGhlbnRpY2F0ZWRDb21tYW5kIHtcbiAgc3RhdGljIGRlc2NyaXB0aW9uID1cbiAgICBcIlNldCB0aGUgdGVzdCBkZXZpY2VzIGludml0ZWQgdG8gYW4gUkNTIGFnZW50IOKAlCB0aGUgbGlzdCB5b3UgcGFzcyByZXBsYWNlcyB0aGUgY3VycmVudCBvbmUgKHVwIHRvIDIwKVwiO1xuXG4gIHN0YXRpYyBleGFtcGxlcyA9IFtcbiAgICBcIjwlPSBjb25maWcuYmluICU+IHJjcyBhZ2VudHMgZGV2aWNlcyBzZXQgM2Y2YTFjOWUtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwIC0tcGhvbmUgKzEzMTI1NTUwMTAwIC0tcGhvbmUgKzEzMTI1NTUwMTAxXCIsXG4gICAgJzwlPSBjb25maWcuYmluICU+IHJjcyBhZ2VudHMgZGV2aWNlcyBzZXQgM2Y2YTFjOWUtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwIC0tcGhvbmUgXCIrMTMxMjU1NTAxMDA9RnJvbnQgZGVzayBQaXhlbFwiJyxcbiAgICBcIjwlPSBjb25maWcuYmluICU+IHJjcyBhZ2VudHMgZGV2aWNlcyBzZXQgM2Y2YTFjOWUtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwIC0tY2xlYXJcIixcbiAgXTtcblxuICBzdGF0aWMgYXJncyA9IHtcbiAgICBpZDogQXJncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246IFwiQWdlbnQgSURcIixcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH0pLFxuICB9O1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5BdXRoZW50aWNhdGVkQ29tbWFuZC5iYXNlRmxhZ3MsXG4gICAgcGhvbmU6IEZsYWdzLnN0cmluZyh7XG4gICAgICBjaGFyOiBcInBcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnRGV2aWNlIHBob25lIG51bWJlciAoRS4xNjQpLCBvcHRpb25hbGx5IGxhYmVsbGVkIGFzIFwiKzEzMTI1NTUwMTAwPUxhYmVsXCIuIFJlcGVhdGFibGUuJyxcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgZXhjbHVzaXZlOiBbXCJjbGVhclwiXSxcbiAgICB9KSxcbiAgICBjbGVhcjogRmxhZ3MuYm9vbGVhbih7XG4gICAgICBkZXNjcmlwdGlvbjogXCJSZW1vdmUgZXZlcnkgaW52aXRlZCBkZXZpY2VcIixcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgIH0pLFxuICAgIFwiaWRlbXBvdGVuY3kta2V5XCI6IGlkZW1wb3RlbmN5S2V5RmxhZyxcbiAgfTtcblxuICBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBhcmdzLCBmbGFncyB9ID0gYXdhaXQgdGhpcy5wYXJzZShSY3NBZ2VudHNEZXZpY2VzU2V0KTtcblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRGV2aWNlRmxhZ3MoZmxhZ3MucGhvbmUpO1xuICAgIGlmICh0eXBlb2YgcGFyc2VkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBlcnJvcihwYXJzZWQpO1xuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH1cbiAgICBjb25zdCBkZXZpY2VzID0gcGFyc2VkIGFzIEFycmF5PHsgcGhvbmVOdW1iZXI6IHN0cmluZzsgbGFiZWw/OiBzdHJpbmcgfT47XG4gICAgaWYgKGRldmljZXMubGVuZ3RoID09PSAwICYmICFmbGFncy5jbGVhcikge1xuICAgICAgZXJyb3IoXCJQcm92aWRlIGF0IGxlYXN0IG9uZSAtLXBob25lLCBvciAtLWNsZWFyIHRvIHJlbW92ZSBldmVyeSBkZXZpY2VcIiwge1xuICAgICAgICBoaW50OiAnRXhhbXBsZTogLS1waG9uZSArMTMxMjU1NTAxMDAgLS1waG9uZSBcIisxMzEyNTU1MDEwMT1KYW5lXFwncyBQaXhlbFwiJyxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHNhdmVTcGlubmVyID0gc3Bpbm5lcihcIlVwZGF0aW5nIHRlc3QgZGV2aWNlcy4uLlwiKTtcbiAgICBpZiAoIWlzSnNvbk1vZGUoKSkge1xuICAgICAgc2F2ZVNwaW5uZXIuc3RhcnQoKTtcbiAgICB9XG5cbiAgICBsZXQgcmVzcG9uc2U6IFNldERldmljZXNSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBhcGlDbGllbnQucHV0PFNldERldmljZXNSZXNwb25zZT4oXG4gICAgICAgIGAvYXBpL3YxL3Jjcy9hZ2VudHMvJHtlbmNvZGVVUklDb21wb25lbnQoYXJncy5pZCl9L3Rlc3QtZGV2aWNlc2AsXG4gICAgICAgIHsgZGV2aWNlcyB9LFxuICAgICAgICB0cnVlLFxuICAgICAgICB7IGlkZW1wb3RlbmN5S2V5OiBmbGFnc1tcImlkZW1wb3RlbmN5LWtleVwiXSB9LFxuICAgICAgKTtcbiAgICAgIHNhdmVTcGlubmVyLnN0b3AoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNhdmVTcGlubmVyLnN0b3AoKTtcbiAgICAgIGlmIChyZXBvcnRSY3NFcnJvcihlcnIpKSB0aGlzLmV4aXQoMSk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgaWYgKGlzSnNvbk1vZGUoKSkge1xuICAgICAganNvbihyZXNwb25zZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbGlzdCA9IHJlc3BvbnNlLmRldmljZXMgPz8gW107XG4gICAgc3VjY2VzcyhcbiAgICAgIGxpc3QubGVuZ3RoID09PSAwXG4gICAgICAgID8gXCJUZXN0IGRldmljZXMgY2xlYXJlZFwiXG4gICAgICAgIDogYFRlc3QgZGV2aWNlcyBzZXQ6ICR7bGlzdC5sZW5ndGh9YCxcbiAgICApO1xuICAgIHByaW50RGV2aWNlcyhsaXN0KTtcbiAgICBpZiAobGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNvbG9ycy5kaW0oXG4gICAgICAgICAgXCJJbnZpdGVzIGdvIG91dCBvbmNlIHRoZSBhZ2VudCBpcyBpbiB0ZXN0aW5nLiBFYWNoIGRldmljZSBnZXRzIGEgcHJvbXB0IGZyb20gdGhlIGNhcnJpZXIgbmV0d29yayB0byBhY2NlcHQ7IHNlbmQgYSB0ZXN0IG1lc3NhZ2Ugd2l0aCBgc2VuZGx5IHJjcyBzZW5kYCBhZnRlciBpdCBhY2NlcHRzLlwiLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../../lib/base-command.js";
|
|
2
|
+
export default class RcsAgentsGet extends AuthenticatedCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
id: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
10
|
+
quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
11
|
+
};
|
|
12
|
+
run(): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Args } from "@oclif/core";
|
|
2
|
+
import { AuthenticatedCommand } from "../../../lib/base-command.js";
|
|
3
|
+
import { apiClient } from "../../../lib/api-client.js";
|
|
4
|
+
import { json, spinner, isJsonMode } from "../../../lib/output.js";
|
|
5
|
+
import { nextStepFor, printAgent, printDevices, printNextSteps, reportRcsError, } from "../../../lib/rcs-registration.js";
|
|
6
|
+
export default class RcsAgentsGet extends AuthenticatedCommand {
|
|
7
|
+
static description = "Get an RCS agent with its test devices and the latest review stage (run again to refresh)";
|
|
8
|
+
static examples = [
|
|
9
|
+
"<%= config.bin %> rcs agents get 3f6a1c9e-0000-0000-0000-000000000000",
|
|
10
|
+
"<%= config.bin %> rcs agents get 3f6a1c9e-0000-0000-0000-000000000000 --json",
|
|
11
|
+
];
|
|
12
|
+
static args = {
|
|
13
|
+
id: Args.string({
|
|
14
|
+
description: "Agent ID",
|
|
15
|
+
required: true,
|
|
16
|
+
}),
|
|
17
|
+
};
|
|
18
|
+
static flags = {
|
|
19
|
+
...AuthenticatedCommand.baseFlags,
|
|
20
|
+
};
|
|
21
|
+
async run() {
|
|
22
|
+
const { args } = await this.parse(RcsAgentsGet);
|
|
23
|
+
const loadSpinner = spinner("Fetching RCS agent...");
|
|
24
|
+
if (!isJsonMode()) {
|
|
25
|
+
loadSpinner.start();
|
|
26
|
+
}
|
|
27
|
+
let response;
|
|
28
|
+
try {
|
|
29
|
+
response = await apiClient.get(`/api/v1/rcs/agents/${encodeURIComponent(args.id)}`);
|
|
30
|
+
loadSpinner.stop();
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
loadSpinner.stop();
|
|
34
|
+
if (reportRcsError(err))
|
|
35
|
+
this.exit(1);
|
|
36
|
+
throw err;
|
|
37
|
+
}
|
|
38
|
+
if (isJsonMode()) {
|
|
39
|
+
json(response);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
console.log();
|
|
43
|
+
printAgent(response.agent);
|
|
44
|
+
printDevices(response.devices ?? response.agent.testDevices ?? []);
|
|
45
|
+
printNextSteps(nextStepFor(response.stage ?? response.agent.customerStage, {
|
|
46
|
+
brandId: response.agent.brandId,
|
|
47
|
+
agentId: response.agent.id,
|
|
48
|
+
}));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3Jjcy9hZ2VudHMvZ2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbkMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ25FLE9BQU8sRUFDTCxXQUFXLEVBQ1gsVUFBVSxFQUNWLFlBQVksRUFDWixjQUFjLEVBQ2QsY0FBYyxHQUlmLE1BQU0sa0NBQWtDLENBQUM7QUFRMUMsTUFBTSxDQUFDLE9BQU8sT0FBTyxZQUFhLFNBQVEsb0JBQW9CO0lBQzVELE1BQU0sQ0FBQyxXQUFXLEdBQ2hCLDJGQUEyRixDQUFDO0lBRTlGLE1BQU0sQ0FBQyxRQUFRLEdBQUc7UUFDaEIsdUVBQXVFO1FBQ3ZFLDhFQUE4RTtLQUMvRSxDQUFDO0lBRUYsTUFBTSxDQUFDLElBQUksR0FBRztRQUNaLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ2QsV0FBVyxFQUFFLFVBQVU7WUFDdkIsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDO0tBQ0gsQ0FBQztJQUVGLE1BQU0sQ0FBQyxLQUFLLEdBQUc7UUFDYixHQUFHLG9CQUFvQixDQUFDLFNBQVM7S0FDbEMsQ0FBQztJQUVGLEtBQUssQ0FBQyxHQUFHO1FBQ1AsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVoRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUNsQixXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEIsQ0FBQztRQUVELElBQUksUUFBMEIsQ0FBQztRQUMvQixJQUFJLENBQUM7WUFDSCxRQUFRLEdBQUcsTUFBTSxTQUFTLENBQUMsR0FBRyxDQUM1QixzQkFBc0Isa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQ3BELENBQUM7WUFDRixXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbkIsSUFBSSxjQUFjLENBQUMsR0FBRyxDQUFDO2dCQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEMsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDO1FBRUQsSUFBSSxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNmLE9BQU87UUFDVCxDQUFDO1FBRUQsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2QsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzQixZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNuRSxjQUFjLENBQ1osV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUU7WUFDMUQsT0FBTyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTztZQUMvQixPQUFPLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1NBQzNCLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFyZ3MgfSBmcm9tIFwiQG9jbGlmL2NvcmVcIjtcbmltcG9ydCB7IEF1dGhlbnRpY2F0ZWRDb21tYW5kIH0gZnJvbSBcIi4uLy4uLy4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGFwaUNsaWVudCB9IGZyb20gXCIuLi8uLi8uLi9saWIvYXBpLWNsaWVudC5qc1wiO1xuaW1wb3J0IHsganNvbiwgc3Bpbm5lciwgaXNKc29uTW9kZSB9IGZyb20gXCIuLi8uLi8uLi9saWIvb3V0cHV0LmpzXCI7XG5pbXBvcnQge1xuICBuZXh0U3RlcEZvcixcbiAgcHJpbnRBZ2VudCxcbiAgcHJpbnREZXZpY2VzLFxuICBwcmludE5leHRTdGVwcyxcbiAgcmVwb3J0UmNzRXJyb3IsXG4gIHR5cGUgQ3VzdG9tZXJTdGFnZSxcbiAgdHlwZSBQdWJsaWNSY3NBZ2VudCxcbiAgdHlwZSBQdWJsaWNSY3NUZXN0RGV2aWNlLFxufSBmcm9tIFwiLi4vLi4vLi4vbGliL3Jjcy1yZWdpc3RyYXRpb24uanNcIjtcblxuaW50ZXJmYWNlIEdldEFnZW50UmVzcG9uc2Uge1xuICBhZ2VudDogUHVibGljUmNzQWdlbnQ7XG4gIGRldmljZXM6IFB1YmxpY1Jjc1Rlc3REZXZpY2VbXTtcbiAgc3RhZ2U6IEN1c3RvbWVyU3RhZ2U7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJjc0FnZW50c0dldCBleHRlbmRzIEF1dGhlbnRpY2F0ZWRDb21tYW5kIHtcbiAgc3RhdGljIGRlc2NyaXB0aW9uID1cbiAgICBcIkdldCBhbiBSQ1MgYWdlbnQgd2l0aCBpdHMgdGVzdCBkZXZpY2VzIGFuZCB0aGUgbGF0ZXN0IHJldmlldyBzdGFnZSAocnVuIGFnYWluIHRvIHJlZnJlc2gpXCI7XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gcmNzIGFnZW50cyBnZXQgM2Y2YTFjOWUtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIsXG4gICAgXCI8JT0gY29uZmlnLmJpbiAlPiByY3MgYWdlbnRzIGdldCAzZjZhMWM5ZS0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAgLS1qc29uXCIsXG4gIF07XG5cbiAgc3RhdGljIGFyZ3MgPSB7XG4gICAgaWQ6IEFyZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkFnZW50IElEXCIsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9KSxcbiAgfTtcblxuICBzdGF0aWMgZmxhZ3MgPSB7XG4gICAgLi4uQXV0aGVudGljYXRlZENvbW1hbmQuYmFzZUZsYWdzLFxuICB9O1xuXG4gIGFzeW5jIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGFyZ3MgfSA9IGF3YWl0IHRoaXMucGFyc2UoUmNzQWdlbnRzR2V0KTtcblxuICAgIGNvbnN0IGxvYWRTcGlubmVyID0gc3Bpbm5lcihcIkZldGNoaW5nIFJDUyBhZ2VudC4uLlwiKTtcbiAgICBpZiAoIWlzSnNvbk1vZGUoKSkge1xuICAgICAgbG9hZFNwaW5uZXIuc3RhcnQoKTtcbiAgICB9XG5cbiAgICBsZXQgcmVzcG9uc2U6IEdldEFnZW50UmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgYXBpQ2xpZW50LmdldDxHZXRBZ2VudFJlc3BvbnNlPihcbiAgICAgICAgYC9hcGkvdjEvcmNzL2FnZW50cy8ke2VuY29kZVVSSUNvbXBvbmVudChhcmdzLmlkKX1gLFxuICAgICAgKTtcbiAgICAgIGxvYWRTcGlubmVyLnN0b3AoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvYWRTcGlubmVyLnN0b3AoKTtcbiAgICAgIGlmIChyZXBvcnRSY3NFcnJvcihlcnIpKSB0aGlzLmV4aXQoMSk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgaWYgKGlzSnNvbk1vZGUoKSkge1xuICAgICAganNvbihyZXNwb25zZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coKTtcbiAgICBwcmludEFnZW50KHJlc3BvbnNlLmFnZW50KTtcbiAgICBwcmludERldmljZXMocmVzcG9uc2UuZGV2aWNlcyA/PyByZXNwb25zZS5hZ2VudC50ZXN0RGV2aWNlcyA/PyBbXSk7XG4gICAgcHJpbnROZXh0U3RlcHMoXG4gICAgICBuZXh0U3RlcEZvcihyZXNwb25zZS5zdGFnZSA/PyByZXNwb25zZS5hZ2VudC5jdXN0b21lclN0YWdlLCB7XG4gICAgICAgIGJyYW5kSWQ6IHJlc3BvbnNlLmFnZW50LmJyYW5kSWQsXG4gICAgICAgIGFnZW50SWQ6IHJlc3BvbnNlLmFnZW50LmlkLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../../lib/base-command.js";
|
|
2
|
+
export default class RcsAgentsRequestLaunch extends AuthenticatedCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
id: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
"test-url": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
10
|
+
"testing-info": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
11
|
+
"idempotency-key": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
12
|
+
json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
13
|
+
quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
14
|
+
};
|
|
15
|
+
run(): Promise<void>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { Args, Flags } from "@oclif/core";
|
|
2
|
+
import { AuthenticatedCommand } from "../../../lib/base-command.js";
|
|
3
|
+
import { apiClient } from "../../../lib/api-client.js";
|
|
4
|
+
import { json, success, colors, spinner, isJsonMode, keyValue, } from "../../../lib/output.js";
|
|
5
|
+
import { formatStage, idempotencyKeyFlag, nextStepFor, printNextSteps, reportRcsError, } from "../../../lib/rcs-registration.js";
|
|
6
|
+
export default class RcsAgentsRequestLaunch extends AuthenticatedCommand {
|
|
7
|
+
static description = "Request launch once testing is done — Sendly reviews the campaign details, then sends the launch to the carrier network";
|
|
8
|
+
static examples = [
|
|
9
|
+
"<%= config.bin %> rcs agents request-launch 3f6a1c9e-0000-0000-0000-000000000000 --test-url https://acme.com/rcs-test-recording.mp4",
|
|
10
|
+
'<%= config.bin %> rcs agents request-launch 3f6a1c9e-0000-0000-0000-000000000000 --test-url https://acme.com/rcs-test.png --testing-info "Tested on two Pixel devices" --json',
|
|
11
|
+
];
|
|
12
|
+
static args = {
|
|
13
|
+
id: Args.string({
|
|
14
|
+
description: "Agent ID",
|
|
15
|
+
required: true,
|
|
16
|
+
}),
|
|
17
|
+
};
|
|
18
|
+
static flags = {
|
|
19
|
+
...AuthenticatedCommand.baseFlags,
|
|
20
|
+
"test-url": Flags.string({
|
|
21
|
+
description: "Public https:// URL of a screen recording or screenshots of the agent on a test device (stored on the agent before the request)",
|
|
22
|
+
}),
|
|
23
|
+
"testing-info": Flags.string({
|
|
24
|
+
description: "Anything else reviewers should know about testing",
|
|
25
|
+
}),
|
|
26
|
+
"idempotency-key": idempotencyKeyFlag,
|
|
27
|
+
};
|
|
28
|
+
async run() {
|
|
29
|
+
const { args, flags } = await this.parse(RcsAgentsRequestLaunch);
|
|
30
|
+
const body = {};
|
|
31
|
+
if (flags["test-url"] !== undefined)
|
|
32
|
+
body.testUrl = flags["test-url"];
|
|
33
|
+
if (flags["testing-info"] !== undefined) {
|
|
34
|
+
body.testingAdditionalInformation = flags["testing-info"];
|
|
35
|
+
}
|
|
36
|
+
const launchSpinner = spinner("Requesting launch...");
|
|
37
|
+
if (!isJsonMode()) {
|
|
38
|
+
launchSpinner.start();
|
|
39
|
+
}
|
|
40
|
+
let response;
|
|
41
|
+
try {
|
|
42
|
+
response = await apiClient.post(`/api/v1/rcs/agents/${encodeURIComponent(args.id)}/request-launch`, body, true, { idempotencyKey: flags["idempotency-key"] });
|
|
43
|
+
launchSpinner.stop();
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
launchSpinner.stop();
|
|
47
|
+
if (reportRcsError(err))
|
|
48
|
+
this.exit(1);
|
|
49
|
+
throw err;
|
|
50
|
+
}
|
|
51
|
+
if (isJsonMode()) {
|
|
52
|
+
json(response);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const agent = response.agent;
|
|
56
|
+
const stage = response.stage ?? agent.customerStage;
|
|
57
|
+
success(`Launch requested: ${agent.displayName || agent.id}`);
|
|
58
|
+
console.log();
|
|
59
|
+
keyValue([
|
|
60
|
+
["Agent", agent.id],
|
|
61
|
+
["Brand", agent.brandId ?? colors.dim("—")],
|
|
62
|
+
["Stage", formatStage(stage)],
|
|
63
|
+
["Review", agent.reviewStatus],
|
|
64
|
+
...(agent.testing?.testUrl
|
|
65
|
+
? [["Test URL", String(agent.testing.testUrl)]]
|
|
66
|
+
: []),
|
|
67
|
+
]);
|
|
68
|
+
printNextSteps(nextStepFor(stage, { brandId: agent.brandId, agentId: agent.id }));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1sYXVuY2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tbWFuZHMvcmNzL2FnZW50cy9yZXF1ZXN0LWxhdW5jaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMxQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUNMLElBQUksRUFDSixPQUFPLEVBQ1AsTUFBTSxFQUNOLE9BQU8sRUFDUCxVQUFVLEVBQ1YsUUFBUSxHQUNULE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUNMLFdBQVcsRUFDWCxrQkFBa0IsRUFDbEIsV0FBVyxFQUNYLGNBQWMsRUFDZCxjQUFjLEdBR2YsTUFBTSxrQ0FBa0MsQ0FBQztBQU8xQyxNQUFNLENBQUMsT0FBTyxPQUFPLHNCQUF1QixTQUFRLG9CQUFvQjtJQUN0RSxNQUFNLENBQUMsV0FBVyxHQUNoQix5SEFBeUgsQ0FBQztJQUU1SCxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLHFJQUFxSTtRQUNySSwrS0FBK0s7S0FDaEwsQ0FBQztJQUVGLE1BQU0sQ0FBQyxJQUFJLEdBQUc7UUFDWixFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNkLFdBQVcsRUFBRSxVQUFVO1lBQ3ZCLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQztLQUNILENBQUM7SUFFRixNQUFNLENBQUMsS0FBSyxHQUFHO1FBQ2IsR0FBRyxvQkFBb0IsQ0FBQyxTQUFTO1FBQ2pDLFVBQVUsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQ3ZCLFdBQVcsRUFDVCxpSUFBaUk7U0FDcEksQ0FBQztRQUNGLGNBQWMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQzNCLFdBQVcsRUFBRSxtREFBbUQ7U0FDakUsQ0FBQztRQUNGLGlCQUFpQixFQUFFLGtCQUFrQjtLQUN0QyxDQUFDO0lBRUYsS0FBSyxDQUFDLEdBQUc7UUFDUCxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBRWpFLE1BQU0sSUFBSSxHQUE0QixFQUFFLENBQUM7UUFDekMsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3RFLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUVELE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ2xCLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QixDQUFDO1FBRUQsSUFBSSxRQUErQixDQUFDO1FBQ3BDLElBQUksQ0FBQztZQUNILFFBQVEsR0FBRyxNQUFNLFNBQVMsQ0FBQyxJQUFJLENBQzdCLHNCQUFzQixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUNsRSxJQUFJLEVBQ0osSUFBSSxFQUNKLEVBQUUsY0FBYyxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQzdDLENBQUM7WUFDRixhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkIsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDckIsSUFBSSxjQUFjLENBQUMsR0FBRyxDQUFDO2dCQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEMsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDO1FBRUQsSUFBSSxVQUFVLEVBQUUsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNmLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUM3QixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUM7UUFDcEQsT0FBTyxDQUFDLHFCQUFxQixLQUFLLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzlELE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNkLFFBQVEsQ0FBQztZQUNQLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNDLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDO1lBQzlCLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLE9BQU87Z0JBQ3hCLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFxQixDQUFDO2dCQUNuRSxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ1IsQ0FBQyxDQUFDO1FBQ0gsY0FBYyxDQUNaLFdBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQ2xFLENBQUM7SUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXJncywgRmxhZ3MgfSBmcm9tIFwiQG9jbGlmL2NvcmVcIjtcbmltcG9ydCB7IEF1dGhlbnRpY2F0ZWRDb21tYW5kIH0gZnJvbSBcIi4uLy4uLy4uL2xpYi9iYXNlLWNvbW1hbmQuanNcIjtcbmltcG9ydCB7IGFwaUNsaWVudCB9IGZyb20gXCIuLi8uLi8uLi9saWIvYXBpLWNsaWVudC5qc1wiO1xuaW1wb3J0IHtcbiAganNvbixcbiAgc3VjY2VzcyxcbiAgY29sb3JzLFxuICBzcGlubmVyLFxuICBpc0pzb25Nb2RlLFxuICBrZXlWYWx1ZSxcbn0gZnJvbSBcIi4uLy4uLy4uL2xpYi9vdXRwdXQuanNcIjtcbmltcG9ydCB7XG4gIGZvcm1hdFN0YWdlLFxuICBpZGVtcG90ZW5jeUtleUZsYWcsXG4gIG5leHRTdGVwRm9yLFxuICBwcmludE5leHRTdGVwcyxcbiAgcmVwb3J0UmNzRXJyb3IsXG4gIHR5cGUgQ3VzdG9tZXJTdGFnZSxcbiAgdHlwZSBQdWJsaWNSY3NBZ2VudCxcbn0gZnJvbSBcIi4uLy4uLy4uL2xpYi9yY3MtcmVnaXN0cmF0aW9uLmpzXCI7XG5cbmludGVyZmFjZSBSZXF1ZXN0TGF1bmNoUmVzcG9uc2Uge1xuICBhZ2VudDogUHVibGljUmNzQWdlbnQ7XG4gIHN0YWdlOiBDdXN0b21lclN0YWdlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSY3NBZ2VudHNSZXF1ZXN0TGF1bmNoIGV4dGVuZHMgQXV0aGVudGljYXRlZENvbW1hbmQge1xuICBzdGF0aWMgZGVzY3JpcHRpb24gPVxuICAgIFwiUmVxdWVzdCBsYXVuY2ggb25jZSB0ZXN0aW5nIGlzIGRvbmUg4oCUIFNlbmRseSByZXZpZXdzIHRoZSBjYW1wYWlnbiBkZXRhaWxzLCB0aGVuIHNlbmRzIHRoZSBsYXVuY2ggdG8gdGhlIGNhcnJpZXIgbmV0d29ya1wiO1xuXG4gIHN0YXRpYyBleGFtcGxlcyA9IFtcbiAgICBcIjwlPSBjb25maWcuYmluICU+IHJjcyBhZ2VudHMgcmVxdWVzdC1sYXVuY2ggM2Y2YTFjOWUtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwIC0tdGVzdC11cmwgaHR0cHM6Ly9hY21lLmNvbS9yY3MtdGVzdC1yZWNvcmRpbmcubXA0XCIsXG4gICAgJzwlPSBjb25maWcuYmluICU+IHJjcyBhZ2VudHMgcmVxdWVzdC1sYXVuY2ggM2Y2YTFjOWUtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwIC0tdGVzdC11cmwgaHR0cHM6Ly9hY21lLmNvbS9yY3MtdGVzdC5wbmcgLS10ZXN0aW5nLWluZm8gXCJUZXN0ZWQgb24gdHdvIFBpeGVsIGRldmljZXNcIiAtLWpzb24nLFxuICBdO1xuXG4gIHN0YXRpYyBhcmdzID0ge1xuICAgIGlkOiBBcmdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJBZ2VudCBJRFwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSksXG4gIH07XG5cbiAgc3RhdGljIGZsYWdzID0ge1xuICAgIC4uLkF1dGhlbnRpY2F0ZWRDb21tYW5kLmJhc2VGbGFncyxcbiAgICBcInRlc3QtdXJsXCI6IEZsYWdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJQdWJsaWMgaHR0cHM6Ly8gVVJMIG9mIGEgc2NyZWVuIHJlY29yZGluZyBvciBzY3JlZW5zaG90cyBvZiB0aGUgYWdlbnQgb24gYSB0ZXN0IGRldmljZSAoc3RvcmVkIG9uIHRoZSBhZ2VudCBiZWZvcmUgdGhlIHJlcXVlc3QpXCIsXG4gICAgfSksXG4gICAgXCJ0ZXN0aW5nLWluZm9cIjogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIkFueXRoaW5nIGVsc2UgcmV2aWV3ZXJzIHNob3VsZCBrbm93IGFib3V0IHRlc3RpbmdcIixcbiAgICB9KSxcbiAgICBcImlkZW1wb3RlbmN5LWtleVwiOiBpZGVtcG90ZW5jeUtleUZsYWcsXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgYXJncywgZmxhZ3MgfSA9IGF3YWl0IHRoaXMucGFyc2UoUmNzQWdlbnRzUmVxdWVzdExhdW5jaCk7XG5cbiAgICBjb25zdCBib2R5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGlmIChmbGFnc1tcInRlc3QtdXJsXCJdICE9PSB1bmRlZmluZWQpIGJvZHkudGVzdFVybCA9IGZsYWdzW1widGVzdC11cmxcIl07XG4gICAgaWYgKGZsYWdzW1widGVzdGluZy1pbmZvXCJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGJvZHkudGVzdGluZ0FkZGl0aW9uYWxJbmZvcm1hdGlvbiA9IGZsYWdzW1widGVzdGluZy1pbmZvXCJdO1xuICAgIH1cblxuICAgIGNvbnN0IGxhdW5jaFNwaW5uZXIgPSBzcGlubmVyKFwiUmVxdWVzdGluZyBsYXVuY2guLi5cIik7XG4gICAgaWYgKCFpc0pzb25Nb2RlKCkpIHtcbiAgICAgIGxhdW5jaFNwaW5uZXIuc3RhcnQoKTtcbiAgICB9XG5cbiAgICBsZXQgcmVzcG9uc2U6IFJlcXVlc3RMYXVuY2hSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCBhcGlDbGllbnQucG9zdDxSZXF1ZXN0TGF1bmNoUmVzcG9uc2U+KFxuICAgICAgICBgL2FwaS92MS9yY3MvYWdlbnRzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3MuaWQpfS9yZXF1ZXN0LWxhdW5jaGAsXG4gICAgICAgIGJvZHksXG4gICAgICAgIHRydWUsXG4gICAgICAgIHsgaWRlbXBvdGVuY3lLZXk6IGZsYWdzW1wiaWRlbXBvdGVuY3kta2V5XCJdIH0sXG4gICAgICApO1xuICAgICAgbGF1bmNoU3Bpbm5lci5zdG9wKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsYXVuY2hTcGlubmVyLnN0b3AoKTtcbiAgICAgIGlmIChyZXBvcnRSY3NFcnJvcihlcnIpKSB0aGlzLmV4aXQoMSk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgaWYgKGlzSnNvbk1vZGUoKSkge1xuICAgICAganNvbihyZXNwb25zZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYWdlbnQgPSByZXNwb25zZS5hZ2VudDtcbiAgICBjb25zdCBzdGFnZSA9IHJlc3BvbnNlLnN0YWdlID8/IGFnZW50LmN1c3RvbWVyU3RhZ2U7XG4gICAgc3VjY2VzcyhgTGF1bmNoIHJlcXVlc3RlZDogJHthZ2VudC5kaXNwbGF5TmFtZSB8fCBhZ2VudC5pZH1gKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGtleVZhbHVlKFtcbiAgICAgIFtcIkFnZW50XCIsIGFnZW50LmlkXSxcbiAgICAgIFtcIkJyYW5kXCIsIGFnZW50LmJyYW5kSWQgPz8gY29sb3JzLmRpbShcIuKAlFwiKV0sXG4gICAgICBbXCJTdGFnZVwiLCBmb3JtYXRTdGFnZShzdGFnZSldLFxuICAgICAgW1wiUmV2aWV3XCIsIGFnZW50LnJldmlld1N0YXR1c10sXG4gICAgICAuLi4oYWdlbnQudGVzdGluZz8udGVzdFVybFxuICAgICAgICA/IFtbXCJUZXN0IFVSTFwiLCBTdHJpbmcoYWdlbnQudGVzdGluZy50ZXN0VXJsKV0gYXMgW3N0cmluZywgc3RyaW5nXV1cbiAgICAgICAgOiBbXSksXG4gICAgXSk7XG4gICAgcHJpbnROZXh0U3RlcHMoXG4gICAgICBuZXh0U3RlcEZvcihzdGFnZSwgeyBicmFuZElkOiBhZ2VudC5icmFuZElkLCBhZ2VudElkOiBhZ2VudC5pZCB9KSxcbiAgICApO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { AuthenticatedCommand } from "../../../lib/base-command.js";
|
|
2
|
+
export default class RcsAgentsSubmit extends AuthenticatedCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static args: {
|
|
6
|
+
id: import("@oclif/core/lib/interfaces/parser.js").Arg<string, Record<string, unknown>>;
|
|
7
|
+
};
|
|
8
|
+
static flags: {
|
|
9
|
+
"idempotency-key": import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
10
|
+
json: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
11
|
+
quiet: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
12
|
+
};
|
|
13
|
+
run(): Promise<void>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Args } from "@oclif/core";
|
|
2
|
+
import { AuthenticatedCommand } from "../../../lib/base-command.js";
|
|
3
|
+
import { apiClient } from "../../../lib/api-client.js";
|
|
4
|
+
import { json, success, colors, spinner, isJsonMode, keyValue, } from "../../../lib/output.js";
|
|
5
|
+
import { formatStage, idempotencyKeyFlag, nextStepFor, printNextSteps, reportRcsError, } from "../../../lib/rcs-registration.js";
|
|
6
|
+
export default class RcsAgentsSubmit extends AuthenticatedCommand {
|
|
7
|
+
static description = "Submit the brand and agent for review (Sendly checks them, then sends them on to the carrier network)";
|
|
8
|
+
static examples = [
|
|
9
|
+
"<%= config.bin %> rcs agents submit 3f6a1c9e-0000-0000-0000-000000000000",
|
|
10
|
+
"<%= config.bin %> rcs agents submit 3f6a1c9e-0000-0000-0000-000000000000 --idempotency-key acme-rcs-submit-1 --json",
|
|
11
|
+
];
|
|
12
|
+
static args = {
|
|
13
|
+
id: Args.string({
|
|
14
|
+
description: "Agent ID",
|
|
15
|
+
required: true,
|
|
16
|
+
}),
|
|
17
|
+
};
|
|
18
|
+
static flags = {
|
|
19
|
+
...AuthenticatedCommand.baseFlags,
|
|
20
|
+
"idempotency-key": idempotencyKeyFlag,
|
|
21
|
+
};
|
|
22
|
+
async run() {
|
|
23
|
+
const { args, flags } = await this.parse(RcsAgentsSubmit);
|
|
24
|
+
const submitSpinner = spinner("Submitting for review...");
|
|
25
|
+
if (!isJsonMode()) {
|
|
26
|
+
submitSpinner.start();
|
|
27
|
+
}
|
|
28
|
+
let response;
|
|
29
|
+
try {
|
|
30
|
+
response = await apiClient.post(`/api/v1/rcs/agents/${encodeURIComponent(args.id)}/submit`, {}, true, { idempotencyKey: flags["idempotency-key"] });
|
|
31
|
+
submitSpinner.stop();
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
submitSpinner.stop();
|
|
35
|
+
if (reportRcsError(err))
|
|
36
|
+
this.exit(1);
|
|
37
|
+
throw err;
|
|
38
|
+
}
|
|
39
|
+
if (isJsonMode()) {
|
|
40
|
+
json(response);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const agent = response.agent;
|
|
44
|
+
const stage = response.stage ?? agent.customerStage;
|
|
45
|
+
success(`Submitted for review: ${agent.displayName || agent.id}`);
|
|
46
|
+
console.log();
|
|
47
|
+
keyValue([
|
|
48
|
+
["Agent", agent.id],
|
|
49
|
+
["Brand", agent.brandId ?? colors.dim("—")],
|
|
50
|
+
["Stage", formatStage(stage)],
|
|
51
|
+
["Review", agent.reviewStatus],
|
|
52
|
+
]);
|
|
53
|
+
printNextSteps(nextStepFor(stage, { brandId: agent.brandId, agentId: agent.id }));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VibWl0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3Jjcy9hZ2VudHMvc3VibWl0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbkMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZELE9BQU8sRUFDTCxJQUFJLEVBQ0osT0FBTyxFQUNQLE1BQU0sRUFDTixPQUFPLEVBQ1AsVUFBVSxFQUNWLFFBQVEsR0FDVCxNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFDTCxXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLFdBQVcsRUFDWCxjQUFjLEVBQ2QsY0FBYyxHQUdmLE1BQU0sa0NBQWtDLENBQUM7QUFPMUMsTUFBTSxDQUFDLE9BQU8sT0FBTyxlQUFnQixTQUFRLG9CQUFvQjtJQUMvRCxNQUFNLENBQUMsV0FBVyxHQUNoQix1R0FBdUcsQ0FBQztJQUUxRyxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLDBFQUEwRTtRQUMxRSxxSEFBcUg7S0FDdEgsQ0FBQztJQUVGLE1BQU0sQ0FBQyxJQUFJLEdBQUc7UUFDWixFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNkLFdBQVcsRUFBRSxVQUFVO1lBQ3ZCLFFBQVEsRUFBRSxJQUFJO1NBQ2YsQ0FBQztLQUNILENBQUM7SUFFRixNQUFNLENBQUMsS0FBSyxHQUFHO1FBQ2IsR0FBRyxvQkFBb0IsQ0FBQyxTQUFTO1FBQ2pDLGlCQUFpQixFQUFFLGtCQUFrQjtLQUN0QyxDQUFDO0lBRUYsS0FBSyxDQUFDLEdBQUc7UUFDUCxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUUxRCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQztZQUNsQixhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEIsQ0FBQztRQUVELElBQUksUUFBNkIsQ0FBQztRQUNsQyxJQUFJLENBQUM7WUFDSCxRQUFRLEdBQUcsTUFBTSxTQUFTLENBQUMsSUFBSSxDQUM3QixzQkFBc0Isa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQzFELEVBQUUsRUFDRixJQUFJLEVBQ0osRUFBRSxjQUFjLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FDN0MsQ0FBQztZQUNGLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNyQixJQUFJLGNBQWMsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QyxNQUFNLEdBQUcsQ0FBQztRQUNaLENBQUM7UUFFRCxJQUFJLFVBQVUsRUFBRSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2YsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQzdCLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQztRQUNwRCxPQUFPLENBQUMseUJBQXlCLEtBQUssQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEUsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2QsUUFBUSxDQUFDO1lBQ1AsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNuQixDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDM0MsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdCLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUM7U0FDL0IsQ0FBQyxDQUFDO1FBQ0gsY0FBYyxDQUNaLFdBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQ2xFLENBQUM7SUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXJncyB9IGZyb20gXCJAb2NsaWYvY29yZVwiO1xuaW1wb3J0IHsgQXV0aGVudGljYXRlZENvbW1hbmQgfSBmcm9tIFwiLi4vLi4vLi4vbGliL2Jhc2UtY29tbWFuZC5qc1wiO1xuaW1wb3J0IHsgYXBpQ2xpZW50IH0gZnJvbSBcIi4uLy4uLy4uL2xpYi9hcGktY2xpZW50LmpzXCI7XG5pbXBvcnQge1xuICBqc29uLFxuICBzdWNjZXNzLFxuICBjb2xvcnMsXG4gIHNwaW5uZXIsXG4gIGlzSnNvbk1vZGUsXG4gIGtleVZhbHVlLFxufSBmcm9tIFwiLi4vLi4vLi4vbGliL291dHB1dC5qc1wiO1xuaW1wb3J0IHtcbiAgZm9ybWF0U3RhZ2UsXG4gIGlkZW1wb3RlbmN5S2V5RmxhZyxcbiAgbmV4dFN0ZXBGb3IsXG4gIHByaW50TmV4dFN0ZXBzLFxuICByZXBvcnRSY3NFcnJvcixcbiAgdHlwZSBDdXN0b21lclN0YWdlLFxuICB0eXBlIFB1YmxpY1Jjc0FnZW50LFxufSBmcm9tIFwiLi4vLi4vLi4vbGliL3Jjcy1yZWdpc3RyYXRpb24uanNcIjtcblxuaW50ZXJmYWNlIFN1Ym1pdEFnZW50UmVzcG9uc2Uge1xuICBhZ2VudDogUHVibGljUmNzQWdlbnQ7XG4gIHN0YWdlOiBDdXN0b21lclN0YWdlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSY3NBZ2VudHNTdWJtaXQgZXh0ZW5kcyBBdXRoZW50aWNhdGVkQ29tbWFuZCB7XG4gIHN0YXRpYyBkZXNjcmlwdGlvbiA9XG4gICAgXCJTdWJtaXQgdGhlIGJyYW5kIGFuZCBhZ2VudCBmb3IgcmV2aWV3IChTZW5kbHkgY2hlY2tzIHRoZW0sIHRoZW4gc2VuZHMgdGhlbSBvbiB0byB0aGUgY2FycmllciBuZXR3b3JrKVwiO1xuXG4gIHN0YXRpYyBleGFtcGxlcyA9IFtcbiAgICBcIjwlPSBjb25maWcuYmluICU+IHJjcyBhZ2VudHMgc3VibWl0IDNmNmExYzllLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiLFxuICAgIFwiPCU9IGNvbmZpZy5iaW4gJT4gcmNzIGFnZW50cyBzdWJtaXQgM2Y2YTFjOWUtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwIC0taWRlbXBvdGVuY3kta2V5IGFjbWUtcmNzLXN1Ym1pdC0xIC0tanNvblwiLFxuICBdO1xuXG4gIHN0YXRpYyBhcmdzID0ge1xuICAgIGlkOiBBcmdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogXCJBZ2VudCBJRFwiLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSksXG4gIH07XG5cbiAgc3RhdGljIGZsYWdzID0ge1xuICAgIC4uLkF1dGhlbnRpY2F0ZWRDb21tYW5kLmJhc2VGbGFncyxcbiAgICBcImlkZW1wb3RlbmN5LWtleVwiOiBpZGVtcG90ZW5jeUtleUZsYWcsXG4gIH07XG5cbiAgYXN5bmMgcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgYXJncywgZmxhZ3MgfSA9IGF3YWl0IHRoaXMucGFyc2UoUmNzQWdlbnRzU3VibWl0KTtcblxuICAgIGNvbnN0IHN1Ym1pdFNwaW5uZXIgPSBzcGlubmVyKFwiU3VibWl0dGluZyBmb3IgcmV2aWV3Li4uXCIpO1xuICAgIGlmICghaXNKc29uTW9kZSgpKSB7XG4gICAgICBzdWJtaXRTcGlubmVyLnN0YXJ0KCk7XG4gICAgfVxuXG4gICAgbGV0IHJlc3BvbnNlOiBTdWJtaXRBZ2VudFJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IGFwaUNsaWVudC5wb3N0PFN1Ym1pdEFnZW50UmVzcG9uc2U+KFxuICAgICAgICBgL2FwaS92MS9yY3MvYWdlbnRzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3MuaWQpfS9zdWJtaXRgLFxuICAgICAgICB7fSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgeyBpZGVtcG90ZW5jeUtleTogZmxhZ3NbXCJpZGVtcG90ZW5jeS1rZXlcIl0gfSxcbiAgICAgICk7XG4gICAgICBzdWJtaXRTcGlubmVyLnN0b3AoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHN1Ym1pdFNwaW5uZXIuc3RvcCgpO1xuICAgICAgaWYgKHJlcG9ydFJjc0Vycm9yKGVycikpIHRoaXMuZXhpdCgxKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICBpZiAoaXNKc29uTW9kZSgpKSB7XG4gICAgICBqc29uKHJlc3BvbnNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhZ2VudCA9IHJlc3BvbnNlLmFnZW50O1xuICAgIGNvbnN0IHN0YWdlID0gcmVzcG9uc2Uuc3RhZ2UgPz8gYWdlbnQuY3VzdG9tZXJTdGFnZTtcbiAgICBzdWNjZXNzKGBTdWJtaXR0ZWQgZm9yIHJldmlldzogJHthZ2VudC5kaXNwbGF5TmFtZSB8fCBhZ2VudC5pZH1gKTtcbiAgICBjb25zb2xlLmxvZygpO1xuICAgIGtleVZhbHVlKFtcbiAgICAgIFtcIkFnZW50XCIsIGFnZW50LmlkXSxcbiAgICAgIFtcIkJyYW5kXCIsIGFnZW50LmJyYW5kSWQgPz8gY29sb3JzLmRpbShcIuKAlFwiKV0sXG4gICAgICBbXCJTdGFnZVwiLCBmb3JtYXRTdGFnZShzdGFnZSldLFxuICAgICAgW1wiUmV2aWV3XCIsIGFnZW50LnJldmlld1N0YXR1c10sXG4gICAgXSk7XG4gICAgcHJpbnROZXh0U3RlcHMoXG4gICAgICBuZXh0U3RlcEZvcihzdGFnZSwgeyBicmFuZElkOiBhZ2VudC5icmFuZElkLCBhZ2VudElkOiBhZ2VudC5pZCB9KSxcbiAgICApO1xuICB9XG59XG4iXX0=
|