@sendmux/cli 1.4.1 → 1.6.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 +77 -8
- package/dist/agent-auth.d.ts +37 -0
- package/dist/agent-auth.d.ts.map +1 -0
- package/dist/agent-auth.js +348 -0
- package/dist/base-command.d.ts +11 -4
- package/dist/base-command.d.ts.map +1 -1
- package/dist/base-command.js +55 -4
- package/dist/commands/agent/invite-owner.d.ts +12 -0
- package/dist/commands/agent/invite-owner.d.ts.map +1 -0
- package/dist/commands/agent/invite-owner.js +36 -0
- package/dist/commands/agent/register.d.ts +16 -0
- package/dist/commands/agent/register.d.ts.map +1 -0
- package/dist/commands/agent/register.js +42 -0
- package/dist/commands/auth/login.d.ts +14 -0
- package/dist/commands/auth/login.d.ts.map +1 -0
- package/dist/commands/auth/login.js +36 -0
- package/dist/commands/auth/logout.d.ts +9 -0
- package/dist/commands/auth/logout.d.ts.map +1 -0
- package/dist/commands/auth/logout.js +22 -0
- package/dist/commands/mailbox/get-connection.d.ts +26 -0
- package/dist/commands/mailbox/get-connection.d.ts.map +1 -0
- package/dist/commands/mailbox/get-connection.js +7 -0
- package/dist/commands/mailbox/stream-events.d.ts +6 -6
- package/dist/commands/management/get-connection.d.ts +26 -0
- package/dist/commands/management/get-connection.d.ts.map +1 -0
- package/dist/commands/management/get-connection.js +7 -0
- package/dist/commands/profiles/list.d.ts.map +1 -1
- package/dist/commands/profiles/list.js +28 -8
- package/dist/commands/profiles/set.d.ts.map +1 -1
- package/dist/commands/profiles/set.js +15 -11
- package/dist/commands/profiles/show.d.ts.map +1 -1
- package/dist/commands/profiles/show.js +26 -12
- package/dist/commands/sending/get-connection.d.ts +26 -0
- package/dist/commands/sending/get-connection.d.ts.map +1 -0
- package/dist/commands/sending/get-connection.js +7 -0
- package/dist/generated/operations.d.ts +69 -6
- package/dist/generated/operations.d.ts.map +1 -1
- package/dist/generated/operations.js +76 -7
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/oauth-http.d.ts +18 -0
- package/dist/oauth-http.d.ts.map +1 -0
- package/dist/oauth-http.js +113 -0
- package/dist/oauth-login.d.ts +13 -0
- package/dist/oauth-login.d.ts.map +1 -0
- package/dist/oauth-login.js +236 -0
- package/dist/oauth-profile.d.ts +6 -0
- package/dist/oauth-profile.d.ts.map +1 -0
- package/dist/oauth-profile.js +123 -0
- package/dist/operation-runner.d.ts.map +1 -1
- package/dist/operation-runner.js +1 -1
- package/dist/profiles.d.ts +60 -2
- package/dist/profiles.d.ts.map +1 -1
- package/dist/profiles.js +150 -4
- package/oclif.manifest.json +2061 -1377
- package/package.json +5 -2
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Args, Flags } from "@oclif/core";
|
|
2
|
+
import { inviteAgentOwner } from "../../agent-auth.js";
|
|
3
|
+
import { SendmuxCommand } from "../../base-command.js";
|
|
4
|
+
export default class AgentInviteOwner extends SendmuxCommand {
|
|
5
|
+
static args = {
|
|
6
|
+
email: Args.string({
|
|
7
|
+
description: "Owner email address.",
|
|
8
|
+
required: true,
|
|
9
|
+
}),
|
|
10
|
+
};
|
|
11
|
+
static description = "Invite an owner to approve sending for an agent inbox.";
|
|
12
|
+
static flags = {
|
|
13
|
+
profile: Flags.string({
|
|
14
|
+
char: "p",
|
|
15
|
+
description: "Registered agent profile name.",
|
|
16
|
+
required: true,
|
|
17
|
+
}),
|
|
18
|
+
};
|
|
19
|
+
async run() {
|
|
20
|
+
const { args, flags } = await this.parse(AgentInviteOwner);
|
|
21
|
+
const result = await inviteAgentOwner({
|
|
22
|
+
configDir: this.config.configDir,
|
|
23
|
+
email: args.email,
|
|
24
|
+
profileName: flags.profile,
|
|
25
|
+
});
|
|
26
|
+
return this.renderResult({
|
|
27
|
+
ok: true,
|
|
28
|
+
data: {
|
|
29
|
+
email: result.email,
|
|
30
|
+
profile: flags.profile,
|
|
31
|
+
status: result.status,
|
|
32
|
+
},
|
|
33
|
+
meta: {},
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { SendmuxCommand } from "../../base-command.js";
|
|
2
|
+
export default class AgentRegister extends SendmuxCommand {
|
|
3
|
+
static args: {
|
|
4
|
+
profile: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
5
|
+
};
|
|
6
|
+
static description: string;
|
|
7
|
+
static flags: {
|
|
8
|
+
"base-url": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
"client-name": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
default: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
"mailbox-local-part": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
"owner-email": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
};
|
|
14
|
+
run(): Promise<unknown>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=register.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../src/commands/agent/register.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,cAAc;IACvD,MAAM,CAAC,IAAI;;MAKT;IACF,MAAM,CAAC,WAAW,SAA6C;IAC/D,MAAM,CAAC,KAAK;;;;;;MAgBV;IAEI,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;CAc9B"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Args, Flags } from "@oclif/core";
|
|
2
|
+
import { registerAgent } from "../../agent-auth.js";
|
|
3
|
+
import { SendmuxCommand } from "../../base-command.js";
|
|
4
|
+
export default class AgentRegister extends SendmuxCommand {
|
|
5
|
+
static args = {
|
|
6
|
+
profile: Args.string({
|
|
7
|
+
description: "Local profile name for the agent inbox.",
|
|
8
|
+
required: true,
|
|
9
|
+
}),
|
|
10
|
+
};
|
|
11
|
+
static description = "Register a durable agent inbox profile.";
|
|
12
|
+
static flags = {
|
|
13
|
+
"base-url": Flags.string({
|
|
14
|
+
description: "Sendmux app origin. Defaults to https://app.sendmux.ai.",
|
|
15
|
+
}),
|
|
16
|
+
"client-name": Flags.string({
|
|
17
|
+
description: "Optional agent client name.",
|
|
18
|
+
}),
|
|
19
|
+
default: Flags.boolean({
|
|
20
|
+
description: "Make this the default profile.",
|
|
21
|
+
}),
|
|
22
|
+
"mailbox-local-part": Flags.string({
|
|
23
|
+
description: "Optional requested mailbox local part.",
|
|
24
|
+
}),
|
|
25
|
+
"owner-email": Flags.string({
|
|
26
|
+
description: "Invite this owner after the inbox becomes ready.",
|
|
27
|
+
}),
|
|
28
|
+
};
|
|
29
|
+
async run() {
|
|
30
|
+
const { args, flags } = await this.parse(AgentRegister);
|
|
31
|
+
const result = await registerAgent({
|
|
32
|
+
...(flags["base-url"] ? { appOrigin: flags["base-url"] } : {}),
|
|
33
|
+
...(flags["client-name"] ? { clientName: flags["client-name"] } : {}),
|
|
34
|
+
configDir: this.config.configDir,
|
|
35
|
+
makeDefault: flags.default,
|
|
36
|
+
...(flags["mailbox-local-part"] ? { mailboxLocalPart: flags["mailbox-local-part"] } : {}),
|
|
37
|
+
...(flags["owner-email"] ? { ownerEmail: flags["owner-email"] } : {}),
|
|
38
|
+
profileName: args.profile,
|
|
39
|
+
});
|
|
40
|
+
return this.renderResult({ ok: true, data: result, meta: {} });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { SendmuxCommand } from "../../base-command.js";
|
|
2
|
+
export default class AuthLogin extends SendmuxCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static args: {
|
|
5
|
+
name: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
|
|
6
|
+
};
|
|
7
|
+
static flags: {
|
|
8
|
+
issuer: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
9
|
+
scope: import("@oclif/core/interfaces").OptionFlag<string[], import("@oclif/core/interfaces").CustomOptions>;
|
|
10
|
+
"no-browser": import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
11
|
+
};
|
|
12
|
+
run(): Promise<unknown>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=login.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAIvD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,cAAc;IACnD,MAAM,CAAC,WAAW,SAA4D;IAC9E,MAAM,CAAC,IAAI;;MAET;IACF,MAAM,CAAC,KAAK;;;;MAaV;IAEI,GAAG;CAYV"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Args, Flags } from "@oclif/core";
|
|
2
|
+
import { SendmuxCommand } from "../../base-command.js";
|
|
3
|
+
import { DEFAULT_OAUTH_ISSUER } from "../../oauth-http.js";
|
|
4
|
+
import { loginOAuth } from "../../oauth-login.js";
|
|
5
|
+
export default class AuthLogin extends SendmuxCommand {
|
|
6
|
+
static description = "Sign in through the browser and save an OAuth profile.";
|
|
7
|
+
static args = {
|
|
8
|
+
name: Args.string({ required: true, description: "New profile name." }),
|
|
9
|
+
};
|
|
10
|
+
static flags = {
|
|
11
|
+
issuer: Flags.string({
|
|
12
|
+
default: DEFAULT_OAUTH_ISSUER,
|
|
13
|
+
description: "Sendmux authorization-server issuer.",
|
|
14
|
+
}),
|
|
15
|
+
scope: Flags.string({
|
|
16
|
+
multiple: true,
|
|
17
|
+
required: true,
|
|
18
|
+
description: "Permission to request. Repeat for multiple scopes.",
|
|
19
|
+
}),
|
|
20
|
+
"no-browser": Flags.boolean({
|
|
21
|
+
description: "Print the authorization URL without opening a browser.",
|
|
22
|
+
}),
|
|
23
|
+
};
|
|
24
|
+
async run() {
|
|
25
|
+
const { args, flags } = await this.parse(AuthLogin);
|
|
26
|
+
const data = await loginOAuth({
|
|
27
|
+
configDir: this.config.configDir,
|
|
28
|
+
name: args.name,
|
|
29
|
+
issuer: flags.issuer,
|
|
30
|
+
scopes: flags.scope,
|
|
31
|
+
noBrowser: flags["no-browser"] ?? false,
|
|
32
|
+
report: (message) => process.stderr.write(`${message}\n`),
|
|
33
|
+
});
|
|
34
|
+
return this.renderResult({ ok: true, data, meta: {} });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { SendmuxCommand } from "../../base-command.js";
|
|
2
|
+
export default class AuthLogout extends SendmuxCommand {
|
|
3
|
+
static description: string;
|
|
4
|
+
static args: {
|
|
5
|
+
name: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
|
|
6
|
+
};
|
|
7
|
+
run(): Promise<unknown>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=logout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/logout.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAIvD,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,cAAc;IACpD,MAAM,CAAC,WAAW,SAC2C;IAC7D,MAAM,CAAC,IAAI;;MAIT;IAEI,GAAG;CAUV"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Args } from "@oclif/core";
|
|
2
|
+
import { SendmuxCommand } from "../../base-command.js";
|
|
3
|
+
import { logoutOAuth } from "../../oauth-profile.js";
|
|
4
|
+
import { readCliConfig } from "../../profiles.js";
|
|
5
|
+
export default class AuthLogout extends SendmuxCommand {
|
|
6
|
+
static description = "Revoke an OAuth connection and remove its local profile.";
|
|
7
|
+
static args = {
|
|
8
|
+
name: Args.string({
|
|
9
|
+
description: "OAuth profile name. Defaults to the configured profile.",
|
|
10
|
+
}),
|
|
11
|
+
};
|
|
12
|
+
async run() {
|
|
13
|
+
const { args } = await this.parse(AuthLogout);
|
|
14
|
+
const name = args.name ??
|
|
15
|
+
process.env.SENDMUX_PROFILE ??
|
|
16
|
+
(await readCliConfig(this.config.configDir)).defaultProfile;
|
|
17
|
+
if (!name)
|
|
18
|
+
this.error("Choose an OAuth profile to log out.", { exit: 2 });
|
|
19
|
+
const data = await logoutOAuth(this.config.configDir, name);
|
|
20
|
+
return this.renderResult({ ok: true, data, meta: {} });
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { OperationCommand } from "../../operation-command.js";
|
|
2
|
+
export default class MailboxGetConnectionCommand extends OperationCommand {
|
|
3
|
+
static description: "Get Mailbox connection";
|
|
4
|
+
static operation: {
|
|
5
|
+
readonly bodyKind: "none";
|
|
6
|
+
readonly command: "mailbox:get-connection";
|
|
7
|
+
readonly description: "Get Mailbox connection";
|
|
8
|
+
readonly headerParams: readonly [{
|
|
9
|
+
readonly name: "If-None-Match";
|
|
10
|
+
readonly required: false;
|
|
11
|
+
readonly schema: {
|
|
12
|
+
readonly type: "string";
|
|
13
|
+
};
|
|
14
|
+
}];
|
|
15
|
+
readonly method: "get";
|
|
16
|
+
readonly operationId: "mailboxGetConnection";
|
|
17
|
+
readonly path: "/mailbox/connection";
|
|
18
|
+
readonly pathParams: readonly [];
|
|
19
|
+
readonly queryParams: readonly [];
|
|
20
|
+
readonly responseKind: "json";
|
|
21
|
+
readonly requestBodyRequired: false;
|
|
22
|
+
readonly requiredKeyKind: "mailbox";
|
|
23
|
+
readonly surface: "mailbox";
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=get-connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-connection.d.ts","sourceRoot":"","sources":["../../../src/commands/mailbox/get-connection.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE9D,MAAM,CAAC,OAAO,OAAO,2BAA4B,SAAQ,gBAAgB;IACvE,MAAM,CAAC,WAAW,2BAA+C;IACjE,MAAM,CAAC,SAAS;;;;;;;;;;;;;;;;;;;;MAAmC;CACpD"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// This file is generated by scripts/generate-cli.mjs
|
|
2
|
+
import { operations } from "../../generated/operations.js";
|
|
3
|
+
import { OperationCommand } from "../../operation-command.js";
|
|
4
|
+
export default class MailboxGetConnectionCommand extends OperationCommand {
|
|
5
|
+
static description = operations.mailboxGetConnection.description;
|
|
6
|
+
static operation = operations.mailboxGetConnection;
|
|
7
|
+
}
|
|
@@ -35,6 +35,12 @@ export default class MailboxStreamEventsCommand extends OperationCommand {
|
|
|
35
35
|
readonly path: "/mailbox/events";
|
|
36
36
|
readonly pathParams: readonly [];
|
|
37
37
|
readonly queryParams: readonly [{
|
|
38
|
+
readonly name: "mailbox_id";
|
|
39
|
+
readonly required: false;
|
|
40
|
+
readonly schema: {
|
|
41
|
+
readonly type: "string";
|
|
42
|
+
};
|
|
43
|
+
}, {
|
|
38
44
|
readonly name: "event_types";
|
|
39
45
|
readonly required: false;
|
|
40
46
|
readonly schema: {
|
|
@@ -62,12 +68,6 @@ export default class MailboxStreamEventsCommand extends OperationCommand {
|
|
|
62
68
|
readonly minimum: 30;
|
|
63
69
|
readonly maximum: 3600;
|
|
64
70
|
};
|
|
65
|
-
}, {
|
|
66
|
-
readonly name: "mailbox_id";
|
|
67
|
-
readonly required: false;
|
|
68
|
-
readonly schema: {
|
|
69
|
-
readonly type: "string";
|
|
70
|
-
};
|
|
71
71
|
}];
|
|
72
72
|
readonly responseKind: "json";
|
|
73
73
|
readonly requestBodyRequired: false;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { OperationCommand } from "../../operation-command.js";
|
|
2
|
+
export default class ManagementGetConnectionCommand extends OperationCommand {
|
|
3
|
+
static description: "Get Management connection";
|
|
4
|
+
static operation: {
|
|
5
|
+
readonly bodyKind: "none";
|
|
6
|
+
readonly command: "management:get-connection";
|
|
7
|
+
readonly description: "Get Management connection";
|
|
8
|
+
readonly headerParams: readonly [{
|
|
9
|
+
readonly name: "If-None-Match";
|
|
10
|
+
readonly required: false;
|
|
11
|
+
readonly schema: {
|
|
12
|
+
readonly type: "string";
|
|
13
|
+
};
|
|
14
|
+
}];
|
|
15
|
+
readonly method: "get";
|
|
16
|
+
readonly operationId: "managementGetConnection";
|
|
17
|
+
readonly path: "/me";
|
|
18
|
+
readonly pathParams: readonly [];
|
|
19
|
+
readonly queryParams: readonly [];
|
|
20
|
+
readonly responseKind: "json";
|
|
21
|
+
readonly requestBodyRequired: false;
|
|
22
|
+
readonly requiredKeyKind: "root";
|
|
23
|
+
readonly surface: "management";
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=get-connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-connection.d.ts","sourceRoot":"","sources":["../../../src/commands/management/get-connection.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE9D,MAAM,CAAC,OAAO,OAAO,8BAA+B,SAAQ,gBAAgB;IAC1E,MAAM,CAAC,WAAW,8BAAkD;IACpE,MAAM,CAAC,SAAS;;;;;;;;;;;;;;;;;;;;MAAsC;CACvD"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// This file is generated by scripts/generate-cli.mjs
|
|
2
|
+
import { operations } from "../../generated/operations.js";
|
|
3
|
+
import { OperationCommand } from "../../operation-command.js";
|
|
4
|
+
export default class ManagementGetConnectionCommand extends OperationCommand {
|
|
5
|
+
static description = operations.managementGetConnection.description;
|
|
6
|
+
static operation = operations.managementGetConnection;
|
|
7
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/profiles/list.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/profiles/list.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAYvD,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,cAAc;IACtD,MAAM,CAAC,WAAW,SAAsC;IACxD,MAAM,CAAC,KAAK;;MAIV;IAEI,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;CAqC9B"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Flags } from "@oclif/core";
|
|
2
2
|
import { SendmuxCommand } from "../../base-command.js";
|
|
3
3
|
import { inferApiKeyKind, maskApiKey, } from "../../key-kind.js";
|
|
4
|
-
import { readCliConfig } from "../../profiles.js";
|
|
4
|
+
import { isActiveAgentProfile, isApiKeyProfile, isOAuthProfile, readCliConfig, } from "../../profiles.js";
|
|
5
5
|
export default class ProfilesList extends SendmuxCommand {
|
|
6
6
|
static description = "List local Sendmux CLI profiles.";
|
|
7
7
|
static flags = {
|
|
@@ -12,13 +12,33 @@ export default class ProfilesList extends SendmuxCommand {
|
|
|
12
12
|
async run() {
|
|
13
13
|
const { flags } = await this.parse(ProfilesList);
|
|
14
14
|
const config = await readCliConfig(this.config.configDir);
|
|
15
|
-
const profiles = Object.entries(config.profiles).map(([name, profile]) =>
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
15
|
+
const profiles = Object.entries(config.profiles).map(([name, profile]) => {
|
|
16
|
+
if (isOAuthProfile(profile))
|
|
17
|
+
return { name, type: "oauth", status: profile.state, default: name === config.defaultProfile, ...(profile.state === "authorizing" ? {} : { scopes: profile.scopes }) };
|
|
18
|
+
if (isApiKeyProfile(profile)) {
|
|
19
|
+
return {
|
|
20
|
+
default: name === config.defaultProfile,
|
|
21
|
+
key_kind: inferApiKeyKind(profile.apiKey),
|
|
22
|
+
name,
|
|
23
|
+
...(profile.baseUrl ? { base_url: profile.baseUrl } : {}),
|
|
24
|
+
...(flags.verbose ? { api_key: maskApiKey(profile.apiKey) } : {}),
|
|
25
|
+
type: "api_key",
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
default: name === config.defaultProfile,
|
|
30
|
+
...(isActiveAgentProfile(profile)
|
|
31
|
+
? {
|
|
32
|
+
mailbox_email: profile.mailboxEmail,
|
|
33
|
+
owner_invite_status: profile.ownerInvite?.status,
|
|
34
|
+
registration_id: profile.registrationId,
|
|
35
|
+
}
|
|
36
|
+
: {}),
|
|
37
|
+
name,
|
|
38
|
+
status: profile.state,
|
|
39
|
+
type: "agent",
|
|
40
|
+
};
|
|
41
|
+
});
|
|
22
42
|
return this.renderResult({
|
|
23
43
|
ok: true,
|
|
24
44
|
data: { profiles },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../../../src/commands/profiles/set.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../../../src/commands/profiles/set.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAIvD,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,cAAc;IACrD,MAAM,CAAC,IAAI;;MAKT;IACF,MAAM,CAAC,WAAW,SAAmD;IACrE,MAAM,CAAC,KAAK;;;;MAWV;IAEI,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;CAsC9B"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Args, Flags } from "@oclif/core";
|
|
2
2
|
import { SendmuxCommand } from "../../base-command.js";
|
|
3
3
|
import { inferApiKeyKind } from "../../key-kind.js";
|
|
4
|
-
import {
|
|
4
|
+
import { isOAuthProfile, updateCliConfig } from "../../profiles.js";
|
|
5
5
|
export default class ProfilesSet extends SendmuxCommand {
|
|
6
6
|
static args = {
|
|
7
7
|
name: Args.string({
|
|
@@ -29,19 +29,23 @@ export default class ProfilesSet extends SendmuxCommand {
|
|
|
29
29
|
this.error("Pass --api-key or set SENDMUX_API_KEY.", { exit: 2 });
|
|
30
30
|
}
|
|
31
31
|
const keyKind = inferApiKeyKind(apiKey);
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
32
|
+
const isDefault = await updateCliConfig(this.config.configDir, (config) => {
|
|
33
|
+
const existing = config.profiles[args.name];
|
|
34
|
+
if (existing && isOAuthProfile(existing))
|
|
35
|
+
throw new Error("Log out of this OAuth profile before replacing it.");
|
|
36
|
+
config.profiles[args.name] = {
|
|
37
|
+
apiKey,
|
|
38
|
+
...(flags["base-url"] ? { baseUrl: flags["base-url"] } : {}),
|
|
39
|
+
type: "api_key",
|
|
40
|
+
};
|
|
41
|
+
if (flags.default || !config.defaultProfile)
|
|
42
|
+
config.defaultProfile = args.name;
|
|
43
|
+
return config.defaultProfile === args.name;
|
|
44
|
+
});
|
|
41
45
|
const result = {
|
|
42
46
|
ok: true,
|
|
43
47
|
data: {
|
|
44
|
-
default:
|
|
48
|
+
default: isDefault,
|
|
45
49
|
key_kind: keyKind,
|
|
46
50
|
name: args.name,
|
|
47
51
|
...(flags["base-url"] ? { base_url: flags["base-url"] } : {}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"show.d.ts","sourceRoot":"","sources":["../../../src/commands/profiles/show.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"show.d.ts","sourceRoot":"","sources":["../../../src/commands/profiles/show.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAYvD,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,cAAc;IACtD,MAAM,CAAC,IAAI;;MAKT;IACF,MAAM,CAAC,WAAW,SAAiE;IAE7E,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;CAwC9B"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Args } from "@oclif/core";
|
|
2
2
|
import { SendmuxCommand } from "../../base-command.js";
|
|
3
3
|
import { inferApiKeyKind, maskApiKey, } from "../../key-kind.js";
|
|
4
|
-
import { readCliConfig } from "../../profiles.js";
|
|
4
|
+
import { isActiveAgentProfile, isApiKeyProfile, isOAuthProfile, readCliConfig, } from "../../profiles.js";
|
|
5
5
|
export default class ProfilesShow extends SendmuxCommand {
|
|
6
6
|
static args = {
|
|
7
7
|
name: Args.string({
|
|
@@ -21,16 +21,30 @@ export default class ProfilesShow extends SendmuxCommand {
|
|
|
21
21
|
if (!profile) {
|
|
22
22
|
this.error(`Sendmux profile "${profileName}" was not found.`, { exit: 2 });
|
|
23
23
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
24
|
+
const data = isOAuthProfile(profile)
|
|
25
|
+
? { name: profileName, type: "oauth", status: profile.state, default: profileName === config.defaultProfile, ...(profile.state === "authorizing" ? {} : { scopes: profile.scopes }) }
|
|
26
|
+
: isApiKeyProfile(profile)
|
|
27
|
+
? {
|
|
28
|
+
api_key: maskApiKey(profile.apiKey),
|
|
29
|
+
default: profileName === config.defaultProfile,
|
|
30
|
+
key_kind: inferApiKeyKind(profile.apiKey),
|
|
31
|
+
name: profileName,
|
|
32
|
+
...(profile.baseUrl ? { base_url: profile.baseUrl } : {}),
|
|
33
|
+
type: "api_key",
|
|
34
|
+
}
|
|
35
|
+
: {
|
|
36
|
+
default: profileName === config.defaultProfile,
|
|
37
|
+
...(isActiveAgentProfile(profile)
|
|
38
|
+
? {
|
|
39
|
+
mailbox_email: profile.mailboxEmail,
|
|
40
|
+
owner_invite_status: profile.ownerInvite?.status,
|
|
41
|
+
registration_id: profile.registrationId,
|
|
42
|
+
}
|
|
43
|
+
: {}),
|
|
44
|
+
name: profileName,
|
|
45
|
+
status: profile.state,
|
|
46
|
+
type: "agent",
|
|
47
|
+
};
|
|
48
|
+
return this.renderResult({ ok: true, data, meta: {} });
|
|
35
49
|
}
|
|
36
50
|
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { OperationCommand } from "../../operation-command.js";
|
|
2
|
+
export default class SendingGetConnectionCommand extends OperationCommand {
|
|
3
|
+
static description: "Get Sending connection";
|
|
4
|
+
static operation: {
|
|
5
|
+
readonly bodyKind: "none";
|
|
6
|
+
readonly command: "sending:get-connection";
|
|
7
|
+
readonly description: "Get Sending connection";
|
|
8
|
+
readonly headerParams: readonly [{
|
|
9
|
+
readonly name: "If-None-Match";
|
|
10
|
+
readonly required: false;
|
|
11
|
+
readonly schema: {
|
|
12
|
+
readonly type: "string";
|
|
13
|
+
};
|
|
14
|
+
}];
|
|
15
|
+
readonly method: "get";
|
|
16
|
+
readonly operationId: "sendingGetConnection";
|
|
17
|
+
readonly path: "/me";
|
|
18
|
+
readonly pathParams: readonly [];
|
|
19
|
+
readonly queryParams: readonly [];
|
|
20
|
+
readonly responseKind: "json";
|
|
21
|
+
readonly requestBodyRequired: false;
|
|
22
|
+
readonly requiredKeyKind: "sending";
|
|
23
|
+
readonly surface: "sending";
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=get-connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-connection.d.ts","sourceRoot":"","sources":["../../../src/commands/sending/get-connection.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE9D,MAAM,CAAC,OAAO,OAAO,2BAA4B,SAAQ,gBAAgB;IACvE,MAAM,CAAC,WAAW,2BAA+C;IACjE,MAAM,CAAC,SAAS;;;;;;;;;;;;;;;;;;;;MAAmC;CACpD"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// This file is generated by scripts/generate-cli.mjs
|
|
2
|
+
import { operations } from "../../generated/operations.js";
|
|
3
|
+
import { OperationCommand } from "../../operation-command.js";
|
|
4
|
+
export default class SendingGetConnectionCommand extends OperationCommand {
|
|
5
|
+
static description = operations.sendingGetConnection.description;
|
|
6
|
+
static operation = operations.sendingGetConnection;
|
|
7
|
+
}
|
|
@@ -390,6 +390,27 @@ export declare const operations: {
|
|
|
390
390
|
readonly requiredKeyKind: "mailbox";
|
|
391
391
|
readonly surface: "mailbox";
|
|
392
392
|
};
|
|
393
|
+
readonly mailboxGetConnection: {
|
|
394
|
+
readonly bodyKind: "none";
|
|
395
|
+
readonly command: "mailbox:get-connection";
|
|
396
|
+
readonly description: "Get Mailbox connection";
|
|
397
|
+
readonly headerParams: readonly [{
|
|
398
|
+
readonly name: "If-None-Match";
|
|
399
|
+
readonly required: false;
|
|
400
|
+
readonly schema: {
|
|
401
|
+
readonly type: "string";
|
|
402
|
+
};
|
|
403
|
+
}];
|
|
404
|
+
readonly method: "get";
|
|
405
|
+
readonly operationId: "mailboxGetConnection";
|
|
406
|
+
readonly path: "/mailbox/connection";
|
|
407
|
+
readonly pathParams: readonly [];
|
|
408
|
+
readonly queryParams: readonly [];
|
|
409
|
+
readonly responseKind: "json";
|
|
410
|
+
readonly requestBodyRequired: false;
|
|
411
|
+
readonly requiredKeyKind: "mailbox";
|
|
412
|
+
readonly surface: "mailbox";
|
|
413
|
+
};
|
|
393
414
|
readonly mailboxGetFolder: {
|
|
394
415
|
readonly bodyKind: "none";
|
|
395
416
|
readonly command: "mailbox:get-folder";
|
|
@@ -1973,6 +1994,12 @@ export declare const operations: {
|
|
|
1973
1994
|
readonly path: "/mailbox/events";
|
|
1974
1995
|
readonly pathParams: readonly [];
|
|
1975
1996
|
readonly queryParams: readonly [{
|
|
1997
|
+
readonly name: "mailbox_id";
|
|
1998
|
+
readonly required: false;
|
|
1999
|
+
readonly schema: {
|
|
2000
|
+
readonly type: "string";
|
|
2001
|
+
};
|
|
2002
|
+
}, {
|
|
1976
2003
|
readonly name: "event_types";
|
|
1977
2004
|
readonly required: false;
|
|
1978
2005
|
readonly schema: {
|
|
@@ -2000,12 +2027,6 @@ export declare const operations: {
|
|
|
2000
2027
|
readonly minimum: 30;
|
|
2001
2028
|
readonly maximum: 3600;
|
|
2002
2029
|
};
|
|
2003
|
-
}, {
|
|
2004
|
-
readonly name: "mailbox_id";
|
|
2005
|
-
readonly required: false;
|
|
2006
|
-
readonly schema: {
|
|
2007
|
-
readonly type: "string";
|
|
2008
|
-
};
|
|
2009
2030
|
}];
|
|
2010
2031
|
readonly responseKind: "json";
|
|
2011
2032
|
readonly requestBodyRequired: false;
|
|
@@ -2473,6 +2494,27 @@ export declare const operations: {
|
|
|
2473
2494
|
readonly requiredKeyKind: "root";
|
|
2474
2495
|
readonly surface: "management";
|
|
2475
2496
|
};
|
|
2497
|
+
readonly managementGetConnection: {
|
|
2498
|
+
readonly bodyKind: "none";
|
|
2499
|
+
readonly command: "management:get-connection";
|
|
2500
|
+
readonly description: "Get Management connection";
|
|
2501
|
+
readonly headerParams: readonly [{
|
|
2502
|
+
readonly name: "If-None-Match";
|
|
2503
|
+
readonly required: false;
|
|
2504
|
+
readonly schema: {
|
|
2505
|
+
readonly type: "string";
|
|
2506
|
+
};
|
|
2507
|
+
}];
|
|
2508
|
+
readonly method: "get";
|
|
2509
|
+
readonly operationId: "managementGetConnection";
|
|
2510
|
+
readonly path: "/me";
|
|
2511
|
+
readonly pathParams: readonly [];
|
|
2512
|
+
readonly queryParams: readonly [];
|
|
2513
|
+
readonly responseKind: "json";
|
|
2514
|
+
readonly requestBodyRequired: false;
|
|
2515
|
+
readonly requiredKeyKind: "root";
|
|
2516
|
+
readonly surface: "management";
|
|
2517
|
+
};
|
|
2476
2518
|
readonly managementGetDeliveryPayload: {
|
|
2477
2519
|
readonly bodyKind: "none";
|
|
2478
2520
|
readonly command: "management:get-delivery-payload";
|
|
@@ -3641,6 +3683,27 @@ export declare const operations: {
|
|
|
3641
3683
|
readonly requiredKeyKind: "sending";
|
|
3642
3684
|
readonly surface: "sending";
|
|
3643
3685
|
};
|
|
3686
|
+
readonly sendingGetConnection: {
|
|
3687
|
+
readonly bodyKind: "none";
|
|
3688
|
+
readonly command: "sending:get-connection";
|
|
3689
|
+
readonly description: "Get Sending connection";
|
|
3690
|
+
readonly headerParams: readonly [{
|
|
3691
|
+
readonly name: "If-None-Match";
|
|
3692
|
+
readonly required: false;
|
|
3693
|
+
readonly schema: {
|
|
3694
|
+
readonly type: "string";
|
|
3695
|
+
};
|
|
3696
|
+
}];
|
|
3697
|
+
readonly method: "get";
|
|
3698
|
+
readonly operationId: "sendingGetConnection";
|
|
3699
|
+
readonly path: "/me";
|
|
3700
|
+
readonly pathParams: readonly [];
|
|
3701
|
+
readonly queryParams: readonly [];
|
|
3702
|
+
readonly responseKind: "json";
|
|
3703
|
+
readonly requestBodyRequired: false;
|
|
3704
|
+
readonly requiredKeyKind: "sending";
|
|
3705
|
+
readonly surface: "sending";
|
|
3706
|
+
};
|
|
3644
3707
|
readonly sendingGetOpenApiSpec: {
|
|
3645
3708
|
readonly bodyKind: "none";
|
|
3646
3709
|
readonly command: "sending:get-open-api-spec";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../src/generated/operations.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,UAAU
|
|
1
|
+
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../src/generated/operations.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAq2IiC,CAAC;AAEzD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAWpB,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,UAAU,CAAC"}
|